dma: add dma_*map*_attrs() interfaces
v5 cover dma: add dma_*map*_attrs() interfaces
v4-v5 changes:
- select HAVE_DMA_ATTRS via Kconfig
- changed the name DMA_ATTR_BARRIER to DMA_ATTR_WRITE_BARRIER
- changed struct dma_attrs to be a wrapper around a bitmap
- kernel-doc-ified some comments
- recombined the lib/swiotlb.c patch into the ia64-arch patch (they need to go in together, or other forward decls are needed)
---
Introduce new interfaces, dma_*map*_attrs(), for passing architecture-specific attributes when memory is mapped and unmapped for DMA. Give the interfaces default implementations which ignore attributes. Also introduce the dma_{set|get}_attr() interfaces for setting and retrieving individual attributes. Define one attribute, DMA_ATTR_WRITE_BARRIER, in anticipation of its use by ia64/sn. Select whether architectures implement arch-specific versions of the dma_*map*_attrs() interfaces via HAVE_DMA_ATTRS in Kconfig.
---
arch/Kconfig | 3 + arch/ia64/Kconfig | 1 include/linux/dma-attrs.h | 74 ++++++++++++++++++++++++++++++++++++++++++++ include/linux/dma-mapping.h | 35 ++++++++++++++++++++ 4 files changed, 113 insertions(+)
arch/Kconfig +3 -0
@@ -36,3 +36,6 @@ config HAVE_KPROBES config HAVE_KRETPROBES def_bool n + +config HAVE_DMA_ATTRS + def_bool n
arch/ia64/Kconfig +1 -0
@@ -19,6 +19,7 @@ config IA64 select HAVE_OPROFILE select HAVE_KPROBES select HAVE_KRETPROBES + select HAVE_DMA_ATTRS default y help The Itanium Processor Family is Intel's 64-bit successor to
include/linux/dma-attrs.h +74 -0
74 lines not on this page · raw message
include/linux/dma-mapping.h +35 -0
@@ -146,4 +146,39 @@ static inline void dmam_release_declared_memory(struct device *dev) }#endif /* ARCH_HAS_DMA_DECLARE_COHERENT_MEMORY */ +#ifndef CONFIG_HAVE_DMA_ATTRS +struct dma_attrs ; + +static inline dma_addr_t dma_map_single_attrs (struct device *dev, +void *cpu_addr,size_t size, +enum dma_data_direction dir, +struct dma_attrs *attrs) +{ +return dma_map_single (dev, cpu_addr, size, dir); +} + +static inline void dma_unmap_single_attrs (struct device *dev, +dma_addr_t dma_addr,size_t size, +enum dma_data_direction dir, +struct dma_attrs *attrs) +{ +return dma_unmap_single (dev, dma_addr, size, dir); +} + +static inline int dma_map_sg_attrs (struct device *dev,struct scatterlist *sgl, +int nents,enum dma_data_direction dir, +struct dma_attrs *attrs) +{ +return dma_map_sg (dev, sgl, nents, dir); +} + +static inline void dma_unmap_sg_attrs (struct device *dev, +struct scatterlist *sgl,int nents, +enum dma_data_direction dir, +struct dma_attrs *attrs) +{ +return dma_unmap_sg (dev, sgl, nents, dir); +} +#endif /* CONFIG_HAVE_DMA_ATTRS */ +#endif
Quoted 10 lines · On Wed, 19 Mar 2008 18:07:09 -0700 [email protected] wrote:
Introduce new interfaces, dma_*map*_attrs(), for passing architecture-specific attributes when memory is mapped and unmapped for DMA. Give the interfaces default implementations which ignore attributes. Also introduce the dma_{set|get}_attr() interfaces for setting and retrieving individual attributes. Define one attribute,
DMA_ATTR_WRITE_BARRIER, in anticipation of its use by ia64/sn. Select whether architectures implement arch-specific versions of the dma_*map*_attrs() interfaces viaHAVE_DMA_ATTRSinKconfig.
alpha allmodconfig:
In file included from include/asm/pci.h:7,
from include/linux/pci.h:953,
from include/asm/core_mcpcia.h:9,
from include/asm/io.h:226,
from arch/alpha/kernel/asm-offsets.c:11:include/linux/dma-mapping.h: In function 'dma_map_single_attrs':include/linux/dma-mapping.h:157: error: implicit declaration of function 'pci_map_single' include/linux/dma-mapping.h:157: error: implicit declaration of function 'alpha_gendev_to_pci' include/linux/dma-mapping.h: In function 'dma_unmap_single_attrs':include/linux/dma-mapping.h:165: error: implicit declaration of function 'pci_unmap_single' include/linux/dma-mapping.h:165: warning: 'return' with a value, in function returning void include/linux/dma-mapping.h: In function 'dma_map_sg_attrs':include/linux/dma-mapping.h:172: error: implicit declaration of function 'pci_map_sg' include/linux/dma-mapping.h: In function 'dma_unmap_sg_attrs':include/linux/dma-mapping.h:180: error: implicit declaration of function 'pci_unmap_sg' include/linux/dma-mapping.h:180: warning: 'return' with a value, in function returning void In file included from include/linux/pci.h:953,
from include/asm/core_mcpcia.h:9,
from include/asm/io.h:226,
from arch/alpha/kernel/asm-offsets.c:11:We're in include hell, I think. alpha defined CONFIG_HAS_DMA, so it has already included asm/dma-mapping.h, which defines pci_map_single(). But I suspect that the compiler skipped that inclusion because it was recursive. Or something.
I will point you at http://userweb.kernel.org/~akpm/cross-compilers/ and run away, sorry.
Quoted 10 lines · Andrew Morton
On Wed, 19 Mar 2008 18:07:09 -0700 [email protected] wrote:
alpha allmodconfig:
In file included from
include/asm/pci.h:7,from include/linux/pci.h:953, from include/asm/core_mcpcia.h:9, from include/asm/io.h:226, from arch/alpha/kernel/asm-offsets.c:11:
Quoted 5 lines
include/linux/dma-mapping.h: In function 'dma_map_single_attrs':include/linux/dma-mapping.h:157: error: implicit declaration of function 'pci_map_single'
....We're in include hell, I think....
Yeah.
Alpha did some macro substitutions differently than on the other platforms I had built and tested with.
The simple fix is to convert the new _attrs()* functions in include/linux/dma-mapping.h into macros.
An updated patch follows. Built for alpha, ia64, x86_64. Tested on ia64 and x86_64.
Signature · 1 line
Arthur