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

PCI Express: Как правильно реализовать систему?

Приветствую.

Подскажите, как правильно реализовать систему?

Есть плата HTG-V7-G3, принимает данные по 10G Ethernet и надо запихнуть эти данные в ПК под управлением Linux.

 

Пока добавил в проект FPGA ядро AXI Bridge for PCI Express Gen3 Subsystem, GPIO (повесил на светодиод), Timer (прерывание

от таймера завёл на PCIe bridge). Всё это повесил на PCIe:BAR0. Под Linux сделал простенький драйвер для PCI,

который умеет писать регистры периферии. На прерывание от PCIe (таймера) повесил обработчик который "моргает" GPIO.

Драйвер выделяет буфер памяти, адрес буфера записываю в регистры моста AXIBAR2PCIEBAR_0U, AXIBAR2PCIEBAR_0L -

могу писать данные с FPGA в буфер выделенный драйвером. Т.е. умею писать/читать данные и со стороны AXI и со стороны PCIe.

 

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

Счас нужно добавить DMA, хочу использовать ядро CDMA от Xilinx (уже посмотрел, как оно работает).

 

Не совсем понимаю, как лучше собрать все эти куски вместе? Кто должен выступать инициатором передачи?

Пока вижу такой путь. Система стартует и драйвер настраивает всю периферию. По заполнению буфера в FPGA на PCIe bridge идёт прерывание.

Драйвер видит, что пришло прерывание, и запускает CDMA. CDMA должен успеть перебросить данные в выделенный драйвером буфер.

В user space используются: fopen() - для доступа к файлу драйвера, fread() - для чтения данных из буфера драйвера, fclose() -

при завершении работы user application. fread() будет работать в пуле, пытаться прочитать нужный объём данных.

Возможно, что-то понимаю неправильно и есть верный путь реализации системы?

 

Нужно ли иметь доступ к управлению периферией в FPGA из user space или достаточно будет все настройки осуществлять из kernel space?

Видел, что есть ещё какие-то ioctl, но пока не разобрался, что это такое. Нужно ли оно для моего случая?

Спасибо.

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


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

скачайте xapp1052.zip (?) там уж сами разберетесь, я думаю. Там и исходник для модуля ядра есть, правда кривой сильно, но для 1-й итерации сгодится

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


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

скачайте xapp1052.zip (?) там уж сами разберетесь, я думаю. Там и исходник для модуля ядра есть, правда кривой сильно, но для 1-й итерации сгодится

Спасибо, валяется уже на диске, но что-то я его пока не смотрел. Думаю, первая итерация уже есть, вопрос - как правильно собрать целиком всю систему? Возможно, найду ответ в xapp1052, какие-то примеры там есть (и для драйвера и для user space application).

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


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

Спасибо, валяется уже на диске, но что-то я его пока не смотрел. Думаю, первая итерация уже есть, вопрос - как правильно собрать целиком всю систему? Возможно, найду ответ в xapp1052, какие-то примеры там есть (и для драйвера и для user space application).

там как раз через IOCTL проводится основная инициализация девайса. Инициатор обмена всегда девайс. Т.е. драйвер устанавливает значение в регистрах (адреса, кол-во байт...) и устанавливает бит для старта ДМА. Все, после этого ждешь прерывания. Там есть ошибки в модуле ядра. В частности, освобождение памяти для ДМА реализовано с ошибкой

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


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

Пока читаю xapp1052 и разбираюсь с содержимым архива, советы приветствуются :)

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


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

спрашивайте если что

Может быть Вы могли бы ответить на вопрос про прерывания (вот тут спрашивал, но так и не понял всех ньюансов)?

1) Как происходит назначение линии прерывания устройству?

2) Если это определяет операционка или BIOS, почему отличается номер в конфиг-спейсе устройства и в системе, когда прерывание работает?

3) Почему, когда поменял местами видеокарту и мою плату номера линий прерываний для данных устройств не изменились? Потому ли, что драйвер видеокарты стартует при запуске системы, а для моего устройства запускается уже позже?

4) Если для устройства (в железе) разрешаю MSI и задаю вектор из 4-х MSI (например), почему операционка видит, что устройство поддерживает 4 MSI, а выделяет под устройство только одну линиию? Если жёстко говорю выделить больше выкидывает ошибку.

Как тогда должен строиться драйвер, если устройство поддерживает 4 MSI, а система выделяет одну линию?

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


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

Может быть Вы могли бы ответить на вопрос про прерывания (вот тут спрашивал, но так и не понял всех ньюансов)?

1) Как происходит назначение линии прерывания устройству?

2) Если это определяет операционка или BIOS, почему отличается номер в конфиг-спейсе устройства и в системе, когда прерывание работает?

3) Почему, когда поменял местами видеокарту и мою плату номера линий прерываний для данных устройств не изменились? Потому ли, что драйвер видеокарты стартует при запуске системы, а для моего устройства запускается уже позже?

4) Если для устройства (в железе) разрешаю MSI и задаю вектор из 4-х MSI (например), почему операционка видит, что устройство поддерживает 4 MSI, а выделяет под устройство только одну линиию? Если жёстко говорю выделить больше выкидывает ошибку.

Как тогда должен строиться драйвер, если устройство поддерживает 4 MSI, а система выделяет одну линию?

Не знаю как это реализовано на уровне Биос. А надо ли ? Я сначала разрешаю msi (pci_enable_msi) а уже потом request_irq и номер прерывания не меняется до перезагрузки драйвера, смотрю в /interrupts.

 

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


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

Не знаю как это реализовано на уровне Биос. А надо ли ? Я сначала разрешаю msi (pci_enable_msi) а уже потом request_irq и номер прерывания не меняется до перезагрузки драйвера, смотрю в /interrupts.

Так же сделано, но хотелось бы знать, как оно назначилось.

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


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

Посмотрел пример драйвера и приложения в xapp1052. Вопросы будут следующие.

В проекте для FPGA для передачи данных по PCIe предполагается система состоящая из ядер

PCIe Bridge (AXI Bridge for PCI Express Gen3 Subsystem) и CDMA. Прерывание от CDMA заводится на PCIe Bridge (возможно прерывание по заполнению буфера в FPGA).

Как правильно разделить задачи по управлению системой между драйвером в kernel space и user space application?

Как понял, в xapp1052 весь контроль над системой осуществляет user space application через read, write, ioctl. Обработчик прерывания вообще, кроме вывода сообщений в syslog, ничего не делает.

Правильно ли что весь контроль над железом осуществляется пользовательским приложением? Не правильнее ли предоставить пользователю доступ к железу только через read/write (возможно какой-то минимальный набор команд для ioctl для отладки)?

Как правильно использовать и обрабатывать прерывание в данной системе?

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


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

Посмотрел пример драйвера и приложения в xapp1052. Вопросы будут следующие.

В проекте для FPGA для передачи данных по PCIe предполагается система состоящая из ядер

PCIe Bridge (AXI Bridge for PCI Express Gen3 Subsystem) и CDMA. Прерывание от CDMA заводится на PCIe Bridge (возможно прерывание по заполнению буфера в FPGA).

Как правильно разделить задачи по управлению системой между драйвером в kernel space и user space application?

Как понял, в xapp1052 весь контроль над системой осуществляет user space application через read, write, ioctl. Обработчик прерывания вообще, кроме вывода сообщений в syslog, ничего не делает.

Правильно ли что весь контроль над железом осуществляется пользовательским приложением? Не правильнее ли предоставить пользователю доступ к железу только через read/write (возможно какой-то минимальный набор команд для ioctl для отладки)?

Как правильно использовать и обрабатывать прерывание в данной системе?

Драйвер выделяет память для обоих ДМА каналов. По виртуальным адресам реализует методы read и write для юзерспейс, физическими адресами буферов инициализирует соответствующие регистры устройства.

Можете реализовать блокирующее чтение\запись, в методе где нужно передадите управление ядру, а прерывании разбудите. Для этого придется часть управления регистрами устройства перенести в одуль ядра из user space

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


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

Драйвер выделяет память для обоих ДМА каналов. По виртуальным адресам реализует методы read и write для юзерспейс, физическими адресами буферов инициализирует соответствующие регистры устройства.

Тут всё понятно и уже работает.

 

Можете реализовать блокирующее чтение\запись, в методе где нужно передадите управление ядру, а прерывании разбудите. Для этого придется часть управления регистрами устройства перенести в одуль ядра из user space

А вот тут - нет. Где-то встречал про блокирующие чтение/запись, но пока не разобрался. Надо глянуть.

 

Можете расписать по пунктам алгоритм действий по приёму данных (задача описана выше): с чего начинаем и т.д.?

Например:

1) Заполнился буфер в FPGA

2) По заполнению буфера в FPGA мост выдал прерывание в систему

............

N)

 

 

 

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


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

3. считали данные, изменили позицию в буфере

4. Юзер решил прочитать данные

4.1 если данные есть в ниличии, то просто копируем их в юзерспейс

4.2 если данных нет, то вызываем типа wait_event_interruptible (за синтаксис не ручаюсь, пишу по памяти) и предаем управление шедулеру.

 

5. в прерывании вызываем типа wake_up_interruptible и завершаем процедуру записи данных

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


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

Спасибо, понял - надо ещё читать книгу.

Тут хочу уточнить: user space application должен читать постоянно мониторя наличие данных в буфере (прчитал, обработал, ждёт следующих данных)? Он-то не может узнать о заполнении буфера? Можно ли прерывание транслировать в юзер спэйс?

 

4.2 если данных нет, то вызываем типа wait_event_interruptible (за синтаксис не ручаюсь, пишу по памяти) и предаем управление шедулеру.

5. в прерывании вызываем типа wake_up_interruptible и завершаем процедуру записи данных

Это и будет блокирующее чтение?

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


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

читайте про отложенные процессы, семафоры. Метод poll тоже советую посмотреть

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


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

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

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

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

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

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

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

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

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

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