iommu/amd: Add command-line option to enable different page table
authorVasant Hegde <vasant.hegde@amd.com>
Thu, 25 Aug 2022 06:39:39 +0000 (06:39 +0000)
committerJoerg Roedel <jroedel@suse.de>
Wed, 7 Sep 2022 14:12:37 +0000 (16:12 +0200)
Enhance amd_iommu command line option to specify v1 or v2 page table.
By default system will boot in V1 page table mode.

Co-developed-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
Signed-off-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
Signed-off-by: Vasant Hegde <vasant.hegde@amd.com>
Link: https://lore.kernel.org/r/20220825063939.8360-10-vasant.hegde@amd.com
Signed-off-by: Joerg Roedel <jroedel@suse.de>
Documentation/admin-guide/kernel-parameters.txt
drivers/iommu/amd/init.c

index 426fa892d311a308e38131edf21de630db0654aa..f45c8fc2056c204de3de62452c7d784e8fab3d00 100644 (file)
                        force_enable - Force enable the IOMMU on platforms known
                                       to be buggy with IOMMU enabled. Use this
                                       option with care.
+                       pgtbl_v1     - Use v1 page table for DMA-API (Default).
+                       pgtbl_v2     - Use v2 page table for DMA-API.
 
        amd_iommu_dump= [HW,X86-64]
                        Enable AMD IOMMU driver option to dump the ACPI table
index 779d4f9b17f81c0b2653d250b62a1bb385ea980e..688cf8387b0bd0bd9616cca4bf5269ed85850f32 100644 (file)
@@ -3379,17 +3379,30 @@ static int __init parse_amd_iommu_intr(char *str)
 
 static int __init parse_amd_iommu_options(char *str)
 {
-       for (; *str; ++str) {
+       if (!str)
+               return -EINVAL;
+
+       while (*str) {
                if (strncmp(str, "fullflush", 9) == 0) {
                        pr_warn("amd_iommu=fullflush deprecated; use iommu.strict=1 instead\n");
                        iommu_set_dma_strict();
-               }
-               if (strncmp(str, "force_enable", 12) == 0)
+               } else if (strncmp(str, "force_enable", 12) == 0) {
                        amd_iommu_force_enable = true;
-               if (strncmp(str, "off", 3) == 0)
+               } else if (strncmp(str, "off", 3) == 0) {
                        amd_iommu_disabled = true;
-               if (strncmp(str, "force_isolation", 15) == 0)
+               } else if (strncmp(str, "force_isolation", 15) == 0) {
                        amd_iommu_force_isolation = true;
+               } else if (strncmp(str, "pgtbl_v1", 8) == 0) {
+                       amd_iommu_pgtable = AMD_IOMMU_V1;
+               } else if (strncmp(str, "pgtbl_v2", 8) == 0) {
+                       amd_iommu_pgtable = AMD_IOMMU_V2;
+               } else {
+                       pr_notice("Unknown option - '%s'\n", str);
+               }
+
+               str += strcspn(str, ",");
+               while (*str == ',')
+                       str++;
        }
 
        return 1;