On Thu, Feb 16, 2023 at 09:03:51PM +0300, Vladimir Sementsov-Ogievskiy wrote: > To be used in further patch to identify the device hot-plugged into > pcie-root-port. > > Signed-off-by: Vladimir Sementsov-Ogievskiy <vsement...@yandex-team.ru> > Reviewed-by: Anton Kuchin <antonkuc...@yandex-team.ru>
Wait a second does this work for multifunction devices correctly? > --- > include/hw/pci/pci.h | 1 + > hw/pci/pci.c | 33 +++++++++++++++++++++++++++++++++ > 2 files changed, 34 insertions(+) > > diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h > index d5a40cd058..b6c9c44527 100644 > --- a/include/hw/pci/pci.h > +++ b/include/hw/pci/pci.h > @@ -341,6 +341,7 @@ void pci_for_each_device_under_bus_reverse(PCIBus *bus, > void pci_for_each_bus_depth_first(PCIBus *bus, pci_bus_ret_fn begin, > pci_bus_fn end, void *parent_state); > PCIDevice *pci_get_function_0(PCIDevice *pci_dev); > +PCIDevice *pci_find_the_only_child(PCIBus *bus, int bus_num, Error **errp); > > /* Use this wrapper when specific scan order is not required. */ > static inline > diff --git a/hw/pci/pci.c b/hw/pci/pci.c > index 208c16f450..34fd1fb5b8 100644 > --- a/hw/pci/pci.c > +++ b/hw/pci/pci.c > @@ -1771,6 +1771,39 @@ void pci_for_each_device(PCIBus *bus, int bus_num, > } > } > > +typedef struct TheOnlyChild { > + PCIDevice *dev; > + int count; > +} TheOnlyChild; > + > +static void the_only_child_fn(PCIBus *bus, PCIDevice *dev, void *opaque) > +{ > + TheOnlyChild *s = opaque; > + > + s->dev = dev; > + s->count++; > +} > + > +PCIDevice *pci_find_the_only_child(PCIBus *bus, int bus_num, Error **errp) > +{ > + TheOnlyChild res = {0}; > + > + pci_for_each_device(bus, bus_num, the_only_child_fn, &res); > + > + if (!res.dev) { > + assert(res.count == 0); > + error_setg(errp, "No child devices found"); > + return NULL; > + } > + > + if (res.count > 1) { > + error_setg(errp, "Several child devices found"); > + return NULL; > + } > + > + return res.dev; > +} > + > const pci_class_desc *get_class_desc(int class) > { > const pci_class_desc *desc; > -- > 2.34.1