linux-sh.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 00/07] ARM: shmobile: sh73a0, r8a7779 and emev2 SMP SCU rework
@ 2013-07-31  7:07 Magnus Damm
  2013-07-31  7:07 ` [PATCH 01/07] ARM: shmobile: Introduce shared SCU SMP boot code Magnus Damm
                   ` (7 more replies)
  0 siblings, 8 replies; 9+ messages in thread
From: Magnus Damm @ 2013-07-31  7:07 UTC (permalink / raw)
  To: linux-arm-kernel

ARM: shmobile: sh73a0, r8a7779 and emev2 SMP SCU rework

[PATCH 01/07] ARM: shmobile: Introduce shared SCU SMP boot code
[PATCH 02/07] ARM: shmobile: Use shared SCU SMP boot code on sh73a0
[PATCH 03/07] ARM: shmobile: Use shared SCU SMP boot code on r8a7779
[PATCH 04/07] ARM: shmobile: Use shared SCU SMP boot code on emev2
[PATCH 05/07] ARM: shmobile: Add shared SCU CPU Hotplug code
[PATCH 06/07] ARM: shmobile: Use shared SCU CPU Hotplug code on sh73a0
[PATCH 07/07] ARM: shmobile: Use shared SCU CPU Hotplug code on r8a7779

This series consolidates mach-shmobile SMP code into SCU specific code
for SMP boot and CPU Hotplug. The shared SCU code will in the future hook
into some low level assembly code that provides SMP boot and sleep
functionality, so this is is also preparations for future work.

Signed-off-by: Magnus Damm <damm@opensource.se>
---

 Written against renesas.git renesas-devel-20130731
 
 Requires "[PATCH] ARM: Fix memblock_reserve() to include stext" during
 run time to allow test of CPU Hotplug with v3.11-rc kernels.

 arch/arm/mach-shmobile/Makefile              |    6 +-
 arch/arm/mach-shmobile/include/mach/common.h |    5 +
 arch/arm/mach-shmobile/platsmp-scu.c         |   76 ++++++++++++++++++++++++++
 arch/arm/mach-shmobile/smp-emev2.c           |   19 +++---
 arch/arm/mach-shmobile/smp-r8a7779.c         |   64 +++++----------------
 arch/arm/mach-shmobile/smp-sh73a0.c          |   67 +++++-----------------
 6 files changed, 126 insertions(+), 111 deletions(-)

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 01/07] ARM: shmobile: Introduce shared SCU SMP boot code
  2013-07-31  7:07 [PATCH 00/07] ARM: shmobile: sh73a0, r8a7779 and emev2 SMP SCU rework Magnus Damm
@ 2013-07-31  7:07 ` Magnus Damm
  2013-07-31  7:07 ` [PATCH 02/07] ARM: shmobile: Use shared SCU SMP boot code on sh73a0 Magnus Damm
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: Magnus Damm @ 2013-07-31  7:07 UTC (permalink / raw)
  To: linux-arm-kernel

From: Magnus Damm <damm@opensource.se>

Add SMP boot functions for SCU equipped mach-shmobile SoCs.

At this point shmobile_smp_scu_prepare_cpus() controls the SCU and
installs boot fn and arg, while shmobile_smp_scu_boot_secondary()
currently does nothing. In the future the boot function and arg
install code will be reworked, so the empty function is ground
work for that.

Signed-off-by: Magnus Damm <damm@opensource.se>
---

 arch/arm/mach-shmobile/include/mach/common.h |    3 ++
 arch/arm/mach-shmobile/platsmp-scu.c         |   31 ++++++++++++++++++++++++++
 2 files changed, 34 insertions(+)

--- 0001/arch/arm/mach-shmobile/include/mach/common.h
+++ work/arch/arm/mach-shmobile/include/mach/common.h	2013-07-29 16:50:17.000000000 +0900
@@ -11,6 +11,9 @@ extern void shmobile_boot_vector(void);
 extern unsigned long shmobile_boot_fn;
 extern unsigned long shmobile_boot_arg;
 extern void shmobile_boot_scu(void);
+extern void shmobile_smp_scu_prepare_cpus(unsigned int max_cpus);
+extern int shmobile_smp_scu_boot_secondary(unsigned int cpu,
+					   struct task_struct *idle);
 struct clk;
 extern int shmobile_clk_init(void);
 extern void shmobile_handle_irq_intc(struct pt_regs *);
