Skip to contentSkip to conversation

ARM: shmobile: Initial r8a73a4 APMU SMP code

PATCH New Magnus Damm 5 participants 14 messages Aug 7, 2013 – Aug 29, 2013

Subsystems (5)
lore
Share & tools
lore

Magnus Damm

author maintainer
#0 lore raw

cover ARM: shmobile: Initial r8a73a4 APMU SMP code

ARM: shmobile: Initial r8a73a4 APMU SMP code

[PATCH 01/02] ARM: shmobile: Add r8a73a4 SMP support using APMU code [PATCH 02/02] ARM: shmobile: Add r8a73a4 CA15 CPU cores and APMU as DTS

This series adds SMP support to r8a73a4 using the APMU code. With these patches applied r8a73a4 CA15 support for SMP boot and CPU Hotplug is known to be working.

---

Written against renesas.git renesas-devel-20130806v4 and [PATCH 00/05] ARM: shmobile: Yet another SMP series [PATCH 00/02] ARM: shmobile: Rename to r8a73a4/r8a7790_init_early() [PATCH] ARM: shmobile: Shared APMU SMP support code

 arch/arm/boot/dts/r8a73a4.dtsi                |   27 +++++++++
 arch/arm/mach-shmobile/Makefile               |    1 
 arch/arm/mach-shmobile/include/mach/r8a73a4.h |    1 
 arch/arm/mach-shmobile/setup-r8a73a4.c        |    3 +
 arch/arm/mach-shmobile/smp-r8a73a4.c          |   75 +++++++++++++++++++++++++
 5 files changed, 107 insertions(+)
author maintainer
#1 lore raw

PATCH 1/2 ARM: shmobile: Add r8a73a4 SMP support using APMU code

From: Magnus Damm <[email protected]>

Add r8a73a4 SMP support using the shared APMU code. To enable SMP the r8a73a4 specific DTS needs to be updated to include CPU cores, and this is happening in a separate patch.

---

 arch/arm/mach-shmobile/Makefile               |    1 
 arch/arm/mach-shmobile/include/mach/r8a73a4.h |    1 
 arch/arm/mach-shmobile/setup-r8a73a4.c        |    3 +
 arch/arm/mach-shmobile/smp-r8a73a4.c          |   75 +++++++++++++++++++++++++
 4 files changed, 80 insertions(+)
arch/arm/mach-shmobile/Makefile +1 -0
@@ -33,6 +33,7 @@ endif
 # SMP objects
 smp-y				:= platsmp.o headsmp.o
 smp-$(CONFIG_ARCH_SH73A0)	+= smp-sh73a0.o headsmp-scu.o platsmp-scu.o
+smp-$(CONFIG_ARCH_R8A73A4)	+= smp-r8a73a4.o platsmp-apmu.o
 smp-$(CONFIG_ARCH_R8A7779)	+= smp-r8a7779.o headsmp-scu.o platsmp-scu.o
 smp-$(CONFIG_ARCH_EMEV2)	+= smp-emev2.o headsmp-scu.o platsmp-scu.o
 
arch/arm/mach-shmobile/include/mach/r8a73a4.h +1 -0
@@ -6,5 +6,6 @@ void r8a73a4_add_dt_devices(void);
 void r8a73a4_clock_init(void);
 void r8a73a4_pinmux_init(void);
 void r8a73a4_init_early(void);
+extern struct smp_operations r8a73a4_smp_ops;
 
 #endif /* __ASM_R8A73A4_H__ */
arch/arm/mach-shmobile/setup-r8a73a4.c +3 -0
@@ -212,6 +212,9 @@ void __init r8a73a4_init_early(void)
 #ifndef CONFIG_ARM_ARCH_TIMER
 	shmobile_setup_delay(1500, 2, 4); /* Cortex-A15 @ 1500MHz */
 #endif
+#ifdef CONFIG_SMP
+	smp_set_ops(&r8a73a4_smp_ops);
+#endif
 }
 
 #ifdef CONFIG_USE_OF
arch/arm/mach-shmobile/smp-r8a73a4.c new file +75 -0

75 lines not on this page · raw message

author maintainer
#2 lore raw

PATCH 1/2 ARM: shmobile: Add r8a73a4 SMP support using APMU code

Hi Arnd and Olof,

Quoted 37 lines · Magnus Damm

From: Magnus Damm <[email protected]>

Add r8a73a4 SMP support using the shared APMU code. To enable SMP the r8a73a4 specific DTS needs to be updated to include CPU cores, and this is happening in a separate patch.

---

 arch/arm/mach-shmobile/Makefile               |    1
 arch/arm/mach-shmobile/include/mach/r8a73a4.h |    1
 arch/arm/mach-shmobile/setup-r8a73a4.c        |    3 +
 arch/arm/mach-shmobile/smp-r8a73a4.c          |   75 +++++++++++++++++++++++++
 4 files changed, 80 insertions(+)
arch/arm/mach-shmobile/Makefile 2013-08-07 20:07:31.000000000 +0900 renamed from arch/arm/mach-shmobile/Makefile +1 -0
@@ -33,6 +33,7 @@ endif
 # SMP objects
 smp-y                          := platsmp.o headsmp.o
 smp-$(CONFIG_ARCH_SH73A0)      += smp-sh73a0.o headsmp-scu.o platsmp-scu.o
+smp-$(CONFIG_ARCH_R8A73A4)     += smp-r8a73a4.o platsmp-apmu.o
 smp-$(CONFIG_ARCH_R8A7779)     += smp-r8a7779.o headsmp-scu.o platsmp-scu.o
 smp-$(CONFIG_ARCH_EMEV2)       += smp-emev2.o headsmp-scu.o platsmp-scu.o
 
arch/arm/mach-shmobile/include/mach/r8a73a4.h 2013-08-07 20:08:02.000000000 +0900 renamed from arch/arm/mach-shmobile/include/mach/r8a73a4.h +1 -0
@@ -6,5 +6,6 @@ void r8a73a4_add_dt_devices(void);
 void r8a73a4_clock_init(void);
 void r8a73a4_pinmux_init(void);
 void r8a73a4_init_early(void);
+extern struct smp_operations r8a73a4_smp_ops;
 
 #endif /* __ASM_R8A73A4_H__ */

arch/arm/mach-shmobile/setup-r8a73a4.c 2013-08-07 20:07:48.000000000 +0900 void __init r8a73a4_init_early(void) · line 218

Quoted 7 lines
arch/arm/mach-shmobile/setup-r8a73a4.c 2013-08-07 20:07:48.000000000 +0900 renamed from arch/arm/mach-shmobile/setup-r8a73a4.c +3 -0
@@ -212,6 +212,9 @@ void __init r8a73a4_init_early(void)
 #ifndef CONFIG_ARM_ARCH_TIMER
        shmobile_setup_delay(1500, 2, 4); /* Cortex-A15 @ 1500MHz */
 #endif
+#ifdef CONFIG_SMP
+       smp_set_ops(&r8a73a4_smp_ops);
+#endif
 }

