![](/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.