Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

MIPS: improve checks for noncoherent DMA

Only one MIPS development board actually supports enabling/disabling DMA
coherency at runtime, so it's not a good idea to push the overhead of
checking that configuration setting onto every other supported target as
well.

Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Signed-off-by: John Crispin <blogic@openwrt.org>
Patchwork: http://patchwork.linux-mips.org/patch/5912/

authored by

Felix Fietkau and committed by
Ralf Baechle
885014bc 5792bf64

+16 -5
+5 -1
arch/mips/Kconfig
··· 301 301 select CEVT_R4K 302 302 select CSRC_R4K 303 303 select CSRC_GIC 304 - select DMA_NONCOHERENT 304 + select DMA_MAYBE_COHERENT 305 305 select GENERIC_ISA_DMA 306 306 select HAVE_PCSPKR_PLATFORM 307 307 select IRQ_CPU ··· 892 892 893 893 config ARCH_DMA_ADDR_T_64BIT 894 894 def_bool (HIGHMEM && 64BIT_PHYS_ADDR) || 64BIT 895 + 896 + config DMA_MAYBE_COHERENT 897 + select DMA_NONCOHERENT 898 + bool 895 899 896 900 config DMA_COHERENT 897 901 bool
+9
arch/mips/include/asm/dma-coherence.h
··· 9 9 #ifndef __ASM_DMA_COHERENCE_H 10 10 #define __ASM_DMA_COHERENCE_H 11 11 12 + #ifdef CONFIG_DMA_MAYBE_COHERENT 12 13 extern int coherentio; 13 14 extern int hw_coherentio; 15 + #else 16 + #ifdef CONFIG_DMA_COHERENT 17 + #define coherentio 1 18 + #else 19 + #define coherentio 0 20 + #endif 21 + #define hw_coherentio 0 22 + #endif /* CONFIG_DMA_MAYBE_COHERENT */ 14 23 15 24 #endif
-4
arch/mips/include/asm/mach-generic/dma-coherence.h
··· 49 49 50 50 static inline int plat_device_is_coherent(struct device *dev) 51 51 { 52 - #ifdef CONFIG_DMA_COHERENT 53 - return 1; 54 - #else 55 52 return coherentio; 56 - #endif 57 53 } 58 54 59 55 #ifdef CONFIG_SWIOTLB
+2
arch/mips/mm/dma-default.c
··· 23 23 24 24 #include <dma-coherence.h> 25 25 26 + #ifdef CONFIG_DMA_MAYBE_COHERENT 26 27 int coherentio = 0; /* User defined DMA coherency from command line. */ 27 28 EXPORT_SYMBOL_GPL(coherentio); 28 29 int hw_coherentio = 0; /* Actual hardware supported DMA coherency setting. */ ··· 43 42 return 0; 44 43 } 45 44 early_param("nocoherentio", setnocoherentio); 45 + #endif 46 46 47 47 static inline struct page *dma_addr_to_page(struct device *dev, 48 48 dma_addr_t dma_addr)