每个 dma_map_single 调用都需要相应的 dma_unmap_single 吗?

2024-02-25

我正在将大型代码库移植到 Linux 内核设备驱动程序。 ASIC 使用大量 DMA 通道。

我用kmalloc内存GFP_KERNEL|GFP_DMA。在启动 DMA 之前,我使用 dma_map_single 获取硬件(物理)内存地址以提供给硬件。 (还会刷新/使 dcache 中的内存无效吗?)有时,在 DMA 完成后,我需要 CPU 访问数据,但这种情况并不常见。在通过代码访问数据之前,我执行 dma_unmap_single 以避免缓存一致性问题。

在我不需要 CPU 访问的情况下,我是否仍然需要调用dma_unmap_single?我是不是该dma_unmap_single每个指针我dma_map_single? Does dma_map_single消耗资源(例如表条目)dma_unmap_single会释放吗?

DMA-API.txt 并不清楚良好的 DMA 内存卫生。

Thanks!


With dma_map_single您映射内存以进行 DMA 传输。您获得了指向内存的物理指针,因此设备可以通过 DMA 访问该地址。

With dma_unmap_single您取消映射上面映射的内存。您应该在转账结束后执行此操作。

You can map一个内存区域,并将其用于多个 DMA 传输,然后您unmap当工作完成时。每次想要访问 DMA 内存时,都必须对其进行同步。如果设备要访问内存,你应该这样做dma_sync_single_for_device;如果主机要访问内存,你应该这样做dma_sync_single_for_cpu

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

每个 dma_map_single 调用都需要相应的 dma_unmap_single 吗? 的相关文章

随机推荐