Как прочитать расширенное пространство конфигурации PCIE в Linux?

Я пробовал как прочитать запись pci пользовательского пространства в каталоге /proc/bus/pci, так и вызвать API драйвера пространства ядра pci_read_config_word() в драйвере. но, похоже, оба могут читать только базовое конфигурационное пространство pci, смещение меньше 0x100.

Смещение, которое я хочу прочитать, превышает 0x100, может кто-нибудь сказать мне, как это сделать в Linux? если бы это было сделано в пространстве ядра, было бы очень полезно узнать, какой API вызывать. Большое спасибо!

2 ответа

Решение

pci_read_config_word() является правильным API, но для доступа к расширенному пространству конфигурации вам нужно использовать MMCONFIG. Это не то, что вы создали; ядро должно выбрать использование MMCONFIG само по себе, если оно доступно. Вы видите что-нибудь подобное

e0000000-efffffff : PCI MMCONFIG 0000 [bus 00-ff]

в /proc/iomem? Также в вашем журнале ядра вы должны увидеть несколько строк о таблице ACPI MCFG и MMCONFIG:

ACPI: MCFG 00000000bb7fec63 0003C (v01 LENOVO TP-6U    00001410 LNVO 00000001)
...
PCI: MMCONFIG for domain 0000 [bus 00-ff] at [mem 0xe0000000-0xefffffff] (base 0xe0000000)

и, конечно, ваше ядро ​​должно быть собрано с CONFIG_PCI_MMCONFIG=y,

Я считаю, что расширенное пространство конфигурации ограничено для пользователей без полномочий root, по крайней мере, это поведение, с которым я сталкиваюсь при выполненииlspciкогда нет рута. Вы можете использоватьsudo lspci -Qkxxxxnnvпросмотреть все0xff0(4080) данные пространства конфигурации и некоторые другие полезные вещи.

      $ sudo lspci -Qkxxxxnnv

00:1d.0 PCI bridge [0604]: Intel Corporation Comet Lake PCI Express ...
Flags: bus master, fast devsel, latency 0, IRQ 124
...
Kernel driver in use: pcieport
00: 86 80 98 a3 07 04 10 00 f0 00 04 06 10 00 81 00
...
ff0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

См.: Пространство конфигурации PCI.

Другие вопросы по тегам