2017-01-18 3 views
1

У меня есть модель PCIe, написанная в System Verilog, хотя я думаю, что этот вопрос является агностиком языка. Модель выполняет чтение и запись конфигурации PCIe, а память отлично читает и пишет в симуляции. Тем не менее, что мне нужно сделать, это «открыть» мое устройство PCIe и настроить мои регистры конфигурационного пространства в симуляции. Есть ли кусок плиты кодов псевдокода, который представляет процесс перечисления Linux PCIe, что я могу просто добавить свои собственные функции транзакций моделей, чтобы я мог получить «прогулку по автобусу», а затем программирование BAR, разрешение SR-IOV, если обнаружено, Конфигурация MSIx? Похоже, это будет обычным упражнением для устройства PCIe, поэтому, возможно, есть модель.алгоритм обнаружения устройства PCIe псевдокод

ответ

3

Это не так уж сложно сделать. В основном вы прокручиваете конфигурационное пространство, проверяя каждое каждое возможное устройство на первой корневой шине 0. Когда устройство найдено, вы выделяете для него пространство памяти на основе его запрошенного размера и соответствующим образом программируете BAR. Если вы найдете какие-либо мосты, вы также настраиваете и активируете их - основные регистры моста для этого являются стандартными. Это включает в себя назначение номеров восходящего и нисходящего шин, которые затем позволяют перечислить новую нисходящую шину и так далее.

Мне пришлось сделать это один раз, чтобы получить доступ к плате PCI I/O в системе, в которой не было ОС или другой программной среды. Это было не так уж плохо, и это было через два моста от двух поставщиков, а также регистра карт ввода-вывода и настройки корневого моста шины ЦП. Это был PCI, а не PCIe, но это было бы очень похоже. Вы могли бы даже сделать это с полностью жестко закодированными номерами, если бы оборудование никогда не менялось, но в моем случае было несколько вариантов, поэтому я действительно должен был сделать простое перечисление, чтобы динамически находить номера устройств. Один из них заключается в том, что вам, возможно, придется немного отложить или повторить попытку, чтобы дать всем устройствам время для входа в Интернет, прежде чем пытаться получить к ним доступ.

При этом я нашел эту книгу неоценимой: PCI System Architecture (4th Edition). Я замечаю, что есть также версия для PCIe: PCI Express System Architecture (1st Edition). Я бы определенно получил один из них, если вы еще этого не сделали. Эти книги содержат подробные алгоритмы и объяснения о том, как это сделать. В то время я действительно не использовал или не ссылался на какой-либо код, который можно было бы назвать, но ...

Лучший ресурс кода, который я нашел, это U-Boot. Он работает на аналогично низком уровне и полностью автономен и по-прежнему довольно мал и как можно более прост. Например, перечисление, как представляется, начинается с функции pci_init(), которая вызывает конкретную плату pci_xxx_init(). Затем он устанавливает корневой мост и затем вызывает pci_hose_scan_bus() в drivers/pci/pci.c, чтобы выполнить настоящую работу. Также проверьте процедуры в drivers/pci/pci_auto.c, а также остальную часть папки.

Для вашей задачи вам, вероятно, понадобится очень небольшое подмножество, и вы можете просто взломать части этих файлов в простой драйвер. В основном цикл for() и некоторые вызовы pci_read/write_config() с логикой распознают ваше устройство и идентификаторы моста.

Смежные вопросы