Skip to content

Commit

Permalink
iommu/vt-d: Set IRTA in intel_setup_irq_remapping
Browse files Browse the repository at this point in the history
This way we can give the hardware the new IR table right
after it has been allocated and initialized.

Tested-by: ZhenHua Li <zhen-hual@hp.com>
Tested-by: Baoquan He <bhe@redhat.com>
Signed-off-by: Joerg Roedel <jroedel@suse.de>
  • Loading branch information
Joerg Roedel committed Jun 16, 2015
1 parent c676f58 commit d4d1c0f
Showing 1 changed file with 14 additions and 5 deletions.
19 changes: 14 additions & 5 deletions drivers/iommu/intel_irq_remapping.c
Original file line number Diff line number Diff line change
Expand Up @@ -428,9 +428,9 @@ static int set_msi_sid(struct irte *irte, struct pci_dev *dev)

static void iommu_set_irq_remapping(struct intel_iommu *iommu, int mode)
{
unsigned long flags;
u64 addr;
u32 sts;
unsigned long flags;

addr = virt_to_phys((void *)iommu->ir_table->base);

Expand All @@ -447,10 +447,16 @@ static void iommu_set_irq_remapping(struct intel_iommu *iommu, int mode)
raw_spin_unlock_irqrestore(&iommu->register_lock, flags);

/*
* global invalidation of interrupt entry cache before enabling
* interrupt-remapping.
* Global invalidation of interrupt entry cache to make sure the
* hardware uses the new irq remapping table.
*/
qi_global_iec(iommu);
}

static void iommu_enable_irq_remapping(struct intel_iommu *iommu)
{
unsigned long flags;
u32 sts;

raw_spin_lock_irqsave(&iommu->register_lock, flags);

Expand Down Expand Up @@ -525,6 +531,8 @@ static int intel_setup_irq_remapping(struct intel_iommu *iommu)
}
}

iommu_set_irq_remapping(iommu, eim_mode);

return 0;

out_free_bitmap:
Expand Down Expand Up @@ -689,7 +697,7 @@ static int __init intel_enable_irq_remapping(void)
* Setup Interrupt-remapping for all the DRHD's now.
*/
for_each_iommu(iommu, drhd) {
iommu_set_irq_remapping(iommu, eim_mode);
iommu_enable_irq_remapping(iommu);
setup = true;
}

Expand Down Expand Up @@ -926,6 +934,7 @@ static int reenable_irq_remapping(int eim)

/* Set up interrupt remapping for iommu.*/
iommu_set_irq_remapping(iommu, eim);
iommu_enable_irq_remapping(iommu);
setup = true;
}

Expand Down Expand Up @@ -1241,7 +1250,7 @@ static int dmar_ir_add(struct dmar_drhd_unit *dmaru, struct intel_iommu *iommu)
intel_teardown_irq_remapping(iommu);
ir_remove_ioapic_hpet_scope(iommu);
} else {
iommu_set_irq_remapping(iommu, eim);
iommu_enable_irq_remapping(iommu);
}

return ret;
Expand Down

0 comments on commit d4d1c0f

Please sign in to comment.