|
|
  |
ALTERA PCIe 4х Chaining DMA, Не могу разобраться как работает |
|
|
|
Oct 22 2012, 13:03
|
Местный
  
Группа: Свой
Сообщений: 454
Регистрация: 3-07-07
Из: С-Петербург
Пользователь №: 28 859

|
Доброго дня!
Есть плата Arria II GX Kit, скачал на него reference design на PCIe 4x. После долгих танцев с бубном удалось установить их Jungo board driver и запустить тест скорости DMA Write. Теперь хочу их reference design изменить под свою задачу - запускать DMA Write по мере наполнения FIFO, в которую поступают 64-разрядные отсчеты данных. Читаю альтеровские доки и не могу разобраться - как у них работает это самое chaining DMA? Куда заносить физический адрес памяти, по которому отправлять данные? Где указывать - сколько данных передавать по DMA Write? Как запустить передачу? Непонятен сам принцип работы chaining dma. дескрипторы какие-то. где из брать? Лет пять назад делал PCIe 8x на старом Stratix II GX. Там было все просто - взял пример simple dma, подключил вместо тестового счетчика свой источник данных, выделил память в драйвере и передал физический адрес в плату, указал количество передаваемых данных - и все замечательно работало, и работает до сих пор. А тут решили перейти на Arria II GX, а ref design только для chaining dma. И ничего общего с тем, что было раньше на Stratix.
Если кто уже разбирался с этим - помогите, пожалуйста.
|
|
|
|
|
Oct 23 2012, 14:17
|

Знающий
   
Группа: Свой
Сообщений: 680
Регистрация: 11-02-08
Из: Msk
Пользователь №: 34 950

|
По порядку Таблица дескрипторов прописывается в некую область памяти ( делает это обычно процессор, хотя возможны варианты ). Софт, который это делает, назовем драйвером, если вам так удобно. Таблиц дескрипторов может быть несколько. Есть режимы, когда ДМА контроллер работает одновременно с двумя таблицами (к примеру, т.н. режим pig-pong). Можно заранее прописать несколько таблиц дескрипторов и скармливать их ДМА по очереди. Когда ДМА доходил то конца таблицы, формируется прерывание. Встречал вариант, когда прерывание выставляется на каждый 1/2/4/8/16 и т.д. дескриптор - т.е. многократно. Именно так ДМА контроллер сообщает процессору, что данные отправлены/приняты. В некоторых случаях может использоваться система семафоров - процессор открывает, дма закрывает. по статусу семафора видно, в каком месте таблицы работает ДМА. Драйвер же, получив прерывание ДМА, должен забрать (режим чтения) либо подготовить (режим записи) данные, подсунуть новую таблицу, ... и т.д. и т.п. - вариантов что делать драйверу много, зависят от типа ДМА.
Я говорю только общие вещи, поскольку реализация ДМА у альтеры мне не известна, а читать доки нет времени, сорри ) Может быть кто то ответит, кто в теме
|
|
|
|
|
Oct 26 2012, 16:46
|
Профессионал
    
Группа: Свой
Сообщений: 1 700
Регистрация: 2-07-12
Из: дефолт-сити
Пользователь №: 72 596

