Linux: согласованность кэша после DMALinux

Anonymous
Linux: согласованность кэша после DMA

Сообщение Anonymous »

В драйвере ядра Linux перед запуском DMA из устройства в ОЗУ я вызываю:

Код: Выделить всё

DmaHandle = dma_map_single (sDevice, VirtualAddress + Offset, Size, DMA_FROM_DEVICE);
dma_sync_single_for_device (sDevice, DmaHandle, Size, DMA_FROM_DEVICE);
После завершения DMA я звоню:

Код: Выделить всё

dma_sync_single_for_cpu (sDevice, DmaHandle, Size, DMA_FROM_DEVICE)
dma_unmap_single (sDevice, DmaHandle, Size, DMA_FROM_DEVICE)
Это работает.
Но у меня также есть еще один DMA от устройства к оперативной памяти.
Этот DMA инициирован, но мы не можем подождите, пока он закончится.
Мы опрашиваем регистр «Счетчик приема», который сообщает нам, сколько байтов мы получили.
Предположим, мы получили 128 байтов.
Мне нужно немедленно прочитать эти байты и обработать их. их.
Для этого я звоню:

Код: Выделить всё

DmaHandle = dma_map_single (sDevice, VirtualAddress, ReceiveCount, DMA_FROM_DEVICE);
dma_sync_single_for_device (sDevice, DmaHandle, ReceiveCount, DMA_FROM_DEVICE);

dma_sync_single_for_cpu (sDevice, DmaHandle , ReceiveCount, DMA_FROM_DEVICE)
dma_unmap_single (sDevice, DmaHandle , ReceiveCount, DMA_FROM_DEVICE)
Я делаю это каждый раз, когда «Счетчик приема» > 0.
Виртуальный адрес увеличивается каждый раз в соответствии с регистром «Счетчик приема».
Как вы думаете, это сработает?

Подробнее здесь: https://stackoverflow.com/questions/785 ... -after-dma

Вернуться в «Linux»