ARM: keystone: Enable SMP support on Keystone machines
authorSantosh Shilimkar <santosh.shilimkar@ti.com>
Mon, 10 Jun 2013 16:20:17 +0000 (12:20 -0400)
committerSantosh Shilimkar <santosh.shilimkar@ti.com>
Mon, 17 Jun 2013 22:35:35 +0000 (18:35 -0400)
Add basic SMP support for Keystone machines. This does not
include support for CPU hotplug for now.

Cc: Arnd Bergmann <arnd@arndb.de>
Cc: arm@kernel.org
Acked-by: Olof Johansson <olof@lixom.net>
Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
arch/arm/mach-keystone/Kconfig
arch/arm/mach-keystone/Makefile
arch/arm/mach-keystone/keystone.c
arch/arm/mach-keystone/keystone.h [new file with mode: 0644]
arch/arm/mach-keystone/platsmp.c [new file with mode: 0644]

index aebe8cdd88fce03ad7193a786adf16282523eac5..2dbd4ce3653cb9a89f691e414aa79c3f1008be15 100644 (file)
@@ -4,6 +4,7 @@ config ARCH_KEYSTONE
        select CPU_V7
        select ARM_GIC
        select HAVE_ARM_ARCH_TIMER
+       select HAVE_SMP
        select CLKSRC_MMIO
        select GENERIC_CLOCKEVENTS
        select HAVE_SCHED_CLOCK
index d4671d55215a6254a1cd7296639879183bc6a720..3f6b8ab822357e452bfa72e35f35884866c10197 100644 (file)
@@ -1 +1,2 @@
 obj-y                                  := keystone.o
+obj-$(CONFIG_SMP)                      += platsmp.o
index a67c19b8be201235808e21897b09b0bc65322118..fe4d9ff93a7ef8560cd6948aaa99720242df5865 100644 (file)
@@ -19,6 +19,9 @@
 #include <asm/mach/map.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/time.h>
+#include <asm/smp_plat.h>
+
+#include "keystone.h"
 
 #define PLL_RESET_WRITE_KEY_MASK               0xffff0000
 #define PLL_RESET_WRITE_KEY                    0x5a69
@@ -65,6 +68,7 @@ void keystone_restart(char mode, const char *cmd)
 }
 
 DT_MACHINE_START(KEYSTONE, "Keystone")
+       .smp            = smp_ops(keystone_smp_ops),
        .init_machine   = keystone_init,
        .dt_compat      = keystone_match,
        .restart        = keystone_restart,
diff --git a/arch/arm/mach-keystone/keystone.h b/arch/arm/mach-keystone/keystone.h
new file mode 100644 (file)
index 0000000..43a1b47
--- /dev/null
@@ -0,0 +1,17 @@
+/*
+ * Copyright 2013 Texas Instruments, Inc.
+ *     Cyril Chemparathy <cyril@ti.com>
+ *     Santosh Shilimkar <santosh.shillimkar@ti.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ */
+
+#ifndef __KEYSTONE_H__
+#define __KEYSTONE_H__
+
+extern struct smp_operations keystone_smp_ops;
+extern void secondary_startup(void);
+
+#endif /* __KEYSTONE_H__ */
diff --git a/arch/arm/mach-keystone/platsmp.c b/arch/arm/mach-keystone/platsmp.c
new file mode 100644 (file)
index 0000000..630ab3b
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * Keystone SOC SMP platform code
+ *
+ * Copyright 2013 Texas Instruments, Inc.
+ *     Cyril Chemparathy <cyril@ti.com>
+ *     Santosh Shilimkar <santosh.shillimkar@ti.com>
+ *
+ * Based on platsmp.c, Copyright (C) 2002 ARM Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions 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/io.h>
+
+#include <asm/smp_plat.h>
+#include <asm/prom.h>
+
+#include "keystone.h"
+
+static int __cpuinit keystone_smp_boot_secondary(unsigned int cpu,
+                                               struct task_struct *idle)
+{
+       unsigned long start = virt_to_phys(&secondary_startup);
+       int error;
+
+       pr_debug("keystone-smp: booting cpu %d, vector %08lx\n",
+                cpu, start);
+
+       asm volatile (
+               "mov    r0, #0\n"       /* power on cmd */
+               "mov    r1, %1\n"       /* cpu          */
+               "mov    r2, %2\n"       /* start        */
+               ".inst  0xe1600070\n"   /* smc #0       */
+               "mov    %0, r0\n"
+               : "=r" (error)
+               : "r"(cpu), "r"(start)
+               : "cc", "r0", "r1", "r2", "memory"
+       );
+
+       pr_debug("keystone-smp: monitor returned %d\n", error);
+
+       return error;
+}
+
+struct smp_operations keystone_smp_ops __initdata = {
+       .smp_init_cpus          = arm_dt_init_cpu_maps,
+       .smp_boot_secondary     = keystone_smp_boot_secondary,
+};