Commit 7c919779 authored by Jiang Liu's avatar Jiang Liu Committed by Joerg Roedel

iommu/vt-d, trivial: simplify code with existing macros

Simplify vt-d related code with existing macros and introduce a new
macro for_each_active_drhd_unit() to enumerate all active DRHD unit.
Signed-off-by: default avatarJiang Liu <jiang.liu@linux.intel.com>
Signed-off-by: default avatarJoerg Roedel <joro@8bytes.org>
parent 2fe2c602
...@@ -1305,15 +1305,14 @@ int dmar_set_interrupt(struct intel_iommu *iommu) ...@@ -1305,15 +1305,14 @@ int dmar_set_interrupt(struct intel_iommu *iommu)
int __init enable_drhd_fault_handling(void) int __init enable_drhd_fault_handling(void)
{ {
struct dmar_drhd_unit *drhd; struct dmar_drhd_unit *drhd;
struct intel_iommu *iommu;
/* /*
* Enable fault control interrupt. * Enable fault control interrupt.
*/ */
for_each_drhd_unit(drhd) { for_each_iommu(iommu, drhd) {
int ret;
struct intel_iommu *iommu = drhd->iommu;
u32 fault_status; u32 fault_status;
ret = dmar_set_interrupt(iommu); int ret = dmar_set_interrupt(iommu);
if (ret) { if (ret) {
pr_err("DRHD %Lx: failed to enable fault, interrupt, ret %d\n", pr_err("DRHD %Lx: failed to enable fault, interrupt, ret %d\n",
......
...@@ -628,9 +628,7 @@ static struct intel_iommu *device_to_iommu(int segment, u8 bus, u8 devfn) ...@@ -628,9 +628,7 @@ static struct intel_iommu *device_to_iommu(int segment, u8 bus, u8 devfn)
struct dmar_drhd_unit *drhd = NULL; struct dmar_drhd_unit *drhd = NULL;
int i; int i;
for_each_drhd_unit(drhd) { for_each_active_drhd_unit(drhd) {
if (drhd->ignored)
continue;
if (segment != drhd->segment) if (segment != drhd->segment)
continue; continue;
...@@ -2470,11 +2468,7 @@ static int __init init_dmars(void) ...@@ -2470,11 +2468,7 @@ static int __init init_dmars(void)
goto error; goto error;
} }
for_each_drhd_unit(drhd) { for_each_active_iommu(iommu, drhd) {
if (drhd->ignored)
continue;
iommu = drhd->iommu;
g_iommus[iommu->seq_id] = iommu; g_iommus[iommu->seq_id] = iommu;
ret = iommu_init_domains(iommu); ret = iommu_init_domains(iommu);
...@@ -2498,12 +2492,7 @@ static int __init init_dmars(void) ...@@ -2498,12 +2492,7 @@ static int __init init_dmars(void)
/* /*
* Start from the sane iommu hardware state. * Start from the sane iommu hardware state.
*/ */
for_each_drhd_unit(drhd) { for_each_active_iommu(iommu, drhd) {
if (drhd->ignored)
continue;
iommu = drhd->iommu;
/* /*
* If the queued invalidation is already initialized by us * If the queued invalidation is already initialized by us
* (for example, while enabling interrupt-remapping) then * (for example, while enabling interrupt-remapping) then
...@@ -2523,12 +2512,7 @@ static int __init init_dmars(void) ...@@ -2523,12 +2512,7 @@ static int __init init_dmars(void)
dmar_disable_qi(iommu); dmar_disable_qi(iommu);
} }
for_each_drhd_unit(drhd) { for_each_active_iommu(iommu, drhd) {
if (drhd->ignored)
continue;
iommu = drhd->iommu;
if (dmar_enable_qi(iommu)) { if (dmar_enable_qi(iommu)) {
/* /*
* Queued Invalidate not enabled, use Register Based * Queued Invalidate not enabled, use Register Based
...@@ -2611,17 +2595,16 @@ static int __init init_dmars(void) ...@@ -2611,17 +2595,16 @@ static int __init init_dmars(void)
* global invalidate iotlb * global invalidate iotlb
* enable translation * enable translation
*/ */
for_each_drhd_unit(drhd) { for_each_iommu(iommu, drhd) {
if (drhd->ignored) { if (drhd->ignored) {
/* /*
* we always have to disable PMRs or DMA may fail on * we always have to disable PMRs or DMA may fail on
* this device * this device
*/ */
if (force_on) if (force_on)
iommu_disable_protect_mem_regions(drhd->iommu); iommu_disable_protect_mem_regions(iommu);
continue; continue;
} }
iommu = drhd->iommu;
iommu_flush_write_buffer(iommu); iommu_flush_write_buffer(iommu);
...@@ -2643,12 +2626,8 @@ static int __init init_dmars(void) ...@@ -2643,12 +2626,8 @@ static int __init init_dmars(void)
return 0; return 0;
error: error:
for_each_drhd_unit(drhd) { for_each_active_iommu(iommu, drhd)
if (drhd->ignored)
continue;
iommu = drhd->iommu;
free_iommu(iommu); free_iommu(iommu);
}
kfree(g_iommus); kfree(g_iommus);
return ret; return ret;
} }
...@@ -3296,9 +3275,9 @@ static void __init init_no_remapping_devices(void) ...@@ -3296,9 +3275,9 @@ static void __init init_no_remapping_devices(void)
} }
} }
for_each_drhd_unit(drhd) { for_each_active_drhd_unit(drhd) {
int i; int i;
if (drhd->ignored || drhd->include_all) if (drhd->include_all)
continue; continue;
for (i = 0; i < drhd->devices_cnt; i++) for (i = 0; i < drhd->devices_cnt; i++)
...@@ -3647,6 +3626,7 @@ int __init intel_iommu_init(void) ...@@ -3647,6 +3626,7 @@ int __init intel_iommu_init(void)
{ {
int ret = 0; int ret = 0;
struct dmar_drhd_unit *drhd; struct dmar_drhd_unit *drhd;
struct intel_iommu *iommu;
/* VT-d is required for a TXT/tboot launch, so enforce that */ /* VT-d is required for a TXT/tboot launch, so enforce that */
force_on = tboot_force_iommu(); force_on = tboot_force_iommu();
...@@ -3660,16 +3640,9 @@ int __init intel_iommu_init(void) ...@@ -3660,16 +3640,9 @@ int __init intel_iommu_init(void)
/* /*
* Disable translation if already enabled prior to OS handover. * Disable translation if already enabled prior to OS handover.
*/ */
for_each_drhd_unit(drhd) { for_each_active_iommu(iommu, drhd)
struct intel_iommu *iommu;
if (drhd->ignored)
continue;
iommu = drhd->iommu;
if (iommu->gcmd & DMA_GCMD_TE) if (iommu->gcmd & DMA_GCMD_TE)
iommu_disable_translation(iommu); iommu_disable_translation(iommu);
}
if (dmar_dev_scope_init() < 0) { if (dmar_dev_scope_init() < 0) {
if (force_on) if (force_on)
...@@ -3912,11 +3885,7 @@ static void iommu_free_vm_domain(struct dmar_domain *domain) ...@@ -3912,11 +3885,7 @@ static void iommu_free_vm_domain(struct dmar_domain *domain)
unsigned long i; unsigned long i;
unsigned long ndomains; unsigned long ndomains;
for_each_drhd_unit(drhd) { for_each_active_iommu(iommu, drhd) {
if (drhd->ignored)
continue;
iommu = drhd->iommu;
ndomains = cap_ndoms(iommu->cap); ndomains = cap_ndoms(iommu->cap);
for_each_set_bit(i, iommu->domain_ids, ndomains) { for_each_set_bit(i, iommu->domain_ids, ndomains) {
if (iommu->domains[i] == domain) { if (iommu->domains[i] == domain) {
......
...@@ -520,6 +520,7 @@ static int __init dmar_x2apic_optout(void) ...@@ -520,6 +520,7 @@ static int __init dmar_x2apic_optout(void)
static int __init intel_irq_remapping_supported(void) static int __init intel_irq_remapping_supported(void)
{ {
struct dmar_drhd_unit *drhd; struct dmar_drhd_unit *drhd;
struct intel_iommu *iommu;
if (disable_irq_remap) if (disable_irq_remap)
return 0; return 0;
...@@ -538,12 +539,9 @@ static int __init intel_irq_remapping_supported(void) ...@@ -538,12 +539,9 @@ static int __init intel_irq_remapping_supported(void)
if (!dmar_ir_support()) if (!dmar_ir_support())
return 0; return 0;
for_each_drhd_unit(drhd) { for_each_iommu(iommu, drhd)
struct intel_iommu *iommu = drhd->iommu;
if (!ecap_ir_support(iommu->ecap)) if (!ecap_ir_support(iommu->ecap))
return 0; return 0;
}
return 1; return 1;
} }
...@@ -551,6 +549,7 @@ static int __init intel_irq_remapping_supported(void) ...@@ -551,6 +549,7 @@ static int __init intel_irq_remapping_supported(void)
static int __init intel_enable_irq_remapping(void) static int __init intel_enable_irq_remapping(void)
{ {
struct dmar_drhd_unit *drhd; struct dmar_drhd_unit *drhd;
struct intel_iommu *iommu;
bool x2apic_present; bool x2apic_present;
int setup = 0; int setup = 0;
int eim = 0; int eim = 0;
...@@ -573,9 +572,7 @@ static int __init intel_enable_irq_remapping(void) ...@@ -573,9 +572,7 @@ static int __init intel_enable_irq_remapping(void)
"Use 'intremap=no_x2apic_optout' to override BIOS request.\n"); "Use 'intremap=no_x2apic_optout' to override BIOS request.\n");
} }
for_each_drhd_unit(drhd) { for_each_iommu(iommu, drhd) {
struct intel_iommu *iommu = drhd->iommu;
/* /*
* If the queued invalidation is already initialized, * If the queued invalidation is already initialized,
* shouldn't disable it. * shouldn't disable it.
...@@ -600,9 +597,7 @@ static int __init intel_enable_irq_remapping(void) ...@@ -600,9 +597,7 @@ static int __init intel_enable_irq_remapping(void)
/* /*
* check for the Interrupt-remapping support * check for the Interrupt-remapping support
*/ */
for_each_drhd_unit(drhd) { for_each_iommu(iommu, drhd) {
struct intel_iommu *iommu = drhd->iommu;
if (!ecap_ir_support(iommu->ecap)) if (!ecap_ir_support(iommu->ecap))
continue; continue;
...@@ -616,10 +611,8 @@ static int __init intel_enable_irq_remapping(void) ...@@ -616,10 +611,8 @@ static int __init intel_enable_irq_remapping(void)
/* /*
* Enable queued invalidation for all the DRHD's. * Enable queued invalidation for all the DRHD's.
*/ */
for_each_drhd_unit(drhd) { for_each_iommu(iommu, drhd) {
int ret; int ret = dmar_enable_qi(iommu);
struct intel_iommu *iommu = drhd->iommu;
ret = dmar_enable_qi(iommu);
if (ret) { if (ret) {
printk(KERN_ERR "DRHD %Lx: failed to enable queued, " printk(KERN_ERR "DRHD %Lx: failed to enable queued, "
...@@ -632,9 +625,7 @@ static int __init intel_enable_irq_remapping(void) ...@@ -632,9 +625,7 @@ static int __init intel_enable_irq_remapping(void)
/* /*
* Setup Interrupt-remapping for all the DRHD's now. * Setup Interrupt-remapping for all the DRHD's now.
*/ */
for_each_drhd_unit(drhd) { for_each_iommu(iommu, drhd) {
struct intel_iommu *iommu = drhd->iommu;
if (!ecap_ir_support(iommu->ecap)) if (!ecap_ir_support(iommu->ecap))
continue; continue;
...@@ -778,19 +769,17 @@ static int ir_parse_ioapic_hpet_scope(struct acpi_dmar_header *header, ...@@ -778,19 +769,17 @@ static int ir_parse_ioapic_hpet_scope(struct acpi_dmar_header *header,
static int __init parse_ioapics_under_ir(void) static int __init parse_ioapics_under_ir(void)
{ {
struct dmar_drhd_unit *drhd; struct dmar_drhd_unit *drhd;
struct intel_iommu *iommu;
int ir_supported = 0; int ir_supported = 0;
int ioapic_idx; int ioapic_idx;
for_each_drhd_unit(drhd) { for_each_iommu(iommu, drhd)
struct intel_iommu *iommu = drhd->iommu;
if (ecap_ir_support(iommu->ecap)) { if (ecap_ir_support(iommu->ecap)) {
if (ir_parse_ioapic_hpet_scope(drhd->hdr, iommu)) if (ir_parse_ioapic_hpet_scope(drhd->hdr, iommu))
return -1; return -1;
ir_supported = 1; ir_supported = 1;
} }
}
if (!ir_supported) if (!ir_supported)
return 0; return 0;
......
...@@ -53,6 +53,10 @@ extern struct list_head dmar_drhd_units; ...@@ -53,6 +53,10 @@ extern struct list_head dmar_drhd_units;
#define for_each_drhd_unit(drhd) \ #define for_each_drhd_unit(drhd) \
list_for_each_entry(drhd, &dmar_drhd_units, list) list_for_each_entry(drhd, &dmar_drhd_units, list)
#define for_each_active_drhd_unit(drhd) \
list_for_each_entry(drhd, &dmar_drhd_units, list) \
if (drhd->ignored) {} else
#define for_each_active_iommu(i, drhd) \ #define for_each_active_iommu(i, drhd) \
list_for_each_entry(drhd, &dmar_drhd_units, list) \ list_for_each_entry(drhd, &dmar_drhd_units, list) \
if (i=drhd->iommu, drhd->ignored) {} else if (i=drhd->iommu, drhd->ignored) {} else
......
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