ngc 1.5.0
 
Loading...
Searching...
No Matches
ngcdrv_pci.h
Go to the documentation of this file.
1
8
9#ifndef NGCDRV_PCI_H
10#define NGCDRV_PCI_H
11
12/*
13 * Kernel and system headers
14 */
15#include <linux/module.h>
16#include <linux/init.h>
17#include <linux/version.h>
18/*
19#include <linux/config.h>
20*/
21
22#if defined(CONFIG_SMP) && !defined(__SMP__)
23#define __SMP__
24#endif
25
26#ifdef CONFIG_DEVFS_FS
27/*
28 * Uncomment the following to have the automatic /dev file system supported
29 */
30/* #define NGCDRV_DEVFS */
31#endif
32
33#include <linux/kernel.h>
34#include <linux/compat.h>
35#include <linux/errno.h>
36#include <linux/types.h>
37#include <linux/major.h>
38#include <linux/vmalloc.h>
39#include <linux/fs.h>
40#ifdef NGCDRV_DEVFS
41#include <linux/devfs_fs_kernel.h>
42#endif
43#ifdef CONFIG_PROC_FS
44#include <linux/proc_fs.h>
45#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
46#define NGCDRV_PROC_FS_v1
47#else
48#include <linux/seq_file.h>
49#define NGCDRV_PROC_FS_v2
50#endif
51#endif
52#include <linux/mm.h>
53#include <linux/sched.h>
54#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
55#include <linux/sched/signal.h>
56#endif
57#include <linux/interrupt.h>
58#include <linux/pci.h>
59#include <linux/poll.h>
60#include <linux/delay.h>
61#include <linux/ioport.h> /* for request_region */
62#include <asm/io.h> /* for ioremap */
63#include <asm/uaccess.h> /* for copy_to/from_user */
64#include <asm/atomic.h> /* for sync-counter */
65
66/*
67 * Local headers
68 */
69#include "ngcdrv_tcb.h"
70#include "ngcdrv.h"
71
75#ifdef CONFIG_X86_64
76#define NGCDRV_GFP GFP_KERNEL|GFP_DMA32
77#else
78#define NGCDRV_GFP GFP_KERNEL
79#endif
80
84#define NGCDRV_MINOR2INST(minor) (minor >> 4)
85
89#define NGCDRV_MINOR2SUBDEV(minor) (minor & 0x0f)
90
94#define NGCDRV_MINOR(instance,i) ((instance << 4) | (i))
95
106
107/*
108 * Vendor-id and device-id - this is used to assign the
109 * device driver to our physical device
110 */
111#define NGCDRV_PCI_VENDOR_ID 0x10ee
112#define NGCDRV_PCI_DEVICE_ID 0x5043
113
114/*
115 * Supported board types (subsystem-id)
116 */
117#define NGCDRV_BTYPE_XILINX_PCI 0x1111
118#define NGCDRV_BTYPE_XILINX_PCIE 0x0007
119
120/*
121 * Latency
122 */
123/*#define NGCDRV_PCI_LATENCY (SMP_CACHE_BYTES >> 2) */
124/*#define NGCDRV_PCI_LATENCY 248 */
125
126/*
127 * Macros for done-count wrap around
128 */
129#define NGCDRV_WRAP_CNT 0xffffffff
130#define NGCDRV_INC(x) if(*x==NGCDRV_WRAP_CNT) {*x=0;} else {(*x)++;}
131#define NGCDRV_DEC(x) if(*x==0) {*x=NGCDRV_WRAP_CNT;} else {(*x)--;}
132#define NGCDRV_DIFF(x,a,b) if(b<a){*x=(NGCDRV_WRAP_CNT-a)+b;}else{*x=b-a;}
133
137#define NGCDRV_CFG_REG_SIZE 256
138
142#define NGCDRV_NUM_CHAN 4
143
144/*
145 * Communication port registers
146 */
147#define NGCDRV_REG_CTRL 0x1C
148#define NGCDRV_REG_CTRL_X1 0x2C
149#define NGCDRV_REG_CTRL_X2 0x3C
150#define NGCDRV_REG_CTRL_X3 0x4C
151#define NGCDRV_REG_STAT 0x14
152#define NGCDRV_REG_STAT_X1 0x24
153#define NGCDRV_REG_STAT_X2 0x34
154#define NGCDRV_REG_STAT_X3 0x44
155#define NGCDRV_REG_FIFO 0x10
156#define NGCDRV_REG_FIFO_X1 0x20
157#define NGCDRV_REG_FIFO_X2 0x30
158#define NGCDRV_REG_FIFO_X3 0x40
159#define NGCDRV_CTRL_CLRCOM 0x00000001
160#define NGCDRV_CTRL_CLRDMA 0x00000002
161#define NGCDRV_CTRL_TRANSFER 0x00000010
162#define NGCDRV_CTRL_RESET 0x00008000
163
164/*
165 * DMA registers
166 */
167#define NGCDRV_DMA_REG_DESCR 0x90
168#define NGCDRV_DMA_REG_CMD 0xA8
169#define NGCDRV_DMA_REG_IRQ 0x68
170#define NGCDRV_DMA_REG_LCNT 0xA4
171#define NGCDRV_DMA_REG_CHAN 0xC4
172
173/*
174 * Descriptor pointer register bits
175 */
176#define NGCDRV_DMA_DESCR_EOC 0x2
177#define NGCDRV_DMA_DESCR_INTR 0x4
178
179
180/*
181 * DMA command register bits
182 */
183#define NGCDRV_DMA_CMD_START 0x0002
184#define NGCDRV_DMA_CMD_ABORT 0x0004
185#define NGCDRV_DMA_CMD_INTR_CLR 0x0008
186#define NGCDRV_DMA_CMD_LCNT_MODE 0x0100
187#define NGCDRV_DMA_CMD_LCNT_STOP 0x0200
188#define NGCDRV_DMA_CMD_LCNT_CLR 0x0400
189
190/*
191 * DMA interrupt register bits
192 */
193#define NGCDRV_DMA_IRQ (1<<21)
194
195/*
196 * DMA FIFO
197 */
198#define NGCDRV_DMA_REG_FIFO NGCDRV_REG_CTRL
199#define NGCDRV_DMA_FIFO_CLR NGCDRV_CTRL_CLRDMA
200
205#define NGCDRV_DMA_MAX PAGE_SIZE
206
207/*
208 * DMA address space
209 */
210#define NGCDRV_DMA_KERNEL 0
211#define NGCDRV_DMA_USER 1
212
216#define NGCDRV_USE_VAR(x) do {(void)(x);} while (0)
217
221typedef struct
222{
223 unsigned int pid;
224#ifdef CONFIG_DEVFS_FS
225 devfs_handle_t devfs;
226#endif
228
232typedef struct {
233 uint32_t addr;
234 uint32_t addr_high;
235 uint32_t count;
236 uint32_t descptr;
238
239/*
240 * Configuration register type
241 */
242typedef uint8_t ngcdrv_reg_t;
243
247typedef struct
248{
249 struct work_struct work;
250 unsigned long data;
252
256typedef struct
257{
258 uint32_t mode;
259 uint32_t mode_req;
260 struct tasklet_struct tasklet;
261 struct workqueue_struct *wq;
263 int init;
265 void **dma_buffer;
266 uint32_t dma_buffer_num;
268 uint32_t dma_rn;
269 unsigned long dma_rsize;
270 volatile uint32_t done_count;
271 volatile uint32_t dma_count;
272 volatile uint32_t idx_in;
273 volatile uint32_t idx_out;
274 volatile uint32_t scnt;
275 uint32_t snum;
276 void *mem;
278 int taskId;
283
287typedef struct
288{
290 uint32_t tmo;
291 uint32_t rstLink;
292 uint32_t routeThrough;
293 uint32_t *fifoBuf;
298
302typedef struct
303{
305 volatile uint32_t done_count;
306 uint32_t sg_len;
307 spinlock_t lock;
308 volatile uint32_t overflow;
312 int valid;
313 void **km_buffer;
314 uint32_t km_buffer_num;
315 uint32_t km_buffer_size;
316 uint32_t km_rn;
317 unsigned long km_rsize;
318 void **buffer;
319 uint32_t buffer_num;
320 uint32_t buffer_size;
321 uint32_t rn;
322 unsigned rsize;
324 uint32_t descr_num;
325 unsigned long descr_addr;
326 struct semaphore sem_wake;
327 struct semaphore sem_buf;
328 wait_queue_head_t wait_queue;
330 uint32_t lcnt_mode;
331 atomic_t sync_cnt;
332 uint32_t sync_mode;
334
338typedef struct
339{
340 struct pci_dev* pcidev;
341 int id;
342 char name[32];
344 caddr_t reg_page;
347 int irq;
352 unsigned long irq_count;
355 int btype;
357 spinlock_t lock;
358
359 /*
360 * These are "volatile" because interrupt handlers might change them
361 * or, in the case of the registers, they talk to memory-mapped IO.
362 */
363 volatile const char* err_status;
364 volatile unsigned int dma_errors;
365 volatile unsigned int dma_report;
366
367} ngcdrv_t;
368
372#ifndef SA_SHIRQ
373#define NGCDRV_IRQ_SHARED IRQF_SHARED
374#else
375#define NGCDRV_IRQ_SHARED SA_SHIRQ
376#endif
377
378#endif /* !NGCDRV_PCI_H */
379
380
#define NGCDRV_MAX_PARAM
Definition ngcdrv.h:92
#define NGCDRV_NUM_CHAN
Definition ngcdrv_pci.h:142
uint8_t ngcdrv_reg_t
Definition ngcdrv_pci.h:242
ngcdrv_minors
Definition ngcdrv_pci.h:99
@ COMX3_MINOR
Definition ngcdrv_pci.h:103
@ COM_MINOR
Definition ngcdrv_pci.h:100
@ DMA_MINOR
Definition ngcdrv_pci.h:104
@ COMX2_MINOR
Definition ngcdrv_pci.h:102
@ COMX1_MINOR
Definition ngcdrv_pci.h:101
#define NGCDRV_MAX_TCB
Definition ngcdrv_tcb.h:59
Definition ngcdrv_pci.h:288
ngcdrv_state_t state
Definition ngcdrv_pci.h:289
volatile ngcdrv_reg_t * regFifo
Definition ngcdrv_pci.h:296
uint32_t tmo
Definition ngcdrv_pci.h:290
volatile ngcdrv_reg_t * regStat
Definition ngcdrv_pci.h:295
uint32_t rstLink
Definition ngcdrv_pci.h:291
volatile ngcdrv_reg_t * regCtrl
Definition ngcdrv_pci.h:294
uint32_t routeThrough
Definition ngcdrv_pci.h:292
uint32_t * fifoBuf
Definition ngcdrv_pci.h:293
Definition ngcdrv_pci.h:232
uint32_t count
Definition ngcdrv_pci.h:235
uint32_t addr_high
Definition ngcdrv_pci.h:234
uint32_t descptr
Definition ngcdrv_pci.h:236
uint32_t addr
Definition ngcdrv_pci.h:233
Definition ngcdrv_pci.h:303
volatile uint32_t overflow
Definition ngcdrv_pci.h:308
ngcdrv_descr_t ** descriptors
Definition ngcdrv_pci.h:323
ngcdrv_state_t state
Definition ngcdrv_pci.h:304
spinlock_t lock
Definition ngcdrv_pci.h:307
int sustained
Definition ngcdrv_pci.h:311
uint32_t rn
Definition ngcdrv_pci.h:321
uint32_t lcnt_mode
Definition ngcdrv_pci.h:330
wait_queue_head_t wait_queue
Definition ngcdrv_pci.h:328
struct semaphore sem_buf
Definition ngcdrv_pci.h:327
int dma_inprogress
Definition ngcdrv_pci.h:310
void ** km_buffer
Definition ngcdrv_pci.h:313
unsigned long descr_addr
Definition ngcdrv_pci.h:325
void ** buffer
Definition ngcdrv_pci.h:318
struct semaphore sem_wake
Definition ngcdrv_pci.h:326
unsigned long km_rsize
Definition ngcdrv_pci.h:317
uint32_t sync_mode
Definition ngcdrv_pci.h:332
uint32_t km_buffer_size
Definition ngcdrv_pci.h:315
atomic_t sync_cnt
Definition ngcdrv_pci.h:331
ngcdrv_ipp_t ipp
Definition ngcdrv_pci.h:329
int valid
Definition ngcdrv_pci.h:312
uint32_t sg_len
Definition ngcdrv_pci.h:306
uint32_t km_buffer_num
Definition ngcdrv_pci.h:314
int aborted
Definition ngcdrv_pci.h:309
uint32_t buffer_size
Definition ngcdrv_pci.h:320
unsigned rsize
Definition ngcdrv_pci.h:322
uint32_t km_rn
Definition ngcdrv_pci.h:316
volatile uint32_t done_count
Definition ngcdrv_pci.h:305
uint32_t buffer_num
Definition ngcdrv_pci.h:319
uint32_t descr_num
Definition ngcdrv_pci.h:324
Definition ngcdrv_pci.h:257
int init
Definition ngcdrv_pci.h:263
volatile uint32_t scnt
Definition ngcdrv_pci.h:274
volatile uint32_t done_count
Definition ngcdrv_pci.h:270
volatile uint32_t dma_count
Definition ngcdrv_pci.h:271
int realloc
Definition ngcdrv_pci.h:281
void ** dma_buffer
Definition ngcdrv_pci.h:265
uint32_t dma_rn
Definition ngcdrv_pci.h:268
volatile uint32_t idx_out
Definition ngcdrv_pci.h:273
void * mem
Definition ngcdrv_pci.h:276
volatile uint32_t idx_in
Definition ngcdrv_pci.h:272
int32_t param[NGCDRV_MAX_PARAM]
Definition ngcdrv_pci.h:279
uint32_t dma_buffer_num
Definition ngcdrv_pci.h:266
uint32_t dma_buffer_size
Definition ngcdrv_pci.h:267
uint32_t mode
Definition ngcdrv_pci.h:258
unsigned long dma_rsize
Definition ngcdrv_pci.h:269
ngcdrv_tcb_t * task
Definition ngcdrv_pci.h:277
uint32_t snum
Definition ngcdrv_pci.h:275
int enabled
Definition ngcdrv_pci.h:264
uint32_t mode_req
Definition ngcdrv_pci.h:259
struct workqueue_struct * wq
Definition ngcdrv_pci.h:261
struct tasklet_struct tasklet
Definition ngcdrv_pci.h:260
ngcdrv_tcb_t * task_reg[NGCDRV_MAX_TCB]
Definition ngcdrv_pci.h:280
ngcdrv_work_t work
Definition ngcdrv_pci.h:262
int taskId
Definition ngcdrv_pci.h:278
Definition ngcdrv_pci.h:222
unsigned int pid
Definition ngcdrv_pci.h:223
Definition ngcdrv_pci.h:339
int irq
Definition ngcdrv_pci.h:347
int dma_width
Definition ngcdrv_pci.h:356
spinlock_t lock
Definition ngcdrv_pci.h:357
volatile unsigned int dma_report
Definition ngcdrv_pci.h:365
int btype
Definition ngcdrv_pci.h:355
ngcdrv_dma_t DMA
Definition ngcdrv_pci.h:346
volatile unsigned int dma_errors
Definition ngcdrv_pci.h:364
int irq_realtime
Definition ngcdrv_pci.h:348
int irq_same
Definition ngcdrv_pci.h:350
int version
Definition ngcdrv_pci.h:354
char name[32]
Definition ngcdrv_pci.h:342
int id
Definition ngcdrv_pci.h:341
volatile const char * err_status
Definition ngcdrv_pci.h:363
int irq_sharable
Definition ngcdrv_pci.h:349
unsigned long irq_count
Definition ngcdrv_pci.h:352
int latency
Definition ngcdrv_pci.h:353
ngcdrv_com_t COM[NGCDRV_NUM_CHAN]
Definition ngcdrv_pci.h:345
volatile ngcdrv_reg_t * reg_base
Definition ngcdrv_pci.h:343
struct pci_dev * pcidev
Definition ngcdrv_pci.h:340
caddr_t reg_page
Definition ngcdrv_pci.h:344
int irq_init
Definition ngcdrv_pci.h:351
Definition ngcdrv_tcb.h:47
Definition ngcdrv_pci.h:248
unsigned long data
Definition ngcdrv_pci.h:250
struct work_struct work
Definition ngcdrv_pci.h:249