Skip to contentSkip to conversation

ARM: mach-shmobile: r8a7779 SMP support

PATCH In review Magnus Damm 2 participants 4 messages Dec 22, 2011 – Jan 10, 2012

Subsystems (4)
lore
Share & tools
lore

Magnus Damm

author maintainer
#0 lore raw

PATCH 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(u
 
 	if (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 in
 	if (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

author maintainer
#1 lore raw

PATCH 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(u
 
 	if (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 in
 	if (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

#2 lore raw

Re: [PATCH] ARM: mach-shmobile: r8a7779 SMP support V2

In reply to Magnus Damm
Quoted 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.

---

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).

author maintainer
#3 lore raw

PATCH 1/1 ARM: mach-shmobile: r8a7779 SMP support V3

In reply to Magnus Damm

From: 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(u
 
 	if (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 in
 	if (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