这时,内存在给DMA使用之前,就要调用一次dma_map_sg()或dma_map_single(),取决于你的DMA引擎是否支持聚集散列(DMA scatter-gather),支持就用dma_map_sg(),不支持就用dma_map_single()。DMA用完之后要调用对应的unmap接口。 由于协议栈下来的包的数据有可能还在cache里面,调用dma_map_single()后,CPU就会做一次c...
dma_map_sg() 和 dma_unmap_sg() 负责缓存一致性。但是,如果需要使用相同的映射来访问(读/写)DMA传输之间的数据,则必须以适当的方式在每次传输之间同步缓冲区,如果CPU需要访问缓冲区,则使用 dma_sync_sg_for_cpu(); 如果是设备,则使用dma_sync_sg_for_device()。类似的单个区域映射函数有 dma_sync_single...
dma_sync_sg_for_cpu() 和 dma_sync_sg_for_device() 的“nents”参数必须与传递给 dma_map_sg() 的参数相同。它_NOT_ 是 dma_map_sg() 返回的计数。 在最后一次 DMA 传输调用 DMA 取消映射例程 dma_unmap_{single,sg}() 之后。如果您从第一个 dma_map_*() 调用到 dma_unmap_*() 不接触数据...
cpu使用缓冲区之前,应该首先解除映射(在dma_unmap_single()或者dma_unmap_sg()之后)。这是为了缓存 4、对于写入事务(CPU到设备),驱动程序应该在映射之前将数据放入缓冲区 5、必须指定数据移动的方向,只能基于该方向使用数据 为啥在取消映射之前不能访问缓冲区呢?原因很简单:CPU映射是可缓存的。用于流式映射的dma_...
dma_unmap_sg(dev, sglist, nents, direction); 再次确保 DMA 活动已经完成 注意: dma_unmap_sg 调用的“nents”参数必须与您传递给 dma_map_sg 调用的参数相同,它不应该是从 dma_map_sg 调用返回的“计数”值 每个dma_map{single,sg}() 调用都应该有其 dma_unmap{single,sg}() 对应项,因为 DMA 地...
dma_unmap_sg(dev, sglist, nents, direction); 6.2.3 使用流式dma接口过程中,如何在CPU和device之间手动sync dma数据? 如果你需要在一次流式DMA map/unmap过程中多次操作DMA映射地址中的数据,需要代码自行保证CPU和device看到的数据是最新的,这需要用到以下接口: /* 在CPU碰流式dma映射地址里的数据前,需要...
dma_unmap_sg(dev, sglist, nents, direction); 再次强调,调用dma_unmap_sg的时候要确保DMA操作已经完成。另外,传递给dma_unmap_sg的nents参数需要等于传递给dma_map_sg的nents参数,而不是该函数返回的count。 由于DMA地址空间是共享资源,每一次dma_map_{single,sg}() 的调用都需要有其对应的dma_unmap_{si...
Streaming DMA(流式DMA) Streaming DMA在访问内存地址时经过cache,是non-coherence设备,通常采用streaming mapping的API进行内存申请,在单次DMA传输时进行map,在传输完成后进行unmap; 2.2 DMA工作方式分类 从DMA工作方式可以分为2类: Block DMA 硬件DMA设计为一次访问操作需要连续内存地址空间; ...
Linux DMA子系统驱动开发-Streaming DMA在访问内存地址时经过cache,是non-coherence设备,通常采用streaming mapping的API进行内存申请,在单次DMA传输时进行map,在传输完成后进行unmap;
void dma_unmap_sg_attrs(struct device *dev, struct scatterlist *sgl, int nents, enum dma_data_direction dir, unsigned long attrs) The four functions above are just like the counterpart functions without the _attrs suffixes, except that they pass an optional dma_attrs. 除了传递一个可选的 ...