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