有关dma_sync_single_for_cpu()/ dma_sync_single_for_device()

时间:2018-11-11 06:25:54

标签: c linux-kernel dma

我的代码使用流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()之后读取缓冲区)?

1 个答案:

答案 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()将获得所有权。