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

Xilinx Microblaze + DMA(Scatter/Gather)

Здравствуйте! Хотелось бы спросить у знатоков о следующей ситуации:

Используется DMA в режиме Scatter/Gather. Отлаживаю канал S2MM. Софт написан на основе примера от Xilinx'а "xaxidma_multichan_sg_intr".

Завел к примеру 8 дескрипторов (1 дескриптор = 1 внешний AXI-stream пакет, кончающийся по сигналу TLAST).

Приходят 8 пакетов. После чего все дескрипторы становятся обработанными (post-processed). Если потом не освободить и не передать корке DMA новые дескрипторы, то естественно пропадает сигнал TREADY и еще неожиданно появляется ошибка-прерывание(флаг Err_irq в 14 бите регистра S2MM_DMASR) и после этого корка не работает без сброса.

Тем, что я не даю корке новые дескрипторы, я пытался эмулировать задержку дальнейшей обработки данных (некий Flow-control организовать). При этом я расчитывал, что корка просто не будет давать сигнал TREADY источнику данных.

Вопрос: как в данной ситуации правильно организовать flow-control S2MM в данном случае ? Ведь могут быть ситуации, когда записанные в память данные, потребитель обрабатывает с меньшей скоростью.

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


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

Если потом не освободить и не передать корке DMA новые дескрипторы, то естественно пропадает сигнал TREADY и еще неожиданно появляется ошибка-прерывание(флаг Err_irq в 14 бите регистра S2MM_DMASR) и после этого корка не работает без сброса.

В моём случае нормально работает: закончились дескрипторы - DMA остановился (состояние IDLE), добавили новые дескрипторы - работает дальше (использую свой драйвер).

 

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


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

В моём случае нормально работает: закончились дескрипторы - DMA остановился (состояние IDLE), добавили новые дескрипторы - работает дальше (использую свой драйвер).

 

Подскажите плз какие прерывания разрешаете в регистре DMACR, все 3 (ERR_IrqEn, Dly_IrqEn, IOC_IrqEn) ?

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


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

Подскажите плз какие прерывания разрешаете в регистре DMACR, все 3 (ERR_IrqEn, Dly_IrqEn, IOC_IrqEn) ?

ERR_IrqEn, IOC_IrqEn

 

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


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

Немного уточню вопрос после поисков проблемы. Суть в том, что DMA загружает ранее уже обработанные дескрипторы (в которых я не очистил флаг CMP). Из-за этого возникает ошибка SGIntErr. Т.е. DMA по дескрипторной цепочке возвращается к началу.

Возникает вопрос по регистрам S2MM_CURDESC и S2MM_TAILDESC:

Допустим выделил 2 дескриптора, установил регистры CURDESC = adr, TAILDESC = adr + 64. После прихода первого пакета CURDESC = TAILDESC = adr+64. После прихода второго пакета регистры вновь CURDESC = adr, TAILDESC = adr + 64.

Хотя в ДШ пишут: "The tail pointer is initialized by software to point to the end of the descriptor chain. This becomes the pause point for hardware. When

hardware begins running, it fetches and processes each descriptor in the chain until it reaches the tail pointer. The AXI DMA then pauses descriptor processing."

Т.е. когда указатели CURDESC и TAILDESC сравняются DMA должно остановиться, а не продолжать загружать дескрипторы. А я вижу противоположное.

Что-то я не так видимо понимаю...

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


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

Что-то похожее возникало в начале работы с DMA, сейчас даже не могу повторить данную ошибку. Может быть всё дело в последовательности настройки/запуска DMA, у меня всё сделано по даташиту:

0) Инициализация кольца дескрипторов

1) Сброс DMA

2) Запись Current Descriptor

3) Установка Start-bit

4) Разрешение прерываний

5) Запись Tail Descriptor

 

Далее софт просто возвращает обработанные дескрипторы, стирает в дескрипторе бит Compl и записывает дескриптор в Tail.

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


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

В принципе также настраиваю. Ваш драйвер не тормозит S2MM канал обнулением бита Start ? И кстати какая версия DMA используется (у меня 6.03а)?

 

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


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

В принципе также настраиваю. Ваш драйвер не тормозит S2MM канал обнулением бита Start ? И кстати какая версия DMA используется (у меня 6.03а)?

Нет не тормозит, генератор трафика работает в непрерывном режиме TCOUNT = 0. Тормозит его TREADY, если закончились дескрипторы.

Версия DMA 7.1 (Vivado 2015.2).

 

 

Похоже, нашёл Вашу проблему, поймал ту ситуацию, что была в начале работы с DMA. При Cyclic = 0, если драйвер успевает вычитывать и обновлять дескрипторы, всё работает нормально. Если заканчиваются дескрипторы, то останавливается (Halted = 1) и выдаёт ошибку (SGIntErr = 1).

 

Эта проблема решается установкой бита Cyclic = 1. Но система работает немного отлично от режима описанного в даташите на DMA. Т.е. у меня используется кольцо дескрипторов, задаю начальный и конечный адрес. Когда дескрипторы заканчиваются DMA останавливается и ждёт (Idle = 1), в Tail Descriptor софт записывает уже обработанные дескрипторы - DMA продолжает работу. Получается, DMA по кругу гоняет дескрипторы, бит Cyclic установлен, а DMA останавливается если Current == Tail.

В Tail Descriptor всегда записываем дескриптор из кольца, немного не соответствует описанию работы в документе, но работает. Может у Вас такая же ситуация?

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


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

Спасибо за информацию! Почитал ДШ на 7.1. В моей версии 6.03а еще нету настройки режима Cyclic.

Тут дело оказалось в другом. Первоначально я настроил корку в режим Multichannel. Сегодня перевел в одноканальный режим для теста, и о чудо - корка начала тормозиться, когда доходит до последнего дескриптора и продолжает работать после обновления TAIL'а! Как в ДШ описано.

Нашел неприятное ограничение для многоканального режима : "Does not support descriptor queuing in S2MM path for multichannel mode". В 7.1 оно тоже есть. Видимо это и есть тот случай, когда корка непрерывно дескрипторы загружает.

Изменено пользователем Denis C

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


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

А какую производительность DMA получаете для Вашей шины данных и частоты тактирования?

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


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

В Simple Mode было что-то типа ~550 Мбайт/c. В SG режиме еще не измерял. Все шины данных по 32 бита на частоте 200 Мгц.

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


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

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

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

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

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

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

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

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

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

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