Arnd or Olof, may I ask for your advice here?

I think it's quite nice to use smp_set_ops() in ->init_early() to install the per-SoC SMP operations. I prefer that over using the smp_ops directly in the per-board DT_MACHINE_START. Which way do you prefer?

Thanks,

/ magnus

#3 lore raw

PATCH 1/2 ARM: shmobile: Add r8a73a4 SMP support using APMU code

Quoted 50 lines · Magnus Damm

Hi Arnd and Olof,

Quoted 37 lines · Magnus Damm

From: Magnus Damm <[email protected]>

Add r8a73a4 SMP support using the shared APMU code. To enable SMP the r8a73a4 specific DTS needs to be updated to include CPU cores, and this is happening in a separate patch.

---

 arch/arm/mach-shmobile/Makefile               |    1
 arch/arm/mach-shmobile/include/mach/r8a73a4.h |    1
 arch/arm/mach-shmobile/setup-r8a73a4.c        |    3 +
 arch/arm/mach-shmobile/smp-r8a73a4.c          |   75 +++++++++++++++++++++++++
 4 files changed, 80 insertions(+)
arch/arm/mach-shmobile/Makefile 2013-08-07 20:07:31.000000000 +0900 renamed from arch/arm/mach-shmobile/Makefile +1 -0
@@ -33,6 +33,7 @@ endif
 # SMP objects
 smp-y                          := platsmp.o headsmp.o
 smp-$(CONFIG_ARCH_SH73A0)      += smp-sh73a0.o headsmp-scu.o platsmp-scu.o
+smp-$(CONFIG_ARCH_R8A73A4)     += smp-r8a73a4.o platsmp-apmu.o
 smp-$(CONFIG_ARCH_R8A7779)     += smp-r8a7779.o headsmp-scu.o platsmp-scu.o
 smp-$(CONFIG_ARCH_EMEV2)       += smp-emev2.o headsmp-scu.o platsmp-scu.o
 
arch/arm/mach-shmobile/include/mach/r8a73a4.h 2013-08-07 20:08:02.000000000 +0900 renamed from arch/arm/mach-shmobile/include/mach/r8a73a4.h +1 -0
@@ -6,5 +6,6 @@ void r8a73a4_add_dt_devices(void);
 void r8a73a4_clock_init(void);
 void r8a73a4_pinmux_init(void);
 void r8a73a4_init_early(void);
+extern struct smp_operations r8a73a4_smp_ops;
 
 #endif /* __ASM_R8A73A4_H__ */

arch/arm/mach-shmobile/setup-r8a73a4.c 2013-08-07 20:07:48.000000000 +0900 void __init r8a73a4_init_early(void) · line 218

Quoted 7 lines
arch/arm/mach-shmobile/setup-r8a73a4.c 2013-08-07 20:07:48.000000000 +0900 renamed from arch/arm/mach-shmobile/setup-r8a73a4.c +3 -0
@@ -212,6 +212,9 @@ void __init r8a73a4_init_early(void)
 #ifndef CONFIG_ARM_ARCH_TIMER
        shmobile_setup_delay(1500, 2, 4); /* Cortex-A15 @ 1500MHz */
 #endif
+#ifdef CONFIG_SMP
+       smp_set_ops(&r8a73a4_smp_ops);
+#endif
 }

Arnd or Olof, may I ask for your advice here?

Quoted 4 lines

I think it's quite nice to use smp_set_ops() in ->init_early() to install the per-SoC SMP operations. I prefer that over using the smp_ops directly in the per-board DT_MACHINE_START. Which way do you prefer?

Olof, Arnd, Ping.

#4 lore raw

PATCH 1/2 ARM: shmobile: Add r8a73a4 SMP support using APMU code

[+khilman]

Hi,

Quoted 51 lines · Simon Horman
Quoted 50 lines · Magnus Damm

Hi Arnd and Olof,

Quoted 37 lines · Magnus Damm

From: Magnus Damm <[email protected]>

Add r8a73a4 SMP support using the shared APMU code. To enable SMP the r8a73a4 specific DTS needs to be updated to include CPU cores, and this is happening in a separate patch.

---

 arch/arm/mach-shmobile/Makefile               |    1
 arch/arm/mach-shmobile/include/mach/r8a73a4.h |    1
 arch/arm/mach-shmobile/setup-r8a73a4.c        |    3 +
 arch/arm/mach-shmobile/smp-r8a73a4.c          |   75 +++++++++++++++++++++++++
 4 files changed, 80 insertions(+)
arch/arm/mach-shmobile/Makefile 2013-08-07 20:07:31.000000000 +0900 renamed from arch/arm/mach-shmobile/Makefile +1 -0
@@ -33,6 +33,7 @@ endif
 # SMP objects
 smp-y                          := platsmp.o headsmp.o
 smp-$(CONFIG_ARCH_SH73A0)      += smp-sh73a0.o headsmp-scu.o platsmp-scu.o
+smp-$(CONFIG_ARCH_R8A73A4)     += smp-r8a73a4.o platsmp-apmu.o
 smp-$(CONFIG_ARCH_R8A7779)     += smp-r8a7779.o headsmp-scu.o platsmp-scu.o
 smp-$(CONFIG_ARCH_EMEV2)       += smp-emev2.o headsmp-scu.o platsmp-scu.o
 
arch/arm/mach-shmobile/include/mach/r8a73a4.h 2013-08-07 20:08:02.000000000 +0900 renamed from arch/arm/mach-shmobile/include/mach/r8a73a4.h +1 -0
@@ -6,5 +6,6 @@ void r8a73a4_add_dt_devices(void);
 void r8a73a4_clock_init(void);
 void r8a73a4_pinmux_init(void);
 void r8a73a4_init_early(void);
+extern struct smp_operations r8a73a4_smp_ops;
 
 #endif /* __ASM_R8A73A4_H__ */

arch/arm/mach-shmobile/setup-r8a73a4.c 2013-08-07 20:07:48.000000000 +0900 void __init r8a73a4_init_early(void) · line 218

Quoted 7 lines
arch/arm/mach-shmobile/setup-r8a73a4.c 2013-08-07 20:07:48.000000000 +0900 renamed from arch/arm/mach-shmobile/setup-r8a73a4.c +3 -0
@@ -212,6 +212,9 @@ void __init r8a73a4_init_early(void)
 #ifndef CONFIG_ARM_ARCH_TIMER
        shmobile_setup_delay(1500, 2, 4); /* Cortex-A15 @ 1500MHz */
 #endif
+#ifdef CONFIG_SMP
+       smp_set_ops(&r8a73a4_smp_ops);
+#endif
 }

Arnd or Olof, may I ask for your advice here?

Quoted 6 lines
Quoted 4 lines

I think it's quite nice to use smp_set_ops() in ->init_early() to install the per-SoC SMP operations. I prefer that over using the smp_ops directly in the per-board DT_MACHINE_START. Which way do you prefer?

Olof, Arnd, Ping.

Sorry, missed the original question when it was posted.

