| # SPDX-License-Identifier: GPL-2.0-only |
| |
| config NO_DMA |
| bool |
| |
| config HAS_DMA |
| bool |
| depends on !NO_DMA |
| default y |
| |
| config DMA_OPS |
| depends on HAS_DMA |
| bool |
| |
| # |
| # IOMMU drivers that can bypass the IOMMU code and optionally use the direct |
| # mapping fast path should select this option and set the dma_ops_bypass |
| # flag in struct device where applicable |
| # |
| config DMA_OPS_BYPASS |
| bool |
| |
| # Lets platform IOMMU driver choose between bypass and IOMMU |
| config ARCH_HAS_DMA_MAP_DIRECT |
| bool |
| |
| config NEED_SG_DMA_FLAGS |
| bool |
| |
| config NEED_SG_DMA_LENGTH |
| bool |
| |
| config NEED_DMA_MAP_STATE |
| bool |
| |
| config ARCH_DMA_ADDR_T_64BIT |
| def_bool 64BIT || PHYS_ADDR_T_64BIT |
| |
| config ARCH_HAS_DMA_SET_MASK |
| bool |
| |
| # |
| # Select this option if the architecture needs special handling for |
| # DMA_ATTR_WRITE_COMBINE. Normally the "uncached" mapping should be what |
| # people think of when saying write combine, so very few platforms should |
| # need to enable this. |
| # |
| config ARCH_HAS_DMA_WRITE_COMBINE |
| bool |
| |
| # |
| # Select if the architectures provides the arch_dma_mark_clean hook |
| # |
| config ARCH_HAS_DMA_MARK_CLEAN |
| bool |
| |
| config DMA_DECLARE_COHERENT |
| bool |
| |
| config ARCH_HAS_SETUP_DMA_OPS |
| bool |
| |
| config ARCH_HAS_TEARDOWN_DMA_OPS |
| bool |
| |
| config ARCH_HAS_SYNC_DMA_FOR_DEVICE |
| bool |
| |
| config ARCH_HAS_SYNC_DMA_FOR_CPU |
| bool |
| select NEED_DMA_MAP_STATE |
| |
| config ARCH_HAS_SYNC_DMA_FOR_CPU_ALL |
| bool |
| |
| config ARCH_HAS_DMA_PREP_COHERENT |
| bool |
| |
| config ARCH_HAS_FORCE_DMA_UNENCRYPTED |
| bool |
| |
| # |
| # Select this option if the architecture assumes DMA devices are coherent |
| # by default. |
| # |
| config ARCH_DMA_DEFAULT_COHERENT |
| bool |
| |
| config SWIOTLB |
| bool |
| select NEED_DMA_MAP_STATE |
| |
| config SWIOTLB_DYNAMIC |
| bool "Dynamic allocation of DMA bounce buffers" |
| default n |
| depends on SWIOTLB |
| help |
| This enables dynamic resizing of the software IO TLB. The kernel |
| starts with one memory pool at boot and it will allocate additional |
| pools as needed. To reduce run-time kernel memory requirements, you |
| may have to specify a smaller size of the initial pool using |
| "swiotlb=" on the kernel command line. |
| |
| If unsure, say N. |
| |
| config DMA_BOUNCE_UNALIGNED_KMALLOC |
| bool |
| depends on SWIOTLB |
| |
| config DMA_NEED_SYNC |
| def_bool ARCH_HAS_SYNC_DMA_FOR_DEVICE || ARCH_HAS_SYNC_DMA_FOR_CPU || \ |
| ARCH_HAS_SYNC_DMA_FOR_CPU_ALL || DMA_API_DEBUG || DMA_OPS || \ |
| SWIOTLB |
| |
| config DMA_RESTRICTED_POOL |
| bool "DMA Restricted Pool" |
| depends on OF && OF_RESERVED_MEM && SWIOTLB |
| help |
| This enables support for restricted DMA pools which provide a level of |
| DMA memory protection on systems with limited hardware protection |
| capabilities, such as those lacking an IOMMU. |
| |
| For more information see |
| <Documentation/devicetree/bindings/reserved-memory/reserved-memory.txt> |
| and <kernel/dma/swiotlb.c>. |
| If unsure, say "n". |
| |
| # |
| # Should be selected if we can mmap non-coherent mappings to userspace. |
| # The only thing that is really required is a way to set an uncached bit |
| # in the pagetables |
| # |
| config DMA_NONCOHERENT_MMAP |
| default y if !MMU |
| bool |
| |
| config DMA_COHERENT_POOL |
| select GENERIC_ALLOCATOR |
| bool |
| |
| config DMA_GLOBAL_POOL |
| select DMA_DECLARE_COHERENT |
| depends on !ARCH_HAS_DMA_SET_UNCACHED |
| depends on !DMA_DIRECT_REMAP |
| bool |
| |
| config DMA_DIRECT_REMAP |
| bool |
| select DMA_COHERENT_POOL |
| select DMA_NONCOHERENT_MMAP |
| |
| # |
| # Fallback to arch code for DMA allocations. This should eventually go away. |
| # |
| config ARCH_HAS_DMA_ALLOC |
| depends on !ARCH_HAS_DMA_SET_UNCACHED |
| depends on !DMA_DIRECT_REMAP |
| depends on !DMA_GLOBAL_POOL |
| bool |
| |
| config DMA_CMA |
| bool "DMA Contiguous Memory Allocator" |
| depends on HAVE_DMA_CONTIGUOUS && CMA |
| help |
| This enables the Contiguous Memory Allocator which allows drivers |
| to allocate big physically-contiguous blocks of memory for use with |
| hardware components that do not support I/O map nor scatter-gather. |
| |
| You can disable CMA by specifying "cma=0" on the kernel's command |
| line. |
| |
| For more information see <kernel/dma/contiguous.c>. |
| If unsure, say "n". |
| |
| if DMA_CMA |
| |
| config DMA_NUMA_CMA |
| bool "Enable separate DMA Contiguous Memory Area for NUMA Node" |
| depends on NUMA |
| help |
| Enable this option to get numa CMA areas so that NUMA devices |
| can get local memory by DMA coherent APIs. |
| |
| You can set the size of pernuma CMA by specifying "cma_pernuma=size" |
| or set the node id and its size of CMA by specifying "numa_cma= |
| <node>:size[,<node>:size]" on the kernel's command line. |
| |
| comment "Default contiguous memory area size:" |
| |
| config CMA_SIZE_MBYTES |
| int "Size in Mega Bytes" |
| depends on !CMA_SIZE_SEL_PERCENTAGE |
| default 0 if X86 |
| default 16 |
| help |
| Defines the size (in MiB) of the default memory area for Contiguous |
| Memory Allocator. If the size of 0 is selected, CMA is disabled by |
| default, but it can be enabled by passing cma=size[MG] to the kernel. |
| |
| |
| config CMA_SIZE_PERCENTAGE |
| int "Percentage of total memory" |
| depends on !CMA_SIZE_SEL_MBYTES |
| default 0 if X86 |
| default 10 |
| help |
| Defines the size of the default memory area for Contiguous Memory |
| Allocator as a percentage of the total memory in the system. |
| If 0 percent is selected, CMA is disabled by default, but it can be |
| enabled by passing cma=size[MG] to the kernel. |
| |
| choice |
| prompt "Selected region size" |
| default CMA_SIZE_SEL_MBYTES |
| |
| config CMA_SIZE_SEL_MBYTES |
| bool "Use mega bytes value only" |
| |
| config CMA_SIZE_SEL_PERCENTAGE |
| bool "Use percentage value only" |
| |
| config CMA_SIZE_SEL_MIN |
| bool "Use lower value (minimum)" |
| |
| config CMA_SIZE_SEL_MAX |
| bool "Use higher value (maximum)" |
| |
| endchoice |
| |
| config CMA_ALIGNMENT |
| int "Maximum PAGE_SIZE order of alignment for contiguous buffers" |
| range 2 12 |
| default 8 |
| help |
| DMA mapping framework by default aligns all buffers to the smallest |
| PAGE_SIZE order which is greater than or equal to the requested buffer |
| size. This works well for buffers up to a few hundreds kilobytes, but |
| for larger buffers it just a memory waste. With this parameter you can |
| specify the maximum PAGE_SIZE order for contiguous buffers. Larger |
| buffers will be aligned only to this specified order. The order is |
| expressed as a power of two multiplied by the PAGE_SIZE. |
| |
| For example, if your system defaults to 4KiB pages, the order value |
| of 8 means that the buffers will be aligned up to 1MiB only. |
| |
| If unsure, leave the default value "8". |
| |
| endif |
| |
| config DMA_API_DEBUG |
| bool "Enable debugging of DMA-API usage" |
| select NEED_DMA_MAP_STATE |
| help |
| Enable this option to debug the use of the DMA API by device drivers. |
| With this option you will be able to detect common bugs in device |
| drivers like double-freeing of DMA mappings or freeing mappings that |
| were never allocated. |
| |
| This option causes a performance degradation. Use only if you want to |
| debug device drivers and dma interactions. |
| |
| If unsure, say N. |
| |
| config DMA_API_DEBUG_SG |
| bool "Debug DMA scatter-gather usage" |
| default y |
| depends on DMA_API_DEBUG |
| help |
| Perform extra checking that callers of dma_map_sg() have respected the |
| appropriate segment length/boundary limits for the given device when |
| preparing DMA scatterlists. |
| |
| This is particularly likely to have been overlooked in cases where the |
| dma_map_sg() API is used for general bulk mapping of pages rather than |
| preparing literal scatter-gather descriptors, where there is a risk of |
| unexpected behaviour from DMA API implementations if the scatterlist |
| is technically out-of-spec. |
| |
| If unsure, say N. |
| |
| config DMA_MAP_BENCHMARK |
| bool "Enable benchmarking of streaming DMA mapping" |
| depends on DEBUG_FS |
| help |
| Provides /sys/kernel/debug/dma_map_benchmark that helps with testing |
| performance of dma_(un)map_page. |
| |
| See tools/testing/selftests/dma/dma_map_benchmark.c |