重新提交 DMA 引擎事务

Resubmitting DMA Engine transactions

我正在为嵌入式 SoC 编写自定义高速 Linux SPI 驱动程序。将数据发送到 SPI 外围设备 (DMA_MEM_TO_DEV) 我是 Linux DMA 引擎 API.

https://www.kernel.org/doc/Documentation/dmaengine/client.txt

根据文档,设置和执行 DMA 事务的步骤是:

  1. 分配一个 DMA 从通道:dma_request_channel
  2. 设置从站和控制器特定参数:dmaengine_slave_config
  3. 获取交易描述符:dmaengine_prep_slave_single
  4. 提交交易:dmaengine_submit
  5. 发出挂起的请求并等待回调通知:dma_async_issue_pending

我有这个用于单个 DMA 事务。但是我需要基于一些硬件流控制 (GPIO) 从相同大小 (size_t len) 的相同内存位置 (dma_addr_t buf) 发送多个 DMA 事务。

对于初学者,我尝试为每个 DMA 事务重做步骤 1-5。所以每次流量控制 GPIO IRQ 触发时,我重新分配一个 DMA 从通道,重新设置从和控制器特定参数,...

这似乎也有效,但我不确定这是否是最有效的方法。

我想知道我是否可以重新提交交易(dmaengine_submit)并重新发行(dma_async_issue_pending)?这样会更有效率吗?

我似乎无法在内核文档的任何地方找到任何关于如何重新提交完全相同的 DMA 请求的信息。

您至少需要重新初始化内存源地址、目标地址和长度寄存器,因为它们会在 DMA 事务处理过程中发生变化。我认为每次重做一切都一样快 - 设置不是很多,因此花费的时间是微不足道的。

无需重复步骤 1 和 2。可以对多个事务重复步骤 3 到 5。例如,参见补丁 heredspi_dma_xfer函数可以调用dspi_next_xfer_dma_submit 多次,重做步骤 3 到 5。由于您希望 dma_addr_t buf 相同,据我了解这就是您想要的。