I guess I don't see the benefit of doing it in code vs smp_init? You already have a DT_MACHINE section for r8a73a4 in this case.

If you use .smp_init = smp_init_ops(r8a73a4_smp_ops) then there's no ifdef needed down in the DT_MACHINE section either.

-Olof

#5 lore raw

PATCH 1/2 ARM: shmobile: Add r8a73a4 SMP support using APMU code

Quoted 64 lines · Olof Johansson

[+khilman]

Hi,

Quoted 51 lines · Simon Horman
Quoted 50 lines · Magnus Damm

Hi Arnd and Olof,

Quoted 37 lines · Magnus Damm

From: Magnus Damm <[email protected]>

Add r8a73a4 SMP support using the shared APMU code. To enable SMP the r8a73a4 specific DTS needs to be updated to include CPU cores, and this is happening in a separate patch.

---

 arch/arm/mach-shmobile/Makefile               |    1
 arch/arm/mach-shmobile/include/mach/r8a73a4.h |    1
 arch/arm/mach-shmobile/setup-r8a73a4.c        |    3 +
 arch/arm/mach-shmobile/smp-r8a73a4.c          |   75 +++++++++++++++++++++++++
 4 files changed, 80 insertions(+)
arch/arm/mach-shmobile/Makefile 2013-08-07 20:07:31.000000000 +0900 renamed from arch/arm/mach-shmobile/Makefile +1 -0
@@ -33,6 +33,7 @@ endif
 # SMP objects
 smp-y                          := platsmp.o headsmp.o
 smp-$(CONFIG_ARCH_SH73A0)      += smp-sh73a0.o headsmp-scu.o platsmp-scu.o
+smp-$(CONFIG_ARCH_R8A73A4)     += smp-r8a73a4.o platsmp-apmu.o
 smp-$(CONFIG_ARCH_R8A7779)     += smp-r8a7779.o headsmp-scu.o platsmp-scu.o
 smp-$(CONFIG_ARCH_EMEV2)       += smp-emev2.o headsmp-scu.o platsmp-scu.o
 
arch/arm/mach-shmobile/include/mach/r8a73a4.h 2013-08-07 20:08:02.000000000 +0900 renamed from arch/arm/mach-shmobile/include/mach/r8a73a4.h +1 -0
@@ -6,5 +6,6 @@ void r8a73a4_add_dt_devices(void);
 void r8a73a4_clock_init(void);
 void r8a73a4_pinmux_init(void);
 void r8a73a4_init_early(void);
+extern struct smp_operations r8a73a4_smp_ops;
 
 #endif /* __ASM_R8A73A4_H__ */

arch/arm/mach-shmobile/setup-r8a73a4.c 2013-08-07 20:07:48.000000000 +0900 void __init r8a73a4_init_early(void) · line 218

Quoted 7 lines
arch/arm/mach-shmobile/setup-r8a73a4.c 2013-08-07 20:07:48.000000000 +0900 renamed from arch/arm/mach-shmobile/setup-r8a73a4.c +3 -0
@@ -212,6 +212,9 @@ void __init r8a73a4_init_early(void)
 #ifndef CONFIG_ARM_ARCH_TIMER
        shmobile_setup_delay(1500, 2, 4); /* Cortex-A15 @ 1500MHz */
 #endif
+#ifdef CONFIG_SMP
+       smp_set_ops(&r8a73a4_smp_ops);
+#endif
 }

Arnd or Olof, may I ask for your advice here?

Quoted 6 lines
Quoted 4 lines

I think it's quite nice to use smp_set_ops() in ->init_early() to install the per-SoC SMP operations. I prefer that over using the smp_ops directly in the per-board DT_MACHINE_START. Which way do you prefer?

Olof, Arnd, Ping.

Quoted 7 lines

Sorry, missed the original question when it was posted.

I guess I don't see the benefit of doing it in code vs smp_init? You already have a DT_MACHINE section for r8a73a4 in this case.

If you use .smp_init = smp_init_ops(r8a73a4_smp_ops) then there's no ifdef needed down in the DT_MACHINE section either.

Magnus, would you care to respin this series and the corresponding r8a7790 series accordingly?

author maintainer
#6 lore raw

PATCH 1/2 ARM: shmobile: Add r8a73a4 SMP support using APMU code

In reply to Olof Johansson

Hi Olof,

Quoted 61 lines · Olof Johansson

[+khilman]

Hi,

Quoted 56 lines · Simon Horman
Quoted 54 lines · Magnus Damm

Hi Arnd and Olof,

Quoted 37 lines · Magnus Damm

From: Magnus Damm <[email protected]>

Add r8a73a4 SMP support using the shared APMU code. To enable SMP the r8a73a4 specific DTS needs to be updated to include CPU cores, and this is happening in a separate patch.

---

 arch/arm/mach-shmobile/Makefile               |    1
 arch/arm/mach-shmobile/include/mach/r8a73a4.h |    1
 arch/arm/mach-shmobile/setup-r8a73a4.c        |    3 +
 arch/arm/mach-shmobile/smp-r8a73a4.c          |   75 +++++++++++++++++++++++++
 4 files changed, 80 insertions(+)
arch/arm/mach-shmobile/Makefile 2013-08-07 20:07:31.000000000 +0900 renamed from arch/arm/mach-shmobile/Makefile +1 -0
@@ -33,6 +33,7 @@ endif
 # SMP objects
 smp-y                          := platsmp.o headsmp.o
 smp-$(CONFIG_ARCH_SH73A0)      += smp-sh73a0.o headsmp-scu.o platsmp-scu.o
+smp-$(CONFIG_ARCH_R8A73A4)     += smp-r8a73a4.o platsmp-apmu.o
 smp-$(CONFIG_ARCH_R8A7779)     += smp-r8a7779.o headsmp-scu.o platsmp-scu.o
 smp-$(CONFIG_ARCH_EMEV2)       += smp-emev2.o headsmp-scu.o platsmp-scu.o
 
arch/arm/mach-shmobile/include/mach/r8a73a4.h 2013-08-07 20:08:02.000000000 +0900 renamed from arch/arm/mach-shmobile/include/mach/r8a73a4.h +1 -0
@@ -6,5 +6,6 @@ void r8a73a4_add_dt_devices(void);
 void r8a73a4_clock_init(void);
 void r8a73a4_pinmux_init(void);
 void r8a73a4_init_early(void);
+extern struct smp_operations r8a73a4_smp_ops;
 
 #endif /* __ASM_R8A73A4_H__ */

arch/arm/mach-shmobile/setup-r8a73a4.c 2013-08-07 20:07:48.000000000 +0900 void __init r8a73a4_init_early(void) · line 218

Quoted 7 lines
arch/arm/mach-shmobile/setup-r8a73a4.c 2013-08-07 20:07:48.000000000 +0900 renamed from arch/arm/mach-shmobile/setup-r8a73a4.c +3 -0
@@ -212,6 +212,9 @@ void __init r8a73a4_init_early(void)
 #ifndef CONFIG_ARM_ARCH_TIMER
        shmobile_setup_delay(1500, 2, 4); /* Cortex-A15 @ 1500MHz */
 #endif
