реклама на сайте
подробности

 
 
> PCIe and FPGA
polyvyannyy
сообщение Jun 5 2018, 11:20
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 16-10-17
Пользователь №: 99 768



Всем привет, уважаемые форумчане!
Возникла необходимость поднять на девборде PCIe 3x8. Референсный дизайн загружен и все работает.
Но теперь нужно сделать прием и отправку своих данных с/на хост. И вот тут то возникла куча вопросов и непониманий. Информации по теории PCIe полно, но никак не удается найти конкретики относительно ПЛИС...какой именно у меня должен быть порядок действий со стороны ПЛИС, чтобы организовать чтение/запись данных в ОЗУ хоста? таблица дискрипторов...кто её формирует, где она хранится?В голове каша и нет четкого понимания.
Прошу помощи у опытных в данной теме людей.
За любые ссылки, проекты, которые можно взять за основу, буду благодарен.

Сообщение отредактировал polyvyannyy - Jun 6 2018, 07:32
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
AVR
сообщение Jun 8 2018, 10:20
Сообщение #2


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



Цитата
"1) настраиваем BAR (можем читать-писать по 4 байта туда сюда)" - я так понимаю, означает получение устройством базового адреса на шине PCIe от ОС. Этот адрес записывается в BAR?
"2) выделяем блочек 4К" - выделением занимется драйвер?
"и отображаем на PCI" т.е приводим соответствие адресов на шине PCIe адресам в ОЗУ хоста?
"3) регистрируем обработчик прерывания" не понял?кто этим занимается?драйвер?
"4) шлем этот адрес через BAR " какой этот адрес? и что значит "шлем этот адрес через BAR"?
"5) ПЛИС высылает серию 64 пакетов по 64 байта = 4096" т.е. объем переданных данных от ПЛИС к хосту равен объему выделеной в ОЗУ памяти. А если при выделенном объеме = 4096 байта, мне нужно чтобы
драйвер обработал, скажем 256 байт, я могу его пнуть раньше, чем заполнятся все 4096 байта?
"6) ПЛИС дергает ножку MSI у PCI ядра" это и есть механизм посылки специализированного сообщения прерывания? Если так, как мне инициировать передачу такого сообщения?

1) Эти адреса, если не ошибаюсь, назначает BIOS, либо ОС на ранних этапах запуска. Устройство просто говорит, хочу пару регионов на 4К и на 256К например. А уже при старте ОС либо BIOS смотрит где там лучше выделить в адресном пространстве. После того как выделится, драйвер может буквально несколькими командами получить эти адреса себе в распоряжение (MMIO) и общаться посылками от 1 до 4 байт по этим адресам с нужными смещениями. Я вижу роль этого MMIO и BARов в качестве "регистрового интерфейса" устройства, чтобы получать статусы, передавать что-то небольшое. Раз 4К регион/диапазон, значит 1024 слова по 4 байт могут быть адресованы.
2) Выделяет драйвер в пространстве адресов ядра - ну просто кусок памяти, обычный такой, чтобы хранить какие-то данные. Драйвер, выполнив волшебную комманду, сможет узнать по какому адресу будет "видеть" ПЛИС этот кусочек. Он может быть другим, он может меняться от запуска к запуску системы или драйвера. Вот через MMIO (пункт 1) мы и сообщим эти 4 байта адреса ПЛИСине, куда она может TLP пакеты присылать. И они будут записываться в ОЗУ и ядро эти данные увидит - а нам это и надо, чтобы драйвер от ПЛИС получал данные.
3) Драйвер регистрирует, что когда возникнет MSI прерывание 0, то чтобы вызывалась некоторая функция. А в этой функции можно пробуждать драйвер от ожидания новых данных. Данные можно отбросить, куда-то скопировать, передать в пользовательскую программу.
4) См. пункт 2 - если мы установили что наш кусочек 4К в ядре имеет некий адрес на шине (иной), то мы должны каким-то образом об этом сказать ПЛИСине. Лучше чем MMIO (пункт 1) для этого ничего нет.
5) Да, можно и раньше. Можно вообще только 4 байта прислать и пнуть - и вот они наши 4 байта прислались. Можно 8 байт и т.д. Главное не слать данные между границ страниц памяти, они могут быть 4К, а может иной размер быть настроен в ОС.
6) В любом ядре есть MSI вход. Достаточно просто фронтик на 1-битовом входе сделать и через некоторое время снять (обычно есть сигнал ACK для этого). А оно уже само пошлет что нужно и куда нужно.

