Hi Xingang, On 3/25/21 8:22 AM, Wang Xingang wrote: > From: Xingang Wang <wangxinga...@huawei.com> > > This helps to find max bus number of a root bus. s/max bus number of a root bus/highest bus number of a bridge hierarchy? > > Signed-off-by: Xingang Wang <wangxinga...@huawei.com> > Signed-off-by: Jiahui Cen <cenjia...@huawei.com> > --- > hw/pci/pci.c | 34 ++++++++++++++++++++++++++++++++++ > include/hw/pci/pci.h | 1 + > 2 files changed, 35 insertions(+) > > diff --git a/hw/pci/pci.c b/hw/pci/pci.c > index e17aa9075f..c7957cbf7c 100644 > --- a/hw/pci/pci.c > +++ b/hw/pci/pci.c > @@ -538,6 +538,40 @@ int pci_bus_num(PCIBus *s) > return PCI_BUS_GET_CLASS(s)->bus_num(s); > } > > +int pci_root_bus_max_bus(PCIBus *bus) > +{ > + PCIHostState *host; > + PCIDevice *dev; > + int max_bus = 0; > + int type, devfn; > + uint8_t subordinate; > + > + if (!pci_bus_is_root(bus)) { > + return 0; > + } > + > + host = PCI_HOST_BRIDGE(BUS(bus)->parent); > + max_bus = pci_bus_num(host->bus); > + > + for (devfn = 0; devfn < ARRAY_SIZE(host->bus->devices); devfn++) { > + dev = host->bus->devices[devfn]; > + > + if (!dev) { > + continue; > + } > + > + type = dev->config[PCI_HEADER_TYPE] & > ~PCI_HEADER_TYPE_MULTI_FUNCTION; Seems there is PCI_DEVICE_GET_CLASS(dev)->is_bridge (see pci_root_bus_in_range). Can't that be used instead? > + if (type == PCI_HEADER_TYPE_BRIDGE) { > + subordinate = dev->config[PCI_SUBORDINATE_BUS]; > + if (subordinate > max_bus) { > + max_bus = subordinate; what about the secondary bus number, it is always less than the others?
Thanks Eric > + } > + } > + } > + > + return max_bus; > +} > + > int pci_bus_numa_node(PCIBus *bus) > { > return PCI_BUS_GET_CLASS(bus)->numa_node(bus); > diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h > index 718b5a454a..e0c69534f4 100644 > --- a/include/hw/pci/pci.h > +++ b/include/hw/pci/pci.h > @@ -450,6 +450,7 @@ static inline PCIBus *pci_get_bus(const PCIDevice *dev) > return PCI_BUS(qdev_get_parent_bus(DEVICE(dev))); > } > int pci_bus_num(PCIBus *s); > +int pci_root_bus_max_bus(PCIBus *bus); > static inline int pci_dev_bus_num(const PCIDevice *dev) > { > return pci_bus_num(pci_get_bus(dev)); >