我正在编写需要在多个 PCIE 设备之间进行 DMA 内存的自定义 linux 驱动程序。我有以下情况:
- 我正在使用 dma_alloc_coherent 为 DeviceA 分配内存
- 然后我使用 DeviceA 来填充内存缓冲区。
到目前为止一切都很好,但此时我想将内存 DMA 到 DeviceB,但我不确定这样做的正确方法。
现在,我使用在 DeviceA 上调用的 dma_alloc_coherent 返回的地址为 DeviceB 调用 dma_map_single。这似乎在 x86_64 中运行良好,但感觉就像我违反了规则,因为:
dma_map_single 应该使用从 kmalloc(“和朋友”)分配的内存来调用。使用从另一个设备的 dma_alloc_coherent 调用返回的地址调用是否有问题?
如果 #1 是“好的”,那么我仍然不确定是否有必要调用 dma_map_single 内存所需的 dma_sync_* 函数。由于内存最初是从 dma_alloc_coherent 分配的,它应该是未缓存的内存,所以我相信答案是“不需要 dma_sync_* 调用”,但我不确定。
我担心我只是幸运地完成了这项工作,未来的内核更新会让我失望,因为目前还不清楚我是否正确地遵循了 API 规则。我的代码最终也必须在 ARM 和 PPC 上运行,所以我需要确保我以独立于平台的方式做事,而不是通过一些 x86_64 架构破解来解决问题。
我将此用作参考: https ://www.kernel.org/doc/html/latest/core-api/dma-api.html