[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v5 13/18] pci: introduce pci_find_the_only_child()
From: |
Michael S. Tsirkin |
Subject: |
Re: [PATCH v5 13/18] pci: introduce pci_find_the_only_child() |
Date: |
Wed, 1 Mar 2023 16:09:44 -0500 |
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 <vsementsov@yandex-team.ru>
> Reviewed-by: Anton Kuchin <antonkuchin@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
- Re: [PATCH v5 13/18] pci: introduce pci_find_the_only_child(),
Michael S. Tsirkin <=