From: Joerg Roedel <jroe...@suse.de> IRQ remapping is only supported when all IOMMUs in the system support it. So check if all IOMMUs in the system support IRQ remapping before doing the allocations.
[Jiang] 1) Rebased onto v3.19. 2) Remove redundant check of ecap_ir_support(iommu->ecap) in function intel_enable_irq_remapping(). Signed-off-by: Joerg Roedel <jroe...@suse.de> Signed-off-by: Jiang Liu <jiang....@linux.intel.com> --- drivers/iommu/intel_irq_remapping.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/drivers/iommu/intel_irq_remapping.c b/drivers/iommu/intel_irq_remapping.c index 8ccc7aa7e43a..137663bd5da2 100644 --- a/drivers/iommu/intel_irq_remapping.c +++ b/drivers/iommu/intel_irq_remapping.c @@ -619,10 +619,16 @@ static int __init intel_prepare_irq_remapping(void) goto error; } + /* First make sure all IOMMUs support IRQ remapping */ for_each_iommu(iommu, drhd) - if (!ecap_ir_support(iommu->ecap) || - intel_setup_irq_remapping(iommu)) + if (!ecap_ir_support(iommu->ecap)) + goto error; + + /* Do the allocations early */ + for_each_iommu(iommu, drhd) + if (intel_setup_irq_remapping(iommu)) goto error; + return 0; error: @@ -673,16 +679,12 @@ static int __init intel_enable_irq_remapping(void) /* * check for the Interrupt-remapping support */ - for_each_iommu(iommu, drhd) { - if (!ecap_ir_support(iommu->ecap)) - continue; - + for_each_iommu(iommu, drhd) if (eim && !ecap_eim_support(iommu->ecap)) { printk(KERN_INFO "DRHD %Lx: EIM not supported by DRHD, " " ecap %Lx\n", drhd->reg_base_addr, iommu->ecap); goto error; } - } /* * Enable queued invalidation for all the DRHD's. @@ -702,9 +704,6 @@ static int __init intel_enable_irq_remapping(void) * Setup Interrupt-remapping for all the DRHD's now. */ for_each_iommu(iommu, drhd) { - if (!ecap_ir_support(iommu->ecap)) - continue; - iommu_set_irq_remapping(iommu, eim); setup = 1; } -- 1.7.10.4 _______________________________________________ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu