|
|
 |
Ответов
|
Jun 8 2018, 10:20
|

фанат 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) Какие иные режимы Вы знаете?  3) Не могу подсказать, с отправкой потока данных в ПЛИС не работал. Но не обязательно всё сразу в драйвер из программы пользователя загребать. Можно и по частям. Но я чисто предполагаю что именно так - мы заполнили кусочки данными для ПЛИС и сказали ПЛИС - выгребай. И ПЛИС шлет пачку TLP запросов типа MRd (memory read + ожидание ClpD с данными в ответ). 4) Не знаю  Reset наше всё. Удобнее работать, когда устройство в еще один комп воткнуто. Оно ведь виснуть будет на первых порах, как же без этого  5) С шиной Avalon не работал, равно как и PCI-E + Nios. Я использовал вариант ядра PCI-E без Nios. Все пакеты делал сам в своей логике. Так что не могу подсказать по тонкостям реализации Altera. Хотя то, через что я работал, кажется звалось Avalon-ST (stream), довольно простой интерфейс. Но видимо сильно различается с MM.
--------------------
|
|
|
|
|
Jun 9 2018, 10:33
|
Участник

Группа: Участник
Сообщений: 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) Какие иные режимы Вы знаете?  3) Не могу подсказать, с отправкой потока данных в ПЛИС не работал. Но не обязательно всё сразу в драйвер из программы пользователя загребать. Можно и по частям. Но я чисто предполагаю что именно так - мы заполнили кусочки данными для ПЛИС и сказали ПЛИС - выгребай. И ПЛИС шлет пачку TLP запросов типа MRd (memory read + ожидание ClpD с данными в ответ). 4) Не знаю  Reset наше всё. Удобнее работать, когда устройство в еще один комп воткнуто. Оно ведь виснуть будет на первых порах, как же без этого  5) С шиной Avalon не работал, равно как и PCI-E + Nios. Я использовал вариант ядра PCI-E без Nios. Все пакеты делал сам в своей логике. Так что не могу подсказать по тонкостям реализации Altera. Хотя то, через что я работал, кажется звалось Avalon-ST (stream), довольно простой интерфейс. Но видимо сильно различается с MM. Спасибо большое за столь развернутые ответы. Теперь буду приводить мысли в порядок и пробовать)Уверен, будут еще вопросы
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|