]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
dma-direct: add a CONFIG_ARCH_HAS_DMA_ALLOC symbol
authorChristoph Hellwig <hch@lst.de>
Thu, 5 Oct 2023 07:05:36 +0000 (09:05 +0200)
committerChristoph Hellwig <hch@lst.de>
Sun, 22 Oct 2023 14:38:54 +0000 (16:38 +0200)
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: Christoph Hellwig <hch@lst.de>
Reviewed-by: Robin Murphy <robin.murphy@arm.com>
Reviewed-by: Greg Ungerer <gerg@linux-m68k.org>
Tested-by: Greg Ungerer <gerg@linux-m68k.org>
arch/arm/Kconfig
arch/m68k/Kconfig
arch/parisc/Kconfig
kernel/dma/Kconfig
kernel/dma/direct.c

index 9557808e8937b1348cf4a7466ce28059fa5df14e..f8567e95f98bef4ac91bf1088552b64f79422de6 100644 (file)
@@ -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
index 3e318bf9504c5b1c207dfcb117d7b9d2a543b5b2..4f3e7dec2171c8bb72533552092b548bcf338843 100644 (file)
@@ -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
index a15ab147af2e072cae982061ad1fd7890d763d2e..46e8e4ea7a57de3b395dd0bce5bb2a6880f55d28 100644 (file)
@@ -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
index 4524db877eba3635dcb7a043e969e6ac2d1888a4..d62f5957f36be7601d99ffc2491a95473967f912 100644 (file)
@@ -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
index 9596ae1aa0dacf45f95c0b41eb13565305aa6ee2..c078090cd38ecc45306d32cc6c92a5957d8a421c 100644 (file)
@@ -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);