aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@sunset.davemloft.net>2006-02-15 05:26:54 -0500
committerDavid S. Miller <davem@sunset.davemloft.net>2006-03-20 04:13:04 -0500
commit7890f794e0e6f7dce2a5f4a03ba64b0b3fe306bd (patch)
treea9cc7c67498616a47108c667a9c001f9fe468318
parent63c2a0e598c2fa769a08a6e9ad124bf270b4436e (diff)
[SPARC64]: Add prom_{start,stop}cpu_cpuid().
Use prom_startcpu_cpuid() on SUN4V instead of prom_startcpu(). We should really test for "SUNW,start-cpu-by-cpuid" presence and use it if present even on SUN4U. Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--arch/sparc64/kernel/smp.c12
-rw-r--r--arch/sparc64/prom/misc.c16
-rw-r--r--include/asm-sparc64/oplib.h14
3 files changed, 34 insertions, 8 deletions
diff --git a/arch/sparc64/kernel/smp.c b/arch/sparc64/kernel/smp.c
index 64046d37bbf0..527dfd7ae210 100644
--- a/arch/sparc64/kernel/smp.c
+++ b/arch/sparc64/kernel/smp.c
@@ -331,15 +331,21 @@ static int __devinit smp_boot_one_cpu(unsigned int cpu)
331 unsigned long cookie = 331 unsigned long cookie =
332 (unsigned long)(&cpu_new_thread); 332 (unsigned long)(&cpu_new_thread);
333 struct task_struct *p; 333 struct task_struct *p;
334 int timeout, ret, cpu_node; 334 int timeout, ret;
335 335
336 p = fork_idle(cpu); 336 p = fork_idle(cpu);
337 callin_flag = 0; 337 callin_flag = 0;
338 cpu_new_thread = task_thread_info(p); 338 cpu_new_thread = task_thread_info(p);
339 cpu_set(cpu, cpu_callout_map); 339 cpu_set(cpu, cpu_callout_map);
340 340
341 cpu_find_by_mid(cpu, &cpu_node); 341 if (tlb_type == hypervisor) {
342 prom_startcpu(cpu_node, entry, cookie); 342 prom_startcpu_cpuid(cpu, entry, cookie);
343 } else {
344 int cpu_node;
345
346 cpu_find_by_mid(cpu, &cpu_node);
347 prom_startcpu(cpu_node, entry, cookie);
348 }
343 349
344 for (timeout = 0; timeout < 5000000; timeout++) { 350 for (timeout = 0; timeout < 5000000; timeout++) {
345 if (callin_flag) 351 if (callin_flag)
diff --git a/arch/sparc64/prom/misc.c b/arch/sparc64/prom/misc.c
index 713cbac5f9bf..36d2b9c1622d 100644
--- a/arch/sparc64/prom/misc.c
+++ b/arch/sparc64/prom/misc.c
@@ -308,9 +308,21 @@ int prom_wakeupsystem(void)
308} 308}
309 309
310#ifdef CONFIG_SMP 310#ifdef CONFIG_SMP
311void prom_startcpu(int cpunode, unsigned long pc, unsigned long o0) 311void prom_startcpu(int cpunode, unsigned long pc, unsigned long arg)
312{ 312{
313 p1275_cmd("SUNW,start-cpu", P1275_INOUT(3, 0), cpunode, pc, o0); 313 p1275_cmd("SUNW,start-cpu", P1275_INOUT(3, 0), cpunode, pc, arg);
314}
315
316void prom_startcpu_cpuid(int cpuid, unsigned long pc, unsigned long arg)
317{
318 p1275_cmd("SUNW,start-cpu-by-cpuid", P1275_INOUT(3, 0),
319 cpuid, pc, arg);
320}
321
322void prom_stopcpu_cpuid(int cpuid)
323{
324 p1275_cmd("SUNW,stop-cpu-by-cpuid", P1275_INOUT(1, 0),
325 cpuid);
314} 326}
315 327
316void prom_stopself(void) 328void prom_stopself(void)
diff --git a/include/asm-sparc64/oplib.h b/include/asm-sparc64/oplib.h
index 0631d13475f2..84618f8a9e6e 100644
--- a/include/asm-sparc64/oplib.h
+++ b/include/asm-sparc64/oplib.h
@@ -188,10 +188,18 @@ extern enum prom_output_device prom_query_output_device(void);
188 188
189/* Multiprocessor operations... */ 189/* Multiprocessor operations... */
190#ifdef CONFIG_SMP 190#ifdef CONFIG_SMP
191/* Start the CPU with the given device tree node, context table, and context 191/* Start the CPU with the given device tree node at the passed program
192 * at the passed program counter. 192 * counter with the given arg passed in via register %o0.
193 */ 193 */
194extern void prom_startcpu(int cpunode, unsigned long pc, unsigned long o0); 194extern void prom_startcpu(int cpunode, unsigned long pc, unsigned long arg);
195
196/* Start the CPU with the given cpu ID at the passed program
197 * counter with the given arg passed in via register %o0.
198 */
199extern void prom_startcpu_cpuid(int cpuid, unsigned long pc, unsigned long arg);
200
201/* Stop the CPU with the given cpu ID. */
202extern void prom_stopcpu_cpuid(int cpuid);
195 203
196/* Stop the current CPU. */ 204/* Stop the current CPU. */
197extern void prom_stopself(void); 205extern void prom_stopself(void);