Обнаружение транзакции от конечной точки PCIe к памяти хоста в Linux - PullRequest
0 голосов
/ 08 июня 2018

Я строю проект FPGA, в котором некоторые устройства (процессор, UART, контроллер GPIO) подключены к шине AXI4.Шина AXI4 подключается к хосту через Xilinx «AXI Memory Mapped to PCI Express (PCIe) Gen2 v2.6 LogiCORE IP», который действует как мост.Подсистема, расположенная на интерфейсах FPGA через PCIe с драйвером Linux.Этот драйвер создает файл устройства для предоставления интерфейса к симулятору компьютерной системы, работающему на хосте, так называемой виртуальной платформе (VP).Часть компонентов системы будет смоделирована в VP, тогда как остальные компоненты реализованы на FPGA.Системная шина VP прозрачно подключена к шине AXI4 на ПЛИС через драйвер и вышеупомянутый мост.Транзакции, инициируемые на хосте, уже реализованы и работают правильно.

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

Пока что мои идеи таковы: (i) создать экземпляр контроллера DMA на ПЛИС, который выдает прерывание с сигналом сообщения (MSI) хосту в конце каждой передачи,Затем драйвер может получить начальный адрес и размер передачи из контрольных регистров DMA.(ii) выделить на хосте буфер, из которого / в который мастер чтения / записи шины PCIe выполняет чтение / запись.Этот буфер должен быть опрошен, чтобы обнаружить изменения, которые мне кажутся неэффективными, особенно для больших буферов.

Есть ли у кого-нибудь идея для лучшего решения?Это мой первый вопрос здесь.Пожалуйста, извините, что мой вопрос стал немного длинным.Любые отзывы будут высоко оценены.

1 Ответ

0 голосов
/ 02 августа 2018

Я отвечаю на мой вопрос два месяца назад, на случай, если кто-то еще столкнется с подобной проблемой в будущем.

Я реализовал IP-блок в VHDL, который создается столько раз, сколько существует мастер AXIпорты, которые хотят общаться с виртуальной платформой (VP), работающей на хосте.Этот IP-блок имеет два подчиненных порта AXI: один подключен к главному порту AXI, отправляющему запросы, другой может быть считан с хоста через мост PCIe / AXI.Всякий раз, когда блок IP перехватывает запрос, генерируется прерывание для уведомления драйвера хоста.Драйвер считывает адрес, данные, тип (R / W) и размер запроса, которые в свою очередь считываются VP через ioctl ().VP обрабатывает запрос и передает ответ драйверу, также через ioctl ().Затем драйвер пересылает ответ на IP-блок, подключенный к соответствующему главному порту AXI, и запрос завершается.

В будущем я, вероятно, реализую новую версию IP-блока, которая будет использовать DMAКонтроллер записывает информацию запроса в буфер в памяти хоста, чтобы уменьшить количество обращений PCIe.О наличии новых данных в буфере хоста будет сигнализировать прерывание.

...