Linux之DMA API -- 通用设备的动态DMA映射(三)

2014-11-24 10:38:54 · 作者: · 浏览: 1
ruct scatterlist *sg, int nelems,
enum dma_data_direction direction)


void dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nelems,
enum dma_data_direction direction)


为CPU及外设同步single contiguous或分散/聚集映射。


注意:你必须要做这个工作,


dma_addr_t
dma_map_single_attrs
(struct device *dev, void *cpu_addr, size_t size,
enum dma_data_direction dir,
struct dma_attrs *attrs)


void
dma_unmap_single_attrs
(struct device *dev, dma_addr_t dma_addr,
size_t size, enum dma_data_direction dir,
struct dma_attrs *attrs)


int
dma_map_sg_attrs
(struct device *dev, struct scatterlist *sgl,
int nents, enum dma_data_direction dir,
struct dma_attrs *attrs)


void
dma_unmap_sg_attrs
(struct device *dev, struct scatterlist *sgl,
int nents, enum dma_data_direction dir,
struct dma_attrs *attrs)


这四个函数除了传入可选的struct dma_attrs*之外,其他和不带_attrs后缀的函数一样。


struct dma_attrs概述了一组DMA属性。struct dma_attrs详细定义请参见linux/dma-attrs.h。


DMA属性的定义是和体系结构相关的,并且Documentation/DMA-attributes.txt有详细描述。


如果struct dma_attrs* 为空,则这些函数可以认为和不带_attrs后缀的函数相同。


下面给出一个如何使用*_attrs 函数的例子,当进行DMA内存映射时,如何传入一个名为DMA_ATTR_FOO的属性:


#include
/* DMA_ATTR_FOO should be defined in linux/dma-attrs.h and
* documented in Documentation/DMA-attributes.txt */
...
DEFINE_DMA_ATTRS(attrs);
dma_set_attr(DMA_ATTR_FOO, &attrs);
....
n = dma_map_sg_attrs(dev, sg, nents, DMA_TO_DEVICE, &attr);
....


在映射/取消映射的函数中,可以检查DMA_ATTR_FOO是否存在:


void whizco_dma_map_sg_attrs(struct device *dev, dma_addr_t dma_addr,
size_t size, enum dma_data_direction dir,
struct dma_attrs *attrs)
{
....
int foo = dma_get_attr(DMA_ATTR_FOO, attrs);
....
if (foo)
/* twizzle the frobnozzle */
....