To disable vIOMMU feature, specify option "amd_iommu=viommu_disable".
Signed-off-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
---
drivers/iommu/amd/amd_iommu.h | 2 ++
drivers/iommu/amd/amd_iommu_types.h | 1 +
drivers/iommu/amd/init.c | 10 ++++++++++
3 files changed, 13 insertions(+)
@@ -46,6 +46,8 @@ void amd_iommu_debugfs_setup(struct amd_iommu *iommu);
static inline void amd_iommu_debugfs_setup(struct amd_iommu *iommu) {}
#endif
+extern bool amd_iommu_viommu;
+
/* Needed for interrupt remapping */
extern int amd_iommu_prepare(void);
extern int amd_iommu_enable(void);
@@ -96,6 +96,7 @@
#define FEATURE_GAM_VAPIC (1ULL<<21)
#define FEATURE_GIOSUP (1ULL<<48)
#define FEATURE_EPHSUP (1ULL<<50)
+#define FEATURE_VIOMMU (1ULL<<55)
#define FEATURE_SNP (1ULL<<63)
#define FEATURE_GATS_5LEVEL 1ULL
@@ -194,6 +194,9 @@ bool amdr_ivrs_remap_support __read_mostly;
bool amd_iommu_force_isolation __read_mostly;
+/* VIOMMU enabling flag */
+bool amd_iommu_viommu = true;
+
/*
* AMD IOMMU allows up to 2^16 different protection domains. This is a bitmap
* to know which ones are already in use.
@@ -2154,6 +2157,9 @@ static void print_iommu_info(void)
if (iommu->features & FEATURE_SNP)
pr_cont(" SNP");
+ if (iommu->features & FEATURE_VIOMMU)
+ pr_cont(" vIOMMU");
+
pr_cont("\n");
}
}
@@ -2166,6 +2172,8 @@ static void print_iommu_info(void)
pr_info("V2 page table enabled (Paging mode : %d level)\n",
amd_iommu_gpt_level);
}
+ if (amd_iommu_viommu)
+ pr_info("AMD-Vi: vIOMMU enabled\n");
}
static int __init amd_iommu_init_pci(void)
@@ -3402,6 +3410,8 @@ static int __init parse_amd_iommu_options(char *str)
amd_iommu_pgtable = AMD_IOMMU_V1;
} else if (strncmp(str, "pgtbl_v2", 8) == 0) {
amd_iommu_pgtable = AMD_IOMMU_V2;
+ } else if (strncmp(str, "viommu_disable", 14) == 0) {
+ amd_iommu_viommu = false;
} else {
pr_notice("Unknown option - '%s'\n", str);
}