On Thu, Feb 2, 2023 at 12:54 PM Sunil V L <suni...@ventanamicro.com> wrote: > > ACPI is optional. So, add a switch to toggle. > > Signed-off-by: Sunil V L <suni...@ventanamicro.com> > --- > hw/riscv/virt.c | 38 ++++++++++++++++++++++++++++++++++++++ > include/hw/riscv/virt.h | 2 ++ > 2 files changed, 40 insertions(+) > > diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c > index 7ad9fda20c..84962962ff 100644 > --- a/hw/riscv/virt.c > +++ b/hw/riscv/virt.c > @@ -50,6 +50,7 @@ > #include "hw/pci-host/gpex.h" > #include "hw/display/ramfb.h" > #include "hw/acpi/aml-build.h" > +#include "qapi/qapi-visit-common.h" > > /* > * The virt machine physical address space used by some of the devices > @@ -1525,6 +1526,10 @@ static void virt_machine_init(MachineState *machine) > > static void virt_machine_instance_init(Object *obj) > { > + MachineState *ms = MACHINE(obj);
Drop this > + RISCVVirtState *s = RISCV_VIRT_MACHINE(ms); > + > + s->acpi = ON_OFF_AUTO_OFF; Is this needed? I believe the purpose of an auto/on/off property is to have an "auto" value, which is ON_OFF_AUTO_AUTO. > } > > static char *virt_get_aia_guests(Object *obj, Error **errp) > @@ -1601,6 +1606,34 @@ static void virt_set_aclint(Object *obj, bool value, > Error **errp) > s->have_aclint = value; > } > > +bool virt_is_acpi_enabled(RISCVVirtState *s) > +{ > + if (s->acpi == ON_OFF_AUTO_OFF) { > + return false; > + } > + return true; > +} > + > +static void virt_get_acpi(Object *obj, Visitor *v, const char *name, > + void *opaque, Error **errp) > +{ > + MachineState *ms = MACHINE(obj); ditto > + RISCVVirtState *s = RISCV_VIRT_MACHINE(ms); > + > + OnOffAuto acpi = s->acpi; > + > + visit_type_OnOffAuto(v, name, &acpi, errp); > +} > + > +static void virt_set_acpi(Object *obj, Visitor *v, const char *name, > + void *opaque, Error **errp) > +{ > + MachineState *ms = MACHINE(obj); ditto > + RISCVVirtState *s = RISCV_VIRT_MACHINE(ms); > + > + visit_type_OnOffAuto(v, name, &s->acpi, errp); > +} > + > static HotplugHandler *virt_machine_get_hotplug_handler(MachineState > *machine, > DeviceState *dev) > { > @@ -1672,6 +1705,11 @@ static void virt_machine_class_init(ObjectClass *oc, > void *data) > sprintf(str, "Set number of guest MMIO pages for AIA IMSIC. Valid value " > "should be between 0 and %d.", VIRT_IRQCHIP_MAX_GUESTS); > object_class_property_set_description(oc, "aia-guests", str); > + object_class_property_add(oc, "acpi", "OnOffAuto", > + virt_get_acpi, virt_set_acpi, > + NULL, NULL); I am not sure about "OnOffAuto" vs. "bool" type. It seems the only difference is that with "OnOffAuto" type we may silently change the interpretation of "auto" value across different QEMU versions? > + object_class_property_set_description(oc, "acpi", > + "Enable ACPI"); > } > > static const TypeInfo virt_machine_typeinfo = { > diff --git a/include/hw/riscv/virt.h b/include/hw/riscv/virt.h > index 6c7885bf89..62efebaa32 100644 > --- a/include/hw/riscv/virt.h > +++ b/include/hw/riscv/virt.h > @@ -58,6 +58,7 @@ struct RISCVVirtState { > int aia_guests; > char *oem_id; > char *oem_table_id; > + OnOffAuto acpi; > }; > > enum { > @@ -123,4 +124,5 @@ enum { > #define FDT_APLIC_INT_MAP_WIDTH (FDT_PCI_ADDR_CELLS + FDT_PCI_INT_CELLS + \ > 1 + FDT_APLIC_INT_CELLS) > > +bool virt_is_acpi_enabled(RISCVVirtState *s); > #endif > -- Regards, Bin