11 #include <linux/proc_fs.h> 12 #include <linux/seq_file.h> 14 #define DRV_NAME "mrf-pci" 30 static int modparam_iversion = 2;
35 static unsigned modparam_usemsi = 1;
41 #define PCI_VENDOR_ID_MRF 0x1a3e 42 #define PCI_SUBVENDOR_ID_MRF 0x1a3e 44 #define PCI_VENDOR_ID_LATTICE 0x1204 46 #define PCI_DEVICE_ID_EC_30 0xEC30 48 #define PCI_DEVICE_ID_XILINX_DEV 0x7011 50 #define PCI_DEVICE_ID_PLX_9030 0x9030 51 #define PCI_DEVICE_ID_PLX_9056 0x9056 54 #define PCI_SUBDEVICE_ID_MRF_PMCEVR_230 0x11e6 56 #define PCI_SUBDEVICE_ID_MRF_PXIEVR_230 0x10e6 58 #define PCI_SUBDEVICE_ID_MRF_PXIEVG_220 0x20dc 60 #define PCI_SUBDEVICE_ID_MRF_PXIEVG_230 0x20E6 62 #define PCI_SUBDEVICE_ID_MRF_EVRTG_300 0x192c 64 #define PCI_SUBDEVICE_ID_PCIE_EVR_300 0x172c 67 #define PCI_DEVICE_ID_MRF_MTCA_EVM_300 0x232c 70 #define PCI_DEVICE_ID_MRF_CPCI_EVG_300 0x252c 72 #define PCI_DEVICE_ID_MRF_CPCI_EVR_300 0x152c 74 #define PCI_DEVICE_ID_MRF_EVRMTCA300 0x132c 80 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,28) 82 void __iomem *pci_ioremap_bar(
struct pci_dev* pdev,
int bar)
84 if(!(pci_resource_flags(pdev,bar) & IORESOURCE_MEM )){
88 return ioremap_nocache(pci_resource_start(pdev,bar),
89 pci_resource_len(pdev,bar));
93 #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,2,0) 115 int mrf_mmap_physical(
struct uio_info *info,
struct vm_area_struct *vma)
117 struct pci_dev *dev = info->priv;
118 int mi = vma->vm_pgoff;
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));
127 vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
129 return remap_pfn_range(vma,
131 info->mem[mi].addr >> PAGE_SHIFT,
132 vma->vm_end - vma->vm_start,
136 #define USE_CUSTOM_MMAP 140 int mrf_detect_endian(
struct mrf_priv *
priv,
void __iomem *evr)
142 struct pci_dev *dev = priv->
pdev;
144 high = (val & 0xff000000) >> 24,
145 low = val & 0x000000ff;
148 dev_err(&dev->dev,
"Can't detect endianness when high==low 0x%08lx\n",
151 }
else if(high==priv->
mrftype) {
154 }
else if(low==priv->
mrftype) {
158 dev_err(&dev->dev,
"no match for version 0x%08lx against %x\n",
159 (
unsigned long)val, priv->
mrftype);
171 mrf_handler_evr(
int irq,
struct uio_info *info)
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;
179 switch(dev->device) {
181 plxctrl = ioread32(plx +
LAS0BRD);
191 dev_err(&dev->dev,
"non-PLX ISR not supported in EVR mode");
207 status = ioread32be(base +
IRQFlag);
210 status = ioread32(base +
IRQFlag);
214 if (!(status & enable)) {
219 dev_info(&dev->dev,
"Interrupt when not enabled! 0x%08lx 0x%08lx\n",
220 (
unsigned long)enable, (
unsigned long)status);
225 iowrite32be(enable & ~IRQ_Enable, base +
IRQEnable);
227 iowrite32(enable & ~IRQ_Enable, base +
IRQEnable);
238 if(enable & IRQ_Enable) {
239 dev_info(&dev->dev,
"Interrupt not disabled!!!");
250 mrf_handler_plx(
int irq,
struct uio_info *info)
253 struct pci_dev *dev = info->priv;
254 void __iomem *plx = info->mem[0].internal_addr;
258 switch(dev->device) {
261 val = ioread32(plx+
INTCSR);
267 val = ioread32(plx+
INTCSR);
290 end = mrf_detect_endian(priv, plx);
294 flags= ioread32be(plx +
IRQFlag);
297 flags= ioread32(plx +
IRQFlag);
303 if((flags & val)==0) {
304 dev_dbg(&dev->dev,
"reject %08x %08x\n", (
unsigned)flags, (
unsigned)val);
307 dev_dbg(&dev->dev,
"accept %08x %08x\n", (
unsigned)flags, (
unsigned)val);
328 iowrite32be(0, plx +
PCIMIE);
330 oops = val = ioread32(plx +
PCIMIE);
337 dev_info(&dev->dev,
"Interrupt not disabled %08x", (
unsigned)val);
345 mrf_handler(
int irq,
struct uio_info *info)
354 return mrf_handler_plx(irq, info);
357 return mrf_handler_evr(irq, info);
362 int mrf_irqcontrol(
struct uio_info *info, s32 onoff)
364 struct pci_dev *dev = info->priv;
366 void __iomem *plx = info->mem[0].internal_addr;
371 }
else if (onoff > 1) {
375 switch (dev->device) {
383 iowrite32(val, plx +
INTCSR);
403 end = mrf_detect_endian(priv, plx);
441 iowrite32be(val, plx +
PCIMIE);
443 iowrite32(val, plx +
PCIMIE);
462 mrf_probe(
struct pci_dev *dev,
463 const struct pci_device_id *
id)
467 struct uio_info *info;
469 priv = kzalloc(
sizeof(
struct mrf_priv), GFP_KERNEL);
470 if (!priv) {
return -ENOMEM; }
473 priv->
mrftype =
id->driver_data;
475 ret = pci_enable_device(dev);
477 dev_err(&dev->dev,
"pci_enable_device failed with %d\n",ret);
481 dev_warn(&dev->dev,
"Device not configured with IRQ!\n");
486 if (pci_request_regions(dev,
DRV_NAME)) {
491 switch(dev->device) {
494 dev_info(&dev->dev,
"Attaching MRF device w/ 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;
504 info->mem[1].memtype = UIO_MEM_NONE;
505 info->mem[1].size = 1;
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;
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");
525 switch(dev->vendor) {
529 dev_info(&dev->dev,
"Attaching MRF device w/o PLX bridge (%08x)\n",
530 (
unsigned)dev->device);
533 dev_err(&dev->dev,
"Unsupported vendor ID\n");
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;
545 if(!info->mem[0].internal_addr || !info->mem[0].addr){
546 dev_err(&dev->dev,
"Failed to map BARS!\n");
553 switch(mrf_detect_endian(priv, info->mem[0].internal_addr))
556 mrfver = ioread32(info->mem[0].internal_addr +
FPGAVersion);
559 mrfver = ioread32be(info->mem[0].internal_addr +
FPGAVersion);
568 priv->
usemie = (mrfver&0xff)>=0xa;
571 priv->
usemie = (mrfver&0xff)>=0x8;
574 dev_err(&dev->dev,
"Unrecognized MRF device type 0x%08x\n", (
unsigned)mrfver);
578 if((mrfver&0xff00)==0x0200)
582 dev_warn(&dev->dev,
"Consider update to firmware >=8 (currently %u) to avoid " 583 "race condition in IRQ handling\n", (mrfver&0xff));
592 if(modparam_usemsi) {
593 int err = pci_enable_msi(dev);
595 dev_info(&dev->dev,
"Using MSI\n");
600 dev_dbg(&dev->dev,
"Error enabling MSI %d\n", err);
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;
613 info->version = DRV_VERSION;
616 pci_set_drvdata(dev, info);
618 ret = uio_register_device(&dev->dev, info);
623 #if defined(CONFIG_GENERIC_GPIO) || defined(CONFIG_PARPORT_NOT_PC) 624 spin_lock_init(&priv->lock);
628 void __iomem *plx = info->mem[0].internal_addr;
642 val = ioread32(plx +
GPIOC);
657 dev_info(&dev->dev,
"GPIOC %08x\n", val);
658 iowrite32(val, plx +
GPIOC);
660 #ifdef CONFIG_GENERIC_GPIO 661 mrf_gpio_setup(priv);
663 #ifdef CONFIG_PARPORT_NOT_PC 669 dev_info(&dev->dev,
"GPIO support not built, JTAG unavailable\n");
675 dev_info(&dev->dev,
"MRF Setup complete\n");
682 iounmap(info->mem[0].internal_addr);
683 iounmap(info->mem[2].internal_addr);
685 pci_disable_msi(dev);
688 pci_release_regions(dev);
690 pci_disable_device(dev);
696 static struct pci_device_id mrf_pci_ids[] = {
779 mrf_remove(
struct pci_dev *dev)
781 struct uio_info *info = pci_get_drvdata(dev);
784 #ifdef CONFIG_PARPORT_NOT_PC 785 mrf_pp_cleanup(priv);
787 #ifdef CONFIG_GENERIC_GPIO 788 mrf_gpio_cleanup(priv);
790 #if defined(CONFIG_GENERIC_GPIO) || defined(CONFIG_PARPORT_NOT_PC) 793 void __iomem *plx = info->mem[0].internal_addr;
794 u32 val = ioread32(plx +
GPIOC);
799 iowrite32(val, plx +
GPIOC);
803 uio_unregister_device(info);
804 pci_set_drvdata(dev, NULL);
805 iounmap(info->mem[0].internal_addr);
807 switch(dev->device) {
810 iounmap(info->mem[2].internal_addr);
814 pci_disable_msi(dev);
816 pci_release_regions(dev);
817 pci_disable_device(dev);
821 dev_info(&dev->dev,
"MRF Cleaned up\n");
831 mrf_error_detected(
struct pci_dev *dev, pci_channel_state_t state)
833 struct uio_info *info = pci_get_drvdata(dev);
836 if (state == pci_channel_io_normal) {
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);
844 pci_disable_msi(dev);
847 pci_disable_device(dev);
850 return PCI_ERS_RESULT_NEED_RESET;
851 }
else if (state == pci_channel_io_perm_failure) {
852 return PCI_ERS_RESULT_DISCONNECT;
855 return PCI_ERS_RESULT_NONE;
860 mrf_slot_reset(
struct pci_dev *dev)
863 struct uio_info *info = pci_get_drvdata(dev);
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;
872 int err = pci_enable_msi(dev);
874 dev_info(&dev->dev,
"Using MSI\n");
878 dev_dbg(&dev->dev,
"Error enabling MSI %d\n", err);
882 ret = uio_register_device(&dev->dev, info);
884 dev_err(&dev->dev,
"Failed to register UIO device %d\n", ret);
886 dev_warn(&dev->dev,
"Registered UIO device\n");
888 pci_restore_state(dev);
893 return PCI_ERS_RESULT_RECOVERED;
898 mrf_mmio_enabled(
struct pci_dev *dev) {
900 return PCI_ERS_RESULT_NONE;
905 mrf_error_resume(
struct pci_dev *dev) {
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
916 static struct pci_driver mrf_driver = {
918 .id_table = mrf_pci_ids,
920 .remove = mrf_remove,
921 .err_handler = &mrf_err_handler
924 static int mrf_init_module(
void)
926 return pci_register_driver(&mrf_driver);
930 static void mrf_exit_module(
void)
932 pci_unregister_driver(&mrf_driver);
#define PCI_DEVICE_ID_MRF_MTCA_EVM_300
#define PCI_DEVICE_ID_MRF_CPCI_EVR_300
#define INTCSR_INT1_Status
#define PCI_SUBVENDOR_ID_MRF
MODULE_DEVICE_TABLE(pci, mrf_pci_ids)
#define PCI_DEVICE_ID_MRF_EVRMTCA300
#define PCI_VENDOR_ID_LATTICE
#define PCI_VENDOR_ID_PLX
#define PCI_VENDOR_ID_XILINX
MODULE_AUTHOR("Michael Davidsaver <mdavidsaver@gmail.com>")
#define PCI_SUBDEVICE_ID_MRF_PMCEVR_230
#define PCI_DEVICE_ID_XILINX_DEV
#define PCI_VENDOR_ID_MRF
#define PCI_DEVICE_ID_EC_30
#define PCI_SUBDEVICE_ID_MRF_PXIEVR_230
module_param_named(interfaceversion, modparam_iversion, int, 0444)
#define PCI_SUBDEVICE_ID_MRF_PXIEVG_230
#define INTCSR9056_LCL_Status
#define INTCSR_INT1_Polarity
#define PCI_SUBDEVICE_ID_MRF_PXIEVG_220
#define PCI_SUBDEVICE_ID_MRF_EVRTG_300
MODULE_PARM_DESC(interfaceversion, "User space interface version")
module_exit(mrf_exit_module)
#define PCI_SUBDEVICE_ID_PCIE_EVR_300
module_init(mrf_init_module)
#define PCI_DEVICE_ID_PLX_9056
#define INTCSR9056_LCL_Enable
#define PCI_DEVICE_ID_PLX_9030
#define INTCSR_INT1_Enable
#define INTCSR_PCI_Enable
MODULE_VERSION(DRV_VERSION)
#define INTCSR9056_PCI_Enable
#define PCI_DEVICE_ID_MRF_CPCI_EVG_300