Skip to content
Snippets Groups Projects
altera_dma.h 2.27 KiB
Newer Older
#ifndef _ALTERA_DMA_H
#define _ALTERA_DMA_H
#include "altera_dma_cmd.h"
#include "pcie40_driver_common.h"
#include "pcie40_s_pages.h"
Patrick Robbe's avatar
Patrick Robbe committed
#define DFC_CNTLR_BASE_ADDR 0x0200 //data flow controller offset
#define DFC_SPAGE_ACK_BASE_ADDR 0x0800
Patrick Robbe's avatar
Patrick Robbe committed
#define LINK_MASK 0x1
#define ALL_OK 0xFFFFFFFF
Patrick Robbe's avatar
Patrick Robbe committed
#define ALTERA_DMA_DEVFILE "dma"
Patrick Robbe's avatar
Patrick Robbe committed
#define P40_MAX_BAR 5
Patrick Robbe's avatar
Patrick Robbe committed
#define DMA_BARS (1 << 0) // for BAR0 and BAR4
Patrick Robbe's avatar
Patrick Robbe committed
typedef struct spage_struct
{
  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;
Patrick Robbe's avatar
Patrick Robbe committed
struct pcie40_dma_state
{
  struct pci_dev *pci_dev;
Patrick Robbe's avatar
Patrick Robbe committed
  u8 revision;
  u8 irq_pin;
  char msi_enabled;
  u8 irq_line;
  char dma_capable;
  int numpages;
Patrick Robbe's avatar
Patrick Robbe committed
  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;
Patrick Robbe's avatar
Patrick Robbe committed
  int s_page_slot_size;
  int s_page_slot_number;
  int spage_rp;
  int spage_wp;
  atomic_t spages_free;
  atomic_t spages_ready;
  int link_number;
  int link_mask;
  int ists[LINK_NUMBER];
Patrick Robbe's avatar
Patrick Robbe committed
  dev_t cdevno;
  struct cdev cdev;
Patrick Robbe's avatar
Patrick Robbe committed
  wait_queue_head_t wait_q;
Patrick Robbe's avatar
Patrick Robbe committed
  struct pcie40_state *common;
};

static int dma_test(struct pcie40_dma_state *bk_ptr, struct pci_dev *dev);
Patrick Robbe's avatar
Patrick Robbe committed
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);
Patrick Robbe's avatar
Patrick Robbe committed
static long altera_dma_ioctl(struct file *filp, unsigned int cmd, unsigned long arg);
static int spage_set(struct pcie40_dma_state *bk_ptr);
Patrick Robbe's avatar
Patrick Robbe committed
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);

#endif /* _ALTERA_DMA_H */