--- /dev/null
+++ work/arch/arm/mach-shmobile/platsmp-scu.c	2013-07-29 21:39:30.000000000 +0900
@@ -0,0 +1,31 @@
+/*
+ * SMP support for SoCs with SCU covered by mach-shmobile
+ *
+ * Copyright (C) 2013  Magnus Damm
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+#include <linux/init.h>
+#include <linux/io.h>
+#include <linux/smp.h>
+#include <asm/smp_plat.h>
+#include <asm/smp_scu.h>
+#include <mach/common.h>
+
+void __init shmobile_smp_scu_prepare_cpus(unsigned int max_cpus)
+{
+	shmobile_boot_fn = virt_to_phys(shmobile_boot_scu);
+	shmobile_boot_arg = (unsigned long)shmobile_scu_base;
+
+	/* enable SCU and cache coherency on booting CPU */
+	scu_enable(shmobile_scu_base);
+	scu_power_mode(shmobile_scu_base, SCU_PM_NORMAL);
+}
+
+int shmobile_smp_scu_boot_secondary(unsigned int cpu, struct task_struct *idle)
+{
+	/* do nothing for now */
+	return 0;
+}

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 02/07] ARM: shmobile: Use shared SCU SMP boot code on sh73a0
  2013-07-31  7:07 [PATCH 00/07] ARM: shmobile: sh73a0, r8a7779 and emev2 SMP SCU rework Magnus Damm
  2013-07-31  7:07 ` [PATCH 01/07] ARM: shmobile: Introduce shared SCU SMP boot code Magnus Damm
@ 2013-07-31  7:07 ` Magnus Damm
  2013-07-31  7:07 ` [PATCH 03/07] ARM: shmobile: Use shared SCU SMP boot code on r8a7779 Magnus Damm
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: Magnus Damm @ 2013-07-31  7:07 UTC (permalink / raw)
  To: linux-arm-kernel

From: Magnus Damm <damm@opensource.se>

Use shared SCU code on sh73a0 for SMP boot.

Signed-off-by: Magnus Damm <damm@opensource.se>
---

 arch/arm/mach-shmobile/Makefile     |    2 +-
 arch/arm/mach-shmobile/smp-sh73a0.c |   26 +++++++++++++-------------
 2 files changed, 14 insertions(+), 14 deletions(-)

--- 0001/arch/arm/mach-shmobile/Makefile
+++ work/arch/arm/mach-shmobile/Makefile	2013-07-29 21:40:18.000000000 +0900
@@ -17,7 +17,7 @@ obj-$(CONFIG_ARCH_EMEV2)	+= setup-emev2.
 
 # SMP objects
 smp-y				:= platsmp.o headsmp.o
-smp-$(CONFIG_ARCH_SH73A0)	+= smp-sh73a0.o headsmp-scu.o
+smp-$(CONFIG_ARCH_SH73A0)	+= smp-sh73a0.o headsmp-scu.o platsmp-scu.o
 smp-$(CONFIG_ARCH_R8A7779)	+= smp-r8a7779.o headsmp-scu.o
 smp-$(CONFIG_ARCH_EMEV2)	+= smp-emev2.o headsmp-scu.o
 
--- 0002/arch/arm/mach-shmobile/smp-sh73a0.c
+++ work/arch/arm/mach-shmobile/smp-sh73a0.c	2013-07-29 21:41:27.000000000 +0900
@@ -50,30 +50,30 @@ void __init sh73a0_register_twd(void)
 
 static int __cpuinit sh73a0_boot_secondary(unsigned int cpu, struct task_struct *idle)
 {
-	cpu = cpu_logical_map(cpu);
+	unsigned int lcpu = cpu_logical_map(cpu);
+	int ret;
 
-	if (((__raw_readl(PSTR) >> (4 * cpu)) & 3) = 3)
-		__raw_writel(1 << cpu, WUPCR);	/* wake up */
+	ret = shmobile_smp_scu_boot_secondary(cpu, idle);
+	if (ret)
+		return ret;
+
+	if (((__raw_readl(PSTR) >> (4 * lcpu)) & 3) = 3)
+		__raw_writel(1 << lcpu, WUPCR);	/* wake up */
 	else
-		__raw_writel(1 << cpu, SRESCR);	/* reset */
+		__raw_writel(1 << lcpu, SRESCR);	/* reset */
 
 	return 0;
 }
 
 static void __init sh73a0_smp_prepare_cpus(unsigned int max_cpus)
 {
-	/* setup sh73a0 specific SCU base */
-	shmobile_scu_base = IOMEM(SH73A0_SCU_BASE);
-	scu_enable(shmobile_scu_base);
-
-	/* Map the reset vector (in headsmp-scu.S, headsmp.S) */
+	/* Map the reset vector (in headsmp.S) */
 	__raw_writel(0, APARMBAREA);      /* 4k */
 	__raw_writel(__pa(shmobile_boot_vector), SBAR);
-	shmobile_boot_fn = virt_to_phys(shmobile_boot_scu);
-	shmobile_boot_arg = (unsigned long)shmobile_scu_base;
 
-	/* enable cache coherency on booting CPU */
-	scu_power_mode(shmobile_scu_base, SCU_PM_NORMAL);
+	/* setup sh73a0 specific SCU bits */
+	shmobile_scu_base = IOMEM(SH73A0_SCU_BASE);
+	shmobile_smp_scu_prepare_cpus(max_cpus);
 }
 
 #ifdef CONFIG_HOTPLUG_CPU

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 03/07] ARM: shmobile: Use shared SCU SMP boot code on r8a7779
  2013-07-31  7:07 [PATCH 00/07] ARM: shmobile: sh73a0, r8a7779 and emev2 SMP SCU rework Magnus Damm
  2013-07-31  7:07 ` [PATCH 01/07] ARM: shmobile: Introduce shared SCU SMP boot code Magnus Damm
  2013-07-31  7:07 ` [PATCH 02/07] ARM: shmobile: Use shared SCU SMP boot code on sh73a0 Magnus Damm
@ 2013-07-31  7:07 ` Magnus Damm
  2013-07-31  7:07 ` [PATCH 04/07] ARM: shmobile: Use shared SCU SMP boot code on emev2 Magnus Damm
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: Magnus Damm @ 2013-07-31  7:07 UTC (permalink / raw)
  To: linux-arm-kernel

From: Magnus Damm <damm@opensource.se>

Use shared SCU code on r8a7779 for SMP boot.

Signed-off-by: Magnus Damm <damm@opensource.se>
---

 arch/arm/mach-shmobile/Makefile      |    2 +-
 arch/arm/mach-shmobile/smp-r8a7779.c |   23 ++++++++++++-----------
 2 files changed, 13 insertions(+), 12 deletions(-)

--- 0003/arch/arm/mach-shmobile/Makefile
+++ work/arch/arm/mach-shmobile/Makefile	2013-07-31 11:56:16.000000000 +0900
@@ -33,7 +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_R8A7779)	+= smp-r8a7779.o headsmp-scu.o
+smp-$(CONFIG_ARCH_R8A7779)	+= smp-r8a7779.o headsmp-scu.o platsmp-scu.o
 smp-$(CONFIG_ARCH_EMEV2)	+= smp-emev2.o headsmp-scu.o
 
 # IRQ objects
--- 0001/arch/arm/mach-shmobile/smp-r8a7779.c
+++ work/arch/arm/mach-shmobile/smp-r8a7779.c	2013-07-31 11:55:30.000000000 +0900
@@ -84,33 +84,34 @@ static int r8a7779_platform_cpu_kill(uns
 static int r8a7779_boot_secondary(unsigned int cpu, struct task_struct *idle)
 {
 	struct r8a7779_pm_ch *ch = NULL;
-	int ret = -EIO;
+	unsigned int lcpu = cpu_logical_map(cpu);
+	int ret;
 
-	cpu = cpu_logical_map(cpu);
+	ret = shmobile_smp_scu_boot_secondary(cpu, idle);
+	if (ret)
+		return ret;
 
-	if (cpu < ARRAY_SIZE(r8a7779_ch_cpu))
-		ch = r8a7779_ch_cpu[cpu];
+	if (lcpu < ARRAY_SIZE(r8a7779_ch_cpu))
+		ch = r8a7779_ch_cpu[lcpu];
 
 	if (ch)
 		ret = r8a7779_sysc_power_up(ch);
+	else
+		ret = -EIO;
 
 	return ret;
 }
 
 static void __init r8a7779_smp_prepare_cpus(unsigned int max_cpus)
 {
-
-	/* setup r8a7779 specific SCU base */
-	shmobile_scu_base = IOMEM(R8A7779_SCU_BASE);
-	scu_enable(shmobile_scu_base);
-
 	/* Map the reset vector (in headsmp-scu.S, headsmp.S) */
 	__raw_writel(__pa(shmobile_boot_vector), AVECR);
 	shmobile_boot_fn = virt_to_phys(shmobile_boot_scu);
 	shmobile_boot_arg = (unsigned long)shmobile_scu_base;
 
-	/* enable cache coherency on booting CPU */
-	scu_power_mode(shmobile_scu_base, SCU_PM_NORMAL);
+	/* setup r8a7779 specific SCU bits */
+	shmobile_scu_base = IOMEM(R8A7779_SCU_BASE);
+	shmobile_smp_scu_prepare_cpus(max_cpus);
 
 	r8a7779_pm_init();
 

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 04/07] ARM: shmobile: Use shared SCU SMP boot code on emev2
  2013-07-31  7:07 [PATCH 00/07] ARM: shmobile: sh73a0, r8a7779 and emev2 SMP SCU rework Magnus Damm
                   ` (2 preceding siblings ...)
  2013-07-31  7:07 ` [PATCH 03/07] ARM: shmobile: Use shared SCU SMP boot code on r8a7779 Magnus Damm
@ 2013-07-31  7:07 ` Magnus Damm
  2013-07-31  7:07 ` [PATCH 05/07] ARM: shmobile: Add shared SCU CPU Hotplug code Magnus Damm
                   ` (3 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: Magnus Damm @ 2013-07-31  7:07 UTC (permalink / raw)
  To: linux-arm-kernel

From: Magnus Damm <damm@opensource.se>

Use shared SCU code on emev2 for SMP boot.

Signed-off-by: Magnus Damm <damm@opensource.se>
---

 arch/arm/mach-shmobile/Makefile    |    2 +-
 arch/arm/mach-shmobile/smp-emev2.c |   19 ++++++++++---------
 2 files changed, 11 insertions(+), 10 deletions(-)

--- 0004/arch/arm/mach-shmobile/Makefile
+++ work/arch/arm/mach-shmobile/Makefile	2013-07-31 11:58:03.000000000 +0900
@@ -34,7 +34,7 @@ endif
 smp-y				:= platsmp.o headsmp.o
 smp-$(CONFIG_ARCH_SH73A0)	+= smp-sh73a0.o headsmp-scu.o platsmp-scu.o
 smp-$(CONFIG_ARCH_R8A7779)	+= smp-r8a7779.o headsmp-scu.o platsmp-scu.o
-smp-$(CONFIG_ARCH_EMEV2)	+= smp-emev2.o headsmp-scu.o
+smp-$(CONFIG_ARCH_EMEV2)	+= smp-emev2.o headsmp-scu.o platsmp-scu.o
 
 # IRQ objects
 obj-$(CONFIG_ARCH_SH7372)	+= entry-intc.o
--- 0001/arch/arm/mach-shmobile/smp-emev2.c
+++ work/arch/arm/mach-shmobile/smp-emev2.c	2013-07-31 11:58:39.000000000 +0900
@@ -34,6 +34,12 @@
 
 static int emev2_boot_secondary(unsigned int cpu, struct task_struct *idle)
 {
+	int ret;
+
+	ret = shmobile_smp_scu_boot_secondary(cpu, idle);
+	if (ret)
+		return ret;
+
 	arch_send_wakeup_ipi_mask(cpumask_of(cpu_logical_map(cpu)));
 	return 0;
 }
@@ -42,21 +48,16 @@ static void __init emev2_smp_prepare_cpu
 {
 	void __iomem *smu;
 
-	/* setup EMEV2 specific SCU base, enable */
-	shmobile_scu_base = ioremap(EMEV2_SCU_BASE, PAGE_SIZE);
-	scu_enable(shmobile_scu_base);
-
-	/* Tell ROM loader about our vector (in headsmp-scu.S, headsmp.S) */
+	/* Tell ROM loader about our vector (in headsmp.S) */
 	smu = ioremap(EMEV2_SMU_BASE, PAGE_SIZE);
 	if (smu) {
 		iowrite32(__pa(shmobile_boot_vector), smu + SMU_GENERAL_REG0);
 		iounmap(smu);
 	}
-	shmobile_boot_fn = virt_to_phys(shmobile_boot_scu);
-	shmobile_boot_arg = (unsigned long)shmobile_scu_base;
 
-	/* enable cache coherency on booting CPU */
-	scu_power_mode(shmobile_scu_base, SCU_PM_NORMAL);
+	/* setup EMEV2 specific SCU bits */
+	shmobile_scu_base = ioremap(EMEV2_SCU_BASE, PAGE_SIZE);
+	shmobile_smp_scu_prepare_cpus(max_cpus);
 }
 
 struct smp_operations emev2_smp_ops __initdata = {

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 05/07] ARM: shmobile: Add shared SCU CPU Hotplug code
  2013-07-31  7:07 [PATCH 00/07] ARM: shmobile: sh73a0, r8a7779 and emev2 SMP SCU rework Magnus Damm
                   ` (3 preceding siblings ...)
  2013-07-31  7:07 ` [PATCH 04/07] ARM: shmobile: Use shared SCU SMP boot code on emev2 Magnus Damm
@ 2013-07-31  7:07 ` Magnus Damm
  2013-07-31  7:07 ` [PATCH 06/07] ARM: shmobile: Use shared SCU CPU Hotplug code on sh73a0 Magnus Damm
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: Magnus Damm @ 2013-07-31  7:07 UTC (permalink / raw)
  To: linux-arm-kernel

From: Magnus Damm <damm@opensource.se>

Add CPU Hotplug functions for SCU equipped mach-shmobile SoCs.

The functions shmobile_smp_scu_cpu_die() together with
shmobile_smp_scu_cpu_kill() perform basic shutdown and
allows checking of shutdown status. These are written
to work together with SMP boot code in  headsmp-scu.S.

Signed-off-by: Magnus Damm <damm@opensource.se>
---

 arch/arm/mach-shmobile/include/mach/common.h |    2 +
 arch/arm/mach-shmobile/platsmp-scu.c         |   45 ++++++++++++++++++++++++++
 2 files changed, 47 insertions(+)

--- 0004/arch/arm/mach-shmobile/include/mach/common.h
+++ work/arch/arm/mach-shmobile/include/mach/common.h	2013-07-29 16:59:06.000000000 +0900
@@ -14,6 +14,8 @@ extern void shmobile_boot_scu(void);
 extern void shmobile_smp_scu_prepare_cpus(unsigned int max_cpus);
 extern int shmobile_smp_scu_boot_secondary(unsigned int cpu,
 					   struct task_struct *idle);
+extern void shmobile_smp_scu_cpu_die(unsigned int cpu);
+extern int shmobile_smp_scu_cpu_kill(unsigned int cpu);
 struct clk;
 extern int shmobile_clk_init(void);
 extern void shmobile_handle_irq_intc(struct pt_regs *);
--- 0004/arch/arm/mach-shmobile/platsmp-scu.c
+++ work/arch/arm/mach-shmobile/platsmp-scu.c	2013-07-29 16:58:43.000000000 +0900
@@ -7,9 +7,11 @@
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
  */
+#include <linux/delay.h>
 #include <linux/init.h>
 #include <linux/io.h>
 #include <linux/smp.h>
+#include <asm/cacheflush.h>
 #include <asm/smp_plat.h>
 #include <asm/smp_scu.h>
 #include <mach/common.h>
@@ -29,3 +31,46 @@ int shmobile_smp_scu_boot_secondary(unsi
 	arch_send_wakeup_ipi_mask(cpumask_of(cpu_logical_map(cpu)));
 	return 0;
 }
+
+#ifdef CONFIG_HOTPLUG_CPU
+void shmobile_smp_scu_cpu_die(unsigned int cpu)
+{
+	dsb();
+	flush_cache_all();
+
+	/* disable cache coherency */
+	scu_power_mode(shmobile_scu_base, SCU_PM_POWEROFF);
+
+	/* Endless loop until reset */
+	while (1)
+		cpu_do_idle();
+}
+
+static int shmobile_smp_scu_psr_core_disabled(int cpu)
+{
+	unsigned long mask = SCU_PM_POWEROFF << (cpu * 8);
+
+	if ((__raw_readl(shmobile_scu_base + 8) & mask) = mask)
+		return 1;
+
+	return 0;
+}
+
+int shmobile_smp_scu_cpu_kill(unsigned int cpu)
+{
+	int k;
+
+	/* this function is running on another CPU than the offline target,
+	 * here we need wait for shutdown code in platform_cpu_die() to
+	 * finish before asking SoC-specific code to power off the CPU core.
+	 */
+	for (k = 0; k < 1000; k++) {
+		if (shmobile_smp_scu_psr_core_disabled(cpu))
+			return 1;
+
+		mdelay(1);
+	}
+
+	return 0;
+}
+#endif

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 06/07] ARM: shmobile: Use shared SCU CPU Hotplug code on sh73a0
  2013-07-31  7:07 [PATCH 00/07] ARM: shmobile: sh73a0, r8a7779 and emev2 SMP SCU rework Magnus Damm
                   ` (4 preceding siblings ...)
  2013-07-31  7:07 ` [PATCH 05/07] ARM: shmobile: Add shared SCU CPU Hotplug code Magnus Damm
