diff options
author | Xingang Wang <wangxingang5@huawei.com> | 2021-07-08 12:55:15 +0000 |
---|---|---|
committer | Michael S. Tsirkin <mst@redhat.com> | 2021-07-16 11:10:45 -0400 |
commit | 500db1daf3079c3d0222bd3963cf4e5bf6175175 (patch) | |
tree | a11dc39c0579e191075e37e4b35130af0ecc0715 | |
parent | c9e96b04fc192fb38622694947dae091bbbdf28f (diff) | |
download | qemu-500db1daf3079c3d0222bd3963cf4e5bf6175175.zip qemu-500db1daf3079c3d0222bd3963cf4e5bf6175175.tar.gz qemu-500db1daf3079c3d0222bd3963cf4e5bf6175175.tar.bz2 |
hw/pci: Add pci_bus_range() to get PCI bus number range
This helps to get the min and max bus number of a PCI bus hierarchy.
Signed-off-by: Xingang Wang <wangxingang5@huawei.com>
Reviewed-by: Eric Auger <eric.auger@redhat.com>
Message-Id: <1625748919-52456-6-git-send-email-wangxingang5@huawei.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
-rw-r--r-- | hw/pci/pci.c | 16 | ||||
-rw-r--r-- | include/hw/pci/pci.h | 1 |
2 files changed, 17 insertions, 0 deletions
diff --git a/hw/pci/pci.c b/hw/pci/pci.c index 27d588e..23d2ae2 100644 --- a/hw/pci/pci.c +++ b/hw/pci/pci.c @@ -537,6 +537,22 @@ int pci_bus_num(PCIBus *s) return PCI_BUS_GET_CLASS(s)->bus_num(s); } +/* Returns the min and max bus numbers of a PCI bus hierarchy */ +void pci_bus_range(PCIBus *bus, int *min_bus, int *max_bus) +{ + int i; + *min_bus = *max_bus = pci_bus_num(bus); + + for (i = 0; i < ARRAY_SIZE(bus->devices); ++i) { + PCIDevice *dev = bus->devices[i]; + + if (dev && PCI_DEVICE_GET_CLASS(dev)->is_bridge) { + *min_bus = MIN(*min_bus, dev->config[PCI_SECONDARY_BUS]); + *max_bus = MAX(*max_bus, dev->config[PCI_SUBORDINATE_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 f4d51b6..d0f4266 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); +void pci_bus_range(PCIBus *bus, int *min_bus, int *max_bus); static inline int pci_dev_bus_num(const PCIDevice *dev) { return pci_bus_num(pci_get_bus(dev)); |