BIOS在枚举过程中如何确定PCI端口类型?

时间:2018-08-26 12:20:45

标签: pci pci-e

与PCI Express中一样,称为“ pci express功能寄存器”的功能寄存器指定设备/端口类型字段,该字段指示其根端口,上游交换机端口,交换机下游端口,端点等。 BIOS在PCI总线枚举期间使用什么机制来确定端口/设备类型?

2 个答案:

答案 0 :(得分:0)

我不确定是否回答您的问题,但是在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;
    }
}

答案 1 :(得分:0)

它是固定的-供应商根据产品的设计进行编程。

制造商始终知道端口是上游还是下游,或者它是否仅设计了根联合体而不是交换机,或者是否正在使用PCI内置PCIe。
简而言之,这是供应商知识必不可少的地方,也是编写固件的责任所在。

具体来说,该字段值可以来自EEPROM / FlashROM或由BIOS / UEFI在早期启动时使用硬接线值进行编程。 它的完成方式并不重要,重要的是,在任何相关软件读取该字段之前,已按照工厂的预期对字段进行了初始化。