|
немного теории. как известно, DMA может читать и писать только линейно непрерывные области физической памяти. Scatter-Gather DMA избавляет от требования по непрерывности. В общем случае принцип такой - драйвер записывает в бар адрес дескриптора (либо таблицы с дескрипторами - массив указателей на указатели). DMA-контроллер вычитывает их себе, и пишет по адресам, указанным в дескрипторах. Максимальный размер выделяемого непрерывного участка памяти зависит от операционки. Соответствующий кусок (или куча кусочков) памяти выделяется в драйвере. Например, для Linux - линейно можно выделить только стандартные 4к (больше можно сделать только накатывая специальные патчи на ядро, на такой фигней уже давно никто не занимаетя). В WinXP можно линейно выделить и 128М, при этом на время выделения всё подвиснет, бывает подвисает секунд на 30 ;-) пока переместит куски программ по другим местам. (предельного значения явно не задано, но при попытке выделить чтото достаточно большого объема драйверу просто выдается ошибка - недостаточно памяти, и в зависимости от степени кривости написания драйвера, всё может упасть в синий экран) В Win7 коллеги говорили что максимальный размер уменьшили, но насколько точно - не скажу. соответственно, в Linux например, можно за 1 раз загнать в контроллер 4кбайт дескрипторов, и по ним записать за 1 прерывание 4М памяти для 32-битных архитектур.
Далее всё зависит от специфики вашего приложения. Если все данные надо передавать пользовательской программе (aka в userspace) - то у вас проблемы. Например в Linux обратиться к памяти, выделенной драйвером, из пользовательской программы нельзя - соответственно будет копирование памяти, на чём может потеряться прилично производительности. В WinXP доступ получить можно, а вот в Win7 тоже будут проблемы, либо придется запускать "с правами Администратора". Либо как вариант переносить всю обработку в драйвер, но это чревато.
А вообще, прежде чем тащить "всё что прилетело" (это я про 8 гиг памяти, занятой данными) к процессору - лишний раз подумайте, допустимы ли дропы в вашем комплексе, и если нет - то обрабатывайте аппаратно, а через PCIe тащите только результаты.
Сообщение отредактировал krux - Oct 26 2012, 16:52
--------------------
провоцируем неудовлетворенных провокаторов с удовольствием.
|
|
|
|
|
Oct 26 2012, 17:32
|
Местный
  
Группа: Свой
Сообщений: 454
Регистрация: 3-07-07
Из: С-Петербург
Пользователь №: 28 859

|
Спасибо, krux, за полезную информацию. Потери данных (дропы, если правильно понял) у меня не допустимы. Все поступающие данные надо передавать пользовательской программе. Но пока что планирую работать в режиме старт-стоп. Закачать данные из платы в память, остановить DMA, затем обрабатывать в userspace. От промежуточного копирования хотел отказаться, поэтому и спаршивал - как много памяти можно выделить в драйвере.
Кстати, а чем череват перенос обработки в драйвер? Например в ISR или DPC. Я понимаю, что надолго занимать эти процессы не имею права, но вот на сколько можно притормозить, например Isr? Все-таки выполнение ISR обладает высочайшим приоритетом, по сравнению с потоками в userspace.
|
|
|
|
|
Oct 26 2012, 18:29
|
Профессионал
    
Группа: Свой
Сообщений: 1 700
Регистрация: 2-07-12
Из: дефолт-сити
Пользователь №: 72 596

|
Дропы - да, потери данных.
Для Linux перенос большого количества кода в ISR приводит к тому, что ядро видит (через rdtsc и подобные механизмы) что ISR выполняется слишком долго, считает что это interupt thrashing, и тупо маскирует прерывание, после чего код драйвера больше не вызывается ядром вообще. Помогает только перезагрузка.
Про win сейчас точно не скажу, sorry.
В DPC обычно пишут то, что надо бы выполнить по приходу прерывания, но этот кусок кода при этом не является критическим с точки зрения общения непосредственно с железом (DMA-контроллером), поэтому может быть отложен относительно момента вызова ISR. И в нём, в принципе, можно написать довольно много чего. Проблемы - как обычно, с синхронизацией с другими I/O. Например, если вы собираетесь записывать "всё что прилетает" на диски (рейд там, или чтото подобное, для пост-обработки) то мое мнение - что это не взлетит.
Большие объемы данных, насколько мне известно, обрабатывают совсем по другому. Взять хоть тех же LHC (ATLAS/CMS) и их архитектуру переноса real-time triggers (а там по 1,5 гигабайта/сек сырых данных) в их Tier0 storage.
--------------------
провоцируем неудовлетворенных провокаторов с удовольствием.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|