[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH V6 for-2.3 10/26] hw/pci: made pci_bus_is_root a
From: |
Michael S. Tsirkin |
Subject: |
Re: [Qemu-devel] [PATCH V6 for-2.3 10/26] hw/pci: made pci_bus_is_root a PCIBusClass method |
Date: |
Mon, 27 Apr 2015 13:37:58 +0200 |
On Thu, Mar 19, 2015 at 08:52:45PM +0200, Marcel Apfelbaum wrote:
> From: Marcel Apfelbaum <address@hidden>
>
> Refactoring it as a method of PCIBusClass will allow
> different implementations for subclasses.
>
> Removed the assumption that the root bus does not
> have a parent device because is specific only
> to the default class implementation.
>
> Signed-off-by: Marcel Apfelbaum <address@hidden>
Or just add bool is_root there?
Won't that be simpler?
> ---
> hw/pci/pci.c | 11 ++++-------
> hw/pci/pci_bus.c | 9 +++++++++
> hw/vfio/pci.c | 1 +
> include/hw/pci/pci.h | 1 -
> include/hw/pci/pci_bus.h | 15 +++++++++++++++
> 5 files changed, 29 insertions(+), 8 deletions(-)
>
> diff --git a/hw/pci/pci.c b/hw/pci/pci.c
> index cb63a21..376b42d 100644
> --- a/hw/pci/pci.c
> +++ b/hw/pci/pci.c
> @@ -205,7 +205,10 @@ PCIBus *pci_device_root_bus(const PCIDevice *d)
> {
> PCIBus *bus = d->bus;
>
> - while ((d = bus->parent_dev) != NULL) {
> + while (!pci_bus_is_root(bus)) {
> + d = bus->parent_dev;
> + assert(d != NULL);
> +
> bus = d->bus;
> }
>
> @@ -218,7 +221,6 @@ const char *pci_root_bus_path(PCIDevice *dev)
> PCIHostState *host_bridge = PCI_HOST_BRIDGE(rootbus->qbus.parent);
> PCIHostBridgeClass *hc = PCI_HOST_BRIDGE_GET_CLASS(host_bridge);
>
> - assert(!rootbus->parent_dev);
> assert(host_bridge->bus == rootbus);
>
> if (hc->root_bus_path) {
> @@ -250,11 +252,6 @@ bool pci_bus_is_express(PCIBus *bus)
> return object_dynamic_cast(OBJECT(bus), TYPE_PCIE_BUS);
> }
>
> -bool pci_bus_is_root(PCIBus *bus)
> -{
> - return !bus->parent_dev;
> -}
> -
> void pci_bus_new_inplace(PCIBus *bus, size_t bus_size, DeviceState *parent,
> const char *name,
> MemoryRegion *address_space_mem,
> diff --git a/hw/pci/pci_bus.c b/hw/pci/pci_bus.c
> index d156194..0922a75 100644
> --- a/hw/pci/pci_bus.c
> +++ b/hw/pci/pci_bus.c
> @@ -464,9 +464,15 @@ static void pcibus_reset(BusState *qbus)
> }
> }
>
> +static bool pcibus_is_root(PCIBus *bus)
> +{
> + return !bus->parent_dev;
> +}
> +
> static void pci_bus_class_init(ObjectClass *klass, void *data)
> {
> BusClass *k = BUS_CLASS(klass);
> + PCIBusClass *pbc = PCI_BUS_CLASS(klass);
>
> k->print_dev = pcibus_dev_print;
> k->get_dev_path = pcibus_get_dev_path;
> @@ -474,11 +480,14 @@ static void pci_bus_class_init(ObjectClass *klass, void
> *data)
> k->realize = pci_bus_realize;
> k->unrealize = pci_bus_unrealize;
> k->reset = pcibus_reset;
> +
> + pbc->is_root = pcibus_is_root;
> }
>
> static const TypeInfo pci_bus_info = {
> .name = TYPE_PCI_BUS,
> .parent = TYPE_BUS,
> + .class_size = sizeof(PCIBusClass),
> .instance_size = sizeof(PCIBus),
> .class_init = pci_bus_class_init,
> };
> diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c
> index 6b80539..7b08d03 100644
> --- a/hw/vfio/pci.c
> +++ b/hw/vfio/pci.c
> @@ -32,6 +32,7 @@
> #include "hw/pci/msi.h"
> #include "hw/pci/msix.h"
> #include "hw/pci/pci.h"
> +#include "hw/pci/pci_bus.h"
> #include "qemu-common.h"
> #include "qemu/error-report.h"
> #include "qemu/event_notifier.h"
> diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h
> index 47077cd..ae2c4a5 100644
> --- a/include/hw/pci/pci.h
> +++ b/include/hw/pci/pci.h
> @@ -340,7 +340,6 @@ typedef PCIINTxRoute (*pci_route_irq_fn)(void *opaque,
> int pin);
> #define TYPE_PCIE_BUS "PCIE"
>
> bool pci_bus_is_express(PCIBus *bus);
> -bool pci_bus_is_root(PCIBus *bus);
> void pci_bus_new_inplace(PCIBus *bus, size_t bus_size, DeviceState *parent,
> const char *name,
> MemoryRegion *address_space_mem,
> diff --git a/include/hw/pci/pci_bus.h b/include/hw/pci/pci_bus.h
> index ea427a3..306ef10 100644
> --- a/include/hw/pci/pci_bus.h
> +++ b/include/hw/pci/pci_bus.h
> @@ -15,6 +15,16 @@ PciDeviceInfoList *qmp_query_pci_devices(PCIBus *bus, int
> bus_num);
>
> #define TYPE_PCI_BUS "PCI"
> #define PCI_BUS(obj) OBJECT_CHECK(PCIBus, (obj), TYPE_PCI_BUS)
> +#define PCI_BUS_CLASS(klass) OBJECT_CLASS_CHECK(PCIBusClass, (klass),
> TYPE_PCI_BUS)
> +#define PCI_BUS_GET_CLASS(obj) OBJECT_GET_CLASS(PCIBusClass, (obj),
> TYPE_PCI_BUS)
> +
> +typedef struct PCIBusClass {
> + /*< private >*/
> + BusClass parent_class;
> + /*< public >*/
> +
> + bool (*is_root)(PCIBus *bus);
> +} PCIBusClass;
>
> struct PCIBus {
> BusState qbus;
> @@ -39,6 +49,11 @@ struct PCIBus {
> int *irq_count;
> };
>
> +static inline bool pci_bus_is_root(PCIBus *bus)
> +{
> + return PCI_BUS_GET_CLASS(bus)->is_root(bus);
> +}
> +
> typedef struct PCIBridgeWindows PCIBridgeWindows;
>
> /*
> --
> 2.1.0
- Re: [Qemu-devel] [PATCH V6 for-2.3 10/26] hw/pci: made pci_bus_is_root a PCIBusClass method,
Michael S. Tsirkin <=