# 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 && !GENERIC_ATOMIC64)
	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.

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.

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 OF_IOMMU
	def_bool y
	depends on OF && IOMMU_API

# IOMMU-agnostic DMA-mapping layer
config IOMMU_DMA
	bool
	select DMA_OPS
	select IOMMU_API
	select IOMMU_IOVA
	select IRQ_MSI_IOMMU
	select NEED_SG_DMA_LENGTH

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"

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 && !GENERIC_ATOMIC64)
	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 Gen2, and R-Car Gen3 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.

# ARM IOMMU support
config ARM_SMMU
	tristate "ARM Ltd. System MMU (SMMU) Support"
	depends on ARM64 || ARM || (COMPILE_TEST && !GENERIC_ATOMIC64)
	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_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_DOMAIN
	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 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
	bool "MTK 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
	bool "MTK 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 && !GENERIC_ATOMIC64)
	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 x2APIC IRQ Handling"
	depends on HYPERV && X86
	select IOMMU_API
	default HYPERV
	help
	  Stub IOMMU driver to handle IRQs as to allow Hyper-V Linux
	  guests to run with x2APIC mode enabled.

config VIRTIO_IOMMU
	tristate "Virtio IOMMU driver"
	depends on VIRTIO
	depends on ARM64
	select IOMMU_API
	select INTERVAL_TREE
	help
	  Para-virtualised IOMMU driver with virtio.

	  Say Y here if you intend to run this kernel as a guest.

endif # IOMMU_SUPPORT
