Как получить доступ к пространству конфигурации pci express через MMIO? - PullRequest
0 голосов
/ 02 сентября 2018

Я новичок в PCI Express, я хочу читать / записывать в пространство конфигурации PCI Express через адреса MMIO. Я знаю, как сопоставление портов ввода-вывода для чтения / записи в пространство конфигурации PCI Express через адреса портов 0xCFC и 0xCF8 (на x86). Я также написал пример модуля ядра Linux для чтения конфигурационного пространства pci через сопоставленный порт io, который работал нормально. Я хочу сделать то же самое через доступ MMIO / MMCFG.

Я тоже обыскал, но не смог найти убедительного ответа. Я ищу детали, а также пример кода, чтобы понять это лучше.

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 09 сентября 2018

Оборудование

Базовый адрес области MMIO для пространства конфигурации каждого устройства PCIe в группе сегментов PCI приведен в таблице ACPI MCFG .

В таблице MCFG перечислены для каждой группы сегментов PCI первый и последний (включительно) номер шины группы сегментов PCI и базовый адрес расширенного пространства конфигурации.

Таблица MCFG настраивается BIOS / UEFI на основе значения PCIEXBAR (для моего процессора по смещению 60h) в регистрах хост-моста / DRAM устройства, расположенного по адресу 00: 00,0
. Это обычный адрес, устройство встроено в процессорное гнездо начиная с архитектуры Nehalem и никогда не меняло адрес.
Вы можете погуглить таблицу данных вашего процессора, чтобы получить правильный адрес устройства и смещение регистра.

Также обратите внимание, что не все области 256 МБ могут отображаться, мой процессор позволяет отображать 256/128/64 МБ, причем 128 МБ выбирается BIOS / UEFI.


Linux

Я не знаю, как правильно справиться с этим в Linux, есть функция pci_{read|write}_config_XXX, функция , которая, похоже, использует расширенное пространство конфигурации PCIe.
Таким образом, доступ к пространству конфигурации должен быть очень простым.

В качестве альтернативы, pci_mcfg_lookup даст физический адрес расширенного пространства конфигурации для группы сегментов PCI и диапазона шин (вы должны быть в состоянии заставить его работать, определив resource структура только с полями start и end, установленными для номера шины).
В случае, если вы хотели подход более низкого уровня.

Наконец, вы можете получить адрес таблицы MCFG и (пере) проанализировать его самостоятельно - я точно не знаю, как получить такой адрес в Linux.
Существует acpi_tb_find_table, где вы можете передать подпись таблицы и null oem и идентификаторы таблицы для получения индекса таблицы .
В строке 114 того же файла есть фрагмент кода, который обращается к таблице по индексу, вы можете использовать его в качестве документации.
Возможно, вам придется импортировать один или несколько символов из модуля ACPI.

...