Цитата
1.Как функционирует система в режиме gather-scatter? Как и кто формирует таблицу дескрипторов и на основании чего она формируется?где хранится?
2.В каких случаях лучше использовать режима gather-scatter, а в каких целесообразнее иной режим?
3.Если хост отправляет данные в PCIe устройство, то он сначала записывает весь объем данных к себе в ОЗУ, а потом пинает устройство и говорит - "данные готовы-забирай". Или же хост напрямую отправляет данные в устройство?
4.Есть ли механизмы переназначения адресов BAR без перезагрузки системы (например перезаливка прошвики ПЛИС без перезагрузки системы)?
5. Вы сказали, что имеете опыт работы с Альтерой может Вы знаете почему в примерах Alter-ы для Arria 10 нет доступа к BAR0, а BAR4 и выход DMA подключены к одной шине?и как инициировать передачу на хост для сборки Avalon-MM DMA?

1) Честно говоря, не использовал я этот scatter-gather. Если я не ошибаюсь, и правильно понимаю как это работает, я делаю аналог этого механизма своими руками.
Суть, видимо, вот в чем, не ручаюсь за 100% правильность. В пространстве ядра (не знаю как в процессорах с IOMMU) нет трансляции адресов вроде бы, стало быть проблема фрагментации стоит в полный рост. В общем случае, две последовательно идущие страницы памяти могут и не найтись, всё что гарантировано - это одна страница памяти (например 4К). Вот можно навыделять например 1024 таких разбросанных по адресам (scattered) страниц по 4К и получить нужные 4М памяти. Вот эти 1024 адреса можно прислать в ПЛИС и она будет заполнять одну за другой. Видимо дескриптор это мудреное название для записи в воображаемой таблице, где слева номер страницы (первая вторая ... последняя) а справа адрес 4 байта данного кусока по 4К (=1 стр памяти).
2) Какие иные режимы Вы знаете? sm.gif
3) Не могу подсказать, с отправкой потока данных в ПЛИС не работал. Но не обязательно всё сразу в драйвер из программы пользователя загребать. Можно и по частям. Но я чисто предполагаю что именно так - мы заполнили кусочки данными для ПЛИС и сказали ПЛИС - выгребай. И ПЛИС шлет пачку TLP запросов типа MRd (memory read + ожидание ClpD с данными в ответ).
4) Не знаю sm.gif Reset наше всё. Удобнее работать, когда устройство в еще один комп воткнуто. Оно ведь виснуть будет на первых порах, как же без этого sm.gif
5) С шиной Avalon не работал, равно как и PCI-E + Nios. Я использовал вариант ядра PCI-E без Nios. Все пакеты делал сам в своей логике. Так что не могу подсказать по тонкостям реализации Altera.
Хотя то, через что я работал, кажется звалось Avalon-ST (stream), довольно простой интерфейс. Но видимо сильно различается с MM.


--------------------
Go to the top of the page
 
+Quote Post
polyvyannyy
сообщение Jun 9 2018, 10:33
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 16-10-17
Пользователь №: 99 768



