On Wed, 11 Jun 2025 10:56:36 +0200 Eric Auger <eric.au...@redhat.com> wrote:
> On 6/11/25 10:49 AM, Igor Mammedov wrote: > > On Wed, 11 Jun 2025 08:47:36 +0200 > > Eric Auger <eric.au...@redhat.com> wrote: > > > >> Hi Igor, > >> > >> On 5/27/25 1:58 PM, Igor Mammedov wrote: > >>> On Tue, 27 May 2025 09:40:04 +0200 > >>> Eric Auger <eric.au...@redhat.com> wrote: > >>> > >>>> acpi_pcihp VirtMachineClass state flag will allow > >>>> to opt in for acpi pci hotplug. This is guarded by a > >>>> class no_acpi_pcihp flag to manage compats (<= 10.0 > >>>> machine types will not support ACPI PCI hotplug). > >>> there is no reason to put an effort in force disabling it > >>> on old machines, as long as code works when explicitly > >>> enabled property on CLI. > >>> > >>> See comment below on how to deal with it > >>> > >>>> Machine state acpi_pcihp flag must be set before the creation > >>>> of the GED device which will use it. > >>>> > >>>> Currently the ACPI PCI HP is turned off by default. This will > >>>> change later on for 10.1 machine type. > >>> one thing to note, is that turning it on by default might > >>> cause change of NIC naming in guest as this brings in > >>> new "_Sxx" slot naming. /so configs tied to nic go down the drain/ > >>> > >>> Naming, we have, also happens to be broken wrt spec > >>> (it should be unique system wide, there was a gitlab issue for that, > >>> there is no easy fix that though) > >>> > >>> So I'd leave it disabled by default and let users to turn > >>> it on explicitly when needed. > >>> > >>>> We also introduce properties to allow disabling it. > >>>> > >>>> Signed-off-by: Eric Auger <eric.au...@redhat.com> > >>>> Reviewed-by: Gustavo Romero <gustavo.rom...@linaro.org> > >>>> --- > >>>> include/hw/arm/virt.h | 2 ++ > >>>> hw/arm/virt.c | 27 +++++++++++++++++++++++++++ > >>>> 2 files changed, 29 insertions(+) > >>>> > >>>> diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h > >>>> index 9a1b0f53d2..10ea581f06 100644 > >>>> --- a/include/hw/arm/virt.h > >>>> +++ b/include/hw/arm/virt.h > >>>> @@ -129,6 +129,7 @@ struct VirtMachineClass { > >>>> bool no_tcg_lpa2; > >>>> bool no_ns_el2_virt_timer_irq; > >>>> bool no_nested_smmu; > >>>> + bool no_acpi_pcihp; > >>>> }; > >>>> > >>>> struct VirtMachineState { > >>>> @@ -150,6 +151,7 @@ struct VirtMachineState { > >>>> bool mte; > >>>> bool dtb_randomness; > >>>> bool second_ns_uart_present; > >>>> + bool acpi_pcihp; > >>>> OnOffAuto acpi; > >>>> VirtGICType gic_version; > >>>> VirtIOMMUType iommu; > >>>> diff --git a/hw/arm/virt.c b/hw/arm/virt.c > >>>> index 9a6cd085a3..a0deeaf2b3 100644 > >>>> --- a/hw/arm/virt.c > >>>> +++ b/hw/arm/virt.c > >>>> @@ -2397,8 +2397,10 @@ static void machvirt_init(MachineState *machine) > >>>> create_pcie(vms); > >>>> > >>>> if (has_ged && aarch64 && firmware_loaded && > >>>> virt_is_acpi_enabled(vms)) { > >>>> + vms->acpi_pcihp &= !vmc->no_acpi_pcihp; > >>> I don't particularly like no_foo naming as it makes code harder to read > >>> and combined with 'duplicated' field in machine state it make even things > >>> worse. > >>> (if I recall right Philippe was cleaning mess similar flags usage > >>> have introduced with ITS) > >>> > >>> instead of adding machine property (both class and state), > >>> I'd suggest adding the only property to GPE device (akin to what we have > >>> in x86 world) > >>> And then one can meddle with defaults using hw_compat_xxx > >> What I fail to understand is whether you want me to attach this property > >> to the GPEX host bridge device or to the GED device. Comment on patch > > I'd say GED. > > > >> 6/25 seems to indicate you expect it to be attached to the GPEX. I ask > >> here because also the GED device will need to be configured depending on > >> the hp setting. Maybe we can retrieve the info from the gpex at that > >> time. on x86 it is attached to piix4 or ich9 I/O controller hub which do > >> not have direct equivalent on ARM. > > for ARM, equivalent would be GED device which hosts our paravirt acpi > > registers. > > OK thank you for the clarification. I will add a property to the GED device. > > As the GED device is directly instantiated by the virt machine code (not > exposed to the end user CLI) I guess we still want a virt machine option > that would allow to set the property explicitly from CLI? Instead of machine option, I'd go pc/q35 way (aka -global ged.acpi-pci-hotplug-with-bridges=on/off). it's not as pretty as machine specific option but that would work just as well and as bonus could be used for microvm in the same form. > > Thanks > > Eric > > > >> Thanks > >> > >> Eric > >>> > >>>> vms->acpi_dev = create_acpi_ged(vms); > >>>> } else { > >>>> + vms->acpi_pcihp = false; > >>>> create_gpio_devices(vms, VIRT_GPIO, sysmem); > >>>> } > >>>> > >>>> @@ -2593,6 +2595,20 @@ static void virt_set_its(Object *obj, bool value, > >>>> Error **errp) > >>>> vms->its = value; > >>>> } > >>>> > >>>> +static bool virt_get_acpi_pcihp(Object *obj, Error **errp) > >>>> +{ > >>>> + VirtMachineState *vms = VIRT_MACHINE(obj); > >>>> + > >>>> + return vms->acpi_pcihp; > >>>> +} > >>>> + > >>>> +static void virt_set_acpi_pcihp(Object *obj, bool value, Error **errp) > >>>> +{ > >>>> + VirtMachineState *vms = VIRT_MACHINE(obj); > >>>> + > >>>> + vms->acpi_pcihp = value; > >>>> +} > >>>> + > >>>> static bool virt_get_dtb_randomness(Object *obj, Error **errp) > >>>> { > >>>> VirtMachineState *vms = VIRT_MACHINE(obj); > >>>> @@ -3310,6 +3326,10 @@ static void virt_machine_class_init(ObjectClass > >>>> *oc, const void *data) > >>>> "in ACPI table header." > >>>> "The string may be up to 8 > >>>> bytes in size"); > >>>> > >>>> + object_class_property_add_bool(oc, "acpi-pcihp", > >>>> + virt_get_acpi_pcihp, > >>>> virt_set_acpi_pcihp); > >>>> + object_class_property_set_description(oc, "acpi-pcihp", > >>>> + "Force ACPI PCI hotplug"); > >>>> } > >>>> > >>>> static void virt_instance_init(Object *obj) > >>>> @@ -3344,6 +3364,9 @@ static void virt_instance_init(Object *obj) > >>>> vms->tcg_its = true; > >>>> } > >>>> > >>>> + /* default disallows ACPI PCI hotplug */ > >>>> + vms->acpi_pcihp = false; > >>>> + > >>>> /* Default disallows iommu instantiation */ > >>>> vms->iommu = VIRT_IOMMU_NONE; > >>>> > >>>> @@ -3394,8 +3417,12 @@ DEFINE_VIRT_MACHINE_AS_LATEST(10, 1) > >>>> > >>>> static void virt_machine_10_0_options(MachineClass *mc) > >>>> { > >>>> + VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc)); > >>>> + > >>>> virt_machine_10_1_options(mc); > >>>> compat_props_add(mc->compat_props, hw_compat_10_0, > >>>> hw_compat_10_0_len); > >>>> + /* 10.0 and earlier do not support ACPI PCI hotplug */ > >>>> + vmc->no_acpi_pcihp = true; > >>>> } > >>>> DEFINE_VIRT_MACHINE(10, 0) > >>>> >