30
20
#include <linux/wait.h>
32
22
#include "../pcilib/version.h"
36
#include "pciDriver.h"
45
/*************************************************************************/
46
/* Module device table associated with this driver */
47
MODULE_DEVICE_TABLE(pci, pcidriver_ids);
49
/* Module init and exit points */
50
module_init(pcidriver_init);
51
module_exit(pcidriver_exit);
54
29
MODULE_AUTHOR("Guillermo Marcus");
55
30
MODULE_DESCRIPTION("Simple PCI Driver");
56
31
MODULE_LICENSE("GPL v2");
34
* This is the table of PCI devices handled by this driver by default
35
* If you want to add devices dynamically to this list, do:
37
* echo "vendor device" > /sys/bus/pci/drivers/pciDriver/new_id
38
* where vendor and device are in hex, without leading '0x'.
41
static const __devinitdata struct pci_device_id pcidriver_ids[] = {
42
{ PCI_DEVICE( PCIE_XILINX_VENDOR_ID, PCIE_ML605_DEVICE_ID ) }, // PCI-E Xilinx ML605
43
{ PCI_DEVICE( PCIE_XILINX_VENDOR_ID, PCIE_IPECAMERA_DEVICE_ID ) }, // PCI-E IPE Camera
44
{ PCI_DEVICE( PCIE_XILINX_VENDOR_ID, PCIE_KAPTURE_DEVICE_ID ) }, // PCI-E KAPTURE board for HEB
48
MODULE_DEVICE_TABLE(pci, pcidriver_ids);
59
static struct class_compat *pcidriver_class;
51
static struct class *pcidriver_class;
61
53
#ifdef PCIDRIVER_DUMMY_DEVICE
62
54
pcidriver_privdata_t *pcidriver_dummydata = NULL;
63
#endif /* PCIDRIVER_DUMMY_DEVICE */
67
* Called when loading the driver
70
static int __init pcidriver_init(void)
74
/* Initialize the device count */
75
atomic_set(&pcidriver_deviceCount, 0);
77
memset(pcidriver_privdata, 0, sizeof(pcidriver_privdata));
79
/* Allocate character device region dynamically */
80
if ((err = alloc_chrdev_region(&pcidriver_devt, MINORNR, MAXDEVICES, NODENAME)) != 0) {
81
mod_info("Couldn't allocate chrdev region. Module not loaded.\n");
84
mod_info("Major %d allocated to nodename '%s'\n", MAJOR(pcidriver_devt), NODENAME);
86
/* Register driver class */
87
pcidriver_class = class_create(THIS_MODULE, NODENAME);
89
if (IS_ERR(pcidriver_class)) {
90
mod_info("No sysfs support. Module not loaded.\n");
94
/* Register PCI driver. This function returns the number of devices on some
95
* systems, therefore check for errors as < 0. */
96
#ifdef PCIDRIVER_DUMMY_DEVICE
97
if ((err = pcidriver_probe(NULL, NULL)) < 0) {
98
55
#else /* PCIDRIVER_DUMMY_DEVICE */
99
if ((err = pci_register_driver(&pcidriver_driver)) < 0) {
100
#endif /* PCIDRIVER_DUMMY_DEVICE */
101
mod_info("Couldn't register PCI driver. Module not loaded.\n");
102
goto init_pcireg_fail;
105
mod_info("pcidriver %u.%u.%u loaded\n", PCILIB_VERSION_GET_MAJOR(PCILIB_VERSION), PCILIB_VERSION_GET_MINOR(PCILIB_VERSION), PCILIB_VERSION_GET_MICRO(PCILIB_VERSION));
106
mod_info("%s\n", PCIDRIVER_BUILD);
107
mod_info("%s\n", PCIDRIVER_REVISION);
108
if (strlen(PCIDRIVER_CHANGES)) {
109
mod_info("Extra changes - %s\n", PCIDRIVER_CHANGES);
115
class_destroy(pcidriver_class);
117
unregister_chrdev_region(pcidriver_devt, MAXDEVICES);
124
* Called when unloading the driver
127
static void pcidriver_exit(void)
129
#ifdef PCIDRIVER_DUMMY_DEVICE
130
pcidriver_remove(NULL);
132
pci_unregister_driver(&pcidriver_driver);
133
#endif /* PCIDRIVER_DUMMY_DEVICE */
135
unregister_chrdev_region(pcidriver_devt, MAXDEVICES);
137
if (pcidriver_class != NULL)
138
class_destroy(pcidriver_class);
140
mod_info("Module unloaded\n");
143
/*************************************************************************/
144
/* Driver functions */
148
* This struct defines the PCI entry points.
149
* Will be registered at module init.
152
#ifndef PCIDRIVER_DUMMY_DEVICE
153
static struct pci_driver pcidriver_driver = {
155
.id_table = pcidriver_ids,
156
.probe = pcidriver_probe,
157
.remove = pcidriver_remove,
159
#endif /* ! PCIDRIVER_DUMMY_DEVICE */
56
static struct pci_driver pcidriver_driver;
57
#endif /* PCIDRIVER_DUMMY_DEVICE */
59
/* Hold the allocated major & minor numbers */
60
static dev_t pcidriver_devt;
62
/* Number of devices allocated */
63
static atomic_t pcidriver_deviceCount;
65
/* Private data for probed devices */
66
static pcidriver_privdata_t* pcidriver_privdata[MAXDEVICES];
69
pcidriver_privdata_t *pcidriver_get_privdata(int devid) {
70
if (devid >= MAXDEVICES)
73
return pcidriver_privdata[devid];
76
void pcidriver_put_privdata(pcidriver_privdata_t *privdata) {
163
81
* This function is called when installing the driver for a device
164
82
* @param pdev Pointer to the PCI device
167
84
static int __devinit pcidriver_probe(struct pci_dev *pdev, const struct pci_device_id *id)
387
/*************************************************************************/
388
/* File operations */
389
/*************************************************************************/
392
* This struct defines the file operation entry points.
394
* @see pcidriver_ioctl
395
* @see pcidriver_mmap
396
* @see pcidriver_open
397
* @see pcidriver_release
400
static struct file_operations pcidriver_fops = {
401
.owner = THIS_MODULE,
402
.unlocked_ioctl = pcidriver_ioctl,
403
.mmap = pcidriver_mmap,
404
.open = pcidriver_open,
405
.release = pcidriver_release,
267
#ifndef PCIDRIVER_DUMMY_DEVICE
268
static struct pci_driver pcidriver_driver = {
270
.id_table = pcidriver_ids,
271
.probe = pcidriver_probe,
272
.remove = pcidriver_remove,
408
void pcidriver_module_get(pcidriver_privdata_t *privdata) {
409
atomic_inc(&(privdata->refs));
410
// mod_info("Ref: %i\n", atomic_read(&(privdata->refs)));
413
void pcidriver_module_put(pcidriver_privdata_t *privdata) {
414
if (atomic_add_negative(-1, &(privdata->refs))) {
415
atomic_inc(&(privdata->refs));
416
mod_info("Reference counting error...");
418
// mod_info("Unref: %i\n", atomic_read(&(privdata->refs)));
424
* Called when an application open()s a /dev/fpga*, attaches the private data
425
* with the file pointer.
428
int pcidriver_open(struct inode *inode, struct file *filp)
430
pcidriver_privdata_t *privdata;
432
/* Set the private data area for the file */
433
privdata = container_of( inode->i_cdev, pcidriver_privdata_t, cdev);
434
filp->private_data = privdata;
436
pcidriver_module_get(privdata);
443
* Called when the application close()s the file descriptor. Does nothing at
447
int pcidriver_release(struct inode *inode, struct file *filp)
449
pcidriver_privdata_t *privdata;
451
/* Get the private data area */
452
privdata = filp->private_data;
454
pcidriver_module_put(privdata);
461
* This function is the entry point for mmap() and calls either pcidriver_mmap_pci
462
* or pcidriver_mmap_kmem
464
* @see pcidriver_mmap_pci
465
* @see pcidriver_mmap_kmem
468
int pcidriver_mmap(struct file *filp, struct vm_area_struct *vma)
470
pcidriver_privdata_t *privdata;
473
mod_info_dbg("Entering mmap\n");
475
/* Get the private data area */
476
privdata = filp->private_data;
478
/* Check the current mmap mode */
479
switch (privdata->mmap_mode) {
480
case PCIDRIVER_MMAP_PCI:
481
/* Mmap a PCI region */
482
switch (privdata->mmap_area) {
502
mod_info("Attempted to mmap a PCI area with the wrong mmap_area value: %d\n",privdata->mmap_area);
503
return -EINVAL; /* invalid parameter */
506
ret = pcidriver_mmap_pci(privdata, vma, bar);
508
case PCIDRIVER_MMAP_KMEM:
509
/* mmap a Kernel buffer */
510
ret = pcidriver_mmap_kmem(privdata, vma);
513
mod_info( "Invalid mmap_mode value (%d)\n",privdata->mmap_mode );
514
return -EINVAL; /* Invalid parameter (mode) */
520
/*************************************************************************/
521
/* Internal driver functions */
522
int pcidriver_mmap_pci(pcidriver_privdata_t *privdata, struct vm_area_struct *vmap, int bar)
274
#endif /* ! PCIDRIVER_DUMMY_DEVICE */
276
static int __init pcidriver_init(void)
280
/* Initialize the device count */
281
atomic_set(&pcidriver_deviceCount, 0);
283
memset(pcidriver_privdata, 0, sizeof(pcidriver_privdata));
285
/* Allocate character device region dynamically */
286
if ((err = alloc_chrdev_region(&pcidriver_devt, MINORNR, MAXDEVICES, NODENAME)) != 0) {
287
mod_info("Couldn't allocate chrdev region. Module not loaded.\n");
288
goto init_alloc_fail;
290
mod_info("Major %d allocated to nodename '%s'\n", MAJOR(pcidriver_devt), NODENAME);
292
/* Register driver class */
293
pcidriver_class = class_create(THIS_MODULE, NODENAME);
295
if (IS_ERR(pcidriver_class)) {
296
mod_info("No sysfs support. Module not loaded.\n");
297
goto init_class_fail;
300
/* Register PCI driver. This function returns the number of devices on some
301
* systems, therefore check for errors as < 0. */
524
302
#ifdef PCIDRIVER_DUMMY_DEVICE
303
if ((err = pcidriver_probe(NULL, NULL)) < 0) {
526
304
#else /* PCIDRIVER_DUMMY_DEVICE */
528
unsigned long bar_addr;
529
unsigned long bar_length, vma_size;
530
unsigned long bar_flags;
532
mod_info_dbg("Entering mmap_pci\n");
535
/* Get info of the BAR to be mapped */
536
bar_addr = pci_resource_start(privdata->pdev, bar);
537
bar_length = pci_resource_len(privdata->pdev, bar);
538
bar_flags = pci_resource_flags(privdata->pdev, bar);
541
vma_size = (vmap->vm_end - vmap->vm_start);
543
if ((vma_size != bar_length) &&
544
((bar_length < PAGE_SIZE) && (vma_size != PAGE_SIZE))) {
545
mod_info( "mmap size is not correct! bar: %lu - vma: %lu\n", bar_length, vma_size );
549
if (bar_flags & IORESOURCE_IO) {
550
/* Unlikely case, we will mmap a IO region */
552
/* IO regions are never cacheable */
553
vmap->vm_page_prot = pgprot_noncached(vmap->vm_page_prot);
556
ret = io_remap_pfn_range_compat(vmap, vmap->vm_start, bar_addr, bar_length, vmap->vm_page_prot);
558
/* Normal case, mmap a memory region */
560
/* Ensure this VMA is non-cached, if it is not flaged as prefetchable.
561
* If it is prefetchable, caching is allowed and will give better performance.
562
* This should be set properly by the BIOS, but we want to be sure. */
563
/* adapted from drivers/char/mem.c, mmap function. */
565
/* Setting noncached disables MTRR registers, and we want to use them.
566
* So we take this code out. This can lead to caching problems if and only if
567
* the System BIOS set something wrong. Check LDDv3, page 425.
570
// if (!(bar_flags & IORESOURCE_PREFETCH))
571
// vmap->vm_page_prot = pgprot_noncached(vmap->vm_page_prot);
575
ret = remap_pfn_range_compat(vmap, vmap->vm_start, bar_addr, bar_length, vmap->vm_page_prot);
579
mod_info("remap_pfn_range failed\n");
583
return 0; /* success */
584
#endif /* PCIDRIVER_DUMMY_DEVICE */
587
pcidriver_privdata_t *pcidriver_get_privdata(int devid) {
588
if (devid >= MAXDEVICES)
591
return pcidriver_privdata[devid];
594
void pcidriver_put_privdata(pcidriver_privdata_t *privdata) {
305
if ((err = pci_register_driver(&pcidriver_driver)) < 0) {
306
#endif /* PCIDRIVER_DUMMY_DEVICE */
307
mod_info("Couldn't register PCI driver. Module not loaded.\n");
308
goto init_pcireg_fail;
311
mod_info("pcidriver %u.%u.%u loaded\n", PCILIB_VERSION_GET_MAJOR(PCILIB_VERSION), PCILIB_VERSION_GET_MINOR(PCILIB_VERSION), PCILIB_VERSION_GET_MICRO(PCILIB_VERSION));
312
mod_info("%s\n", PCIDRIVER_BUILD);
313
mod_info("%s\n", PCIDRIVER_REVISION);
314
if (strlen(PCIDRIVER_CHANGES)) {
315
mod_info("Extra changes - %s\n", PCIDRIVER_CHANGES);
321
class_destroy(pcidriver_class);
323
unregister_chrdev_region(pcidriver_devt, MAXDEVICES);
328
static void pcidriver_exit(void)
330
#ifdef PCIDRIVER_DUMMY_DEVICE
331
pcidriver_remove(NULL);
333
pci_unregister_driver(&pcidriver_driver);
334
#endif /* PCIDRIVER_DUMMY_DEVICE */
336
unregister_chrdev_region(pcidriver_devt, MAXDEVICES);
338
if (pcidriver_class != NULL)
339
class_destroy(pcidriver_class);
341
mod_info("Module unloaded\n");
344
module_init(pcidriver_init);
345
module_exit(pcidriver_exit);