Цитата(AVR @ Jun 8 2018, 13:20) *
1) Эти адреса, если не ошибаюсь, назначает BIOS, либо ОС на ранних этапах запуска. Устройство просто говорит, хочу пару регионов на 4К и на 256К например. А уже при старте ОС либо BIOS смотрит где там лучше выделить в адресном пространстве. После того как выделится, драйвер может буквально несколькими командами получить эти адреса себе в распоряжение (MMIO) и общаться посылками от 1 до 4 байт по этим адресам с нужными смещениями. Я вижу роль этого MMIO и BARов в качестве "регистрового интерфейса" устройства, чтобы получать статусы, передавать что-то небольшое. Раз 4К регион/диапазон, значит 1024 слова по 4 байт могут быть адресованы.
2) Выделяет драйвер в пространстве адресов ядра - ну просто кусок памяти, обычный такой, чтобы хранить какие-то данные. Драйвер, выполнив волшебную комманду, сможет узнать по какому адресу будет "видеть" ПЛИС этот кусочек. Он может быть другим, он может меняться от запуска к запуску системы или драйвера. Вот через MMIO (пункт 1) мы и сообщим эти 4 байта адреса ПЛИСине, куда она может TLP пакеты присылать. И они будут записываться в ОЗУ и ядро эти данные увидит - а нам это и надо, чтобы драйвер от ПЛИС получал данные.
3) Драйвер регистрирует, что когда возникнет MSI прерывание 0, то чтобы вызывалась некоторая функция. А в этой функции можно пробуждать драйвер от ожидания новых данных. Данные можно отбросить, куда-то скопировать, передать в пользовательскую программу.
4) См. пункт 2 - если мы установили что наш кусочек 4К в ядре имеет некий адрес на шине (иной), то мы должны каким-то образом об этом сказать ПЛИСине. Лучше чем MMIO (пункт 1) для этого ничего нет.
5) Да, можно и раньше. Можно вообще только 4 байта прислать и пнуть - и вот они наши 4 байта прислались. Можно 8 байт и т.д. Главное не слать данные между границ страниц памяти, они могут быть 4К, а может иной размер быть настроен в ОС.
6) В любом ядре есть MSI вход. Достаточно просто фронтик на 1-битовом входе сделать и через некоторое время снять (обычно есть сигнал ACK для этого). А оно уже само пошлет что нужно и куда нужно.


1) Честно говоря, не использовал я этот scatter-gather. Если я не ошибаюсь, и правильно понимаю как это работает, я делаю аналог этого механизма своими руками.
Суть, видимо, вот в чем, не ручаюсь за 100% правильность. В пространстве ядра (не знаю как в процессорах с IOMMU) нет трансляции адресов вроде бы, стало быть проблема фрагментации стоит в полный рост. В общем случае, две последовательно идущие страницы памяти могут и не найтись, всё что гарантировано - это одна страница памяти (например 4К). Вот можно навыделять например 1024 таких разбросанных по адресам (scattered) страниц по 4К и получить нужные 4М памяти. Вот эти 1024 адреса можно прислать в ПЛИС и она будет заполнять одну за другой. Видимо дескриптор это мудреное название для записи в воображаемой таблице, где слева номер страницы (первая вторая ... последняя) а справа адрес 4 байта данного кусока по 4К (=1 стр памяти).
2) Какие иные режимы Вы знаете? sm.gif
3) Не могу подсказать, с отправкой потока данных в ПЛИС не работал. Но не обязательно всё сразу в драйвер из программы пользователя загребать. Можно и по частям. Но я чисто предполагаю что именно так - мы заполнили кусочки данными для ПЛИС и сказали ПЛИС - выгребай. И ПЛИС шлет пачку TLP запросов типа MRd (memory read + ожидание ClpD с данными в ответ).
4) Не знаю sm.gif Reset наше всё. Удобнее работать, когда устройство в еще один комп воткнуто. Оно ведь виснуть будет на первых порах, как же без этого sm.gif
5) С шиной Avalon не работал, равно как и PCI-E + Nios. Я использовал вариант ядра PCI-E без Nios. Все пакеты делал сам в своей логике. Так что не могу подсказать по тонкостям реализации Altera.
Хотя то, через что я работал, кажется звалось Avalon-ST (stream), довольно простой интерфейс. Но видимо сильно различается с MM.



