Hi Luc, On Wed, Jul 16, 2025 at 11:54:25AM +0200, Luc Michel wrote: > Split the xlnx-versal-virt machine type into a base abstract type and a > concrete type. There is no functional change. This is in preparation for > versal2 machine.
s/for versal2/for the versal2/ Otherwise: Reviewed-by: Francisco Iglesias <francisco.igles...@amd.com> > > Signed-off-by: Luc Michel <luc.mic...@amd.com> > --- > hw/arm/xlnx-versal-virt.c | 74 +++++++++++++++++++++++++++------------ > 1 file changed, 52 insertions(+), 22 deletions(-) > > diff --git a/hw/arm/xlnx-versal-virt.c b/hw/arm/xlnx-versal-virt.c > index daacbfb984e..9b20aef8b07 100644 > --- a/hw/arm/xlnx-versal-virt.c > +++ b/hw/arm/xlnx-versal-virt.c > @@ -24,12 +24,15 @@ > #include "hw/arm/boot.h" > #include "target/arm/multiprocessing.h" > #include "qom/object.h" > #include "target/arm/cpu.h" > > +#define TYPE_XLNX_VERSAL_VIRT_BASE_MACHINE \ > + MACHINE_TYPE_NAME("amd-versal-virt-base") > +OBJECT_DECLARE_TYPE(VersalVirt, VersalVirtClass, > XLNX_VERSAL_VIRT_BASE_MACHINE) > + > #define TYPE_XLNX_VERSAL_VIRT_MACHINE MACHINE_TYPE_NAME("amd-versal-virt") > -OBJECT_DECLARE_SIMPLE_TYPE(VersalVirt, XLNX_VERSAL_VIRT_MACHINE) > > #define XLNX_VERSAL_NUM_OSPI_FLASH 4 > > struct VersalVirt { > MachineState parent_obj; > @@ -50,10 +53,16 @@ struct VersalVirt { > bool secure; > char *ospi_model; > } cfg; > }; > > +struct VersalVirtClass { > + MachineClass parent_class; > + > + VersalVersion version; > +}; > + > static void fdt_create(VersalVirt *s) > { > MachineClass *mc = MACHINE_GET_CLASS(s); > const char versal_compat[] = "amd-versal-virt\0xlnx-versal-virt"; > > @@ -191,27 +200,28 @@ static void sd_plug_card(VersalVirt *s, int idx, > DriveInfo *di) > versal_sdhci_plug_card(&s->soc, idx, blk); > } > > static char *versal_get_ospi_model(Object *obj, Error **errp) > { > - VersalVirt *s = XLNX_VERSAL_VIRT_MACHINE(obj); > + VersalVirt *s = XLNX_VERSAL_VIRT_BASE_MACHINE(obj); > > return g_strdup(s->cfg.ospi_model); > } > > static void versal_set_ospi_model(Object *obj, const char *value, Error > **errp) > { > - VersalVirt *s = XLNX_VERSAL_VIRT_MACHINE(obj); > + VersalVirt *s = XLNX_VERSAL_VIRT_BASE_MACHINE(obj); > > g_free(s->cfg.ospi_model); > s->cfg.ospi_model = g_strdup(value); > } > > > static void versal_virt_init(MachineState *machine) > { > - VersalVirt *s = XLNX_VERSAL_VIRT_MACHINE(machine); > + VersalVirt *s = XLNX_VERSAL_VIRT_BASE_MACHINE(machine); > + VersalVirtClass *vvc = XLNX_VERSAL_VIRT_BASE_MACHINE_GET_CLASS(machine); > int psci_conduit = QEMU_PSCI_CONDUIT_DISABLED; > int i; > > /* > * If the user provides an Operating System to be loaded, we expect them > @@ -239,15 +249,15 @@ static void versal_virt_init(MachineState *machine) > if (machine->kernel_filename) { > psci_conduit = QEMU_PSCI_CONDUIT_SMC; > } > > object_initialize_child(OBJECT(machine), "xlnx-versal", &s->soc, > - TYPE_XLNX_VERSAL); > + versal_get_class(vvc->version)); > object_property_set_link(OBJECT(&s->soc), "ddr", OBJECT(machine->ram), > &error_abort); > > - for (i = 0; i < versal_get_num_can(VERSAL_VER_VERSAL); i++) { > + for (i = 0; i < versal_get_num_can(vvc->version); i++) { > g_autofree char *prop_name = g_strdup_printf("canbus%d", i); > > object_property_set_link(OBJECT(&s->soc), prop_name, > OBJECT(s->canbus[i]), > &error_abort); > @@ -272,11 +282,11 @@ static void versal_virt_init(MachineState *machine) > > /* Attach efuse backend, if given */ > efuse_attach_drive(s); > > /* Plug SD cards */ > - for (i = 0; i < versal_get_num_sdhci(VERSAL_VER_VERSAL); i++) { > + for (i = 0; i < versal_get_num_sdhci(vvc->version); i++) { > sd_plug_card(s, i, drive_get(IF_SD, 0, i)); > } > > s->binfo.ram_size = machine->ram_size; > s->binfo.loader_start = 0x0; > @@ -316,14 +326,15 @@ static void versal_virt_init(MachineState *machine) > } > } > > static void versal_virt_machine_instance_init(Object *obj) > { > - VersalVirt *s = XLNX_VERSAL_VIRT_MACHINE(obj); > + VersalVirt *s = XLNX_VERSAL_VIRT_BASE_MACHINE(obj); > + VersalVirtClass *vvc = XLNX_VERSAL_VIRT_BASE_MACHINE_GET_CLASS(s); > size_t i, num_can; > > - num_can = versal_get_num_can(VERSAL_VER_VERSAL); > + num_can = versal_get_num_can(vvc->version); > s->canbus = g_new0(CanBusState *, num_can); > > /* > * User can set canbusx properties to can-bus object and optionally > connect > * to socketcan interface via command line. > @@ -337,47 +348,66 @@ static void versal_virt_machine_instance_init(Object > *obj) > } > } > > static void versal_virt_machine_finalize(Object *obj) > { > - VersalVirt *s = XLNX_VERSAL_VIRT_MACHINE(obj); > + VersalVirt *s = XLNX_VERSAL_VIRT_BASE_MACHINE(obj); > > g_free(s->cfg.ospi_model); > g_free(s->canbus); > } > > -static void versal_virt_machine_class_init(ObjectClass *oc, const void *data) > +static void versal_virt_machine_class_init_common(ObjectClass *oc) > { > MachineClass *mc = MACHINE_CLASS(oc); > - int num_cpu = versal_get_num_cpu(VERSAL_VER_VERSAL); > + VersalVirtClass *vvc = XLNX_VERSAL_VIRT_BASE_MACHINE_CLASS(mc); > + int num_cpu = versal_get_num_cpu(vvc->version); > > - mc->desc = "AMD Versal Virtual development board"; > - mc->alias = "xlnx-versal-virt"; > - mc->init = versal_virt_init; > - mc->min_cpus = num_cpu; > - mc->max_cpus = num_cpu; > - mc->default_cpus = num_cpu; > mc->no_cdrom = true; > mc->auto_create_sdcard = true; > mc->default_ram_id = "ddr"; > + mc->min_cpus = num_cpu; > + mc->max_cpus = num_cpu; > + mc->default_cpus = num_cpu; > + mc->init = versal_virt_init; > + > object_class_property_add_str(oc, "ospi-flash", versal_get_ospi_model, > versal_set_ospi_model); > object_class_property_set_description(oc, "ospi-flash", > "Change the OSPI Flash model"); > } > > -static const TypeInfo versal_virt_machine_init_typeinfo = { > - .name = TYPE_XLNX_VERSAL_VIRT_MACHINE, > +static void versal_virt_machine_class_init(ObjectClass *oc, const void *data) > +{ > + MachineClass *mc = MACHINE_CLASS(oc); > + VersalVirtClass *vvc = XLNX_VERSAL_VIRT_BASE_MACHINE_CLASS(oc); > + > + mc->desc = "AMD Versal Virtual development board"; > + mc->alias = "xlnx-versal-virt"; > + vvc->version = VERSAL_VER_VERSAL; > + > + versal_virt_machine_class_init_common(oc); > +} > + > +static const TypeInfo versal_virt_base_machine_init_typeinfo = { > + .name = TYPE_XLNX_VERSAL_VIRT_BASE_MACHINE, > .parent = TYPE_MACHINE, > - .class_init = versal_virt_machine_class_init, > + .class_size = sizeof(VersalVirtClass), > .instance_init = versal_virt_machine_instance_init, > .instance_size = sizeof(VersalVirt), > .instance_finalize = versal_virt_machine_finalize, > + .abstract = true, > +}; > + > +static const TypeInfo versal_virt_machine_init_typeinfo = { > + .name = TYPE_XLNX_VERSAL_VIRT_MACHINE, > + .parent = TYPE_XLNX_VERSAL_VIRT_BASE_MACHINE, > + .class_init = versal_virt_machine_class_init, > }; > > static void versal_virt_machine_init_register_types(void) > { > + type_register_static(&versal_virt_base_machine_init_typeinfo); > type_register_static(&versal_virt_machine_init_typeinfo); > } > > type_init(versal_virt_machine_init_register_types) > - > -- > 2.50.0 >