Как BIOS определяет тип порта PCI в процессе перечисления? - PullRequest
0 голосов
/ 26 августа 2018

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

Ответы [ 2 ]

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

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

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

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

0 голосов
/ 26 августа 2018

Я не уверен, что отвечаю на ваш вопрос, но при получении операции моста в 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;
    }
}
...