@ 2013-07-31  7:07 ` Magnus Damm
  2013-07-31  7:08 ` [PATCH 07/07] ARM: shmobile: Use shared SCU CPU Hotplug code on r8a7779 Magnus Damm
  2013-08-01  7:34 ` [PATCH 00/07] ARM: shmobile: sh73a0, r8a7779 and emev2 SMP SCU rework Simon Horman
  7 siblings, 0 replies; 9+ messages in thread
From: Magnus Damm @ 2013-07-31  7:07 UTC (permalink / raw)
  To: linux-arm-kernel

From: Magnus Damm <damm@opensource.se>

Update the sh73a0 specific CPU Hotplug code to make use of
the recently introduced shared SCU functions. The sh73a0
power control hardware relies on SCU_PM_POWEROFF with WFI
so the shared SCU code will as-is power down the hardware
as expected.

Signed-off-by: Magnus Damm <damm@opensource.se>
---

 arch/arm/mach-shmobile/smp-sh73a0.c |   41 ++---------------------------------
 1 file changed, 3 insertions(+), 38 deletions(-)

--- 0005/arch/arm/mach-shmobile/smp-sh73a0.c
+++ work/arch/arm/mach-shmobile/smp-sh73a0.c	2013-07-29 21:48:41.000000000 +0900
@@ -20,14 +20,11 @@
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/smp.h>
-#include <linux/spinlock.h>
 #include <linux/io.h>
 #include <linux/delay.h>
 #include <mach/common.h>
-#include <asm/cacheflush.h>
-#include <asm/smp_plat.h>
 #include <mach/sh73a0.h>
-#include <asm/smp_scu.h>
+#include <asm/smp_plat.h>
 #include <asm/smp_twd.h>
 
 #define WUPCR		IOMEM(0xe6151010)
@@ -36,8 +33,6 @@
 #define SBAR		IOMEM(0xe6180020)
 #define APARMBAREA	IOMEM(0xe6f10020)
 
-#define PSTR_SHUTDOWN_MODE	3
-
 #define SH73A0_SCU_BASE 0xf0000000
 
 #ifdef CONFIG_HAVE_ARM_TWD
@@ -77,36 +72,6 @@ static void __init sh73a0_smp_prepare_cp
 }
 
 #ifdef CONFIG_HOTPLUG_CPU
-static int sh73a0_cpu_kill(unsigned int cpu)
-{
-
-	int k;
-	u32 pstr;
-
-	/*
-	 * wait until the power status register confirms the shutdown of the
-	 * offline target
-	 */
-	for (k = 0; k < 1000; k++) {
-		pstr = (__raw_readl(PSTR) >> (4 * cpu)) & 3;
-		if (pstr = PSTR_SHUTDOWN_MODE)
-			return 1;
-
-		mdelay(1);
-	}
-
-	return 0;
-}
-
-static void sh73a0_cpu_die(unsigned int cpu)
-{
-	/* Set power off mode. This takes the CPU out of the MP cluster */
-	scu_power_mode(shmobile_scu_base, SCU_PM_POWEROFF);
-
-	/* Enter shutdown mode */
-	cpu_do_idle();
-}
-
 static int sh73a0_cpu_disable(unsigned int cpu)
 {
 	return 0; /* CPU0 and CPU1 supported */
@@ -117,8 +82,8 @@ struct smp_operations sh73a0_smp_ops __i
 	.smp_prepare_cpus	= sh73a0_smp_prepare_cpus,
 	.smp_boot_secondary	= sh73a0_boot_secondary,
 #ifdef CONFIG_HOTPLUG_CPU
-	.cpu_kill		= sh73a0_cpu_kill,
-	.cpu_die		= sh73a0_cpu_die,
 	.cpu_disable		= sh73a0_cpu_disable,
+	.cpu_die		= shmobile_smp_scu_cpu_die,
+	.cpu_kill		= shmobile_smp_scu_cpu_kill,
 #endif
 };

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 07/07] ARM: shmobile: Use shared SCU CPU Hotplug code on r8a7779
  2013-07-31  7:07 [PATCH 00/07] ARM: shmobile: sh73a0, r8a7779 and emev2 SMP SCU rework Magnus Damm
                   ` (5 preceding siblings ...)
  2013-07-31  7:07 ` [PATCH 06/07] ARM: shmobile: Use shared SCU CPU Hotplug code on sh73a0 Magnus Damm
@ 2013-07-31  7:08 ` Magnus Damm
  2013-08-01  7:34 ` [PATCH 00/07] ARM: shmobile: sh73a0, r8a7779 and emev2 SMP SCU rework Simon Horman
  7 siblings, 0 replies; 9+ messages in thread
From: Magnus Damm @ 2013-07-31  7:08 UTC (permalink / raw)
  To: linux-arm-kernel

From: Magnus Damm <damm@opensource.se>

Update the r8a7779 specific CPU Hotplug code to make use of
the recently introduced shared SCU functions. The r8a7779
power domain hardware requires special power down handling
at ->kill() time.

Signed-off-by: Magnus Damm <damm@opensource.se>
---

 arch/arm/mach-shmobile/smp-r8a7779.c |   41 +++-------------------------------
 1 file changed, 4 insertions(+), 37 deletions(-)

--- 0004/arch/arm/mach-shmobile/smp-r8a7779.c
+++ work/arch/arm/mach-shmobile/smp-r8a7779.c	2013-07-31 12:12:26.000000000 +0900
@@ -122,47 +122,14 @@ static void __init r8a7779_smp_prepare_c
 }
 
 #ifdef CONFIG_HOTPLUG_CPU
-static int r8a7779_scu_psr_core_disabled(int cpu)
-{
-	unsigned long mask = 3 << (cpu * 8);
-
-	if ((__raw_readl(shmobile_scu_base + 8) & mask) = mask)
-		return 1;
-
-	return 0;
-}
-
 static int r8a7779_cpu_kill(unsigned int cpu)
 {
-	int k;
-
-	/* this function is running on another CPU than the offline target,
-	 * here we need wait for shutdown code in platform_cpu_die() to
-	 * finish before asking SoC-specific code to power off the CPU core.
-	 */
-	for (k = 0; k < 1000; k++) {
-		if (r8a7779_scu_psr_core_disabled(cpu))
-			return r8a7779_platform_cpu_kill(cpu);
-
-		mdelay(1);
-	}
+	if (shmobile_smp_scu_cpu_kill(cpu))
+		return r8a7779_platform_cpu_kill(cpu);
 
 	return 0;
 }
 
-static void r8a7779_cpu_die(unsigned int cpu)
-{
-	dsb();
-	flush_cache_all();
-
-	/* disable cache coherency */
-	scu_power_mode(shmobile_scu_base, SCU_PM_POWEROFF);
-
-	/* Endless loop until power off from r8a7779_cpu_kill() */
-	while (1)
-		cpu_do_idle();
-}
-
 static int r8a7779_cpu_disable(unsigned int cpu)
 {
 	/* only CPU1->3 have power domains, do not allow hotplug of CPU0 */
@@ -174,8 +141,8 @@ struct smp_operations r8a7779_smp_ops  _
 	.smp_prepare_cpus	= r8a7779_smp_prepare_cpus,
 	.smp_boot_secondary	= r8a7779_boot_secondary,
 #ifdef CONFIG_HOTPLUG_CPU
-	.cpu_kill		= r8a7779_cpu_kill,
-	.cpu_die		= r8a7779_cpu_die,
 	.cpu_disable		= r8a7779_cpu_disable,
+	.cpu_die		= shmobile_smp_scu_cpu_die,
+	.cpu_kill		= r8a7779_cpu_kill,
 #endif
 };

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 00/07] ARM: shmobile: sh73a0, r8a7779 and emev2 SMP SCU rework
  2013-07-31  7:07 [PATCH 00/07] ARM: shmobile: sh73a0, r8a7779 and emev2 SMP SCU rework Magnus Damm
                   ` (6 preceding siblings ...)
  2013-07-31  7:08 ` [PATCH 07/07] ARM: shmobile: Use shared SCU CPU Hotplug code on r8a7779 Magnus Damm
@ 2013-08-01  7:34 ` Simon Horman
  7 siblings, 0 replies; 9+ messages in thread
