On architectures like arm64, ARCH_DMA_MINALIGN is larger than most cache line size configurations deployed. However, the single kernel binary requirement doesn't allow the smaller ARCH_DMA_MINALIGN. Permit an architecture to opt in to dma_get_cache_alignment() returning cache_line_size() which can be probed at run-time. Signed-off-by: Catalin Marinas <catalin.marinas@xxxxxxx> Cc: Christoph Hellwig <hch@xxxxxx> Cc: Robin Murphy <robin.murphy@xxxxxxx> Cc: Will Deacon <will@xxxxxxxxxx> --- include/linux/dma-mapping.h | 2 ++ kernel/dma/Kconfig | 7 +++++++ 2 files changed, 9 insertions(+) diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h index 3288a1339271..b29124341317 100644 --- a/include/linux/dma-mapping.h +++ b/include/linux/dma-mapping.h @@ -545,6 +545,8 @@ static inline int dma_set_min_align_mask(struct device *dev, static inline int dma_get_cache_alignment(void) { + if (IS_ENABLED(CONFIG_ARCH_HAS_DMA_CACHE_LINE_SIZE)) + return cache_line_size(); #ifdef ARCH_HAS_DMA_MINALIGN return ARCH_DMA_MINALIGN; #endif diff --git a/kernel/dma/Kconfig b/kernel/dma/Kconfig index 6677d0e64d27..cc750062c412 100644 --- a/kernel/dma/Kconfig +++ b/kernel/dma/Kconfig @@ -76,6 +76,13 @@ config ARCH_HAS_DMA_PREP_COHERENT config ARCH_HAS_FORCE_DMA_UNENCRYPTED bool +config ARCH_HAS_DMA_CACHE_LINE_SIZE + bool + help + Select if the architecture has non-coherent DMA and + defines ARCH_DMA_MINALIGN larger than a run-time + cache_line_size(). + # # Select this option if the architecture assumes DMA devices are coherent # by default.