On 5/20/25 10:00 PM, Gustavo Romero wrote:
> Hi Eric,
>
> On 5/14/25 14:01, Eric Auger wrote:
>> pcihp acpi_set_pci_info() generic code currently uses
>> acpi_get_i386_pci_host() to retrieve the pci host bridge.
>>
>> Let's rename acpi_get_i386_pci_host into acpi_get_pci_host and
>> move it in pci generic code.
>>
>> The helper is augmented with the support of ARM GPEX.
>>
>> Signed-off-by: Eric Auger <eric.au...@redhat.com>
>> ---
>> include/hw/acpi/pci.h | 2 ++
>> hw/acpi/pci.c | 20 ++++++++++++++++++++
>> hw/acpi/pcihp.c | 3 ++-
>> hw/i386/acpi-build.c | 24 ++++--------------------
>> 4 files changed, 28 insertions(+), 21 deletions(-)
>>
>> diff --git a/include/hw/acpi/pci.h b/include/hw/acpi/pci.h
>> index 4dca22c0e2..310cbd02db 100644
>> --- a/include/hw/acpi/pci.h
>> +++ b/include/hw/acpi/pci.h
>> @@ -41,4 +41,6 @@ void build_pci_bridge_aml(AcpiDevAmlIf *adev, Aml
>> *scope);
>> void build_srat_generic_affinity_structures(GArray *table_data);
>> +Object *acpi_get_pci_host(void);
>> +
>> #endif
>> diff --git a/hw/acpi/pci.c b/hw/acpi/pci.c
>> index d511a85029..4191886ebe 100644
>> --- a/hw/acpi/pci.c
>> +++ b/hw/acpi/pci.c
>> @@ -26,6 +26,7 @@
>> #include "qemu/osdep.h"
>> #include "qemu/error-report.h"
>> #include "qom/object_interfaces.h"
>> +#include "qom/object.h"
>> #include "qapi/error.h"
>> #include "hw/boards.h"
>> #include "hw/acpi/aml-build.h"
>> @@ -33,6 +34,9 @@
>> #include "hw/pci/pci_bridge.h"
>> #include "hw/pci/pci_device.h"
>> #include "hw/pci/pcie_host.h"
>> +#include "hw/pci-host/i440fx.h"
>> +#include "hw/pci-host/q35.h"
>> +#include "hw/pci-host/gpex.h"
>> /*
>> * PCI Firmware Specification, Revision 3.0
>> @@ -301,3 +305,19 @@ void
>> build_srat_generic_affinity_structures(GArray *table_data)
>> object_child_foreach_recursive(object_get_root(),
>> build_acpi_generic_port,
>> table_data);
>> }
>> +
>> +Object *acpi_get_pci_host(void)
>> +{
>> + Object *host;
>> +
>> + host =
>> object_resolve_type_unambiguous(TYPE_I440FX_PCI_HOST_BRIDGE, NULL);
>> + if (host) {
>> + return host;
>> + }
>> + host = object_resolve_type_unambiguous(TYPE_Q35_HOST_DEVICE, NULL);
>> + if (host) {
>> + return host;
>> + }
>> + host = object_resolve_type_unambiguous(TYPE_GPEX_HOST, NULL);
>> + return host;
>> +}
>> diff --git a/hw/acpi/pcihp.c b/hw/acpi/pcihp.c
>> index 942669ea89..d800371ddc 100644
>> --- a/hw/acpi/pcihp.c
>> +++ b/hw/acpi/pcihp.c
>> @@ -36,6 +36,7 @@
>> #include "hw/pci-bridge/xio3130_downstream.h"
>> #include "hw/i386/acpi-build.h"
>> #include "hw/acpi/acpi.h"
>> +#include "hw/acpi/pci.h"
>> #include "hw/pci/pci_bus.h"
>> #include "migration/vmstate.h"
>> #include "qapi/error.h"
>> @@ -102,7 +103,7 @@ static void *acpi_set_bsel(PCIBus *bus, void
>> *opaque)
>> static void acpi_set_pci_info(bool has_bridge_hotplug)
>> {
>> static bool bsel_is_set;
>> - Object *host = acpi_get_i386_pci_host();
>> + Object *host = acpi_get_pci_host();
>> PCIBus *bus;
>> BSELInfo info = { .bsel_alloc = ACPI_PCIHP_BSEL_DEFAULT,
>> .has_bridge_hotplug = has_bridge_hotplug };
>> diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
>> index 06b4b8eed4..bcfba2ccb3 100644
>> --- a/hw/i386/acpi-build.c
>> +++ b/hw/i386/acpi-build.c
>> @@ -269,27 +269,11 @@ static void acpi_get_misc_info(AcpiMiscInfo *info)
>> #endif
>> }
>> -/*
>> - * Because of the PXB hosts we cannot simply query
>> TYPE_PCI_HOST_BRIDGE.
>> - * On i386 arch we only have two pci hosts, so we can look only for
>> them.
>> - */
>> -Object *acpi_get_i386_pci_host(void)
>> -{
>> - PCIHostState *host;
>> -
>> - host = PCI_HOST_BRIDGE(object_resolve_path("/machine/i440fx",
>> NULL));
>> - if (!host) {
>> - host = PCI_HOST_BRIDGE(object_resolve_path("/machine/q35",
>> NULL));
>> - }
>> -
>> - return OBJECT(host);
>> -}
>> -
>
> It's also possible to add a child prop to the TYPE_GPEX_HOST in
> create_pcie, like:
>
> @@ -1510,6 +1510,7 @@ static void create_pcie(VirtMachineState *vms)
> MachineClass *mc = MACHINE_GET_CLASS(ms);
>
> dev = qdev_new(TYPE_GPEX_HOST);
> + object_property_add_child(OBJECT(vms), "gpex", OBJECT(dev));
>
> then follow to logic in acpi_get_i386_pci_host via:
>
> PCI_HOST_BRIDGE(object_resolve_path("/machine/gpex", NULL))
indeed
>
> but I like better your solution of using the final class types, so:
>
> Reviewed-by: Gustavo Romero <gustavo.rom...@linaro.org>
OK thanks! I described that change in the commit msg because it was
effectively not properly described.
Cheers
Eric
>
>
> Cheers,
> Gustavo
>
>> static void acpi_get_pci_holes(Range *hole, Range *hole64)
>> {
>> Object *pci_host;
>> - pci_host = acpi_get_i386_pci_host();
>> + pci_host = acpi_get_pci_host();
>> if (!pci_host) {
>> return;
>> @@ -1245,7 +1229,7 @@ build_dsdt(GArray *table_data, BIOSLinker *linker,
>> sb_scope = aml_scope("\\_SB");
>> {
>> - Object *pci_host = acpi_get_i386_pci_host();
>> + Object *pci_host = acpi_get_pci_host();
>> if (pci_host) {
>> PCIBus *pbus = PCI_HOST_BRIDGE(pci_host)->bus;
>> @@ -1306,7 +1290,7 @@ build_dsdt(GArray *table_data, BIOSLinker *linker,
>> if (pm->pcihp_bridge_en || pm->pcihp_root_en) {
>> bool has_pcnt;
>> - Object *pci_host = acpi_get_i386_pci_host();
>> + Object *pci_host = acpi_get_pci_host();
>> PCIBus *b = PCI_HOST_BRIDGE(pci_host)->bus;
>> scope = aml_scope("\\_SB.PCI0");
>> @@ -1946,7 +1930,7 @@ static bool acpi_get_mcfg(AcpiMcfgInfo *mcfg)
>> Object *pci_host;
>> QObject *o;
>> - pci_host = acpi_get_i386_pci_host();
>> + pci_host = acpi_get_pci_host();
>> if (!pci_host) {
>> return false;
>> }
>