Расширенное конфигурационное поле (4Кб на bdf-адрес вместо стандартного 1Кб, доступного через порты CF8-CFC) необходимо PCIe-устройствам для полноценного управления питанием, коррекции ошибок и контроля виртуального канала.
Расширенный конфигуратор будет также очень полезен и для работы с "нормальными" PCI-устройствами, позволяя непосредственно (в обход портов и BIOS32) читать и записывать cfg-регистры.
Характерная особенность расширенного конфигуратора - отображение bdf-адреса на некоторый связный диапазон адресов:
Code: Select all
bits[27:20] = bus; (only 2-3 LSbits actually used in most desktop systems)
bits[19:15] = device;
bits[14:12] = function;
bits[11: 8] = extended register number; (PCIe/PCIX only)
bits[ 7: 2] = register number;
bits[ 1: 0] = used to generate Byte Enables
Реальная RAM-память при этом не используется, поскольку весь диапазон изначально находится в MMIO-пространстве физических адресов.
Линейное пространство PCIe_CONFIG_SPACE выровнено по 4М-границе и в предварительной (туповатой, но вполне безопасной) версии маппится двумя "большими" PDE-страницами, что достаточно для работы с восемью PCI-шинами (bus# 0..7). Потом доработаю "чистый" маппинг, сейчас дел невпроворот.
NB: Я попытался реализовать непосредственное чтение адреса конфигуратора, в обход заморочек ACPI. На реальных атлонах этот способ работает, в эмуляторе (VBox) - нет.
Сейчас pci_ext_config привязана к AMD архитектуре, явно используя регистры контроля HT-канала (fn 0.18:1) - см.http://www.amd.com/us-en/assets/content ... /32559.pdf, гл.4.4.
Как добраться до PCIe-конфигуратора на пнях - пока не интересовался. Может, кто подскажет?