Skip to contentSkip to conversation

ARM: shmobile: Initial r8a7790 APMU SMP code

PATCH New Magnus Damm 2 participants 4 messages Aug 9, 2013 – Aug 21, 2013

Subsystems (5)
lore
Share & tools
lore

Magnus Damm

author maintainer
#0 lore raw

cover ARM: shmobile: Initial r8a7790 APMU SMP code

ARM: shmobile: Initial r8a7790 APMU SMP code

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

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

---

Written against renesas.git renesas-devel-20130807 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 [PATCH 00/02] ARM: shmobile: Initial r8a73a4 APMU SMP code

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

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

From: Magnus Damm <[email protected]>

Add r8a7790 SMP support using the shared APMU code. To enable SMP the r8a7790 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/r8a7790.h |    1 
 arch/arm/mach-shmobile/setup-r8a7790.c        |    3 +
 arch/arm/mach-shmobile/smp-r8a7790.c          |   67 +++++++++++++++++++++++++
 4 files changed, 72 insertions(+)
arch/arm/mach-shmobile/Makefile +1 -0
@@ -35,6 +35,7 @@ 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_R8A7790)	+= smp-r8a7790.o platsmp-apmu.o
 smp-$(CONFIG_ARCH_EMEV2)	+= smp-emev2.o headsmp-scu.o platsmp-scu.o
 
 # IRQ objects
arch/arm/mach-shmobile/include/mach/r8a7790.h +1 -0
@@ -7,6 +7,7 @@ void r8a7790_clock_init(void);
 void r8a7790_pinmux_init(void);
 void r8a7790_init_early(void);
 void r8a7790_timer_init(void);
+extern struct smp_operations r8a7790_smp_ops;
 
 #define MD(nr) BIT(nr)
 u32 r8a7790_read_mode_pins(void);
arch/arm/mach-shmobile/setup-r8a7790.c +3 -0
@@ -272,6 +272,9 @@ void __init r8a7790_init_early(void)
 #ifndef CONFIG_ARM_ARCH_TIMER
 	shmobile_setup_delay(1300, 2, 4); /* Cortex-A15 @ 1300MHz */
 #endif
+#ifdef CONFIG_SMP
+	smp_set_ops(&r8a7790_smp_ops);
+#endif
 }
 
 #ifdef CONFIG_USE_OF
arch/arm/mach-shmobile/smp-r8a7790.c new file +67 -0

67 lines not on this page · raw message

#2 lore raw

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

Quoted 38 lines · Magnus Damm

From: Magnus Damm <[email protected]>

Add r8a7790 SMP support using the shared APMU code. To enable SMP the r8a7790 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/r8a7790.h |    1 
 arch/arm/mach-shmobile/setup-r8a7790.c        |    3 +
 arch/arm/mach-shmobile/smp-r8a7790.c          |   67 +++++++++++++++++++++++++
 4 files changed, 72 insertions(+)
arch/arm/mach-shmobile/Makefile +1 -0
@@ -35,6 +35,7 @@ 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_R8A7790)	+= smp-r8a7790.o platsmp-apmu.o
 smp-$(CONFIG_ARCH_EMEV2)	+= smp-emev2.o headsmp-scu.o platsmp-scu.o
 
 # IRQ objects
arch/arm/mach-shmobile/include/mach/r8a7790.h +1 -0
@@ -7,6 +7,7 @@ void r8a7790_clock_init(void);
 void r8a7790_pinmux_init(void);
 void r8a7790_init_early(void);
 void r8a7790_timer_init(void);
+extern struct smp_operations r8a7790_smp_ops;
 
 #define MD(nr) BIT(nr)
 u32 r8a7790_read_mode_pins(void);

arch/arm/mach-shmobile/setup-r8a7790.c void __init r8a7790_init_early(void) · line 280

Quoted 9 lines
arch/arm/mach-shmobile/setup-r8a7790.c +3 -0
@@ -272,6 +272,9 @@ void __init r8a7790_init_early(void)
 #ifndef CONFIG_ARM_ARCH_TIMER
 	shmobile_setup_delay(1300, 2, 4); /* Cortex-A15 @ 1300MHz */
 #endif
+#ifdef CONFIG_SMP
+	smp_set_ops(&r8a7790_smp_ops);
+#endif
 }
 
 #ifdef CONFIG_USE_OF

As per your email to Olof and Arnd regarding the r8a73a4 version of this change, I am holding off on this until there is some determination if it is preferred to set smp_set_ops() in ->init_early(i) or to use the (more traditional) method of setting smp_ops directly in the per-board DT_MACHINE_START.

Quoted 75 lines
arch/arm/mach-shmobile/smp-r8a7790.c new file +67 -1
@@ -0,0 +1,67 @@
+/*
+ * SMP support for r8a7790
+ *
+ * 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/kernel.h>
+#include <linux/init.h>
+#include <linux/smp.h>
+#include <linux/io.h>
+#include <asm/smp_plat.h>
+#include <mach/common.h>
+
+#define RST		0xe6160000
+#define CA15BAR		0x0020
+#define CA7BAR		0x0030
+#define CA15RESCNT	0x0040
+#define CA7RESCNT	0x0044
+#define MERAM		0xe8080000
+
+static void __init r8a7790_smp_prepare_cpus(unsigned int max_cpus)
+{
+	void __iomem *p;
+	u32 bar;
+
+	/* 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 vectors */
+	p = ioremap_nocache(RST, 0x63);
+	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);
+
+	/* enable clocks to all CPUs */
+	writel_relaxed((readl_relaxed(p + CA15RESCNT) & ~0x0f) | 0xa5a50000,
+		       p + CA15RESCNT);
+	writel_relaxed((readl_relaxed(p + CA7RESCNT) & ~0x0f) | 0x5a5a0000,
+		       p + CA7RESCNT);
+	iounmap(p);
+}
+
+struct smp_operations r8a7790_smp_ops __initdata = {
+	.smp_prepare_cpus	= r8a7790_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
+};
--

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

author maintainer
#3 lore raw

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

In reply to Magnus Damm

From: Magnus Damm <[email protected]>

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

---

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