# SPDX-License-Identifier: GPL-2.0-only
# The IOVA library may also be used by non-IOMMU_API users
config IOMMU_IOVA
	tristate

# The IOASID library may also be used by non-IOMMU_API users
config IOASID
	tristate

# IOMMU_API always gets selected by whoever wants it.
config IOMMU_API
	bool

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 cpmxchg64()
	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_SELFTEST
	bool "LPAE selftests"
	depends on IOMMU_IO_PGTABLE_LPAE
	help
	  Enable self-tests for LPAE page table allocator. This performs
	  a series of page-table consistency checks during boot.

	  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 cpmxchg64()
	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 || IA64
	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 || IA64 || X86
	select DMA_OPS
	select IOMMU_API
	select IOMMU_IOVA
	select IRQ_MSI_IOMMU
	select NEED_SG_DMA_LENGTH

# Shared Virtual Addressing
config IOMMU_SVA
	bool
	select IOASID

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_MSM8X60 || ARCH_MSM8960 || 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/intel/Kconfig"
source "drivers/iommu/iommufd/Kconfig"

config IRQ_REMAP
	bool "Support for Interrupt Remapping"
	depends on X86_64 && X86_IO_APIC && PCI_MSI && ACPI
	select DMAR_TABLE
	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_GART
	bool "Tegra GART IOMMU Support"
	depends on ARCH_TEGRA_2x_SOC
	depends on TEGRA_MC
	select IOMMU_API
	help
	  Enables support for remapping discontiguous physical memory
	  shared with the operating system into contiguous I/O virtual
	  space through the GART (Graphics Address Relocation Table)
	  hardware included on Tegra SoCs.

config TEGRA_IOMMU_SMMU
	bool "NVIDIA Tegra SMMU Support"
	depends on ARCH_TEGRA
	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 !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
	default ARCH_APPLE
	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.

# ARM IOMMU support
config ARM_SMMU
	tristate "ARM Ltd. System MMU (SMMU) Support"
	depends on ARM64 || ARM || COMPILE_TEST
	depends on !GENERIC_ATOMIC64	# for IOMMU_IO_PGTABLE_LPAE
	select IOMMU_API
	select IOMMU_IO_PGTABLE_LPAE
	select ARM_DMA_USE_IOMMU if ARM
	help
	  Support for implementations of the ARM System MMU architecture
	  versions 1 and 2.

	  Say Y here if your SoC includes an IOMMU device implementing
	  the ARM SMMU architecture.

config ARM_SMMU_LEGACY_DT_BINDINGS
	bool "Support the legacy \"mmu-masters\" devicetree bindings"
	depends on ARM_SMMU=y && OF
	help
	  Support for the badly designed and deprecated "mmu-masters"
	  devicetree bindings. This allows some DMA masters to attach
	  to the SMMU but does not provide any support via the DMA API.
	  If you're lucky, you might be able to get VFIO up and running.

	  If you say Y here then you'll make me very sad. Instead, say N
	  and move your firmware to the utopian future that was 2016.

config ARM_SMMU_DISABLE_BYPASS_BY_DEFAULT
	bool "Default to disabling bypass on ARM SMMU v1 and v2"
	depends on ARM_SMMU
	default y
	help
	  Say Y here to (by default) disable bypass streams such that
	  incoming transactions from devices that are not attached to
	  an iommu domain will report an abort back to the device and
	  will not be allowed to pass through the SMMU.

	  Any old kernels that existed before this KConfig was
	  introduced would default to _allowing_ bypass (AKA the
	  equivalent of NO for this config).  However the default for
	  this option is YES because the old behavior is insecure.

	  There are few reasons to allow unmatched stream bypass, and
	  even fewer good ones.  If saying YES here breaks your board
	  you should work on fixing your board.  This KConfig option
	  is expected to be removed in the future and we'll simply
	  hardcode the bypass disable in the code.

	  NOTE: the kernel command line parameter
	  'arm-smmu.disable_bypass' will continue to override this
	  config.

config ARM_SMMU_QCOM
	def_tristate y
	depends on ARM_SMMU && ARCH_QCOM
	select QCOM_SCM
	help
	  When running on a Qualcomm platform that has the custom variant
	  of the ARM SMMU, this needs to be built into the SMMU driver.

config ARM_SMMU_QCOM_DEBUG
	bool "ARM SMMU QCOM implementation defined debug support"
	depends on ARM_SMMU_QCOM
	help
	  Support for implementation specific debug features in ARM SMMU
	  hardware found in QTI platforms.

	  Say Y here to enable debug for issues such as TLB sync timeouts
	  which requires implementation defined register dumps.

config ARM_SMMU_V3
	tristate "ARM Ltd. System MMU Version 3 (SMMUv3) Support"
	depends on ARM64
	select IOMMU_API
	select IOMMU_IO_PGTABLE_LPAE
	select GENERIC_MSI_IRQ
	help
	  Support for implementations of the ARM System MMU architecture
	  version 3 providing translation support to a PCIe root complex.

	  Say Y here if your system includes an IOMMU device implementing
	  the ARM SMMUv3 architecture.

config ARM_SMMU_V3_SVA
	bool "Shared Virtual Addressing support for the ARM SMMUv3"
	depends on ARM_SMMU_V3
	select IOMMU_SVA
	select MMU_NOTIFIER
	help
	  Support for sharing process address spaces with devices using the
	  SMMUv3.

	  Say Y here if your system supports SVA extensions such as PCIe PASID
	  and PRI.

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 S390_CCW_IOMMU
	bool "S390 CCW IOMMU Support"
	depends on S390 && CCW || COMPILE_TEST
	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 S390_AP_IOMMU
	bool "S390 AP IOMMU Support"
	depends on S390 && ZCRYPT || COMPILE_TEST
	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 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 ARM
	depends on ARCH_MEDIATEK || 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 QCOM_IOMMU
	# Note: iommu drivers cannot (yet?) be built as modules
	bool "Qualcomm IOMMU Support"
	depends on ARCH_QCOM || COMPILE_TEST
	depends on !GENERIC_ATOMIC64	# for IOMMU_IO_PGTABLE_LPAE
	select QCOM_SCM
	select IOMMU_API
	select IOMMU_IO_PGTABLE_LPAE
	select ARM_DMA_USE_IOMMU
	help
	  Support for IOMMU on certain Qualcomm SoCs.

config HYPERV_IOMMU
	bool "Hyper-V IRQ Handling"
	depends on HYPERV && X86
	select IOMMU_API
	default HYPERV
	help
	  Stub IOMMU driver to handle IRQs to support Hyper-V Linux
	  guest and root partitions.

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.

endif # IOMMU_SUPPORT
