dma: add dma_*map*_attrs() interfaces

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.

[[email protected]: dma_{set,get}_attr() have to be static inline]
Signed-off-by: Arthur Kepner <[email protected]>
Cc: Tony Luck <[email protected]>
Cc: Jesse Barnes <[email protected]>
Cc: Jes Sorensen <[email protected]>
Cc: Randy Dunlap <[email protected]>
Cc: Roland Dreier <[email protected]>
Cc: James Bottomley <[email protected]>
Cc: David Miller <[email protected]>
Cc: Benjamin Herrenschmidt <[email protected]>
Cc: Grant Grundler <[email protected]>
Cc: Michael Ellerman <[email protected]>
Signed-off-by: Mark Nelson <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
Arthur Kepner authored and Linus Torvalds committed 2008-04-29 08:06:11 -07:00
1 parent d2ba7e2ae2
commit 74bc7ceebf
4 files changed
+95

No files matched your search

+3
View File
@@ -36,3 +36,6 @@ config HAVE_KPROBES
config HAVE_KRETPROBES
def_bool n
config HAVE_DMA_ATTRS
def_bool n
+1
View File
@@ -19,6 +19,7 @@ config IA64
select HAVE_OPROFILE
select HAVE_KPROBES
select HAVE_KRETPROBES
select HAVE_DMA_ATTRS
select HAVE_KVM
default y
help
+74
View File
@@ -0,0 +1,74 @@
#ifndef _DMA_ATTR_H
#define _DMA_ATTR_H
#include <linux/bitmap.h>
#include <linux/bitops.h>
#include <linux/bug.h>
/**
* an enum dma_attr represents an attribute associated with a DMA
* mapping. The semantics of each attribute should be defined in
* Documentation/DMA-attributes.txt.
*/
enum dma_attr {
DMA_ATTR_WRITE_BARRIER,
DMA_ATTR_MAX,
};
#define __DMA_ATTRS_LONGS BITS_TO_LONGS(DMA_ATTR_MAX)
/**
* struct dma_attrs - an opaque container for DMA attributes
* @flags - bitmask representing a collection of enum dma_attr
*/
struct dma_attrs {
unsigned long flags[__DMA_ATTRS_LONGS];
};
#define DEFINE_DMA_ATTRS(x) \
struct dma_attrs x = { \
.flags = { [0 ... __DMA_ATTRS_LONGS-1] = 0 }, \
}
static inline void init_dma_attrs(struct dma_attrs *attrs)
{
bitmap_zero(attrs->flags, __DMA_ATTRS_LONGS);
}
#ifdef CONFIG_HAVE_DMA_ATTRS
/**
* dma_set_attr - set a specific attribute
* @attr: attribute to set
* @attrs: struct dma_attrs (may be NULL)
*/
static inline void dma_set_attr(enum dma_attr attr, struct dma_attrs *attrs)
{
if (attrs == NULL)
return;
BUG_ON(attr >= DMA_ATTR_MAX);
__set_bit(attr, attrs->flags);
}
/**
* dma_get_attr - check for a specific attribute
* @attr: attribute to set
* @attrs: struct dma_attrs (may be NULL)
*/
static inline int dma_get_attr(enum dma_attr attr, struct dma_attrs *attrs)
{
if (attrs == NULL)
return 0;
BUG_ON(attr >= DMA_ATTR_MAX);
return test_bit(attr, attrs->flags);
}
#else /* !CONFIG_HAVE_DMA_ATTRS */
static inline void dma_set_attr(enum dma_attr attr, struct dma_attrs *attrs)
{
}
static inline int dma_get_attr(enum dma_attr attr, struct dma_attrs *attrs)
{
return 0;
}
#endif /* CONFIG_HAVE_DMA_ATTRS */
#endif /* _DMA_ATTR_H */
+17
View File
@@ -146,4 +146,21 @@ 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;
#define dma_map_single_attrs(dev, cpu_addr, size, dir, attrs) \
dma_map_single(dev, cpu_addr, size, dir)
#define dma_unmap_single_attrs(dev, dma_addr, size, dir, attrs) \
dma_unmap_single(dev, dma_addr, size, dir)
#define dma_map_sg_attrs(dev, sgl, nents, dir, attrs) \
dma_map_sg(dev, sgl, nents, dir)
#define dma_unmap_sg_attrs(dev, sgl, nents, dir, attrs) \
dma_unmap_sg(dev, sgl, nents, dir)
#endif /* CONFIG_HAVE_DMA_ATTRS */
#endif