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

dma-mapping: prevent dma dependent code from linking on !HAS_DMA archs

Continuing the work started in 411f0f3edc141a582190d3605cadd1d993abb6df ...

This enables code with a dma path, that compiles away, to build without
requiring additional code factoring. It also prevents code that calls
dma_alloc_coherent and dma_free_coherent from linking whereas previously
the code would hit a BUG() at run time. Finally, it allows archs that set
!HAS_DMA to delete their asm/dma-mapping.h file.

Cc: Cornelia Huck <cornelia.huck@de.ibm.com>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: John W. Linville <linville@tuxdriver.com>
Cc: Kyle McMartin <kyle@parisc-linux.org>
Cc: James Bottomley <James.Bottomley@SteelEye.com>
Cc: Tejun Heo <htejun@gmail.com>
Cc: Jeff Garzik <jeff@garzik.org>
Cc: <geert@linux-m68k.org>
Cc: <zippel@linux-m68k.org>
Cc: <spyro@f2s.com>
Cc: <ysato@users.sourceforge.jp>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Dan Williams and committed by
Linus Torvalds
1b0fac45 9e7bf24b

+84 -34
+3
arch/arm26/Kconfig
··· 17 17 bool 18 18 default y 19 19 20 + config NO_DMA 21 + def_bool y 22 + 20 23 config ARCH_ACORN 21 24 bool 22 25 default y
+3
arch/h8300/Kconfig
··· 68 68 config NO_IOPORT 69 69 def_bool y 70 70 71 + config NO_DMA 72 + def_bool y 73 + 71 74 config ISA 72 75 bool 73 76 default y
+3
arch/m32r/Kconfig
··· 31 31 config NO_IOPORT 32 32 def_bool y 33 33 34 + config NO_DMA 35 + def_bool y 36 + 34 37 source "init/Kconfig" 35 38 36 39
+1 -1
drivers/dma/Kconfig
··· 3 3 # 4 4 5 5 menu "DMA Engine support" 6 - depends on !S390 6 + depends on HAS_DMA 7 7 8 8 config DMA_ENGINE 9 9 bool "Support for DMA engines"
-2
include/asm-arm26/dma-mapping.h
··· 1 - #include <asm-generic/dma-mapping-broken.h> 2 -
+70 -12
include/asm-generic/dma-mapping-broken.h
··· 1 1 #ifndef _ASM_GENERIC_DMA_MAPPING_H 2 2 #define _ASM_GENERIC_DMA_MAPPING_H 3 3 4 - /* This is used for archs that do not support DMA */ 4 + /* define the dma api to allow compilation but not linking of 5 + * dma dependent code. Code that depends on the dma-mapping 6 + * API needs to set 'depends on HAS_DMA' in its Kconfig 7 + */ 5 8 6 - static inline void * 9 + struct scatterlist; 10 + 11 + extern void * 7 12 dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, 8 - gfp_t flag) 9 - { 10 - BUG(); 11 - return NULL; 12 - } 13 + gfp_t flag); 13 14 14 - static inline void 15 + extern void 15 16 dma_free_coherent(struct device *dev, size_t size, void *cpu_addr, 16 - dma_addr_t dma_handle) 17 - { 18 - BUG(); 19 - } 17 + dma_addr_t dma_handle); 20 18 21 19 #define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f) 22 20 #define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h) 21 + 22 + extern dma_addr_t 23 + dma_map_single(struct device *dev, void *ptr, size_t size, 24 + enum dma_data_direction direction); 25 + 26 + extern void 27 + dma_unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size, 28 + enum dma_data_direction direction); 29 + 30 + extern int 31 + dma_map_sg(struct device *dev, struct scatterlist *sg, int nents, 32 + enum dma_data_direction direction); 33 + 34 + extern void 35 + dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nhwentries, 36 + enum dma_data_direction direction); 37 + 38 + extern dma_addr_t 39 + dma_map_page(struct device *dev, struct page *page, unsigned long offset, 40 + size_t size, enum dma_data_direction direction); 41 + 42 + extern void 43 + dma_unmap_page(struct device *dev, dma_addr_t dma_address, size_t size, 44 + enum dma_data_direction direction); 45 + 46 + extern void 47 + dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, size_t size, 48 + enum dma_data_direction direction); 49 + 50 + extern void 51 + dma_sync_single_range_for_cpu(struct device *dev, dma_addr_t dma_handle, 52 + unsigned long offset, size_t size, 53 + enum dma_data_direction direction); 54 + 55 + extern void 56 + dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nelems, 57 + enum dma_data_direction direction); 58 + 59 + #define dma_sync_single_for_device dma_sync_single_for_cpu 60 + #define dma_sync_single_range_for_device dma_sync_single_range_for_cpu 61 + #define dma_sync_sg_for_device dma_sync_sg_for_cpu 62 + 63 + extern int 64 + dma_mapping_error(dma_addr_t dma_addr); 65 + 66 + extern int 67 + dma_supported(struct device *dev, u64 mask); 68 + 69 + extern int 70 + dma_set_mask(struct device *dev, u64 mask); 71 + 72 + extern int 73 + dma_get_cache_alignment(void); 74 + 75 + extern int 76 + dma_is_consistent(struct device *dev, dma_addr_t dma_handle); 77 + 78 + extern void 79 + dma_cache_sync(struct device *dev, void *vaddr, size_t size, 80 + enum dma_data_direction direction); 23 81 24 82 #endif /* _ASM_GENERIC_DMA_MAPPING_H */
-1
include/asm-h8300/dma-mapping.h
··· 1 - #include <asm-generic/dma-mapping-broken.h>
-6
include/asm-m32r/dma-mapping.h
··· 1 - #ifndef _ASM_M32R_DMA_MAPPING_H 2 - #define _ASM_M32R_DMA_MAPPING_H 3 - 4 - #include <asm-generic/dma-mapping-broken.h> 5 - 6 - #endif /* _ASM_M32R_DMA_MAPPING_H */
-12
include/asm-s390/dma-mapping.h
··· 1 - /* 2 - * include/asm-s390/dma-mapping.h 3 - * 4 - * S390 version 5 - * 6 - * This file exists so that #include <dma-mapping.h> doesn't break anything. 7 - */ 8 - 9 - #ifndef _ASM_DMA_MAPPING_H 10 - #define _ASM_DMA_MAPPING_H 11 - 12 - #endif /* _ASM_DMA_MAPPING_H */
+4
include/linux/dma-mapping.h
··· 31 31 (dma_direction == DMA_FROM_DEVICE)); 32 32 } 33 33 34 + #ifdef CONFIG_HAS_DMA 34 35 #include <asm/dma-mapping.h> 36 + #else 37 + #include <asm-generic/dma-mapping-broken.h> 38 + #endif 35 39 36 40 /* Backwards compat, remove in 2.7.x */ 37 41 #define dma_sync_single dma_sync_single_for_cpu