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: Jiang Liu <jiang.liu@linux.intel.com> Signed-off-by: Joerg Roedel <joro@8bytes.org>
This commit is contained in:
@@ -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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
/*
|
/*
|
||||||
* 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)
|
|||||||
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)
|
|||||||
* 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)
|
|||||||
|
|
||||||
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)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
/*
|
/*
|
||||||
* 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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
"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)
|
|||||||
/*
|
/*
|
||||||
* 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)
|
|||||||
/*
|
/*
|
||||||
* 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)
|
|||||||
/*
|
/*
|
||||||
* 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,
|
|||||||
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;
|
|||||||
#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
|
||||||
|
Reference in New Issue
Block a user