1 # SPDX-License-Identifier: GPL-2.0-only
16 # IOMMU drivers that can bypass the IOMMU code and optionally use the direct
17 # mapping fast path should select this option and set the dma_ops_bypass
18 # flag in struct device where applicable
23 # Lets platform IOMMU driver choose between bypass and IOMMU
24 config ARCH_HAS_DMA_MAP_DIRECT
27 config NEED_SG_DMA_FLAGS
30 config NEED_SG_DMA_LENGTH
33 config NEED_DMA_MAP_STATE
36 config ARCH_DMA_ADDR_T_64BIT
37 def_bool 64BIT || PHYS_ADDR_T_64BIT
39 config ARCH_HAS_DMA_SET_MASK
43 # Select this option if the architecture needs special handling for
44 # DMA_ATTR_WRITE_COMBINE. Normally the "uncached" mapping should be what
45 # people think of when saying write combine, so very few platforms should
46 # need to enable this.
48 config ARCH_HAS_DMA_WRITE_COMBINE
52 # Select if the architectures provides the arch_dma_mark_clean hook
54 config ARCH_HAS_DMA_MARK_CLEAN
57 config DMA_DECLARE_COHERENT
60 config ARCH_HAS_SETUP_DMA_OPS
63 config ARCH_HAS_TEARDOWN_DMA_OPS
66 config ARCH_HAS_SYNC_DMA_FOR_DEVICE
69 config ARCH_HAS_SYNC_DMA_FOR_CPU
71 select NEED_DMA_MAP_STATE
73 config ARCH_HAS_SYNC_DMA_FOR_CPU_ALL
76 config ARCH_HAS_DMA_PREP_COHERENT
79 config ARCH_HAS_FORCE_DMA_UNENCRYPTED
83 # Select this option if the architecture assumes DMA devices are coherent
86 config ARCH_DMA_DEFAULT_COHERENT
91 select NEED_DMA_MAP_STATE
93 config DMA_BOUNCE_UNALIGNED_KMALLOC
97 config DMA_RESTRICTED_POOL
98 bool "DMA Restricted Pool"
99 depends on OF && OF_RESERVED_MEM && SWIOTLB
101 This enables support for restricted DMA pools which provide a level of
102 DMA memory protection on systems with limited hardware protection
103 capabilities, such as those lacking an IOMMU.
105 For more information see
106 <Documentation/devicetree/bindings/reserved-memory/reserved-memory.txt>
107 and <kernel/dma/swiotlb.c>.
111 # Should be selected if we can mmap non-coherent mappings to userspace.
112 # The only thing that is really required is a way to set an uncached bit
115 config DMA_NONCOHERENT_MMAP
119 config DMA_COHERENT_POOL
120 select GENERIC_ALLOCATOR
123 config DMA_GLOBAL_POOL
124 select DMA_DECLARE_COHERENT
127 config DMA_DIRECT_REMAP
129 select DMA_COHERENT_POOL
130 select DMA_NONCOHERENT_MMAP
133 bool "DMA Contiguous Memory Allocator"
134 depends on HAVE_DMA_CONTIGUOUS && CMA
136 This enables the Contiguous Memory Allocator which allows drivers
137 to allocate big physically-contiguous blocks of memory for use with
138 hardware components that do not support I/O map nor scatter-gather.
140 You can disable CMA by specifying "cma=0" on the kernel's command
143 For more information see <kernel/dma/contiguous.c>.
148 config DMA_PERNUMA_CMA
149 bool "Enable separate DMA Contiguous Memory Area for each NUMA Node"
150 default NUMA && ARM64
152 Enable this option to get pernuma CMA areas so that devices like
153 ARM64 SMMU can get local memory by DMA coherent APIs.
155 You can set the size of pernuma CMA by specifying "cma_pernuma=size"
156 on the kernel's command line.
158 comment "Default contiguous memory area size:"
160 config CMA_SIZE_MBYTES
161 int "Size in Mega Bytes"
162 depends on !CMA_SIZE_SEL_PERCENTAGE
166 Defines the size (in MiB) of the default memory area for Contiguous
167 Memory Allocator. If the size of 0 is selected, CMA is disabled by
168 default, but it can be enabled by passing cma=size[MG] to the kernel.
171 config CMA_SIZE_PERCENTAGE
172 int "Percentage of total memory"
173 depends on !CMA_SIZE_SEL_MBYTES
177 Defines the size of the default memory area for Contiguous Memory
178 Allocator as a percentage of the total memory in the system.
179 If 0 percent is selected, CMA is disabled by default, but it can be
180 enabled by passing cma=size[MG] to the kernel.
183 prompt "Selected region size"
184 default CMA_SIZE_SEL_MBYTES
186 config CMA_SIZE_SEL_MBYTES
187 bool "Use mega bytes value only"
189 config CMA_SIZE_SEL_PERCENTAGE
190 bool "Use percentage value only"
192 config CMA_SIZE_SEL_MIN
193 bool "Use lower value (minimum)"
195 config CMA_SIZE_SEL_MAX
196 bool "Use higher value (maximum)"
201 int "Maximum PAGE_SIZE order of alignment for contiguous buffers"
205 DMA mapping framework by default aligns all buffers to the smallest
206 PAGE_SIZE order which is greater than or equal to the requested buffer
207 size. This works well for buffers up to a few hundreds kilobytes, but
208 for larger buffers it just a memory waste. With this parameter you can
209 specify the maximum PAGE_SIZE order for contiguous buffers. Larger
210 buffers will be aligned only to this specified order. The order is
211 expressed as a power of two multiplied by the PAGE_SIZE.
213 For example, if your system defaults to 4KiB pages, the order value
214 of 8 means that the buffers will be aligned up to 1MiB only.
216 If unsure, leave the default value "8".
221 bool "Enable debugging of DMA-API usage"
222 select NEED_DMA_MAP_STATE
224 Enable this option to debug the use of the DMA API by device drivers.
225 With this option you will be able to detect common bugs in device
226 drivers like double-freeing of DMA mappings or freeing mappings that
227 were never allocated.
229 This option causes a performance degradation. Use only if you want to
230 debug device drivers and dma interactions.
234 config DMA_API_DEBUG_SG
235 bool "Debug DMA scatter-gather usage"
237 depends on DMA_API_DEBUG
239 Perform extra checking that callers of dma_map_sg() have respected the
240 appropriate segment length/boundary limits for the given device when
241 preparing DMA scatterlists.
243 This is particularly likely to have been overlooked in cases where the
244 dma_map_sg() API is used for general bulk mapping of pages rather than
245 preparing literal scatter-gather descriptors, where there is a risk of
246 unexpected behaviour from DMA API implementations if the scatterlist
247 is technically out-of-spec.
251 config DMA_MAP_BENCHMARK
252 bool "Enable benchmarking of streaming DMA mapping"
255 Provides /sys/kernel/debug/dma_map_benchmark that helps with testing
256 performance of dma_(un)map_page.
258 See tools/testing/selftests/dma/dma_map_benchmark.c