Commit 9d619f65 authored by Joerg Roedel's avatar Joerg Roedel

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: default avatarJoerg Roedel <joerg.roedel@amd.com>
Acked-by: default avatarYinghai Lu <yinghai@kernel.org>
Cc: David Woodhouse <dwmw2@infradead.org>
Cc: Alex Williamson <alex.williamson@redhat.com>
Signed-off-by: default avatarSuresh Siddha <suresh.b.siddha@intel.com>
Signed-off-by: default avatarJoerg Roedel <joerg.roedel@amd.com>
parent 4c1bad6a
...@@ -43,6 +43,7 @@ extern int intr_setup_ioapic_entry(int irq, ...@@ -43,6 +43,7 @@ extern int intr_setup_ioapic_entry(int irq,
extern int intr_set_affinity(struct irq_data *data, extern int intr_set_affinity(struct irq_data *data,
const struct cpumask *mask, const struct cpumask *mask,
bool force); bool force);
extern void intr_free_irq(int irq);
#else /* CONFIG_IRQ_REMAP */ #else /* CONFIG_IRQ_REMAP */
...@@ -68,6 +69,7 @@ static inline int intr_set_affinity(struct irq_data *data, ...@@ -68,6 +69,7 @@ static inline int intr_set_affinity(struct irq_data *data,
{ {
return 0; return 0;
} }
static inline void intr_free_irq(int irq) { }
#endif /* CONFIG_IRQ_REMAP */ #endif /* CONFIG_IRQ_REMAP */
#endif /* __X86_INTR_REMAPPING_H */ #endif /* __X86_INTR_REMAPPING_H */
...@@ -3041,7 +3041,7 @@ void destroy_irq(unsigned int irq) ...@@ -3041,7 +3041,7 @@ void destroy_irq(unsigned int irq)
irq_set_status_flags(irq, IRQ_NOREQUEST|IRQ_NOPROBE); irq_set_status_flags(irq, IRQ_NOREQUEST|IRQ_NOPROBE);
if (irq_remapped(cfg)) if (irq_remapped(cfg))
free_irte(irq); intr_free_irq(irq);
raw_spin_lock_irqsave(&vector_lock, flags); raw_spin_lock_irqsave(&vector_lock, flags);
__clear_irq_vector(irq, cfg); __clear_irq_vector(irq, cfg);
raw_spin_unlock_irqrestore(&vector_lock, flags); raw_spin_unlock_irqrestore(&vector_lock, flags);
......
...@@ -253,7 +253,7 @@ static int clear_entries(struct irq_2_iommu *irq_iommu) ...@@ -253,7 +253,7 @@ static int clear_entries(struct irq_2_iommu *irq_iommu)
return qi_flush_iec(iommu, index, irq_iommu->irte_mask); 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); struct irq_2_iommu *irq_iommu = irq_2_iommu(irq);
unsigned long flags; unsigned long flags;
...@@ -964,4 +964,5 @@ struct irq_remap_ops intel_irq_remap_ops = { ...@@ -964,4 +964,5 @@ struct irq_remap_ops intel_irq_remap_ops = {
.enable_faulting = enable_drhd_fault_handling, .enable_faulting = enable_drhd_fault_handling,
.setup_ioapic_entry = intel_setup_ioapic_entry, .setup_ioapic_entry = intel_setup_ioapic_entry,
.set_affinity = intel_ioapic_set_affinity, .set_affinity = intel_ioapic_set_affinity,
.free_irq = free_irte,
}; };
...@@ -119,3 +119,11 @@ int intr_set_affinity(struct irq_data *data, const struct cpumask *mask, ...@@ -119,3 +119,11 @@ int intr_set_affinity(struct irq_data *data, const struct cpumask *mask,
return remap_ops->set_affinity(data, mask, force); 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);
}
...@@ -60,6 +60,9 @@ struct irq_remap_ops { ...@@ -60,6 +60,9 @@ struct irq_remap_ops {
/* Set the CPU affinity of a remapped interrupt */ /* Set the CPU affinity of a remapped interrupt */
int (*set_affinity)(struct irq_data *data, const struct cpumask *mask, int (*set_affinity)(struct irq_data *data, const struct cpumask *mask,
bool force); bool force);
/* Free an IRQ */
int (*free_irq)(int);
}; };
extern struct irq_remap_ops intel_irq_remap_ops; extern struct irq_remap_ops intel_irq_remap_ops;
......
...@@ -121,7 +121,6 @@ extern int alloc_irte(struct intel_iommu *iommu, int irq, u16 count); ...@@ -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, extern int set_irte_irq(int irq, struct intel_iommu *iommu, u16 index,
u16 sub_handle); u16 sub_handle);
extern int map_irq_to_irte_handle(int irq, 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_dev_to_ir(struct pci_dev *dev);
extern struct intel_iommu *map_ioapic_to_ir(int apic); 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) ...@@ -138,10 +137,6 @@ static inline int modify_irte(int irq, struct irte *irte_modified)
{ {
return -1; return -1;
} }
static inline int free_irte(int irq)
{
return -1;
}
static inline int map_irq_to_irte_handle(int irq, u16 *sub_handle) static inline int map_irq_to_irte_handle(int irq, u16 *sub_handle)
{ {
return -1; return -1;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment