LINUX.ORG.RU

[kernel dev] dma syncing


0

0

Есть pci express устройство, которое пишет данные в память компьютера посредством dma. Память для dma выделяется при помощи pci_alloc_consistent. После завершения транзакции делаю pci_dma_sync_for_cpu, читаю данные из области, потом pci_dma_sync_for_device, запускаю следующую dma передачу и жду подтверждения.

Данные оказываются повреждены. В начале (байтов 300) всё верно, а дальше мусор. Если сделать паузу перед чтением, то целых данных оказывается больше, и так дальше.

Что-то подсказывает, что контроллёр pcie шины буферизирует данные. Как сделать так, что бы после pci_dma_sync_for_cpu данные были уже в памяти полностью?

Ответ на: комментарий от tailgunner

Это возможно, но как проверить? Вообще говоря, если ждать довольно долго, то тогда данные в порядке, но ведь это совсем не то, что мне надо. Т.е. данные то доходять, но только не совсем по спецификации. По спецификации сразу после dma оно прерываение выдаёт, а получается, что после прерывания ещё ждать надо. Вот собственно вопрос, как сделать так, что бы ждать не надо было?

nanoo_linux
() автор топика
Ответ на: комментарий от nanoo_linux

> Это возможно, но как проверить?

Думаю, у твоего устройства есть куча интересных битов состояния.

Вот собственно вопрос, как сделать так, что бы ждать не надо было?

Можно попробовать другой режим - S/G, например (если он есть на устройстве).

Или посмотреть, не запускаешь ли ты S/G режим, в котором прерывания генерируются по каждому дескриптору :)

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Да, есть куча интерестных битов состояния. Один из них dma done. Ну так вот он в 1 установлен, я это в обработчике прерываний проверяю. А больше ничего вроде бы нету, что бы относилось к dma. Есть ещё 'no snoop', 'relaxed ordering', 'traffic class'. Они все в ноль установлены. Пробовал их устанавливать по одному - никакого видимого эффекта.

По поводу scatter/gather - не похоже. По идее это одна транзакция, размером со страницу.

nanoo_linux
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.