dma_addr_tdma_map_single_attrs(structdevice *dev,void*cpu_addr,size_tsize,enumdma_data_direction dir,unsignedlongattrs) voiddma_unmap_single_attrs(structdevice *dev,dma_addr_tdma_addr,size_tsize,enumdma_data_direction dir,unsignedlongattrs) intdma_map_sg_attrs(structdevice *dev,structscatterli...
16 void dma_unmap_single_attrs(struct device *dev, dma_addr_t addr, 17 size_t size, 18 enum dma_data_direction dir, 19 unsigned long attrs) page映射 1 dma_addr_t dma_map_page(struct device *dev, struct page *page, 2 size_t offset, size_t size, 3 enum dma_data_direction dir)...
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) //...
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_page(ptr
debug_dma_map_single(dev, ptr, size); return dma_map_page_attrs(dev, virt_to_page(ptr), offset_in_page(ptr), size, dir, attrs); } static inline void dma_unmap_single_attrs(struct device *dev, dma_addr_t addr, size_t size, enum dma_data_direction dir, unsigned long attrs) ...
我们知道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_map_single流程如下:dma_map_single dma_map_single_attrs ops->map_page 没有iommu的话会走__swiotlb_map_page。 大题流程如下:
debug_dma_map_single(dev, ptr, size); return dma_map_page_attrs(dev, virt_to_page(ptr), offset_in_page(ptr), size, dir, attrs); } static inline void dma_unmap_single_attrs(struct device *dev, dma_addr_t addr, size_t size, enum dma_data_direction dir, unsigned long attrs) ...
dma_map_single(struct device *dev, void *cpu_addr, size_t size, enum dma_data_direction direction) 映射一块处理器的虚拟地址,这样可以让外设访问。该函数返回内存的物理地址。 在dma_API中强烈建议使用表示DMA传输方向的枚举类型。 DMA_NONE 仅用于调试目的 ...
{debug_dma_map_single(dev,ptr,size);returndma_map_page_attrs(dev,virt_to_page(ptr),offset_in_page(ptr),size,dir,attrs);}staticinlinevoiddma_unmap_single_attrs(struct device*dev,dma_addr_t addr,size_t size,enumdma_data_direction dir,unsigned long attrs){returndma_unmap_page_attrs(dev,...