linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* [Add SMP support for Allwinner A20: PATCH V4 0/3]
@ 2013-10-01 15:42 Fan Rong
  2013-10-01 15:42 ` [Add SMP support for Allwinner A20: PATCH V4 1/3] Add smp support for Allwinner A20(sunxi 7i) Fan Rong
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Fan Rong @ 2013-10-01 15:42 UTC (permalink / raw)
  To: linux-arm-kernel

This is the version 4 patch. It use smp_prepare_cpus replacing early_init as cpuconfigure map init funcation caller and use sun7i replacing sunxi7i as funcation name and variable name.

Fan Rong (3):
  Add smp support for Allwinner A20(sunxi 7i).
  Add cpuconfig nodes in dts for smp configure.
  Add arch count timer node in dts for Allwinner A20(sunxi 7i).

 arch/arm/boot/dts/sun7i-a20.dtsi |  15 ++++++
 arch/arm/mach-sunxi/Makefile     |   2 +
 arch/arm/mach-sunxi/headsmp.S    |  18 +++++++
 arch/arm/mach-sunxi/platsmp.c    | 114 +++++++++++++++++++++++++++++++++++++++
 arch/arm/mach-sunxi/sunxi.c      |   3 ++
 5 files changed, 152 insertions(+)
 create mode 100644 arch/arm/mach-sunxi/headsmp.S
 create mode 100644 arch/arm/mach-sunxi/platsmp.c

-- 
1.8.1.2

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

* [Add SMP support for Allwinner A20: PATCH V4 1/3] Add smp support for Allwinner A20(sunxi 7i).
  2013-10-01 15:42 [Add SMP support for Allwinner A20: PATCH V4 0/3] Fan Rong
@ 2013-10-01 15:42 ` Fan Rong
  2013-10-01 15:42 ` [Add SMP support for Allwinner A20: PATCH V4 2/3] Add cpuconfig nodes in dts for smp configure Fan Rong
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Fan Rong @ 2013-10-01 15:42 UTC (permalink / raw)
  To: linux-arm-kernel

Signed-off-by: Fan Rong <cinifr@gmail.com>
---
 arch/arm/mach-sunxi/Makefile  |   2 +
 arch/arm/mach-sunxi/headsmp.S |  18 +++++++
 arch/arm/mach-sunxi/platsmp.c | 114 ++++++++++++++++++++++++++++++++++++++++++
 arch/arm/mach-sunxi/sunxi.c   |   3 ++
 4 files changed, 137 insertions(+)
 create mode 100644 arch/arm/mach-sunxi/headsmp.S
 create mode 100644 arch/arm/mach-sunxi/platsmp.c

diff --git a/arch/arm/mach-sunxi/Makefile b/arch/arm/mach-sunxi/Makefile
index 93bebfc..d7f1ef4 100644
--- a/arch/arm/mach-sunxi/Makefile
+++ b/arch/arm/mach-sunxi/Makefile
@@ -1 +1,3 @@
 obj-$(CONFIG_ARCH_SUNXI) += sunxi.o
+obj-$(CONFIG_ARCH_SUNXI) += platsmp.o
+obj-$(CONFIG_ARCH_SUNXI) += headsmp.o
diff --git a/arch/arm/mach-sunxi/headsmp.S b/arch/arm/mach-sunxi/headsmp.S
new file mode 100644
index 0000000..48c9d33
--- /dev/null
+++ b/arch/arm/mach-sunxi/headsmp.S
@@ -0,0 +1,18 @@
+/*
+ * SMP support for A20
+ *
+ *  Copyright (C) 2013 Fan Rong <cinifr@gmail.com>
+ *
+ * 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/linkage.h>
+#include <linux/init.h>
+
+.section ".text.head", "ax"
+ENTRY(sun7i_secondary_startup)
+	msr cpsr_fsxc,#0xd3
+	b secondary_startup
+ENDPROC(sun7i_secondary_startup)
diff --git a/arch/arm/mach-sunxi/platsmp.c b/arch/arm/mach-sunxi/platsmp.c
new file mode 100644
index 0000000..fa5adde
--- /dev/null
+++ b/arch/arm/mach-sunxi/platsmp.c
@@ -0,0 +1,114 @@
+/*
+ *  linux/arch/arm/mach-sun7i/platsmp.c
+ *
+ *  Copyright (C) 2013 Fan Rong <cinifr@gmail.com>
+ *  All Rights Reserved
+ *
+ * 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/errno.h>
+#include <linux/smp.h>
+#include <linux/io.h>
+#include <linux/delay.h>
+#include <linux/smp.h>
+
+#include <linux/of_address.h>
+#include <linux/of_irq.h>
+#include <linux/of_platform.h>
+
+/*
+ * CPU Configure module support
+ * 1: Software reset for smp cpus
+ * 2: Configure for smp cpus including boot.
+ * 3: Three 64-bit idle counters and two 64-bit common counters
+ * it is needed for smp cpus
+ */
+void __iomem *sun7i_cc_base; /*CPU Configure Base*/
+extern void sun7i_secondary_startup(void);
+
+/*
+ * CPUCFG
+ */
+#define SUN7I_CPUCFG_BOOTADDR	0x01a4
+
+#define SUN7I_CPUCFG_GENCTL	0x0184
+#define SUN7I_CPUCFG_DBGCTL0	0x01e0
+#define SUN7I_CPUCFG_DBGCTL1	0x01e4
+
+#define SUN7I_CPU1_PWR_CLAMP	0x01b0
+#define SUN7I_CPU1_PWROFF_REG	0x01b4
+#define SUN7I_CPUX_RESET_CTL(x)	(0x40 + (x)*0x40)
+
+static struct of_device_id sun7i_cc_ids[] = {
+	{ .compatible = "allwinner,sun7i-a20-cpuconfig"},
+	{ /*sentinel*/ }
+};
+
+static int sun7i_boot_secondary(unsigned int cpu, struct task_struct *idle)
+{
+	long paddr;
+	uint32_t pwr_reg;
+	uint32_t j = 0xff << 1;
+	if (!sun7i_cc_base) {
+		pr_debug("error map cpu configure\n");
+		return -ENOSYS;
+	}
+	/* Set boot addr */
+	paddr = virt_to_phys(sun7i_secondary_startup);
+	writel(paddr, sun7i_cc_base + SUN7I_CPUCFG_BOOTADDR);
+
+	/* Assert cpu core reset */
+	writel(0, sun7i_cc_base + SUN7I_CPUX_RESET_CTL(cpu));
+
+	/* Ensure CPU reset also invalidates L1 caches */
+	pwr_reg = readl(sun7i_cc_base + SUN7I_CPUCFG_GENCTL);
+	pwr_reg &= ~BIT(cpu);
+	writel(pwr_reg, sun7i_cc_base + SUN7I_CPUCFG_GENCTL);
+
+	/* DBGPWRDUP hold low */
+	pwr_reg = readl(sun7i_cc_base + SUN7I_CPUCFG_DBGCTL1);
+	pwr_reg &= ~BIT(cpu);
+	writel(pwr_reg, sun7i_cc_base + SUN7I_CPUCFG_DBGCTL1);
+
+	/* Ramp up power to CPU1 */
+	do {
+		writel(j, sun7i_cc_base + SUN7I_CPU1_PWR_CLAMP);
+		j = j >> 1;
+	} while (j != 0);
+
+	mdelay(10);
+
+	pwr_reg = readl(sun7i_cc_base + SUN7I_CPU1_PWROFF_REG);
+	pwr_reg &= ~1;
+	writel(pwr_reg, sun7i_cc_base + SUN7I_CPU1_PWROFF_REG);
+	mdelay(1);
+
+	/* Release CPU reset */
+	writel(3, sun7i_cc_base + SUN7I_CPUX_RESET_CTL(cpu));
+
+	/* Unlock CPU */
+	pwr_reg = readl(sun7i_cc_base + SUN7I_CPUCFG_DBGCTL1);
+	pwr_reg |= BIT(cpu);
+	writel(pwr_reg, sun7i_cc_base + SUN7I_CPUCFG_DBGCTL1);
+
+	return 0;
+}
+
+static void __init sun7i_init_cpuconfig_map(unsigned int max_cpus)
+{
+	struct device_node *np;
+	np = of_find_matching_node(NULL, sun7i_cc_ids);
+	if (WARN(!np, "unable to setup cup configure"))
+		return;
+	sun7i_cc_base = of_iomap(np, 0);
+	if (WARN(!sun7i_cc_base, "failed to map cup configure base address"))
+		return;
+}
+
+struct smp_operations sun7i_smp_ops __initdata = {
+	.smp_boot_secondary = sun7i_boot_secondary,
+	.smp_prepare_cpus = sun7i_init_cpuconfig_map,
+};
diff --git a/arch/arm/mach-sunxi/sunxi.c b/arch/arm/mach-sunxi/sunxi.c
index e79fb34..b2e6eff 100644
--- a/arch/arm/mach-sunxi/sunxi.c
+++ b/arch/arm/mach-sunxi/sunxi.c
@@ -26,6 +26,8 @@
 #include <asm/mach/map.h>
 #include <asm/system_misc.h>
 
+extern struct smp_operations sun7i_smp_ops;
+
 #define SUN4I_WATCHDOG_CTRL_REG		0x00
 #define SUN4I_WATCHDOG_CTRL_RESTART		BIT(0)
 #define SUN4I_WATCHDOG_MODE_REG		0x04
@@ -139,6 +141,7 @@ static const char * const sunxi_board_dt_compat[] = {
 };
 
 DT_MACHINE_START(SUNXI_DT, "Allwinner A1X (Device Tree)")
+	.smp	= smp_ops(sun7i_smp_ops),
 	.init_machine	= sunxi_dt_init,
 	.init_time	= sunxi_timer_init,
 	.dt_compat	= sunxi_board_dt_compat,
-- 
1.8.1.2

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

* [Add SMP support for Allwinner A20: PATCH V4 2/3] Add cpuconfig nodes in dts for smp configure.
  2013-10-01 15:42 [Add SMP support for Allwinner A20: PATCH V4 0/3] Fan Rong
  2013-10-01 15:42 ` [Add SMP support for Allwinner A20: PATCH V4 1/3] Add smp support for Allwinner A20(sunxi 7i) Fan Rong
