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

Altera PCI express как лучше реализовать обмен

13 minutes ago, Digi said:

этот блок работает с PCIe Gen2 x4, А у меня х1. С таким интерфейсом он не работает

ясно, не знал, что тут бочечку дегтя подложили. Тогда, если Вам нужен DMA, может отказаться от этой корки PCIe, применить обычную - не memory mapped, поставить блоков памяти сколько Вам нужно, одно-два блока DMA  прикрутить между блоками памяти и txs, и иметь обычные прямые сигналы управления памятью, а не авалон. Да, появится задержка из-за того, что DMA начнет сначала подгружать из памяти в свой внутренний буфер, а только потом пошлет в txs.

Это можно в какой-то мере минимизировать размером буфера DMA и установкой максимально разрешенного размера burst, которое должен осуществлять DMA по потоковой шине.

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


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

Добрался я до реализации DMA. Нашёл, почему Gen2 не работал. Оказалось, что просаживалось питание ПЛИС. Теперь работает Gen2 x4. Кстати, корка, сгенерированная как Gen2 x4 определяется и работает и на на Gen1 x1. Так что есть вероятность того, что это всё будет работать и с DMA тоже. 

Теперь вопрос к знатокам.
  Есть ли готовый блочный драйвер c DMA для работы со штатным режимом DMA PCIe корки ?  Мне нужно прочитать/записать данные из памяти на шине Avalon в память компа.  То что я нашёл, оказался весьма загонным и похоже он работает с Avalon ST а мне, как я понимаю, нужен AvalonMM.
 

 

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


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

54 minutes ago, Digi said:

похоже он работает с Avalon ST а мне, как я понимаю, нужен AvalonMM

А как драйвер (программа в компьютере, работающая под управлением операционной системы) может узнать, что там с другой стороны шины PCIe? И зачем ей это нужно знать?

Если тот драйвер, что Вы нашли, по функционалу Вас устраивает - ИМХО нужно разобраться, как он работает с железякой по ту сторону PCIe (т.е. как запускается обмен с использованием DMA железяки) и либо доработать эту железяку под требования драйвера, чтобы воспринимала команды/информацию от драйвера, либо бодаться с драйвером (изменять его или писать свой).

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


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

1 hour ago, Digi said:

сгенерированная как Gen2 x4 определяется и работает и на на Gen1 x1. Так что есть вероятность

я вот думал, что у меня баг на плате и не придавал значение, но на второй другой плате и чипе точно так же. Вдруг и у вас так же. Прошиваю версией x8, а определяется как x4, еще раз резетю компьютер, чтобы PCIE опросился и при втором резете x8 появляется. Происходит это только тогда, когда перед прошивкой сбросишь питание компьютера (получается и платы). А вот если по готовой прошивке поверх прошить следом, то при резете первом все норм, x8

1 hour ago, Digi said:

 Есть ли готовый блочный драйвер c DMA для работы со штатным режимом DMA PCIe корки ?

можно попробовать подцепить от terasic дрова. Они юзают стандратную avmm корку + весьма модифицированный драйвер альтеры. Пример более менее качественный. Но к сожалению, половину драйвера упаковано в библиотеку, так что придется подстраиваться. Но возможно.
либо брать драйвера альтеры и пробовать модифицировать, но мне кажется его писали студенты.

вообще, я свою первую версию драйвера выкатил месяца через 3-4. Главное понять принципы. Надеюсь альтеровская версия вам подойдет. =)

Кстати у альтеры есть качественный мануал, по шагам рассказывается, что нужно сделать, чтобы стартануть DMA движок у них. Если вкратце по памяти:

1) Создать различные буфера (для RX и TX) в драйвере
2) Создать таблицы дескрипторов в драйвере
3) Качественно проинициализировать со стороны драйвер в карте BAR0 нужными созданными адресами буферов и тд.

И движок стартанет. Дальше только управляете через BAR0 посылками

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

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


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

37 minutes ago, new123 said:

