xref: /rk3399_rockchip-uboot/arch/arm/mach-omap2/omap5/sec_entry_cpu1.S (revision 4c158b9a7d05973e6924835726a2358b383d622f)
1*4c158b9aSHarinarayan Bhatta/*
2*4c158b9aSHarinarayan Bhatta * Secure entry function for CPU Core #1
3*4c158b9aSHarinarayan Bhatta *
4*4c158b9aSHarinarayan Bhatta * (C) Copyright 2016
5*4c158b9aSHarinarayan Bhatta * Texas Instruments, <www.ti.com>
6*4c158b9aSHarinarayan Bhatta *
7*4c158b9aSHarinarayan Bhatta * Author :
8*4c158b9aSHarinarayan Bhatta *	Harinarayan Bhatta <harinarayan@ti.com>
9*4c158b9aSHarinarayan Bhatta *
10*4c158b9aSHarinarayan Bhatta * SPDX-License-Identifier:	GPL-2.0+
11*4c158b9aSHarinarayan Bhatta */
12*4c158b9aSHarinarayan Bhatta
13*4c158b9aSHarinarayan Bhatta#include <config.h>
14*4c158b9aSHarinarayan Bhatta#include <asm/arch/omap.h>
15*4c158b9aSHarinarayan Bhatta#include <asm/omap_common.h>
16*4c158b9aSHarinarayan Bhatta#include <linux/linkage.h>
17*4c158b9aSHarinarayan Bhatta
18*4c158b9aSHarinarayan Bhatta.arch_extension sec
19*4c158b9aSHarinarayan Bhatta
20*4c158b9aSHarinarayan Bhatta#if !defined(CONFIG_SYS_DCACHE_OFF)
21*4c158b9aSHarinarayan Bhatta.global flush_dcache_range
22*4c158b9aSHarinarayan Bhatta#endif
23*4c158b9aSHarinarayan Bhatta
24*4c158b9aSHarinarayan Bhatta#define AUX_CORE_BOOT_0		0x48281800
25*4c158b9aSHarinarayan Bhatta#define AUX_CORE_BOOT_1		0x48281804
26*4c158b9aSHarinarayan Bhatta
27*4c158b9aSHarinarayan Bhatta#ifdef CONFIG_DRA7XX
28*4c158b9aSHarinarayan Bhatta/* DRA7xx ROM code function "startup_BootSlave". This function is where CPU1
29*4c158b9aSHarinarayan Bhatta * waits on WFE, polling on AUX_CORE_BOOT_x registers.
30*4c158b9aSHarinarayan Bhatta * This address is same for J6 and J6 Eco.
31*4c158b9aSHarinarayan Bhatta */
32*4c158b9aSHarinarayan Bhatta#define ROM_FXN_STARTUP_BOOTSLAVE     0x00038a64
33*4c158b9aSHarinarayan Bhatta#endif
34*4c158b9aSHarinarayan Bhatta
35*4c158b9aSHarinarayan Bhatta/* Assembly core where CPU1 is woken up into
36*4c158b9aSHarinarayan Bhatta * No need to save-restore registers, does not use stack.
37*4c158b9aSHarinarayan Bhatta */
38*4c158b9aSHarinarayan BhattaLENTRY(cpu1_entry)
39*4c158b9aSHarinarayan Bhatta	ldr	r4, =omap_smc_sec_cpu1_args
40*4c158b9aSHarinarayan Bhatta	ldm	r4, {r0,r1,r2,r3}	@ Retrieve args
41*4c158b9aSHarinarayan Bhatta
42*4c158b9aSHarinarayan Bhatta	mov	r6, #0xFF	@ Indicate new Task call
43*4c158b9aSHarinarayan Bhatta	mov	r12, #0x00	@ Secure Service ID in R12
44*4c158b9aSHarinarayan Bhatta
45*4c158b9aSHarinarayan Bhatta	dsb
46*4c158b9aSHarinarayan Bhatta	dmb
47*4c158b9aSHarinarayan Bhatta	smc	0		@ SMC #0 to enter monitor mode
48*4c158b9aSHarinarayan Bhatta
49*4c158b9aSHarinarayan Bhatta	b	.Lend		@ exit at end of the service execution
50*4c158b9aSHarinarayan Bhatta	nop
51*4c158b9aSHarinarayan Bhatta
52*4c158b9aSHarinarayan Bhatta	@ In case of IRQ happening in Secure, then ARM will branch here.
53*4c158b9aSHarinarayan Bhatta	@ At that moment, IRQ will be pending and ARM will jump to Non Secure
54*4c158b9aSHarinarayan Bhatta	@ IRQ handler
55*4c158b9aSHarinarayan Bhatta	mov	r12, #0xFE
56*4c158b9aSHarinarayan Bhatta
57*4c158b9aSHarinarayan Bhatta	dsb
58*4c158b9aSHarinarayan Bhatta	dmb
59*4c158b9aSHarinarayan Bhatta	smc	0		@ SMC #0 to enter monitor mode
60*4c158b9aSHarinarayan Bhatta
61*4c158b9aSHarinarayan Bhatta.Lend:
62*4c158b9aSHarinarayan Bhatta	ldr	r4, =omap_smc_sec_cpu1_args
63*4c158b9aSHarinarayan Bhatta	str	r0, [r4, #0x10]		@ save return value
64*4c158b9aSHarinarayan Bhatta	ldr	r4, =AUX_CORE_BOOT_0
65*4c158b9aSHarinarayan Bhatta	mov	r5, #0x0
66*4c158b9aSHarinarayan Bhatta	str	r5, [r4]
67*4c158b9aSHarinarayan Bhatta	ldr	r4, =ROM_FXN_STARTUP_BOOTSLAVE
68*4c158b9aSHarinarayan Bhatta	sev				@ Tell CPU0 we are done
69*4c158b9aSHarinarayan Bhatta	bx	r4			@ Jump back to ROM
70*4c158b9aSHarinarayan BhattaEND(cpu1_entry)
71*4c158b9aSHarinarayan Bhatta
72*4c158b9aSHarinarayan Bhatta/*
73*4c158b9aSHarinarayan Bhatta * u32 omap_smc_sec_cpu1(u32 service, u32 proc_id, u32 flag, u32 *params);
74*4c158b9aSHarinarayan Bhatta *
75*4c158b9aSHarinarayan Bhatta * Makes a secure ROM/PPA call on CPU Core #1 on supported platforms.
76*4c158b9aSHarinarayan Bhatta * Assumes that CPU #1 is waiting in ROM code and not yet woken up or used by
77*4c158b9aSHarinarayan Bhatta * u-boot.
78*4c158b9aSHarinarayan Bhatta */
79*4c158b9aSHarinarayan BhattaENTRY(omap_smc_sec_cpu1)
80*4c158b9aSHarinarayan Bhatta	push	{r4, r5, lr}
81*4c158b9aSHarinarayan Bhatta	ldr	r4, =omap_smc_sec_cpu1_args
82*4c158b9aSHarinarayan Bhatta	stm	r4, {r0,r1,r2,r3}	@ Save args to memory
83*4c158b9aSHarinarayan Bhatta#if !defined(CONFIG_SYS_DCACHE_OFF)
84*4c158b9aSHarinarayan Bhatta	mov	r0, r4
85*4c158b9aSHarinarayan Bhatta	mov	r1, #CONFIG_SYS_CACHELINE_SIZE
86*4c158b9aSHarinarayan Bhatta	add	r1, r0, r1		@ dcache is not enabled on CPU1, so
87*4c158b9aSHarinarayan Bhatta	blx	flush_dcache_range	@ flush the cache on args buffer
88*4c158b9aSHarinarayan Bhatta#endif
89*4c158b9aSHarinarayan Bhatta	ldr	r4, =AUX_CORE_BOOT_1
90*4c158b9aSHarinarayan Bhatta	ldr	r5, =cpu1_entry
91*4c158b9aSHarinarayan Bhatta	str	r5, [r4]		@ Setup CPU1 entry function
92*4c158b9aSHarinarayan Bhatta	ldr	r4, =AUX_CORE_BOOT_0
93*4c158b9aSHarinarayan Bhatta	mov	r5, #0x10
94*4c158b9aSHarinarayan Bhatta	str	r5, [r4]		@ Tell ROM to exit while loop
95*4c158b9aSHarinarayan Bhatta	sev				@ Wake up CPU1
96*4c158b9aSHarinarayan Bhatta.Lwait:
97*4c158b9aSHarinarayan Bhatta	wfe				@ Wait for CPU1 to finish
98*4c158b9aSHarinarayan Bhatta	nop
99*4c158b9aSHarinarayan Bhatta	ldr	r5, [r4]		@ Check if CPU1 is done
100*4c158b9aSHarinarayan Bhatta	cmp	r5, #0
101*4c158b9aSHarinarayan Bhatta	bne	.Lwait
102*4c158b9aSHarinarayan Bhatta
103*4c158b9aSHarinarayan Bhatta	ldr	r4, =omap_smc_sec_cpu1_args
104*4c158b9aSHarinarayan Bhatta	ldr	r0, [r4, #0x10]         @ Retrieve return value
105*4c158b9aSHarinarayan Bhatta	pop	{r4, r5, pc}
106*4c158b9aSHarinarayan BhattaENDPROC(omap_smc_sec_cpu1)
107*4c158b9aSHarinarayan Bhatta
108*4c158b9aSHarinarayan Bhatta/*
109*4c158b9aSHarinarayan Bhatta * Buffer to save function arguments and return value for omap_smc_sec_cpu1
110*4c158b9aSHarinarayan Bhatta */
111*4c158b9aSHarinarayan Bhatta.section .data
112*4c158b9aSHarinarayan Bhattaomap_smc_sec_cpu1_args:
113*4c158b9aSHarinarayan Bhatta#if !defined(CONFIG_SYS_DCACHE_OFF)
114*4c158b9aSHarinarayan Bhatta	.balign CONFIG_SYS_CACHELINE_SIZE
115*4c158b9aSHarinarayan Bhatta	.rept  CONFIG_SYS_CACHELINE_SIZE/4
116*4c158b9aSHarinarayan Bhatta	.word 0
117*4c158b9aSHarinarayan Bhatta	.endr
118*4c158b9aSHarinarayan Bhatta#else
119*4c158b9aSHarinarayan Bhatta	.rept 5
120*4c158b9aSHarinarayan Bhatta	.word 0
121*4c158b9aSHarinarayan Bhatta	.endr
122*4c158b9aSHarinarayan Bhatta#endif
123*4c158b9aSHarinarayan BhattaEND(omap_smc_sec_cpu1_args)
124