From: Simon Horman @ 2013-08-01  7:34 UTC (permalink / raw)
  To: linux-arm-kernel

On Wed, Jul 31, 2013 at 04:07:02PM +0900, Magnus Damm wrote:
> ARM: shmobile: sh73a0, r8a7779 and emev2 SMP SCU rework
> 
> [PATCH 01/07] ARM: shmobile: Introduce shared SCU SMP boot code
> [PATCH 02/07] ARM: shmobile: Use shared SCU SMP boot code on sh73a0
> [PATCH 03/07] ARM: shmobile: Use shared SCU SMP boot code on r8a7779
> [PATCH 04/07] ARM: shmobile: Use shared SCU SMP boot code on emev2
> [PATCH 05/07] ARM: shmobile: Add shared SCU CPU Hotplug code
> [PATCH 06/07] ARM: shmobile: Use shared SCU CPU Hotplug code on sh73a0
> [PATCH 07/07] ARM: shmobile: Use shared SCU CPU Hotplug code on r8a7779
> 
> This series consolidates mach-shmobile SMP code into SCU specific code
> for SMP boot and CPU Hotplug. The shared SCU code will in the future hook
> into some low level assembly code that provides SMP boot and sleep
> functionality, so this is is also preparations for future work.
> 
> Signed-off-by: Magnus Damm <damm@opensource.se>
> ---
> 
>  Written against renesas.git renesas-devel-20130731
>  
>  Requires "[PATCH] ARM: Fix memblock_reserve() to include stext" during
>  run time to allow test of CPU Hotplug with v3.11-rc kernels.

