0

我正在编写需要在多个 PCIE 设备之间进行 DMA 内存的自定义 linux 驱动程序。我有以下情况:

  1. 我正在使用 dma_alloc_coherent 为 DeviceA 分配内存
  2. 然后我使用 DeviceA 来填充内存缓冲区。

到目前为止一切都很好,但此时我想将内存 DMA 到 DeviceB,但我不确定这样做的正确方法。

现在,我使用在 DeviceA 上调用的 dma_alloc_coherent 返回的地址为 DeviceB 调用 dma_map_single。这似乎在 x86_64 中运行良好,但感觉就像我违反了规则,因为:

  1. dma_map_single 应该使用从 kmalloc(“和朋友”)分配的内存来调用。使用从另一个设备的 dma_alloc_coherent 调用返回的地址调用是否有问题?

  2. 如果 #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

4

1 回答 1

0
  1. dma_alloc_coherent()行为类似于__get_free_pages()但作为大小粒度而不是页面,所以我猜这里没有问题。
  2. 对于任何特定于平台的问题,dma_mapping_error()请先致电。流式 DMA 操作使用助手来保持设备和 CPU 同步。至少需要,因为设备修改的缓冲区访问状态需要在 CPU 使用之前同步。dma_map_single()dma_sync_*()dma_sync_single_for_cpu()
于 2021-07-27T07:36:22.730 回答