@ 2013-10-01 15:42 ` Fan Rong
  2013-10-01 15:42 ` [Add SMP support for Allwinner A20: PATCH V4 3/3] Add arch count timer node in dts for Allwinner A20(sunxi 7i) Fan Rong
  2013-10-02  8:32 ` [Add SMP support for Allwinner A20: PATCH V4 0/3] Daniel Lezcano
  3 siblings, 0 replies; 5+ messages in thread
From: Fan Rong @ 2013-10-01 15:42 UTC (permalink / raw)
  To: linux-arm-kernel

Signed-off-by: Fan Rong <cinifr@gmail.com>
---
 arch/arm/boot/dts/sun7i-a20.dtsi | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/arch/arm/boot/dts/sun7i-a20.dtsi b/arch/arm/boot/dts/sun7i-a20.dtsi
index 999ff45..e1bff17 100644
--- a/arch/arm/boot/dts/sun7i-a20.dtsi
+++ b/arch/arm/boot/dts/sun7i-a20.dtsi
@@ -167,6 +167,11 @@
 		#size-cells = <1>;
 		ranges;
 
+		cpuconfig: cpuconfig at 01c25c00 {
+			compatible = "allwinner,sun7i-a20-cpuconfig";
+			reg = <0x01c25c00 0x400>;
+		};
+
 		pio: pinctrl at 01c20800 {
 			compatible = "allwinner,sun7i-a20-pinctrl";
 			reg = <0x01c20800 0x400>;
-- 
1.8.1.2

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

* [Add SMP support for Allwinner A20: PATCH V4 3/3] Add arch count timer node in dts for Allwinner A20(sunxi 7i).
  2013-10-01 15:42 [Add SMP support for Allwinner A20: PATCH V4 0/3] Fan Rong
  2013-10-01 15:42 ` [Add SMP support for Allwinner A20: PATCH V4 1/3] Add smp support for Allwinner A20(sunxi 7i) Fan Rong
  2013-10-01 15:42 ` [Add SMP support for Allwinner A20: PATCH V4 2/3] Add cpuconfig nodes in dts for smp configure Fan Rong
@ 2013-10-01 15:42 ` Fan Rong
  2013-10-02  8:32 ` [Add SMP support for Allwinner A20: PATCH V4 0/3] Daniel Lezcano
  3 siblings, 0 replies; 5+ messages in thread
From: Fan Rong @ 2013-10-01 15:42 UTC (permalink / raw)
  To: linux-arm-kernel

Signed-off-by: Fan Rong <cinifr@gmail.com>
---
 arch/arm/boot/dts/sun7i-a20.dtsi | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/arch/arm/boot/dts/sun7i-a20.dtsi b/arch/arm/boot/dts/sun7i-a20.dtsi
index e1bff17..8d5e318 100644
--- a/arch/arm/boot/dts/sun7i-a20.dtsi
+++ b/arch/arm/boot/dts/sun7i-a20.dtsi
@@ -312,5 +312,15 @@
 			#interrupt-cells = <3>;
 			interrupts = <1 9 0xf04>;
 		};
+
+		timer {
+			compatible ="arm,armv7-timer";
+			interrupts = <1 13 0x308>,
+				     <1 14 0x308>,
+				     <1 11 0x308>,
+				     <1 10 0x308>;
+			clock-frequency = <24000000>;
+		};
+
 	};
 };
-- 
1.8.1.2

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

* [Add SMP support for Allwinner A20: PATCH V4 0/3]
  2013-10-01 15:42 [Add SMP support for Allwinner A20: PATCH V4 0/3] Fan Rong
                   ` (2 preceding siblings ...)
  2013-10-01 15:42 ` [Add SMP support for Allwinner A20: PATCH V4 3/3] Add arch count timer node in dts for Allwinner A20(sunxi 7i) Fan Rong
@ 2013-10-02  8:32 ` Daniel Lezcano
  3 siblings, 0 replies; 5+ messages in thread
