ARM: Factor out secondary CPU bootup code from RealView platforms
Subsystems (3)
PATCH 1/2 ARM: Factor out secondary CPU bootup code from RealView platforms
For CNS3xxx we want to reuse the original ARM approach of booting secondary CPUs. This patch turns RealView's code into "SCU library", so that now platform code can call the generic routines.
Note that there are also mach-{omap2,ux500,vexpress} that might benefit from this change.
--- arch/arm/include/asm/smp_scu.h | 8 ++ arch/arm/kernel/Makefile | 2 +- arch/arm/kernel/smp_scu.c | 164 +++++++++++++++++++++++++++++++++++++ arch/arm/kernel/smp_scu_head.S | 37 +++++++++ arch/arm/mach-realview/Makefile | 2 +- arch/arm/mach-realview/headsmp.S | 39 --------- arch/arm/mach-realview/platsmp.c | 165 ++------------------------------------ 7 files changed, 217 insertions(+), 200 deletions(-) create mode 100644 arch/arm/kernel/smp_scu_head.S delete mode 100644 arch/arm/mach-realview/headsmp.S
arch/arm/include/asm/smp_scu.h +8 -0
@@ -4,4 +4,12 @@unsigned int scu_get_core_count (void __iomem *);void scu_enable (void __iomem *); +extern volatile int __cpuinitdata scu_pen_release; +void scu_secondary_startup (void ); +void __cpuinit scu_secondary_init (unsigned int cpu); +int __cpuinit scu_boot_secondary (unsigned int cpu,struct task_struct *idle); +void __init scu_init_cpus (void __iomem *scu_base); +void __init scu_prepare_cpus (void __iomem *scu_base,void __iomem *maddr, +unsigned int max_cpus); +#endif
arch/arm/kernel/Makefile +1 -1
@@ -28,7 +28,7 @@ obj-$(CONFIG_ARTHUR) += arthur.o obj-$(CONFIG_ISA_DMA) += dma-isa.o obj-$(CONFIG_PCI) += bios32.o isa.o obj-$(CONFIG_SMP) += smp.o -obj-$(CONFIG_HAVE_ARM_SCU) += smp_scu.o +obj-$(CONFIG_HAVE_ARM_SCU) += smp_scu.o smp_scu_head.o obj-$(CONFIG_HAVE_ARM_TWD) += smp_twd.o obj-$(CONFIG_DYNAMIC_FTRACE) += ftrace.o obj-$(CONFIG_KEXEC) += machine_kexec.o relocate_kernel.o
arch/arm/kernel/smp_scu.c +164 -0
177 lines not on this page · raw message
arch/arm/kernel/smp_scu_head.S new file +37 -0
@@ -0,0 +1,37 @@ +/* + * Copyright (c) 2003 ARM Limited + * 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/linkage.h> +#include <linux/init.h> + + __INIT + +/* + * SCU specific entry point for secondary CPUs. This provides + * a "holding pen" into which all secondary cores are held until we're + * ready for them to initialise. + */ +ENTRY(scu_secondary_startup) + mrc p15, 0, r0, c0, c0, 5 + and r0, r0, #15 + adr r4, 1f + ldmia r4, {r5, r6} + sub r4, r4, r5 + add r6, r6, r4 +pen: ldr r7, [r6] + cmp r7, r0 + bne pen + + /* + * we've been released from the holding pen: secondary_stack + * should now contain the SVC stack for this core + */ + b secondary_startup + +1: .long . + .long scu_pen_release
arch/arm/mach-realview/Makefile +1 -1
@@ -8,6 +8,6 @@ obj-$(CONFIG_MACH_REALVIEW_PB11MP) += realview_pb11mp.o obj-$(CONFIG_MACH_REALVIEW_PB1176) += realview_pb1176.o obj-$(CONFIG_MACH_REALVIEW_PBA8) += realview_pba8.o obj-$(CONFIG_MACH_REALVIEW_PBX) += realview_pbx.o -obj-$(CONFIG_SMP) += platsmp.o headsmp.o +obj-$(CONFIG_SMP) += platsmp.o obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o obj-$(CONFIG_LOCAL_TIMERS) += localtimer.o
arch/arm/mach-realview/headsmp.S deleted +0 -39
@@ -1,39 +0,0 @@ -/* - * linux/arch/arm/mach-realview/headsmp.S - * - * Copyright (c) 2003 ARM Limited - * 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/linkage.h> -#include <linux/init.h> - - __INIT - -/* - * Realview specific entry point for secondary CPUs. This provides - * a "holding pen" into which all secondary cores are held until we're - * ready for them to initialise. - */ -ENTRY(realview_secondary_startup) - mrc p15, 0, r0, c0, c0, 5 - and r0, r0, #15 - adr r4, 1f - ldmia r4, {r5, r6} - sub r4, r4, r5 - add r6, r6, r4 -pen: ldr r7, [r6] - cmp r7, r0 - bne pen - - /* - * we've been released from the holding pen: secondary_stack - * should now contain the SVC stack for this core - */ - b secondary_startup - -1: .long . - .long pen_release
arch/arm/mach-realview/platsmp.c +6 -159
205 lines not on this page · raw message
Signature · 1 line
1.7.0.5
PATCH 1/2 ARM: Factor out secondary CPU bootup code from RealView platforms
Quoted 3 lines · Anton Vorontsov
For CNS3xxx we want to reuse the original ARM approach of booting secondary CPUs. This patch turns RealView's code into "SCU library", so that now platform code can call the generic routines.
Please use vexpress as the basis for taking code from, not realview.
PATCH v2 1/3 ARM: Factor out secondary CPU bootup code from VExpress platforms
For CNS3xxx we want to reuse the original ARM approach of booting secondary CPUs. This patch turns VExpress' code into "SCU library", so that now platform code can call the generic routines.
Note that there are also mach-{omap2,ux500,realview} that might benefit from this change.
--- arch/arm/include/asm/smp_scu.h | 7 ++ arch/arm/kernel/Makefile | 2 +- arch/arm/kernel/smp_scu.c | 136 ++++++++++++++++++++++++++++++++++ arch/arm/kernel/smp_scu_head.S | 37 +++++++++ arch/arm/mach-vexpress/Makefile | 2 +- arch/arm/mach-vexpress/headsmp.S | 39 ---------- arch/arm/mach-vexpress/platsmp.c | 150 ++++---------------------------------- 7 files changed, 196 insertions(+), 177 deletions(-) create mode 100644 arch/arm/kernel/smp_scu_head.S delete mode 100644 arch/arm/mach-vexpress/headsmp.S
arch/arm/include/asm/smp_scu.h +7 -0
@@ -4,4 +4,11 @@unsigned int scu_get_core_count (void __iomem *);void scu_enable (void __iomem *); +extern volatile int __cpuinitdata scu_pen_release; +void scu_secondary_startup (void ); +void __cpuinit scu_secondary_init (unsigned int cpu); +int __cpuinit scu_boot_secondary (unsigned int cpu,struct task_struct *idle); +void __init scu_init_cpus (void __iomem *scu_base); +void __init scu_prepare_cpus (void __iomem *scu_base,unsigned int max_cpus); +#endif
arch/arm/kernel/Makefile +1 -1
@@ -28,7 +28,7 @@ obj-$(CONFIG_ARTHUR) += arthur.o obj-$(CONFIG_ISA_DMA) += dma-isa.o obj-$(CONFIG_PCI) += bios32.o isa.o obj-$(CONFIG_SMP) += smp.o -obj-$(CONFIG_HAVE_ARM_SCU) += smp_scu.o +obj-$(CONFIG_HAVE_ARM_SCU) += smp_scu.o smp_scu_head.o obj-$(CONFIG_HAVE_ARM_TWD) += smp_twd.o obj-$(CONFIG_DYNAMIC_FTRACE) += ftrace.o obj-$(CONFIG_KEXEC) += machine_kexec.o relocate_kernel.o
arch/arm/kernel/smp_scu.c +136 -0
149 lines not on this page · raw message
arch/arm/kernel/smp_scu_head.S new file +37 -0
@@ -0,0 +1,37 @@ +/* + * Copyright (c) 2003 ARM Limited + * 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/linkage.h> +#include <linux/init.h> + + __INIT + +/* + * SCU specific entry point for secondary CPUs. This provides + * a "holding pen" into which all secondary cores are held until we're + * ready for them to initialise. + */ +ENTRY(scu_secondary_startup) + mrc p15, 0, r0, c0, c0, 5 + and r0, r0, #15 + adr r4, 1f + ldmia r4, {r5, r6} + sub r4, r4, r5 + add r6, r6, r4 +pen: ldr r7, [r6] + cmp r7, r0 + bne pen + + /* + * we've been released from the holding pen: secondary_stack + * should now contain the SVC stack for this core + */ + b secondary_startup + +1: .long . + .long scu_pen_release
arch/arm/mach-vexpress/Makefile +1 -1
@@ -4,5 +4,5 @@ obj-y := v2m.o obj-$(CONFIG_ARCH_VEXPRESS_CA9X4) += ct-ca9x4.o -obj-$(CONFIG_SMP) += platsmp.o headsmp.o +obj-$(CONFIG_SMP) += platsmp.o obj-$(CONFIG_LOCAL_TIMERS) += localtimer.o
arch/arm/mach-vexpress/headsmp.S deleted +0 -39
@@ -1,39 +0,0 @@ -/* - * linux/arch/arm/mach-vexpress/headsmp.S - * - * Copyright (c) 2003 ARM Limited - * 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/linkage.h> -#include <linux/init.h> - - __INIT - -/* - * Versatile Express specific entry point for secondary CPUs. This - * provides a "holding pen" into which all secondary cores are held - * until we're ready for them to initialise. - */ -ENTRY(vexpress_secondary_startup) - mrc p15, 0, r0, c0, c0, 5 - and r0, r0, #15 - adr r4, 1f - ldmia r4, {r5, r6} - sub r4, r4, r5 - add r6, r6, r4 -pen: ldr r7, [r6] - cmp r7, r0 - bne pen - - /* - * we've been released from the holding pen: secondary_stack - * should now contain the SVC stack for this core - */ - b secondary_startup - -1: .long . - .long pen_release
arch/arm/mach-vexpress/platsmp.c +14 -136
188 lines not on this page · raw message
Signature · 1 line
1.7.0.5
PATCH v2 2/3 ARM: RealView: Switch to generic SCU routines
In reply to Russell King - ARM LinuxThis shrinks platform-specific code quite a bit.
--- arch/arm/mach-realview/Makefile | 2 +- arch/arm/mach-realview/headsmp.S | 39 --------- arch/arm/mach-realview/platsmp.c | 161 +++----------------------------------- 3 files changed, 12 insertions(+), 190 deletions(-) delete mode 100644 arch/arm/mach-realview/headsmp.S
arch/arm/mach-realview/Makefile +1 -1
@@ -8,6 +8,6 @@ obj-$(CONFIG_MACH_REALVIEW_PB11MP) += realview_pb11mp.o obj-$(CONFIG_MACH_REALVIEW_PB1176) += realview_pb1176.o obj-$(CONFIG_MACH_REALVIEW_PBA8) += realview_pba8.o obj-$(CONFIG_MACH_REALVIEW_PBX) += realview_pbx.o -obj-$(CONFIG_SMP) += platsmp.o headsmp.o +obj-$(CONFIG_SMP) += platsmp.o obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o obj-$(CONFIG_LOCAL_TIMERS) += localtimer.o
arch/arm/mach-realview/headsmp.S deleted +0 -39
@@ -1,39 +0,0 @@ -/* - * linux/arch/arm/mach-realview/headsmp.S - * - * Copyright (c) 2003 ARM Limited - * 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/linkage.h> -#include <linux/init.h> - - __INIT - -/* - * Realview specific entry point for secondary CPUs. This provides - * a "holding pen" into which all secondary cores are held until we're - * ready for them to initialise. - */ -ENTRY(realview_secondary_startup) - mrc p15, 0, r0, c0, c0, 5 - and r0, r0, #15 - adr r4, 1f - ldmia r4, {r5, r6} - sub r4, r4, r5 - add r6, r6, r4 -pen: ldr r7, [r6] - cmp r7, r0 - bne pen - - /* - * we've been released from the holding pen: secondary_stack - * should now contain the SVC stack for this core - */ - b secondary_startup - -1: .long . - .long pen_release
arch/arm/mach-realview/platsmp.c +11 -150
209 lines not on this page · raw message
Signature · 1 line
1.7.0.5
PATCH v2 3/3 ARM: cns3xxx: Add support for SMP
In reply to Russell King - ARM LinuxThanks to the previous refactorings, nothing fancy needs to be done, just use generic SCU routines.
--- arch/arm/Kconfig | 2 +- arch/arm/mach-cns3xxx/Kconfig | 1 + arch/arm/mach-cns3xxx/Makefile | 1 + arch/arm/mach-cns3xxx/include/mach/smp.h | 31 +++++++++++++ arch/arm/mach-cns3xxx/platsmp.c | 69 ++++++++++++++++++++++++++++++ 5 files changed, 103 insertions(+), 1 deletions(-) create mode 100644 arch/arm/mach-cns3xxx/include/mach/smp.h create mode 100644 arch/arm/mach-cns3xxx/platsmp.c
arch/arm/Kconfig +1 -1
@@ -1100,7 +1100,7 @@ config SMP bool "Symmetric Multi-Processing (EXPERIMENTAL)" depends on EXPERIMENTAL && (REALVIEW_EB_ARM11MP || REALVIEW_EB_A9MP ||\ MACH_REALVIEW_PB11MP || MACH_REALVIEW_PBX || ARCH_OMAP4 ||\ - ARCH_U8500 || ARCH_VEXPRESS_CA9X4) + ARCH_U8500 || ARCH_VEXPRESS_CA9X4 || ARCH_CNS3XXX) depends on GENERIC_CLOCKEVENTS select USE_GENERIC_SMP_HELPERS select HAVE_ARM_SCU if (ARCH_REALVIEW || ARCH_OMAP4 || ARCH_U8500 || ARCH_VEXPRESS_CA9X4)
arch/arm/mach-cns3xxx/Kconfig +1 -0
@@ -3,6 +3,7 @@ menu "CNS3XXX platform type" config MACH_CNS3420VB bool "Support for CNS3420 Validation Board" + select HAVE_ARM_SCU help Include support for the Cavium Networks CNS3420 MPCore Platform Baseboard.
arch/arm/mach-cns3xxx/Makefile +1 -0
@@ -1,3 +1,4 @@ obj-$(CONFIG_ARCH_CNS3XXX) += core.o pm.o devices.o +obj-$(CONFIG_SMP) += platsmp.o obj-$(CONFIG_PCI) += pcie.o obj-$(CONFIG_MACH_CNS3420VB) += cns3420vb.o
arch/arm/mach-cns3xxx/include/mach/smp.h new file +31 -0
@@ -0,0 +1,31 @@ +/* +* Copyright 2002 ARM Ltd. +* Copyright 2008 Cavium Networks +* +* This file 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. +*/ + +#ifndef __MACH_SMP_H +#define __MACH_SMP_H + +#include <asm/hardware/gic.h> + +#define hard_smp_processor_id () \ + ({ \ + unsigned int cpunum; \ + __asm__("mrc p15, 0, %0, c0, c0, 5" \ + : "=r" (cpunum)); \ + cpunum &= 0x0F; \ + }) + +/* +* We use IRQ1 as the IPI +*/ +static inline void smp_cross_call (const struct cpumask *mask) +{ +gic_raise_softirq (mask,1 ); +} + +#endif /* __MACH_SMP_H */
arch/arm/mach-cns3xxx/platsmp.c new file +69 -0
69 lines not on this page · raw message
Signature · 1 line
1.7.0.5
PATCH v2 3/3 ARM: cns3xxx: Add support for SMP
Quoted 5 lines · Anton Vorontsov
Thanks to the previous refactorings, nothing fancy needs to be done, just use generic SCU routines.
Signed-off-by Anton Vorontsov <[email protected]>---
[...]
arch/arm/mach-cns3xxx/Kconfig menu "CNS3XXX platform type" · line 6
Quoted 5 lines
arch/arm/mach-cns3xxx/Kconfig +1
-0@@ -3,6 +3,7 @@ menu "CNS3XXX platform type" config MACH_CNS3420VB bool "Support for CNS3420 Validation Board" + select HAVE_ARM_SCU
This should be 'select HAVE_ARM_SCU if SMP', otherwise non-SMP build fails.
Apart from this, Russell, do these patches look OK?
Signature · 3 lines
Anton Vorontsov email: cbouatmailru at gmail.com irc://irc.freenode.net/bd2