iommu: dmar: Provide arch specific irq allocation
authorThomas Gleixner <tglx@linutronix.de>
Wed, 7 May 2014 15:44:11 +0000 (15:44 +0000)
committerThomas Gleixner <tglx@linutronix.de>
Fri, 16 May 2014 12:05:19 +0000 (14:05 +0200)
ia64 and x86 share this driver. x86 is moving to a different irq
allocation and ia64 keeps its private irq_create/destroy stuff.

Use macros to redirect to one or the other. Yes, macros to avoid
include hell.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Grant Likely <grant.likely@linaro.org>
Cc: Tony Luck <tony.luck@intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Fenghua Yu <fenghua.yu@intel.com>
Acked-by: Joerg Roedel <joro@8bytes.org>
Cc: x86@kernel.org
Cc: linux-ia64@vger.kernel.org
Cc: iommu@lists.linux-foundation.org
Link: http://lkml.kernel.org/r/20140507154336.372289825@linutronix.de
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
arch/ia64/include/asm/irq_remapping.h
arch/x86/include/asm/irq_remapping.h
drivers/iommu/dmar.c

index a8687b1d8906912ab458b9640db72c8655115a3f..e3b3556e2e1bb8d32b67a1b63e4de3e2708af0b8 100644 (file)
@@ -1,4 +1,6 @@
 #ifndef __IA64_INTR_REMAPPING_H
 #define __IA64_INTR_REMAPPING_H
 #define irq_remapping_enabled 0
+#define dmar_alloc_hwirq       create_irq
+#define dmar_free_hwirq                destroy_irq
 #endif
index d806b228d2c0d606942409c4d3fac8eed5dc1265..b7747c4c2cf2ff0e73e2e0896fe550825b827eba 100644 (file)
@@ -103,4 +103,7 @@ static inline bool setup_remapped_irq(int irq,
 }
 #endif /* CONFIG_IRQ_REMAP */
 
+#define dmar_alloc_hwirq()     irq_alloc_hwirq(-1)
+#define dmar_free_hwirq                irq_free_hwirq
+
 #endif /* __X86_IRQ_REMAPPING_H */
index 3ce1f62a091fa2eabd45fed56fd40856ae22a7b9..9a4f05e5b23fa480e308d0b44373e6599ad82982 100644 (file)
@@ -994,7 +994,7 @@ static void free_iommu(struct intel_iommu *iommu)
        if (iommu->irq) {
                free_irq(iommu->irq, iommu);
                irq_set_handler_data(iommu->irq, NULL);
-               destroy_irq(iommu->irq);
+               dmar_free_hwirq(iommu->irq);
        }
 
        if (iommu->qi) {
@@ -1550,7 +1550,7 @@ int dmar_set_interrupt(struct intel_iommu *iommu)
        if (iommu->irq)
                return 0;
 
-       irq = create_irq();
+       irq = dmar_alloc_hwirq();
        if (irq <= 0) {
                pr_err("IOMMU: no free vectors\n");
                return -EINVAL;
@@ -1563,7 +1563,7 @@ int dmar_set_interrupt(struct intel_iommu *iommu)
        if (ret) {
                irq_set_handler_data(irq, NULL);
                iommu->irq = 0;
-               destroy_irq(irq);
+               dmar_free_hwirq(irq);
                return ret;
        }