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.michel@amd.com>
Reviewed-by: Francisco Iglesias <francisco.iglesias@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.iglesias@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
>