关于 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()
之前由调用者填充,完成后释放。
我应该使用
dma_sync_single_for_device()
在调用 dma_map_single()
之后(但在通知设备执行 DMA 之前)
和
dma_sync_single_for_cpu()
就在 dma_unmap_single()
之前(因为缓冲区将在 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()
重新获得所有权。
我的代码使用流 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()
之前由调用者填充,完成后释放。
我应该使用
dma_sync_single_for_device()
在调用dma_map_single()
之后(但在通知设备执行 DMA 之前)
和
dma_sync_single_for_cpu()
就在dma_unmap_single()
之前(因为缓冲区将在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()
重新获得所有权。