]> git.dujemihanovic.xyz Git - linux.git/commitdiff
iommu/amd: Do not enable SNP when V2 page table is enabled
authorVasant Hegde <vasant.hegde@amd.com>
Wed, 10 Apr 2024 08:57:02 +0000 (08:57 +0000)
committerJoerg Roedel <jroedel@suse.de>
Fri, 12 Apr 2024 10:03:22 +0000 (12:03 +0200)
DTE[Mode]=0 is not supported when SNP is enabled in the host. That means
to support SNP, IOMMU must be configured with V1 page table (See IOMMU
spec [1] for the details). If user passes kernel command line to configure
IOMMU domains with v2 page table (amd_iommu=pgtbl_v2) then disable SNP
as the user asked by not forcing the page table to v1.

[1] https://www.amd.com/content/dam/amd/en/documents/processor-tech-docs/specifications/48882_IOMMU.pdf

Cc: Ashish Kalra <ashish.kalra@amd.com>
Cc: Michael Roth <michael.roth@amd.com>
Cc: Tom Lendacky <thomas.lendacky@amd.com>
Signed-off-by: Vasant Hegde <vasant.hegde@amd.com>
Reviewed-by: Tom Lendacky <thomas.lendacky@amd.com>
Link: https://lore.kernel.org/r/20240410085702.31869-1-vasant.hegde@amd.com
Signed-off-by: Joerg Roedel <jroedel@suse.de>
drivers/iommu/amd/init.c

index 33228c1c8980f32a5e8af323587601a4783b5b7f..a714eb08c08b5aa389525fa7d750486cbda4064d 100644 (file)
@@ -3232,28 +3232,29 @@ static void iommu_snp_enable(void)
                return;
        /*
         * The SNP support requires that IOMMU must be enabled, and is
-        * not configured in the passthrough mode.
+        * configured with V1 page table (DTE[Mode] = 0 is not supported).
         */
        if (no_iommu || iommu_default_passthrough()) {
                pr_err("SNP: IOMMU disabled or configured in passthrough mode, SNP cannot be supported.\n");
-               cc_platform_clear(CC_ATTR_HOST_SEV_SNP);
-               return;
+               goto disable_snp;
+       }
+
+       if (amd_iommu_pgtable != AMD_IOMMU_V1) {
+               pr_warn("SNP: IOMMU is configured with V2 page table mode, SNP cannot be supported.\n");
+               goto disable_snp;
        }
 
        amd_iommu_snp_en = check_feature(FEATURE_SNP);
        if (!amd_iommu_snp_en) {
                pr_err("SNP: IOMMU SNP feature not enabled, SNP cannot be supported.\n");
-               cc_platform_clear(CC_ATTR_HOST_SEV_SNP);
-               return;
+               goto disable_snp;
        }
 
        pr_info("IOMMU SNP support enabled.\n");
+       return;
 
-       /* Enforce IOMMU v1 pagetable when SNP is enabled. */
-       if (amd_iommu_pgtable != AMD_IOMMU_V1) {
-               pr_warn("Forcing use of AMD IOMMU v1 page table due to SNP.\n");
-               amd_iommu_pgtable = AMD_IOMMU_V1;
-       }
+disable_snp:
+       cc_platform_clear(CC_ATTR_HOST_SEV_SNP);
 #endif
 }