+#ifdef CONFIG_SMP
+       smp_set_ops(&r8a73a4_smp_ops);
+#endif
 }

Arnd or Olof, may I ask for your advice here?

I think it's quite nice to use smp_set_ops() in ->init_early() to install the per-SoC SMP operations. I prefer that over using the smp_ops directly in the per-board DT_MACHINE_START. Which way do you prefer?

Quoted 7 lines
Quoted 1 line

Olof, Arnd, Ping.

Sorry, missed the original question when it was posted.

I guess I don't see the benefit of doing it in code vs smp_init? You already have a DT_MACHINE section for r8a73a4 in this case.

The benefit would be to reduce the number of callbacks used in DT_MACHINE. Today on mach-shmobile we are already using ->init_early() for delay and timer setup, and if we also can invoke smp_set_ops() there then we would have per-SoC SMP support hooked in without having to use either ->smp or ->smp_init() for every board.

As you may have seen we have quite a few DT_MACHINE entires in mach-shmobile, and I'd like to keep them as small and consistent as ever possible. I can't really see how a board specific DT_MACHINE has anything to do with state of SMP on a particular SoC, so for any given board I'd prefer to keep the board code without any SMP dependencies and simply use ->init_early() to setup delay, timers and SMP.

Quoted 2 lines

If you use .smp_init = smp_init_ops(r8a73a4_smp_ops) then there's no ifdef needed down in the DT_MACHINE section either.

It's nice to not use the #ifdefs, I agree. I'd like to have a dummy stub for smp_set_ops() too in the case of CONFIG_SMP=n, that would make the above code a bit prettier.

I hope this clarifies the reasons behind my question!

If I understand you correctly then I guess you prefer keeping the code as is with DT_MACHINE ->smp = smp_ops(foo) over using smp_set_ops() in ->init_early()?

Cheers,

/ magnus

#7 lore raw

PATCH 1/2 ARM: shmobile: Add r8a73a4 SMP support using APMU code

Quoted 92 lines · Magnus Damm

Hi Olof,

Quoted 61 lines · Olof Johansson

[+khilman]

Hi,

Quoted 56 lines · Simon Horman
Quoted 54 lines · Magnus Damm

Hi Arnd and Olof,

Quoted 37 lines · Magnus Damm

From: Magnus Damm <[email protected]>

Add r8a73a4 SMP support using the shared APMU code. To enable SMP the r8a73a4 specific DTS needs to be updated to include CPU cores, and this is happening in a separate patch.

---

 arch/arm/mach-shmobile/Makefile               |    1
 arch/arm/mach-shmobile/include/mach/r8a73a4.h |    1
 arch/arm/mach-shmobile/setup-r8a73a4.c        |    3 +
 arch/arm/mach-shmobile/smp-r8a73a4.c          |   75 +++++++++++++++++++++++++
 4 files changed, 80 insertions(+)
arch/arm/mach-shmobile/Makefile 2013-08-07 20:07:31.000000000 +0900 renamed from arch/arm/mach-shmobile/Makefile +1 -0
@@ -33,6 +33,7 @@ endif
 # SMP objects
 smp-y                          := platsmp.o headsmp.o
 smp-$(CONFIG_ARCH_SH73A0)      += smp-sh73a0.o headsmp-scu.o platsmp-scu.o
+smp-$(CONFIG_ARCH_R8A73A4)     += smp-r8a73a4.o platsmp-apmu.o
 smp-$(CONFIG_ARCH_R8A7779)     += smp-r8a7779.o headsmp-scu.o platsmp-scu.o
 smp-$(CONFIG_ARCH_EMEV2)       += smp-emev2.o headsmp-scu.o platsmp-scu.o
 
arch/arm/mach-shmobile/include/mach/r8a73a4.h 2013-08-07 20:08:02.000000000 +0900 renamed from arch/arm/mach-shmobile/include/mach/r8a73a4.h +1 -0
@@ -6,5 +6,6 @@ void r8a73a4_add_dt_devices(void);
 void r8a73a4_clock_init(void);
 void r8a73a4_pinmux_init(void);
 void r8a73a4_init_early(void);
+extern struct smp_operations r8a73a4_smp_ops;
 
 #endif /* __ASM_R8A73A4_H__ */

arch/arm/mach-shmobile/setup-r8a73a4.c 2013-08-07 20:07:48.000000000 +0900 void __init r8a73a4_init_early(void) · line 218

Quoted 7 lines
arch/arm/mach-shmobile/setup-r8a73a4.c 2013-08-07 20:07:48.000000000 +0900 renamed from arch/arm/mach-shmobile/setup-r8a73a4.c +3 -0
@@ -212,6 +212,9 @@ void __init r8a73a4_init_early(void)
 #ifndef CONFIG_ARM_ARCH_TIMER
        shmobile_setup_delay(1500, 2, 4); /* Cortex-A15 @ 1500MHz */
 #endif
+#ifdef CONFIG_SMP
+       smp_set_ops(&r8a73a4_smp_ops);
+#endif
 }

Arnd or Olof, may I ask for your advice here?

I think it's quite nice to use smp_set_ops() in ->init_early() to install the per-SoC SMP operations. I prefer that over using the smp_ops directly in the per-board DT_MACHINE_START. Which way do you prefer?

Quoted 7 lines
Quoted 1 line

Olof, Arnd, Ping.

Sorry, missed the original question when it was posted.

I guess I don't see the benefit of doing it in code vs smp_init? You already have a DT_MACHINE section for r8a73a4 in this case.

The benefit would be to reduce the number of callbacks used in DT_MACHINE. Today on mach-shmobile we are already using ->init_early() for delay and timer setup, and if we also can invoke smp_set_ops() there then we would have per-SoC SMP support hooked in without having to use either ->smp or ->smp_init() for every board.

As you may have seen we have quite a few DT_MACHINE entires in mach-shmobile, and I'd like to keep them as small and consistent as ever possible. I can't really see how a board specific DT_MACHINE has anything to do with state of SMP on a particular SoC, so for any given board I'd prefer to keep the board code without any SMP dependencies and simply use ->init_early() to setup delay, timers and SMP.

Quoted 2 lines

If you use .smp_init = smp_init_ops(r8a73a4_smp_ops) then there's no ifdef needed down in the DT_MACHINE section either.

It's nice to not use the #ifdefs, I agree. I'd like to have a dummy stub for smp_set_ops() too in the case of CONFIG_SMP=n, that would make the above code a bit prettier.

Quoted 5 lines

I hope this clarifies the reasons behind my question!

If I understand you correctly then I guess you prefer keeping the code as is with DT_MACHINE ->smp = smp_ops(foo) over using smp_set_ops() in ->init_early()?

Yes, that was my initial preference. However, that was based on the assumption that you would keep the current setup with several DT_MACHINE entries.

If you think you will shortly start to distill down and only keep a couple of DT_MACHINE structures (and start sharing them between SoCs), then doing this in code makes sense. However, if that is further out than a release or two then I think doing it in DT_MACHINE makes more sense.

