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