# 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 
 | 
  
 | 
if IOMMU_IOVA 
 | 
  
 | 
config IOMMU_LIMIT_IOVA_ALIGNMENT 
 | 
    bool "Limit IOVA alignment" 
 | 
    help 
 | 
      When the IOVA framework applies IOVA alignment it aligns all 
 | 
      IOVAs to the smallest PAGE_SIZE order which is greater than or 
 | 
      equal to the requested IOVA size. This works fine for sizes up 
 | 
      to several MiB, but for larger sizes it results in address 
 | 
      space wastage and fragmentation. For example drivers with a 4 
 | 
      GiB IOVA space might run out of IOVA space when allocating 
 | 
      buffers great than 64 MiB. 
 | 
  
 | 
      Enable this option to impose a limit on the alignment of IOVAs. 
 | 
  
 | 
      If unsure, say N. 
 | 
  
 | 
config IOMMU_IOVA_ALIGNMENT 
 | 
    int "Maximum PAGE_SIZE order of alignment for IOVAs" 
 | 
    depends on IOMMU_LIMIT_IOVA_ALIGNMENT 
 | 
    range 4 9 
 | 
    default 9 
 | 
    help 
 | 
      With this parameter you can specify the maximum PAGE_SIZE order for 
 | 
      IOVAs. Larger IOVAs will be aligned only to this specified order. 
 | 
      The order is expressed a power of two multiplied by the PAGE_SIZE. 
 | 
  
 | 
      If unsure, leave the default value "9". 
 | 
endif 
 | 
  
 | 
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 
 | 
    tristate "Rockchip IOMMU Support" 
 | 
    depends on ARM || ARM64 
 | 
    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 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. 
 | 
  
 | 
# ARM IOMMU support 
 | 
config ARM_SMMU 
 | 
    tristate "ARM Ltd. System MMU (SMMU) Support" 
 | 
    depends on ARM64 || ARM || (COMPILE_TEST && !GENERIC_ATOMIC64) 
 | 
    depends on QCOM_SCM || !QCOM_SCM #if QCOM_SCM=m this can't be =y 
 | 
    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 ARM_SMMU_V3_SVA 
 | 
    bool "Shared Virtual Addressing support for the ARM SMMUv3" 
 | 
    depends on ARM_SMMU_V3 
 | 
    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 
 | 
    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) 
 | 
    depends on QCOM_SCM=y 
 | 
    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 
 |