Вопросы о dma_sync_single_for_cpu() / dma_sync_single_for_device()
Мой код использует API потокового DMA для сопоставления выделенного буфера с областью 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()
)
1 ответ
Да. Вы можете посмотреть здесь в этой презентации KernelTLV (слайд 13). Там есть объяснение относительно ответственности буфера.
В примере в презентации сказано, что вы (драйвер) можете изменить содержимое буфера после dma_sync_single_for_cpu()
и вернуть право собственности на устройство, позвонив dma_sync_single_for_device()
,
Это вопрос собственности. dma_sync_single_for_device()
предоставляет право собственности на контроллер DMA, где dma_sync_single_for_cpu()
возвращает право собственности