我的代码使用流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方向为BIDIRECTIONAL,并且分配了buffer
,在调用perform_dma()
之前由调用方填充,并在完成后释放。
我应该使用
dma_sync_single_for_device()
之后(但在通知设备执行DMA之前)dma_map_single()
和
dma_sync_single_for_cpu()
就在dma_unmap_single()
之前(因为调用者将在perform_dma()
之后读取缓冲区)?答案 0 :(得分:0)
是的。您可以在这里in this KernelTLV presentation(幻灯片13)中查找。那里有关于缓冲区责任的解释。
在演示示例中,您(驱动程序)可以在dma_sync_single_for_cpu()
之后更改缓冲区内容,并通过调用dma_sync_single_for_device()
将所有权返回给设备。
这是所有权问题。 dma_sync_single_for_device()
将所有权授予DMA控制器,其中dma_sync_single_for_cpu()
将获得所有权。