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

Merge branch 'for-v3.18' of git://git.linaro.org/people/mszyprowski/linux-dma-mapping

Pull dma-mapping update from Marek Szyprowski:
"Provide the dma write coherent api (available previously on ARM
architecture) for all other architectures, which use dma_ops-based dma
mapping implementation.

This lets one to use the same code in the device drivers regardless of
the selected architecture"

* 'for-v3.18' of git://git.linaro.org/people/mszyprowski/linux-dma-mapping:
dma-mapping: Provide write-combine allocations
s390: Implement dma_{alloc,free}_attrs()

+48 -38
-16
arch/arm/include/asm/dma-mapping.h
··· 265 265 void *cpu_addr, dma_addr_t dma_addr, size_t size, 266 266 struct dma_attrs *attrs); 267 267 268 - static inline void *dma_alloc_writecombine(struct device *dev, size_t size, 269 - dma_addr_t *dma_handle, gfp_t flag) 270 - { 271 - DEFINE_DMA_ATTRS(attrs); 272 - dma_set_attr(DMA_ATTR_WRITE_COMBINE, &attrs); 273 - return dma_alloc_attrs(dev, size, dma_handle, flag, &attrs); 274 - } 275 - 276 - static inline void dma_free_writecombine(struct device *dev, size_t size, 277 - void *cpu_addr, dma_addr_t dma_handle) 278 - { 279 - DEFINE_DMA_ATTRS(attrs); 280 - dma_set_attr(DMA_ATTR_WRITE_COMBINE, &attrs); 281 - return dma_free_attrs(dev, size, cpu_addr, dma_handle, &attrs); 282 - } 283 - 284 268 /* 285 269 * This can be called during early boot to increase the size of the atomic 286 270 * coherent DMA pool above the default value of 256KiB. It must be called
+1 -4
arch/s390/Kconfig
··· 496 496 497 497 menuconfig PCI 498 498 bool "PCI support" 499 - default n 500 499 depends on 64BIT 500 + select HAVE_DMA_ATTRS 501 501 select PCI_MSI 502 502 help 503 503 Enable PCI support. ··· 542 542 select HAVE_DMA_API_DEBUG 543 543 544 544 config NEED_SG_DMA_LENGTH 545 - def_bool PCI 546 - 547 - config HAVE_DMA_ATTRS 548 545 def_bool PCI 549 546 550 547 config NEED_DMA_MAP_STATE
+21 -10
arch/s390/include/asm/dma-mapping.h
··· 56 56 return dma_addr == DMA_ERROR_CODE; 57 57 } 58 58 59 - static inline void *dma_alloc_coherent(struct device *dev, size_t size, 60 - dma_addr_t *dma_handle, gfp_t flag) 59 + #define dma_alloc_coherent(d, s, h, f) dma_alloc_attrs(d, s, h, f, NULL) 60 + 61 + static inline void *dma_alloc_attrs(struct device *dev, size_t size, 62 + dma_addr_t *dma_handle, gfp_t flags, 63 + struct dma_attrs *attrs) 61 64 { 62 65 struct dma_map_ops *ops = get_dma_ops(dev); 63 - void *ret; 66 + void *cpu_addr; 64 67 65 - ret = ops->alloc(dev, size, dma_handle, flag, NULL); 66 - debug_dma_alloc_coherent(dev, size, *dma_handle, ret); 67 - return ret; 68 + BUG_ON(!ops); 69 + 70 + cpu_addr = ops->alloc(dev, size, dma_handle, flags, attrs); 71 + debug_dma_alloc_coherent(dev, size, *dma_handle, cpu_addr); 72 + 73 + return cpu_addr; 68 74 } 69 75 70 - static inline void dma_free_coherent(struct device *dev, size_t size, 71 - void *cpu_addr, dma_addr_t dma_handle) 76 + #define dma_free_coherent(d, s, c, h) dma_free_attrs(d, s, c, h, NULL) 77 + 78 + static inline void dma_free_attrs(struct device *dev, size_t size, 79 + void *cpu_addr, dma_addr_t dma_handle, 80 + struct dma_attrs *attrs) 72 81 { 73 - struct dma_map_ops *dma_ops = get_dma_ops(dev); 82 + struct dma_map_ops *ops = get_dma_ops(dev); 83 + 84 + BUG_ON(!ops); 74 85 75 86 debug_dma_free_coherent(dev, size, cpu_addr, dma_handle); 76 - dma_ops->free(dev, size, cpu_addr, dma_handle, NULL); 87 + ops->free(dev, size, cpu_addr, dma_handle, attrs); 77 88 } 78 89 79 90 #endif /* _ASM_S390_DMA_MAPPING_H */
-8
include/asm-generic/dma-mapping-common.h
··· 214 214 215 215 #define dma_mmap_coherent(d, v, c, h, s) dma_mmap_attrs(d, v, c, h, s, NULL) 216 216 217 - static inline int dma_mmap_writecombine(struct device *dev, struct vm_area_struct *vma, 218 - void *cpu_addr, dma_addr_t dma_addr, size_t size) 219 - { 220 - DEFINE_DMA_ATTRS(attrs); 221 - dma_set_attr(DMA_ATTR_WRITE_COMBINE, &attrs); 222 - return dma_mmap_attrs(dev, vma, cpu_addr, dma_addr, size, &attrs); 223 - } 224 - 225 217 int 226 218 dma_common_get_sgtable(struct device *dev, struct sg_table *sgt, 227 219 void *cpu_addr, dma_addr_t dma_addr, size_t size);
+26
include/linux/dma-mapping.h
··· 263 263 #define dma_unmap_sg_attrs(dev, sgl, nents, dir, attrs) \ 264 264 dma_unmap_sg(dev, sgl, nents, dir) 265 265 266 + #else 267 + static inline void *dma_alloc_writecombine(struct device *dev, size_t size, 268 + dma_addr_t *dma_addr, gfp_t gfp) 269 + { 270 + DEFINE_DMA_ATTRS(attrs); 271 + dma_set_attr(DMA_ATTR_WRITE_COMBINE, &attrs); 272 + return dma_alloc_attrs(dev, size, dma_addr, gfp, &attrs); 273 + } 274 + 275 + static inline void dma_free_writecombine(struct device *dev, size_t size, 276 + void *cpu_addr, dma_addr_t dma_addr) 277 + { 278 + DEFINE_DMA_ATTRS(attrs); 279 + dma_set_attr(DMA_ATTR_WRITE_COMBINE, &attrs); 280 + return dma_free_attrs(dev, size, cpu_addr, dma_addr, &attrs); 281 + } 282 + 283 + static inline int dma_mmap_writecombine(struct device *dev, 284 + struct vm_area_struct *vma, 285 + void *cpu_addr, dma_addr_t dma_addr, 286 + size_t size) 287 + { 288 + DEFINE_DMA_ATTRS(attrs); 289 + dma_set_attr(DMA_ATTR_WRITE_COMBINE, &attrs); 290 + return dma_mmap_attrs(dev, vma, cpu_addr, dma_addr, size, &attrs); 291 + } 266 292 #endif /* CONFIG_HAVE_DMA_ATTRS */ 267 293 268 294 #ifdef CONFIG_NEED_DMA_MAP_STATE