Using a property allows us to hide the internal details of the PCI device
from the code to build a SRAT Generic Initiator Affinity Structure with
PCI Device Handle.
Suggested-by: Igor Mammedov <imammedo@redhat.com>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
---
V3: New patch
---
hw/acpi/acpi_generic_initiator.c | 11 ++++++-----
hw/pci/pci.c | 14 ++++++++++++++
2 files changed, 20 insertions(+), 5 deletions(-)
diff --git a/hw/acpi/acpi_generic_initiator.c b/hw/acpi/acpi_generic_initiator.c
index 73bafaaaea..34284359f0 100644
--- a/hw/acpi/acpi_generic_initiator.c
+++ b/hw/acpi/acpi_generic_initiator.c
@@ -9,6 +9,7 @@
#include "hw/boards.h"
#include "hw/pci/pci_device.h"
#include "qemu/error-report.h"
+#include "qapi/error.h"
typedef struct AcpiGenericInitiatorClass {
ObjectClass parent_class;
@@ -79,7 +80,7 @@ static int build_acpi_generic_initiator(Object *obj, void *opaque)
MachineState *ms = MACHINE(qdev_get_machine());
AcpiGenericInitiator *gi;
GArray *table_data = opaque;
- PCIDevice *pci_dev;
+ uint8_t bus, devfn;
Object *o;
if (!object_dynamic_cast(obj, TYPE_ACPI_GENERIC_INITIATOR)) {
@@ -100,10 +101,10 @@ static int build_acpi_generic_initiator(Object *obj, void *opaque)
exit(1);
}
- pci_dev = PCI_DEVICE(o);
- build_srat_pci_generic_initiator(table_data, gi->node, 0,
- pci_bus_num(pci_get_bus(pci_dev)),
- pci_dev->devfn);
+ bus = object_property_get_uint(o, "bus", &error_fatal);
+ devfn = object_property_get_uint(o, "addr", &error_fatal);
+
+ build_srat_pci_generic_initiator(table_data, gi->node, 0, bus, devfn);
return 0;
}
diff --git a/hw/pci/pci.c b/hw/pci/pci.c
index 324c1302d2..b4b499b172 100644
--- a/hw/pci/pci.c
+++ b/hw/pci/pci.c
@@ -67,6 +67,19 @@ static char *pcibus_get_fw_dev_path(DeviceState *dev);
static void pcibus_reset_hold(Object *obj, ResetType type);
static bool pcie_has_upstream_port(PCIDevice *dev);
+static void prop_pci_bus_get(Object *obj, Visitor *v, const char *name,
+ void *opaque, Error **errp)
+{
+ uint8_t bus = pci_dev_bus_num(PCI_DEVICE(obj));
+
+ visit_type_uint8(v, name, &bus, errp);
+}
+
+static const PropertyInfo prop_pci_bus = {
+ .name = "bus",
+ .get = prop_pci_bus_get,
+};
+
static Property pci_props[] = {
DEFINE_PROP_PCI_DEVFN("addr", PCIDevice, devfn, -1),
DEFINE_PROP_STRING("romfile", PCIDevice, romfile),
@@ -85,6 +98,7 @@ static Property pci_props[] = {
QEMU_PCIE_ERR_UNC_MASK_BITNR, true),
DEFINE_PROP_BIT("x-pcie-ari-nextfn-1", PCIDevice, cap_present,
QEMU_PCIE_ARI_NEXTFN_1_BITNR, false),
+ { .name = "bus", .info = &prop_pci_bus },
DEFINE_PROP_END_OF_LIST()
};
--
2.43.0
On Thu, 20 Jun 2024 17:03:13 +0100
Jonathan Cameron <Jonathan.Cameron@huawei.com> wrote:
> Using a property allows us to hide the internal details of the PCI device
> from the code to build a SRAT Generic Initiator Affinity Structure with
> PCI Device Handle.
>
> Suggested-by: Igor Mammedov <imammedo@redhat.com>
> Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
>
> ---
> V3: New patch
> ---
> hw/acpi/acpi_generic_initiator.c | 11 ++++++-----
> hw/pci/pci.c | 14 ++++++++++++++
> 2 files changed, 20 insertions(+), 5 deletions(-)
>
> diff --git a/hw/acpi/acpi_generic_initiator.c b/hw/acpi/acpi_generic_initiator.c
> index 73bafaaaea..34284359f0 100644
> --- a/hw/acpi/acpi_generic_initiator.c
> +++ b/hw/acpi/acpi_generic_initiator.c
> @@ -9,6 +9,7 @@
> #include "hw/boards.h"
> #include "hw/pci/pci_device.h"
> #include "qemu/error-report.h"
> +#include "qapi/error.h"
>
> typedef struct AcpiGenericInitiatorClass {
> ObjectClass parent_class;
> @@ -79,7 +80,7 @@ static int build_acpi_generic_initiator(Object *obj, void *opaque)
> MachineState *ms = MACHINE(qdev_get_machine());
> AcpiGenericInitiator *gi;
> GArray *table_data = opaque;
> - PCIDevice *pci_dev;
> + uint8_t bus, devfn;
> Object *o;
>
> if (!object_dynamic_cast(obj, TYPE_ACPI_GENERIC_INITIATOR)) {
> @@ -100,10 +101,10 @@ static int build_acpi_generic_initiator(Object *obj, void *opaque)
> exit(1);
> }
>
> - pci_dev = PCI_DEVICE(o);
> - build_srat_pci_generic_initiator(table_data, gi->node, 0,
> - pci_bus_num(pci_get_bus(pci_dev)),
> - pci_dev->devfn);
> + bus = object_property_get_uint(o, "bus", &error_fatal);
> + devfn = object_property_get_uint(o, "addr", &error_fatal);
> +
> + build_srat_pci_generic_initiator(table_data, gi->node, 0, bus, devfn);
>
> return 0;
> }
> diff --git a/hw/pci/pci.c b/hw/pci/pci.c
> index 324c1302d2..b4b499b172 100644
> --- a/hw/pci/pci.c
> +++ b/hw/pci/pci.c
> @@ -67,6 +67,19 @@ static char *pcibus_get_fw_dev_path(DeviceState *dev);
> static void pcibus_reset_hold(Object *obj, ResetType type);
> static bool pcie_has_upstream_port(PCIDevice *dev);
>
> +static void prop_pci_bus_get(Object *obj, Visitor *v, const char *name,
> + void *opaque, Error **errp)
> +{
> + uint8_t bus = pci_dev_bus_num(PCI_DEVICE(obj));
> +
> + visit_type_uint8(v, name, &bus, errp);
> +}
> +
> +static const PropertyInfo prop_pci_bus = {
> + .name = "bus",
/me confused,
didn't we have 'bus' property for PCI devices already?
i.e. I can add PCI device like this
-device e1000,bus=pci.0,addr=0x6,...
> + .get = prop_pci_bus_get,
> +};
> +
> static Property pci_props[] = {
> DEFINE_PROP_PCI_DEVFN("addr", PCIDevice, devfn, -1),
> DEFINE_PROP_STRING("romfile", PCIDevice, romfile),
> @@ -85,6 +98,7 @@ static Property pci_props[] = {
> QEMU_PCIE_ERR_UNC_MASK_BITNR, true),
> DEFINE_PROP_BIT("x-pcie-ari-nextfn-1", PCIDevice, cap_present,
> QEMU_PCIE_ARI_NEXTFN_1_BITNR, false),
> + { .name = "bus", .info = &prop_pci_bus },
> DEFINE_PROP_END_OF_LIST()
> };
>
On Thu, 27 Jun 2024 15:09:12 +0200
Igor Mammedov <imammedo@redhat.com> wrote:
> On Thu, 20 Jun 2024 17:03:13 +0100
> Jonathan Cameron <Jonathan.Cameron@huawei.com> wrote:
>
> > Using a property allows us to hide the internal details of the PCI device
> > from the code to build a SRAT Generic Initiator Affinity Structure with
> > PCI Device Handle.
> >
> > Suggested-by: Igor Mammedov <imammedo@redhat.com>
> > Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
> >
> > ---
> > V3: New patch
> > ---
> > hw/acpi/acpi_generic_initiator.c | 11 ++++++-----
> > hw/pci/pci.c | 14 ++++++++++++++
> > 2 files changed, 20 insertions(+), 5 deletions(-)
> >
> > diff --git a/hw/acpi/acpi_generic_initiator.c b/hw/acpi/acpi_generic_initiator.c
> > index 73bafaaaea..34284359f0 100644
> > --- a/hw/acpi/acpi_generic_initiator.c
> > +++ b/hw/acpi/acpi_generic_initiator.c
> > @@ -9,6 +9,7 @@
> > #include "hw/boards.h"
> > #include "hw/pci/pci_device.h"
> > #include "qemu/error-report.h"
> > +#include "qapi/error.h"
> >
> > typedef struct AcpiGenericInitiatorClass {
> > ObjectClass parent_class;
> > @@ -79,7 +80,7 @@ static int build_acpi_generic_initiator(Object *obj, void *opaque)
> > MachineState *ms = MACHINE(qdev_get_machine());
> > AcpiGenericInitiator *gi;
> > GArray *table_data = opaque;
> > - PCIDevice *pci_dev;
> > + uint8_t bus, devfn;
> > Object *o;
> >
> > if (!object_dynamic_cast(obj, TYPE_ACPI_GENERIC_INITIATOR)) {
> > @@ -100,10 +101,10 @@ static int build_acpi_generic_initiator(Object *obj, void *opaque)
> > exit(1);
> > }
> >
> > - pci_dev = PCI_DEVICE(o);
> > - build_srat_pci_generic_initiator(table_data, gi->node, 0,
> > - pci_bus_num(pci_get_bus(pci_dev)),
> > - pci_dev->devfn);
> > + bus = object_property_get_uint(o, "bus", &error_fatal);
> > + devfn = object_property_get_uint(o, "addr", &error_fatal);
> > +
> > + build_srat_pci_generic_initiator(table_data, gi->node, 0, bus, devfn);
> >
> > return 0;
> > }
> > diff --git a/hw/pci/pci.c b/hw/pci/pci.c
> > index 324c1302d2..b4b499b172 100644
> > --- a/hw/pci/pci.c
> > +++ b/hw/pci/pci.c
> > @@ -67,6 +67,19 @@ static char *pcibus_get_fw_dev_path(DeviceState *dev);
> > static void pcibus_reset_hold(Object *obj, ResetType type);
> > static bool pcie_has_upstream_port(PCIDevice *dev);
> >
> > +static void prop_pci_bus_get(Object *obj, Visitor *v, const char *name,
> > + void *opaque, Error **errp)
> > +{
> > + uint8_t bus = pci_dev_bus_num(PCI_DEVICE(obj));
> > +
> > + visit_type_uint8(v, name, &bus, errp);
> > +}
> > +
> > +static const PropertyInfo prop_pci_bus = {
> > + .name = "bus",
>
> /me confused,
> didn't we have 'bus' property for PCI devices already?
>
> i.e. I can add PCI device like this
> -device e1000,bus=pci.0,addr=0x6,...
to avoid confusion, I'd suggest to name it to 'busnr'
(or be more specific (primary|secondary)_busnr if applicable)
>
>
> > + .get = prop_pci_bus_get,
> > +};
> > +
> > static Property pci_props[] = {
> > DEFINE_PROP_PCI_DEVFN("addr", PCIDevice, devfn, -1),
> > DEFINE_PROP_STRING("romfile", PCIDevice, romfile),
> > @@ -85,6 +98,7 @@ static Property pci_props[] = {
> > QEMU_PCIE_ERR_UNC_MASK_BITNR, true),
> > DEFINE_PROP_BIT("x-pcie-ari-nextfn-1", PCIDevice, cap_present,
> > QEMU_PCIE_ARI_NEXTFN_1_BITNR, false),
> > + { .name = "bus", .info = &prop_pci_bus },
> > DEFINE_PROP_END_OF_LIST()
> > };
> >
>
On Fri, 28 Jun 2024 13:58:04 +0200
Igor Mammedov <imammedo@redhat.com> wrote:
> On Thu, 27 Jun 2024 15:09:12 +0200
> Igor Mammedov <imammedo@redhat.com> wrote:
>
> > On Thu, 20 Jun 2024 17:03:13 +0100
> > Jonathan Cameron <Jonathan.Cameron@huawei.com> wrote:
> >
> > > Using a property allows us to hide the internal details of the PCI device
> > > from the code to build a SRAT Generic Initiator Affinity Structure with
> > > PCI Device Handle.
> > >
> > > Suggested-by: Igor Mammedov <imammedo@redhat.com>
> > > Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
> > >
> > > ---
> > > V3: New patch
> > > ---
> > > hw/acpi/acpi_generic_initiator.c | 11 ++++++-----
> > > hw/pci/pci.c | 14 ++++++++++++++
> > > 2 files changed, 20 insertions(+), 5 deletions(-)
> > >
> > > diff --git a/hw/acpi/acpi_generic_initiator.c b/hw/acpi/acpi_generic_initiator.c
> > > index 73bafaaaea..34284359f0 100644
> > > --- a/hw/acpi/acpi_generic_initiator.c
> > > +++ b/hw/acpi/acpi_generic_initiator.c
> > > @@ -9,6 +9,7 @@
> > > #include "hw/boards.h"
> > > #include "hw/pci/pci_device.h"
> > > #include "qemu/error-report.h"
> > > +#include "qapi/error.h"
> > >
> > > typedef struct AcpiGenericInitiatorClass {
> > > ObjectClass parent_class;
> > > @@ -79,7 +80,7 @@ static int build_acpi_generic_initiator(Object *obj, void *opaque)
> > > MachineState *ms = MACHINE(qdev_get_machine());
> > > AcpiGenericInitiator *gi;
> > > GArray *table_data = opaque;
> > > - PCIDevice *pci_dev;
> > > + uint8_t bus, devfn;
> > > Object *o;
> > >
> > > if (!object_dynamic_cast(obj, TYPE_ACPI_GENERIC_INITIATOR)) {
> > > @@ -100,10 +101,10 @@ static int build_acpi_generic_initiator(Object *obj, void *opaque)
> > > exit(1);
> > > }
> > >
> > > - pci_dev = PCI_DEVICE(o);
> > > - build_srat_pci_generic_initiator(table_data, gi->node, 0,
> > > - pci_bus_num(pci_get_bus(pci_dev)),
> > > - pci_dev->devfn);
> > > + bus = object_property_get_uint(o, "bus", &error_fatal);
> > > + devfn = object_property_get_uint(o, "addr", &error_fatal);
> > > +
> > > + build_srat_pci_generic_initiator(table_data, gi->node, 0, bus, devfn);
> > >
> > > return 0;
> > > }
> > > diff --git a/hw/pci/pci.c b/hw/pci/pci.c
> > > index 324c1302d2..b4b499b172 100644
> > > --- a/hw/pci/pci.c
> > > +++ b/hw/pci/pci.c
> > > @@ -67,6 +67,19 @@ static char *pcibus_get_fw_dev_path(DeviceState *dev);
> > > static void pcibus_reset_hold(Object *obj, ResetType type);
> > > static bool pcie_has_upstream_port(PCIDevice *dev);
> > >
> > > +static void prop_pci_bus_get(Object *obj, Visitor *v, const char *name,
> > > + void *opaque, Error **errp)
> > > +{
> > > + uint8_t bus = pci_dev_bus_num(PCI_DEVICE(obj));
> > > +
> > > + visit_type_uint8(v, name, &bus, errp);
> > > +}
> > > +
> > > +static const PropertyInfo prop_pci_bus = {
> > > + .name = "bus",
> >
> > /me confused,
> > didn't we have 'bus' property for PCI devices already?
> >
> > i.e. I can add PCI device like this
> > -device e1000,bus=pci.0,addr=0x6,...
>
> to avoid confusion, I'd suggest to name it to 'busnr'
> (or be more specific (primary|secondary)_busnr if applicable)
For generic initiators we are always dealing with an EP so I think
busnr alone is appropriate. If we need similar for bridges we
can add that later.
>
> >
> >
> > > + .get = prop_pci_bus_get,
> > > +};
> > > +
> > > static Property pci_props[] = {
> > > DEFINE_PROP_PCI_DEVFN("addr", PCIDevice, devfn, -1),
> > > DEFINE_PROP_STRING("romfile", PCIDevice, romfile),
> > > @@ -85,6 +98,7 @@ static Property pci_props[] = {
> > > QEMU_PCIE_ERR_UNC_MASK_BITNR, true),
> > > DEFINE_PROP_BIT("x-pcie-ari-nextfn-1", PCIDevice, cap_present,
> > > QEMU_PCIE_ARI_NEXTFN_1_BITNR, false),
> > > + { .name = "bus", .info = &prop_pci_bus },
> > > DEFINE_PROP_END_OF_LIST()
> > > };
> > >
> >
>
>
© 2016 - 2026 Red Hat, Inc.