arm64: topology: Fix handling of multi-level cluster MPIDR-based detection
[cascardo/linux.git] / arch / arm64 / kernel / topology.c
index b6ee26b..fcb8f7b 100644 (file)
@@ -255,12 +255,15 @@ void store_cpu_topology(unsigned int cpuid)
                /* Multiprocessor system : Multi-threads per core */
                cpuid_topo->thread_id  = MPIDR_AFFINITY_LEVEL(mpidr, 0);
                cpuid_topo->core_id    = MPIDR_AFFINITY_LEVEL(mpidr, 1);
-               cpuid_topo->cluster_id = MPIDR_AFFINITY_LEVEL(mpidr, 2);
+               cpuid_topo->cluster_id = MPIDR_AFFINITY_LEVEL(mpidr, 2) |
+                                        MPIDR_AFFINITY_LEVEL(mpidr, 3) << 8;
        } else {
                /* Multiprocessor system : Single-thread per core */
                cpuid_topo->thread_id  = -1;
                cpuid_topo->core_id    = MPIDR_AFFINITY_LEVEL(mpidr, 0);
-               cpuid_topo->cluster_id = MPIDR_AFFINITY_LEVEL(mpidr, 1);
+               cpuid_topo->cluster_id = MPIDR_AFFINITY_LEVEL(mpidr, 1) |
+                                        MPIDR_AFFINITY_LEVEL(mpidr, 2) << 8 |
+                                        MPIDR_AFFINITY_LEVEL(mpidr, 3) << 16;
        }
 
        pr_debug("CPU%u: cluster %d core %d thread %d mpidr %#016llx\n",