First, add build option IOMMU_DEFAULT_{LAZY|STRICT}, so that we have the
opportunity to set {lazy|strict} mode as default at build time. Then put
the three config options in an choice, make people can only choose one of
the three at a time.

Signed-off-by: Zhen Lei <thunder.leiz...@huawei.com>
---
 drivers/iommu/Kconfig | 44 ++++++++++++++++++++++++++++++++++++--------
 drivers/iommu/iommu.c |  3 ++-
 2 files changed, 38 insertions(+), 9 deletions(-)

diff --git a/drivers/iommu/Kconfig b/drivers/iommu/Kconfig
index 83664db5221df02..fe715fb295c6ed2 100644
--- a/drivers/iommu/Kconfig
+++ b/drivers/iommu/Kconfig
@@ -75,16 +75,44 @@ config IOMMU_DEBUGFS
          debug/iommu directory, and then populate a subdirectory with
          entries as required.
 
-config IOMMU_DEFAULT_PASSTHROUGH
-       bool "IOMMU passthrough by default"
+choice
+       prompt "IOMMU default DMA mode"
        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.
+       default IOMMU_DEFAULT_STRICT
+       help
+         This option allows an IOMMU DMA mode to be chosen at build time, to
+         override the default DMA mode of each ARCH, removing the need to
+         pass in kernel parameters through command line. You can still use
+         ARCH specific boot options to override this option again.
 
-         If unsure, say N here.
+         If unsure, keep the default.
+
+config IOMMU_DEFAULT_PASSTHROUGH
+       bool "passthrough"
+       help
+         In this mode, the DMA access through IOMMU without any addresses
+         translation. That means, the wrong or illegal DMA access can not
+         be caught, no error information will be reported.
+
+config IOMMU_DEFAULT_LAZY
+       bool "lazy"
+       help
+         Support lazy mode, where for every IOMMU DMA unmap operation, the
+         flush operation of IOTLB and the free operation of IOVA are deferred.
+         They are only guaranteed to be done before the related IOVA will be
+         reused.
+
+config IOMMU_DEFAULT_STRICT
+       bool "strict"
+       help
+         For every IOMMU DMA unmap operation, the flush operation of IOTLB and
+         the free operation of IOVA are guaranteed to be done in the unmap
+         function.
+
+         This mode is safer than the two above, but it maybe slower in some
+         high performace scenarios.
+
+endchoice
 
 config OF_IOMMU
        def_bool y
diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
index f9cacce909d3ae9..05171dd0bd03aee 100644
--- a/drivers/iommu/iommu.c
+++ b/drivers/iommu/iommu.c
@@ -31,7 +31,8 @@
 #else
 static unsigned int iommu_def_domain_type = IOMMU_DOMAIN_DMA;
 #endif
-static bool iommu_dma_strict __read_mostly = true;
+static bool iommu_dma_strict __read_mostly =
+                       IS_ENABLED(CONFIG_IOMMU_DEFAULT_STRICT);
 
 struct iommu_group {
        struct kobject kobj;
-- 
1.8.3


_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

Reply via email to