Как BIOS определяет тип порта PCI в процессе перечисления?

Как и в PCI Express, регистр возможностей, называемый "регистр возможностей pci express", определяет поле типа устройства / порта, в котором указывается, является ли его корневой порт, порт восходящего коммутатора, порт нисходящего коммутатора, конечная точка и т. Д. Какой механизм использует BIOS для определения порта / тип устройства при перечислении шины PCI?

2 ответа

Это исправлено - вендор программирует это поле на основе дизайна своего продукта.

Производитель всегда знает, является ли порт восходящим или нисходящим, или он только что разработал корневой коммутатор вместо коммутатора, или использует ли он PCI Inreadread PCIe.
Проще говоря, это то, где знание поставщика является существенным и почему его обязанность - написать прошивку.

В частности, значение поля может быть получено из EEPROM/FlashROM или запрограммировано BIOS/UEFI при ранней загрузке с использованием аппаратных значений. Неважно, как это делается, важно то, что поле инициализируется так, как задумано на заводе, прежде чем какое-либо зависимое программное обеспечение его прочитает.

Я не уверен, что отвечаю на ваш вопрос, но при получении операции моста в coreboot (get_pci_bridge_ops) https://github.com/coreboot/coreboot/blob/master/src/device/pci_device.c это делается так:

unsigned int pciexpos;
pciexpos = pci_find_capability(dev, PCI_CAP_ID_PCIE);
if (pciexpos) {
    u16 flags;
    flags = pci_read_config16(dev, pciexpos + PCI_EXP_FLAGS);
    switch ((flags & PCI_EXP_FLAGS_TYPE) >> 4) {
    case PCI_EXP_TYPE_ROOT_PORT:
    case PCI_EXP_TYPE_UPSTREAM:
    case PCI_EXP_TYPE_DOWNSTREAM:
        printk(BIOS_DEBUG, "%s subordinate bus PCI Express\n",
               dev_path(dev));
        return &default_pciexp_ops_bus;
    case PCI_EXP_TYPE_PCI_BRIDGE:
        printk(BIOS_DEBUG, "%s subordinate PCI\n",
               dev_path(dev));
        return &default_pci_ops_bus;
    default:
        break;
    }
}
Другие вопросы по тегам