mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-04 16:15:11 +00:00
x86/amd-iommu: Set iommu configuration flags in enable-loop
This patch moves the setting of the configuration and feature flags out out the acpi table parsing path and moves it into the iommu-enable path. This is needed to reliably fix resume-from-s3. Cc: stable@kernel.org Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
This commit is contained in:
parent
49553c2ef8
commit
e9bf519711
2 changed files with 30 additions and 22 deletions
|
@ -368,6 +368,9 @@ struct amd_iommu {
|
||||||
/* capabilities of that IOMMU read from ACPI */
|
/* capabilities of that IOMMU read from ACPI */
|
||||||
u32 cap;
|
u32 cap;
|
||||||
|
|
||||||
|
/* flags read from acpi table */
|
||||||
|
u8 acpi_flags;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Capability pointer. There could be more than one IOMMU per PCI
|
* Capability pointer. There could be more than one IOMMU per PCI
|
||||||
* device function if there are more than one AMD IOMMU capability
|
* device function if there are more than one AMD IOMMU capability
|
||||||
|
|
|
@ -649,29 +649,9 @@ static void __init init_iommu_from_acpi(struct amd_iommu *iommu,
|
||||||
struct ivhd_entry *e;
|
struct ivhd_entry *e;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* First set the recommended feature enable bits from ACPI
|
* First save the recommended feature enable bits from ACPI
|
||||||
* into the IOMMU control registers
|
|
||||||
*/
|
*/
|
||||||
h->flags & IVHD_FLAG_HT_TUN_EN_MASK ?
|
iommu->acpi_flags = h->flags;
|
||||||
iommu_feature_enable(iommu, CONTROL_HT_TUN_EN) :
|
|
||||||
iommu_feature_disable(iommu, CONTROL_HT_TUN_EN);
|
|
||||||
|
|
||||||
h->flags & IVHD_FLAG_PASSPW_EN_MASK ?
|
|
||||||
iommu_feature_enable(iommu, CONTROL_PASSPW_EN) :
|
|
||||||
iommu_feature_disable(iommu, CONTROL_PASSPW_EN);
|
|
||||||
|
|
||||||
h->flags & IVHD_FLAG_RESPASSPW_EN_MASK ?
|
|
||||||
iommu_feature_enable(iommu, CONTROL_RESPASSPW_EN) :
|
|
||||||
iommu_feature_disable(iommu, CONTROL_RESPASSPW_EN);
|
|
||||||
|
|
||||||
h->flags & IVHD_FLAG_ISOC_EN_MASK ?
|
|
||||||
iommu_feature_enable(iommu, CONTROL_ISOC_EN) :
|
|
||||||
iommu_feature_disable(iommu, CONTROL_ISOC_EN);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* make IOMMU memory accesses cache coherent
|
|
||||||
*/
|
|
||||||
iommu_feature_enable(iommu, CONTROL_COHERENT_EN);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Done. Now parse the device entries
|
* Done. Now parse the device entries
|
||||||
|
@ -1116,6 +1096,30 @@ static void init_device_table(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void iommu_init_flags(struct amd_iommu *iommu)
|
||||||
|
{
|
||||||
|
iommu->acpi_flags & IVHD_FLAG_HT_TUN_EN_MASK ?
|
||||||
|
iommu_feature_enable(iommu, CONTROL_HT_TUN_EN) :
|
||||||
|
iommu_feature_disable(iommu, CONTROL_HT_TUN_EN);
|
||||||
|
|
||||||
|
iommu->acpi_flags & IVHD_FLAG_PASSPW_EN_MASK ?
|
||||||
|
iommu_feature_enable(iommu, CONTROL_PASSPW_EN) :
|
||||||
|
iommu_feature_disable(iommu, CONTROL_PASSPW_EN);
|
||||||
|
|
||||||
|
iommu->acpi_flags & IVHD_FLAG_RESPASSPW_EN_MASK ?
|
||||||
|
iommu_feature_enable(iommu, CONTROL_RESPASSPW_EN) :
|
||||||
|
iommu_feature_disable(iommu, CONTROL_RESPASSPW_EN);
|
||||||
|
|
||||||
|
iommu->acpi_flags & IVHD_FLAG_ISOC_EN_MASK ?
|
||||||
|
iommu_feature_enable(iommu, CONTROL_ISOC_EN) :
|
||||||
|
iommu_feature_disable(iommu, CONTROL_ISOC_EN);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* make IOMMU memory accesses cache coherent
|
||||||
|
*/
|
||||||
|
iommu_feature_enable(iommu, CONTROL_COHERENT_EN);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This function finally enables all IOMMUs found in the system after
|
* This function finally enables all IOMMUs found in the system after
|
||||||
* they have been initialized
|
* they have been initialized
|
||||||
|
@ -1126,6 +1130,7 @@ static void enable_iommus(void)
|
||||||
|
|
||||||
for_each_iommu(iommu) {
|
for_each_iommu(iommu) {
|
||||||
iommu_disable(iommu);
|
iommu_disable(iommu);
|
||||||
|
iommu_init_flags(iommu);
|
||||||
iommu_set_device_table(iommu);
|
iommu_set_device_table(iommu);
|
||||||
iommu_enable_command_buffer(iommu);
|
iommu_enable_command_buffer(iommu);
|
||||||
iommu_enable_event_buffer(iommu);
|
iommu_enable_event_buffer(iommu);
|
||||||
|
|
Loading…
Reference in a new issue