Commit e96763ec authored by Robin Murphy's avatar Robin Murphy Committed by Joerg Roedel

iommu: Merge strictness and domain type configs

To parallel the sysfs behaviour, merge the new build-time option
for DMA domain strictness into the default domain type choice.
Suggested-by: default avatarJoerg Roedel <joro@8bytes.org>
Reviewed-by: default avatarLu Baolu <baolu.lu@linux.intel.com>
Reviewed-by: default avatarJean-Philippe Brucker <jean-philippe@linaro.org>
Reviewed-by: default avatarJohn Garry <john.garry@huawei.com>
Signed-off-by: default avatarRobin Murphy <robin.murphy@arm.com>
Link: https://lore.kernel.org/r/d04af35b9c0f2a1d39605d7a9b451f5e1f0c7736.1628682049.git.robin.murphy@arm.comSigned-off-by: default avatarJoerg Roedel <jroedel@suse.de>
parent 7cf8a638
...@@ -2045,11 +2045,9 @@ ...@@ -2045,11 +2045,9 @@
1 - Strict mode. 1 - Strict mode.
DMA unmap operations invalidate IOMMU hardware TLBs DMA unmap operations invalidate IOMMU hardware TLBs
synchronously. synchronously.
unset - Use value of CONFIG_IOMMU_DEFAULT_{LAZY,STRICT}. unset - Use value of CONFIG_IOMMU_DEFAULT_DMA_{LAZY,STRICT}.
Note: on x86, the default behaviour depends on the Note: on x86, strict mode specified via one of the
equivalent driver-specific parameters, but a strict legacy driver-specific options takes precedence.
mode explicitly specified by either method takes
precedence.
iommu.passthrough= iommu.passthrough=
[ARM64, X86] Configure DMA to bypass the IOMMU by default. [ARM64, X86] Configure DMA to bypass the IOMMU by default.
......
...@@ -79,55 +79,55 @@ config IOMMU_DEBUGFS ...@@ -79,55 +79,55 @@ config IOMMU_DEBUGFS
debug/iommu directory, and then populate a subdirectory with debug/iommu directory, and then populate a subdirectory with
entries as required. entries as required.
config IOMMU_DEFAULT_PASSTHROUGH choice
bool "IOMMU passthrough by default" prompt "IOMMU default domain type"
depends on IOMMU_API depends on IOMMU_API
default IOMMU_DEFAULT_DMA_LAZY if AMD_IOMMU || INTEL_IOMMU
default IOMMU_DEFAULT_DMA_STRICT
help help
Enable passthrough by default, removing the need to pass in Choose the type of IOMMU domain used to manage DMA API usage by
iommu.passthrough=on or iommu=pt through command line. If this device drivers. The options here typically represent different
is enabled, you can still disable with iommu.passthrough=off levels of tradeoff between robustness/security and performance,
or iommu=nopt depending on the architecture. depending on the IOMMU driver. Not all IOMMUs support all options.
This choice can be overridden at boot via the command line, and for
some devices also at runtime via sysfs.
If unsure, say N here. If unsure, keep the default.
choice config IOMMU_DEFAULT_DMA_STRICT
prompt "IOMMU default DMA IOTLB invalidation mode" bool "Translated - Strict"
depends on IOMMU_DMA help
Trusted devices use translation to restrict their access to only
DMA-mapped pages, with strict TLB invalidation on unmap. Equivalent
to passing "iommu.passthrough=0 iommu.strict=1" on the command line.
default IOMMU_DEFAULT_LAZY if (AMD_IOMMU || INTEL_IOMMU) Untrusted devices always use this mode, with an additional layer of
default IOMMU_DEFAULT_STRICT bounce-buffering such that they cannot gain access to any unrelated
data within a mapped page.
config IOMMU_DEFAULT_DMA_LAZY
bool "Translated - Lazy"
help help
This option allows an IOMMU DMA IOTLB invalidation mode to be Trusted devices use translation to restrict their access to only
chosen at build time, to override the default mode of each ARCH, DMA-mapped pages, but with "lazy" batched TLB invalidation. This
removing the need to pass in kernel parameters through command line. mode allows higher performance with some IOMMUs due to reduced TLB
It is still possible to provide common boot params to override this flushing, but at the cost of reduced isolation since devices may be
config. able to access memory for some time after it has been unmapped.
Equivalent to passing "iommu.passthrough=0 iommu.strict=0" on the
command line.
If unsure, keep the default. If this mode is not supported by the IOMMU driver, the effective
runtime default will fall back to IOMMU_DEFAULT_DMA_STRICT.
config IOMMU_DEFAULT_PASSTHROUGH
bool "Passthrough"
help
Trusted devices are identity-mapped, giving them unrestricted access
to memory with minimal performance overhead. Equivalent to passing
"iommu.passthrough=1" (historically "iommu=pt") on the command line.
config IOMMU_DEFAULT_STRICT If this mode is not supported by the IOMMU driver, the effective
bool "strict" runtime default will fall back to IOMMU_DEFAULT_DMA_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.
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.
The isolation provided in this mode is not as secure as STRICT mode,
such that a vulnerable time window may be created between the DMA
unmap and the mappings cached in the IOMMU IOTLB or device TLB
finally being invalidated, where the device could still access the
memory which has already been unmapped by the device driver.
However this mode may provide better performance in high throughput
scenarios, and is still considerably more secure than passthrough
mode or no IOMMU.
endchoice endchoice
......
...@@ -31,7 +31,7 @@ static struct kset *iommu_group_kset; ...@@ -31,7 +31,7 @@ static struct kset *iommu_group_kset;
static DEFINE_IDA(iommu_group_ida); static DEFINE_IDA(iommu_group_ida);
static unsigned int iommu_def_domain_type __read_mostly; static unsigned int iommu_def_domain_type __read_mostly;
static bool iommu_dma_strict __read_mostly = IS_ENABLED(CONFIG_IOMMU_DEFAULT_STRICT); static bool iommu_dma_strict __read_mostly = IS_ENABLED(CONFIG_IOMMU_DEFAULT_DMA_STRICT);
static u32 iommu_cmd_line __read_mostly; static u32 iommu_cmd_line __read_mostly;
struct iommu_group { struct iommu_group {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment