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_...
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 代码语言:javascript 复制 staticvoid*__dma_alloc(struct device*dev,size_t size,dma_addr_t*dma_handle,gfp_t flags,unsigned long attrs){struct...
另外这个函数会调用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, ...
void *dma_alloc_coherent(struct device *dev, size_t size,dma_addr_t *dma_handle, gfp_t flag) 一致性内存是指无论是设备还是处理器的写入,都可以立即被设备或处理器读取,而无需担心缓存效应。(但您可能需要确保在告知设备读取该内存之前刷新处理器的写入缓冲区。) ...
一致性映射 dma_alloc_coherent dma_alloc_coherent会调用dma_alloc_attrs: static inline void *dma_alloc_attrs(struct...coherent && !gfpflags_allow_blocking(flags)) { ...return coherent_ptr; } 其中__alloc_from_pool用来分配 coherent_pool 的内存,__dma_alloc_coherent用来分配 cma 或者 buddy..._...