All of lore.kernel.org
 help / color / mirror / Atom feed
From: Magnus Damm <magnus.damm@gmail.com>
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 01/03] ARM: mach-shmobile: SMP base support
Date: Tue, 14 Dec 2010 07:56:55 +0000	[thread overview]
Message-ID: <20101214075655.11275.95963.sendpatchset@t400s> (raw)
In-Reply-To: <20101214075647.11275.25933.sendpatchset@t400s>

From: Magnus Damm <damm@opensource.se>

Add SMP base support for R-Mobile / SH-Mobile processors.

This patch contains all base code to support CONFIG_SMP
regardless of ARCH_SHMOBILE processor type. Both local timer
and CPU hotplug are supported, but no processor specific
code is included.

At this point only the default behavior is in place, so
a single core will always be used even though CONFIG_SMP
is enabled on multicore systems.

The SMP Kconfig entry for arch/arm/Kconfig is excluded from
this patch to simplify merging.

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

 Future patches may be required to sync up the framework
 bits with current/upcoming changes in RMKs git repository.

 arch/arm/mach-shmobile/Makefile                        |    6 +
 arch/arm/mach-shmobile/headsmp.S                       |   26 +++++
 arch/arm/mach-shmobile/hotplug.c                       |   41 ++++++++
 arch/arm/mach-shmobile/include/mach/common.h           |    1 
 arch/arm/mach-shmobile/include/mach/entry-macro-intc.S |    6 +
 arch/arm/mach-shmobile/include/mach/smp.h              |   16 +++
 arch/arm/mach-shmobile/localtimer.c                    |   25 +++++
 arch/arm/mach-shmobile/platsmp.c                       |   73 ++++++++++++++++
 8 files changed, 194 insertions(+)

--- 0006/arch/arm/mach-shmobile/Makefile
+++ work/arch/arm/mach-shmobile/Makefile	2010-12-14 13:50:20.000000000 +0900
@@ -11,6 +11,11 @@ obj-$(CONFIG_ARCH_SH7377)	+= setup-sh737
 obj-$(CONFIG_ARCH_SH7372)	+= setup-sh7372.o clock-sh7372.o intc-sh7372.o
 obj-$(CONFIG_ARCH_SH73A0)	+= setup-sh73a0.o clock-sh73a0.o
 
+# SMP objects
+smp-y				:= platsmp.o headsmp.o
+smp-$(CONFIG_HOTPLUG_CPU)	+= hotplug.o
+smp-$(CONFIG_LOCAL_TIMERS)	+= localtimer.o
+
 # Pinmux setup
 pfc-y				: pfc-$(CONFIG_ARCH_SH7367)	+= pfc-sh7367.o
@@ -26,4 +31,5 @@ obj-$(CONFIG_MACH_AG5EVM)	+= board-ag5ev
 obj-$(CONFIG_MACH_MACKEREL)	+= board-mackerel.o
 
 # Framework support
+obj-$(CONFIG_SMP)		+= $(smp-y)
 obj-$(CONFIG_GENERIC_GPIO)	+= $(pfc-y)
