Commit 7890f794 authored by David S. Miller's avatar David S. Miller

[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: default avatarDavid S. Miller <davem@davemloft.net>
parent 63c2a0e5
...@@ -331,15 +331,21 @@ static int __devinit smp_boot_one_cpu(unsigned int cpu) ...@@ -331,15 +331,21 @@ static int __devinit smp_boot_one_cpu(unsigned int cpu)
unsigned long cookie = unsigned long cookie =
(unsigned long)(&cpu_new_thread); (unsigned long)(&cpu_new_thread);
struct task_struct *p; struct task_struct *p;
int timeout, ret, cpu_node; int timeout, ret;
p = fork_idle(cpu); p = fork_idle(cpu);
callin_flag = 0; callin_flag = 0;
cpu_new_thread = task_thread_info(p); cpu_new_thread = task_thread_info(p);
cpu_set(cpu, cpu_callout_map); cpu_set(cpu, cpu_callout_map);
if (tlb_type == hypervisor) {
prom_startcpu_cpuid(cpu, entry, cookie);
} else {
int cpu_node;
cpu_find_by_mid(cpu, &cpu_node); cpu_find_by_mid(cpu, &cpu_node);
prom_startcpu(cpu_node, entry, cookie); prom_startcpu(cpu_node, entry, cookie);
}
for (timeout = 0; timeout < 5000000; timeout++) { for (timeout = 0; timeout < 5000000; timeout++) {
if (callin_flag) if (callin_flag)
......
...@@ -308,9 +308,21 @@ int prom_wakeupsystem(void) ...@@ -308,9 +308,21 @@ int prom_wakeupsystem(void)
} }
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
void prom_startcpu(int cpunode, unsigned long pc, unsigned long o0) void prom_startcpu(int cpunode, unsigned long pc, unsigned long arg)
{ {
p1275_cmd("SUNW,start-cpu", P1275_INOUT(3, 0), cpunode, pc, o0); p1275_cmd("SUNW,start-cpu", P1275_INOUT(3, 0), cpunode, pc, arg);
}
void prom_startcpu_cpuid(int cpuid, unsigned long pc, unsigned long arg)
{
p1275_cmd("SUNW,start-cpu-by-cpuid", P1275_INOUT(3, 0),
cpuid, pc, arg);
}
void prom_stopcpu_cpuid(int cpuid)
{
p1275_cmd("SUNW,stop-cpu-by-cpuid", P1275_INOUT(1, 0),
cpuid);
} }
void prom_stopself(void) void prom_stopself(void)
......
...@@ -188,10 +188,18 @@ extern enum prom_output_device prom_query_output_device(void); ...@@ -188,10 +188,18 @@ extern enum prom_output_device prom_query_output_device(void);
/* Multiprocessor operations... */ /* Multiprocessor operations... */
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
/* Start the CPU with the given device tree node, context table, and context /* Start the CPU with the given device tree node at the passed program
* at the passed program counter. * counter with the given arg passed in via register %o0.
*/ */
extern void prom_startcpu(int cpunode, unsigned long pc, unsigned long o0); extern void prom_startcpu(int cpunode, unsigned long pc, unsigned long arg);
/* Start the CPU with the given cpu ID at the passed program
* counter with the given arg passed in via register %o0.
*/
extern void prom_startcpu_cpuid(int cpuid, unsigned long pc, unsigned long arg);
/* Stop the CPU with the given cpu ID. */
extern void prom_stopcpu_cpuid(int cpuid);
/* Stop the current CPU. */ /* Stop the current CPU. */
extern void prom_stopself(void); extern void prom_stopself(void);
......
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