-Olof

author maintainer
#8 lore raw

PATCH 1/2 ARM: shmobile: Add r8a73a4 SMP support using APMU code

Hi Olof,

Quoted 99 lines · Olof Johansson
Quoted 92 lines · Magnus Damm

Hi Olof,

Quoted 61 lines · Olof Johansson

[+khilman]

Hi,

Quoted 56 lines · Simon Horman
Quoted 54 lines · Magnus Damm

Hi Arnd and Olof,

Quoted 37 lines · Magnus Damm

From: Magnus Damm <[email protected]>

Add r8a73a4 SMP support using the shared APMU code. To enable SMP the r8a73a4 specific DTS needs to be updated to include CPU cores, and this is happening in a separate patch.

---

 arch/arm/mach-shmobile/Makefile               |    1
 arch/arm/mach-shmobile/include/mach/r8a73a4.h |    1
 arch/arm/mach-shmobile/setup-r8a73a4.c        |    3 +
 arch/arm/mach-shmobile/smp-r8a73a4.c          |   75 +++++++++++++++++++++++++
 4 files changed, 80 insertions(+)
arch/arm/mach-shmobile/Makefile 2013-08-07 20:07:31.000000000 +0900 renamed from arch/arm/mach-shmobile/Makefile +1 -0
@@ -33,6 +33,7 @@ endif
 # SMP objects
 smp-y                          := platsmp.o headsmp.o
 smp-$(CONFIG_ARCH_SH73A0)      += smp-sh73a0.o headsmp-scu.o platsmp-scu.o
+smp-$(CONFIG_ARCH_R8A73A4)     += smp-r8a73a4.o platsmp-apmu.o
 smp-$(CONFIG_ARCH_R8A7779)     += smp-r8a7779.o headsmp-scu.o platsmp-scu.o
 smp-$(CONFIG_ARCH_EMEV2)       += smp-emev2.o headsmp-scu.o platsmp-scu.o
 
arch/arm/mach-shmobile/include/mach/r8a73a4.h 2013-08-07 20:08:02.000000000 +0900 renamed from arch/arm/mach-shmobile/include/mach/r8a73a4.h +1 -0
@@ -6,5 +6,6 @@ void r8a73a4_add_dt_devices(void);
 void r8a73a4_clock_init(void);
 void r8a73a4_pinmux_init(void);
 void r8a73a4_init_early(void);
+extern struct smp_operations r8a73a4_smp_ops;
 
 #endif /* __ASM_R8A73A4_H__ */

arch/arm/mach-shmobile/setup-r8a73a4.c 2013-08-07 20:07:48.000000000 +0900 void __init r8a73a4_init_early(void) · line 218

Quoted 7 lines
arch/arm/mach-shmobile/setup-r8a73a4.c 2013-08-07 20:07:48.000000000 +0900 renamed from arch/arm/mach-shmobile/setup-r8a73a4.c +3 -0
@@ -212,6 +212,9 @@ void __init r8a73a4_init_early(void)
 #ifndef CONFIG_ARM_ARCH_TIMER
        shmobile_setup_delay(1500, 2, 4); /* Cortex-A15 @ 1500MHz */
 #endif
+#ifdef CONFIG_SMP
+       smp_set_ops(&r8a73a4_smp_ops);
+#endif
 }

Arnd or Olof, may I ask for your advice here?

I think it's quite nice to use smp_set_ops() in ->init_early() to install the per-SoC SMP operations. I prefer that over using the smp_ops directly in the per-board DT_MACHINE_START. Which way do you prefer?

Quoted 7 lines
Quoted 1 line

Olof, Arnd, Ping.

Sorry, missed the original question when it was posted.

I guess I don't see the benefit of doing it in code vs smp_init? You already have a DT_MACHINE section for r8a73a4 in this case.

The benefit would be to reduce the number of callbacks used in DT_MACHINE. Today on mach-shmobile we are already using ->init_early() for delay and timer setup, and if we also can invoke smp_set_ops() there then we would have per-SoC SMP support hooked in without having to use either ->smp or ->smp_init() for every board.

As you may have seen we have quite a few DT_MACHINE entires in mach-shmobile, and I'd like to keep them as small and consistent as ever possible. I can't really see how a board specific DT_MACHINE has anything to do with state of SMP on a particular SoC, so for any given board I'd prefer to keep the board code without any SMP dependencies and simply use ->init_early() to setup delay, timers and SMP.

Quoted 2 lines

If you use .smp_init = smp_init_ops(r8a73a4_smp_ops) then there's no ifdef needed down in the DT_MACHINE section either.

It's nice to not use the #ifdefs, I agree. I'd like to have a dummy stub for smp_set_ops() too in the case of CONFIG_SMP=n, that would make the above code a bit prettier.

Quoted 5 lines

I hope this clarifies the reasons behind my question!

If I understand you correctly then I guess you prefer keeping the code as is with DT_MACHINE ->smp = smp_ops(foo) over using smp_set_ops() in ->init_early()?

Quoted 7 lines

Yes, that was my initial preference. However, that was based on the assumption that you would keep the current setup with several DT_MACHINE entries.

If you think you will shortly start to distill down and only keep a couple of DT_MACHINE structures (and start sharing them between SoCs), then doing this in code makes sense. However, if that is further out than a release or two then I think doing it in DT_MACHINE makes more sense.

Thanks for your reply. I believe reducing the number of DT_MACHINE will surely happen in 2014 but will still be relatively far away, so I doubt anything will change in 1-2 releases. Based on that I will keep the same approach as-is with DT_MACHINE .smp pointing to per-soc smp ops.

Cheers,

/ magnus

#9 lore raw

PATCH 1/2 ARM: shmobile: Add r8a73a4 SMP support using APMU code

In reply to Magnus Damm
Quoted 18 lines · Magnus Damm

From: Magnus Damm <[email protected]>

Add r8a73a4 SMP support using the shared APMU code. To enable SMP the r8a73a4 specific DTS needs to be updated to include CPU cores, and this is happening in a separate patch.

---

 arch/arm/mach-shmobile/Makefile               |    1 
 arch/arm/mach-shmobile/include/mach/r8a73a4.h |    1 
 arch/arm/mach-shmobile/setup-r8a73a4.c        |    3 +
 arch/arm/mach-shmobile/smp-r8a73a4.c          |   75 +++++++++++++++++++++++++
 4 files changed, 80 insertions(+)

arch/arm/mach-shmobile/Makefile endif · line 36

Quoted 4 lines
arch/arm/mach-shmobile/Makefile +1 -0
@@ -33,6 +33,7 @@ endif
 # SMP objects
 smp-y				:= platsmp.o headsmp.o
 smp-$(CONFIG_ARCH_SH73A0)	+= smp-sh73a0.o headsmp-scu.o platsmp-scu.o
+smp-$(CONFIG_ARCH_R8A73A4)	+= smp-r8a73a4.o platsmp-apmu.o

