Перейти к содержанию
    

PCI-E + XDMA + пользовательское ПО на х86

Таймер делать не стали, просто анализируем тракт передачи - как только он пустеет, генерируется прерывание. Так получается и проще, и даже быстрее реакция

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всем здраствуйте, сейчас сижу и разбираюсь с XDMA со стороны хоста. Опыта в программировании драйверов нет.

Ситуация такая: на карточке (Ultrascale) есть корка, которая на своей частоте выдает счетчики (два по 16 бит) в FIFO, нарезая их по 2048 байт, а он уже как AXI-Stream подключен к XDMA. При использовании

./dma_from_device -s 0x8000 -f out.bin

внутренняя функция read() дает как количество считанного только половину - 0x4000 (замечу, что не всегда, иногда чуть меньше половины, я связываю это с заполненностью FIFO). Такая же ситуация на других размерах чтения вплоть до размера 2048, при котором, ожидаемо, создается только один запрос на 2048Б и он весь и считывается. Полученный файл out.bin представляет собой файл из 2048 Б валидных настоящих данных и 2048 Б нулей. На графике представлены два счетчика, синий полностью перекрывается оранжевым.

ramp1.thumb.png.7e23dffc7dec144998eaa4a81c97216d.png

Я такое поведение связываю с тем, что драйвер при запросе N > 4096 байт данных решает, что они содержат минимум 4096 валидных данных и предполагает N/4096 транзакций, хотя для моего случая количество транзакций и размер трансфера должен быть, судя по всему, N/2048. Я не смог найти способа (возможно, я просто не умею использовать ioctl) принудительной настройки размера транзакции.

Текущий последний коммит ветки Xilinx на Github добавляет поддержку EOP в драйвер и в инструменты, но по какой-то причине это не улучшает считывание, зато заметна пропажа данных:

ramp2.thumb.png.c849f59852408ab2bd14a988b076bb23.png

Способ использования нескольких вызовов функции read() в целом рабочий и дает непрерывный результат (к слову, не всегда, вероятно есть какая-то проблемка в hw проекте и нужно полностью вычитывать буфер FIFO перед запросом), но, судя по dmesg и отладочном режиме драйвера, такой способ очень расточительный - вместо цепочки DMA запросов создается только один, и происходит много обслуживающих процедур типа xdma engine_start. По таймеру такой подход где-то в 10 раз медленнее функции read() с большим аргументом.

./dma_from_device -s 0x800 -f out.bin -c 32

 Я хочу использовать Xilinx драйвер без изменений, так как уверен, что у них опыта явно больше, чем у меня, но я не понимаю, как правильно работать с драйвером. Также у меня есть ощущение, что пакетный способ передачи данных не совсем подходит для потока и нарезки, и лучше использовать AXI-MM, но с этим подходом очень много непонятного в плане hw-дизайна.

К слову, на Windows с Xilinx API, представленные в Xilinx Answer 65444 данные с запросом read() на 512 KB приходят валидные и без нулей, что заставляет думать, что hw дизайн сделан верно, и проблема только в софте. Алсо, исходники на Windows драйвер лежат в сети

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 29.07.2020 в 19:37, RobFPGA сказал:

Приветствую!

Много вопросов,  сразу не ответишь на все :unknw:

Вы для какой версии/чипа  хотите DMA?  

1.1 Для  режима DMA AXI MM  вам задавать размер BAR не нужно  так как DMA AXI MM  это выход DMA и адреса на ней задаются  в дескрипторах  DMA

DMA bypass AXI  это  мастер шина  адреса на которой отображаются в соответсвующий BAR.  Но слать туда с CPU быстро не получится - для этого нужен внешний DMA ( в PC или на другой карте в контексте 1.3

 

Странно что у вас проблемы со Stream  у меня  несколько проектов с ним работало, но правда исходный пример драйвера  допиливали. Как раз с "нарезкой" (со стороны железа) там все удобно было  tvalid|tready контролируют поток  а tlast делит на пакеты переключаясь на след дескриптор. Со стороны софта  крутился классический кольцевой буфер дескрипторов. 

 

Удачи! Rob.

А Вы не использовали DMA с Zynq Ultrascale+ ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...