Вопросы о 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() возвращает право собственности

Другие вопросы по тегам