- // Check if device is a bridge.
- u8 hdr = pci_config_readb(bdf, PCI_HEADER_TYPE);
- u8 ht = hdr & 0x7f;
- if (ht == PCI_HEADER_TYPE_BRIDGE || ht == PCI_HEADER_TYPE_CARDBUS) {
- u32 ctrl = pci_config_readb(bdf, PCI_BRIDGE_CONTROL);
- if (ctrl & PCI_BRIDGE_CTL_VGA) {
- // Found a VGA enabled bridge.
- u32 pbus = pci_config_readl(bdf, PCI_PRIMARY_BUS);
- bdf = (pbus & 0xff00);
- max = bdf + 0x100;
- continue;
+ // Populate pci_device info.
+ dev->bdf = bdf;
+ dev->parent = parent;
+ dev->rootbus = rootbus;
+ u32 vendev = pci_config_readl(bdf, PCI_VENDOR_ID);
+ dev->vendor = vendev & 0xffff;
+ dev->device = vendev >> 16;
+ u32 classrev = pci_config_readl(bdf, PCI_CLASS_REVISION);
+ dev->class = classrev >> 16;
+ dev->prog_if = classrev >> 8;
+ dev->revision = classrev & 0xff;
+ dev->header_type = pci_config_readb(bdf, PCI_HEADER_TYPE);
+ u8 v = dev->header_type & 0x7f;
+ if (v == PCI_HEADER_TYPE_BRIDGE || v == PCI_HEADER_TYPE_CARDBUS) {
+ u8 secbus = pci_config_readb(bdf, PCI_SECONDARY_BUS);
+ dev->secondary_bus = secbus;
+ if (secbus > bus && !busdevs[secbus])
+ busdevs[secbus] = dev;
+ if (secbus > MaxPCIBus)
+ MaxPCIBus = secbus;