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