platsmp-apmu.c is introducing new bindings which IMO is not required. I have responded to that patch, but it would be nice to combine that patch in a single series for easier review for at least one platform using it.

Quoted 49 lines
arch/arm/mach-shmobile/Makefile +0 -0
 smp-$(CONFIG_ARCH_R8A7779)	+= smp-r8a7779.o headsmp-scu.o platsmp-scu.o
 smp-$(CONFIG_ARCH_EMEV2)	+= smp-emev2.o headsmp-scu.o platsmp-scu.o
 
arch/arm/mach-shmobile/include/mach/r8a73a4.h +1 -0
@@ -6,5 +6,6 @@ void r8a73a4_add_dt_devices(void);
 void r8a73a4_clock_init(void);
 void r8a73a4_pinmux_init(void);
 void r8a73a4_init_early(void);
+extern struct smp_operations r8a73a4_smp_ops;
 
 #endif /* __ASM_R8A73A4_H__ */
arch/arm/mach-shmobile/setup-r8a73a4.c +3 -0
@@ -212,6 +212,9 @@ void __init r8a73a4_init_early(void)
 #ifndef CONFIG_ARM_ARCH_TIMER
 	shmobile_setup_delay(1500, 2, 4); /* Cortex-A15 @ 1500MHz */
 #endif
+#ifdef CONFIG_SMP
+	smp_set_ops(&r8a73a4_smp_ops);
+#endif
 }
 
 #ifdef CONFIG_USE_OF
arch/arm/mach-shmobile/smp-r8a73a4.c new file +22 -0
@@ -0,0 +1,75 @@
+/*
+ * SMP support for r8a73a4
+ *
+ * Copyright (C) 2012-2013 Renesas Solutions Corp.
+ * Copyright (C) 2012 Takashi Yoshii <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+#include <linux/init.h>
+#include <linux/io.h>
+#include <linux/kernel.h>
+#include <linux/smp.h>
+#include <asm/smp_plat.h>
+#include <mach/common.h>
+

arch/arm/mach-shmobile/smp-r8a73a4.c line 32

Quoted 10 lines
arch/arm/mach-shmobile/smp-r8a73a4.c new file +10 -0
+#define SYSC		0xe6180000
+#define CA7BAR		0x4020
+#define CA15BAR		0x6020
+#define RESCNT		0x801c
+#define MERAM		0xe8080000
+#define CCI_BASE	0xf0190000
+#define CCI_SLAVE3	0x4000
+#define CCI_SLAVE4	0x5000
+#define CCI_SNOOP	0x0000
+#define CCI_STATUS	0x000c

Have a look at cci driver and its bindings, these slave addresses needs to be part of DTS.

Quoted 22 lines
arch/arm/mach-shmobile/smp-r8a73a4.c new file +22 -0
+
+static void __init r8a73a4_smp_prepare_cpus(unsigned int max_cpus)
+{
+	u32 bar;
+	void __iomem *p;
+
+	/* let APMU code install data related to shmobile_boot_vector */
+	shmobile_smp_apmu_prepare_cpus(max_cpus);
+
+	/* MERAM for jump stub, because BAR requires 256KB aligned address */
+	p = ioremap_nocache(MERAM, shmobile_boot_size);
+	memcpy_toio(p, shmobile_boot_vector, shmobile_boot_size);
+	iounmap(p);
+
+	/* setup reset vector and disable reset */
+	p = ioremap_nocache(SYSC, 0x9000);
+	bar = (MERAM >> 8) & 0xfffffc00;
+	writel_relaxed(bar, p + CA15BAR);
+	writel_relaxed(bar, p + CA7BAR);
+	writel_relaxed(bar | 0x10, p + CA15BAR);
+	writel_relaxed(bar | 0x10, p + CA7BAR);
+	writel_relaxed(readl_relaxed(p + RESCNT) & ~(1 << 10), p + RESCNT);

arch/arm/mach-shmobile/smp-r8a73a4.c line 64

Quoted 10 lines
arch/arm/mach-shmobile/smp-r8a73a4.c new file +10 -0
+	writel_relaxed(readl_relaxed(p + RESCNT) & ~(1 << 9), p + RESCNT);
+	iounmap(p);
+
+	/* enable snoop and DVM */
+	p = ioremap_nocache(CCI_BASE, 0x8000);
+	writel_relaxed(3, p + CCI_SLAVE3 + CCI_SNOOP);	/* CA15 */
+	writel_relaxed(3, p + CCI_SLAVE4 + CCI_SNOOP);	/* CA7 */
+	while (readl_relaxed(p + CCI_STATUS))
+		/* wait for pending bit low */;
+	iounmap(p);

You can use cci driver APIs for CCI control.

arch/arm/mach-shmobile/smp-r8a73a4.c line 75

Quoted 11 lines
arch/arm/mach-shmobile/smp-r8a73a4.c new file +11 -0
+}
+
+struct smp_operations r8a73a4_smp_ops __initdata = {
+	.smp_prepare_cpus	= r8a73a4_smp_prepare_cpus,
+	.smp_boot_secondary	= shmobile_smp_apmu_boot_secondary,
+#ifdef CONFIG_HOTPLUG_CPU
+	.cpu_disable		= shmobile_smp_cpu_disable,
+	.cpu_die		= shmobile_smp_apmu_cpu_die,
+	.cpu_kill		= shmobile_smp_apmu_cpu_kill,
+#endif
+};

If you are running Linux in secure mode, you can reuse mcpm_smp_ops and define these as part of mcpm_platform_ops

Quoted 6 lines

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel at lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

author maintainer
#10 lore raw

PATCH 1/2 ARM: shmobile: Add r8a73a4 SMP support using APMU code

Hi again Sudeep,

Quoted 16 lines · Sudeep KarkadaNagesha
Quoted 15 lines · Magnus Damm

From: Magnus Damm <[email protected]>

Add r8a73a4 SMP support using the shared APMU code. To enable SMP the r8a73a4 specific DTS needs to be updated to include CPU cores, and this is happening in a separate patch.

---

 arch/arm/mach-shmobile/Makefile               |    1
 arch/arm/mach-shmobile/include/mach/r8a73a4.h |    1
 arch/arm/mach-shmobile/setup-r8a73a4.c        |    3 +
 arch/arm/mach-shmobile/smp-r8a73a4.c          |   75 +++++++++++++++++++++++++
 4 files changed, 80 insertions(+)
Quoted 8 lines

arch/arm/mach-shmobile/Makefile 2013-08-07 20:07:31.000000000 +0900 endif · line 36

Quoted 7 lines
arch/arm/mach-shmobile/Makefile 2013-08-07 20:07:31.000000000 +0900 renamed from arch/arm/mach-shmobile/Makefile +1 -0
@@ -33,6 +33,7 @@ endif
 # SMP objects
 smp-y                                := platsmp.o headsmp.o
 smp-$(CONFIG_ARCH_SH73A0)    += smp-sh73a0.o headsmp-scu.o platsmp-scu.o
+smp-$(CONFIG_ARCH_R8A73A4)   += smp-r8a73a4.o platsmp-apmu.o

