diff options
Diffstat (limited to 'arch/sparc64/kernel/pci.c')
-rw-r--r-- | arch/sparc64/kernel/pci.c | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/arch/sparc64/kernel/pci.c b/arch/sparc64/kernel/pci.c index dfc41cd4bb5d..6b740eb6fe7e 100644 --- a/arch/sparc64/kernel/pci.c +++ b/arch/sparc64/kernel/pci.c | |||
@@ -13,6 +13,8 @@ | |||
13 | #include <linux/capability.h> | 13 | #include <linux/capability.h> |
14 | #include <linux/errno.h> | 14 | #include <linux/errno.h> |
15 | #include <linux/smp_lock.h> | 15 | #include <linux/smp_lock.h> |
16 | #include <linux/msi.h> | ||
17 | #include <linux/irq.h> | ||
16 | #include <linux/init.h> | 18 | #include <linux/init.h> |
17 | 19 | ||
18 | #include <asm/uaccess.h> | 20 | #include <asm/uaccess.h> |
@@ -646,4 +648,37 @@ int pci_domain_nr(struct pci_bus *pbus) | |||
646 | } | 648 | } |
647 | EXPORT_SYMBOL(pci_domain_nr); | 649 | EXPORT_SYMBOL(pci_domain_nr); |
648 | 650 | ||
651 | #ifdef CONFIG_PCI_MSI | ||
652 | int arch_setup_msi_irq(struct pci_dev *pdev, struct msi_desc *desc) | ||
653 | { | ||
654 | struct pcidev_cookie *pcp = pdev->sysdata; | ||
655 | struct pci_pbm_info *pbm = pcp->pbm; | ||
656 | struct pci_controller_info *p = pbm->parent; | ||
657 | int virt_irq, err; | ||
658 | |||
659 | if (!pbm->msi_num || !p->setup_msi_irq) | ||
660 | return -EINVAL; | ||
661 | |||
662 | err = p->setup_msi_irq(&virt_irq, pdev, desc); | ||
663 | if (err < 0) | ||
664 | return err; | ||
665 | |||
666 | return virt_irq; | ||
667 | } | ||
668 | |||
669 | void arch_teardown_msi_irq(unsigned int virt_irq) | ||
670 | { | ||
671 | struct msi_desc *entry = get_irq_data(virt_irq); | ||
672 | struct pci_dev *pdev = entry->dev; | ||
673 | struct pcidev_cookie *pcp = pdev->sysdata; | ||
674 | struct pci_pbm_info *pbm = pcp->pbm; | ||
675 | struct pci_controller_info *p = pbm->parent; | ||
676 | |||
677 | if (!pbm->msi_num || !p->setup_msi_irq) | ||
678 | return; | ||
679 | |||
680 | return p->teardown_msi_irq(virt_irq, pdev); | ||
681 | } | ||
682 | #endif /* !(CONFIG_PCI_MSI) */ | ||
683 | |||
649 | #endif /* !(CONFIG_PCI) */ | 684 | #endif /* !(CONFIG_PCI) */ |