ARM: mach-shmobile: r8a7779 SMP support
Magnus Damm
maintainerPATCH 1/1 ARM: mach-shmobile: r8a7779 SMP support
From: Magnus Damm <[email protected]>
This patch ties in the r8a7779 power domain code together with SMP glue code to add SMP support. The SMP code allows us to control the power domains via CPU hotplug, but this feature is not fully implemented yet. At this point the kernel boots with the 4 Cortex-A9 cores in SMP mode.
---
Depends on the r8a7779 base plus the power domain code:
[PATCH] ARM: mach-shmobile: r8a7779 power domain support
arch/arm/mach-shmobile/Makefile | 1 arch/arm/mach-shmobile/include/mach/common.h | 5 arch/arm/mach-shmobile/include/mach/r8a7779.h | 3 arch/arm/mach-shmobile/platsmp.c | 13 ++ arch/arm/mach-shmobile/pm-r8a7779.c | 30 ++++- arch/arm/mach-shmobile/smp-r8a7779.c | 131 +++++++++++++++++++++++++ 6 files changed, 175 insertions(+), 8 deletions(-)
arch/arm/mach-shmobile/Makefile +1 -0
@@ -17,6 +17,7 @@ smp-y := platsmp.o headsmp.o smp-$(CONFIG_HOTPLUG_CPU) += hotplug.o smp-$(CONFIG_LOCAL_TIMERS) += localtimer.o smp-$(CONFIG_ARCH_SH73A0) += smp-sh73a0.o +smp-$(CONFIG_ARCH_R8A7779) += smp-r8a7779.o # Pinmux setup pfc-y :--- 0022/arch/arm/mach-shmobile/include/mach/common.h
+++ work/arch/arm/mach-shmobile/include/mach/common.h 2011-12-22 16:49:45.000000000 +0900
@@ -60,4 +60,9 @@ extern void r8a7779_clock_init(void);
extern void r8a7779_pinmux_init(void);
extern void r8a7779_pm_init(void);
+extern unsigned int r8a7779_get_core_count(void); +extern void r8a7779_secondary_init(unsigned int cpu); +extern int r8a7779_boot_secondary(unsigned int cpu); +extern void r8a7779_smp_prepare_cpus(void); +
#endif /* __ARCH_MACH_COMMON_H */
arch/arm/mach-shmobile/include/mach/r8a7779.h +3 -0
@@ -343,6 +343,9 @@ static inline struct r8a7779_pm_ch *to_r return &container_of(d, struct r8a7779_pm_domain, genpd)->ch; } +extern int r8a7779_sysc_power_down (struct r8a7779_pm_ch *r8a7779_ch); +extern int r8a7779_sysc_power_up (struct r8a7779_pm_ch *r8a7779_ch); +#ifdef CONFIG_PM extern struct r8a7779_pm_domain r8a7779_sh4a;extern struct r8a7779_pm_domain r8a7779_sgx;
arch/arm/mach-shmobile/platsmp.c +13 -0
@@ -22,12 +22,16 @@#include <mach/common.h> #define is_sh73a0 () (machine_is_ag5evm() || machine_is_kota2()) +#define is_r8a7779 () machine_is_marzen()static unsigned int __init shmobile_smp_get_core_count (void ) {if (is_sh73a0 ())return sh73a0_get_core_count (); +if (is_r8a7779 ()) +return r8a7779_get_core_count (); +return 1 ; }
@@ -35,6 +39,9 @@ static void __init shmobile_smp_prepare_ {if (is_sh73a0 ())sh73a0_smp_prepare_cpus (); + +if (is_r8a7779 ()) +r8a7779_smp_prepare_cpus (); }void __cpuinit platform_secondary_init (unsigned int cpu)
@@ -43,6 +50,9 @@ void __cpuinit platform_secondary_init(uif (is_sh73a0 ())sh73a0_secondary_init (cpu); + +if (is_r8a7779 ()) +r8a7779_secondary_init (cpu); }int __cpuinit boot_secondary (unsigned int cpu,struct task_struct *idle)
@@ -50,6 +60,9 @@ int __cpuinit boot_secondary(unsigned inif (is_sh73a0 ())return sh73a0_boot_secondary (cpu); +if (is_r8a7779 ()) +return r8a7779_boot_secondary (cpu); +return -ENOSYS ; }
arch/arm/mach-shmobile/pm-r8a7779.c +154 -9
207 lines not on this page · raw message
Magnus Damm
maintainerPATCH 1/1 ARM: mach-shmobile: r8a7779 SMP support V2
From: Magnus Damm <[email protected]>
This patch contains r8a7779 SMP support V2 - now including CPU hotplug offine and online support. The r8a7779 power domain code is tied together with SMP glue code which allows us to control the power domains via CPU hotplug.
At this point the kernel boots with the 4 Cortex-A9 cores in SMP mode and all CPU cores except CPU0 can be hotplugged.
---
Depends on the r8a7779 base plus the power domain code:
[PATCH] ARM: mach-shmobile: r8a7779 power domain support
Also needs the following SH-Mobile SMP / CPU hotplug changes:
[PATCH] ARM: mach-shmobile: Fix headsmp.S code to use CPUINIT [PATCH] ARM: mach-shmobile: Allow SoC specific CPU kill code [PATCH] ARM: mach-shmobile: Flush caches in platform_cpu_die()
arch/arm/mach-shmobile/Makefile | 1 arch/arm/mach-shmobile/include/mach/common.h | 6 arch/arm/mach-shmobile/include/mach/r8a7779.h | 3 arch/arm/mach-shmobile/platsmp.c | 16 ++ arch/arm/mach-shmobile/pm-r8a7779.c | 30 +++- arch/arm/mach-shmobile/smp-r8a7779.c | 153 +++++++++++++++++++++++++ 6 files changed, 201 insertions(+), 8 deletions(-)
arch/arm/mach-shmobile/Makefile +1 -0
@@ -17,6 +17,7 @@ smp-y := platsmp.o headsmp.o smp-$(CONFIG_HOTPLUG_CPU) += hotplug.o smp-$(CONFIG_LOCAL_TIMERS) += localtimer.o smp-$(CONFIG_ARCH_SH73A0) += smp-sh73a0.o +smp-$(CONFIG_ARCH_R8A7779) += smp-r8a7779.o # Pinmux setup pfc-y :--- 0024/arch/arm/mach-shmobile/include/mach/common.h
+++ work/arch/arm/mach-shmobile/include/mach/common.h 2011-12-28 14:54:31.000000000 +0900
@@ -61,4 +61,10 @@ extern void r8a7779_clock_init(void);
extern void r8a7779_pinmux_init(void);
extern void r8a7779_pm_init(void);
+extern unsigned int r8a7779_get_core_count(void); +extern int r8a7779_platform_cpu_kill(unsigned int cpu); +extern void r8a7779_secondary_init(unsigned int cpu); +extern int r8a7779_boot_secondary(unsigned int cpu); +extern void r8a7779_smp_prepare_cpus(void);
+
#endif /* __ARCH_MACH_COMMON_H */
arch/arm/mach-shmobile/include/mach/r8a7779.h +3 -0
@@ -343,6 +343,9 @@ static inline struct r8a7779_pm_ch *to_r return &container_of(d, struct r8a7779_pm_domain, genpd)->ch; } +extern int r8a7779_sysc_power_down (struct r8a7779_pm_ch *r8a7779_ch); +extern int r8a7779_sysc_power_up (struct r8a7779_pm_ch *r8a7779_ch); +#ifdef CONFIG_PM extern struct r8a7779_pm_domain r8a7779_sh4a;extern struct r8a7779_pm_domain r8a7779_sgx;
arch/arm/mach-shmobile/platsmp.c +16 -0
@@ -22,12 +22,16 @@#include <mach/common.h> #define is_sh73a0 () (machine_is_ag5evm() || machine_is_kota2()) +#define is_r8a7779 () machine_is_marzen()static unsigned int __init shmobile_smp_get_core_count (void ) {if (is_sh73a0 ())return sh73a0_get_core_count (); +if (is_r8a7779 ()) +return r8a7779_get_core_count (); +return 1 ; }
@@ -35,10 +39,16 @@ static void __init shmobile_smp_prepare_ {if (is_sh73a0 ())sh73a0_smp_prepare_cpus (); + +if (is_r8a7779 ()) +r8a7779_smp_prepare_cpus (); }int shmobile_platform_cpu_kill (unsigned int cpu) { +if (is_r8a7779 ()) +return r8a7779_platform_cpu_kill (cpu); +return 1 ; }
@@ -48,6 +58,9 @@ void __cpuinit platform_secondary_init(uif (is_sh73a0 ())sh73a0_secondary_init (cpu); + +if (is_r8a7779 ()) +r8a7779_secondary_init (cpu); }int __cpuinit boot_secondary (unsigned int cpu,struct task_struct *idle)
@@ -55,6 +68,9 @@ int __cpuinit boot_secondary(unsigned inif (is_sh73a0 ())return sh73a0_boot_secondary (cpu); +if (is_r8a7779 ()) +return r8a7779_boot_secondary (cpu); +return -ENOSYS ; }
arch/arm/mach-shmobile/pm-r8a7779.c +176 -9
229 lines not on this page · raw message
Re: [PATCH] ARM: mach-shmobile: r8a7779 SMP support V2
In reply to Magnus DammQuoted 7 lines · Magnus Damm
From: Magnus Damm <[email protected]>
This patch contains r8a7779 SMP support V2 - now including CPU hotplug offine and online support. The r8a7779 power domain code is tied together with SMP glue code which allows us to control the power domains via CPU hotplug.
Quoted 9 lines
At this point the kernel boots with the 4 Cortex-A9 cores in SMP mode and all CPU cores except CPU0 can be hotplugged.
Signed-off-by Magnus Damm <[email protected]>---
Depends on the r8a7779 base plus the power domain code:
[PATCH] ARM: mach-shmobile: r8a7779 power domain support
Not sure how you want to handle this. I can take the power domain code since it's the initial merge, or I can just push out the base stuff I have now, Rafael can merge the power domain stuff on top, and then we can add the SMP support at a later stage. There won't be a lot of time for multiple merges this merge window, though.
In any event, I'm not entirely pleased with the direction the platsmp code is going. Either layer in some function pointers that the CPU code can set up, add some weak symbols, or move the small bit of common code somewhere actually common rather than trying to shoe-horn everything in and then relying on this absurd is_xxx() check (which in itself is nothing but glorified ifdef abuse).
Magnus Damm
maintainerPATCH 1/1 ARM: mach-shmobile: r8a7779 SMP support V3
In reply to Magnus DammFrom: Magnus Damm <[email protected]>
This patch contains r8a7779 SMP support V3 - now including CPU hotplug offine and online support. The r8a7779 power domain code is tied together with SMP glue code which allows us to control the power domains via CPU hotplug.
At this point the kernel boots with the 4 Cortex-A9 cores in SMP mode and all CPU cores except CPU0 can be hotplugged.
The code in platsmp.c is quite far from pretty, but it is kept like that intentionally to avoid creating layers of code that will go away in the near future anyway. The code needs to be updated when some per-SoC handling code will be added to the ARM architecture, see the following patch for more information:
"[RFC PATCH 0/3] Per SoC descriptor"
---
Built on top of linux-sh git rmobile/marzen branch with the latest r8a7779 power domain code applied:
"ARM: mach-shmobile: r8a7779 power domain support V2"
Changes since V2:
- updated commit message
arch/arm/mach-shmobile/Makefile | 1 arch/arm/mach-shmobile/include/mach/common.h | 6 arch/arm/mach-shmobile/include/mach/r8a7779.h | 3 arch/arm/mach-shmobile/platsmp.c | 16 ++ arch/arm/mach-shmobile/pm-r8a7779.c | 30 +++- arch/arm/mach-shmobile/smp-r8a7779.c | 153 +++++++++++++++++++++++++ 6 files changed, 201 insertions(+), 8 deletions(-)
arch/arm/mach-shmobile/Makefile +1 -0
@@ -17,6 +17,7 @@ smp-y := platsmp.o headsmp.o smp-$(CONFIG_HOTPLUG_CPU) += hotplug.o smp-$(CONFIG_LOCAL_TIMERS) += localtimer.o smp-$(CONFIG_ARCH_SH73A0) += smp-sh73a0.o +smp-$(CONFIG_ARCH_R8A7779) += smp-r8a7779.o # Pinmux setup pfc-y :--- 0024/arch/arm/mach-shmobile/include/mach/common.h
+++ work/arch/arm/mach-shmobile/include/mach/common.h 2011-12-28 14:54:31.000000000 +0900
@@ -61,4 +61,10 @@ extern void r8a7779_clock_init(void);
extern void r8a7779_pinmux_init(void);
extern void r8a7779_pm_init(void);
+extern unsigned int r8a7779_get_core_count(void); +extern int r8a7779_platform_cpu_kill(unsigned int cpu); +extern void r8a7779_secondary_init(unsigned int cpu); +extern int r8a7779_boot_secondary(unsigned int cpu); +extern void r8a7779_smp_prepare_cpus(void);
+
#endif /* __ARCH_MACH_COMMON_H */
arch/arm/mach-shmobile/include/mach/r8a7779.h +3 -0
@@ -343,6 +343,9 @@ static inline struct r8a7779_pm_ch *to_r return &container_of(d, struct r8a7779_pm_domain, genpd)->ch; } +extern int r8a7779_sysc_power_down (struct r8a7779_pm_ch *r8a7779_ch); +extern int r8a7779_sysc_power_up (struct r8a7779_pm_ch *r8a7779_ch); +#ifdef CONFIG_PM extern struct r8a7779_pm_domain r8a7779_sh4a;extern struct r8a7779_pm_domain r8a7779_sgx;
arch/arm/mach-shmobile/platsmp.c +16 -0
@@ -22,12 +22,16 @@#include <mach/common.h> #define is_sh73a0 () (machine_is_ag5evm() || machine_is_kota2()) +#define is_r8a7779 () machine_is_marzen()static unsigned int __init shmobile_smp_get_core_count (void ) {if (is_sh73a0 ())return sh73a0_get_core_count (); +if (is_r8a7779 ()) +return r8a7779_get_core_count (); +return 1 ; }
@@ -35,10 +39,16 @@ static void __init shmobile_smp_prepare_ {if (is_sh73a0 ())sh73a0_smp_prepare_cpus (); + +if (is_r8a7779 ()) +r8a7779_smp_prepare_cpus (); }int shmobile_platform_cpu_kill (unsigned int cpu) { +if (is_r8a7779 ()) +return r8a7779_platform_cpu_kill (cpu); +return 1 ; }
@@ -48,6 +58,9 @@ void __cpuinit platform_secondary_init(uif (is_sh73a0 ())sh73a0_secondary_init (cpu); + +if (is_r8a7779 ()) +r8a7779_secondary_init (cpu); }int __cpuinit boot_secondary (unsigned int cpu,struct task_struct *idle)
@@ -55,6 +68,9 @@ int __cpuinit boot_secondary(unsigned inif (is_sh73a0 ())return sh73a0_boot_secondary (cpu); +if (is_r8a7779 ()) +return r8a7779_boot_secondary (cpu); +return -ENOSYS ; }
arch/arm/mach-shmobile/pm-r8a7779.c +176 -9
229 lines not on this page · raw message