powerpc/setup: Add cpu_to_phys_id array
[linux-block.git] / arch / powerpc / kernel / setup-common.c
index 9eaf26318d20f973d41f54e4b48120cdf62d8410..bd79a5644c789d8a4ed749d992b530fbb40cdba3 100644 (file)
@@ -437,6 +437,8 @@ static void __init cpu_init_thread_core_maps(int tpc)
 }
 
 
+u32 *cpu_to_phys_id = NULL;
+
 /**
  * setup_cpu_maps - initialize the following cpu maps:
  *                  cpu_possible_mask
@@ -463,6 +465,10 @@ void __init smp_setup_cpu_maps(void)
 
        DBG("smp_setup_cpu_maps()\n");
 
+       cpu_to_phys_id = __va(memblock_alloc(nr_cpu_ids * sizeof(u32),
+                                                       __alignof__(u32)));
+       memset(cpu_to_phys_id, 0, nr_cpu_ids * sizeof(u32));
+
        for_each_node_by_type(dn, "cpu") {
                const __be32 *intserv;
                __be32 cpu_be;
@@ -480,6 +486,7 @@ void __init smp_setup_cpu_maps(void)
                        intserv = of_get_property(dn, "reg", &len);
                        if (!intserv) {
                                cpu_be = cpu_to_be32(cpu);
+                               /* XXX: what is this? uninitialized?? */
                                intserv = &cpu_be;      /* assume logical == phys */
                                len = 4;
                        }
@@ -499,8 +506,8 @@ void __init smp_setup_cpu_maps(void)
                                                "enable-method", "spin-table");
 
                        set_cpu_present(cpu, avail);
-                       set_hard_smp_processor_id(cpu, be32_to_cpu(intserv[j]));
                        set_cpu_possible(cpu, true);
+                       cpu_to_phys_id[cpu] = be32_to_cpu(intserv[j]);
                        cpu++;
                }
 
@@ -570,6 +577,12 @@ void __init smp_setup_cpu_maps(void)
        setup_nr_cpu_ids();
 
        free_unused_pacas();
+
+       for_each_possible_cpu(cpu) {
+               if (cpu == smp_processor_id())
+                       continue;
+               set_hard_smp_processor_id(cpu, cpu_to_phys_id[cpu]);
+       }
 }
 #endif /* CONFIG_SMP */