aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2014-10-10 16:56:08 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2014-10-10 16:56:08 -0400
commit754c780953397dd5ee5191b7b3ca67e09088ce7a (patch)
tree8bdbf8407c8cd917f24a0d5a5c6a865db6366f3c
parent40c43269cf8e88a0bdc306c717d1dd5446a6f3b8 (diff)
parentb4bbb107d73bbc0d92c9ae7fd8e69580aa9381e7 (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.h16
-rw-r--r--arch/s390/Kconfig5
-rw-r--r--arch/s390/include/asm/dma-mapping.h31
-rw-r--r--include/asm-generic/dma-mapping-common.h8
-rw-r--r--include/linux/dma-mapping.h26
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
268static 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
276static 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
497menuconfig PCI 497menuconfig 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
544config NEED_SG_DMA_LENGTH 544config NEED_SG_DMA_LENGTH
545 def_bool PCI 545 def_bool PCI
546 546
547config HAVE_DMA_ATTRS
548 def_bool PCI
549
550config NEED_DMA_MAP_STATE 547config 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
59static 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
61static 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
70static 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
78static 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
217static 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
225int 217int
226dma_common_get_sgtable(struct device *dev, struct sg_table *sgt, 218dma_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
267static 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
275static 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
283static 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