On Wed, Jul 16, 2025 at 11:54:14AM +0200, Luc Michel wrote: > Split the TYPE_XLNX_VERSAL_CRL type into base and concrete classes. This > is in preparation for the versal2 version of the CRL. > > Signed-off-by: Luc Michel <luc.mic...@amd.com>
Reviewed-by: Francisco Iglesias <francisco.igles...@amd.com> > --- > include/hw/misc/xlnx-versal-crl.h | 31 ++++++++++++++++++-- > hw/misc/xlnx-versal-crl.c | 48 +++++++++++++++++++------------ > 2 files changed, 58 insertions(+), 21 deletions(-) > > diff --git a/include/hw/misc/xlnx-versal-crl.h > b/include/hw/misc/xlnx-versal-crl.h > index dba6d3585d1..2b39d203a67 100644 > --- a/include/hw/misc/xlnx-versal-crl.h > +++ b/include/hw/misc/xlnx-versal-crl.h > @@ -1,21 +1,27 @@ > /* > * QEMU model of the Clock-Reset-LPD (CRL). > * > * Copyright (c) 2022 Xilinx Inc. > + * Copyright (c) 2025 Advanced Micro Devices, Inc. > * SPDX-License-Identifier: GPL-2.0-or-later > * > * Written by Edgar E. Iglesias <edgar.igles...@xilinx.com> > */ > #ifndef HW_MISC_XLNX_VERSAL_CRL_H > #define HW_MISC_XLNX_VERSAL_CRL_H > > #include "hw/sysbus.h" > #include "hw/register.h" > #include "target/arm/cpu-qom.h" > +#include "hw/arm/xlnx-versal-version.h" > > +#define TYPE_XLNX_VERSAL_CRL_BASE "xlnx-versal-crl-base" > #define TYPE_XLNX_VERSAL_CRL "xlnx-versal-crl" > + > +OBJECT_DECLARE_TYPE(XlnxVersalCRLBase, XlnxVersalCRLBaseClass, > + XLNX_VERSAL_CRL_BASE) > OBJECT_DECLARE_SIMPLE_TYPE(XlnxVersalCRL, XLNX_VERSAL_CRL) > > REG32(ERR_CTRL, 0x0) > FIELD(ERR_CTRL, SLVERR_ENABLE, 0, 1) > REG32(IR_STATUS, 0x4) > @@ -214,22 +220,43 @@ REG32(PSM_RST_MODE, 0x370) > > #define CRL_R_MAX (R_PSM_RST_MODE + 1) > > #define RPU_MAX_CPU 2 > > -struct XlnxVersalCRL { > +struct XlnxVersalCRLBase { > SysBusDevice parent_obj; > + > + RegisterInfoArray *reg_array; > + uint32_t *regs; > +}; > + > +struct XlnxVersalCRLBaseClass { > + SysBusDeviceClass parent_class; > +}; > + > +struct XlnxVersalCRL { > + XlnxVersalCRLBase parent_obj; > qemu_irq irq; > > struct { > ARMCPU *cpu_r5[RPU_MAX_CPU]; > DeviceState *adma[8]; > DeviceState *uart[2]; > DeviceState *gem[2]; > DeviceState *usb; > } cfg; > > - RegisterInfoArray *reg_array; > uint32_t regs[CRL_R_MAX]; > RegisterInfo regs_info[CRL_R_MAX]; > }; > + > +static inline const char *xlnx_versal_crl_class_name(VersalVersion ver) > +{ > + switch (ver) { > + case VERSAL_VER_VERSAL: > + return TYPE_XLNX_VERSAL_CRL; > + default: > + g_assert_not_reached(); > + } > +} > + > #endif > diff --git a/hw/misc/xlnx-versal-crl.c b/hw/misc/xlnx-versal-crl.c > index f288545967a..be89e0da40d 100644 > --- a/hw/misc/xlnx-versal-crl.c > +++ b/hw/misc/xlnx-versal-crl.c > @@ -296,21 +296,21 @@ static const RegisterAccessInfo crl_regs_info[] = { > .reset = 0x1, > .rsvd = 0xf8, > } > }; > > -static void crl_reset_enter(Object *obj, ResetType type) > +static void versal_crl_reset_enter(Object *obj, ResetType type) > { > XlnxVersalCRL *s = XLNX_VERSAL_CRL(obj); > unsigned int i; > > for (i = 0; i < ARRAY_SIZE(s->regs_info); ++i) { > register_reset(&s->regs_info[i]); > } > } > > -static void crl_reset_hold(Object *obj, ResetType type) > +static void versal_crl_reset_hold(Object *obj, ResetType type) > { > XlnxVersalCRL *s = XLNX_VERSAL_CRL(obj); > > crl_update_irq(s); > } > @@ -323,24 +323,26 @@ static const MemoryRegionOps crl_ops = { > .min_access_size = 4, > .max_access_size = 4, > }, > }; > > -static void crl_init(Object *obj) > +static void versal_crl_init(Object *obj) > { > XlnxVersalCRL *s = XLNX_VERSAL_CRL(obj); > + XlnxVersalCRLBase *xvcb = XLNX_VERSAL_CRL_BASE(obj); > SysBusDevice *sbd = SYS_BUS_DEVICE(obj); > int i; > > - s->reg_array = > + xvcb->reg_array = > register_init_block32(DEVICE(obj), crl_regs_info, > ARRAY_SIZE(crl_regs_info), > s->regs_info, s->regs, > &crl_ops, > XLNX_VERSAL_CRL_ERR_DEBUG, > CRL_R_MAX * 4); > - sysbus_init_mmio(sbd, &s->reg_array->mem); > + xvcb->regs = s->regs; > + sysbus_init_mmio(sbd, &xvcb->reg_array->mem); > sysbus_init_irq(sbd, &s->irq); > > for (i = 0; i < ARRAY_SIZE(s->cfg.cpu_r5); ++i) { > object_property_add_link(obj, "cpu_r5[*]", TYPE_ARM_CPU, > (Object **)&s->cfg.cpu_r5[i], > @@ -375,45 +377,53 @@ static void crl_init(Object *obj) > OBJ_PROP_LINK_STRONG); > } > > static void crl_finalize(Object *obj) > { > - XlnxVersalCRL *s = XLNX_VERSAL_CRL(obj); > + XlnxVersalCRLBase *s = XLNX_VERSAL_CRL_BASE(obj); > register_finalize_block(s->reg_array); > } > > -static const VMStateDescription vmstate_crl = { > +static const VMStateDescription vmstate_versal_crl = { > .name = TYPE_XLNX_VERSAL_CRL, > .version_id = 1, > .minimum_version_id = 1, > .fields = (const VMStateField[]) { > VMSTATE_UINT32_ARRAY(regs, XlnxVersalCRL, CRL_R_MAX), > VMSTATE_END_OF_LIST(), > } > }; > > -static void crl_class_init(ObjectClass *klass, const void *data) > +static void versal_crl_class_init(ObjectClass *klass, const void *data) > { > - ResettableClass *rc = RESETTABLE_CLASS(klass); > DeviceClass *dc = DEVICE_CLASS(klass); > + ResettableClass *rc = RESETTABLE_CLASS(klass); > > - dc->vmsd = &vmstate_crl; > - > - rc->phases.enter = crl_reset_enter; > - rc->phases.hold = crl_reset_hold; > + dc->vmsd = &vmstate_versal_crl; > + rc->phases.enter = versal_crl_reset_enter; > + rc->phases.hold = versal_crl_reset_hold; > } > > -static const TypeInfo crl_info = { > - .name = TYPE_XLNX_VERSAL_CRL, > +static const TypeInfo crl_base_info = { > + .name = TYPE_XLNX_VERSAL_CRL_BASE, > .parent = TYPE_SYS_BUS_DEVICE, > - .instance_size = sizeof(XlnxVersalCRL), > - .class_init = crl_class_init, > - .instance_init = crl_init, > + .instance_size = sizeof(XlnxVersalCRLBase), > + .class_size = sizeof(XlnxVersalCRLBaseClass), > .instance_finalize = crl_finalize, > + .abstract = true, > +}; > + > +static const TypeInfo versal_crl_info = { > + .name = TYPE_XLNX_VERSAL_CRL, > + .parent = TYPE_XLNX_VERSAL_CRL_BASE, > + .instance_size = sizeof(XlnxVersalCRL), > + .instance_init = versal_crl_init, > + .class_init = versal_crl_class_init, > }; > > static void crl_register_types(void) > { > - type_register_static(&crl_info); > + type_register_static(&crl_base_info); > + type_register_static(&versal_crl_info); > } > > type_init(crl_register_types) > -- > 2.50.0 >