On Wed, Jul 16, 2025 at 11:54:16AM +0200, Luc Michel wrote:
> The CRL connects to various devices through link properties to be able
> to reset them. The connections were dropped during the SoC refactoring.
> Reintroduce them now.
> 
> Rely on the QOM tree to retrieve the devices to connect. The component
> parts of the device names are chosen to match the properties on the CRL.
> 
> Signed-off-by: Luc Michel <luc.mic...@amd.com>

Reviewed-by: Francisco Iglesias <francisco.igles...@amd.com>

> ---
>  hw/arm/xlnx-versal.c | 31 ++++++++++++++++++++++++++++++-
>  1 file changed, 30 insertions(+), 1 deletion(-)
> 
> diff --git a/hw/arm/xlnx-versal.c b/hw/arm/xlnx-versal.c
> index 5151822ad56..796b4911a02 100644
> --- a/hw/arm/xlnx-versal.c
> +++ b/hw/arm/xlnx-versal.c
> @@ -1473,21 +1473,50 @@ static void versal_create_cfu(Versal *s, const struct 
> VersalCfuMap *map)
>      sysbus_realize_and_unref(sbd, &error_fatal);
>      memory_region_add_subregion(&s->mr_ps, map->cfu_sfr,
>                                  sysbus_mmio_get_region(sbd, 0));
>  }
>  
> +static inline void crl_connect_dev(Object *crl, Object *dev)
> +{
> +    const char *prop = object_get_canonical_path_component(dev);
> +
> +    /* The component part of the device path matches the CRL property name */
> +    object_property_set_link(crl, prop, dev, &error_abort);
> +}
> +
> +static inline void crl_connect_dev_by_name(Versal *s, Object *crl,
> +                                           const char *name, size_t num)
> +{
> +    size_t i;
> +
> +    for (i = 0; i < num; i++) {
> +        Object *dev = versal_get_child_idx(s, name, i);
> +
> +        crl_connect_dev(crl, dev);
> +    }
> +}
> +
>  static inline void versal_create_crl(Versal *s)
>  {
>      const VersalMap *map;
>      const char *crl_class;
>      DeviceState *dev;
> +    Object *obj;
>  
>      map = versal_get_map(s);
>  
>      crl_class = TYPE_XLNX_VERSAL_CRL;
>      dev = qdev_new(crl_class);
> -    object_property_add_child(OBJECT(s), "crl", OBJECT(dev));
> +    obj = OBJECT(dev);
> +    object_property_add_child(OBJECT(s), "crl", obj);
> +
> +    crl_connect_dev_by_name(s, obj, "rpu-cluster/rpu",
> +                            map->rpu.num_cluster * map->rpu.num_core);
> +    crl_connect_dev_by_name(s, obj, map->zdma[0].name, 
> map->zdma[0].num_chan);
> +    crl_connect_dev_by_name(s, obj, "uart", map->num_uart);
> +    crl_connect_dev_by_name(s, obj, "gem", map->num_gem);
> +    crl_connect_dev_by_name(s, obj, "usb", map->num_usb);
>  
>      sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_abort);
>  
>      memory_region_add_subregion(&s->mr_ps, map->crl.addr,
>                                  sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 
> 0));
> -- 
> 2.50.0
> 

Reply via email to