On cores that have the MPIDR.MT bit set,
- affinity level 0 is the thread ID
- affinity level 1 is the CPU ID
- affinity level 2 is the cluster ID
Thus, on these cores, the MPIDR_CPU_ID (resp. MPIDR_CLUSTER_ID) macro should extract bits 8 to 15 (resp. 16 to 23). At the moment, these macros do not inspect the MPIDR.MT bit (see their definitions) so they will not work as intended on multi-threaded cores.
This can be easily reproduced on the AEM FVP (revC), which has the MPIDR.MT bit set for all cores.
Here is a patch that modifies the template multi-core test to print the output of these macros for each core. This incorrectly shows:
[cpu 0x0000] cluster ID: 0 [cpu 0x0000] CPU ID: 0 [cpu 0x0100] MPID=0x81000100 [cpu 0x0100] cluster ID: 1 [cpu 0x0100] CPU ID: 0 [cpu 0x0200] MPID=0x81000200 [cpu 0x0200] cluster ID: 2 [cpu 0x0200] CPU ID: 0 [cpu 0x0300] MPID=0x81000300 [cpu 0x0300] cluster ID: 3 [cpu 0x0300] CPU ID: 0 [cpu 0x0000] MPID=0x81010000 [cpu 0x0000] cluster ID: 0 [cpu 0x0000] CPU ID: 0 [cpu 0x0100] MPID=0x81010100 [cpu 0x0100] cluster ID: 1 [cpu 0x0100] CPU ID: 0 [cpu 0x0200] MPID=0x81010200 [cpu 0x0200] cluster ID: 2 [cpu 0x0200] CPU ID: 0 [cpu 0x0300] MPID=0x81010300 [cpu 0x0300] cluster ID: 3 [cpu 0x0300] CPU ID: 0