Commit 2c8ed1b9 authored by Christoph Hellwig's avatar Christoph Hellwig
Browse files

dma-direct: add a CONFIG_ARCH_HAS_DMA_ALLOC symbol



Instead of using arch_dma_alloc if none of the generic coherent
allocators are used, require the architectures to explicitly opt into
providing it.  This will used to deal with the case of m68knommu and
coldfire where we can't do any coherent allocations whatsoever, and
also makes it clear that arch_dma_alloc is a last resort.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarRobin Murphy <robin.murphy@arm.com>
Reviewed-by: default avatarGreg Ungerer <gerg@linux-m68k.org>
Tested-by: default avatarGreg Ungerer <gerg@linux-m68k.org>
parent da323d46
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -8,6 +8,7 @@ config ARM
	select ARCH_HAS_CPU_FINALIZE_INIT if MMU
	select ARCH_HAS_CURRENT_STACK_POINTER
	select ARCH_HAS_DEBUG_VIRTUAL if MMU
	select ARCH_HAS_DMA_ALLOC if MMU
	select ARCH_HAS_DMA_WRITE_COMBINE if !ARM_DMA_MEM_BUFFERABLE
	select ARCH_HAS_ELF_RANDOMIZE
	select ARCH_HAS_FORTIFY_SOURCE
+1 −0
Original line number Diff line number Diff line
@@ -6,6 +6,7 @@ config M68K
	select ARCH_HAS_BINFMT_FLAT
	select ARCH_HAS_CPU_FINALIZE_INIT if MMU
	select ARCH_HAS_CURRENT_STACK_POINTER
	select ARCH_HAS_DMA_ALLOC if !MMU || COLDFIRE
	select ARCH_HAS_DMA_PREP_COHERENT if HAS_DMA && MMU && !COLDFIRE
	select ARCH_HAS_SYNC_DMA_FOR_DEVICE if HAS_DMA
	select ARCH_HAVE_NMI_SAFE_CMPXCHG if RMW_INSNS
+1 −0
Original line number Diff line number Diff line
@@ -8,6 +8,7 @@ config PARISC
	select HAVE_FUNCTION_GRAPH_TRACER
	select HAVE_SYSCALL_TRACEPOINTS
	select ARCH_WANT_FRAME_POINTERS
	select ARCH_HAS_DMA_ALLOC if PA11
	select ARCH_HAS_ELF_RANDOMIZE
	select ARCH_HAS_STRICT_KERNEL_RWX
	select ARCH_HAS_STRICT_MODULE_RWX
+9 −0
Original line number Diff line number Diff line
@@ -144,6 +144,15 @@ config DMA_DIRECT_REMAP
	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
+2 −10
Original line number Diff line number Diff line
@@ -220,13 +220,7 @@ void *dma_direct_alloc(struct device *dev, size_t size,
		return dma_direct_alloc_no_mapping(dev, size, dma_handle, gfp);

	if (!dev_is_dma_coherent(dev)) {
		/*
		 * Fallback to the arch handler if it exists.  This should
		 * eventually go away.
		 */
		if (!IS_ENABLED(CONFIG_ARCH_HAS_DMA_SET_UNCACHED) &&
		    !IS_ENABLED(CONFIG_DMA_DIRECT_REMAP) &&
		    !IS_ENABLED(CONFIG_DMA_GLOBAL_POOL) &&
		if (IS_ENABLED(CONFIG_ARCH_HAS_DMA_ALLOC) &&
		    !is_swiotlb_for_alloc(dev))
			return arch_dma_alloc(dev, size, dma_handle, gfp,
					      attrs);
@@ -330,9 +324,7 @@ void dma_direct_free(struct device *dev, size_t size,
		return;
	}

	if (!IS_ENABLED(CONFIG_ARCH_HAS_DMA_SET_UNCACHED) &&
	    !IS_ENABLED(CONFIG_DMA_DIRECT_REMAP) &&
	    !IS_ENABLED(CONFIG_DMA_GLOBAL_POOL) &&
	if (IS_ENABLED(CONFIG_ARCH_HAS_DMA_ALLOC) &&
	    !dev_is_dma_coherent(dev) &&
	    !is_swiotlb_for_alloc(dev)) {
		arch_dma_free(dev, size, cpu_addr, dma_addr, attrs);