mutagen 0 6 октября, 2015 Опубликовано 6 октября, 2015 · Жалоба Здравствуйте! Хотелось бы спросить у знатоков о следующей ситуации: Используется 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 в данном случае ? Ведь могут быть ситуации, когда записанные в память данные, потребитель обрабатывает с меньшей скоростью. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 10 октября, 2015 Опубликовано 10 октября, 2015 · Жалоба Если потом не освободить и не передать корке DMA новые дескрипторы, то естественно пропадает сигнал TREADY и еще неожиданно появляется ошибка-прерывание(флаг Err_irq в 14 бите регистра S2MM_DMASR) и после этого корка не работает без сброса. В моём случае нормально работает: закончились дескрипторы - DMA остановился (состояние IDLE), добавили новые дескрипторы - работает дальше (использую свой драйвер). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mutagen 0 11 октября, 2015 Опубликовано 11 октября, 2015 · Жалоба В моём случае нормально работает: закончились дескрипторы - DMA остановился (состояние IDLE), добавили новые дескрипторы - работает дальше (использую свой драйвер). Подскажите плз какие прерывания разрешаете в регистре DMACR, все 3 (ERR_IrqEn, Dly_IrqEn, IOC_IrqEn) ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 11 октября, 2015 Опубликовано 11 октября, 2015 · Жалоба Подскажите плз какие прерывания разрешаете в регистре DMACR, все 3 (ERR_IrqEn, Dly_IrqEn, IOC_IrqEn) ? ERR_IrqEn, IOC_IrqEn Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mutagen 0 13 октября, 2015 Опубликовано 13 октября, 2015 · Жалоба Немного уточню вопрос после поисков проблемы. Суть в том, что 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 должно остановиться, а не продолжать загружать дескрипторы. А я вижу противоположное. Что-то я не так видимо понимаю... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 13 октября, 2015 Опубликовано 13 октября, 2015 · Жалоба Что-то похожее возникало в начале работы с DMA, сейчас даже не могу повторить данную ошибку. Может быть всё дело в последовательности настройки/запуска DMA, у меня всё сделано по даташиту: 0) Инициализация кольца дескрипторов 1) Сброс DMA 2) Запись Current Descriptor 3) Установка Start-bit 4) Разрешение прерываний 5) Запись Tail Descriptor Далее софт просто возвращает обработанные дескрипторы, стирает в дескрипторе бит Compl и записывает дескриптор в Tail. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mutagen 0 14 октября, 2015 Опубликовано 14 октября, 2015 · Жалоба В принципе также настраиваю. Ваш драйвер не тормозит S2MM канал обнулением бита Start ? И кстати какая версия DMA используется (у меня 6.03а)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 14 октября, 2015 Опубликовано 14 октября, 2015 · Жалоба В принципе также настраиваю. Ваш драйвер не тормозит 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 всегда записываем дескриптор из кольца, немного не соответствует описанию работы в документе, но работает. Может у Вас такая же ситуация? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mutagen 0 14 октября, 2015 Опубликовано 14 октября, 2015 (изменено) · Жалоба Спасибо за информацию! Почитал ДШ на 7.1. В моей версии 6.03а еще нету настройки режима Cyclic. Тут дело оказалось в другом. Первоначально я настроил корку в режим Multichannel. Сегодня перевел в одноканальный режим для теста, и о чудо - корка начала тормозиться, когда доходит до последнего дескриптора и продолжает работать после обновления TAIL'а! Как в ДШ описано. Нашел неприятное ограничение для многоканального режима : "Does not support descriptor queuing in S2MM path for multichannel mode". В 7.1 оно тоже есть. Видимо это и есть тот случай, когда корка непрерывно дескрипторы загружает. Изменено 14 октября, 2015 пользователем Denis C Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 14 октября, 2015 Опубликовано 14 октября, 2015 · Жалоба А какую производительность DMA получаете для Вашей шины данных и частоты тактирования? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mutagen 0 14 октября, 2015 Опубликовано 14 октября, 2015 · Жалоба В Simple Mode было что-то типа ~550 Мбайт/c. В SG режиме еще не измерял. Все шины данных по 32 бита на частоте 200 Мгц. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться