| # SPDX-License-Identifier: GPL-2.0-only | |
| # The IOVA library may also be used by non-IOMMU_API users | |
| config IOMMU_IOVA | |
| tristate | |
| # IOMMU_API always gets selected by whoever wants it. | |
| config IOMMU_API | |
| bool | |
| config IOMMUFD_DRIVER | |
| bool | |
| default n | |
| menuconfig IOMMU_SUPPORT | |
| bool "IOMMU Hardware Support" | |
| depends on MMU | |
| default y | |
| help | |
| Say Y here if you want to compile device drivers for IO Memory | |
| Management Units into the kernel. These devices usually allow to | |
| remap DMA requests and/or remap interrupts from other devices on the | |
| system. | |
| if IOMMU_SUPPORT | |
| menu "Generic IOMMU Pagetable Support" | |
| # Selected by the actual pagetable implementations | |
| config IOMMU_IO_PGTABLE | |
| bool | |
| config IOMMU_IO_PGTABLE_LPAE | |
| bool "ARMv7/v8 Long Descriptor Format" | |
| select IOMMU_IO_PGTABLE | |
| depends on ARM || ARM64 || COMPILE_TEST | |
| depends on !GENERIC_ATOMIC64 # for cmpxchg64() | |
| help | |
| Enable support for the ARM long descriptor pagetable format. | |
| This allocator supports 4K/2M/1G, 16K/32M and 64K/512M page | |
| sizes at both stage-1 and stage-2, as well as address spaces | |
| up to 48-bits in size. | |
| config IOMMU_IO_PGTABLE_LPAE_KUNIT_TEST | |
| tristate "KUnit tests for LPAE" | |
| depends on IOMMU_IO_PGTABLE_LPAE && KUNIT | |
| default KUNIT_ALL_TESTS | |
| help | |
| Enable kunit tests for LPAE page table allocator. This performs | |
| a series of page-table consistency checks. | |
| If unsure, say N here. | |
| config IOMMU_IO_PGTABLE_ARMV7S | |
| bool "ARMv7/v8 Short Descriptor Format" | |
| select IOMMU_IO_PGTABLE | |
| depends on ARM || ARM64 || COMPILE_TEST | |
| help | |
| Enable support for the ARM Short-descriptor pagetable format. | |
| This supports 32-bit virtual and physical addresses mapped using | |
| 2-level tables with 4KB pages/1MB sections, and contiguous entries | |
| for 64KB pages/16MB supersections if indicated by the IOMMU driver. | |
| config IOMMU_IO_PGTABLE_ARMV7S_SELFTEST | |
| bool "ARMv7s selftests" | |
| depends on IOMMU_IO_PGTABLE_ARMV7S | |
| help | |
| Enable self-tests for ARMv7s page table allocator. This performs | |
| a series of page-table consistency checks during boot. | |
| If unsure, say N here. | |
| config IOMMU_IO_PGTABLE_DART | |
| bool "Apple DART Formats" | |
| select IOMMU_IO_PGTABLE | |
| depends on ARM64 || COMPILE_TEST | |
| depends on !GENERIC_ATOMIC64 # for cmpxchg64() | |
| help | |
| Enable support for the Apple DART pagetable formats. These include | |
| the t8020 and t6000/t8110 DART formats used in Apple M1/M2 family | |
| SoCs. | |
| If unsure, say N here. | |
| endmenu | |
| config IOMMU_DEBUGFS | |
| bool "Export IOMMU internals in DebugFS" | |
| depends on DEBUG_FS | |
| help | |
| Allows exposure of IOMMU device internals. This option enables | |
| the use of debugfs by IOMMU drivers as required. Devices can, | |
| at initialization time, cause the IOMMU code to create a top-level | |
| debug/iommu directory, and then populate a subdirectory with | |
| entries as required. | |
| choice | |
| prompt "IOMMU default domain type" | |
| depends on IOMMU_API | |
| default IOMMU_DEFAULT_DMA_LAZY if X86 || S390 | |
| default IOMMU_DEFAULT_DMA_STRICT | |
| help | |
| Choose the type of IOMMU domain used to manage DMA API usage by | |
| device drivers. The options here typically represent different | |
| levels of tradeoff between robustness/security and performance, | |
| 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, keep the default. | |
| config IOMMU_DEFAULT_DMA_STRICT | |
| bool "Translated - Strict" | |
| 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. | |
| Untrusted devices always use this mode, with an additional layer of | |
| 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 | |
| Trusted devices use translation to restrict their access to only | |
| DMA-mapped pages, but with "lazy" batched TLB invalidation. This | |
| mode allows higher performance with some IOMMUs due to reduced TLB | |
| flushing, but at the cost of reduced isolation since devices may be | |
| 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 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. | |
| If this mode is not supported by the IOMMU driver, the effective | |
| runtime default will fall back to IOMMU_DEFAULT_DMA_STRICT. | |
| endchoice | |
| config OF_IOMMU | |
| def_bool y | |
| depends on OF && IOMMU_API | |
| # IOMMU-agnostic DMA-mapping layer | |
| config IOMMU_DMA | |
| def_bool ARM64 || X86 || S390 | |
| select DMA_OPS_HELPERS | |
| select IOMMU_API | |
| select IOMMU_IOVA | |
| select NEED_SG_DMA_LENGTH | |
| select NEED_SG_DMA_FLAGS if SWIOTLB | |
| # Shared Virtual Addressing | |
| config IOMMU_SVA | |
| select IOMMU_MM_DATA | |
| bool | |
| config IOMMU_IOPF | |
| bool | |
| config FSL_PAMU | |
| bool "Freescale IOMMU support" | |
| depends on PCI | |
| depends on PHYS_64BIT | |
| depends on PPC_E500MC || (COMPILE_TEST && PPC) | |
| select IOMMU_API | |
| select GENERIC_ALLOCATOR | |
| help | |
| Freescale PAMU support. PAMU is the IOMMU present on Freescale QorIQ platforms. | |
| PAMU can authorize memory access, remap the memory address, and remap I/O | |
| transaction types. | |
| # MSM IOMMU support | |
| config MSM_IOMMU | |
| bool "MSM IOMMU Support" | |
| depends on ARM | |
| depends on ARCH_QCOM || COMPILE_TEST | |
| select IOMMU_API | |
| select IOMMU_IO_PGTABLE_ARMV7S | |
| help | |
| Support for the IOMMUs found on certain Qualcomm SOCs. | |
| These IOMMUs allow virtualization of the address space used by most | |
| cores within the multimedia subsystem. | |
| If unsure, say N here. | |
| source "drivers/iommu/amd/Kconfig" | |
| source "drivers/iommu/arm/Kconfig" | |
| source "drivers/iommu/intel/Kconfig" | |
| source "drivers/iommu/iommufd/Kconfig" | |
| source "drivers/iommu/riscv/Kconfig" | |
| config IRQ_REMAP | |
| bool "Support for Interrupt Remapping" | |
| depends on X86_64 && X86_IO_APIC && PCI_MSI && ACPI | |
| select IRQ_MSI_LIB | |
| help | |
| Supports Interrupt remapping for IO-APIC and MSI devices. | |
| To use x2apic mode in the CPU's which support x2APIC enhancements or | |
| to support platforms with CPU's having > 8 bit APIC ID, say Y. | |
| # OMAP IOMMU support | |
| config OMAP_IOMMU | |
| bool "OMAP IOMMU Support" | |
| depends on ARCH_OMAP2PLUS || COMPILE_TEST | |
| select IOMMU_API | |
| help | |
| The OMAP3 media platform drivers depend on iommu support, | |
| if you need them say Y here. | |
| config OMAP_IOMMU_DEBUG | |
| bool "Export OMAP IOMMU internals in DebugFS" | |
| depends on OMAP_IOMMU && DEBUG_FS | |
| help | |
| Select this to see extensive information about | |
| the internal state of OMAP IOMMU in debugfs. | |
| Say N unless you know you need this. | |
| config ROCKCHIP_IOMMU | |
| bool "Rockchip IOMMU Support" | |
| depends on ARCH_ROCKCHIP || COMPILE_TEST | |
| select IOMMU_API | |
| select ARM_DMA_USE_IOMMU | |
| help | |
| Support for IOMMUs found on Rockchip rk32xx SOCs. | |
| These IOMMUs allow virtualization of the address space used by most | |
| cores within the multimedia subsystem. | |
| Say Y here if you are using a Rockchip SoC that includes an IOMMU | |
| device. | |
| config SUN50I_IOMMU | |
| bool "Allwinner H6 IOMMU Support" | |
| depends on HAS_DMA | |
| depends on ARCH_SUNXI || COMPILE_TEST | |
| select ARM_DMA_USE_IOMMU | |
| select IOMMU_API | |
| help | |
| Support for the IOMMU introduced in the Allwinner H6 SoCs. | |
| config TEGRA_IOMMU_SMMU | |
| bool "NVIDIA Tegra SMMU Support" | |
| depends on ARCH_TEGRA || COMPILE_TEST | |
| depends on TEGRA_AHB | |
| depends on TEGRA_MC | |
| select IOMMU_API | |
| help | |
| This driver supports the IOMMU hardware (SMMU) found on NVIDIA Tegra | |
| SoCs (Tegra30 up to Tegra210). | |
| config EXYNOS_IOMMU | |
| bool "Exynos IOMMU Support" | |
| depends on ARCH_EXYNOS || COMPILE_TEST | |
| depends on !CPU_BIG_ENDIAN # revisit driver if we can enable big-endian ptes | |
| select IOMMU_API | |
| select ARM_DMA_USE_IOMMU | |
| help | |
| Support for the IOMMU (System MMU) of Samsung Exynos application | |
| processor family. This enables H/W multimedia accelerators to see | |
| non-linear physical memory chunks as linear memory in their | |
| address space. | |
| If unsure, say N here. | |
| config EXYNOS_IOMMU_DEBUG | |
| bool "Debugging log for Exynos IOMMU" | |
| depends on EXYNOS_IOMMU | |
| help | |
| Select this to see the detailed log message that shows what | |
| happens in the IOMMU driver. | |
| Say N unless you need kernel log message for IOMMU debugging. | |
| config IPMMU_VMSA | |
| bool "Renesas VMSA-compatible IPMMU" | |
| depends on ARCH_RENESAS || COMPILE_TEST | |
| depends on ARM || ARM64 || COMPILE_TEST | |
| depends on !GENERIC_ATOMIC64 # for IOMMU_IO_PGTABLE_LPAE | |
| select IOMMU_API | |
| select IOMMU_IO_PGTABLE_LPAE | |
| select ARM_DMA_USE_IOMMU | |
| help | |
| Support for the Renesas VMSA-compatible IPMMU found in the R-Mobile | |
| APE6, R-Car Gen{2,3} and RZ/G{1,2} SoCs. | |
| If unsure, say N. | |
| config SPAPR_TCE_IOMMU | |
| bool "sPAPR TCE IOMMU Support" | |
| depends on PPC_POWERNV || PPC_PSERIES | |
| select IOMMU_API | |
| help | |
| Enables bits of IOMMU API required by VFIO. The iommu_ops | |
| is not implemented as it is not necessary for VFIO. | |
| config APPLE_DART | |
| tristate "Apple DART IOMMU Support" | |
| depends on ARCH_APPLE || COMPILE_TEST | |
| depends on !GENERIC_ATOMIC64 # for IOMMU_IO_PGTABLE_DART | |
| select IOMMU_API | |
| select IOMMU_IO_PGTABLE_DART | |
| help | |
| Support for Apple DART (Device Address Resolution Table) IOMMUs | |
| found in Apple ARM SoCs like the M1. | |
| This IOMMU is required for most peripherals using DMA to access | |
| the main memory. | |
| Say Y here if you are using an Apple SoC. | |
| config S390_IOMMU | |
| def_bool y if S390 && PCI | |
| depends on S390 && PCI | |
| select IOMMU_API | |
| help | |
| Support for the IOMMU API for s390 PCI devices. | |
| config MTK_IOMMU | |
| tristate "MediaTek IOMMU Support" | |
| depends on ARCH_MEDIATEK || COMPILE_TEST | |
| select ARM_DMA_USE_IOMMU | |
| select IOMMU_API | |
| select IOMMU_IO_PGTABLE_ARMV7S | |
| select MEMORY | |
| select MTK_SMI | |
| help | |
| Support for the M4U on certain Mediatek SOCs. M4U is MultiMedia | |
| Memory Management Unit. This option enables remapping of DMA memory | |
| accesses for the multimedia subsystem. | |
| If unsure, say N here. | |
| config MTK_IOMMU_V1 | |
| tristate "MediaTek IOMMU Version 1 (M4U gen1) Support" | |
| depends on (ARCH_MEDIATEK && ARM) || COMPILE_TEST | |
| select ARM_DMA_USE_IOMMU | |
| select IOMMU_API | |
| select MEMORY | |
| select MTK_SMI | |
| help | |
| Support for the M4U on certain Mediatek SoCs. M4U generation 1 HW is | |
| Multimedia Memory Managememt Unit. This option enables remapping of | |
| DMA memory accesses for the multimedia subsystem. | |
| if unsure, say N here. | |
| config VIRTIO_IOMMU | |
| tristate "Virtio IOMMU driver" | |
| depends on VIRTIO | |
| depends on (ARM64 || X86) | |
| select IOMMU_API | |
| select INTERVAL_TREE | |
| select ACPI_VIOT if ACPI | |
| help | |
| Para-virtualised IOMMU driver with virtio. | |
| Say Y here if you intend to run this kernel as a guest. | |
| config SPRD_IOMMU | |
| tristate "Unisoc IOMMU Support" | |
| depends on ARCH_SPRD || COMPILE_TEST | |
| select IOMMU_API | |
| help | |
| Support for IOMMU on Unisoc's SoCs, this IOMMU can be used by | |
| Unisoc's multimedia devices, such as display, Image codec(jpeg) | |
| and a few signal processors, including VSP(video), GSP(graphic), | |
| ISP(image), and CPP(camera pixel processor), etc. | |
| Say Y here if you want to use the multimedia devices listed above. | |
| config VSI_IOMMU | |
| tristate "Verisilicon IOMMU Support" | |
| depends on (ARCH_ROCKCHIP && ARM64) || COMPILE_TEST | |
| select IOMMU_API | |
| help | |
| Support for IOMMUs used by Verisilicon sub-systems like video | |
| decoders or encoder hardware blocks. | |
| Say Y here if you want to use this IOMMU in front of these | |
| hardware blocks. | |
| config IOMMU_DEBUG_PAGEALLOC | |
| bool "Debug IOMMU mappings against page allocations" | |
| depends on DEBUG_PAGEALLOC && IOMMU_API && PAGE_EXTENSION | |
| help | |
| This enables a consistency check between the kernel page allocator and | |
| the IOMMU subsystem. It verifies that pages being allocated or freed | |
| are not currently mapped in any IOMMU domain. | |
| This helps detect DMA use-after-free bugs where a driver frees a page | |
| but forgets to unmap it from the IOMMU, potentially allowing a device | |
| to overwrite memory that the kernel has repurposed. | |
| These checks are best-effort and may not detect all problems. | |
| Due to performance overhead, this feature is disabled by default. | |
| You must enable "iommu.debug_pagealloc" from the kernel command | |
| line to activate the runtime checks. | |
| If unsure, say N. | |
| endif # IOMMU_SUPPORT | |
| source "drivers/iommu/generic_pt/Kconfig" |