From: Xingang Wang <wangxinga...@huawei.com> This helps to find max bus number of a root bus.
Signed-off-by: Xingang Wang <wangxinga...@huawei.com> Signed-off-by: Jiahui Cen <cenjia...@huawei.com> --- hw/pci/pci.c | 33 +++++++++++++++++++++++++++++++++ include/hw/pci/pci.h | 1 + 2 files changed, 34 insertions(+) diff --git a/hw/pci/pci.c b/hw/pci/pci.c index dc969989c9..ed92ce0971 100644 --- a/hw/pci/pci.c +++ b/hw/pci/pci.c @@ -516,6 +516,39 @@ 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; + int max_bus = 0; + int type; + int devfn; + + 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++) { + PCIDevice *dev = host->bus->devices[devfn]; + + if (!dev) { + continue; + } + + type = dev->config[PCI_HEADER_TYPE] & ~PCI_HEADER_TYPE_MULTI_FUNCTION; + if (type == PCI_HEADER_TYPE_BRIDGE) { + uint8_t subordinate = dev->config[PCI_SUBORDINATE_BUS]; + if (subordinate > max_bus) { + max_bus = subordinate; + } + } + } + + 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 1bc231480f..238b91817a 100644 --- a/include/hw/pci/pci.h +++ b/include/hw/pci/pci.h @@ -449,6 +449,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)); -- 2.19.1