![](/img/trans.png)
[英]Can I call dma_unmap_single after dma_sync_single_for_cpu?
[英]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方向为BIDIRECTIONAL, buffer
已分配,在调用perform_dma()
之前由调用方填充,并在完成后释放。
我应该使用
dma_sync_single_for_device()
之后(但在通知设备执行DMA之前dma_sync_single_for_device()
dma_map_single()
) 和
dma_sync_single_for_cpu()
右前dma_unmap_single()
作为缓冲会被呼叫者之后读取perform_dma()
是。 您可以在此KernelTLV演示文稿 (幻灯片13)中查找。 那里有关于缓冲区责任的解释。
在演示的示例中,据说您(驱动程序)可以在dma_sync_single_for_cpu()
之后更改缓冲区内容,并通过调用dma_sync_single_for_device()
将所有权返回给设备。
这是所有权问题。 dma_sync_single_for_device()
将所有权授予DMA控制器,其中dma_sync_single_for_cpu()
获得所有权。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.