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
调用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()刷新cache,macb_tx_interrupt()的macb_tx_unmap()再调用dma_unmap_single()。 代码简...
我们知道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_map_single(d, a, s, r) dma_map_single_attrs(d, a, s, r, 0) #define dma_unmap_single(d, a, s, r) dma_unmap_single_attrs(d, a, s, r, 0) #define dma_map_sg(d, s, n, r) dma_map_sg_attrs(d, s, n, r, 0) #define dma_unmap_sg(d, s, n, r) ...
dma_alloc_coherent->dma_alloc_attrs 根据是否direct(有smmu),分别调用dma_direct_alloc 或者ops->alloc (dma_map_ops) 见上。 iommu_dma_alloc //根据参数 非连续物理内存: iommu_dma_alloc_remap __iommu_dma_alloc_pages //此处分配非连续的物理页 ...
如果dma_attrs为0,则这些函数的语义与相应的没有_attrs后缀的函数完全相同。因此,dma_map_single_attrs()通常可以替换dma_map_single()等。 以下是使用*_attrs函数的示例,这是如何在为DMA映射内存时传递DMA_ATTR_FOO属性的方法: #include<linux/dma-mapping.h> ...
如果dma_attrs为0,则这些函数的语义与相应的没有_attrs后缀的函数完全相同。因此,dma_map_single_attrs()通常可以替换dma_map_single()等。 以下是使用*_attrs函数的示例,这是如何在为DMA映射内存时传递DMA_ATTR_FOO属性的方法: #include <linux/dma-mapping.h>/* DMA_ATTR_FOO应该在linux/dma-mapping.h中定...
dma_map_single流程如下:dma_map_single dma_map_single_attrs ops->map_page 没有iommu的话会走__swiotlb_map_page。 大题流程如下:
dma_map_single(struct device *dev, void *cpu_addr, size_t size, enum dma_data_direction direction) 映射一块处理器的虚拟地址,这样可以让外设访问。该函数返回内存的物理地址。 在dma_API中强烈建议使用表示DMA传输方向的枚举类型。 DMA_NONE 仅用于调试目的 ...
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()里,...