--- /dev/null
+++ work/arch/arm/mach-shmobile/headsmp.S	2010-12-14 13:50:21.000000000 +0900
@@ -0,0 +1,26 @@
+/*
+ * SMP support for R-Mobile / SH-Mobile
+ *
+ * Copyright (C) 2010  Magnus Damm
+ * Copyright (C) 2010  Takashi Yoshii
+ *
+ * Based on vexpress, Copyright (c) 2003 ARM Limited, 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/linkage.h>
+#include <linux/init.h>
+
+	__INIT
+
+/*
+ * Reset vector for secondary CPUs.
+ * This will be mapped at address 0 by SBAR register.
+ * We need _long_ jump to the physical address.
+ */
+	.align  12
+ENTRY(shmobile_secondary_vector)
+	ldr     pc, 1f
+1:	.long   secondary_startup - CONFIG_PAGE_OFFSET + CONFIG_MEMORY_START
--- /dev/null
+++ work/arch/arm/mach-shmobile/hotplug.c	2010-12-14 13:50:21.000000000 +0900
@@ -0,0 +1,41 @@
+/*
+ * SMP support for R-Mobile / SH-Mobile
+ *
+ * Copyright (C) 2010  Magnus Damm
+ *
+ * Based on realview, Copyright (C) 2002 ARM Ltd, 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/kernel.h>
+#include <linux/errno.h>
+#include <linux/smp.h>
+
+int platform_cpu_kill(unsigned int cpu)
+{
+	return 1;
+}
+
+void platform_cpu_die(unsigned int cpu)
+{
+	while (1) {
+		/*
+		 * here's the WFI
+		 */
+		asm(".word	0xe320f003\n"
+		    :
+		    :
+		    : "memory", "cc");
+	}
+}
+
+int platform_cpu_disable(unsigned int cpu)
+{
+	/*
+	 * we don't allow CPU 0 to be shutdown (it is still too special
+	 * e.g. clock tick interrupts)
+	 */
+	return cpu = 0 ? -EPERM : 0;
+}
--- 0001/arch/arm/mach-shmobile/include/mach/common.h
+++ work/arch/arm/mach-shmobile/include/mach/common.h	2010-12-14 13:50:20.000000000 +0900
@@ -3,6 +3,7 @@
 
 extern struct sys_timer shmobile_timer;
 extern void shmobile_setup_console(void);
+extern void shmobile_secondary_vector(void);
 struct clk;
 extern int clk_init(void);
 
--- 0001/arch/arm/mach-shmobile/include/mach/entry-macro-intc.S
+++ work/arch/arm/mach-shmobile/include/mach/entry-macro-intc.S	2010-12-14 13:50:20.000000000 +0900
@@ -17,6 +17,12 @@
 #include <mach/hardware.h>
 #include <mach/irqs.h>
 
+	.macro	test_for_ipi, irqnr, irqstat, base, tmp
+	.endm
+
+	.macro	test_for_ltirq, irqnr, irqstat, base, tmp
+	.endm
+
 	.macro  disable_fiq
 	.endm
 
--- /dev/null
+++ work/arch/arm/mach-shmobile/include/mach/smp.h	2010-12-14 13:50:21.000000000 +0900
@@ -0,0 +1,16 @@
+#ifndef __MACH_SMP_H
+#define __MACH_SMP_H
+
+#include <asm/hardware/gic.h>
+#include <asm/smp_mpidr.h>
+
+/*
+ * We use IRQ1 as the IPI
+ */
+static inline void smp_cross_call(const struct cpumask *mask)
+{
+#if defined(CONFIG_ARM_GIC)
+	gic_raise_softirq(mask, 1);
+#endif
+}
+#endif
--- /dev/null
+++ work/arch/arm/mach-shmobile/localtimer.c	2010-12-14 14:31:51.000000000 +0900
@@ -0,0 +1,25 @@
+/*
+ * SMP support for R-Mobile / SH-Mobile - local timer portion
+ *
+ * Copyright (C) 2010  Magnus Damm
+ *
+ * Based on vexpress, Copyright (C) 2002 ARM Ltd, 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/smp.h>
+#include <linux/clockchips.h>
+#include <asm/smp_twd.h>
+#include <asm/localtimer.h>
+
+/*
+ * Setup the local clock events for a CPU.
+ */
+void __cpuinit local_timer_setup(struct clock_event_device *evt)
+{
+	evt->irq = 29;
+	twd_timer_setup(evt);
+}
--- /dev/null
+++ work/arch/arm/mach-shmobile/platsmp.c	2010-12-14 14:32:27.000000000 +0900
@@ -0,0 +1,73 @@
+/*
+ * SMP support for R-Mobile / SH-Mobile
+ *
+ * Copyright (C) 2010  Magnus Damm
+ *
+ * Based on vexpress, Copyright (C) 2002 ARM Ltd, 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/delay.h>
+#include <linux/device.h>
+#include <linux/smp.h>
+#include <linux/io.h>
+#include <asm/localtimer.h>
+
+static unsigned int __init shmobile_smp_get_core_count(void)
+{
+	return 1;
+}
+
+static void __init shmobile_smp_prepare_cpus(void)
+{
+	/* do nothing for now */
+}
+
+
+void __cpuinit platform_secondary_init(unsigned int cpu)
+{
+	trace_hardirqs_off();
+}
+
+int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)
+{
+	return -ENOSYS;
+}
+
+void __init smp_init_cpus(void)
+{
+	unsigned int ncores = shmobile_smp_get_core_count();
+	unsigned int i;
+
+	for (i = 0; i < ncores; i++)
+		set_cpu_possible(i, true);
+}
+
+void __init smp_prepare_cpus(unsigned int max_cpus)
+{
+	unsigned int ncores = shmobile_smp_get_core_count();
+	unsigned int cpu = smp_processor_id();
+	int i;
+
+	smp_store_cpu_info(cpu);
+
+	if (max_cpus > ncores)
+		max_cpus = ncores;
+
+	for (i = 0; i < max_cpus; i++)
+		set_cpu_present(i, true);
+
+	if (max_cpus > 1) {
+		shmobile_smp_prepare_cpus();
+
+		/*
+		 * Enable the local timer or broadcast device for the
+		 * boot CPU, but only if we have more than one CPU.
+		 */
+		percpu_timer_setup();
+	}
+}

