diff options
author | Santosh Shilimkar <santosh.shilimkar@ti.com> | 2011-06-06 08:26:49 -0400 |
---|---|---|
committer | Kevin Hilman <khilman@ti.com> | 2011-12-08 14:29:00 -0500 |
commit | ba9456ac9c72a7a5d4d59340aba4259351832521 (patch) | |
tree | 557647722688c75caef4de8d9fdf30665118cd0d /arch | |
parent | 3c50729b3fa1cd8ca1f347e6caf1081204cf1a7c (diff) |
ARM: OMAP: Add Secure HAL and monitor mode API infrastructure.
On OMAP secure/emulation devices, certain APIs are exported by secure
code. Add an infrastructure so that relevant operations on secure
devices can be implemented using it.
While at this, rename omap44xx-smc.S to omap-smc.S since the common APIs
can be used on other OMAP's too.
Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
Acked-by: Jean Pihet <j-pihet@ti.com>
Reviewed-by: Kevin Hilman <khilman@ti.com>
Tested-by: Vishwanath BS <vishwanath.bs@ti.com>
Signed-off-by: Kevin Hilman <khilman@ti.com>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/arm/mach-omap2/Makefile | 11 | ||||
-rw-r--r-- | arch/arm/mach-omap2/include/mach/omap-secure.h | 40 | ||||
-rw-r--r-- | arch/arm/mach-omap2/omap-secure.c | 52 | ||||
-rw-r--r-- | arch/arm/mach-omap2/omap-smc.S (renamed from arch/arm/mach-omap2/omap44xx-smc.S) | 23 |
4 files changed, 121 insertions, 5 deletions
diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile index b009f17dee56..bd3a224d1678 100644 --- a/arch/arm/mach-omap2/Makefile +++ b/arch/arm/mach-omap2/Makefile | |||
@@ -11,10 +11,11 @@ hwmod-common = omap_hwmod.o \ | |||
11 | omap_hwmod_common_data.o | 11 | omap_hwmod_common_data.o |
12 | clock-common = clock.o clock_common_data.o \ | 12 | clock-common = clock.o clock_common_data.o \ |
13 | clkt_dpll.o clkt_clksel.o | 13 | clkt_dpll.o clkt_clksel.o |
14 | secure-common = omap-smc.o omap-secure.o | ||
14 | 15 | ||
15 | obj-$(CONFIG_ARCH_OMAP2) += $(omap-2-3-common) $(hwmod-common) | 16 | obj-$(CONFIG_ARCH_OMAP2) += $(omap-2-3-common) $(hwmod-common) $(secure-common) |
16 | obj-$(CONFIG_ARCH_OMAP3) += $(omap-2-3-common) $(hwmod-common) | 17 | obj-$(CONFIG_ARCH_OMAP3) += $(omap-2-3-common) $(hwmod-common) $(secure-common) |
17 | obj-$(CONFIG_ARCH_OMAP4) += prm44xx.o $(hwmod-common) | 18 | obj-$(CONFIG_ARCH_OMAP4) += prm44xx.o $(hwmod-common) $(secure-common) |
18 | 19 | ||
19 | obj-$(CONFIG_OMAP_MCBSP) += mcbsp.o | 20 | obj-$(CONFIG_OMAP_MCBSP) += mcbsp.o |
20 | 21 | ||
@@ -24,11 +25,11 @@ obj-$(CONFIG_TWL4030_CORE) += omap_twl.o | |||
24 | obj-$(CONFIG_SMP) += omap-smp.o omap-headsmp.o | 25 | obj-$(CONFIG_SMP) += omap-smp.o omap-headsmp.o |
25 | obj-$(CONFIG_LOCAL_TIMERS) += timer-mpu.o | 26 | obj-$(CONFIG_LOCAL_TIMERS) += timer-mpu.o |
26 | obj-$(CONFIG_HOTPLUG_CPU) += omap-hotplug.o | 27 | obj-$(CONFIG_HOTPLUG_CPU) += omap-hotplug.o |
27 | obj-$(CONFIG_ARCH_OMAP4) += omap44xx-smc.o omap4-common.o | 28 | obj-$(CONFIG_ARCH_OMAP4) += omap4-common.o |
28 | 29 | ||
29 | plus_sec := $(call as-instr,.arch_extension sec,+sec) | 30 | plus_sec := $(call as-instr,.arch_extension sec,+sec) |
30 | AFLAGS_omap-headsmp.o :=-Wa,-march=armv7-a$(plus_sec) | 31 | AFLAGS_omap-headsmp.o :=-Wa,-march=armv7-a$(plus_sec) |
31 | AFLAGS_omap44xx-smc.o :=-Wa,-march=armv7-a$(plus_sec) | 32 | AFLAGS_omap-smc.o :=-Wa,-march=armv7-a$(plus_sec) |
32 | 33 | ||
33 | # Functions loaded to SRAM | 34 | # Functions loaded to SRAM |
34 | obj-$(CONFIG_SOC_OMAP2420) += sram242x.o | 35 | obj-$(CONFIG_SOC_OMAP2420) += sram242x.o |
diff --git a/arch/arm/mach-omap2/include/mach/omap-secure.h b/arch/arm/mach-omap2/include/mach/omap-secure.h new file mode 100644 index 000000000000..26e7bcc49adc --- /dev/null +++ b/arch/arm/mach-omap2/include/mach/omap-secure.h | |||
@@ -0,0 +1,40 @@ | |||
1 | /* | ||
2 | * omap-secure.h: OMAP Secure infrastructure header. | ||
3 | * | ||
4 | * Copyright (C) 2011 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 | #ifndef OMAP_ARCH_OMAP_SECURE_H | ||
12 | #define OMAP_ARCH_OMAP_SECURE_H | ||
13 | |||
14 | /* Monitor error code */ | ||
15 | #define API_HAL_RET_VALUE_NS2S_CONVERSION_ERROR 0xFFFFFFFE | ||
16 | #define API_HAL_RET_VALUE_SERVICE_UNKNWON 0xFFFFFFFF | ||
17 | |||
18 | /* HAL API error codes */ | ||
19 | #define API_HAL_RET_VALUE_OK 0x00 | ||
20 | #define API_HAL_RET_VALUE_FAIL 0x01 | ||
21 | |||
22 | /* Secure HAL API flags */ | ||
23 | #define FLAG_START_CRITICAL 0x4 | ||
24 | #define FLAG_IRQFIQ_MASK 0x3 | ||
25 | #define FLAG_IRQ_ENABLE 0x2 | ||
26 | #define FLAG_FIQ_ENABLE 0x1 | ||
27 | #define NO_FLAG 0x0 | ||
28 | |||
29 | |||
30 | /* Secure low power HAL API index */ | ||
31 | #define OMAP4_HAL_SAVESECURERAM_INDEX 0x1a | ||
32 | #define OMAP4_HAL_SAVEHW_INDEX 0x1b | ||
33 | #define OMAP4_HAL_SAVEALL_INDEX 0x1c | ||
34 | #define OMAP4_HAL_SAVEGIC_INDEX 0x1d | ||
35 | |||
36 | extern u32 omap_secure_dispatcher(u32 idx, u32 flag, u32 nargs, | ||
37 | u32 arg1, u32 arg2, u32 arg3, u32 arg4); | ||
38 | extern u32 omap_smc2(u32 id, u32 falg, u32 pargs); | ||
39 | |||
40 | #endif /* OMAP_ARCH_OMAP_SECURE_H */ | ||
diff --git a/arch/arm/mach-omap2/omap-secure.c b/arch/arm/mach-omap2/omap-secure.c new file mode 100644 index 000000000000..e5a606e59b1e --- /dev/null +++ b/arch/arm/mach-omap2/omap-secure.c | |||
@@ -0,0 +1,52 @@ | |||
1 | /* | ||
2 | * OMAP Secure API infrastructure. | ||
3 | * | ||
4 | * Copyright (C) 2011 Texas Instruments, Inc. | ||
5 | * Santosh Shilimkar <santosh.shilimkar@ti.com> | ||
6 | * | ||
7 | * | ||
8 | * This program is free software,you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | #include <linux/kernel.h> | ||
14 | #include <linux/init.h> | ||
15 | #include <linux/io.h> | ||
16 | |||
17 | #include <asm/cacheflush.h> | ||
18 | |||
19 | #include <mach/omap-secure.h> | ||
20 | |||
21 | /** | ||
22 | * omap_sec_dispatcher: Routine to dispatch low power secure | ||
23 | * service routines | ||
24 | * @idx: The HAL API index | ||
25 | * @flag: The flag indicating criticality of operation | ||
26 | * @nargs: Number of valid arguments out of four. | ||
27 | * @arg1, arg2, arg3 args4: Parameters passed to secure API | ||
28 | * | ||
29 | * Return the non-zero error value on failure. | ||
30 | */ | ||
31 | u32 omap_secure_dispatcher(u32 idx, u32 flag, u32 nargs, u32 arg1, u32 arg2, | ||
32 | u32 arg3, u32 arg4) | ||
33 | { | ||
34 | u32 ret; | ||
35 | u32 param[5]; | ||
36 | |||
37 | param[0] = nargs; | ||
38 | param[1] = arg1; | ||
39 | param[2] = arg2; | ||
40 | param[3] = arg3; | ||
41 | param[4] = arg4; | ||
42 | |||
43 | /* | ||
44 | * Secure API needs physical address | ||
45 | * pointer for the parameters | ||
46 | */ | ||
47 | flush_cache_all(); | ||
48 | outer_clean_range(__pa(param), __pa(param + 5)); | ||
49 | ret = omap_smc2(idx, flag, __pa(param)); | ||
50 | |||
51 | return ret; | ||
52 | } | ||
diff --git a/arch/arm/mach-omap2/omap44xx-smc.S b/arch/arm/mach-omap2/omap-smc.S index e69d37d95204..f6441c13cd8c 100644 --- a/arch/arm/mach-omap2/omap44xx-smc.S +++ b/arch/arm/mach-omap2/omap-smc.S | |||
@@ -31,6 +31,29 @@ ENTRY(omap_smc1) | |||
31 | ldmfd sp!, {r2-r12, pc} | 31 | ldmfd sp!, {r2-r12, pc} |
32 | ENDPROC(omap_smc1) | 32 | ENDPROC(omap_smc1) |
33 | 33 | ||
34 | /** | ||
35 | * u32 omap_smc2(u32 id, u32 falg, u32 pargs) | ||
36 | * Low level common routine for secure HAL and PPA APIs. | ||
37 | * @id: Application ID of HAL APIs | ||
38 | * @flag: Flag to indicate the criticality of operation | ||
39 | * @pargs: Physical address of parameter list starting | ||
40 | * with number of parametrs | ||
41 | */ | ||
42 | ENTRY(omap_smc2) | ||
43 | stmfd sp!, {r4-r12, lr} | ||
44 | mov r3, r2 | ||
45 | mov r2, r1 | ||
46 | mov r1, #0x0 @ Process ID | ||
47 | mov r6, #0xff | ||
48 | mov r12, #0x00 @ Secure Service ID | ||
49 | mov r7, #0 | ||
50 | mcr p15, 0, r7, c7, c5, 6 | ||
51 | dsb | ||
52 | dmb | ||
53 | smc #0 | ||
54 | ldmfd sp!, {r4-r12, pc} | ||
55 | ENDPROC(omap_smc2) | ||
56 | |||
34 | ENTRY(omap_modify_auxcoreboot0) | 57 | ENTRY(omap_modify_auxcoreboot0) |
35 | stmfd sp!, {r1-r12, lr} | 58 | stmfd sp!, {r1-r12, lr} |
36 | ldr r12, =0x104 | 59 | ldr r12, =0x104 |