igb_uio: remove PCI id table
[dpdk.git] / lib / librte_eal / linuxapp / igb_uio / igb_uio.c
1 /*-
2  * GPL LICENSE SUMMARY
3  *
4  *   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
5  *
6  *   This program is free software; you can redistribute it and/or modify
7  *   it under the terms of version 2 of the GNU General Public License as
8  *   published by the Free Software Foundation.
9  *
10  *   This program is distributed in the hope that it will be useful, but
11  *   WITHOUT ANY WARRANTY; without even the implied warranty of
12  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  *   General Public License for more details.
14  *
15  *   You should have received a copy of the GNU General Public License
16  *   along with this program; if not, write to the Free Software
17  *   Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
18  *   The full GNU General Public License is included in this distribution
19  *   in the file called LICENSE.GPL.
20  *
21  *   Contact Information:
22  *   Intel Corporation
23  */
24
25 #include <linux/device.h>
26 #include <linux/module.h>
27 #include <linux/pci.h>
28 #include <linux/uio_driver.h>
29 #include <linux/io.h>
30 #include <linux/msi.h>
31 #include <linux/version.h>
32
33 #ifdef CONFIG_XEN_DOM0
34 #include <xen/xen.h>
35 #endif
36 #include <rte_pci_dev_features.h>
37
38 /**
39  * MSI-X related macros, copy from linux/pci_regs.h in kernel 2.6.39,
40  * but none of them in kernel 2.6.35.
41  */
42 #ifndef PCI_MSIX_ENTRY_SIZE
43 #define PCI_MSIX_ENTRY_SIZE             16
44 #define PCI_MSIX_ENTRY_LOWER_ADDR       0
45 #define PCI_MSIX_ENTRY_UPPER_ADDR       4
46 #define PCI_MSIX_ENTRY_DATA             8
47 #define PCI_MSIX_ENTRY_VECTOR_CTRL      12
48 #define PCI_MSIX_ENTRY_CTRL_MASKBIT     1
49 #endif
50
51 #define IGBUIO_NUM_MSI_VECTORS 1
52
53 /**
54  * A structure describing the private information for a uio device.
55  */
56 struct rte_uio_pci_dev {
57         struct uio_info info;
58         struct pci_dev *pdev;
59         spinlock_t lock; /* spinlock for accessing PCI config space or msix data in multi tasks/isr */
60         enum rte_intr_mode mode;
61         struct msix_entry \
62                 msix_entries[IGBUIO_NUM_MSI_VECTORS]; /* pointer to the msix vectors to be allocated later */
63 };
64
65 static char *intr_mode = NULL;
66 static enum rte_intr_mode igbuio_intr_mode_preferred = RTE_INTR_MODE_MSIX;
67
68 static inline struct rte_uio_pci_dev *
69 igbuio_get_uio_pci_dev(struct uio_info *info)
70 {
71         return container_of(info, struct rte_uio_pci_dev, info);
72 }
73
74 /* sriov sysfs */
75 int local_pci_num_vf(struct pci_dev *dev)
76 {
77 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,34)
78         struct iov {
79                 int pos;
80                 int nres;
81                 u32 cap;
82                 u16 ctrl;
83                 u16 total;
84                 u16 initial;
85                 u16 nr_virtfn;
86         } *iov = (struct iov*)dev->sriov;
87
88         if (!dev->is_physfn)
89                 return 0;
90
91         return iov->nr_virtfn;
92 #else
93         return pci_num_vf(dev);
94 #endif
95 }
96
97 static ssize_t
98 show_max_vfs(struct device *dev, struct device_attribute *attr,
99              char *buf)
100 {
101         return snprintf(buf, 10, "%u\n", local_pci_num_vf(
102                                 container_of(dev, struct pci_dev, dev)));
103 }
104
105 static ssize_t
106 store_max_vfs(struct device *dev, struct device_attribute *attr,
107               const char *buf, size_t count)
108 {
109         int err = 0;
110         unsigned long max_vfs;
111         struct pci_dev *pdev = container_of(dev, struct pci_dev, dev);
112
113         if (0 != strict_strtoul(buf, 0, &max_vfs))
114                 return -EINVAL;
115
116         if (0 == max_vfs)
117                 pci_disable_sriov(pdev);
118         else if (0 == local_pci_num_vf(pdev))
119                 err = pci_enable_sriov(pdev, max_vfs);
120         else /* do nothing if change max_vfs number */
121                 err = -EINVAL;
122
123         return err ? err : count;
124 }
125
126 static DEVICE_ATTR(max_vfs, S_IRUGO | S_IWUSR, show_max_vfs, store_max_vfs);
127 static struct attribute *dev_attrs[] = {
128         &dev_attr_max_vfs.attr,
129         NULL,
130 };
131
132 static const struct attribute_group dev_attr_grp = {
133         .attrs = dev_attrs,
134 };
135
136 static inline int
137 pci_lock(struct pci_dev * pdev)
138 {
139         /* Some function names changes between 3.2.0 and 3.3.0... */
140 #if LINUX_VERSION_CODE < KERNEL_VERSION(3,3,0)
141         pci_block_user_cfg_access(pdev);
142         return 1;
143 #else
144         return pci_cfg_access_trylock(pdev);
145 #endif
146 }
147
148 static inline void
149 pci_unlock(struct pci_dev * pdev)
150 {
151         /* Some function names changes between 3.2.0 and 3.3.0... */
152 #if LINUX_VERSION_CODE < KERNEL_VERSION(3,3,0)
153         pci_unblock_user_cfg_access(pdev);
154 #else
155         pci_cfg_access_unlock(pdev);
156 #endif
157 }
158
159 /**
160  * It masks the msix on/off of generating MSI-X messages.
161  */
162 static int
163 igbuio_msix_mask_irq(struct msi_desc *desc, int32_t state)
164 {
165         uint32_t mask_bits = desc->masked;
166         unsigned offset = desc->msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE +
167                                                 PCI_MSIX_ENTRY_VECTOR_CTRL;
168
169         if (state != 0)
170                 mask_bits &= ~PCI_MSIX_ENTRY_CTRL_MASKBIT;
171         else
172                 mask_bits |= PCI_MSIX_ENTRY_CTRL_MASKBIT;
173
174         if (mask_bits != desc->masked) {
175                 writel(mask_bits, desc->mask_base + offset);
176                 readl(desc->mask_base);
177                 desc->masked = mask_bits;
178         }
179
180         return 0;
181 }
182
183 /**
184  * This function sets/clears the masks for generating LSC interrupts.
185  *
186  * @param info
187  *   The pointer to struct uio_info.
188  * @param on
189  *   The on/off flag of masking LSC.
190  * @return
191  *   -On success, zero value.
192  *   -On failure, a negative value.
193  */
194 static int
195 igbuio_set_interrupt_mask(struct rte_uio_pci_dev *udev, int32_t state)
196 {
197         struct pci_dev *pdev = udev->pdev;
198
199         if (udev->mode == RTE_INTR_MODE_MSIX) {
200                 struct msi_desc *desc;
201
202                 list_for_each_entry(desc, &pdev->msi_list, list) {
203                         igbuio_msix_mask_irq(desc, state);
204                 }
205         } else if (udev->mode == RTE_INTR_MODE_LEGACY) {
206                 uint32_t status;
207                 uint16_t old, new;
208
209                 pci_read_config_dword(pdev, PCI_COMMAND, &status);
210                 old = status;
211                 if (state != 0)
212                         new = old & (~PCI_COMMAND_INTX_DISABLE);
213                 else
214                         new = old | PCI_COMMAND_INTX_DISABLE;
215
216                 if (old != new)
217                         pci_write_config_word(pdev, PCI_COMMAND, new);
218         }
219
220         return 0;
221 }
222
223 /**
224  * This is the irqcontrol callback to be registered to uio_info.
225  * It can be used to disable/enable interrupt from user space processes.
226  *
227  * @param info
228  *  pointer to uio_info.
229  * @param irq_state
230  *  state value. 1 to enable interrupt, 0 to disable interrupt.
231  *
232  * @return
233  *  - On success, 0.
234  *  - On failure, a negative value.
235  */
236 static int
237 igbuio_pci_irqcontrol(struct uio_info *info, s32 irq_state)
238 {
239         unsigned long flags;
240         struct rte_uio_pci_dev *udev = igbuio_get_uio_pci_dev(info);
241         struct pci_dev *pdev = udev->pdev;
242
243         spin_lock_irqsave(&udev->lock, flags);
244         if (!pci_lock(pdev)) {
245                 spin_unlock_irqrestore(&udev->lock, flags);
246                 return -1;
247         }
248
249         igbuio_set_interrupt_mask(udev, irq_state);
250
251         pci_unlock(pdev);
252         spin_unlock_irqrestore(&udev->lock, flags);
253
254         return 0;
255 }
256
257 /**
258  * This is interrupt handler which will check if the interrupt is for the right device.
259  * If yes, disable it here and will be enable later.
260  */
261 static irqreturn_t
262 igbuio_pci_irqhandler(int irq, struct uio_info *info)
263 {
264         irqreturn_t ret = IRQ_NONE;
265         unsigned long flags;
266         struct rte_uio_pci_dev *udev = igbuio_get_uio_pci_dev(info);
267         struct pci_dev *pdev = udev->pdev;
268         uint32_t cmd_status_dword;
269         uint16_t status;
270
271         spin_lock_irqsave(&udev->lock, flags);
272         /* block userspace PCI config reads/writes */
273         if (!pci_lock(pdev))
274                 goto spin_unlock;
275
276         /* for legacy mode, interrupt maybe shared */
277         if (udev->mode == RTE_INTR_MODE_LEGACY) {
278                 pci_read_config_dword(pdev, PCI_COMMAND, &cmd_status_dword);
279                 status = cmd_status_dword >> 16;
280                 /* interrupt is not ours, goes to out */
281                 if (!(status & PCI_STATUS_INTERRUPT))
282                         goto done;
283         }
284
285         igbuio_set_interrupt_mask(udev, 0);
286         ret = IRQ_HANDLED;
287 done:
288         /* unblock userspace PCI config reads/writes */
289         pci_unlock(pdev);
290 spin_unlock:
291         spin_unlock_irqrestore(&udev->lock, flags);
292         printk(KERN_INFO "irq 0x%x %s\n", irq, (ret == IRQ_HANDLED) ? "handled" : "not handled");
293
294         return ret;
295 }
296
297 #ifdef CONFIG_XEN_DOM0
298 static int
299 igbuio_dom0_mmap_phys(struct uio_info *info, struct vm_area_struct *vma)
300 {
301         int idx;
302         idx = (int)vma->vm_pgoff;
303         vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
304         vma->vm_page_prot.pgprot |= _PAGE_IOMAP;
305
306         return remap_pfn_range(vma,
307                         vma->vm_start,
308                         info->mem[idx].addr >> PAGE_SHIFT,
309                         vma->vm_end - vma->vm_start,
310                         vma->vm_page_prot);
311 }
312
313 /**
314  * This is uio device mmap method which will use igbuio mmap for Xen
315  * Dom0 environment.
316  */
317 static int
318 igbuio_dom0_pci_mmap(struct uio_info *info, struct vm_area_struct *vma)
319 {
320         int idx;
321
322         if (vma->vm_pgoff >= MAX_UIO_MAPS)
323                 return -EINVAL;
324         if(info->mem[vma->vm_pgoff].size == 0)
325                 return  -EINVAL;
326
327         idx = (int)vma->vm_pgoff;
328         switch (info->mem[idx].memtype) {
329         case UIO_MEM_PHYS:
330                 return igbuio_dom0_mmap_phys(info, vma);
331         case UIO_MEM_LOGICAL:
332         case UIO_MEM_VIRTUAL:
333         default:
334                 return -EINVAL;
335         }
336 }
337 #endif
338
339 /* Remap pci resources described by bar #pci_bar in uio resource n. */
340 static int
341 igbuio_pci_setup_iomem(struct pci_dev *dev, struct uio_info *info,
342                        int n, int pci_bar, const char *name)
343 {
344         unsigned long addr, len;
345         void *internal_addr;
346
347         if (sizeof(info->mem) / sizeof (info->mem[0]) <= n)
348                 return (EINVAL);
349
350         addr = pci_resource_start(dev, pci_bar);
351         len = pci_resource_len(dev, pci_bar);
352         if (addr == 0 || len == 0)
353                 return -1;
354         internal_addr = ioremap(addr, len);
355         if (internal_addr == NULL)
356                 return -1;
357         info->mem[n].name = name;
358         info->mem[n].addr = addr;
359         info->mem[n].internal_addr = internal_addr;
360         info->mem[n].size = len;
361         info->mem[n].memtype = UIO_MEM_PHYS;
362         return 0;
363 }
364
365 /* Get pci port io resources described by bar #pci_bar in uio resource n. */
366 static int
367 igbuio_pci_setup_ioport(struct pci_dev *dev, struct uio_info *info,
368                 int n, int pci_bar, const char *name)
369 {
370         unsigned long addr, len;
371
372         if (sizeof(info->port) / sizeof (info->port[0]) <= n)
373                 return (EINVAL);
374
375         addr = pci_resource_start(dev, pci_bar);
376         len = pci_resource_len(dev, pci_bar);
377         if (addr == 0 || len == 0)
378                 return (-1);
379
380         info->port[n].name = name;
381         info->port[n].start = addr;
382         info->port[n].size = len;
383         info->port[n].porttype = UIO_PORT_X86;
384
385         return (0);
386 }
387
388 /* Unmap previously ioremap'd resources */
389 static void
390 igbuio_pci_release_iomem(struct uio_info *info)
391 {
392         int i;
393         for (i = 0; i < MAX_UIO_MAPS; i++) {
394                 if (info->mem[i].internal_addr)
395                         iounmap(info->mem[i].internal_addr);
396         }
397 }
398
399 static int
400 igbuio_setup_bars(struct pci_dev *dev, struct uio_info *info)
401 {
402         int i, iom, iop, ret;
403         unsigned long flags;
404         static const char *bar_names[PCI_STD_RESOURCE_END + 1]  = {
405                 "BAR0",
406                 "BAR1",
407                 "BAR2",
408                 "BAR3",
409                 "BAR4",
410                 "BAR5",
411         };
412
413         iom = 0;
414         iop = 0;
415
416         for (i = 0; i != sizeof(bar_names) / sizeof(bar_names[0]); i++) {
417                 if (pci_resource_len(dev, i) != 0 &&
418                                 pci_resource_start(dev, i) != 0) {
419                         flags = pci_resource_flags(dev, i);
420                         if (flags & IORESOURCE_MEM) {
421                                 if ((ret = igbuio_pci_setup_iomem(dev, info,
422                                                 iom, i, bar_names[i])) != 0)
423                                         return (ret);
424                                 iom++;
425                         } else if (flags & IORESOURCE_IO) {
426                                 if ((ret = igbuio_pci_setup_ioport(dev, info,
427                                                 iop, i, bar_names[i])) != 0)
428                                         return (ret);
429                                 iop++;
430                         }
431                 }
432         }
433
434         return ((iom != 0) ? ret : ENOENT);
435 }
436
437 #if LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)
438 static int __devinit
439 #else
440 static int
441 #endif
442 igbuio_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
443 {
444         struct rte_uio_pci_dev *udev;
445
446         udev = kzalloc(sizeof(struct rte_uio_pci_dev), GFP_KERNEL);
447         if (!udev)
448                 return -ENOMEM;
449
450         /*
451          * enable device: ask low-level code to enable I/O and
452          * memory
453          */
454         if (pci_enable_device(dev)) {
455                 printk(KERN_ERR "Cannot enable PCI device\n");
456                 goto fail_free;
457         }
458
459         /*
460          * reserve device's PCI memory regions for use by this
461          * module
462          */
463         if (pci_request_regions(dev, "igb_uio")) {
464                 printk(KERN_ERR "Cannot request regions\n");
465                 goto fail_disable;
466         }
467
468         /* enable bus mastering on the device */
469         pci_set_master(dev);
470
471         /* remap IO memory */
472         if (igbuio_setup_bars(dev, &udev->info))
473                 goto fail_release_iomem;
474
475         /* set 64-bit DMA mask */
476         if (pci_set_dma_mask(dev,  DMA_BIT_MASK(64))) {
477                 printk(KERN_ERR "Cannot set DMA mask\n");
478                 goto fail_release_iomem;
479         } else if (pci_set_consistent_dma_mask(dev, DMA_BIT_MASK(64))) {
480                 printk(KERN_ERR "Cannot set consistent DMA mask\n");
481                 goto fail_release_iomem;
482         }
483
484         /* fill uio infos */
485         udev->info.name = "Intel IGB UIO";
486         udev->info.version = "0.1";
487         udev->info.handler = igbuio_pci_irqhandler;
488         udev->info.irqcontrol = igbuio_pci_irqcontrol;
489 #ifdef CONFIG_XEN_DOM0
490         /* check if the driver run on Xen Dom0 */
491         if (xen_initial_domain())
492                 udev->info.mmap = igbuio_dom0_pci_mmap;
493 #endif
494         udev->info.priv = udev;
495         udev->pdev = dev;
496         udev->mode = RTE_INTR_MODE_LEGACY;
497         spin_lock_init(&udev->lock);
498
499         /* check if it need to try msix first */
500         if (igbuio_intr_mode_preferred == RTE_INTR_MODE_MSIX) {
501                 int vector;
502
503                 for (vector = 0; vector < IGBUIO_NUM_MSI_VECTORS; vector ++)
504                         udev->msix_entries[vector].entry = vector;
505
506                 if (pci_enable_msix(udev->pdev, udev->msix_entries, IGBUIO_NUM_MSI_VECTORS) == 0) {
507                         udev->mode = RTE_INTR_MODE_MSIX;
508                 }
509                 else {
510                         pci_disable_msix(udev->pdev);
511                         printk(KERN_INFO "fail to enable pci msix, or not enough msix entries\n");
512                 }
513         }
514         switch (udev->mode) {
515         case RTE_INTR_MODE_MSIX:
516                 udev->info.irq_flags = 0;
517                 udev->info.irq = udev->msix_entries[0].vector;
518                 break;
519         case RTE_INTR_MODE_MSI:
520                 break;
521         case RTE_INTR_MODE_LEGACY:
522                 udev->info.irq_flags = IRQF_SHARED;
523                 udev->info.irq = dev->irq;
524                 break;
525         default:
526                 break;
527         }
528
529         pci_set_drvdata(dev, udev);
530         igbuio_pci_irqcontrol(&udev->info, 0);
531
532         if (sysfs_create_group(&dev->dev.kobj, &dev_attr_grp))
533                 goto fail_release_iomem;
534
535         /* register uio driver */
536         if (uio_register_device(&dev->dev, &udev->info))
537                 goto fail_release_iomem;
538
539         printk(KERN_INFO "uio device registered with irq %lx\n", udev->info.irq);
540
541         return 0;
542
543 fail_release_iomem:
544         sysfs_remove_group(&dev->dev.kobj, &dev_attr_grp);
545         igbuio_pci_release_iomem(&udev->info);
546         if (udev->mode == RTE_INTR_MODE_MSIX)
547                 pci_disable_msix(udev->pdev);
548         pci_release_regions(dev);
549 fail_disable:
550         pci_disable_device(dev);
551 fail_free:
552         kfree(udev);
553
554         return -ENODEV;
555 }
556
557 static void
558 igbuio_pci_remove(struct pci_dev *dev)
559 {
560         struct uio_info *info = pci_get_drvdata(dev);
561
562         if (info->priv == NULL) {
563                 printk(KERN_DEBUG "Not igbuio device\n");
564                 return;
565         }
566
567         sysfs_remove_group(&dev->dev.kobj, &dev_attr_grp);
568         uio_unregister_device(info);
569         igbuio_pci_release_iomem(info);
570         if (((struct rte_uio_pci_dev *)info->priv)->mode ==
571                         RTE_INTR_MODE_MSIX)
572                 pci_disable_msix(dev);
573         pci_release_regions(dev);
574         pci_disable_device(dev);
575         pci_set_drvdata(dev, NULL);
576         kfree(info);
577 }
578
579 static int
580 igbuio_config_intr_mode(char *intr_str)
581 {
582         if (!intr_str) {
583                 printk(KERN_INFO "Use MSIX interrupt by default\n");
584                 return 0;
585         }
586
587         if (!strcmp(intr_str, RTE_INTR_MODE_MSIX_NAME)) {
588                 igbuio_intr_mode_preferred = RTE_INTR_MODE_MSIX;
589                 printk(KERN_INFO "Use MSIX interrupt\n");
590         } else if (!strcmp(intr_str, RTE_INTR_MODE_LEGACY_NAME)) {
591                 igbuio_intr_mode_preferred = RTE_INTR_MODE_LEGACY;
592                 printk(KERN_INFO "Use legacy interrupt\n");
593         } else {
594                 printk(KERN_INFO "Error: bad parameter - %s\n", intr_str);
595                 return -EINVAL;
596         }
597
598         return 0;
599 }
600
601 static struct pci_driver igbuio_pci_driver = {
602         .name = "igb_uio",
603         .id_table = NULL,
604         .probe = igbuio_pci_probe,
605         .remove = igbuio_pci_remove,
606 };
607
608 static int __init
609 igbuio_pci_init_module(void)
610 {
611         int ret;
612
613         ret = igbuio_config_intr_mode(intr_mode);
614         if (ret < 0)
615                 return ret;
616
617         return pci_register_driver(&igbuio_pci_driver);
618 }
619
620 static void __exit
621 igbuio_pci_exit_module(void)
622 {
623         pci_unregister_driver(&igbuio_pci_driver);
624 }
625
626 module_init(igbuio_pci_init_module);
627 module_exit(igbuio_pci_exit_module);
628
629 module_param(intr_mode, charp, S_IRUGO | S_IWUSR);
630 MODULE_PARM_DESC(intr_mode,
631 "igb_uio interrupt mode (default=msix):\n"
632 "    " RTE_INTR_MODE_MSIX_NAME "       Use MSIX interrupt\n"
633 "    " RTE_INTR_MODE_LEGACY_NAME "     Use Legacy interrupt\n"
634 "\n");
635
636 MODULE_DESCRIPTION("UIO driver for Intel IGB PCI cards");
637 MODULE_LICENSE("GPL");
638 MODULE_AUTHOR("Intel Corporation");