diff options
| author | Arthur Kepner <akepner@sgi.com> | 2008-04-29 04:00:30 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-04-29 11:06:11 -0400 |
| commit | 74bc7ceebfa1c84ddd3a843ebfb56df013bf7ef5 (patch) | |
| tree | 548155250fbc7410273125019c70a7c5c085e895 | |
| parent | d2ba7e2ae206e9ab24e8937d99d0d5513bfd08e5 (diff) | |
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.
[markn@au1.ibm.com: dma_{set,get}_attr() have to be static inline]
Signed-off-by: Arthur Kepner <akepner@sgi.com>
Cc: Tony Luck <tony.luck@intel.com>
Cc: Jesse Barnes <jbarnes@virtuousgeek.org>
Cc: Jes Sorensen <jes@sgi.com>
Cc: Randy Dunlap <randy.dunlap@oracle.com>
Cc: Roland Dreier <rdreier@cisco.com>
Cc: James Bottomley <James.Bottomley@HansenPartnership.com>
Cc: David Miller <davem@davemloft.net>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Grant Grundler <grundler@parisc-linux.org>
Cc: Michael Ellerman <michael@ellerman.id.au>
Signed-off-by: Mark Nelson <markn@au1.ibm.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
| -rw-r--r-- | arch/Kconfig | 3 | ||||
| -rw-r--r-- | arch/ia64/Kconfig | 1 | ||||
| -rw-r--r-- | include/linux/dma-attrs.h | 74 | ||||
| -rw-r--r-- | include/linux/dma-mapping.h | 17 |
4 files changed, 95 insertions, 0 deletions
diff --git a/arch/Kconfig b/arch/Kconfig index 694c9af520..3ea332b009 100644 --- a/arch/Kconfig +++ b/arch/Kconfig | |||
| @@ -36,3 +36,6 @@ config HAVE_KPROBES | |||
| 36 | 36 | ||
| 37 | config HAVE_KRETPROBES | 37 | config HAVE_KRETPROBES |
| 38 | def_bool n | 38 | def_bool n |
| 39 | |||
| 40 | config HAVE_DMA_ATTRS | ||
| 41 | def_bool n | ||
diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig index 07f5d353b5..0df5f6f75e 100644 --- a/arch/ia64/Kconfig +++ b/arch/ia64/Kconfig | |||
| @@ -19,6 +19,7 @@ config IA64 | |||
| 19 | select HAVE_OPROFILE | 19 | select HAVE_OPROFILE |
| 20 | select HAVE_KPROBES | 20 | select HAVE_KPROBES |
| 21 | select HAVE_KRETPROBES | 21 | select HAVE_KRETPROBES |
| 22 | select HAVE_DMA_ATTRS | ||
| 22 | select HAVE_KVM | 23 | select HAVE_KVM |
| 23 | default y | 24 | default y |
| 24 | help | 25 | help |
diff --git a/include/linux/dma-attrs.h b/include/linux/dma-attrs.h new file mode 100644 index 0000000000..1677e2bfa0 --- /dev/null +++ b/include/linux/dma-attrs.h | |||
| @@ -0,0 +1,74 @@ | |||
| 1 | #ifndef _DMA_ATTR_H | ||
| 2 | #define _DMA_ATTR_H | ||
| 3 | |||
| 4 | #include <linux/bitmap.h> | ||
| 5 | #include <linux/bitops.h> | ||
| 6 | #include <linux/bug.h> | ||
| 7 | |||
| 8 | /** | ||
| 9 | * an enum dma_attr represents an attribute associated with a DMA | ||
| 10 | * mapping. The semantics of each attribute should be defined in | ||
| 11 | * Documentation/DMA-attributes.txt. | ||
| 12 | */ | ||
| 13 | enum dma_attr { | ||
| 14 | DMA_ATTR_WRITE_BARRIER, | ||
| 15 | DMA_ATTR_MAX, | ||
| 16 | }; | ||
| 17 | |||
| 18 | #define __DMA_ATTRS_LONGS BITS_TO_LONGS(DMA_ATTR_MAX) | ||
| 19 | |||
| 20 | /** | ||
| 21 | * struct dma_attrs - an opaque container for DMA attributes | ||
| 22 | * @flags - bitmask representing a collection of enum dma_attr | ||
| 23 | */ | ||
| 24 | struct dma_attrs { | ||
| 25 | unsigned long flags[__DMA_ATTRS_LONGS]; | ||
| 26 | }; | ||
| 27 | |||
| 28 | #define DEFINE_DMA_ATTRS(x) \ | ||
| 29 | struct dma_attrs x = { \ | ||
| 30 | .flags = { [0 ... __DMA_ATTRS_LONGS-1] = 0 }, \ | ||
| 31 | } | ||
| 32 | |||
| 33 | static inline void init_dma_attrs(struct dma_attrs *attrs) | ||
| 34 | { | ||
| 35 | bitmap_zero(attrs->flags, __DMA_ATTRS_LONGS); | ||
| 36 | } | ||
| 37 | |||
| 38 | #ifdef CONFIG_HAVE_DMA_ATTRS | ||
| 39 | /** | ||
| 40 | * dma_set_attr - set a specific attribute | ||
| 41 | * @attr: attribute to set | ||
| 42 | * @attrs: struct dma_attrs (may be NULL) | ||
| 43 | */ | ||
| 44 | static inline void dma_set_attr(enum dma_attr attr, struct dma_attrs *attrs) | ||
| 45 | { | ||
| 46 | if (attrs == NULL) | ||
| 47 | return; | ||
| 48 | BUG_ON(attr >= DMA_ATTR_MAX); | ||
| 49 | __set_bit(attr, attrs->flags); | ||
| 50 | } | ||
| 51 | |||
| 52 | /** | ||
| 53 | * dma_get_attr - check for a specific attribute | ||
| 54 | * @attr: attribute to set | ||
| 55 | * @attrs: struct dma_attrs (may be NULL) | ||
| 56 | */ | ||
| 57 | static inline int dma_get_attr(enum dma_attr attr, struct dma_attrs *attrs) | ||
| 58 | { | ||
| 59 | if (attrs == NULL) | ||
| 60 | return 0; | ||
| 61 | BUG_ON(attr >= DMA_ATTR_MAX); | ||
| 62 | return test_bit(attr, attrs->flags); | ||
| 63 | } | ||
| 64 | #else /* !CONFIG_HAVE_DMA_ATTRS */ | ||
| 65 | static inline void dma_set_attr(enum dma_attr attr, struct dma_attrs *attrs) | ||
| 66 | { | ||
| 67 | } | ||
| 68 | |||
| 69 | static inline int dma_get_attr(enum dma_attr attr, struct dma_attrs *attrs) | ||
| 70 | { | ||
| 71 | return 0; | ||
| 72 | } | ||
| 73 | #endif /* CONFIG_HAVE_DMA_ATTRS */ | ||
| 74 | #endif /* _DMA_ATTR_H */ | ||
diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h index 3320307096..952e0f857a 100644 --- a/include/linux/dma-mapping.h +++ b/include/linux/dma-mapping.h | |||
| @@ -146,4 +146,21 @@ static inline void dmam_release_declared_memory(struct device *dev) | |||
| 146 | } | 146 | } |
| 147 | #endif /* ARCH_HAS_DMA_DECLARE_COHERENT_MEMORY */ | 147 | #endif /* ARCH_HAS_DMA_DECLARE_COHERENT_MEMORY */ |
| 148 | 148 | ||
| 149 | #ifndef CONFIG_HAVE_DMA_ATTRS | ||
| 150 | struct dma_attrs; | ||
| 151 | |||
| 152 | #define dma_map_single_attrs(dev, cpu_addr, size, dir, attrs) \ | ||
| 153 | dma_map_single(dev, cpu_addr, size, dir) | ||
| 154 | |||
| 155 | #define dma_unmap_single_attrs(dev, dma_addr, size, dir, attrs) \ | ||
| 156 | dma_unmap_single(dev, dma_addr, size, dir) | ||
| 157 | |||
| 158 | #define dma_map_sg_attrs(dev, sgl, nents, dir, attrs) \ | ||
| 159 | dma_map_sg(dev, sgl, nents, dir) | ||
| 160 | |||
| 161 | #define dma_unmap_sg_attrs(dev, sgl, nents, dir, attrs) \ | ||
| 162 | dma_unmap_sg(dev, sgl, nents, dir) | ||
| 163 | |||
| 164 | #endif /* CONFIG_HAVE_DMA_ATTRS */ | ||
| 165 | |||
| 149 | #endif | 166 | #endif |
