Dav*_*ole 5 linux linux-device-driver linux-kernel
我正在将大型代码库移植到 Linux 内核设备驱动程序。ASIC 使用大量 DMA 通道。
我 kmalloc 内存与GFP_KERNEL|GFP_DMA. 在启动 DMA 之前,我使用 dma_map_single 来获取硬件(物理)内存地址以提供给硬件。(也会刷新/使 dcache 中的内存无效?)我有时需要 CPU 访问数据,一旦 DMA 完成,但不经常。在通过代码访问数据之前,我执行了 dma_unmap_single 以避免缓存一致性问题。
在我不需要 CPU 访问的情况下,我还需要调用dma_unmap_single吗?我应该dma_unmap_single每一个指针dma_map_single吗?是否dma_map_single消耗dma_unmap_single将释放的资源(例如,表条目)?
DMA-API.txt 不清楚良好的 DMA 内存卫生。
谢谢!
与dma_map_single您映射内存以进行 DMA 传输。您获得了指向内存的物理指针,因此设备可以通过 DMA 访问该地址。
随着dma_unmap_single您取消映射上面映射的内存。您应该在转移结束后执行此操作。
您可以映射一个内存区域,并将其用于多个 DMA 传输,然后在作业完成后取消映射。每次您要访问 DMA 存储器时,您都必须对其进行同步。如果设备要访问内存,你应该这样做dma_sync_single_for_device;如果主机要访问内存,您应该这样做dma_sync_single_for_cpu
| 归档时间: |
|
| 查看次数: |
4464 次 |
| 最近记录: |