iommu: Make the iommu boot parameters more generic and flexible
authorKeir Fraser <keir.fraser@citrix.com>
Wed, 6 Aug 2008 14:18:17 +0000 (15:18 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Wed, 6 Aug 2008 14:18:17 +0000 (15:18 +0100)
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>
xen/drivers/passthrough/iommu.c

index a522b80221282d3c4249950340477a9060bf49bf..9cc39919d6148a4442b791ee91498d7041aa1e4e 100644 (file)
 
 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)
 {