[PATCH 2/3] ARM: keystone: Enable SMP support on Keystone machines
Chander Kashyap
chander.kashyap at linaro.org
Tue Jun 11 01:16:55 EDT 2013
2013/6/11 Santosh Shilimkar <santosh.shilimkar at ti.com>:
> Add basic SMP support for Keystone machines. This does not
> include support for CPU hotplug for now.
>
> Cc: Olof Johansson <olof at lixom.net>
> Cc: Arnd Bergmann <arnd at arndb.de>
> Cc: arm at kernel.org
>
> Signed-off-by: Santosh Shilimkar <santosh.shilimkar at ti.com>
> ---
> arch/arm/mach-keystone/Kconfig | 1 +
> arch/arm/mach-keystone/Makefile | 1 +
> arch/arm/mach-keystone/keystone.c | 4 +++
> arch/arm/mach-keystone/keystone.h | 17 ++++++++++
> arch/arm/mach-keystone/platsmp.c | 67 +++++++++++++++++++++++++++++++++++++
> 5 files changed, 90 insertions(+)
> create mode 100644 arch/arm/mach-keystone/keystone.h
> create mode 100644 arch/arm/mach-keystone/platsmp.c
>
> diff --git a/arch/arm/mach-keystone/Kconfig b/arch/arm/mach-keystone/Kconfig
> index 39fab74..6054673 100644
> --- a/arch/arm/mach-keystone/Kconfig
> +++ b/arch/arm/mach-keystone/Kconfig
> @@ -3,6 +3,7 @@ config ARCH_KEYSTONE
> select CPU_V7
> select ARM_GIC
> select HAVE_ARM_ARCH_TIMER
> + select HAVE_SMP
> select USE_OF
> select MULTI_IRQ_HANDLER
> select CLKSRC_MMIO
> diff --git a/arch/arm/mach-keystone/Makefile b/arch/arm/mach-keystone/Makefile
> index d4671d5..3f6b8ab 100644
> --- a/arch/arm/mach-keystone/Makefile
> +++ b/arch/arm/mach-keystone/Makefile
> @@ -1 +1,2 @@
> obj-y := keystone.o
> +obj-$(CONFIG_SMP) += platsmp.o
> diff --git a/arch/arm/mach-keystone/keystone.c b/arch/arm/mach-keystone/keystone.c
> index 6c6fc42..5dd3b32 100644
> --- a/arch/arm/mach-keystone/keystone.c
> +++ b/arch/arm/mach-keystone/keystone.c
> @@ -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
> @@ -67,6 +70,7 @@ void keystone_restart(char mode, const char *cmd)
> }
>
> DT_MACHINE_START(KEYSTONE, "Keystone")
> + .smp = smp_ops(keystone_smp_ops),
> .map_io = debug_ll_io_init,
> .init_machine = keystone_init,
> .dt_compat = keystone_match,
> diff --git a/arch/arm/mach-keystone/keystone.h b/arch/arm/mach-keystone/keystone.h
> new file mode 100644
> index 0000000..43a1b47
> --- /dev/null
> +++ b/arch/arm/mach-keystone/keystone.h
> @@ -0,0 +1,17 @@
> +/*
> + * Copyright 2013 Texas Instruments, Inc.
> + * Cyril Chemparathy <cyril at ti.com>
> + * Santosh Shilimkar <santosh.shillimkar at 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
> index 0000000..3071dda
> --- /dev/null
> +++ b/arch/arm/mach-keystone/platsmp.c
> @@ -0,0 +1,67 @@
> +/*
> + * Keystone SOC SMP platform code
> + *
> + * Copyright 2013 Texas Instruments, Inc.
> + * Cyril Chemparathy <cyril at ti.com>
> + * Santosh Shilimkar <santosh.shillimkar at 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 "keystone.h"
> +
> +static void __init keystone_smp_init_cpus(void)
> +{
> + unsigned int i, ncores;
> +
> + ncores = 4;
This hardcoding can be done away, if cpu nodes are passed through DT.
Also set set_cpu_possible will be done by "arm_dt_init_cpu_maps" in devtree.c
> +
> + /* sanity check */
> + if (ncores > NR_CPUS) {
> + pr_warn("restricted to %d cpus\n", NR_CPUS);
> + ncores = NR_CPUS;
> + }
> +
> + for (i = 0; i < ncores; i++)
> + set_cpu_possible(i, true);
> +}
> +
> +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 = keystone_smp_init_cpus,
> + .smp_boot_secondary = keystone_smp_boot_secondary,
> +};
> --
> 1.7.9.5
>
>
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
--
with warm regards,
Chander Kashyap
More information about the linux-arm-kernel
mailing list