mrfioc2  2.3.0
uio_mrf.c
Go to the documentation of this file.
1 /*************************************************************************\
2 * Copyright (c) 2014 Brookhaven Science Associates, as Operator of
3 * Brookhaven National Laboratory.
4 * Copyright (c) 2015 Paul Scherrer Institute (PSI), Villigen, Switzerland
5 * mrfioc2 is distributed subject to a Software License Agreement found
6 * in file LICENSE that is included with this distribution.
7 \*************************************************************************/
8 
9 #include "mrf.h"
10 
11 #include <linux/proc_fs.h>
12 #include <linux/seq_file.h>
13 
14 #define DRV_NAME "mrf-pci"
15 
16 MODULE_LICENSE("GPL v2");
17 MODULE_VERSION(DRV_VERSION);
18 MODULE_AUTHOR("Michael Davidsaver <mdavidsaver@gmail.com>");
19 
20 /* something that userspace can test to see if we
21  * are the kernel module its looking for.
22  * 0 - (implied if interfaceversion /sys file is missing)
23  * Kernel and userspace both do RMW on the IRQEnable register, which allows race conditions
24  * 1 - Use of UIO irqcontrol callback to mask interrupts at the PLX bridge,
25  * resolves race for devices w/ PLX bridge.
26  * 2 - EVG FW ver. 0x8, EVR FW ver. 0xA move the PCI master interrupt enable to a seperate (MRF) register
27  * this allows the race to be avoided for devices w/o a PLX bridge.
28  * For devices w/ a PLX bridge, interface versions 1 and 2 are equivalent.
29  */
30 static int modparam_iversion = 2;
31 module_param_named(interfaceversion, modparam_iversion, int, 0444);
32 MODULE_PARM_DESC(interfaceversion, "User space interface version");
33 
34 /* Use MSI if present. */
35 static unsigned modparam_usemsi = 1;
36 module_param_named(use_msi, modparam_usemsi, uint, 0444);
37 MODULE_PARM_DESC(use_msi, "Use MSI if present (default 1, yes)");
38 
39 /************************ PCI Device and vendor IDs ****************/
40 
41 #define PCI_VENDOR_ID_MRF 0x1a3e
42 #define PCI_SUBVENDOR_ID_MRF 0x1a3e
43 
44 #define PCI_VENDOR_ID_LATTICE 0x1204
45 
46 #define PCI_DEVICE_ID_EC_30 0xEC30
47 
48 #define PCI_DEVICE_ID_XILINX_DEV 0x7011
49 
50 #define PCI_DEVICE_ID_PLX_9030 0x9030
51 #define PCI_DEVICE_ID_PLX_9056 0x9056
53 /* PMC-EVR-230 */
54 #define PCI_SUBDEVICE_ID_MRF_PMCEVR_230 0x11e6
55 /* cPCI-EVR-230 */
56 #define PCI_SUBDEVICE_ID_MRF_PXIEVR_230 0x10e6
57 /* cPCI-EVG-220 */
58 #define PCI_SUBDEVICE_ID_MRF_PXIEVG_220 0x20dc
59 /* cPCI-EVG-230 */
60 #define PCI_SUBDEVICE_ID_MRF_PXIEVG_230 0x20E6
61 /* cPCI-EVRTG-300 */
62 #define PCI_SUBDEVICE_ID_MRF_EVRTG_300 0x192c
63 /* PCIe-EVR-300 and PCIe-EVR-300DC */
64 #define PCI_SUBDEVICE_ID_PCIE_EVR_300 0x172c
65 
66 /* mTCA-EVM-300 */
67 #define PCI_DEVICE_ID_MRF_MTCA_EVM_300 0x232c
68 
69 /* cPCI-EVG-300 */
70 #define PCI_DEVICE_ID_MRF_CPCI_EVG_300 0x252c
71 /* cPCI-EVR-300 */
72 #define PCI_DEVICE_ID_MRF_CPCI_EVR_300 0x152c
73 /* mTCA-EVR-300 */
74 #define PCI_DEVICE_ID_MRF_EVRMTCA300 0x132c
75 
76 
77 /************************ Compatability ****************************/
78 
79 
80 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,28)
81 static
82 void __iomem *pci_ioremap_bar(struct pci_dev* pdev,int bar)
83 {
84  if(!(pci_resource_flags(pdev,bar) & IORESOURCE_MEM )){
85  WARN_ON(1);
86  return NULL;
87  }
88  return ioremap_nocache(pci_resource_start(pdev,bar),
89  pci_resource_len(pdev,bar));
90 }
91 #endif
92 
93 #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,2,0)
94 
95 #ifndef VM_RESERVED
96 #define VM_RESERVED 0
97 #endif
98 
114 static
115 int mrf_mmap_physical(struct uio_info *info, struct vm_area_struct *vma)
116 {
117  struct pci_dev *dev = info->priv;
118  int mi = vma->vm_pgoff; /* bounds check already done in uio_mmap() */
119 
120  if (vma->vm_end - vma->vm_start > PAGE_ALIGN(info->mem[mi].size)) {
121  dev_err(&dev->dev, "mmap alignment/size test fails %lx %lx %u\n",
122  vma->vm_start, vma->vm_end, (unsigned)PAGE_ALIGN(info->mem[mi].size));
123  return -EINVAL;
124  }
125 
126  vma->vm_flags |= VM_IO | VM_RESERVED;
127  vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
128 
129  return remap_pfn_range(vma,
130  vma->vm_start,
131  info->mem[mi].addr >> PAGE_SHIFT,
132  vma->vm_end - vma->vm_start,
133  vma->vm_page_prot);
134 }
135 
136 #define USE_CUSTOM_MMAP
137 #endif
138 
139 static
140 int mrf_detect_endian(struct mrf_priv *priv, void __iomem *evr)
141 {
142  struct pci_dev *dev = priv->pdev;
143  u32 val = ioread32(evr + FPGAVersion),
144  high = (val & 0xff000000) >> 24,
145  low = val & 0x000000ff;
146  if(high==low) {
147  /* the unfortunate case where the firmware version==the mrf type code */
148  dev_err(&dev->dev, "Can't detect endianness when high==low 0x%08lx\n",
149  (unsigned long)val);
150  return -1;
151  } else if(high==priv->mrftype) {
152  // little endian
153  return 0;
154  } else if(low==priv->mrftype) {
155  // big endian
156  return 1;
157  } else {
158  dev_err(&dev->dev, "no match for version 0x%08lx against %x\n",
159  (unsigned long)val, priv->mrftype);
160  return -1;
161  }
162 }
163 
164 /******************** PCI interrupt handler ***********************/
165 
166 /* original ISR behavior which manipulates the EVR's
167  * IRQFlag and IRQEnable.
168  */
169 static
170 irqreturn_t
171 mrf_handler_evr(int irq, struct uio_info *info)
172 {
173  void __iomem *base = info->mem[2].internal_addr;
174  void __iomem *plx = info->mem[0].internal_addr;
175  struct pci_dev *dev = info->priv;
176  u32 plxctrl, status, enable;
177  int end;
178 
179  switch(dev->device) {
181  plxctrl = ioread32(plx + LAS0BRD);
182  end = plxctrl & LAS0BRD_ENDIAN;
183  break;
185  plxctrl = ioread32(plx + BIGEND9056);
186  end = plxctrl & BIGEND9056_BIG;
187  break;
188  default: {
189  static int flag = 0; /* don't spam! */
190  if(!flag) {
191  dev_err(&dev->dev, "non-PLX ISR not supported in EVR mode");
192  flag = 1;
193  }
194  }
195  /* If this really was our interrupt,
196  * then the best case is that the kernel detects
197  * the unhandled interrupt and disables it at the PIC.
198  * If not, then the system will hang.
199  */
200  return IRQ_NONE;
201  }
202 
203  /* Test endianness since we allow user
204  * apps to use whatever is convenient
205  */
206  if (end) {
207  status = ioread32be(base + IRQFlag);
208  enable = ioread32be(base + IRQEnable);
209  } else {
210  status = ioread32(base + IRQFlag);
211  enable = ioread32(base + IRQEnable);
212  }
213 
214  if (!(status & enable)) {
215  return IRQ_NONE;
216  }
217 
218  if(!(enable & IRQ_Enable)) {
219  dev_info(&dev->dev, "Interrupt when not enabled! 0x%08lx 0x%08lx\n",
220  (unsigned long)enable, (unsigned long)status);
221  }
222 
223  /* Disable interrupt */
224  if (end) {
225  iowrite32be(enable & ~IRQ_Enable, base + IRQEnable);
226  } else {
227  iowrite32(enable & ~IRQ_Enable, base + IRQEnable);
228  }
229 
230  /* Ensure interrupts have really been disabled */
231  wmb();
232  if (end) {
233  enable = ioread32be(base + IRQEnable);
234  } else {
235  enable = ioread32(base + IRQEnable);
236  }
237 
238  if(enable & IRQ_Enable) {
239  dev_info(&dev->dev, "Interrupt not disabled!!!");
240  }
241 
242  return IRQ_HANDLED;
243 }
244 
245 /* new ISR behavior which manipulates
246  * the PLX bridge PCI interrupt enable bit.
247  */
248 static
249 irqreturn_t
250 mrf_handler_plx(int irq, struct uio_info *info)
251 {
252  struct mrf_priv *priv = container_of(info, struct mrf_priv, uio);
253  struct pci_dev *dev = info->priv;
254  void __iomem *plx = info->mem[0].internal_addr;
255  u32 val;
256  int oops;
257 
258  switch(dev->device) {
260  // Check if INT1 is active
261  val = ioread32(plx+INTCSR);
264  return IRQ_NONE;
265  // clear INTCSR_PCI_Enable
267  val = ioread32(plx+INTCSR);
268  oops = val&INTCSR_PCI_Enable;
269  break;
270 
272  // check if local interrupt is active
273  val = ioread32(plx+INTCSR9056);
276  return IRQ_NONE;
277  // clear INTCSR9056_PCI_Enable
278  iowrite32(INTCSR9056_LCL_Enable, plx+INTCSR9056);
279  val = ioread32(plx+INTCSR9056);
280  oops = val&INTCSR9056_PCI_Enable;
281  break;
282 
283  default:
284  {
285  int end;
286  u32 flags;
287  // there are no distict registers for this bridge.
288  // 'plx' holds the base address of FPGA registers
289 
290  end = mrf_detect_endian(priv, plx);
291 
292  if(end==1) {
293  val = ioread32be(plx + IRQEnable);
294  flags= ioread32be(plx + IRQFlag);
295  } else if(end==0) {
296  val = ioread32(plx + IRQEnable);
297  flags= ioread32(plx + IRQFlag);
298  } else {
299  return IRQ_NONE; /* shouldn't happen since this condition is checked in mrf_probe() */
300  }
301  flags |= IRQ_Enable_ALL;
302 
303  if((flags & val)==0) {
304  dev_dbg(&dev->dev, "reject %08x %08x\n", (unsigned)flags, (unsigned)val);
305  return IRQ_NONE; /* not our interrupt */
306  } else
307  dev_dbg(&dev->dev, "accept %08x %08x\n", (unsigned)flags, (unsigned)val);
308 
309  if(!priv->usemie) {
310  // Disable interrupts on FPGA
311  if(end) {
312  iowrite32be(val & (~IRQ_PCIee), plx + IRQEnable);
313  } else {
314  iowrite32(val & (~IRQ_PCIee), plx + IRQEnable);
315  }
316 
317  // Check if clear succeded
318  wmb();
319  if(end) {
320  val = ioread32be(plx + IRQEnable);
321  } else {
322  val = ioread32(plx + IRQEnable);
323  }
324 
325  oops = val & IRQ_PCIee;
326 
327  } else {
328  iowrite32be(0, plx + PCIMIE);
329  wmb();
330  oops = val = ioread32(plx + PCIMIE);
331  }
332  }
333  break;
334  }
335 
336  if(oops) {
337  dev_info(&dev->dev, "Interrupt not disabled %08x", (unsigned)val);
338  }
339 
340  return IRQ_HANDLED;
341 }
342 
343 static
344 irqreturn_t
345 mrf_handler(int irq, struct uio_info *info)
346 {
347  struct mrf_priv *priv = container_of(info, struct mrf_priv, uio);
348 
349  // Count interrupt handler executions
350  priv->intrcount++;
351 
352  rmb();
353  if(priv->irqmode) {
354  return mrf_handler_plx(irq, info);
355  } else {
356  /* compatibility mode */
357  return mrf_handler_evr(irq, info);
358  }
359 }
360 
361 static
362 int mrf_irqcontrol(struct uio_info *info, s32 onoff)
363 {
364  struct pci_dev *dev = info->priv;
365  struct mrf_priv *priv = container_of(info, struct mrf_priv, uio);
366  void __iomem *plx = info->mem[0].internal_addr;
367  u32 val, end;
368 
369  if (onoff < 0) {
370  return -EINVAL;
371  } else if (onoff > 1) {
372  return 0; /* onoff>1 is a no-op now, but may have other meaning in future */
373  }
374 
375  switch (dev->device) {
377 
379  if (onoff == 1) {
380  val |= INTCSR_PCI_Enable;
381  }
382 
383  iowrite32(val, plx + INTCSR);
384 
385  break;
386 
388 
389  val = INTCSR9056_LCL_Enable;
390  if (onoff == 1) {
391  val |= INTCSR9056_PCI_Enable;
392  }
393 
394  iowrite32(val, plx + INTCSR9056);
395 
396  break;
397 
398  default:
399  // there are no distict registers for this bridge.
400  // 'plx' holds the base address of FPGA registers
401 
402  // Check endianism
403  end = mrf_detect_endian(priv, plx);
404 
405  // With FW version >=8 the PCI master interrupt enable bit
406  // moved to it's own register (PCIMIE), which userspace shouldn't touch
407  // thus avoiding the race conditions inheirent in sharing IRQEnable
408  if(!priv->usemie) {
409 
410  // Read current IRQ enable register
411  if(end==1) {
412  val = ioread32be(plx + IRQEnable);
413  } else if(end==0) {
414  val = ioread32(plx + IRQEnable);
415  } else {
416  return -EINVAL; /* shouldn't happen since this condition is checked in mrf_probe() */
417  }
418 
419  // Modify the IRQ enable bit
420  if (onoff == 1) {
421  val |= IRQ_PCIee;
422  } else {
423  val &= (~IRQ_PCIee);
424  }
425 
426  // Write the register back
427  if(end) {
428  iowrite32be(val, plx + IRQEnable);
429  } else {
430  iowrite32(val, plx + IRQEnable);
431  }
432 
433  } else {
434  if (onoff == 1) {
435  val = IRQ_PCIee;
436  } else {
437  val = 0;
438  }
439 
440  if(end) {
441  iowrite32be(val, plx + PCIMIE);
442  } else {
443  iowrite32(val, plx + PCIMIE);
444  }
445  }
446 
447  break;
448  }
449 
450  // Writing 0 or 1 to /dev/uioX selects switches
451  // interrupt handling to PLX mode
452  priv->irqmode = 1;
453  wmb();
454 
455  return 0;
456 }
457 
458 /************************* Initialization ***************************/
459 
460 static
461 int
462 mrf_probe(struct pci_dev *dev,
463  const struct pci_device_id *id)
464 {
465  int ret = -ENODEV;
466  struct mrf_priv *priv;
467  struct uio_info *info;
468 
469  priv = kzalloc(sizeof(struct mrf_priv), GFP_KERNEL);
470  if (!priv) { return -ENOMEM; }
471  info = &priv->uio;
472  priv->pdev = dev;
473  priv->mrftype = id->driver_data;
474 
475  ret = pci_enable_device(dev);
476  if (ret) {
477  dev_err(&dev->dev, "pci_enable_device failed with %d\n",ret);
478  goto err_free;
479  }
480  if (!dev->irq) {
481  dev_warn(&dev->dev, "Device not configured with IRQ!\n");
482  ret=-ENODEV;
483  goto err_disable;
484  }
485 
486  if (pci_request_regions(dev, DRV_NAME)) {
487  ret=-ENODEV;
488  goto err_disable;
489  }
490 
491  switch(dev->device) {
494  dev_info(&dev->dev, "Attaching MRF device w/ PLX bridge");
495 
496  /* BAR 0 is the PLX bridge */
497  info->mem[0].name = "PLX";
498  info->mem[0].addr = pci_resource_start(dev, 0);
499  info->mem[0].size = pci_resource_len(dev,0);
500  info->mem[0].internal_addr =pci_ioremap_bar(dev,0);
501  info->mem[0].memtype = UIO_MEM_PHYS;
502 
503  /* Not used */
504  info->mem[1].memtype = UIO_MEM_NONE;
505  info->mem[1].size = 1; /* Otherwise UIO will stop searching... */
506 
507  /* BAR 2 is the EVR */
508  info->mem[2].name = "MRF";
509  info->mem[2].addr = pci_resource_start(dev, 2);
510  info->mem[2].size = pci_resource_len(dev,2);
511  info->mem[2].internal_addr =pci_ioremap_bar(dev,2);
512  info->mem[2].memtype = UIO_MEM_PHYS;
513 
514  if (!info->mem[0].internal_addr ||
515  !info->mem[0].addr ||
516  !info->mem[2].internal_addr ||
517  !info->mem[2].addr) {
518  dev_err(&dev->dev, "Failed to map BARS!\n");
519  ret=-ENODEV;
520  goto err_release;
521  }
522  break;
523 
524  default:
525  switch(dev->vendor) {
527  case PCI_VENDOR_ID_MRF:
529  dev_info(&dev->dev, "Attaching MRF device w/o PLX bridge (%08x)\n",
530  (unsigned)dev->device);
531  break;
532  default:
533  dev_err(&dev->dev, "Unsupported vendor ID\n");
534  ret=-ENODEV;
535  goto err_release;
536  }
537 
538  /* BAR 0 is the EVR */
539  info->mem[0].name = "MRF";
540  info->mem[0].addr = pci_resource_start(dev, 0);
541  info->mem[0].size = pci_resource_len(dev,0);
542  info->mem[0].internal_addr = pci_ioremap_bar(dev,0);
543  info->mem[0].memtype = UIO_MEM_PHYS;
544 
545  if(!info->mem[0].internal_addr || !info->mem[0].addr){
546  dev_err(&dev->dev, "Failed to map BARS!\n");
547  ret=-ENODEV;
548  goto err_release;
549  }
550 
551  {
552  u32 mrfver = 0;
553  switch(mrf_detect_endian(priv, info->mem[0].internal_addr))
554  {
555  case 0: /* LSB */
556  mrfver = ioread32(info->mem[0].internal_addr + FPGAVersion);
557  break;
558  case 1:
559  mrfver = ioread32be(info->mem[0].internal_addr + FPGAVersion);
560  break;
561  case -1:
562  ret=-ENODEV;
563  goto err_unmap;
564  }
565 
566  switch(mrfver>>28) {
567  case 1: /* EVR */
568  priv->usemie = (mrfver&0xff)>=0xa;
569  break;
570  case 2: /* EVG */
571  priv->usemie = (mrfver&0xff)>=0x8;
572  break;
573  default:
574  dev_err(&dev->dev, "Unrecognized MRF device type 0x%08x\n", (unsigned)mrfver);
575  ret=-ENODEV;
576  goto err_unmap;
577  }
578  if((mrfver&0xff00)==0x0200)
579  priv->usemie = 1;
580 
581  if(!priv->usemie) {
582  dev_warn(&dev->dev, "Consider update to firmware >=8 (currently %u) to avoid "
583  "race condition in IRQ handling\n", (mrfver&0xff));
584  }
585  }
586 
587  /* 300 series only supported in "PLX" irq mode */
588  priv->irqmode = 1;
589  break;
590  }
591 
592  if(modparam_usemsi) {
593  int err = pci_enable_msi(dev);
594  if(!err) {
595  dev_info(&dev->dev, "Using MSI\n");
596  priv->msienabled = 1;
597  /* needed for MSI */
598  pci_set_master(dev);
599  } else {
600  dev_dbg(&dev->dev, "Error enabling MSI %d\n", err);
601  }
602  }
603 
604  info->irq = dev->irq;
605  info->irq_flags = IRQF_SHARED;
606  info->handler = mrf_handler;
607  info->irqcontrol = mrf_irqcontrol;
608 #ifdef USE_CUSTOM_MMAP
609  info->mmap = mrf_mmap_physical;
610 #endif
611 
612  info->name = DRV_NAME;
613  info->version = DRV_VERSION;
614  info->priv = dev;
615 
616  pci_set_drvdata(dev, info);
617 
618  ret = uio_register_device(&dev->dev, info);
619  if (ret) {
620  goto err_unmap;
621  }
622 
623 #if defined(CONFIG_GENERIC_GPIO) || defined(CONFIG_PARPORT_NOT_PC)
624  spin_lock_init(&priv->lock);
625 
626  if (dev->device==PCI_DEVICE_ID_PLX_9030) {
627  u32 val;
628  void __iomem *plx = info->mem[0].internal_addr;
629 
630  /* GPIO Bits 0-3 are used as GPIO for JTAG.
631  * Bits 4-7 must be left to their normal functions.
632  * The device is expected to configure bits 4-7
633  * itself when initialized, and not change them
634  * afterward. So we just avoid changes.
635  *
636  * Power up value observed in a PMC-EVR-230
637  * GPIOC = 0x00249924
638  * is consistent with the default given in the
639  * PLX 9030 data book.
640  */
641 
642  val = ioread32(plx + GPIOC);
643 
644  /* clear everything for GPIO 0-3 (aka first 12 bits).
645  * Preserve current settings for GPIO 4-7.
646  * This will setup these as inputs (which float high)
647  *
648  * Each GPIO bit has 3 register bits (function, direction, and value)
649  */
650  val &= 0xfffff000;
651 
652  // Enable output drivers for TCLK, TMS, and TDI
653  val |= GPIOC_pin_dir(0);
654  val |= GPIOC_pin_dir(1);
655  val |= GPIOC_pin_dir(3);
656 
657  dev_info(&dev->dev, "GPIOC %08x\n", val);
658  iowrite32(val, plx + GPIOC);
659 
660 #ifdef CONFIG_GENERIC_GPIO
661  mrf_gpio_setup(priv);
662 #endif
663 #ifdef CONFIG_PARPORT_NOT_PC
664  mrf_pp_setup(priv);
665 #endif
666  }
667 #else
668  if (dev->device==PCI_DEVICE_ID_PLX_9030) {
669  dev_info(&dev->dev, "GPIO support not built, JTAG unavailable\n");
670  }
671 #endif /* defined(CONFIG_GENERIC_GPIO) || defined(CONFIG_PARPORT_NOT_PC) */
672 
673  pci_save_state(dev);
674 
675  dev_info(&dev->dev, "MRF Setup complete\n");
676 
677  return 0;
678 //err_unreg:
679 // uio_unregister_device(info);
680 // pci_set_drvdata(dev, NULL);
681 err_unmap:
682  iounmap(info->mem[0].internal_addr);
683  iounmap(info->mem[2].internal_addr);
684  if(priv->msienabled) {
685  pci_disable_msi(dev);
686  }
687 err_release:
688  pci_release_regions(dev);
689 err_disable:
690  pci_disable_device(dev);
691 err_free:
692  kfree(priv);
693  return ret;
694 }
695 
696 static struct pci_device_id mrf_pci_ids[] = {
697  {
698  .vendor = PCI_VENDOR_ID_PLX,
699  .device = PCI_DEVICE_ID_PLX_9030,
700  .subvendor = PCI_SUBVENDOR_ID_MRF,
701  .subdevice = PCI_SUBDEVICE_ID_MRF_PXIEVR_230,
702  },
703  {
704  .vendor = PCI_VENDOR_ID_PLX,
705  .device = PCI_DEVICE_ID_PLX_9030,
706  .subvendor = PCI_SUBVENDOR_ID_MRF,
707  .subdevice = PCI_SUBDEVICE_ID_MRF_PXIEVG_220,
708  },
709  {
710  .vendor = PCI_VENDOR_ID_PLX,
711  .device = PCI_DEVICE_ID_PLX_9030,
712  .subvendor = PCI_SUBVENDOR_ID_MRF,
713  .subdevice = PCI_SUBDEVICE_ID_MRF_PXIEVG_230,
714  },
715  {
716  .vendor = PCI_VENDOR_ID_PLX,
717  .device = PCI_DEVICE_ID_PLX_9030,
718  .subvendor = PCI_SUBVENDOR_ID_MRF,
719  .subdevice = PCI_SUBDEVICE_ID_MRF_PMCEVR_230,
720  },
721  {
722  .vendor = PCI_VENDOR_ID_PLX,
723  .device = PCI_DEVICE_ID_PLX_9056,
724  .subvendor = PCI_SUBVENDOR_ID_MRF,
725  .subdevice = PCI_SUBDEVICE_ID_MRF_EVRTG_300,
726  },
727  {
728  /* original PCIe-EVR-300 */
729  .vendor = PCI_VENDOR_ID_LATTICE,
730  .device = PCI_DEVICE_ID_EC_30,
731  .subvendor = PCI_SUBVENDOR_ID_MRF,
732  .subdevice = PCI_SUBDEVICE_ID_PCIE_EVR_300,
733  .driver_data = 0x17, /* MSB of the Version register */
734  },
735  {
736  /* PCIe-EVR-300DC */
737  .vendor = PCI_VENDOR_ID_XILINX,
738  .device = PCI_DEVICE_ID_XILINX_DEV,
739  .subvendor = PCI_SUBVENDOR_ID_MRF,
740  .subdevice = PCI_SUBDEVICE_ID_PCIE_EVR_300,
741  .driver_data = 0x17, /* MSB of the Version register */
742  },
743  {
744  .vendor = PCI_VENDOR_ID_MRF,
746  .subvendor = PCI_SUBVENDOR_ID_MRF,
747  .subdevice = PCI_DEVICE_ID_MRF_CPCI_EVG_300,
748  .driver_data = 0x24,
749  },
750  {
751  .vendor = PCI_VENDOR_ID_MRF,
753  .subvendor = PCI_SUBVENDOR_ID_MRF,
754  .subdevice = PCI_DEVICE_ID_MRF_CPCI_EVR_300,
755  .driver_data = 0x14,
756  },
757  {
758  .vendor = PCI_VENDOR_ID_XILINX,
759  .device = PCI_DEVICE_ID_XILINX_DEV,
760  .subvendor = PCI_SUBVENDOR_ID_MRF,
761  .subdevice = PCI_DEVICE_ID_MRF_EVRMTCA300,
762  .driver_data = 0x18,
763  },
764  {
765  .vendor = PCI_VENDOR_ID_XILINX,
766  .device = PCI_DEVICE_ID_XILINX_DEV,
767  .subvendor = PCI_SUBVENDOR_ID_MRF,
768  .subdevice = PCI_DEVICE_ID_MRF_MTCA_EVM_300,
769  .driver_data = 0x28,
770  },
771  { 0, }
772 };
773 MODULE_DEVICE_TABLE(pci, mrf_pci_ids);
774 
775 /************************** Module boilerplate ****************************/
776 
777 static
778 void
779 mrf_remove(struct pci_dev *dev)
780 {
781  struct uio_info *info = pci_get_drvdata(dev);
782  struct mrf_priv *priv = container_of(info, struct mrf_priv, uio);
783 
784 #ifdef CONFIG_PARPORT_NOT_PC
785  mrf_pp_cleanup(priv);
786 #endif
787 #ifdef CONFIG_GENERIC_GPIO
788  mrf_gpio_cleanup(priv);
789 #endif
790 #if defined(CONFIG_GENERIC_GPIO) || defined(CONFIG_PARPORT_NOT_PC)
791  {
792  if(dev->device==PCI_DEVICE_ID_PLX_9030) {
793  void __iomem *plx = info->mem[0].internal_addr;
794  u32 val = ioread32(plx + GPIOC);
795  // Disable output drivers for TCLK, TMS, and TDI
796  val &= ~GPIOC_pin_dir(0);
797  val &= ~GPIOC_pin_dir(1);
798  val &= ~GPIOC_pin_dir(3);
799  iowrite32(val, plx + GPIOC);
800  }
801  }
802 #endif
803  uio_unregister_device(info);
804  pci_set_drvdata(dev, NULL);
805  iounmap(info->mem[0].internal_addr);
806 
807  switch(dev->device) {
810  iounmap(info->mem[2].internal_addr);
811  }
812 
813  if(priv->msienabled) {
814  pci_disable_msi(dev);
815  }
816  pci_release_regions(dev);
817  pci_disable_device(dev);
818 
819  kfree(priv);
820 
821  dev_info(&dev->dev, "MRF Cleaned up\n");
822 }
823 
824 
829 static
830 pci_ers_result_t
831 mrf_error_detected(struct pci_dev *dev, pci_channel_state_t state)
832 {
833  struct uio_info *info = pci_get_drvdata(dev);
834  struct mrf_priv *priv = container_of(info, struct mrf_priv, uio);
835 
836  if (state == pci_channel_io_normal) {
837  /* FIXME: Anything else to do here? */
838  return PCI_ERS_RESULT_CAN_RECOVER;
839  } else if (state == pci_channel_io_frozen) {
840  dev_warn(&dev->dev, "Unregistering UIO device\n");
841  uio_unregister_device(info);
842 
843  if (priv->msienabled) {
844  pci_disable_msi(dev);
845  }
846 
847  pci_disable_device(dev);
848 
849  /* FIXME: Anything else to do here? */
850  return PCI_ERS_RESULT_NEED_RESET;
851  } else if (state == pci_channel_io_perm_failure) {
852  return PCI_ERS_RESULT_DISCONNECT;
853  }
854 
855  return PCI_ERS_RESULT_NONE;
856 }
857 
858 static
859 pci_ers_result_t
860 mrf_slot_reset(struct pci_dev *dev)
861 {
862  int ret;
863  struct uio_info *info = pci_get_drvdata(dev);
864  struct mrf_priv *priv = container_of(info, struct mrf_priv, uio);
865 
866  if (pci_enable_device(dev)) {
867  dev_err(&dev->dev, "Failed to re-enable after slot reset\n");
868  return PCI_ERS_RESULT_DISCONNECT;
869  }
870 
871  if (priv->msienabled) {
872  int err = pci_enable_msi(dev);
873  if (!err) {
874  dev_info(&dev->dev, "Using MSI\n");
875  /* needed for MSI */
876  pci_set_master(dev);
877  } else {
878  dev_dbg(&dev->dev, "Error enabling MSI %d\n", err);
879  }
880  }
881 
882  ret = uio_register_device(&dev->dev, info);
883  if (ret) {
884  dev_err(&dev->dev, "Failed to register UIO device %d\n", ret);
885  }
886  dev_warn(&dev->dev, "Registered UIO device\n");
887 
888  pci_restore_state(dev);
889  pci_save_state(dev);
890 
891  /* FIXME: Anything else to do here? */
892 
893  return PCI_ERS_RESULT_RECOVERED;
894 }
895 
896 static
897 pci_ers_result_t
898 mrf_mmio_enabled(struct pci_dev *dev) {
899  /* FIXME: Anything else to do here? */
900  return PCI_ERS_RESULT_NONE;
901 }
902 
903 static
904 void
905 mrf_error_resume(struct pci_dev *dev) {
906  /* FIXME: Anything else to do here? */
907 }
908 
909 static const struct pci_error_handlers mrf_err_handler = {
910  .error_detected = mrf_error_detected,
911  .mmio_enabled = mrf_mmio_enabled,
912  .slot_reset = mrf_slot_reset,
913  .resume = mrf_error_resume
914 };
915 
916 static struct pci_driver mrf_driver = {
917  .name = DRV_NAME,
918  .id_table = mrf_pci_ids,
919  .probe = mrf_probe,
920  .remove = mrf_remove,
921  .err_handler = &mrf_err_handler
922 };
923 
924 static int mrf_init_module(void)
925 {
926  return pci_register_driver(&mrf_driver);
927 }
928 module_init(mrf_init_module);
929 
930 static void mrf_exit_module(void)
931 {
932  pci_unregister_driver(&mrf_driver);
933 }
934 module_exit(mrf_exit_module);
935 
#define VM_RESERVED
Definition: uio_mrf.c:96
#define PCI_DEVICE_ID_MRF_MTCA_EVM_300
Definition: uio_mrf.c:67
#define PCI_DEVICE_ID_MRF_CPCI_EVR_300
Definition: uio_mrf.c:72
unsigned int msienabled
Definition: mrf.h:145
MODULE_LICENSE("GPL v2")
#define IRQ_PCIee
Definition: mrf.h:119
#define INTCSR_INT1_Status
Definition: plx9030.h:30
#define PCI_SUBVENDOR_ID_MRF
Definition: uio_mrf.c:42
MODULE_DEVICE_TABLE(pci, mrf_pci_ids)
#define IRQEnable
Definition: mrf.h:115
#define PCI_DEVICE_ID_MRF_EVRMTCA300
Definition: uio_mrf.c:74
#define LAS0BRD
Definition: mrf.h:41
#define PCI_VENDOR_ID_LATTICE
Definition: uio_mrf.c:44
Definition: mrf.h:138
#define IRQ_Enable_ALL
Definition: mrf.h:121
#define PCI_VENDOR_ID_PLX
Definition: plx9030.h:37
#define PCI_VENDOR_ID_XILINX
Definition: mrmpci.h:14
MODULE_AUTHOR("Michael Davidsaver <mdavidsaver@gmail.com>")
struct pci_dev * pdev
Definition: mrf.h:140
#define BIGEND9056
Definition: mrf.h:74
#define PCIMIE
Definition: mrf.h:123
unsigned int mrftype
Definition: mrf.h:141
#define IRQ_Enable
Definition: mrf.h:117
#define DRV_NAME
Definition: uio_mrf.c:14
#define PCI_SUBDEVICE_ID_MRF_PMCEVR_230
Definition: uio_mrf.c:54
#define BIGEND9056_BIG
Definition: plx9056.h:21
#define PCI_DEVICE_ID_XILINX_DEV
Definition: uio_mrf.c:48
#define PCI_VENDOR_ID_MRF
Definition: uio_mrf.c:41
#define FPGAVersion
Definition: mrf.h:133
#define PCI_DEVICE_ID_EC_30
Definition: uio_mrf.c:46
#define PCI_SUBDEVICE_ID_MRF_PXIEVR_230
Definition: uio_mrf.c:56
#define IRQFlag
Definition: mrf.h:106
module_param_named(interfaceversion, modparam_iversion, int, 0444)
unsigned int intrcount
Definition: mrf.h:143
#define PCI_SUBDEVICE_ID_MRF_PXIEVG_230
Definition: uio_mrf.c:60
#define LAS0BRD_ENDIAN
Definition: plx9030.h:24
#define INTCSR9056_LCL_Status
Definition: mrf.h:85
#define INTCSR9056
Definition: mrf.h:77
#define INTCSR_INT1_Polarity
Definition: plx9030.h:29
#define PCI_SUBDEVICE_ID_MRF_PXIEVG_220
Definition: uio_mrf.c:58
#define PCI_SUBDEVICE_ID_MRF_EVRTG_300
Definition: uio_mrf.c:62
MODULE_PARM_DESC(interfaceversion, "User space interface version")
#define GPIOC_pin_dir(N)
Definition: mrf.h:61
module_exit(mrf_exit_module)
#define INTCSR
Definition: mrf.h:46
#define GPIOC
Definition: mrf.h:56
#define PCI_SUBDEVICE_ID_PCIE_EVR_300
Definition: uio_mrf.c:64
unsigned int irqmode
Definition: mrf.h:142
module_init(mrf_init_module)
#define PCI_DEVICE_ID_PLX_9056
Definition: uio_mrf.c:51
#define INTCSR9056_LCL_Enable
Definition: plx9056.h:25
#define PCI_DEVICE_ID_PLX_9030
Definition: uio_mrf.c:50
#define INTCSR_INT1_Enable
Definition: plx9030.h:28
#define INTCSR_PCI_Enable
Definition: plx9030.h:34
MODULE_VERSION(DRV_VERSION)
unsigned int usemie
Definition: mrf.h:144
#define INTCSR9056_PCI_Enable
Definition: plx9056.h:24
struct uio_info uio
Definition: mrf.h:139
#define PCI_DEVICE_ID_MRF_CPCI_EVG_300
Definition: uio_mrf.c:70