platsmp-apmu.c is introducing new bindings which IMO is not required.

I guess we will have to discuss a bit more how to support the APMU hardware. Regarding using DT or static configuration, I believe starting out with static and incrementally adding DT binding support is the easiest way forward.

Quoted 3 lines

I have responded to that patch, but it would be nice to combine that patch in a single series for easier review for at least one platform using it.

Good idea. I will resend a the next version as a single series to make future review easier.

Quoted 53 lines
Quoted 53 lines
arch/arm/mach-shmobile/Makefile 2013-08-07 20:07:31.000000000 +0900 renamed from arch/arm/mach-shmobile/Makefile +0 -0
 smp-$(CONFIG_ARCH_R8A7779)   += smp-r8a7779.o headsmp-scu.o platsmp-scu.o
 smp-$(CONFIG_ARCH_EMEV2)     += smp-emev2.o headsmp-scu.o platsmp-scu.o
 
arch/arm/mach-shmobile/include/mach/r8a73a4.h 2013-08-07 20:08:02.000000000 +0900 renamed from arch/arm/mach-shmobile/include/mach/r8a73a4.h +1 -0
@@ -6,5 +6,6 @@ void r8a73a4_add_dt_devices(void);
 void r8a73a4_clock_init(void);
 void r8a73a4_pinmux_init(void);
 void r8a73a4_init_early(void);
+extern struct smp_operations r8a73a4_smp_ops;
 
 #endif /* __ASM_R8A73A4_H__ */
arch/arm/mach-shmobile/setup-r8a73a4.c 2013-08-07 20:07:48.000000000 +0900 renamed from arch/arm/mach-shmobile/setup-r8a73a4.c +3 -0
@@ -212,6 +212,9 @@ void __init r8a73a4_init_early(void)
 #ifndef CONFIG_ARM_ARCH_TIMER
      shmobile_setup_delay(1500, 2, 4); /* Cortex-A15 @ 1500MHz */
 #endif
+#ifdef CONFIG_SMP
+     smp_set_ops(&r8a73a4_smp_ops);
+#endif
 }
 
 #ifdef CONFIG_USE_OF
arch/arm/mach-shmobile/smp-r8a73a4.c 2013-08-07 20:09:10.000000000 +0900 new file +26 -0
@@ -0,0 +1,75 @@
+/*
+ * SMP support for r8a73a4
+ *
+ * Copyright (C) 2012-2013 Renesas Solutions Corp.
+ * Copyright (C) 2012 Takashi Yoshii <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+#include <linux/init.h>
+#include <linux/io.h>
+#include <linux/kernel.h>
+#include <linux/smp.h>
+#include <asm/smp_plat.h>
+#include <mach/common.h>
+
+#define SYSC         0xe6180000
+#define CA7BAR               0x4020
+#define CA15BAR              0x6020
+#define RESCNT               0x801c
Quoted 8 lines

arch/arm/mach-shmobile/smp-r8a73a4.c 2013-08-07 20:09:10.000000000 +0900 line 32

Quoted 6 lines
arch/arm/mach-shmobile/smp-r8a73a4.c 2013-08-07 20:09:10.000000000 +0900 new file +6 -0
+#define MERAM                0xe8080000
+#define CCI_BASE     0xf0190000
+#define CCI_SLAVE3   0x4000
+#define CCI_SLAVE4   0x5000
+#define CCI_SNOOP    0x0000
+#define CCI_STATUS   0x000c

Have a look at cci driver and its bindings, these slave addresses needs to be part of DTS.

Ok, I will look into how we can make use of the CCI driver.

Quoted 25 lines
Quoted 25 lines
arch/arm/mach-shmobile/smp-r8a73a4.c 2013-08-07 20:09:10.000000000 +0900 new file +25 -0
+
+static void __init r8a73a4_smp_prepare_cpus(unsigned int max_cpus)
+{
+     u32 bar;
+     void __iomem *p;
+
+     /* let APMU code install data related to shmobile_boot_vector */
+     shmobile_smp_apmu_prepare_cpus(max_cpus);
+
+     /* MERAM for jump stub, because BAR requires 256KB aligned address */
+     p = ioremap_nocache(MERAM, shmobile_boot_size);
+     memcpy_toio(p, shmobile_boot_vector, shmobile_boot_size);
+     iounmap(p);
+
+     /* setup reset vector and disable reset */
+     p = ioremap_nocache(SYSC, 0x9000);
+     bar = (MERAM >> 8) & 0xfffffc00;
+     writel_relaxed(bar, p + CA15BAR);
+     writel_relaxed(bar, p + CA7BAR);
+     writel_relaxed(bar | 0x10, p + CA15BAR);
+     writel_relaxed(bar | 0x10, p + CA7BAR);
+     writel_relaxed(readl_relaxed(p + RESCNT) & ~(1 << 10), p + RESCNT);
+     writel_relaxed(readl_relaxed(p + RESCNT) & ~(1 << 9), p + RESCNT);
+     iounmap(p);
+
Quoted 8 lines

arch/arm/mach-shmobile/smp-r8a73a4.c 2013-08-07 20:09:10.000000000 +0900 line 64

Quoted 7 lines
arch/arm/mach-shmobile/smp-r8a73a4.c 2013-08-07 20:09:10.000000000 +0900 new file +7 -0
+     /* enable snoop and DVM */
+     p = ioremap_nocache(CCI_BASE, 0x8000);
+     writel_relaxed(3, p + CCI_SLAVE3 + CCI_SNOOP);  /* CA15 */
+     writel_relaxed(3, p + CCI_SLAVE4 + CCI_SNOOP);  /* CA7 */
+     while (readl_relaxed(p + CCI_STATUS))
+             /* wait for pending bit low */;
+     iounmap(p);

You can use cci driver APIs for CCI control.

Ok!

Quoted 5 lines
Quoted 5 lines
arch/arm/mach-shmobile/smp-r8a73a4.c 2013-08-07 20:09:10.000000000 +0900 new file +5 -0
+}
+
+struct smp_operations r8a73a4_smp_ops __initdata = {
+     .smp_prepare_cpus       = r8a73a4_smp_prepare_cpus,
+     .smp_boot_secondary     = shmobile_smp_apmu_boot_secondary,
Quoted 8 lines

arch/arm/mach-shmobile/smp-r8a73a4.c 2013-08-07 20:09:10.000000000 +0900 line 75

Quoted 6 lines
arch/arm/mach-shmobile/smp-r8a73a4.c 2013-08-07 20:09:10.000000000 +0900 new file +6 -0
+#ifdef CONFIG_HOTPLUG_CPU
+     .cpu_disable            = shmobile_smp_cpu_disable,
+     .cpu_die                = shmobile_smp_apmu_cpu_die,
+     .cpu_kill               = shmobile_smp_apmu_cpu_kill,
+#endif
+};

If you are running Linux in secure mode, you can reuse mcpm_smp_ops and define these as part of mcpm_platform_ops

Thanks for pointing that out, but we're not running in secure more.

Thanks for the review!

