|
From: | Xingang Wang |
Subject: | Re: [PATCH RFC RESEND v2 3/6] hw/pci: Add pci_root_bus_max_bus |
Date: | Tue, 13 Apr 2021 19:35:01 +0800 |
User-agent: | Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Thunderbird/78.5.1 |
Hi Eric, On 2021/4/13 16:05, Auger Eric wrote:
Hi Xingang, On 3/25/21 8:22 AM, Wang Xingang wrote:From: Xingang Wang <wangxingang5@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?
Thanks, I will change the description.
Signed-off-by: Xingang Wang <wangxingang5@huawei.com> Signed-off-by: Jiahui Cen <cenjiahui@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?
Thanks, I will simplify this.
+ 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, the secondary bus number should be taken into account. Maybe a pci_root_bus_range to get [min_bus, max_bus] would be better.
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));.
Xingang .
[Prev in Thread] | Current Thread | [Next in Thread] |