2008-04-29 01:00:30 -07:00
# 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 ,
2008-07-18 23:03:34 +10:00
DMA_ATTR_WEAK_ORDERING ,
2011-12-23 09:30:47 +01:00
DMA_ATTR_WRITE_COMBINE ,
2012-03-28 07:55:56 +02:00
DMA_ATTR_NON_CONSISTENT ,
2008-04-29 01:00:30 -07:00
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 */