Message ID | 1616656965-23328-4-git-send-email-wangxingang5@huawei.com |
---|---|
State | New |
Headers | show |
Series | Introduce IOMMU Option For PCI Root Bus | expand |
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)); >
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 .
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; + if (type == PCI_HEADER_TYPE_BRIDGE) { + 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 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));