On Wed, Sep 17, 2025 at 01:44:44PM +0200, Luc Michel wrote:
> This function is now a no-op. The register array is parented to the
> device and get finalized when the device is.
> 
> Drop all the calls to `register_finalize_block'. Drop the
> RegisterInfoArray reference when it is not used elsewhere in the device.
> 
> Signed-off-by: Luc Michel <[email protected]>

Reviewed-by: Francisco Iglesias <[email protected]>


> ---
>  include/hw/misc/xlnx-versal-crl.h      |  1 -
>  include/hw/misc/xlnx-versal-xramc.h    |  1 -
>  include/hw/misc/xlnx-zynqmp-apu-ctrl.h |  1 -
>  include/hw/misc/xlnx-zynqmp-crf.h      |  1 -
>  include/hw/nvram/xlnx-bbram.h          |  1 -
>  hw/misc/xlnx-versal-crl.c              | 38 +++++++++++---------------
>  hw/misc/xlnx-versal-trng.c             |  1 -
>  hw/misc/xlnx-versal-xramc.c            | 12 ++------
>  hw/misc/xlnx-zynqmp-apu-ctrl.c         | 12 ++------
>  hw/misc/xlnx-zynqmp-crf.c              | 12 ++------
>  hw/nvram/xlnx-bbram.c                  | 13 ++-------
>  hw/nvram/xlnx-versal-efuse-ctrl.c      |  1 -
>  hw/nvram/xlnx-zynqmp-efuse.c           |  8 ------
>  13 files changed, 28 insertions(+), 74 deletions(-)
> 
> diff --git a/include/hw/misc/xlnx-versal-crl.h 
> b/include/hw/misc/xlnx-versal-crl.h
> index f6b8694ebea..49ed500acde 100644
> --- a/include/hw/misc/xlnx-versal-crl.h
> +++ b/include/hw/misc/xlnx-versal-crl.h
> @@ -531,11 +531,10 @@ REG32(VERSAL2_RST_OCM, 0x3d8)
>  #define VERSAL2_CRL_R_MAX (R_VERSAL2_RST_OCM + 1)
>  
>  struct XlnxVersalCRLBase {
>      SysBusDevice parent_obj;
>  
> -    RegisterInfoArray *reg_array;
>      uint32_t *regs;
>  };
>  
>  struct XlnxVersalCRLBaseClass {
>      SysBusDeviceClass parent_class;
> diff --git a/include/hw/misc/xlnx-versal-xramc.h 
> b/include/hw/misc/xlnx-versal-xramc.h
> index d3d1862676f..35e4e8b91dd 100644
> --- a/include/hw/misc/xlnx-versal-xramc.h
> +++ b/include/hw/misc/xlnx-versal-xramc.h
> @@ -88,10 +88,9 @@ typedef struct XlnxXramCtrl {
>      struct {
>          uint64_t size;
>          unsigned int encoded_size;
>      } cfg;
>  
> -    RegisterInfoArray *reg_array;
>      uint32_t regs[XRAM_CTRL_R_MAX];
>      RegisterInfo regs_info[XRAM_CTRL_R_MAX];
>  } XlnxXramCtrl;
>  #endif
> diff --git a/include/hw/misc/xlnx-zynqmp-apu-ctrl.h 
> b/include/hw/misc/xlnx-zynqmp-apu-ctrl.h
> index c3bf3c1583b..fbfe34aa7e5 100644
> --- a/include/hw/misc/xlnx-zynqmp-apu-ctrl.h
> +++ b/include/hw/misc/xlnx-zynqmp-apu-ctrl.h
> @@ -83,11 +83,10 @@ struct XlnxZynqMPAPUCtrl {
>      qemu_irq irq_imr;
>  
>      uint8_t cpu_pwrdwn_req;
>      uint8_t cpu_in_wfi;
>  
> -    RegisterInfoArray *reg_array;
>      uint32_t regs[APU_R_MAX];
>      RegisterInfo regs_info[APU_R_MAX];
>  };
>  
>  #endif
> diff --git a/include/hw/misc/xlnx-zynqmp-crf.h 
> b/include/hw/misc/xlnx-zynqmp-crf.h
> index 02ef0bdeeee..c746ae10397 100644
> --- a/include/hw/misc/xlnx-zynqmp-crf.h
> +++ b/include/hw/misc/xlnx-zynqmp-crf.h
> @@ -201,11 +201,10 @@ REG32(RST_DDR_SS, 0x108)
>  struct XlnxZynqMPCRF {
>      SysBusDevice parent_obj;
>      MemoryRegion iomem;
>      qemu_irq irq_ir;
>  
> -    RegisterInfoArray *reg_array;
>      uint32_t regs[CRF_R_MAX];
>      RegisterInfo regs_info[CRF_R_MAX];
>  };
>  
>  #endif
> diff --git a/include/hw/nvram/xlnx-bbram.h b/include/hw/nvram/xlnx-bbram.h
> index 58acbe9f51b..af90900bfc6 100644
> --- a/include/hw/nvram/xlnx-bbram.h
> +++ b/include/hw/nvram/xlnx-bbram.h
> @@ -45,11 +45,10 @@ struct XlnxBBRam {
>  
>      uint32_t crc_zpads;
>      bool bbram8_wo;
>      bool blk_ro;
>  
> -    RegisterInfoArray *reg_array;
>      uint32_t regs[RMAX_XLNX_BBRAM];
>      RegisterInfo regs_info[RMAX_XLNX_BBRAM];
>  };
>  
>  #endif
> diff --git a/hw/misc/xlnx-versal-crl.c b/hw/misc/xlnx-versal-crl.c
> index 10e6af002ba..5987f32c716 100644
> --- a/hw/misc/xlnx-versal-crl.c
> +++ b/hw/misc/xlnx-versal-crl.c
> @@ -632,21 +632,21 @@ static const MemoryRegionOps crl_ops = {
>  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);
> +    RegisterInfoArray *reg_array;
>      int i;
>  
> -    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);
> +    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);
>      xvcb->regs = s->regs;
> -    sysbus_init_mmio(sbd, &xvcb->reg_array->mem);
> +    sysbus_init_mmio(sbd, &reg_array->mem);
>      sysbus_init_irq(sbd, &s->irq);
>  
>      for (i = 0; i < ARRAY_SIZE(s->cfg.rpu); ++i) {
>          object_property_add_link(obj, "rpu[*]", TYPE_ARM_CPU,
>                                   (Object **)&s->cfg.rpu[i],
> @@ -686,21 +686,22 @@ static void versal_crl_init(Object *obj)
>  static void versal2_crl_init(Object *obj)
>  {
>      XlnxVersal2CRL *s = XLNX_VERSAL2_CRL(obj);
>      XlnxVersalCRLBase *xvcb = XLNX_VERSAL_CRL_BASE(obj);
>      SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
> +    RegisterInfoArray *reg_array;
>      size_t i;
>  
> -    xvcb->reg_array = register_init_block32(DEVICE(obj), 
> versal2_crl_regs_info,
> -                                            
> ARRAY_SIZE(versal2_crl_regs_info),
> -                                            s->regs_info, s->regs,
> -                                            &crl_ops,
> -                                            XLNX_VERSAL_CRL_ERR_DEBUG,
> -                                            VERSAL2_CRL_R_MAX * 4);
> +    reg_array = register_init_block32(DEVICE(obj), versal2_crl_regs_info,
> +                                      ARRAY_SIZE(versal2_crl_regs_info),
> +                                      s->regs_info, s->regs,
> +                                      &crl_ops,
> +                                      XLNX_VERSAL_CRL_ERR_DEBUG,
> +                                      VERSAL2_CRL_R_MAX * 4);
>      xvcb->regs = s->regs;
>  
> -    sysbus_init_mmio(sbd, &xvcb->reg_array->mem);
> +    sysbus_init_mmio(sbd, &reg_array->mem);
>  
>      for (i = 0; i < ARRAY_SIZE(s->cfg.rpu); ++i) {
>          object_property_add_link(obj, "rpu[*]", TYPE_ARM_CPU,
>                                   (Object **)&s->cfg.rpu[i],
>                                   qdev_prop_allow_set_link_before_realize,
> @@ -748,16 +749,10 @@ static void versal2_crl_init(Object *obj)
>                                   qdev_prop_allow_set_link_before_realize,
>                                   OBJ_PROP_LINK_STRONG);
>      }
>  }
>  
> -static void crl_finalize(Object *obj)
> -{
> -    XlnxVersalCRLBase *s = XLNX_VERSAL_CRL_BASE(obj);
> -    register_finalize_block(s->reg_array);
> -}
> -
>  static const VMStateDescription vmstate_versal_crl = {
>      .name = TYPE_XLNX_VERSAL_CRL,
>      .version_id = 1,
>      .minimum_version_id = 1,
>      .fields = (const VMStateField[]) {
> @@ -802,11 +797,10 @@ static void versal2_crl_class_init(ObjectClass *klass, 
> const void *data)
>  static const TypeInfo crl_base_info = {
>      .name          = TYPE_XLNX_VERSAL_CRL_BASE,
>      .parent        = TYPE_SYS_BUS_DEVICE,
>      .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,
> diff --git a/hw/misc/xlnx-versal-trng.c b/hw/misc/xlnx-versal-trng.c
> index f34dd3ef352..2b573a45bdb 100644
> --- a/hw/misc/xlnx-versal-trng.c
> +++ b/hw/misc/xlnx-versal-trng.c
> @@ -625,11 +625,10 @@ static void trng_init(Object *obj)
>  
>  static void trng_finalize(Object *obj)
>  {
>      XlnxVersalTRng *s = XLNX_VERSAL_TRNG(obj);
>  
> -    register_finalize_block(s->reg_array);
>      g_rand_free(s->prng);
>      s->prng = NULL;
>  }
>  
>  static void trng_reset_hold(Object *obj, ResetType type)
> diff --git a/hw/misc/xlnx-versal-xramc.c b/hw/misc/xlnx-versal-xramc.c
> index 07370b80c0d..d90f3e87c74 100644
> --- a/hw/misc/xlnx-versal-xramc.c
> +++ b/hw/misc/xlnx-versal-xramc.c
> @@ -188,28 +188,23 @@ static void xram_ctrl_realize(DeviceState *dev, Error 
> **errp)
>  
>  static void xram_ctrl_init(Object *obj)
>  {
>      XlnxXramCtrl *s = XLNX_XRAM_CTRL(obj);
>      SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
> +    RegisterInfoArray *reg_array;
>  
> -    s->reg_array =
> +    reg_array =
>          register_init_block32(DEVICE(obj), xram_ctrl_regs_info,
>                                ARRAY_SIZE(xram_ctrl_regs_info),
>                                s->regs_info, s->regs,
>                                &xram_ctrl_ops,
>                                XLNX_XRAM_CTRL_ERR_DEBUG,
>                                XRAM_CTRL_R_MAX * 4);
> -    sysbus_init_mmio(sbd, &s->reg_array->mem);
> +    sysbus_init_mmio(sbd, &reg_array->mem);
>      sysbus_init_irq(sbd, &s->irq);
>  }
>  
> -static void xram_ctrl_finalize(Object *obj)
> -{
> -    XlnxXramCtrl *s = XLNX_XRAM_CTRL(obj);
> -    register_finalize_block(s->reg_array);
> -}
> -
>  static const VMStateDescription vmstate_xram_ctrl = {
>      .name = TYPE_XLNX_XRAM_CTRL,
>      .version_id = 1,
>      .minimum_version_id = 1,
>      .fields = (const VMStateField[]) {
> @@ -239,11 +234,10 @@ static const TypeInfo xram_ctrl_info = {
>      .name              = TYPE_XLNX_XRAM_CTRL,
>      .parent            = TYPE_SYS_BUS_DEVICE,
>      .instance_size     = sizeof(XlnxXramCtrl),
>      .class_init        = xram_ctrl_class_init,
>      .instance_init     = xram_ctrl_init,
> -    .instance_finalize = xram_ctrl_finalize,
>  };
>  
>  static void xram_ctrl_register_types(void)
>  {
>      type_register_static(&xram_ctrl_info);
> diff --git a/hw/misc/xlnx-zynqmp-apu-ctrl.c b/hw/misc/xlnx-zynqmp-apu-ctrl.c
> index e85da32d99c..08777496d56 100644
> --- a/hw/misc/xlnx-zynqmp-apu-ctrl.c
> +++ b/hw/misc/xlnx-zynqmp-apu-ctrl.c
> @@ -177,20 +177,21 @@ static void zynqmp_apu_handle_wfi(void *opaque, int 
> irq, int level)
>  }
>  
>  static void zynqmp_apu_init(Object *obj)
>  {
>      XlnxZynqMPAPUCtrl *s = XLNX_ZYNQMP_APU_CTRL(obj);
> +    RegisterInfoArray *reg_array;
>      int i;
>  
> -    s->reg_array =
> +    reg_array =
>          register_init_block32(DEVICE(obj), zynqmp_apu_regs_info,
>                                ARRAY_SIZE(zynqmp_apu_regs_info),
>                                s->regs_info, s->regs,
>                                &zynqmp_apu_ops,
>                                XILINX_ZYNQMP_APU_ERR_DEBUG,
>                                APU_R_MAX * 4);
> -    sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->reg_array->mem);
> +    sysbus_init_mmio(SYS_BUS_DEVICE(obj), &reg_array->mem);
>      sysbus_init_irq(SYS_BUS_DEVICE(obj), &s->irq_imr);
>  
>      for (i = 0; i < APU_MAX_CPU; ++i) {
>          g_autofree gchar *prop_name = g_strdup_printf("cpu%d", i);
>          object_property_add_link(obj, prop_name, TYPE_ARM_CPU,
> @@ -206,16 +207,10 @@ static void zynqmp_apu_init(Object *obj)
>                               "CPU_POWER_STATUS", 4);
>      /* wfi_in is used as input from CPUs as wfi request. */
>      qdev_init_gpio_in_named(DEVICE(obj), zynqmp_apu_handle_wfi, "wfi_in", 4);
>  }
>  
> -static void zynqmp_apu_finalize(Object *obj)
> -{
> -    XlnxZynqMPAPUCtrl *s = XLNX_ZYNQMP_APU_CTRL(obj);
> -    register_finalize_block(s->reg_array);
> -}
> -
>  static const VMStateDescription vmstate_zynqmp_apu = {
>      .name = TYPE_XLNX_ZYNQMP_APU_CTRL,
>      .version_id = 1,
>      .minimum_version_id = 1,
>      .fields = (const VMStateField[]) {
> @@ -239,11 +234,10 @@ static const TypeInfo zynqmp_apu_info = {
>      .name              = TYPE_XLNX_ZYNQMP_APU_CTRL,
>      .parent            = TYPE_SYS_BUS_DEVICE,
>      .instance_size     = sizeof(XlnxZynqMPAPUCtrl),
>      .class_init        = zynqmp_apu_class_init,
>      .instance_init     = zynqmp_apu_init,
> -    .instance_finalize = zynqmp_apu_finalize,
>  };
>  
>  static void zynqmp_apu_register_types(void)
>  {
>      type_register_static(&zynqmp_apu_info);
> diff --git a/hw/misc/xlnx-zynqmp-crf.c b/hw/misc/xlnx-zynqmp-crf.c
> index cccca0e814e..d9c1bd50e4f 100644
> --- a/hw/misc/xlnx-zynqmp-crf.c
> +++ b/hw/misc/xlnx-zynqmp-crf.c
> @@ -209,28 +209,23 @@ static const MemoryRegionOps crf_ops = {
>  
>  static void crf_init(Object *obj)
>  {
>      XlnxZynqMPCRF *s = XLNX_ZYNQMP_CRF(obj);
>      SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
> +    RegisterInfoArray *reg_array;
>  
> -    s->reg_array =
> +    reg_array =
>          register_init_block32(DEVICE(obj), crf_regs_info,
>                                ARRAY_SIZE(crf_regs_info),
>                                s->regs_info, s->regs,
>                                &crf_ops,
>                                XLNX_ZYNQMP_CRF_ERR_DEBUG,
>                                CRF_R_MAX * 4);
> -    sysbus_init_mmio(sbd, &s->reg_array->mem);
> +    sysbus_init_mmio(sbd, &reg_array->mem);
>      sysbus_init_irq(sbd, &s->irq_ir);
>  }
>  
> -static void crf_finalize(Object *obj)
> -{
> -    XlnxZynqMPCRF *s = XLNX_ZYNQMP_CRF(obj);
> -    register_finalize_block(s->reg_array);
> -}
> -
>  static const VMStateDescription vmstate_crf = {
>      .name = TYPE_XLNX_ZYNQMP_CRF,
>      .version_id = 1,
>      .minimum_version_id = 1,
>      .fields = (const VMStateField[]) {
> @@ -253,11 +248,10 @@ static const TypeInfo crf_info = {
>      .name              = TYPE_XLNX_ZYNQMP_CRF,
>      .parent            = TYPE_SYS_BUS_DEVICE,
>      .instance_size     = sizeof(XlnxZynqMPCRF),
>      .class_init        = crf_class_init,
>      .instance_init     = crf_init,
> -    .instance_finalize = crf_finalize,
>  };
>  
>  static void crf_register_types(void)
>  {
>      type_register_static(&crf_info);
> diff --git a/hw/nvram/xlnx-bbram.c b/hw/nvram/xlnx-bbram.c
> index 5702bb3f310..22aefbc240d 100644
> --- a/hw/nvram/xlnx-bbram.c
> +++ b/hw/nvram/xlnx-bbram.c
> @@ -454,30 +454,24 @@ static void bbram_ctrl_realize(DeviceState *dev, Error 
> **errp)
>  
>  static void bbram_ctrl_init(Object *obj)
>  {
>      XlnxBBRam *s = XLNX_BBRAM(obj);
>      SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
> +    RegisterInfoArray *reg_array;
>  
> -    s->reg_array =
> +    reg_array =
>          register_init_block32(DEVICE(obj), bbram_ctrl_regs_info,
>                                ARRAY_SIZE(bbram_ctrl_regs_info),
>                                s->regs_info, s->regs,
>                                &bbram_ctrl_ops,
>                                XLNX_BBRAM_ERR_DEBUG,
>                                R_MAX * 4);
>  
> -    sysbus_init_mmio(sbd, &s->reg_array->mem);
> +    sysbus_init_mmio(sbd, &reg_array->mem);
>      sysbus_init_irq(sbd, &s->irq_bbram);
>  }
>  
> -static void bbram_ctrl_finalize(Object *obj)
> -{
> -    XlnxBBRam *s = XLNX_BBRAM(obj);
> -
> -    register_finalize_block(s->reg_array);
> -}
> -
>  static void bbram_prop_set_drive(Object *obj, Visitor *v, const char *name,
>                                   void *opaque, Error **errp)
>  {
>      DeviceState *dev = DEVICE(obj);
>  
> @@ -540,11 +534,10 @@ static const TypeInfo bbram_ctrl_info = {
>      .name          = TYPE_XLNX_BBRAM,
>      .parent        = TYPE_SYS_BUS_DEVICE,
>      .instance_size = sizeof(XlnxBBRam),
>      .class_init    = bbram_ctrl_class_init,
>      .instance_init = bbram_ctrl_init,
> -    .instance_finalize = bbram_ctrl_finalize,
>  };
>  
>  static void bbram_ctrl_register_types(void)
>  {
>      type_register_static(&bbram_ctrl_info);
> diff --git a/hw/nvram/xlnx-versal-efuse-ctrl.c 
> b/hw/nvram/xlnx-versal-efuse-ctrl.c
> index 90962198008..6f17f32a0c3 100644
> --- a/hw/nvram/xlnx-versal-efuse-ctrl.c
> +++ b/hw/nvram/xlnx-versal-efuse-ctrl.c
> @@ -726,11 +726,10 @@ static void efuse_ctrl_init(Object *obj)
>  
>  static void efuse_ctrl_finalize(Object *obj)
>  {
>      XlnxVersalEFuseCtrl *s = XLNX_VERSAL_EFUSE_CTRL(obj);
>  
> -    register_finalize_block(s->reg_array);
>      g_free(s->extra_pg0_lock_spec);
>  }
>  
>  static const VMStateDescription vmstate_efuse_ctrl = {
>      .name = TYPE_XLNX_VERSAL_EFUSE_CTRL,
> diff --git a/hw/nvram/xlnx-zynqmp-efuse.c b/hw/nvram/xlnx-zynqmp-efuse.c
> index 5a218c32e84..ce35bb0cc1f 100644
> --- a/hw/nvram/xlnx-zynqmp-efuse.c
> +++ b/hw/nvram/xlnx-zynqmp-efuse.c
> @@ -814,17 +814,10 @@ static void zynqmp_efuse_init(Object *obj)
>  
>      sysbus_init_mmio(sbd, &s->reg_array->mem);
>      sysbus_init_irq(sbd, &s->irq);
>  }
>  
> -static void zynqmp_efuse_finalize(Object *obj)
> -{
> -    XlnxZynqMPEFuse *s = XLNX_ZYNQMP_EFUSE(obj);
> -
> -    register_finalize_block(s->reg_array);
> -}
> -
>  static const VMStateDescription vmstate_efuse = {
>      .name = TYPE_XLNX_ZYNQMP_EFUSE,
>      .version_id = 1,
>      .minimum_version_id = 1,
>      .fields = (const VMStateField[]) {
> @@ -855,11 +848,10 @@ static const TypeInfo efuse_info = {
>      .name          = TYPE_XLNX_ZYNQMP_EFUSE,
>      .parent        = TYPE_SYS_BUS_DEVICE,
>      .instance_size = sizeof(XlnxZynqMPEFuse),
>      .class_init    = zynqmp_efuse_class_init,
>      .instance_init = zynqmp_efuse_init,
> -    .instance_finalize = zynqmp_efuse_finalize,
>  };
>  
>  static void efuse_register_types(void)
>  {
>      type_register_static(&efuse_info);
> -- 
> 2.50.1
> 

Reply via email to