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 */ 13enum dma_attr { 14 DMA_ATTR_WRITE_BARRIER, 15 DMA_ATTR_WEAK_ORDERING, 16 DMA_ATTR_WRITE_COMBINE, 17 DMA_ATTR_NON_CONSISTENT, 18 DMA_ATTR_NO_KERNEL_MAPPING, 19 DMA_ATTR_SKIP_CPU_SYNC, 20 DMA_ATTR_FORCE_CONTIGUOUS, 21 DMA_ATTR_MAX, 22}; 23 24#define __DMA_ATTRS_LONGS BITS_TO_LONGS(DMA_ATTR_MAX) 25 26/** 27 * struct dma_attrs - an opaque container for DMA attributes 28 * @flags - bitmask representing a collection of enum dma_attr 29 */ 30struct dma_attrs { 31 unsigned long flags[__DMA_ATTRS_LONGS]; 32}; 33 34#define DEFINE_DMA_ATTRS(x) \ 35 struct dma_attrs x = { \ 36 .flags = { [0 ... __DMA_ATTRS_LONGS-1] = 0 }, \ 37 } 38 39static inline void init_dma_attrs(struct dma_attrs *attrs) 40{ 41 bitmap_zero(attrs->flags, __DMA_ATTRS_LONGS); 42} 43 44#ifdef CONFIG_HAVE_DMA_ATTRS 45/** 46 * dma_set_attr - set a specific attribute 47 * @attr: attribute to set 48 * @attrs: struct dma_attrs (may be NULL) 49 */ 50static inline void dma_set_attr(enum dma_attr attr, struct dma_attrs *attrs) 51{ 52 if (attrs == NULL) 53 return; 54 BUG_ON(attr >= DMA_ATTR_MAX); 55 __set_bit(attr, attrs->flags); 56} 57 58/** 59 * dma_get_attr - check for a specific attribute 60 * @attr: attribute to set 61 * @attrs: struct dma_attrs (may be NULL) 62 */ 63static inline int dma_get_attr(enum dma_attr attr, struct dma_attrs *attrs) 64{ 65 if (attrs == NULL) 66 return 0; 67 BUG_ON(attr >= DMA_ATTR_MAX); 68 return test_bit(attr, attrs->flags); 69} 70#else /* !CONFIG_HAVE_DMA_ATTRS */ 71static inline void dma_set_attr(enum dma_attr attr, struct dma_attrs *attrs) 72{ 73} 74 75static inline int dma_get_attr(enum dma_attr attr, struct dma_attrs *attrs) 76{ 77 return 0; 78} 79#endif /* CONFIG_HAVE_DMA_ATTRS */ 80#endif /* _DMA_ATTR_H */ 81