Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ARM: keystone: Move CPU bringup code to dedicated asm file

Because of inline asm usage in platsmp.c, smc instruction
creates build failure for ARM V6+V7 build where as using instruction
encoding for smc breaks the thumb2 build.

So move the code snippet to separate asm file and mark
it with 'armv7-a$(plus_sec)' to avoid any build issues.

Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>

authored by

Santosh Shilimkar and committed by
Arnd Bergmann
3aae7ab0 24e860fb

+43 -13
+5 -1
arch/arm/mach-keystone/Makefile
··· 1 - obj-y := keystone.o 1 + obj-y := keystone.o smc.o 2 + 3 + plus_sec := $(call as-instr,.arch_extension sec,+sec) 4 + AFLAGS_smc.o :=-Wa,-march=armv7-a$(plus_sec) 5 + 2 6 obj-$(CONFIG_SMP) += platsmp.o
+6
arch/arm/mach-keystone/keystone.h
··· 11 11 #ifndef __KEYSTONE_H__ 12 12 #define __KEYSTONE_H__ 13 13 14 + #define KEYSTONE_MON_CPU_UP_IDX 0x00 15 + 16 + #ifndef __ASSEMBLER__ 17 + 14 18 extern struct smp_operations keystone_smp_ops; 15 19 extern void secondary_startup(void); 20 + extern u32 keystone_cpu_smc(u32 command, u32 cpu, u32 addr); 16 21 22 + #endif /* __ASSEMBLER__ */ 17 23 #endif /* __KEYSTONE_H__ */
+3 -12
arch/arm/mach-keystone/platsmp.c
··· 30 30 pr_debug("keystone-smp: booting cpu %d, vector %08lx\n", 31 31 cpu, start); 32 32 33 - asm volatile ( 34 - "mov r0, #0\n" /* power on cmd */ 35 - "mov r1, %1\n" /* cpu */ 36 - "mov r2, %2\n" /* start */ 37 - ".inst 0xe1600070\n" /* smc #0 */ 38 - "mov %0, r0\n" 39 - : "=r" (error) 40 - : "r"(cpu), "r"(start) 41 - : "cc", "r0", "r1", "r2", "memory" 42 - ); 43 - 44 - pr_debug("keystone-smp: monitor returned %d\n", error); 33 + error = keystone_cpu_smc(KEYSTONE_MON_CPU_UP_IDX, cpu, start); 34 + if (error) 35 + pr_err("CPU %d bringup failed with %d\n", cpu, error); 45 36 46 37 return error; 47 38 }
+29
arch/arm/mach-keystone/smc.S
··· 1 + /* 2 + * Keystone Secure APIs 3 + * 4 + * Copyright (C) 2013 Texas Instruments, Inc. 5 + * Santosh Shilimkar <santosh.shilimkar@ti.com> 6 + * 7 + * This program is free software,you can redistribute it and/or modify 8 + * it under the terms of the GNU General Public License version 2 as 9 + * published by the Free Software Foundation. 10 + */ 11 + 12 + #include <linux/linkage.h> 13 + 14 + /** 15 + * u32 keystone_cpu_smc(u32 command, u32 cpu, u32 addr) 16 + * 17 + * Low level CPU monitor API 18 + * @command: Monitor command. 19 + * @cpu: CPU Number 20 + * @addr: Kernel jump address for boot CPU 21 + * 22 + * Return: Non zero value on failure 23 + */ 24 + ENTRY(keystone_cpu_smc) 25 + stmfd sp!, {r4-r12, lr} 26 + smc #0 27 + dsb 28 + ldmfd sp!, {r4-r12, pc} 29 + ENDPROC(keystone_cpu_smc)