forked from Minki/linux
cc61591e45
Add per-CPU SMP boot / sleep code that can be used by all SoCs included in mach-shmobile. The boot code reads out the per-CPU MPIDR id value and matches it with the value stored for any CPU number, and if there is a match and the boot function is set as well then the boot function will be executed. The sleep code simply uses WFI and then jumps back to the boot code to see if anyone has asked to wake up that CPU, if not it will sleep again. Signed-off-by: Magnus Damm <damm@opensource.se> [horms+renesas@verge.net.au: Remove trailing whitespace] Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
47 lines
1.1 KiB
C
47 lines
1.1 KiB
C
/*
|
|
* SMP support for R-Mobile / SH-Mobile
|
|
*
|
|
* Copyright (C) 2010 Magnus Damm
|
|
* Copyright (C) 2011 Paul Mundt
|
|
*
|
|
* Based on vexpress, Copyright (C) 2002 ARM Ltd, All Rights Reserved
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*/
|
|
#include <linux/init.h>
|
|
#include <linux/smp.h>
|
|
#include <asm/cacheflush.h>
|
|
#include <asm/smp_plat.h>
|
|
#include <mach/common.h>
|
|
|
|
void __init shmobile_smp_init_cpus(unsigned int ncores)
|
|
{
|
|
unsigned int i;
|
|
|
|
if (ncores > nr_cpu_ids) {
|
|
pr_warn("SMP: %u cores greater than maximum (%u), clipping\n",
|
|
ncores, nr_cpu_ids);
|
|
ncores = nr_cpu_ids;
|
|
}
|
|
|
|
for (i = 0; i < ncores; i++)
|
|
set_cpu_possible(i, true);
|
|
}
|
|
|
|
extern unsigned long shmobile_smp_fn[];
|
|
extern unsigned long shmobile_smp_arg[];
|
|
extern unsigned long shmobile_smp_mpidr[];
|
|
|
|
void shmobile_smp_hook(unsigned int cpu, unsigned long fn, unsigned long arg)
|
|
{
|
|
shmobile_smp_fn[cpu] = 0;
|
|
flush_cache_all();
|
|
|
|
shmobile_smp_mpidr[cpu] = cpu_logical_map(cpu);
|
|
shmobile_smp_fn[cpu] = fn;
|
|
shmobile_smp_arg[cpu] = arg;
|
|
flush_cache_all();
|
|
}
|