I guess we need to wait for Russell's alternate fix to hit a stable branch.

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2013-08-01  7:34 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-07-31  7:07 [PATCH 00/07] ARM: shmobile: sh73a0, r8a7779 and emev2 SMP SCU rework Magnus Damm
2013-07-31  7:07 ` [PATCH 01/07] ARM: shmobile: Introduce shared SCU SMP boot code Magnus Damm
2013-07-31  7:07 ` [PATCH 02/07] ARM: shmobile: Use shared SCU SMP boot code on sh73a0 Magnus Damm
2013-07-31  7:07 ` [PATCH 03/07] ARM: shmobile: Use shared SCU SMP boot code on r8a7779 Magnus Damm
2013-07-31  7:07 ` [PATCH 04/07] ARM: shmobile: Use shared SCU SMP boot code on emev2 Magnus Damm
2013-07-31  7:07 ` [PATCH 05/07] ARM: shmobile: Add shared SCU CPU Hotplug code Magnus Damm
2013-07-31  7:07 ` [PATCH 06/07] ARM: shmobile: Use shared SCU CPU Hotplug code on sh73a0 Magnus Damm
2013-07-31  7:08 ` [PATCH 07/07] ARM: shmobile: Use shared SCU CPU Hotplug code on r8a7779 Magnus Damm
2013-08-01  7:34 ` [PATCH 00/07] ARM: shmobile: sh73a0, r8a7779 and emev2 SMP SCU rework Simon Horman

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).