я вот думал, что у меня баг на плате и не придавал значение, но на второй другой плате и чипе точно так же. Вдруг и у вас так же. Прошиваю версией x8, а определяется как x4, еще раз резетю компьютер, чтобы PCIE опросился и при втором резете x8 появляется. Происходит это только тогда, когда перед прошивкой сбросишь питание компьютера (получается и платы). А вот если по готовой прошивке поверх прошить следом, то при резете первом все норм, x8

Я имел ввиду, что корка, собранная под Pcie Gen2 x4 успешно определилась на интерфейсе Gen1 x1. Т.е. если необходимо запустить DMA на Gen1 то можно собрать корку под Gen2 и в теории всё должно заработать

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


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

1 minute ago, Digi said:

Я имел ввиду, что корка, собранная под Pcie Gen2 x4 успешно определилась на интерфейсе Gen1 x1.

а да, это пашет без проблем. Оно там все умному автоматически определяет

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


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

Продолжаю ковырять DMA. Возникли непонятки с описанием регистров

Имею в наличии AN829 (который кстати, если его прошить, не запустился не даёт загрузиться Linux загрузчику. Причём Windows стартует нормально.),  и несколько описаний 

Нашел на интеловском форуме пример описания адресов, которое по смыслу вроде правильное. 

Quote

The low throughput numbers that everyone is seeing in DMA module is due to DMA timeout happening. 

DMA timeout is occurring because the Descriptor controller FIFO addresses for Read and Write in altera_dma.h do not  match the values in FPGA (reported in QSYS).  

The base addresses of wr_dts_slave and rd_dts_slave in QSYS and the defines WR_CTRL_BUF_BASE_* and RD_CTRL_BUF_BASE_* in altera_dma.h should match. 

 

So basically if your addresses in FPGA are: 
rd_dts_slave - 0x1_0000 (Base) 
wr_dts_slave - 0x1_2000 (Base) 

Then altera_dma.h should define:
# define RD_CTRL_BUF_BASE_LOW 0x00010000
# define RD_CTRL_BUF_BASE_HI 0x00000000
# define WR_CTRL_BUF_BASE_LOW 0x00012000
# define WR_CTRL_BUF_BASE_HI 0x00000000

Система

sys.thumb.png.7ac079adeca4c179471ef5b24cbdb6ca.png

В исходниках AN829 написано совершенно не так как советуют на форуме, (да ещё и с опечаткой в исходниках вместо RD_CTRL_BUF_BASE_HI написали WR_CTRL_BUF_BASE_HI )  Но суть не в этом, а в том что адреса в QSys прописаны как 0x8000_0000 для RD и 0x8000_2000 для WR, а в define драйвера прописаны значения, которые указывают на верхний и нижний граничный адрес. 

drv.thumb.png.729f5e96d451d07684ffb0e3a82c6ce6.png

drv_def.png.7cb8d76a30aa1d6d3f8f852669e1cef8.png

В описании от Intel тоже я не сильно понял, написано что сначала нужно прописать адрес по смещению 0x000c, то есть после записи самого себя. И а регистр 0x0008  после того как он же будет прописан. Ну ещё как вариант я сильно туплю и не дружу с английским. Причём в примере AN829 пишется сначала LOW, затем HIGH.

descr.thumb.png.48fee53951be08b82545f672d2b22485.png.

Сам я пробовал делать по разному, но DMA обмен не стартует. Флаги завершения передачи не выставляются. Первый раз читался как 0xff , после - то что записал. Программировал только один канал, на запись из host в avalon. Соответственно для DMA контроллера использовал регистры RD. К контроллеру и шине подключена однопортовая on-chip память одновременно к BAR2, к dma_wr_master и dma_rd_master. 

Так собственно вопрос к прошедшим это, какие должны быть адреса ? И кто первым должен записаться ?

 

 

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


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

Есть подробный мануал от них как по шагам инициировать DMA. сейчас поищу

Я смотрю вы десятую серию подымаете. Совет. Читайте мануал от пятой серии, там много подробного.

https://www.intel.com/content/dam/www/programmable/us/en/pdfs/literature/ug/ug_pcie_avmm_dma.pdf
Раздел Read DMA Example и далее по шагам с примерами адресов.

Чуть позже вам отвечу по вашему примеру, если не понятно будет

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


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

В целом инициализация их движка выглядит так.