WARNING: multiple messages have this Message-ID (diff)
From: magnus.damm@gmail.com (Magnus Damm)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 01/03] ARM: mach-shmobile: SMP base support
Date: Tue, 14 Dec 2010 16:56:55 +0900	[thread overview]
Message-ID: <20101214075655.11275.95963.sendpatchset@t400s> (raw)
In-Reply-To: <20101214075647.11275.25933.sendpatchset@t400s>

From: Magnus Damm <damm@opensource.se>

Add SMP base support for R-Mobile / SH-Mobile processors.

This patch contains all base code to support CONFIG_SMP
regardless of ARCH_SHMOBILE processor type. Both local timer
and CPU hotplug are supported, but no processor specific
code is included.

At this point only the default behavior is in place, so
a single core will always be used even though CONFIG_SMP
is enabled on multicore systems.

The SMP Kconfig entry for arch/arm/Kconfig is excluded from
this patch to simplify merging.

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

 Future patches may be required to sync up the framework
 bits with current/upcoming changes in RMKs git repository.

 arch/arm/mach-shmobile/Makefile                        |    6 +
 arch/arm/mach-shmobile/headsmp.S                       |   26 +++++
 arch/arm/mach-shmobile/hotplug.c                       |   41 ++++++++
 arch/arm/mach-shmobile/include/mach/common.h           |    1 
 arch/arm/mach-shmobile/include/mach/entry-macro-intc.S |    6 +
 arch/arm/mach-shmobile/include/mach/smp.h              |   16 +++
 arch/arm/mach-shmobile/localtimer.c                    |   25 +++++
 arch/arm/mach-shmobile/platsmp.c                       |   73 ++++++++++++++++
 8 files changed, 194 insertions(+)

--- 0006/arch/arm/mach-shmobile/Makefile
+++ work/arch/arm/mach-shmobile/Makefile	2010-12-14 13:50:20.000000000 +0900
@@ -11,6 +11,11 @@ obj-$(CONFIG_ARCH_SH7377)	+= setup-sh737
 obj-$(CONFIG_ARCH_SH7372)	+= setup-sh7372.o clock-sh7372.o intc-sh7372.o
 obj-$(CONFIG_ARCH_SH73A0)	+= setup-sh73a0.o clock-sh73a0.o
 
+# SMP objects
+smp-y				:= platsmp.o headsmp.o
+smp-$(CONFIG_HOTPLUG_CPU)	+= hotplug.o
+smp-$(CONFIG_LOCAL_TIMERS)	+= localtimer.o
+
 # Pinmux setup
 pfc-y				:=
 pfc-$(CONFIG_ARCH_SH7367)	+= pfc-sh7367.o
