Конечная точка PCIe в системную память / транзакцию конечной точки

561
Abhinav kumar

У меня PCIe Endpoint & Root Complex будет ПК под управлением Linux. Теперь я хочу отправить несколько байтов (скажем, 4 байта) из EP в системную память (RC), используя PCIe Memory Read Request (TLP) Пример PCIe Memory TLP.

Запрос памяти TLP


Для отправки этого EP должен знать адрес системной памяти. Насколько я понимаю, RC будет подключен к системной памяти, поэтому любая транзакция, нацеленная на RC, будет нацелена на системную память, поэтому EP должен знать диапазон адресов RC. Вот пример изображения:

EP to System memory transaction

Мои вопросы:

  1. Как EP знает адрес системной памяти? RC BAR привязан к системной памяти? Если да, может ли EP получить доступ к RC BAR? Если да, то как?

  2. Точно так же, когда EP хочет установить связь с другим EP, он должен знать целевой адрес EP BAR. Итак, как EP узнает адрес другого EP?

    Образец изображения:EP to EP Memory Transaction

  3. Есть ли какой-нибудь linux-код / ​​драйвер, который я мог бы отнести к EP для системной памяти / другого соединения EP?


Большое спасибо за любую помощь.

0
Разве вы не спрашивали об этом раньше? По крайней мере, я помню очень похожий вопрос. Ответ по-прежнему: вы не просто отправляете запросы EP "на чтение памяти". Этот запрос имеет какую-то цель. Вы должны сказать нам, какова цель. Обычно целью является использование драйвера на стороне ПК, и этот драйвер зарезервирует память в качестве области связи, и он сообщит вашему оборудованию физический адрес памяти для DMA и т. Д. И нет, BAR никогда не отображается на память ПК , dirkt 5 лет назад 0
Большое спасибо за информацию, Диркт. Abhinav kumar 5 лет назад 0
Да, вопрос очень похож, но этот вопрос более проработан. Целью является просто передача данных с EP на ПК (RC). Итак, означает ли это, что RC драйвер на стороне Linux предоставит API для получения физического адреса памяти для DMA, который может использоваться EP? Если да, не могли бы вы помочь мне найти этот API? Извините, я только начинающий в Linux. Abhinav kumar 5 лет назад 0
Вы не можете "просто сделать передачу данных". Если вы «просто хотите передать данные», поместите данные где-нибудь в диапазон адресов BAR и попросите * PC * выдать запрос на чтение / запись в конечную точку. Это позволит передавать данные с / на ваше устройство. Это работает даже без драйвера, IIRC где-то в / proc или / sys есть «файл», представляющий области BAR. dirkt 5 лет назад 0
Большое спасибо, Диркт за ответ. Я считаю, что вы предоставили возможные решения одной из моих проблем. Для второго вопроса относительно связи EP с EP, как это будет обработано? Будет ли это что-то вроде этого: поместить данные где-нибудь в диапазон адресов одного из BAR одного EP, а затем перенести их в другой EP, разрешить ПК выполнять чтение / запись в другую конечную точку соответствующего BAR? Abhinav kumar 5 лет назад 0

0 ответов на вопрос