Commit f07cb6a0 authored by Santosh Shilimkar's avatar Santosh Shilimkar
Browse files

ARM: keystone: Enable SMP support on Keystone machines



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: default avatarOlof Johansson <olof@lixom.net>
Signed-off-by: default avatarSantosh Shilimkar <santosh.shilimkar@ti.com>
parent 828989ad
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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
+1 −0
Original line number Diff line number Diff line
obj-y					:= keystone.o
obj-$(CONFIG_SMP)			+= platsmp.o
+4 −0
Original line number Diff line number Diff line
@@ -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,
+17 −0
Original line number Diff line number Diff line
/*
 * 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__ */
+52 −0
Original line number Diff line number Diff line
/*
 * 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,
};