Спасибо большое за столь развернутые ответы. Теперь буду приводить мысли в порядок и пробовать)Уверен, будут еще вопросы wink.gif
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- polyvyannyy   PCIe and FPGA   Jun 5 2018, 11:20
- - dsmv   Можно посмотреть на мой старый проект http://ds-de...   Jun 5 2018, 19:09
|- - polyvyannyy   Цитата(dsmv @ Jun 5 2018, 22:09) Можно по...   Jun 6 2018, 07:33
- - AVR   Готов проконсультировать по всем вопросам касатель...   Jun 5 2018, 19:40
- - AVR   Продублирую из лички сюда, чтобы осталось. Всё нап...   Jun 7 2018, 09:08
- - dxp   AVR, а вы проводили функциональное моделирование в...   Jun 9 2018, 03:12
|- - AVR   Цитата(dxp @ Jun 9 2018, 06:12) AVR, а вы...   Jun 9 2018, 08:56
- - dxp   А Flow Control как-то обрабатываете? Или трафик та...   Jun 9 2018, 10:32
|- - AVR   Цитата(dxp @ Jun 9 2018, 13:32) А Flow Co...   Jun 9 2018, 11:12
|- - dxp   Цитата(AVR @ Jun 9 2018, 18:12) Нужно сле...   Jun 9 2018, 12:53
|- - AVR   Цитата(dxp @ Jun 9 2018, 15:53) Да, вот м...   Jun 9 2018, 13:10
|- - RobFPGA   Приветствую! Цитата(dxp @ Jun 9 2018, 15...   Jun 18 2018, 11:30
|- - dxp   Спасибо за ответ, прошу прощения за паузу, не был ...   Jul 10 2018, 10:11
|- - RobFPGA   Приветствую! Цитата(dxp @ Jul 10 2018, 13...   Jul 10 2018, 13:54
|- - dxp   Цитата(RobFPGA @ Jul 10 2018, 20:54) Уточ...   Jul 11 2018, 12:04
|- - RobFPGA   Приветствую! Цитата(dxp @ Jul 11 2018, 1...   Jul 11 2018, 13:31
|- - dxp   Цитата(RobFPGA @ Jul 11 2018, 20:31) Сам....   Jul 12 2018, 04:35
|- - RobFPGA   Приветствую! Цитата(dxp @ Jul 12 2018, 07...   Jul 12 2018, 06:58
|- - dxp   Цитата(RobFPGA @ Jul 12 2018, 13:58) Лучш...   Jul 12 2018, 07:17
|- - RobFPGA   Цитата(dxp @ Jul 12 2018, 10:17) Понятно....   Jul 12 2018, 07:40
|- - dxp   Цитата(RobFPGA @ Jul 12 2018, 14:40) Да -...   Jul 12 2018, 07:46
- - dxp   Проблема может возникнуть из-за того, что если нак...   Jun 9 2018, 14:56
|- - AVR   Цитата(dxp @ Jun 9 2018, 17:56) Но тогда ...   Jun 9 2018, 16:10
- - AVR   ЦитатаПодскажите пожалуйчта, как из пользовательск...   Jun 17 2018, 11:03
- - polyvyannyy   Цитата(AVR @ Jun 17 2018, 14:03) Что тако...   Jun 18 2018, 09:53
- - doom13   Цитата(polyvyannyy @ Jun 18 2018, 12:53) ...   Jun 18 2018, 10:29
- - AVR   Цитата(polyvyannyy @ Jun 18 2018, 12:53) ...   Jun 18 2018, 10:43


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 12:13
Рейтинг@Mail.ru


Страница сгенерированна за 0.01454 секунд с 7
ELECTRONIX ©2004-2016