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

Прочитать данные с ПК по PCI Express

Добрый день. Имеется отладочная плата Strtatix IV GX Development Kit. Плата засунута в ПК в PCIE. На плате реализован некий контроллер/автомат (мы его гордно зовем DMA-контроллер :rolleyes: ), который может принимать запросы от ПК (Memory Write Request и Memory Read Request) и при необходимости отвечать на них (Completion with Data), а так же может засылать в ПК много-много пакетов (Memory Write Request). Это все работало.

 

Появилась необходимость не только передавать в ПК данные из ПЛИС, но и вычитывать из ПК данные в ПЛИС.

Для этого добавил в свой автомат еще один шаг - отправку в ПК из ПЛИС запроса Memory Read Request. В ответ я ожидаю получение нескольких Completion with Data. Но в ответ тишина.

 

На стороне ПК в линуксе реализован драйвер, выдернул от туда строчки, может это поможет:

 

addr = dma_map_single( dev, dest, size, DMA_FROM_DEVICE );    // выделение памяти, куда будут писаться данные из ПЛИС в ПК

start( adev, devaddr, addr, devsize, DmaRead );                         // команда для ПЛИС, чтобы она начала засылать данные в ПК, в плату сообщается адрес addr выделенной области памяти

...

dma_unmap_single( dev, addr, size, DMA_FROM_DEVICE );      // закрываем выделенную память

 

Соответственно для варианта чтения данных из ПК аргумент DMA_FROM_DEVICE был заменен на DMA_TO_DEVICE,

а DmaRead на DmaWrite.

 

По Signal Tap отслеживаю, что сигналы бегают от PCIE ядра, так как я и задумывал, запрос к ПК на чтение выделенной памяти отсылается, а вот ответ на него не приходит.

При этом плата работает, pcie не отваливается, ПК не виснет.

 

Вопросы у меня такие:

Имеет ли право плата ПЛИС вообще засылать запросы на чтение (я к тому, что она ведь не ROOT, а Endpoint), хотя write запросы она ведь удачно засылает?

Может в драйвере нужно чего еще прописать, проинициализировать? К сожалению, драйвер писал не я, и всех тонкостей не знаю, и не силен в линукс-программировании.

 

 

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


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

Вопросы у меня такие:

Имеет ли право плата ПЛИС вообще засылать запросы на чтение (я к тому, что она ведь не ROOT, а Endpoint), хотя write запросы она ведь удачно засылает?

 

Имеет. Все этим пользуются.

 

Может в драйвере нужно чего еще прописать, проинициализировать? К сожалению, драйвер писал не я, и всех тонкостей не знаю, и не силен в линукс-программировании.

 

Не нужно. На запрос чтения должен прийти ответ. Если ответов нет, что-то не так в запросе.

 

 

 

 

 

 

 

 

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


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

Имеет. Все этим пользуются.

Вот за это спасибо, а то хрен его знает, вдруг я делаю что то не так (не так, как все).

 

А проблема действительно заключалась в запросе.

С помощью команды lspci выяснил, что плата висит на шине 01:00.0 (bus:slot.func).

Подсунул в запросе Request ID = 0x0100 и отклик пришел.

 

Буду дальше разбираться, как это правильно организовывать.

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


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

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

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

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

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

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

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

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

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

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