| From efd48a2af3bab7ed75a5280b82031db349a919ac Mon Sep 17 00:00:00 2001 |
| From: Magnus Damm <damm@opensource.se> |
| Date: Sat, 14 Sep 2013 22:46:25 +0900 |
| Subject: ARM: shmobile: Add CPU notifier based SCU boot vector code |
| |
| Add CPU notifiers for the shared mach-shmobile SCU code |
| to allow removal of the shared SCU boot_secondary code. |
| |
| Regarding notifiers, at CPU_UP_PREPARE time the SMP boot |
| vector is initialized so secondary CPU cores can boot. |
| |
| Signed-off-by: Magnus Damm <damm@opensource.se> |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| (cherry picked from commit 916d6121b5947f162979595cc1c0396192a9aa86) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| --- |
| arch/arm/mach-shmobile/platsmp-scu.c | 24 ++++++++++++++++++++++++ |
| 1 file changed, 24 insertions(+) |
| |
| diff --git a/arch/arm/mach-shmobile/platsmp-scu.c b/arch/arm/mach-shmobile/platsmp-scu.c |
| index c96f50160be6..49ae8dfc625d 100644 |
| --- a/arch/arm/mach-shmobile/platsmp-scu.c |
| +++ b/arch/arm/mach-shmobile/platsmp-scu.c |
| @@ -7,6 +7,7 @@ |
| * it under the terms of the GNU General Public License version 2 as |
| * published by the Free Software Foundation. |
| */ |
| +#include <linux/cpu.h> |
| #include <linux/delay.h> |
| #include <linux/init.h> |
| #include <linux/io.h> |
| @@ -16,6 +17,26 @@ |
| #include <asm/smp_scu.h> |
| #include <mach/common.h> |
| |
| +static int shmobile_smp_scu_notifier_call(struct notifier_block *nfb, |
| + unsigned long action, void *hcpu) |
| +{ |
| + unsigned int cpu = (long)hcpu; |
| + |
| + switch (action) { |
| + case CPU_UP_PREPARE: |
| + /* For this particular CPU register SCU SMP boot vector */ |
| + shmobile_smp_hook(cpu, virt_to_phys(shmobile_boot_scu), |
| + (unsigned long)shmobile_scu_base); |
| + break; |
| + }; |
| + |
| + return NOTIFY_OK; |
| +} |
| + |
| +static struct notifier_block shmobile_smp_scu_notifier = { |
| + .notifier_call = shmobile_smp_scu_notifier_call, |
| +}; |
| + |
| void __init shmobile_smp_scu_prepare_cpus(unsigned int max_cpus) |
| { |
| /* install boot code shared by all CPUs */ |
| @@ -25,6 +46,9 @@ void __init shmobile_smp_scu_prepare_cpus(unsigned int max_cpus) |
| /* enable SCU and cache coherency on booting CPU */ |
| scu_enable(shmobile_scu_base); |
| scu_power_mode(shmobile_scu_base, SCU_PM_NORMAL); |
| + |
| + /* Use CPU notifier for reset vector control */ |
| + register_cpu_notifier(&shmobile_smp_scu_notifier); |
| } |
| |
| int shmobile_smp_scu_boot_secondary(unsigned int cpu, struct task_struct *idle) |
| -- |
| 1.8.5.rc3 |
| |