gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:45:07 33 4
gpt4 key购买 nike

我的代码使用流 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_map_single() 之后(但在通知设备执行 DMA 之前)dma_sync_single_for_device()

  • dma_sync_single_for_cpu() 就在 dma_unmap_single() 之前(因为调用者将在 perform_dma() 之后读取缓冲区)?

最佳答案

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

在演示文稿的示例中,据说您(驱动程序)可以在 dma_sync_single_for_cpu() 之后更改缓冲区内容,并通过调用 dma_sync_single_for_device() 将所有权返回给设备>.

这是一个所有权问题。 dma_sync_single_for_device() 向 DMA Controller 授予所有权,dma_sync_single_for_cpu() 重新获得所有权。

关于c - 关于 dma_sync_single_for_cpu()/dma_sync_single_for_device() 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53246379/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com