a, s, r, 0)staticinlinedma_addr_tdma_map_single_attrs(structdevice *dev,void*ptr,size_tsize,enumdma_data_direction dir,unsignedlongattrs){debug_dma_map_single(dev, ptr, size);returndma_map_page_attrs(dev,virt_to
我们知道DMA映射有两种方式,一种是一致性映射 dma_alloc_coherent,一种是流式映射 dma_map_single (dma_map_sg可以映射多个dma buffer)。 一致性映射 dma_alloc_coherent dma_alloc_coherent会调用dma_alloc_attrs: static inline void *dma_alloc_attrs(struct device *dev, size_t size, dma_addr_t *dma_...
#define dma_unmap_page(d, a, s, r) dma_unmap_page_attrs(d, a, s, r, 0) 其中对于不支持scatter gather机制的DMA,需要使用dma_map_single或dma_map_page接口。它们的差别在于,dma_map_single会将一块物理上连续的内存,映射为DMA地址,而dma_map_page会将一个内存page映射为DMA地址 由于支持scatter ...
dma_map_single->dma_map_single_attrs->dma_map_page_attrs 根据是否direct(有smmu),分别调用dma_direct_map_page 或者ops->map_page (iommu_dma_map_page) 见上。 iommu_dma_map_page __iommu_dma_map ---见(1) //direct dma_direct_map_page 如果!dma_capable(dev, dma_addr, size, true) //...
dma_map_single/dma_unmap_single的使用 设备驱动里一般调用dma_map_single()/dma_unmap_single()处理cache。调用dma_map_single函数时需要指定DMA的方向,DMA_TO_DEVICE或者DMA_FROM_DEVICE。Linux会根据direction的值invalidate或者clean cache。 drivers\net\ethernet\cadence\macb_main.c的函数macb_tx_map()里,...
dma_map_single流程如下:dma_map_single dma_map_single_attrs ops->map_page 没有iommu的话会走__swiotlb_map_page。 大题流程如下: 收录于合集 #DMA Mapping 3个 上一篇没有IOMMU的DMA操作下一篇DMA和CPU访问内存的一致性问题 喜欢此内容的人还喜欢 ...
如果dma_attrs为0,则这些函数的语义与相应的没有_attrs后缀的函数完全相同。因此,dma_map_single_attrs()通常可以替换dma_map_single()等。 以下是使用*_attrs函数的示例,这是如何在为DMA映射内存时传递DMA_ATTR_FOO属性的方法: #include<linux/dma-mapping.h> ...
dma_map_single流程如下:dma_map_single dma_map_single_attrs ops->map_page 没有iommu的话会走__swiotlb_map_page。 大题流程如下:
我们知道DMA映射有两种方式,一种是一致性映射 dma_alloc_coherent,一种是流式映射 dma_map_single(dma_map_sg可以映射多个dma buffer)。 一致性映射 dma_alloc_coherent dma_alloc_coherent会调用dma_alloc_attrs: 代码语言:javascript 复制 staticinlinevoid*dma_alloc_attrs(struct device*dev,size_t size,dma_...
我们知道DMA映射有两种方式,一种是一致性映射 dma_alloc_coherent,一种是流式映射 dma_map_single (dma_map_sg可以映射多个dma buffer)。 一致性映射 dma_alloc_coherent dma_alloc_coherent会调用dma_alloc_attrs: dma_alloc_coherent->dma_alloc_attrs->swiotlb_alloc->(ma_direct_alloc/swiotlb_alloc_buffer)...