@@ -26,4 +31,5 @@ obj-$(CONFIG_MACH_AG5EVM)	+= board-ag5ev
 obj-$(CONFIG_MACH_MACKEREL)	+= board-mackerel.o
 
 # Framework support
+obj-$(CONFIG_SMP)		+= $(smp-y)
 obj-$(CONFIG_GENERIC_GPIO)	+= $(pfc-y)
--- /dev/null
+++ work/arch/arm/mach-shmobile/headsmp.S	2010-12-14 13:50:21.000000000 +0900
@@ -0,0 +1,26 @@
+/*
+ * SMP support for R-Mobile / SH-Mobile
+ *
+ * Copyright (C) 2010  Magnus Damm
+ * Copyright (C) 2010  Takashi Yoshii
+ *
+ * Based on vexpress, Copyright (c) 2003 ARM Limited, 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/linkage.h>
+#include <linux/init.h>
+
+	__INIT
+
+/*
+ * Reset vector for secondary CPUs.
+ * This will be mapped at address 0 by SBAR register.
+ * We need _long_ jump to the physical address.
+ */
+	.align  12
+ENTRY(shmobile_secondary_vector)
+	ldr     pc, 1f
+1:	.long   secondary_startup - CONFIG_PAGE_OFFSET + CONFIG_MEMORY_START
--- /dev/null
+++ work/arch/arm/mach-shmobile/hotplug.c	2010-12-14 13:50:21.000000000 +0900
@@ -0,0 +1,41 @@
+/*
+ * SMP support for R-Mobile / SH-Mobile
+ *
+ * Copyright (C) 2010  Magnus Damm
+ *
+ * Based on realview, Copyright (C) 2002 ARM Ltd, 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/kernel.h>
+#include <linux/errno.h>
+#include <linux/smp.h>
+
+int platform_cpu_kill(unsigned int cpu)
+{
+	return 1;
+}
+
+void platform_cpu_die(unsigned int cpu)
+{
+	while (1) {
+		/*
+		 * here's the WFI
+		 */
+		asm(".word	0xe320f003\n"
+		    :
+		    :
+		    : "memory", "cc");
+	}
+}
+
+int platform_cpu_disable(unsigned int cpu)
+{
+	/*
+	 * we don't allow CPU 0 to be shutdown (it is still too special
+	 * e.g. clock tick interrupts)
+	 */
+	return cpu == 0 ? -EPERM : 0;
+}
--- 0001/arch/arm/mach-shmobile/include/mach/common.h
+++ work/arch/arm/mach-shmobile/include/mach/common.h	2010-12-14 13:50:20.000000000 +0900
@@ -3,6 +3,7 @@
 
 extern struct sys_timer shmobile_timer;
 extern void shmobile_setup_console(void);
+extern void shmobile_secondary_vector(void);
 struct clk;
 extern int clk_init(void);
 
--- 0001/arch/arm/mach-shmobile/include/mach/entry-macro-intc.S
+++ work/arch/arm/mach-shmobile/include/mach/entry-macro-intc.S	2010-12-14 13:50:20.000000000 +0900
@@ -17,6 +17,12 @@
 #include <mach/hardware.h>
 #include <mach/irqs.h>
 
+	.macro	test_for_ipi, irqnr, irqstat, base, tmp
+	.endm
+
+	.macro	test_for_ltirq, irqnr, irqstat, base, tmp
+	.endm
+
 	.macro  disable_fiq
 	.endm
 
