[PATCH 01/02] ARM: shmobile: Introduce per-CPU SMP boot / sleep code
Simon Horman
horms at verge.net.au
Mon Aug 5 04:34:52 EDT 2013
On Thu, Aug 01, 2013 at 03:38:18AM +0900, Magnus Damm wrote:
> From: Magnus Damm <damm at opensource.se>
>
> 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 at opensource.se>
Hi Magnus,
I have queued this up for v3.12 in the smp branch
with the following whitespace changes:
> ---
>
> arch/arm/mach-shmobile/headsmp.S | 50 ++++++++++++++++++++++++++
> arch/arm/mach-shmobile/include/mach/common.h | 4 ++
> arch/arm/mach-shmobile/platsmp.c | 18 +++++++++
> 3 files changed, 72 insertions(+)
>
> --- 0001/arch/arm/mach-shmobile/headsmp.S
> +++ work/arch/arm/mach-shmobile/headsmp.S 2013-07-31 12:23:20.000000000 +0900
> @@ -40,3 +40,53 @@ shmobile_boot_fn:
> .globl shmobile_boot_arg
> shmobile_boot_arg:
> 2: .space 4
> +
> +/*
> + * Per-CPU SMP boot function/argument selection code based on MPIDR
> + */
> +
> +ENTRY(shmobile_smp_boot)
> + @ r0 = MPIDR_HWID_BITMASK
> + mrc p15, 0, r1, c0, c0, 5 @ r1 = MPIDR
> + and r0, r1, r0 @ r0 = cpu_logical_map() value
> + mov r1, #0 @ r1 = CPU index
> + adr r5, 1f @ array of per-cpu mpidr values
> + adr r6, 2f @ array of per-cpu functions
> + adr r7, 3f @ array of per-cpu arguments
> +
Removed trailing whitespace from line above.
> +shmobile_smp_boot_find_mpidr:
> + ldr r8, [r5, r1, lsl #2]
> + cmp r8, r0
> + bne shmobile_smp_boot_next
> +
> + ldr r9, [r6, r1, lsl #2]
> + cmp r9, #0
> + bne shmobile_smp_boot_found
> +
Removed trailing whitespace from line above.
> +shmobile_smp_boot_next:
> + add r1, r1, #1
> + cmp r1, #CONFIG_NR_CPUS
> + blo shmobile_smp_boot_find_mpidr
> +
> + b shmobile_smp_sleep
> +
Removed trailing whitespace from line above.
> +shmobile_smp_boot_found:
> + ldr r0, [r7, r1, lsl #2]
> + mov pc, r9
> +ENDPROC(shmobile_smp_boot)
> +
> +ENTRY(shmobile_smp_sleep)
> + wfi
> + b shmobile_smp_boot
> +ENDPROC(shmobile_smp_sleep)
> +
> + .globl shmobile_smp_mpidr
> +shmobile_smp_mpidr:
> +1: .space CONFIG_NR_CPUS * 4
> + .globl shmobile_smp_fn
> +shmobile_smp_fn:
> +2: .space CONFIG_NR_CPUS * 4
> + .globl shmobile_smp_arg
> +shmobile_smp_arg:
> +3: .space CONFIG_NR_CPUS * 4
> +
Remove trailing blank line from line above.
> --- 0006/arch/arm/mach-shmobile/include/mach/common.h
> +++ work/arch/arm/mach-shmobile/include/mach/common.h 2013-07-31 12:18:01.000000000 +0900
> @@ -10,6 +10,10 @@ extern void shmobile_setup_console(void)
> extern void shmobile_boot_vector(void);
> extern unsigned long shmobile_boot_fn;
> extern unsigned long shmobile_boot_arg;
> +extern void shmobile_smp_boot(void);
> +extern void shmobile_smp_sleep(void);
> +extern void shmobile_smp_hook(unsigned int cpu, unsigned long fn,
> + unsigned long arg);
> extern void shmobile_boot_scu(void);
> extern void shmobile_smp_scu_prepare_cpus(unsigned int max_cpus);
> extern int shmobile_smp_scu_boot_secondary(unsigned int cpu,
> --- 0001/arch/arm/mach-shmobile/platsmp.c
> +++ work/arch/arm/mach-shmobile/platsmp.c 2013-07-31 12:18:01.000000000 +0900
> @@ -12,6 +12,9 @@
> */
> #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)
> {
> @@ -26,3 +29,18 @@ void __init shmobile_smp_init_cpus(unsig
> 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();
> +}
>
More information about the linux-arm-kernel
mailing list