Вопросы о dma_sync_single_for_cpu () / dma_sync_single_for_device () - PullRequest
0 голосов
/ 11 ноября 2018

Мой код использует 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 Ответ

0 голосов
/ 12 ноября 2018

Да. Вы можете посмотреть здесь в этой презентации KernelTLV (слайд 13). Там есть объяснение относительно ответственности буфера.

В примере в презентации сказано, что вы (драйвер) можете изменить содержимое буфера после dma_sync_single_for_cpu() и вернуть право собственности на устройство, вызвав dma_sync_single_for_device().

Это вопрос владения. dma_sync_single_for_device() предоставляет право собственности на контроллер DMA, где dma_sync_single_for_cpu() возвращает право собственности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...