mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-13 20:33:15 +00:00
[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>
This commit is contained in:
parent
63c2a0e598
commit
7890f794e0
@ -331,15 +331,21 @@ static int __devinit smp_boot_one_cpu(unsigned int cpu)
|
||||
unsigned long cookie =
|
||||
(unsigned long)(&cpu_new_thread);
|
||||
struct task_struct *p;
|
||||
int timeout, ret, cpu_node;
|
||||
int timeout, ret;
|
||||
|
||||
p = fork_idle(cpu);
|
||||
callin_flag = 0;
|
||||
cpu_new_thread = task_thread_info(p);
|
||||
cpu_set(cpu, cpu_callout_map);
|
||||
|
||||
cpu_find_by_mid(cpu, &cpu_node);
|
||||
prom_startcpu(cpu_node, entry, cookie);
|
||||
if (tlb_type == hypervisor) {
|
||||
prom_startcpu_cpuid(cpu, entry, cookie);
|
||||
} else {
|
||||
int cpu_node;
|
||||
|
||||
cpu_find_by_mid(cpu, &cpu_node);
|
||||
prom_startcpu(cpu_node, entry, cookie);
|
||||
}
|
||||
|
||||
for (timeout = 0; timeout < 5000000; timeout++) {
|
||||
if (callin_flag)
|
||||
|
@ -308,9 +308,21 @@ int prom_wakeupsystem(void)
|
||||
}
|
||||
|
||||
#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)
|
||||
|
@ -188,10 +188,18 @@ extern enum prom_output_device prom_query_output_device(void);
|
||||
|
||||
/* Multiprocessor operations... */
|
||||
#ifdef CONFIG_SMP
|
||||
/* Start the CPU with the given device tree node, context table, and context
|
||||
* at the passed program counter.
|
||||
/* Start the CPU with the given device tree node at the passed program
|
||||
* 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. */
|
||||
extern void prom_stopself(void);
|
||||
|
Loading…
Reference in New Issue
Block a user