Commit 4fd4fa10 authored by Paul Mackerras's avatar Paul Mackerras Committed by Linus Torvalds

[PATCH] ppc64: set platform cpuids later in boot

Move the initialization of the per-cpu paca->hw_cpu_id out of the Open
Firmware client boot code and into a common location which is executed
later.
Signed-off-by: default avatarNathan Lynch <nathanl@austin.ibm.com>
Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 815e7a88
...@@ -919,31 +919,11 @@ static void __init prom_hold_cpus(unsigned long mem) ...@@ -919,31 +919,11 @@ static void __init prom_hold_cpus(unsigned long mem)
unsigned long secondary_hold unsigned long secondary_hold
= virt_to_abs(*PTRRELOC((unsigned long *)__secondary_hold)); = virt_to_abs(*PTRRELOC((unsigned long *)__secondary_hold));
struct systemcfg *_systemcfg = RELOC(systemcfg); struct systemcfg *_systemcfg = RELOC(systemcfg);
struct paca_struct *lpaca = PTRRELOC(&paca[0]);
struct prom_t *_prom = PTRRELOC(&prom); struct prom_t *_prom = PTRRELOC(&prom);
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
struct naca_struct *_naca = RELOC(naca); struct naca_struct *_naca = RELOC(naca);
#endif #endif
/* On pmac, we just fill out the various global bitmasks and
* arrays indicating our CPUs are here, they are actually started
* later on from pmac_smp
*/
if (_systemcfg->platform == PLATFORM_POWERMAC) {
for (node = 0; prom_next_node(&node); ) {
type[0] = 0;
prom_getprop(node, "device_type", type, sizeof(type));
if (strcmp(type, RELOC("cpu")) != 0)
continue;
reg = -1;
prom_getprop(node, "reg", &reg, sizeof(reg));
lpaca[cpuid].hw_cpu_id = reg;
cpuid++;
}
return;
}
prom_debug("prom_hold_cpus: start...\n"); prom_debug("prom_hold_cpus: start...\n");
prom_debug(" 1) spinloop = 0x%x\n", (unsigned long)spinloop); prom_debug(" 1) spinloop = 0x%x\n", (unsigned long)spinloop);
prom_debug(" 1) *spinloop = 0x%x\n", *spinloop); prom_debug(" 1) *spinloop = 0x%x\n", *spinloop);
...@@ -987,7 +967,6 @@ static void __init prom_hold_cpus(unsigned long mem) ...@@ -987,7 +967,6 @@ static void __init prom_hold_cpus(unsigned long mem)
prom_debug("\ncpuid = 0x%x\n", cpuid); prom_debug("\ncpuid = 0x%x\n", cpuid);
prom_debug("cpu hw idx = 0x%x\n", reg); prom_debug("cpu hw idx = 0x%x\n", reg);
lpaca[cpuid].hw_cpu_id = reg;
/* Init the acknowledge var which will be reset by /* Init the acknowledge var which will be reset by
* the secondary cpu when it awakens from its OF * the secondary cpu when it awakens from its OF
...@@ -1044,7 +1023,6 @@ static void __init prom_hold_cpus(unsigned long mem) ...@@ -1044,7 +1023,6 @@ static void __init prom_hold_cpus(unsigned long mem)
cpuid++; cpuid++;
if (cpuid >= NR_CPUS) if (cpuid >= NR_CPUS)
continue; continue;
lpaca[cpuid].hw_cpu_id = interrupt_server[i];
prom_printf("%x : preparing thread ... ", prom_printf("%x : preparing thread ... ",
interrupt_server[i]); interrupt_server[i]);
if (_naca->smt_state) { if (_naca->smt_state) {
......
...@@ -170,6 +170,8 @@ void __init disable_early_printk(void) ...@@ -170,6 +170,8 @@ void __init disable_early_printk(void)
* *
* This function is valid only for Open Firmware systems. finish_device_tree * This function is valid only for Open Firmware systems. finish_device_tree
* must be called before using this. * must be called before using this.
*
* While we're here, we may as well set the "physical" cpu ids in the paca.
*/ */
static void __init setup_cpu_maps(void) static void __init setup_cpu_maps(void)
{ {
...@@ -182,11 +184,15 @@ static void __init setup_cpu_maps(void) ...@@ -182,11 +184,15 @@ static void __init setup_cpu_maps(void)
intserv = (u32 *)get_property(dn, "ibm,ppc-interrupt-server#s", intserv = (u32 *)get_property(dn, "ibm,ppc-interrupt-server#s",
&len); &len);
if (!intserv)
intserv = (u32 *)get_property(dn, "reg", NULL);
nthreads = len / sizeof(u32); nthreads = len / sizeof(u32);
for (j = 0; j < nthreads && cpu < NR_CPUS; j++) { for (j = 0; j < nthreads && cpu < NR_CPUS; j++) {
cpu_set(cpu, cpu_possible_map); cpu_set(cpu, cpu_possible_map);
cpu_set(cpu, cpu_present_map); cpu_set(cpu, cpu_present_map);
set_hard_smp_processor_id(cpu, intserv[j]);
cpu++; cpu++;
} }
} }
......
...@@ -63,7 +63,7 @@ extern int query_cpu_stopped(unsigned int pcpu); ...@@ -63,7 +63,7 @@ extern int query_cpu_stopped(unsigned int pcpu);
#define get_hard_smp_processor_id(CPU) (paca[(CPU)].hw_cpu_id) #define get_hard_smp_processor_id(CPU) (paca[(CPU)].hw_cpu_id)
#define set_hard_smp_processor_id(CPU, VAL) \ #define set_hard_smp_processor_id(CPU, VAL) \
do { (paca[(CPU)].hw_proc_num = (VAL)); } while (0) do { (paca[(CPU)].hw_cpu_id = (VAL)); } while (0)
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment