iommu: Add config option to set passthrough as default
authorOlof Johansson <olof@lixom.net>
Fri, 20 Jul 2018 18:02:23 +0000 (11:02 -0700)
committerJoerg Roedel <jroedel@suse.de>
Fri, 27 Jul 2018 07:36:50 +0000 (09:36 +0200)
This allows the default behavior to be controlled by a kernel config
option instead of changing the commandline for the kernel to include
"iommu.passthrough=on" or "iommu=pt" on machines where this is desired.

Likewise, for machines where this config option is enabled, it can be
disabled at boot time with "iommu.passthrough=off" or "iommu=nopt".

Also corrected iommu=pt documentation for IA-64, since it has no code that
parses iommu= at all.

Signed-off-by: Olof Johansson <olof@lixom.net>
Signed-off-by: Joerg Roedel <jroedel@suse.de>
Documentation/admin-guide/kernel-parameters.txt
arch/x86/kernel/pci-dma.c
drivers/iommu/Kconfig
drivers/iommu/iommu.c

index efc7aa7a067099f6bacdb860cde13f2d876030a8..d79c14d0b1f0bfac1c8e9bc37de068c2e4f619d7 100644 (file)
                merge
                nomerge
                soft
-               pt              [x86, IA-64]
+               pt              [x86]
+               nopt            [x86]
                nobypass        [PPC/POWERNV]
                        Disable IOMMU bypass, using IOMMU for PCI devices.
 
index ab5d9dd668d2fb2580e07881d43f4d4bb5dc3e6c..0acb135de7fb8e8de7876fb13990377374d3ceed 100644 (file)
@@ -40,8 +40,14 @@ int iommu_detected __read_mostly = 0;
  * devices and allow every device to access to whole physical memory. This is
  * useful if a user wants to use an IOMMU only for KVM device assignment to
  * guests and not for driver dma translation.
+ * It is also possible to disable by default in kernel config, and enable with
+ * iommu=nopt at boot time.
  */
+#ifdef CONFIG_IOMMU_DEFAULT_PASSTHROUGH
+int iommu_pass_through __read_mostly = 1;
+#else
 int iommu_pass_through __read_mostly;
+#endif
 
 extern struct iommu_table_entry __iommu_table[], __iommu_table_end[];
 
@@ -135,6 +141,8 @@ static __init int iommu_setup(char *p)
 #endif
                if (!strncmp(p, "pt", 2))
                        iommu_pass_through = 1;
+               if (!strncmp(p, "nopt", 4))
+                       iommu_pass_through = 0;
 
                gart_parse_options(p);
 
index 8d0a2886658fc7771a2fe28713d2083969d686c9..08c957759e74425209ba6729eb486a692fe8afee 100644 (file)
@@ -70,6 +70,17 @@ config IOMMU_DEBUGFS
          debug/iommu directory, and then populate a subdirectory with
          entries as required.
 
+config IOMMU_DEFAULT_PASSTHROUGH
+       bool "IOMMU passthrough by default"
+       depends on IOMMU_API
+        help
+         Enable passthrough by default, removing the need to pass in
+         iommu.passthrough=on or iommu=pt through command line. If this
+         is enabled, you can still disable with iommu.passthrough=off
+         or iommu=nopt depending on the architecture.
+
+         If unsure, say N here.
+
 config IOMMU_IOVA
        tristate
 
index 7f50013b0bcf8cc4f9f7439a11ed975b1ae19a80..f3698006cb5391bf8ef61bf84356af0f6628764c 100644 (file)
 
 static struct kset *iommu_group_kset;
 static DEFINE_IDA(iommu_group_ida);
+#ifdef CONFIG_IOMMU_DEFAULT_PASSTHROUGH
+static unsigned int iommu_def_domain_type = IOMMU_DOMAIN_IDENTITY;
+#else
 static unsigned int iommu_def_domain_type = IOMMU_DOMAIN_DMA;
+#endif
 
 struct iommu_callback_data {
        const struct iommu_ops *ops;