--- /dev/null
+++ work/arch/arm/mach-shmobile/include/mach/smp.h	2010-12-14 13:50:21.000000000 +0900
@@ -0,0 +1,16 @@
+#ifndef __MACH_SMP_H
+#define __MACH_SMP_H
+
+#include <asm/hardware/gic.h>
+#include <asm/smp_mpidr.h>
+
+/*
+ * We use IRQ1 as the IPI
+ */
+static inline void smp_cross_call(const struct cpumask *mask)
+{
+#if defined(CONFIG_ARM_GIC)
+	gic_raise_softirq(mask, 1);
+#endif
+}
+#endif
--- /dev/null
+++ work/arch/arm/mach-shmobile/localtimer.c	2010-12-14 14:31:51.000000000 +0900
@@ -0,0 +1,25 @@
+/*
+ * SMP support for R-Mobile / SH-Mobile - local timer portion
+ *
+ * Copyright (C) 2010  Magnus Damm
+ *
+ * Based on vexpress, Copyright (C) 2002 ARM Ltd, 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/smp.h>
+#include <linux/clockchips.h>
+#include <asm/smp_twd.h>
+#include <asm/localtimer.h>
+
+/*
+ * Setup the local clock events for a CPU.
+ */
+void __cpuinit local_timer_setup(struct clock_event_device *evt)
+{
+	evt->irq = 29;
+	twd_timer_setup(evt);
+}
--- /dev/null
+++ work/arch/arm/mach-shmobile/platsmp.c	2010-12-14 14:32:27.000000000 +0900
@@ -0,0 +1,73 @@
+/*
+ * SMP support for R-Mobile / SH-Mobile
+ *
+ * Copyright (C) 2010  Magnus Damm
+ *
+ * Based on vexpress, Copyright (C) 2002 ARM Ltd, 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/delay.h>
+#include <linux/device.h>
+#include <linux/smp.h>
+#include <linux/io.h>
+#include <asm/localtimer.h>
+
+static unsigned int __init shmobile_smp_get_core_count(void)
+{
+	return 1;
+}
+
+static void __init shmobile_smp_prepare_cpus(void)
+{
+	/* do nothing for now */
+}
+
+
+void __cpuinit platform_secondary_init(unsigned int cpu)
+{
+	trace_hardirqs_off();
+}
+
+int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)
+{
+	return -ENOSYS;
+}
+
+void __init smp_init_cpus(void)
+{
+	unsigned int ncores = shmobile_smp_get_core_count();
+	unsigned int i;
+
+	for (i = 0; i < ncores; i++)
+		set_cpu_possible(i, true);
+}
+
+void __init smp_prepare_cpus(unsigned int max_cpus)
+{
+	unsigned int ncores = shmobile_smp_get_core_count();
+	unsigned int cpu = smp_processor_id();
+	int i;
+
+	smp_store_cpu_info(cpu);
+
+	if (max_cpus > ncores)
+		max_cpus = ncores;
+
+	for (i = 0; i < max_cpus; i++)
+		set_cpu_present(i, true);
+
+	if (max_cpus > 1) {
+		shmobile_smp_prepare_cpus();
+
+		/*
+		 * Enable the local timer or broadcast device for the
+		 * boot CPU, but only if we have more than one CPU.
+		 */
+		percpu_timer_setup();
+	}
+}

  reply	other threads:[~2010-12-14  7:56 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-12-14  7:56 [PATCH 00/03] ARM: mach-shmobile: Initial SMP support Magnus Damm
2010-12-14  7:56 ` Magnus Damm
2010-12-14  7:56 ` Magnus Damm [this message]
2010-12-14  7:56   ` [PATCH 01/03] ARM: mach-shmobile: SMP base support Magnus Damm
2010-12-17  8:42   ` Russell King - ARM Linux
2010-12-17  8:42     ` Russell King - ARM Linux
2010-12-17 11:39     ` Magnus Damm
2010-12-17 11:39       ` Magnus Damm
2010-12-14  7:57 ` [PATCH 02/03] ARM: mach-shmobile: Enable SMP support Magnus Damm
2010-12-14  7:57   ` Magnus Damm
2010-12-14  7:57 ` [PATCH 03/03] ARM: mach-shmobile: sh73a0 " Magnus Damm
2010-12-14  7:57   ` Magnus Damm
2010-12-14  9:57 ` [PATCH 00/03] ARM: mach-shmobile: Initial " Paul Mundt
2010-12-14  9:57   ` Paul Mundt
2011-01-07  1:51   ` Paul Mundt
2011-01-07  1:51     ` Paul Mundt

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20101214075655.11275.95963.sendpatchset@t400s \
    --to=magnus.damm@gmail.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.