diff options
author | Joerg Roedel <joerg.roedel@amd.com> | 2012-03-30 20:47:04 +0200 |
---|---|---|
committer | Joerg Roedel <joerg.roedel@amd.com> | 2012-05-07 14:34:59 +0200 |
commit | 9d619f65722236e0e0c35467d1528caed206e439 (patch) | |
tree | 6d0a77b7835fc056810a05be5a217e96d9153ff7 | |
parent | iommu/vt-d: Convert IR set_affinity function to remap_ops (diff) | |
download | linux-9d619f65722236e0e0c35467d1528caed206e439.tar.xz linux-9d619f65722236e0e0c35467d1528caed206e439.zip |
iommu/vt-d: Convert free_irte into a remap_ops callback
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>
-rw-r--r-- | arch/x86/include/asm/intr_remapping.h | 2 | ||||
-rw-r--r-- | arch/x86/kernel/apic/io_apic.c | 2 | ||||
-rw-r--r-- | drivers/iommu/intel_intr_remapping.c | 3 | ||||
-rw-r--r-- | drivers/iommu/intr_remapping.c | 8 | ||||
-rw-r--r-- | drivers/iommu/intr_remapping.h | 3 | ||||
-rw-r--r-- | include/linux/dmar.h | 5 |
6 files changed, 16 insertions, 7 deletions
diff --git a/arch/x86/include/asm/intr_remapping.h b/arch/x86/include/asm/intr_remapping.h index ae933ecfd8f0..a195b7d6995c 100644 --- a/arch/x86/include/asm/intr_remapping.h +++ b/arch/x86/include/asm/intr_remapping.h @@ -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 */ diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index a97c79aa25cf..5690469555fb 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c @@ -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); diff --git a/drivers/iommu/intel_intr_remapping.c b/drivers/iommu/intel_intr_remapping.c index 25372c1f3c8c..44a6e04a070b 100644 --- a/drivers/iommu/intel_intr_remapping.c +++ b/drivers/iommu/intel_intr_remapping.c @@ -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, }; diff --git a/drivers/iommu/intr_remapping.c b/drivers/iommu/intr_remapping.c index 2f4f27ffb861..a68d304f9729 100644 --- a/drivers/iommu/intr_remapping.c +++ b/drivers/iommu/intr_remapping.c @@ -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); +} diff --git a/drivers/iommu/intr_remapping.h b/drivers/iommu/intr_remapping.h index e0bc6e0ba1fb..57485539383d 100644 --- a/drivers/iommu/intr_remapping.h +++ b/drivers/iommu/intr_remapping.h @@ -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; diff --git a/include/linux/dmar.h b/include/linux/dmar.h index f2bd87f52a8d..7a207a39f879 100644 --- a/include/linux/dmar.h +++ b/include/linux/dmar.h @@ -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; |