From: Daniel Lezcano @ 2013-10-02  8:32 UTC (permalink / raw)
  To: linux-arm-kernel

On 10/01/2013 05:42 PM, Fan Rong wrote:


> This is the version 4 patch. It use smp_prepare_cpus replacing early_init as cpuconfigure map init funcation caller and use sun7i replacing sunxi7i as funcation name and variable name.

Hi Fan,

your patchset does not have a changelog neither a description. You 
should fix this first if you want a proper review.

Thanks
   -- Daniel

>
> Fan Rong (3):
>    Add smp support for Allwinner A20(sunxi 7i).
>    Add cpuconfig nodes in dts for smp configure.
>    Add arch count timer node in dts for Allwinner A20(sunxi 7i).
>
>   arch/arm/boot/dts/sun7i-a20.dtsi |  15 ++++++
>   arch/arm/mach-sunxi/Makefile     |   2 +
>   arch/arm/mach-sunxi/headsmp.S    |  18 +++++++
>   arch/arm/mach-sunxi/platsmp.c    | 114 +++++++++++++++++++++++++++++++++++++++
>   arch/arm/mach-sunxi/sunxi.c      |   3 ++
>   5 files changed, 152 insertions(+)
>   create mode 100644 arch/arm/mach-sunxi/headsmp.S
>   create mode 100644 arch/arm/mach-sunxi/platsmp.c
>


-- 
  <http://www.linaro.org/> Linaro.org ? Open source software for ARM SoCs

Follow Linaro:  <http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog

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

end of thread, other threads:[~2013-10-02  8:32 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-10-01 15:42 [Add SMP support for Allwinner A20: PATCH V4 0/3] Fan Rong
2013-10-01 15:42 ` [Add SMP support for Allwinner A20: PATCH V4 1/3] Add smp support for Allwinner A20(sunxi 7i) Fan Rong
2013-10-01 15:42 ` [Add SMP support for Allwinner A20: PATCH V4 2/3] Add cpuconfig nodes in dts for smp configure Fan Rong
2013-10-01 15:42 ` [Add SMP support for Allwinner A20: PATCH V4 3/3] Add arch count timer node in dts for Allwinner A20(sunxi 7i) Fan Rong
2013-10-02  8:32 ` [Add SMP support for Allwinner A20: PATCH V4 0/3] Daniel Lezcano

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