Cheers,

/ magnus

#11 lore raw

PATCH 1/2 ARM: shmobile: Add r8a73a4 SMP support using APMU code

Quoted 29 lines · Magnus Damm

Hi again Sudeep,

Quoted 16 lines · Sudeep KarkadaNagesha
Quoted 15 lines · Magnus Damm

From: Magnus Damm <[email protected]>

Add r8a73a4 SMP support using the shared APMU code. To enable SMP the r8a73a4 specific DTS needs to be updated to include CPU cores, and this is happening in a separate patch.

---

 arch/arm/mach-shmobile/Makefile               |    1
 arch/arm/mach-shmobile/include/mach/r8a73a4.h |    1
 arch/arm/mach-shmobile/setup-r8a73a4.c        |    3 +
 arch/arm/mach-shmobile/smp-r8a73a4.c          |   75 +++++++++++++++++++++++++
 4 files changed, 80 insertions(+)
Quoted 8 lines

arch/arm/mach-shmobile/Makefile 2013-08-07 20:07:31.000000000 +0900 endif · line 36

Quoted 7 lines
arch/arm/mach-shmobile/Makefile 2013-08-07 20:07:31.000000000 +0900 renamed from arch/arm/mach-shmobile/Makefile +1 -0
@@ -33,6 +33,7 @@ endif
 # SMP objects
 smp-y                                := platsmp.o headsmp.o
 smp-$(CONFIG_ARCH_SH73A0)    += smp-sh73a0.o headsmp-scu.o platsmp-scu.o
+smp-$(CONFIG_ARCH_R8A73A4)   += smp-r8a73a4.o platsmp-apmu.o

platsmp-apmu.c is introducing new bindings which IMO is not required.

Quoted 5 lines

I guess we will have to discuss a bit more how to support the APMU hardware. Regarding using DT or static configuration, I believe starting out with static and incrementally adding DT binding support is the easiest way forward.

As I mentioned in the other email, you need use APMU as part of MCPM platform ops. You still need APMU DT node and all the necessary functions to access it. I said only 'cpus' property in DT node is unnecessary and the way its used.

Quoted 7 lines
Quoted 3 lines

I have responded to that patch, but it would be nice to combine that patch in a single series for easier review for at least one platform using it.

Good idea. I will resend a the next version as a single series to make future review easier.

Good.

[...]

Quoted 14 lines
Quoted 5 lines
Quoted 5 lines
arch/arm/mach-shmobile/Makefile 2013-08-07 20:07:31.000000000 +0900 renamed from arch/arm/mach-shmobile/Makefile +5 -0
+}
+
+struct smp_operations r8a73a4_smp_ops __initdata = {
+     .smp_prepare_cpus       = r8a73a4_smp_prepare_cpus,
+     .smp_boot_secondary     = shmobile_smp_apmu_boot_secondary,
Quoted 8 lines

arch/arm/mach-shmobile/Makefile 2013-08-07 20:07:31.000000000 +0900

Quoted 6 lines
arch/arm/mach-shmobile/Makefile 2013-08-07 20:07:31.000000000 +0900 renamed from arch/arm/mach-shmobile/Makefile +6 -0
+#ifdef CONFIG_HOTPLUG_CPU
+     .cpu_disable            = shmobile_smp_cpu_disable,
+     .cpu_die                = shmobile_smp_apmu_cpu_die,
+     .cpu_kill               = shmobile_smp_apmu_cpu_kill,
+#endif
+};

If you are running Linux in secure mode, you can reuse mcpm_smp_ops and define these as part of mcpm_platform_ops

Quoted 2 lines

Thanks for pointing that out, but we're not running in secure more.

Again I am not sure if you want to avoid supporting PSCI. I understand it needs secure firmware but that's unavoidable if any of the CPU PM functionality on that hardware is accessible only in secure mode and you are running Linux in non-secure mode.

Regards,
Sudeep

author maintainer
#12 lore raw

PATCH 2/2 ARM: shmobile: Add r8a73a4 CA15 CPU cores and APMU as DTS

In reply to Magnus Damm

From: Magnus Damm <[email protected]>

Add CA15 CPU cores to r8a73a4 for a total of 4 x CA15 and also add an APMU node for SMP power management.

---

 arch/arm/boot/dts/r8a73a4.dtsi |   27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)
arch/arm/boot/dts/r8a73a4.dtsi +27 -0
@@ -25,6 +25,33 @@
 			reg = <0>;
 			clock-frequency = <1500000000>;
 		};
+
+		cpu1: cpu at 1 {
+			device_type = "cpu";
+			compatible = "arm,cortex-a15";
+			reg = <1>;
+			clock-frequency = <1500000000>;
+		};
+
+		cpu2: cpu at 2 {
+			device_type = "cpu";
+			compatible = "arm,cortex-a15";
+			reg = <2>;
+			clock-frequency = <1500000000>;
+		};
+
+		cpu3: cpu at 3 {
+			device_type = "cpu";
+			compatible = "arm,cortex-a15";
+			reg = <3>;
+			clock-frequency = <1500000000>;
+		};
+	};
+
+	apmu at e6152000 {
+		compatible = "renesas,r8a73a4-apmu", "renesas,apmu";
+		reg = <0 0xe6152000 0 0x88>;
+		cpus = <&cpu0 &cpu1 &cpu2 &cpu3>;
 	};
 
 	gic: interrupt-controller at f1001000 {
#13 lore raw

cover ARM: shmobile: Initial r8a73a4 APMU SMP code

In reply to Magnus Damm
Quoted 10 lines · Magnus Damm

ARM: shmobile: Initial r8a73a4 APMU SMP code

[PATCH 01/02] ARM: shmobile: Add r8a73a4 SMP support using APMU code [PATCH 02/02] ARM: shmobile: Add r8a73a4 CA15 CPU cores and APMU as DTS

This series adds SMP support to r8a73a4 using the APMU code. With these patches applied r8a73a4 CA15 support for SMP boot and CPU Hotplug is known to be working.

Thanks
Guennadi

Quoted 13 lines

---

Written against renesas.git renesas-devel-20130806v4 and [PATCH 00/05] ARM: shmobile: Yet another SMP series [PATCH 00/02] ARM: shmobile: Rename to r8a73a4/r8a7790_init_early() [PATCH] ARM: shmobile: Shared APMU SMP support code

 arch/arm/boot/dts/r8a73a4.dtsi                |   27 +++++++++
 arch/arm/mach-shmobile/Makefile               |    1 
 arch/arm/mach-shmobile/include/mach/r8a73a4.h |    1 
 arch/arm/mach-shmobile/setup-r8a73a4.c        |    3 +
 arch/arm/mach-shmobile/smp-r8a73a4.c          |   75 +++++++++++++++++++++++++
 5 files changed, 107 insertions(+)
Quoted 5 lines

--
To unsubscribe from this list: send the line "unsubscribe linux-sh" in the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html

---
Guennadi Liakhovetski, Ph.D.
Freelance Open-Source Software Developer
http://www.open-technology.de/