From: Marcel Apfelbaum marcel.a@redhat.com
This is a marker interface used to differentiate the "default" host bridge on a system with multiple host bridges. This differentiation is required only for pc machines for now by the ACPI subsystem.
Signed-off-by: Marcel Apfelbaum marcel@redhat.com --- hw/i386/acpi-build.c | 9 ++++++--- hw/pci-host/piix.c | 5 +++++ hw/pci-host/q35.c | 4 ++++ hw/pci/pci_host.c | 6 ++++++ include/hw/pci/pci_host.h | 7 +++++++ 5 files changed, 28 insertions(+), 3 deletions(-)
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c index b2b0036..cee150b 100644 --- a/hw/i386/acpi-build.c +++ b/hw/i386/acpi-build.c @@ -250,7 +250,8 @@ static void acpi_get_pci_info(PcPciInfo *info) Object *pci_host; bool ambiguous;
- pci_host = object_resolve_path_type("", TYPE_PCI_HOST_BRIDGE, &ambiguous); + pci_host = object_resolve_path_type("", TYPE_PCI_MAIN_HOST_BRIDGE, + &ambiguous); g_assert(!ambiguous); g_assert(pci_host);
@@ -1267,7 +1268,8 @@ build_ssdt(AcpiAml *table_aml, GArray *linker, PCIBus *bus = NULL; bool ambiguous;
- pci_host = object_resolve_path_type("", TYPE_PCI_HOST_BRIDGE, &ambiguous); + pci_host = object_resolve_path_type("", TYPE_PCI_MAIN_HOST_BRIDGE, + &ambiguous); if (!ambiguous && pci_host) { bus = PCI_HOST_BRIDGE(pci_host)->bus; } @@ -1610,7 +1612,8 @@ static bool acpi_get_mcfg(AcpiMcfgInfo *mcfg) QObject *o; bool ambiguous;
- pci_host = object_resolve_path_type("", TYPE_PCI_HOST_BRIDGE, &ambiguous); + pci_host = object_resolve_path_type("", TYPE_PCI_MAIN_HOST_BRIDGE, + &ambiguous); g_assert(!ambiguous); g_assert(pci_host);
diff --git a/hw/pci-host/piix.c b/hw/pci-host/piix.c index f7cfbc8..970b9e9 100644 --- a/hw/pci-host/piix.c +++ b/hw/pci-host/piix.c @@ -767,6 +767,11 @@ static const TypeInfo i440fx_pcihost_info = { .instance_size = sizeof(I440FXState), .instance_init = i440fx_pcihost_initfn, .class_init = i440fx_pcihost_class_init, + .interfaces = (InterfaceInfo[]) { + { TYPE_PCI_MAIN_HOST_BRIDGE }, + { } + } + };
static void i440fx_register_types(void) diff --git a/hw/pci-host/q35.c b/hw/pci-host/q35.c index c36fefa..bd41465 100644 --- a/hw/pci-host/q35.c +++ b/hw/pci-host/q35.c @@ -193,6 +193,10 @@ static const TypeInfo q35_host_info = { .instance_size = sizeof(Q35PCIHost), .instance_init = q35_host_initfn, .class_init = q35_host_class_init, + .interfaces = (InterfaceInfo[]) { + { TYPE_PCI_MAIN_HOST_BRIDGE }, + { } + } };
/**************************************************************************** diff --git a/hw/pci/pci_host.c b/hw/pci/pci_host.c index 3e26f92..87180c8 100644 --- a/hw/pci/pci_host.c +++ b/hw/pci/pci_host.c @@ -175,6 +175,11 @@ const MemoryRegionOps pci_host_data_be_ops = { .endianness = DEVICE_BIG_ENDIAN, };
+static const TypeInfo pci_main_host_interface_info = { + .name = TYPE_PCI_MAIN_HOST_BRIDGE, + .parent = TYPE_INTERFACE, +}; + static const TypeInfo pci_host_type_info = { .name = TYPE_PCI_HOST_BRIDGE, .parent = TYPE_SYS_BUS_DEVICE, @@ -185,6 +190,7 @@ static const TypeInfo pci_host_type_info = {
static void pci_host_register_types(void) { + type_register_static(&pci_main_host_interface_info); type_register_static(&pci_host_type_info); }
diff --git a/include/hw/pci/pci_host.h b/include/hw/pci/pci_host.h index ba31595..3c72e26 100644 --- a/include/hw/pci/pci_host.h +++ b/include/hw/pci/pci_host.h @@ -30,6 +30,13 @@
#include "hw/sysbus.h"
+/** + * Marker interface for classes whose instances can + * be main host bridges. It is intended to be used + * when the QOM tree includes multiple host bridges. + */ +#define TYPE_PCI_MAIN_HOST_BRIDGE "pci-main-host-bridge" + #define TYPE_PCI_HOST_BRIDGE "pci-host-bridge" #define PCI_HOST_BRIDGE(obj) \ OBJECT_CHECK(PCIHostState, (obj), TYPE_PCI_HOST_BRIDGE)