1) Выделяем память под буфера и таблицы дескрипторов
image.thumb.png.41b121c7521f8ac35927467e36642019.png

 

2) Заполняем таблицы дескрипторов (эти функции возьмете из исходников, которые сами взяли)
image.thumb.png.1b51822c72d41b63d10524d386081e1e.png

 

3) И погнали заполнять BAR0 нужными адресами выше стоящих буферов и таблиц

image.thumb.png.fb56e49adc138318f953ddb56659cf3c.png

 

4) На всякий случай, константы

image.png.89117df6ed926592c3c5a9a475550fa8.png

 

После этого движок стартанет.

36 minutes ago, Digi said:

К контроллеру и шине подключена однопортовая on-chip память одновременно к BAR2,

Я тоже так делал для отладки. Чтобы сразу в ОС смотреть BAR2 и смотреть что там с памятью происходит.

Перед инициализацией DMA забивал буферы номером дескриптора:
image.thumb.png.13066fdf32629f6e5b7090ebd8b8e3c5.png

 

Потом когда инициируешь пересылку, в BAR2 смотрю, появилась ли там эта куча цифр.

43 minutes ago, Digi said:

да ещё и с опечаткой в исходника

Мне кажется и тут и вообще во многих Example Design много студентов писало =). Я несколько раз уже отправлял bug репорты в интел по десятым сериям (которые еще свежие и не обкатанные) по исправлению исходников.

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


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

49 minutes ago, Digi said:

который кстати, если его прошить, не запустился не даёт загрузиться Linux загрузчику

если есть слаки на частоте корки pcie, то линух фиг загрузишь, есть такое дело. А если загрузишь, то долго он не проживет

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


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

Передачу (DMA_RD) запустил, спасибо огромное за помощь. Думаю и DMA_WR тоже заработает.  Но не пойму, почему не выставляются флаги завершения операции. 

А почему во всех примерах заполняют сразу 128 дескрипторов одним и тем же значением, за исключением номера ? По идее необходимо заполнить только следующий дескриптор, от текущего ?

 

 

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


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

20 minutes ago, Digi said:

Но не пойму, почему не выставляются флаги завершения операции.

а вы правильно смотрите? флаг нужно проверять только на последнем дескрипторе.. то есть, вы отправили дескриптор #3, потом прописали в BAR0 id десприктора для передачи #5, перешлются по dma дескрипторы #4, #5 и флаг нужно смотреть только у пятого, у четвертого нельзя

 

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

20 minutes ago, Digi said:

А почему во всех примерах заполняют сразу 128 дескрипторов одним и тем же значением

приведите пример, я не совсем понял о чем вы.

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

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


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

 

15 minutes ago, new123 said:

а вы правильно смотрите? флаг нужно проверять только на последнем дескрипторе.. то есть, вы отправили дескриптор #3, потом прописали в BAR0 id десприктора для передачи #5, перешлются по dma дескрипторы #4, #5 и флаг нужно смотреть только у пятого, у четвертого нельзя

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

Я пробовал выводить все флаги до передачи и потом через некоторое время после передачи и везде считывал нули. Считывал так же как и в примере.  Хотя очень вероятно, что где то что то не учёл...

16 minutes ago, new123 said:

приведите пример, я не совсем понял о чем вы.

Хотел привести, но похоже я где то запутался. ))) Распутаюсь, думаю вопрос снимется ))

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


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

15 minutes ago, Digi said:

Я пробовал выводить все флаги до передачи и потом через некоторое время после передачи и везде считывал нули. Считывал так же как и в примере.  Хотя очень вероятно, что где то что то не учёл...

быть может вы это очень быстро делаете? =))
Мне пришлось вывернуться вот так и поставить защиту от вечного зацкиливания.

 

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

image.thumb.png.6e4f6032d297899eab1f80545f0d3d73.png

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

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


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

37 minutes ago, new123 said:

быть может вы это очень быстро делаете? =))

10 мс ждал )))) Ещё поковыряю, 100% что то не так накодил )

38 minutes ago, new123 said:

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

Само собой. Да и код написан так, что доступ к драйверу разграничивается семафорами. 

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


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

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

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

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

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

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

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

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

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

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