Оборудование
Базовый адрес области 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.