关于 dma_sync_single_for_cpu() / dma_sync_single_for_device() 的问题

Questions about dma_sync_single_for_cpu() / dma_sync_single_for_device()

我的代码使用流 DMA API 将分配的缓冲区映射到 DMA 区域,如下所示:

void perform_dma(void *buffer)
{
    dma_map_single(buffer...  DMA_BIDIRECTIONAL);  <- map buffer to physical address

    ring_doorbell()  -> notify device to read DMA content

    // wait until DMA is done or wake up by interrupts 
    .....

    dma_unmap_single(... , DMA_BIDIRECTIONAL)   <- unmap buffer
}

DMA 方向是双向的,buffer 已分配,在调用 perform_dma() 之前由调用者填充,完成后释放。

我应该使用

是的。您可以在此处查找 in this KernelTLV presentation(幻灯片 13)。那里有关于缓冲区责任的解释。

在演示文稿的示例中,您(驱动程序)可以通过调用 dma_sync_single_for_device().[=] 在设备 dma_sync_single_for_cpu() 和 return 所有权之后更改缓冲区内容。 15=]

这是一个所有权问题。 dma_sync_single_for_device() 将所有权授予 DMA 控制器,其中 dma_sync_single_for_cpu() 重新获得所有权。