|
@@ -649,29 +649,9 @@ static void __init init_iommu_from_acpi(struct amd_iommu *iommu,
|
|
|
struct ivhd_entry *e;
|
|
|
|
|
|
/*
|
|
|
- * First set the recommended feature enable bits from ACPI
|
|
|
- * into the IOMMU control registers
|
|
|
+ * First save the recommended feature enable bits from ACPI
|
|
|
*/
|
|
|
- h->flags & IVHD_FLAG_HT_TUN_EN_MASK ?
|
|
|
- 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);
|
|
|
+ iommu->acpi_flags = h->flags;
|
|
|
|
|
|
/*
|
|
|
* 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
|
|
|
* they have been initialized
|
|
@@ -1126,6 +1130,7 @@ static void enable_iommus(void)
|
|
|
|
|
|
for_each_iommu(iommu) {
|
|
|
iommu_disable(iommu);
|
|
|
+ iommu_init_flags(iommu);
|
|
|
iommu_set_device_table(iommu);
|
|
|
iommu_enable_command_buffer(iommu);
|
|
|
iommu_enable_event_buffer(iommu);
|