diff options
author | Jan Beulich <jbeulich@suse.com> | 2013-06-17 10:30:57 +0200 |
---|---|---|
committer | Jan Beulich <jbeulich@suse.com> | 2013-06-17 10:30:57 +0200 |
commit | 7a89f62dddee14808a865b88c7bbe2b6da8701e0 (patch) | |
tree | 2faa6e9a7c6b298c569d8cda461b54aa6651ae95 /xen/drivers/passthrough | |
parent | b03165b4edf7fe2a441844e11bd2cba0653281f9 (diff) | |
download | xen-7a89f62dddee14808a865b88c7bbe2b6da8701e0.tar.gz xen-7a89f62dddee14808a865b88c7bbe2b6da8701e0.tar.bz2 xen-7a89f62dddee14808a865b88c7bbe2b6da8701e0.zip |
AMD IOMMU: make interrupt work again
Commit 899110e3 ("AMD IOMMU: include IOMMU interrupt information in 'M'
debug key output") made the AMD IOMMU MSI setup code use more of the
generic MSI setup code (as other than for VT-d this is an ordinary MSI-
capable PCI device), but failed to notice that till now interrupt setup
there _required_ the subsequent affinity setup to be done, as that was
the only point where the MSI message would get written. The generic MSI
affinity setting routine, however, does only an incremental change,
i.e. relies on this setup to have been done before.
In order to not make the code even more clumsy, introduce a new low
level helper routine __setup_msi_irq(), thus eliminating the need for
the AMD IOMMU code to directly fiddle with the IRQ descriptor.
Reported-by: Suravee Suthikulanit <suravee.suthikulpanit@amd.com>
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Tested-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
Acked-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
Diffstat (limited to 'xen/drivers/passthrough')
-rw-r--r-- | xen/drivers/passthrough/amd/iommu_init.c | 13 |
1 files changed, 6 insertions, 7 deletions
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; |