aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2008-08-06 15:18:17 +0100
committerKeir Fraser <keir.fraser@citrix.com>2008-08-06 15:18:17 +0100
commit9220d5f180989076c4dd4d01f428da4ecf33b46e (patch)
treeb3a2ce423f3a5b4571ab8135ac9aa81473b978db
parentec80656941f426651cf3013ac1a8e5dfb043ad47 (diff)
downloadxen-9220d5f180989076c4dd4d01f428da4ecf33b46e.tar.gz
xen-9220d5f180989076c4dd4d01f428da4ecf33b46e.tar.bz2
xen-9220d5f180989076c4dd4d01f428da4ecf33b46e.zip
iommu: Make the iommu boot parameters more generic and flexible
Make the 'iommu' boot parameter take a comma separated value indicating whether iommu is required to boot and whether to enable iommu for pv domains. Signed-off-by: Espen Skoglund <espen.skoglund@netronome.com>
-rw-r--r--xen/drivers/passthrough/iommu.c40
1 files changed, 35 insertions, 5 deletions
diff --git a/xen/drivers/passthrough/iommu.c b/xen/drivers/passthrough/iommu.c
index a522b80221..9cc39919d6 100644
--- a/xen/drivers/passthrough/iommu.c
+++ b/xen/drivers/passthrough/iommu.c
@@ -20,18 +20,48 @@
extern struct iommu_ops intel_iommu_ops;
extern struct iommu_ops amd_iommu_ops;
+static void parse_iommu_param(char *s);
static int iommu_populate_page_table(struct domain *d);
int intel_vtd_setup(void);
int amd_iov_detect(void);
+/*
+ * The 'iommu' parameter enables the IOMMU. Optional comma separated
+ * value may contain:
+ *
+ * off|no|false|disable Disable IOMMU (default)
+ * pv Enable IOMMU for PV domains
+ * no-pv Disable IOMMU for PV domains (default)
+ * force|required Don't boot unless IOMMU is enabled
+ */
+custom_param("iommu", parse_iommu_param);
int iommu_enabled = 0;
-boolean_param("iommu", iommu_enabled);
-
int iommu_pv_enabled = 0;
-boolean_param("iommu_pv", iommu_pv_enabled);
-
int force_iommu = 0;
-boolean_param("force_iommu", force_iommu);
+
+static void __init parse_iommu_param(char *s)
+{
+ char *ss;
+ iommu_enabled = 1;
+
+ do {
+ ss = strchr(s, ',');
+ if ( ss )
+ *ss = '\0';
+
+ if ( !strcmp(s, "off") || !strcmp(s, "no") || !strcmp(s, "false") ||
+ !strcmp(s, "0") || !strcmp(s, "disable") )
+ iommu_enabled = 0;
+ else if ( !strcmp(s, "pv") )
+ iommu_pv_enabled = 1;
+ else if ( !strcmp(s, "no-pv") )
+ iommu_pv_enabled = 0;
+ else if ( !strcmp(s, "force") || !strcmp(s, "required") )
+ force_iommu = 1;
+
+ s = ss + 1;
+ } while ( ss );
+}
int iommu_domain_init(struct domain *domain)
{