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>
This commit is contained in:
parent
4c1bad6a0a
commit
9d619f6572
6 changed files with 16 additions and 7 deletions
|
@ -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,
|
||||||
{
|
{
|
||||||
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)
|
||||||
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)
|
||||||
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 = {
|
||||||
.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,
|
||||||
|
|
||||||
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 {
|
||||||
/* 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);
|
||||||
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)
|
||||||
{
|
{
|
||||||
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;
|
||||||
|
|
Loading…
Add table
Reference in a new issue