DMA_ATTR_SKIP_CPU_SYNC允许平台代码跳过对给定缓冲区的CPU缓存同步,假设它已经被传输到“设备”域。此属性也可用于dma_unmap_{single,page,sg}函数族,以在释放其映射后强制缓冲区保留在设备域中。谨慎使用此属性! DMA_ATTR_FORCE_CONTIGUOUS 默认情况下,DMA映射子系统允许从dma_alloc_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_addr_t *dma_...
static inline void *dma_alloc_attrs(struct device *dev, size_t size, dma_addr_t *dma_handle, gfp_t flag, unsigned long attrs){ const struct dma_map_ops *ops = get_dma_ops(dev); void *cpu_addr; BUG_ON(!ops); if (dma_alloc_from_dev_coherent(dev, size, dma_handle, &cpu_addr...
staticinlinevoid*dma_alloc_attrs(struct device*dev,size_t size,dma_addr_t*dma_handle,gfp_t flag,unsigned long attrs){conststruct dma_map_ops*ops=get_dma_ops(dev);void*cpu_addr;BUG_ON(!ops);if(dma_alloc_from_dev_coherent(dev,size,dma_handle,&cpu_addr))returncpu_addr;if(!arch_dma_...
dma_alloc_coherent会调用dma_alloc_attrs:static inline void *dma_alloc_attrs(struct device *dev, ...
默认情况下,DMA映射子系统允许从dma_alloc_attrs()函数分配的缓冲区由单独的页面组装而成,如果可以将其作为连续块映射到设备DMA地址空间。通过指定此属性,分配的缓冲区将被强制在物理内存中也是连续的。 DMA_ATTR_ALLOC_SINGLE_PAGES 这是对DMA映射子系统的一种提示,表明尝试以提供更好的TLB效率的方式分配内存可能...
u64 mask=get_coherent_dma_mask(dev);structpage *page =NULL;void*addr;boolallowblock, cma;structarm_dma_buffer *buf;structarm_dma_alloc_args args ={ .dev=dev, .size=PAGE_ALIGN(size), .gfp=gfp, .prot=prot, .caller=caller, .want_vaddr= ((attrs & DMA_ATTR_NO_KERNEL_MAPPING) ==...
arm64_swiotlb_dma_ops :alloc函数 static void *__dma_alloc(struct device *dev, size_t size, dma_addr_t *dma_handle, gfp_t flags, unsigned long attrs) { struct page *page; void *ptr, *coherent_ptr; bool coherent = is_device_dma_coherent(dev); pgprot_t prot = __get_dma_pgprot(...
另外这个函数会调用alloc_page()来分配物理页面,所以不要在中断上下文中使用该API 其实现流程如下:dma_alloc_coherent dma_alloc_attrs ops->alloc __dma_alloc static void *__dma_alloc(struct device *dev, size_t size, dma_addr_t *dma_handle, gfp_t flags, ...
另外这个函数会调用alloc_page()来分配物理页面,所以不要在中断上下文中使用该API 其实现流程如下:dma_alloc_coherent dma_alloc_attrs ops->alloc __dma_alloc 代码语言:javascript 复制 staticvoid*__dma_alloc(struct device*dev,size_t size,dma_addr_t*dma_handle,gfp_t flags,unsigned long attrs){struct...