diff options
-rw-r--r-- | xen/arch/x86/msi.c | 11 | ||||
-rw-r--r-- | xen/drivers/passthrough/amd/iommu_init.c | 13 | ||||
-rw-r--r-- | xen/include/asm-x86/msi.h | 3 |
3 files changed, 18 insertions, 9 deletions
diff --git a/xen/arch/x86/msi.c b/xen/arch/x86/msi.c index a2ceea0001..d5192c2159 100644 --- a/xen/arch/x86/msi.c +++ b/xen/arch/x86/msi.c @@ -472,11 +472,18 @@ static struct msi_desc* alloc_msi_entry(void) int setup_msi_irq(struct irq_desc *desc, struct msi_desc *msidesc) { + return __setup_msi_irq(desc, msidesc, + msi_maskable_irq(msidesc) ? &pci_msi_maskable + : &pci_msi_nonmaskable); +} + +int __setup_msi_irq(struct irq_desc *desc, struct msi_desc *msidesc, + hw_irq_controller *handler) +{ struct msi_msg msg; desc->msi_desc = msidesc; - desc->handler = msi_maskable_irq(msidesc) ? &pci_msi_maskable - : &pci_msi_nonmaskable; + desc->handler = handler; msi_compose_msg(desc, &msg); return write_msi_msg(msidesc, &msg); } diff --git a/xen/drivers/passthrough/amd/iommu_init.c b/xen/drivers/passthrough/amd/iommu_init.c index a939c7312b..b2b92baba1 100644 --- a/xen/drivers/passthrough/amd/iommu_init.c +++ b/xen/drivers/passthrough/amd/iommu_init.c @@ -748,7 +748,7 @@ static void iommu_interrupt_handler(int irq, void *dev_id, static bool_t __init set_iommu_interrupt_handler(struct amd_iommu *iommu) { int irq, ret; - struct irq_desc *desc; + hw_irq_controller *handler; unsigned long flags; u16 control; @@ -759,7 +759,6 @@ static bool_t __init set_iommu_interrupt_handler(struct amd_iommu *iommu) return 0; } - desc = irq_to_desc(irq); spin_lock_irqsave(&pcidevs_lock, flags); iommu->msi.dev = pci_get_pdev(iommu->seg, PCI_BUS(iommu->bdf), PCI_DEVFN2(iommu->bdf)); @@ -771,7 +770,6 @@ static bool_t __init set_iommu_interrupt_handler(struct amd_iommu *iommu) PCI_SLOT(iommu->bdf), PCI_FUNC(iommu->bdf)); return 0; } - desc->msi_desc = &iommu->msi; control = pci_conf_read16(iommu->seg, PCI_BUS(iommu->bdf), PCI_SLOT(iommu->bdf), PCI_FUNC(iommu->bdf), iommu->msi.msi_attrib.pos + PCI_MSI_FLAGS); @@ -781,14 +779,15 @@ static bool_t __init set_iommu_interrupt_handler(struct amd_iommu *iommu) iommu->msi.msi_attrib.maskbit = 1; iommu->msi.msi.mpos = msi_mask_bits_reg(iommu->msi.msi_attrib.pos, is_64bit_address(control)); - desc->handler = &iommu_maskable_msi_type; + handler = &iommu_maskable_msi_type; } else - desc->handler = &iommu_msi_type; - ret = request_irq(irq, iommu_interrupt_handler, 0, "amd_iommu", iommu); + handler = &iommu_msi_type; + ret = __setup_msi_irq(irq_to_desc(irq), &iommu->msi, handler); + if ( !ret ) + ret = request_irq(irq, iommu_interrupt_handler, 0, "amd_iommu", iommu); if ( ret ) { - desc->handler = &no_irq_type; destroy_irq(irq); AMD_IOMMU_DEBUG("can't request irq\n"); return 0; diff --git a/xen/include/asm-x86/msi.h b/xen/include/asm-x86/msi.h index e2a3579e81..394ef0ef42 100644 --- a/xen/include/asm-x86/msi.h +++ b/xen/include/asm-x86/msi.h @@ -72,6 +72,7 @@ struct msi_msg { }; struct irq_desc; +struct hw_interrupt_type; struct msi_desc; /* Helper functions */ extern int pci_enable_msi(struct msi_info *msi, struct msi_desc **desc); @@ -79,6 +80,8 @@ extern void pci_disable_msi(struct msi_desc *desc); extern int pci_prepare_msix(u16 seg, u8 bus, u8 devfn, bool_t off); extern void pci_cleanup_msi(struct pci_dev *pdev); extern int setup_msi_irq(struct irq_desc *, struct msi_desc *); +extern int __setup_msi_irq(struct irq_desc *, struct msi_desc *, + const struct hw_interrupt_type *); extern void teardown_msi_irq(int irq); extern int msi_free_vector(struct msi_desc *entry); extern int pci_restore_msi_state(struct pci_dev *pdev); |