diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-10-10 16:56:08 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-10-10 16:56:08 -0400 |
| commit | 754c780953397dd5ee5191b7b3ca67e09088ce7a (patch) | |
| tree | 8bdbf8407c8cd917f24a0d5a5c6a865db6366f3c | |
| parent | 40c43269cf8e88a0bdc306c717d1dd5446a6f3b8 (diff) | |
| parent | b4bbb107d73bbc0d92c9ae7fd8e69580aa9381e7 (diff) | |
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()
| -rw-r--r-- | arch/arm/include/asm/dma-mapping.h | 16 | ||||
| -rw-r--r-- | arch/s390/Kconfig | 5 | ||||
| -rw-r--r-- | arch/s390/include/asm/dma-mapping.h | 31 | ||||
| -rw-r--r-- | include/asm-generic/dma-mapping-common.h | 8 | ||||
| -rw-r--r-- | include/linux/dma-mapping.h | 26 |
5 files changed, 48 insertions, 38 deletions
diff --git a/arch/arm/include/asm/dma-mapping.h b/arch/arm/include/asm/dma-mapping.h index c45b61a4b4a5..85738b200023 100644 --- a/arch/arm/include/asm/dma-mapping.h +++ b/arch/arm/include/asm/dma-mapping.h | |||
| @@ -265,22 +265,6 @@ extern int arm_dma_mmap(struct device *dev, struct vm_area_struct *vma, | |||
| 265 | void *cpu_addr, dma_addr_t dma_addr, size_t size, | 265 | void *cpu_addr, dma_addr_t dma_addr, size_t size, |
| 266 | struct dma_attrs *attrs); | 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 | * This can be called during early boot to increase the size of the atomic | 269 | * This can be called during early boot to increase the size of the atomic |
| 286 | * coherent DMA pool above the default value of 256KiB. It must be called | 270 | * coherent DMA pool above the default value of 256KiB. It must be called |
diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig index 05c78bb5f570..296391395b95 100644 --- a/arch/s390/Kconfig +++ b/arch/s390/Kconfig | |||
| @@ -496,8 +496,8 @@ config QDIO | |||
| 496 | 496 | ||
| 497 | menuconfig PCI | 497 | menuconfig PCI |
| 498 | bool "PCI support" | 498 | bool "PCI support" |
| 499 | default n | ||
| 500 | depends on 64BIT | 499 | depends on 64BIT |
| 500 | select HAVE_DMA_ATTRS | ||
| 501 | select PCI_MSI | 501 | select PCI_MSI |
| 502 | help | 502 | help |
| 503 | Enable PCI support. | 503 | Enable PCI support. |
| @@ -544,9 +544,6 @@ config HAS_DMA | |||
| 544 | config NEED_SG_DMA_LENGTH | 544 | config NEED_SG_DMA_LENGTH |
| 545 | def_bool PCI | 545 | def_bool PCI |
| 546 | 546 | ||
| 547 | config HAVE_DMA_ATTRS | ||
| 548 | def_bool PCI | ||
| 549 | |||
| 550 | config NEED_DMA_MAP_STATE | 547 | config NEED_DMA_MAP_STATE |
| 551 | def_bool PCI | 548 | def_bool PCI |
| 552 | 549 | ||
diff --git a/arch/s390/include/asm/dma-mapping.h b/arch/s390/include/asm/dma-mapping.h index 3fbc67d9e197..709955ddaa4d 100644 --- a/arch/s390/include/asm/dma-mapping.h +++ b/arch/s390/include/asm/dma-mapping.h | |||
| @@ -56,24 +56,35 @@ static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr) | |||
| 56 | return dma_addr == DMA_ERROR_CODE; | 56 | return dma_addr == DMA_ERROR_CODE; |
| 57 | } | 57 | } |
| 58 | 58 | ||
| 59 | static inline void *dma_alloc_coherent(struct device *dev, size_t size, | 59 | #define dma_alloc_coherent(d, s, h, f) dma_alloc_attrs(d, s, h, f, NULL) |
| 60 | dma_addr_t *dma_handle, gfp_t flag) | 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 | struct dma_map_ops *ops = get_dma_ops(dev); | 65 | struct dma_map_ops *ops = get_dma_ops(dev); |
| 63 | void *ret; | 66 | void *cpu_addr; |
| 67 | |||
| 68 | BUG_ON(!ops); | ||
| 64 | 69 | ||
| 65 | ret = ops->alloc(dev, size, dma_handle, flag, NULL); | 70 | cpu_addr = ops->alloc(dev, size, dma_handle, flags, attrs); |
| 66 | debug_dma_alloc_coherent(dev, size, *dma_handle, ret); | 71 | debug_dma_alloc_coherent(dev, size, *dma_handle, cpu_addr); |
| 67 | return ret; | 72 | |
| 73 | return cpu_addr; | ||
| 68 | } | 74 | } |
| 69 | 75 | ||
| 70 | static inline void dma_free_coherent(struct device *dev, size_t size, | 76 | #define dma_free_coherent(d, s, c, h) dma_free_attrs(d, s, c, h, NULL) |
| 71 | void *cpu_addr, dma_addr_t dma_handle) | 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 | debug_dma_free_coherent(dev, size, cpu_addr, dma_handle); | 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 | #endif /* _ASM_S390_DMA_MAPPING_H */ | 90 | #endif /* _ASM_S390_DMA_MAPPING_H */ |
diff --git a/include/asm-generic/dma-mapping-common.h b/include/asm-generic/dma-mapping-common.h index a9fd248f5d48..3378dcf4c31e 100644 --- a/include/asm-generic/dma-mapping-common.h +++ b/include/asm-generic/dma-mapping-common.h | |||
| @@ -214,14 +214,6 @@ dma_mmap_attrs(struct device *dev, struct vm_area_struct *vma, void *cpu_addr, | |||
| 214 | 214 | ||
| 215 | #define dma_mmap_coherent(d, v, c, h, s) dma_mmap_attrs(d, v, c, h, s, NULL) | 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 | int | 217 | int |
| 226 | dma_common_get_sgtable(struct device *dev, struct sg_table *sgt, | 218 | dma_common_get_sgtable(struct device *dev, struct sg_table *sgt, |
| 227 | void *cpu_addr, dma_addr_t dma_addr, size_t size); | 219 | void *cpu_addr, dma_addr_t dma_addr, size_t size); |
diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h index 931b70986272..d5d388160f42 100644 --- a/include/linux/dma-mapping.h +++ b/include/linux/dma-mapping.h | |||
| @@ -263,6 +263,32 @@ struct dma_attrs; | |||
| 263 | #define dma_unmap_sg_attrs(dev, sgl, nents, dir, attrs) \ | 263 | #define dma_unmap_sg_attrs(dev, sgl, nents, dir, attrs) \ |
| 264 | dma_unmap_sg(dev, sgl, nents, dir) | 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 | #endif /* CONFIG_HAVE_DMA_ATTRS */ | 292 | #endif /* CONFIG_HAVE_DMA_ATTRS */ |
| 267 | 293 | ||
| 268 | #ifdef CONFIG_NEED_DMA_MAP_STATE | 294 | #ifdef CONFIG_NEED_DMA_MAP_STATE |
