[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH RFC RESEND v2 3/6] hw/pci: Add pci_root_bus_max_bus
From: |
Auger Eric |
Subject: |
Re: [PATCH RFC RESEND v2 3/6] hw/pci: Add pci_root_bus_max_bus |
Date: |
Tue, 13 Apr 2021 10:05:47 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.8.0 |
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?
>
> 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?
> + 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));
>
- Re: [PATCH RFC RESEND v2 3/6] hw/pci: Add pci_root_bus_max_bus,
Auger Eric <=