On 14:18 Wed 20 Aug     , Philippe Mathieu-Daudé wrote:
> Hi Luc,
> 
> On 20/8/25 10:25, Luc Michel wrote:
> > Add a way to configure the MP affinity value of the CPUs given their
> > core and cluster IDs. For the Versal APU CPUs, the MP affinity value is
> > directly given by the core ID.
> > 
> > Signed-off-by: Luc Michel <[email protected]>
> > Reviewed-by: Francisco Iglesias <[email protected]>
> > ---
> >   hw/arm/xlnx-versal.c | 21 +++++++++++++++++++++
> >   1 file changed, 21 insertions(+)
> > 
> > diff --git a/hw/arm/xlnx-versal.c b/hw/arm/xlnx-versal.c
> > index 5a08ad07b28..35c32de0159 100644
> > --- a/hw/arm/xlnx-versal.c
> > +++ b/hw/arm/xlnx-versal.c
> > @@ -88,10 +88,18 @@ typedef struct VersalCpuClusterMap {
> >       size_t num_core;
> >       size_t num_cluster;
> >       uint32_t qemu_cluster_id;
> >       bool dtb_expose;
> > 
> > +    struct {
> > +        uint64_t base;
> > +        uint64_t core_mask;
> > +        uint64_t core_shift;
> > +        uint64_t cluster_mask;
> > +        uint64_t cluster_shift;
> > +    } mp_affinity;
> 
> 
> > @@ -565,23 +578,31 @@ static DeviceState *versal_create_cpu(Versal *s,
> >                                         size_t core_idx)
> >   {
> >       DeviceState *cpu = qdev_new(map->cpu_model);
> >       ARMCPU *arm_cpu = ARM_CPU(cpu);
> >       Object *obj = OBJECT(cpu);
> > +    uint64_t affinity;
> >       bool start_off;
> >       size_t idx = cluster_idx * map->num_core + core_idx;
> >       g_autofree char *name;
> >       g_autofree char *node = NULL;
> > 
> > +    affinity = map->mp_affinity.base;
> > +    affinity |= (cluster_idx & map->mp_affinity.cluster_mask)
> > +        << map->mp_affinity.cluster_shift;
> > +    affinity |= (core_idx & map->mp_affinity.core_mask)
> > +        << map->mp_affinity.core_shift;
> 
> Could we expand/re-use arm_build_mp_affinity() here?

I'm not sure:
   - versal RPU hardcodes Aff1 to 1,
   - versal2 APU uses Aff2 for cluster id and Aff1 for core id,
   - versal2 RPU uses Aff1 for cluster id and Aff0 for core id.

What I can do is use ARM_AFFx_SHIFT defines in my mp_affinity
description struct, and remove the mask as we probably expect it to be
0xff all the time. Something like:

        .mp_affinity = {
            .base = 0x0,
            .core_mask = ARM_AFF1_MASK,
            .cluster_shift = ARM_AFF2_SHIFT,
        },

What do you think?

-- 
Luc

Reply via email to