Hi Igor, On 6/25/25 5:23 PM, Eric Auger wrote: > Hi Igor, Jonathan, > > On 6/20/25 6:13 PM, Jonathan Cameron wrote: >> On Fri, 20 Jun 2025 14:38:22 +0200 >> Igor Mammedov <imamm...@redhat.com> wrote: >> >>> On Fri, 20 Jun 2025 10:35:38 +0100 >>> Jonathan Cameron <jonathan.came...@huawei.com> wrote: >>> >>>> On Mon, 16 Jun 2025 11:46:46 +0200 >>>> Eric Auger <eric.au...@redhat.com> wrote: >>>> >>>>> Modify the DSDT ACPI table to enable ACPI PCI hotplug. >>>>> >>>>> Signed-off-by: Eric Auger <eric.au...@redhat.com> >>>>> >>>>> --- >>>>> v2 -> v3: >>>>> - use ACPI_PCIHP_SIZE instead of 0x1000 (Igor) >>>>> - use cihp_state->use_acpi_hotplug_bridge >>>> pcihp_state >>>> >>>> Takes a bit of searching to find the various bits of the >>>> same support on x86 but this seems to match up. >>>> Exactly when things are built does vary but not I think >>>> in a way that matters. e.g. I think on x86 the >>>> EDSM stuff is built whether or not we have pcihp enabled >>>> whereas here you've made it conditional on using acpi >>>> hp. Perhaps a tiny bit more description on that would be >>>> useful if you do a v4? >>> edsm should be built regardless of pcihp >>> (well intention was there, whether I messed it up or not I don't know) >>> >>> idea is that non hotplug ports can have a static acpi-index, >>> so it doesn't depend on pcihp. >> That makes sense - so here should that edsm feature be enabled whether >> or not we have pcihp_state->use_acpi_hotplug_bridge == true >> >> i.e. is it really a separate thing from the rest of this series? > > Further studying this comment, > > EDSM is invoked by code generated in aml_pci_static_endpoint_dsm() whcih > itself is invoked by build_append_pci_bus_devices() > > So to me it means that if we generate edsm unconditionally we also need > to call the following block unconditionnally > > + aml_append(pci0_scope, build_pci_bridge_edsm()); > + build_append_pci_bus_devices(pci0_scope, vms->bus); > + if (object_property_find(OBJECT(vms->bus), ACPI_PCIHP_PROP_BSEL)) { > + build_append_pcihp_slots(pci0_scope, vms->bus); > + } > > which seems to be done that way in hw/i386/acpi-build.c/build_dsdt() > > Igor, if I recall correctly you said that addition changes related to > "S%.02X" could change the guest ABI. And in that case this wouldn't be > guarded by any new option/compat. So that's annoying. > > By the way I tested static acpi-index on ARM with resulting code and it > does not not seem to work - maybe I try with a wrong topology though > (pcie root port + virtio-net acpi-index)-. I have not checked on x86 yet. I tested on x86 and if you turn off acpi pci hotplug by setting -global ICH9-LPC.acpi-pci-hotplug-with-bridge-support=off and you statically instantiate a virtio-net-pci device on a pcie root port with ,acpi-index=3, acpi-index does not work either. guest exposes enp5s0.
if you remove the global prop setting (acpi pcihp enabled by default), guest exposes eno3. so static acpi-index also seems to be dependent on acpi-pcihp on x86. So I intend to leave the code as is with edsm added within the acpi_pcihp conditional block. It is also simpler in terms of ref blob and most importantly with regards to compat handling. Thanks Eric > > So I wonder if it makes sense to do that refinement now. Maybe we can > check try to improve that afterwards? > > What do you think? > > Eric > > > >> >> Thanks, >> >> J >>>> Reviewed-by: Jonathan Cameron <jonathan.came...@huawei.com> >>>> >>>> >>>>> --- >>>>> include/hw/acpi/pcihp.h | 2 ++ >>>>> include/hw/arm/virt.h | 1 + >>>>> hw/arm/virt-acpi-build.c | 22 ++++++++++++++++++++++ >>>>> hw/arm/virt.c | 2 ++ >>>>> hw/arm/Kconfig | 2 ++ >>>>> 5 files changed, 29 insertions(+) >>>>> >>>>> diff --git a/include/hw/acpi/pcihp.h b/include/hw/acpi/pcihp.h >>>>> index 5506a58862..9ff548650b 100644 >>>>> --- a/include/hw/acpi/pcihp.h >>>>> +++ b/include/hw/acpi/pcihp.h >>>>> @@ -38,6 +38,8 @@ >>>>> #define ACPI_PCIHP_SEJ_BASE 0x8 >>>>> #define ACPI_PCIHP_BNMR_BASE 0x10 >>>>> >>>>> +#define ACPI_PCIHP_SIZE 0x0018 >>>>> + >>>>> typedef struct AcpiPciHpPciStatus { >>>>> uint32_t up; >>>>> uint32_t down; >>>>> diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h >>>>> index 9a1b0f53d2..0ed2e6b732 100644 >>>>> --- a/include/hw/arm/virt.h >>>>> +++ b/include/hw/arm/virt.h >>>>> @@ -79,6 +79,7 @@ enum { >>>>> VIRT_ACPI_GED, >>>>> VIRT_NVDIMM_ACPI, >>>>> VIRT_PVTIME, >>>>> + VIRT_ACPI_PCIHP, >>>>> VIRT_LOWMEMMAP_LAST, >>>>> }; >>>>> >>>>> diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c >>>>> index d7547c8d3b..a2e58288f8 100644 >>>>> --- a/hw/arm/virt-acpi-build.c >>>>> +++ b/hw/arm/virt-acpi-build.c >>>>> @@ -34,6 +34,7 @@ >>>>> #include "hw/core/cpu.h" >>>>> #include "hw/acpi/acpi-defs.h" >>>>> #include "hw/acpi/acpi.h" >>>>> +#include "hw/acpi/pcihp.h" >>>>> #include "hw/nvram/fw_cfg_acpi.h" >>>>> #include "hw/acpi/bios-linker-loader.h" >>>>> #include "hw/acpi/aml-build.h" >>>>> @@ -809,6 +810,8 @@ static void >>>>> build_dsdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms) >>>>> { >>>>> VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms); >>>>> + AcpiGedState *acpi_ged_state = ACPI_GED(vms->acpi_dev); >>>>> + AcpiPciHpState *pcihp_state = &acpi_ged_state->pcihp_state; >>>>> Aml *scope, *dsdt; >>>>> MachineState *ms = MACHINE(vms); >>>>> const MemMapEntry *memmap = vms->memmap; >>>>> @@ -868,6 +871,25 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, >>>>> VirtMachineState *vms) >>>>> >>>>> aml_append(dsdt, scope); >>>>> >>>>> + if (pcihp_state->use_acpi_hotplug_bridge) { >>>>> + Aml *pci0_scope = aml_scope("\\_SB.PCI0"); >>>>> + >>>>> + aml_append(pci0_scope, aml_pci_edsm()); >>>>> + build_acpi_pci_hotplug(dsdt, AML_SYSTEM_MEMORY, >>>>> + memmap[VIRT_ACPI_PCIHP].base); >>>>> + build_append_pcihp_resources(pci0_scope, >>>>> + memmap[VIRT_ACPI_PCIHP].base, >>>>> + memmap[VIRT_ACPI_PCIHP].size); >>>>> + >>>>> + /* Scan all PCI buses. Generate tables to support hotplug. */ >>>>> + build_append_pci_bus_devices(pci0_scope, vms->bus); >>>>> + if (object_property_find(OBJECT(vms->bus), >>>>> ACPI_PCIHP_PROP_BSEL)) { >>>>> + build_append_pcihp_slots(pci0_scope, vms->bus); >>>>> + } >>>>> + build_append_notification_callback(pci0_scope, vms->bus); >>>>> + aml_append(dsdt, pci0_scope); >>>>> + } >>>>> + >>>>> /* copy AML table into ACPI tables blob */ >>>>> g_array_append_vals(table_data, dsdt->buf->data, dsdt->buf->len); >>>>> >>>> >>> >