DMA_TO_DEVICE 表示从"主存到设备", DMA_FROM_DEVICE 表示 “从设备到主存”, 它们是 DMA 传输过程中数据移动的方向。 强烈建议您尽可能准确地指定这一点 如果您绝对无法知道 DMA 传输的方向,请指定 DMA_BIDIRECTIONAL。 这意味着 DMA 可以朝任一方向进行。 该平台保证您可以合法地指定这一点,并且它会起作用,...
intdma_map_sg(structdevice*dev,structscatterlist*sglist,intnents,enumdma_data_directiondir){...}参数*dev是设备结构体;参数*sg是scatterlist结构体数组;参数nents是页数,也就是SG缓存块的个数;参数direction是DMA传输方向,它是一个枚举类型变量; 常用的是DMA_TO_DEVICE(内存→外设)和DMA_FROM_DEVICE(外设...
dma_sync_single_for_device(denali->dev, addr, size, DMA_FROM_DEVICE); clear_interrupts(denali); denali_setup_dma(denali, DENALI_READ);/* wait for operation to complete */wait_for_irq(denali, irq_mask);dma_sync_single_for_cpu(denali->dev, addr, size, DMA_FROM_DEVICE); denali_enable...
DMA_TO_DEVICE同步必须在软件最后修改内存区域之后,并在将其交给设备之前进行。一旦使用此原语,此原语覆盖的内存应被设备视为只读。如果设备可能随时对其进行写入,则应该使用DMA_BIDIRECTIONAL(见下文)。 DMA_FROM_DEVICE同步必须在驱动程序访问可能被设备更改的数据之前进行。驱动程序应将此内存视为只读。如果驱动程序需要...
设备驱动里一般调用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()刷新cache,macb_tx...
intdma_set_mask(struct device*dev,u64 mask); 一致分配的设置是通过调用dma_set_coherent_mask()来执行的 intdma_set_coherent_mask(struct device*dev,u64 mask); 这里,dev 是指向设备的设备结构的指针,mask 是描述设备支持的地址的哪些位的位掩码。 通常,设备的设备结构嵌入在设备的总线特定设备结构中...
DMA_FROM_DEVICE); if (unlikely(dma_mapping_error(info->device, info->txaddr))) { ret = -ENOMEM; dev_err(info->device, "DMA read map failed\n"); goto dma_map_err; } /* apply DMA slave and client */ as353x_nand_dma_init_tx(info); ...
b、DMA_FROM_DEVICE:把cache的数据置无效,用于dma已经传输完毕产生中断之后,准备从内存读取到驱动的buffer中。如果不把cache的数据置无效, 那么cpu就会直接从cache中取出旧的数据,不会到内存中去拿新的数据; c、DMA_BIDIRECTIONAL跟DMA_TO_DEVICE的效果一样。
设备驱动里一般调用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()刷新cache,macb_tx...
static void dmaengine_debug_register(struct dma_device *dma_dev) { dma_dev->dbg_dev_root = debugfs_create_dir(dev_name(dma_dev->dev), rootdir); if (IS_ERR(dma_dev->dbg_dev_root)) dma_dev->dbg_dev_root = NULL;