iommu/vt-d: Convert free_irte into a remap_ops callback
authorJoerg Roedel <joerg.roedel@amd.com>
Fri, 30 Mar 2012 18:47:04 +0000 (11:47 -0700)
committerJoerg Roedel <joerg.roedel@amd.com>
Mon, 7 May 2012 12:34:59 +0000 (14:34 +0200)
The operation for releasing a remapping entry is iommu
specific too.

Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
Acked-by: Yinghai Lu <yinghai@kernel.org>
Cc: David Woodhouse <dwmw2@infradead.org>
Cc: Alex Williamson <alex.williamson@redhat.com>
Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com>
Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
arch/x86/include/asm/intr_remapping.h
arch/x86/kernel/apic/io_apic.c
drivers/iommu/intel_intr_remapping.c
drivers/iommu/intr_remapping.c
drivers/iommu/intr_remapping.h
include/linux/dmar.h

index ae933ec..a195b7d 100644 (file)
@@ -43,6 +43,7 @@ extern int intr_setup_ioapic_entry(int irq,
 extern int intr_set_affinity(struct irq_data *data,
                             const struct cpumask *mask,
                             bool force);
+extern void intr_free_irq(int irq);
 
 #else  /* CONFIG_IRQ_REMAP */
 
@@ -68,6 +69,7 @@ static inline int intr_set_affinity(struct irq_data *data,
 {
        return 0;
 }
+static inline void intr_free_irq(int irq) { }
 #endif /* CONFIG_IRQ_REMAP */
 
 #endif /* __X86_INTR_REMAPPING_H */
index a97c79a..5690469 100644 (file)
@@ -3041,7 +3041,7 @@ void destroy_irq(unsigned int irq)
        irq_set_status_flags(irq, IRQ_NOREQUEST|IRQ_NOPROBE);
 
        if (irq_remapped(cfg))
-               free_irte(irq);
+               intr_free_irq(irq);
        raw_spin_lock_irqsave(&vector_lock, flags);
        __clear_irq_vector(irq, cfg);
        raw_spin_unlock_irqrestore(&vector_lock, flags);
index 25372c1..44a6e04 100644 (file)
@@ -253,7 +253,7 @@ static int clear_entries(struct irq_2_iommu *irq_iommu)
        return qi_flush_iec(iommu, index, irq_iommu->irte_mask);
 }
 
-int free_irte(int irq)
+static int free_irte(int irq)
 {
        struct irq_2_iommu *irq_iommu = irq_2_iommu(irq);
        unsigned long flags;
@@ -964,4 +964,5 @@ struct irq_remap_ops intel_irq_remap_ops = {
        .enable_faulting        = enable_drhd_fault_handling,
        .setup_ioapic_entry     = intel_setup_ioapic_entry,
        .set_affinity           = intel_ioapic_set_affinity,
+       .free_irq               = free_irte,
 };
index 2f4f27f..a68d304 100644 (file)
@@ -119,3 +119,11 @@ int intr_set_affinity(struct irq_data *data, const struct cpumask *mask,
 
        return remap_ops->set_affinity(data, mask, force);
 }
+
+void intr_free_irq(int irq)
+{
+       if (!remap_ops || !remap_ops->free_irq)
+               return;
+
+       remap_ops->free_irq(irq);
+}
index e0bc6e0..5748553 100644 (file)
@@ -60,6 +60,9 @@ struct irq_remap_ops {
        /* Set the CPU affinity of a remapped interrupt */
        int (*set_affinity)(struct irq_data *data, const struct cpumask *mask,
                            bool force);
+
+       /* Free an IRQ */
+       int (*free_irq)(int);
 };
 
 extern struct irq_remap_ops intel_irq_remap_ops;
index f2bd87f..7a207a3 100644 (file)
@@ -121,7 +121,6 @@ extern int alloc_irte(struct intel_iommu *iommu, int irq, u16 count);
 extern int set_irte_irq(int irq, struct intel_iommu *iommu, u16 index,
                        u16 sub_handle);
 extern int map_irq_to_irte_handle(int irq, u16 *sub_handle);
-extern int free_irte(int irq);
 
 extern struct intel_iommu *map_dev_to_ir(struct pci_dev *dev);
 extern struct intel_iommu *map_ioapic_to_ir(int apic);
@@ -138,10 +137,6 @@ static inline int modify_irte(int irq, struct irte *irte_modified)
 {
        return -1;
 }
-static inline int free_irte(int irq)
-{
-       return -1;
-}
 static inline int map_irq_to_irte_handle(int irq, u16 *sub_handle)
 {
        return -1;