aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--xen/arch/x86/msi.c11
-rw-r--r--xen/drivers/passthrough/amd/iommu_init.c13
-rw-r--r--xen/include/asm-x86/msi.h3
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);