ARM: EXYNOS: SMC instruction (aka firmware) support
Subsystems (3)
PATCH v5 2/2 ARM: EXYNOS: SMC instruction (aka firmware) support
From: Kyungmin Park <[email protected]>
Some boards, e.g., exynos4412, can use smc instruction (aka firmware) interally.
---
Changelog v4
use call_firmware_op instead of indirect call
arch/arm/mach-exynos/Makefile +5 -0
@@ -30,6 +30,11 @@ obj-$(CONFIG_EXYNOS4_MCT) += mct.o obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o +obj-$(CONFIG_ARM_FIRMWARE) += exynos-smc.o firmware.o + +plus_sec := $(call as-instr,.arch_extension sec,+sec) +AFLAGS_exynos-smc.o :=-Wa,-march=armv7-a$(plus_sec) + # machine support obj-$(CONFIG_MACH_SMDKC210) += mach-smdkv310.o
arch/arm/mach-exynos/common.h +2 -0
@@ -21,6 +21,8 @@ void exynos4_restart(char mode, const char *cmd);void exynos5_restart (char mode,const char *cmd);void exynos_init_late (void ); +void exynos_firmware_init (void ); +#ifdef CONFIG_PM_GENERIC_DOMAINS int exynos_pm_late_initcall (void );#else
arch/arm/mach-exynos/exynos-smc.S new file +22 -0
@@ -0,0 +1,22 @@ +/* + * Copyright (C) 2012 Samsung Electronics. + * + * Copied from omap-smc.S Copyright (C) 2010 Texas Instruments, Inc. + * + * 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> + +/* + * Function signature: void exynos_smc(u32 cmd, u32 arg1, u32 arg2, u32 arg3) + */ + +ENTRY(exynos_smc) + stmfd sp!, {r4-r11, lr} + dsb + smc #0 + ldmfd sp!, {r4-r11, pc} +ENDPROC(exynos_smc)
arch/arm/mach-exynos/firmware.c new file +37 -0
@@ -0,0 +1,37 @@ +/* +* Copyright (C) 2012 Samsung Electronics. +* Kyungmin Park <[email protected]> +* +* 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/init.h> + +#include <asm/firmware.h> + +#include "smc.h" + +static int exynos_do_idle (void ) +{ +exynos_smc (SMC_CMD_SLEEP ,0 ,0 ,0 ); +return 0 ; +} + +static void exynos_cpu_boot (int cpu) +{ +exynos_smc (SMC_CMD_CPU1BOOT , cpu,0 ,0 ); +} + +static struct firmware_ops exynos_firmware_ops__initdata = { + .do_idle = exynos_do_idle, + .cpu_boot = exynos_cpu_boot, +}; + +int __init exynos_firmware_init (void ) +{ + firmware_ops = exynos_firmware_ops; +return 0 ; +}
arch/arm/mach-exynos/platsmp.c +7 -0
@@ -25,6 +25,7 @@#include <asm/hardware/gic.h> #include <asm/smp_plat.h> #include <asm/smp_scu.h> +#include <asm/firmware.h> #include <mach/hardware.h> #include <mach/regs-clock.h>
@@ -139,6 +140,12 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)__raw_writel (virt_to_phys (exynos4_secondary_startup),CPU1_BOOT_REG ); + +if (IS_ENABLED (CONFIG_ARM_FIRMWARE )) { +/* Call Exynos specific smc call */ +call_firmware_op (cpu_boot, cpu); + } +gic_raise_softirq (cpumask_of (cpu),1 );if (pen_release ==-1 )
arch/arm/mach-exynos/smc.h new file +31 -0
@@ -0,0 +1,31 @@ +/* +* Copyright (c) 2012 Samsung Electronics. +* +* EXYNOS - SMC Call +* +* 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. +*/ + +#ifndef __ASM_ARCH_EXYNOS_SMC_H +#define __ASM_ARCH_EXYNOS_SMC_H + +#define SMC_CMD_INIT (-1) +#define SMC_CMD_INFO (-2) +/* For Power Management */ +#define SMC_CMD_SLEEP (-3) +#define SMC_CMD_CPU1BOOT (-4) +#define SMC_CMD_CPU0AFTR (-5) +/* For CP15 Access */ +#define SMC_CMD_C15RESUME (-11) +/* For L2 Cache Access */ +#define SMC_CMD_L2X0CTRL (-21) +#define SMC_CMD_L2X0SETUP1 (-22) +#define SMC_CMD_L2X0SETUP2 (-23) +#define SMC_CMD_L2X0INVALL (-24) +#define SMC_CMD_L2X0DEBUG (-25) + +extern void exynos_smc (u32 cmd,u32 arg1,u32 arg2,u32 arg3); + +#endif
PATCH v5 2/2 ARM: EXYNOS: SMC instruction (aka firmware) support
Hello,
Please see my comments inline.
Quoted 123 lines · On Friday 24 of August 2012 17:33:57 Kyungmin Park wrote:
From: Kyungmin Park <[email protected]>
Some boards, e.g., exynos4412, can use smc instruction (aka firmware) interally.
Signed-off-by Kyungmin Park <[email protected]>---
Changelog v4
usecall_firmware_opinstead of indirect call(quoted diff) +0
-0b/arch/arm/mach-exynos/Makefile index 9b58024..8ee779c 100644
arch/arm/mach-exynos/Makefile +5
-0@@ -30,6 +30,11 @@ obj-$(CONFIG_EXYNOS4_MCT) += mct.o obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o +obj-$(CONFIG_ARM_FIRMWARE) += exynos-smc.o firmware.o + +plus_sec := $(call as-instr,.arch_extension sec,+sec) +AFLAGS_exynos-smc.o :=-Wa,-march=armv7-a$(plus_sec) + # machine support obj-$(CONFIG_MACH_SMDKC210) += mach-smdkv310.o(quoted diff) +0
-0
b/arch/arm/mach-exynos/common.hindex aed2eeb..540918f 100644arch/arm/mach-exynos/common.h +2
-0@@ -21,6 +21,8 @@ void exynos4_restart(char mode, const char *cmd);void exynos5_restart (char mode,const char *cmd);void exynos_init_late (void ); +void exynos_firmware_init (void ); +#ifdef CONFIG_PM_GENERIC_DOMAINS int exynos_pm_late_initcall (void );#else (quoted diff) +0
-0
b/arch/arm/mach-exynos/exynos-smc.Snew file mode 100644 index 0000000..2e27aa3arch/arm/mach-exynos/exynos-smc.S new file +14
-0@@ -0,0 +1,22 @@ +/* + * Copyright (C) 2012 Samsung Electronics. + * + * Copied from omap-smc.S Copyright (C) 2010 Texas Instruments, Inc. + * + * 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> + +/* + * Function signature: void exynos_smc(u32 cmd, u32 arg1, u32 arg2, u32arg3) + */
arch/arm/mach-exynos/exynos-smc.S new file +7
-0+ +ENTRY(exynos_smc) + stmfd sp!, {r4-r11, lr} + dsb + smc #0 + ldmfd sp!, {r4-r11, pc} +ENDPROC(exynos_smc)(quoted diff) +0
-0
b/arch/arm/mach-exynos/firmware.cnew file mode 100644 index 0000000..a144593arch/arm/mach-exynos/firmware.c new file +37
-0@@ -0,0 +1,37 @@ +/* +* Copyright (C) 2012 Samsung Electronics. +* Kyungmin Park <[email protected]> +* +* 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/init.h> + +#include <asm/firmware.h> + +#include "smc.h" + +static int exynos_do_idle (void ) +{ +exynos_smc (SMC_CMD_SLEEP ,0 ,0 ,0 ); +return 0 ; +} + +static void exynos_cpu_boot (int cpu) +{ +exynos_smc (SMC_CMD_CPU1BOOT , cpu,0 ,0 ); +} + +static struct firmware_ops exynos_firmware_ops__initdata = { + .do_idle = exynos_do_idle, + .cpu_boot = exynos_cpu_boot, +}; + +int __init exynos_firmware_init (void ) +{ + firmware_ops = exynos_firmware_ops; +return 0 ; +}(quoted diff) +0
-0
b/arch/arm/mach-exynos/platsmp.cindex 36c3984..c664a86 100644arch/arm/mach-exynos/platsmp.c +1
-0@@ -25,6 +25,7 @@#include <asm/hardware/gic.h> #include <asm/smp_plat.h> #include <asm/smp_scu.h> +#include <asm/firmware.h> #include <mach/hardware.h> #include <mach/regs-clock.h>
arch/arm/mach-exynos/platsmp.c int __cpuinit boot_secondary(unsigned int cpu, · line 148
Quoted 9 lines
arch/arm/mach-exynos/platsmp.c +5
-0@@ -139,6 +140,12 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)__raw_writel (virt_to_phys (exynos4_secondary_startup ),CPU1_BOOT_REG ); + +if (IS_ENABLED (CONFIG_ARM_FIRMWARE )) { +/* Call Exynos specific smc call */ +call_firmware_op (cpu_boot, cpu); + }
We don't need to check IS_ENABLED(CONFIG_ARM_FIRMWARE) now as call_firmware_op does it for us.
--
Best regards,
Tomasz Figa
Quoted 46 lines
arch/arm/mach-exynos/platsmp.c +1
-0+gic_raise_softirq (cpumask_of (cpu),1 );arch/arm/mach-exynos/platsmp.c +0
-0if (pen_release ==-1 )arch/arm/mach-exynos/smc.h new file +31
-0@@ -0,0 +1,31 @@ +/* +* Copyright (c) 2012 Samsung Electronics. +* +* EXYNOS - SMC Call +* +* 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. +*/ + +#ifndef __ASM_ARCH_EXYNOS_SMC_H +#define __ASM_ARCH_EXYNOS_SMC_H + +#define SMC_CMD_INIT (-1) +#define SMC_CMD_INFO (-2) +/* For Power Management */ +#define SMC_CMD_SLEEP (-3) +#define SMC_CMD_CPU1BOOT (-4) +#define SMC_CMD_CPU0AFTR (-5) +/* For CP15 Access */ +#define SMC_CMD_C15RESUME (-11) +/* For L2 Cache Access */ +#define SMC_CMD_L2X0CTRL (-21) +#define SMC_CMD_L2X0SETUP1 (-22) +#define SMC_CMD_L2X0SETUP2 (-23) +#define SMC_CMD_L2X0INVALL (-24) +#define SMC_CMD_L2X0DEBUG (-25) + +extern void exynos_smc (u32 cmd,u32 arg1,u32 arg2,u32 arg3); + +#endif _______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel at lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
PATCH v5 2/2 ARM: EXYNOS: SMC instruction (aka firmware) support
In reply to Kyungmin ParkHi,
See below.
arch/arm/mach-exynos/Makefile obj-$(CONFIG_EXYNOS4_MCT) += mct.o · line 36
Quoted 12 lines · Kyungmin Park
arch/arm/mach-exynos/Makefile +4
-0@@ -30,6 +30,11 @@ obj-$(CONFIG_EXYNOS4_MCT) += mct.o obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o +obj-$(CONFIG_ARM_FIRMWARE) += exynos-smc.o firmware.o + +plus_sec := $(call as-instr,.arch_extension sec,+sec) +AFLAGS_exynos-smc.o :=-Wa,-march=armv7-a$(plus_sec)
Again, no need for a config option here.
Quoted 33 lines
arch/arm/mach-exynos/firmware.c new file +27
-0@@ -0,0 +1,37 @@ +/* +* Copyright (C) 2012 Samsung Electronics. +* Kyungmin Park <[email protected]> +* +* 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/init.h> + +#include <asm/firmware.h> + +#include "smc.h" + +static int exynos_do_idle (void ) +{ +exynos_smc (SMC_CMD_SLEEP ,0 ,0 ,0 ); +return 0 ; +} + +static void exynos_cpu_boot (int cpu) +{ +exynos_smc (SMC_CMD_CPU1BOOT , cpu,0 ,0 ); +} +
arch/arm/mach-exynos/firmware.c line 37
Quoted 10 lines
arch/arm/mach-exynos/firmware.c new file +10
-0+static struct firmware_ops exynos_firmware_ops__initdata = { + .do_idle = exynos_do_idle, + .cpu_boot = exynos_cpu_boot, +}; + +int __init exynos_firmware_init (void ) +{ + firmware_ops = exynos_firmware_ops; +return 0 ; +}
If you add a check for SMC presence/execution mode here, then you can make this a runtime instead of boot time option, thus making it possible to build a kernel that boots and runs both with and without SMC support.
-Olof
PATCH v5 2/2 ARM: EXYNOS: SMC instruction (aka firmware) support
Quoted 13 lines · Olof Johansson
Hi,
See below.
Quoted 7 lines · Kyungmin Park
arch/arm/mach-exynos/Makefile +0
-0@@ -30,6 +30,11 @@ obj-$(CONFIG_EXYNOS4_MCT) += mct.o
Quoted 8 lines
arch/arm/mach-exynos/Makefile obj-$(CONFIG_EXYNOS4_MCT) += mct.o · line 36
Quoted 6 lines
arch/arm/mach-exynos/Makefile +4
-0obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o +obj-$(CONFIG_ARM_FIRMWARE) += exynos-smc.o firmware.o + +plus_sec := $(call as-instr,.arch_extension sec,+sec) +AFLAGS_exynos-smc.o :=-Wa,-march=armv7-a$(plus_sec)Again, no need for a config option here.
checked, I just did as others, omap3, highbank.
BTW, does it be required for older toolchain?
Quoted 41 lines
Quoted 41 lines
arch/arm/mach-exynos/firmware.c new file +33
-0@@ -0,0 +1,37 @@ +/* +* Copyright (C) 2012 Samsung Electronics. +* Kyungmin Park <[email protected]> +* +* 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/init.h> + +#include <asm/firmware.h> + +#include "smc.h" + +static int exynos_do_idle (void ) +{ +exynos_smc (SMC_CMD_SLEEP ,0 ,0 ,0 ); +return 0 ; +} + +static void exynos_cpu_boot (int cpu) +{ +exynos_smc (SMC_CMD_CPU1BOOT , cpu,0 ,0 ); +} + +static struct firmware_ops exynos_firmware_ops__initdata = { + .do_idle = exynos_do_idle, + .cpu_boot = exynos_cpu_boot, +}; + +int __init exynos_firmware_init (void )
Quoted 8 lines
arch/arm/mach-exynos/firmware.c line 37
Quoted 4 lines
arch/arm/mach-exynos/firmware.c new file +4
-0+{ + firmware_ops = exynos_firmware_ops; +return 0 ; +}If you add a check for SMC presence/execution mode here, then you can make this a runtime instead of boot time option, thus making it possible to build a kernel that boots and runs both with and without SMC support.
In the previous time, it's hard to detect at runtime, so I add this function. I think it's board specfic instead of SOC one.
Can you check it again, does it possbiel to know smc firmware is support at this board?
Thank you,
Kyungmin Park