Newer
Older
#include "altera_dma_cmd.h"
#include "pcie40_driver_common.h"
#define DFC_CNTLR_BASE_ADDR 0x0200 //data flow controller offset
#define DFC_SPAGE_ACK_BASE_ADDR 0x0800
dma_addr_t spage_bus_addr_high;
dma_addr_t spage_bus_addr_low;
dma_addr_t spage_bus_addr;
u8 *spage_virt_addr;
} SPAGE;
struct pcie40_dma_state
{
struct pci_dev *pci_dev;
u8 revision;
u8 irq_pin;
char msi_enabled;
u8 irq_line;
char dma_capable;
struct semaphore sem; /* mutual exclusion semaphore */
int user_pid;
struct task_struct *user_task;
// wait_queue_head_t wait_q;
wait_queue_head_t wait_r; //read wait
wait_queue_head_t wait_w; //write shm wait
atomic_t status;
SPAGE spt[LINK_NUMBER][S_PAGES];
int act_spage;
int s_pages;
int spage_rp;
int spage_wp;
atomic_t spages_free;
atomic_t spages_ready;
int link_number;
int link_mask;
int ists[LINK_NUMBER];
};
static int dma_test(struct pcie40_dma_state *bk_ptr, struct pci_dev *dev);
int altera_pci_probe(struct pci_dev *dev, const struct pci_device_id *id);
void altera_pci_remove(struct pci_dev *dev);
static int init_chrdev(struct pcie40_dma_state *bk_ptr) __init;
ssize_t altera_dma_read(struct file *file, char __user *buf, size_t count, loff_t *pos);
ssize_t altera_dma_write(struct file *file, char __user *buf, size_t count, loff_t *pos);
ssize_t altera_dma_rw(struct file *file, char __user *buf, size_t count, loff_t *pos, int read);
int altera_dma_open(struct inode *inode, struct file *file);
int altera_dma_release(struct inode *inode, struct file *file);
static long altera_dma_ioctl(struct file *filp, unsigned int cmd, unsigned long arg);
static int spage_set(struct pcie40_dma_state *bk_ptr);
void prep_spage(struct pci_dev *dev, int link, int spage, dma_addr_t spage_bus_addr, SPAGE *sp);
ssize_t altera_dma_exec_cmd(struct dma_cmd *ucmd, struct pcie40_dma_state *bk_ptr);