iommu/amd: Enable Guest Translation after reading IOMMU feature register
authorVasant Hegde <vasant.hegde@amd.com>
Mon, 6 May 2024 08:20:39 +0000 (08:20 +0000)
committerJoerg Roedel <jroedel@suse.de>
Mon, 6 May 2024 08:24:18 +0000 (10:24 +0200)
Commit 8e0179733172 ("iommu/amd: Enable Guest Translation before
registering devices") moved IOMMU Guest Translation (GT) enablement to
early init path. It does feature check based on Global EFR value (got from
ACPI IVRS table). Later it adjusts EFR value based on IOMMU feature
register (late_iommu_features_init()).

It seems in some systems BIOS doesn't set gloabl EFR value properly.
This is causing mismatch. Hence move IOMMU GT enablement after
late_iommu_features_init() so that it does check based on IOMMU EFR
value.

Fixes: 8e0179733172 ("iommu/amd: Enable Guest Translation before registering devices")
Reported-by: Klara Modin <klarasmodin@gmail.com>
Closes: https://lore.kernel.org/linux-iommu/333e6eb6-361c-4afb-8107-2573324bf689@gmail.com/
Signed-off-by: Vasant Hegde <vasant.hegde@amd.com>
Tested-by: Klara Modin <klarasmodin@gmail.com>
Link: https://lore.kernel.org/r/20240506082039.7575-1-vasant.hegde@amd.com
Signed-off-by: Joerg Roedel <jroedel@suse.de>
drivers/iommu/amd/init.c

index fd3e76e43699233cded76be816810f09cb9b28bf..b292181995b7d62467f5773785b1e77f1f9ad068 100644 (file)
@@ -2046,6 +2046,8 @@ static int __init iommu_init_pci(struct amd_iommu *iommu)
                        amd_iommu_max_glx_val = glxval;
                else
                        amd_iommu_max_glx_val = min(amd_iommu_max_glx_val, glxval);
+
+               iommu_enable_gt(iommu);
        }
 
        if (check_feature(FEATURE_PPR) && amd_iommu_alloc_ppr_log(iommu))
@@ -2732,7 +2734,6 @@ static void early_enable_iommu(struct amd_iommu *iommu)
        iommu_enable_command_buffer(iommu);
        iommu_enable_event_buffer(iommu);
        iommu_set_exclusion_range(iommu);
-       iommu_enable_gt(iommu);
        iommu_enable_ga(iommu);
        iommu_enable_xt(iommu);
        iommu_enable_irtcachedis(iommu);
@@ -2789,7 +2790,6 @@ static void early_enable_iommus(void)
                        iommu_disable_irtcachedis(iommu);
                        iommu_enable_command_buffer(iommu);
                        iommu_enable_event_buffer(iommu);
-                       iommu_enable_gt(iommu);
                        iommu_enable_ga(iommu);
                        iommu_enable_xt(iommu);
                        iommu_enable_irtcachedis(iommu);