xref: /openbmc/u-boot/arch/arm/cpu/armv7/psci.S (revision 2ae23a28)
1ecf07a79SMarc Zyngier/*
2ecf07a79SMarc Zyngier * Copyright (C) 2013,2014 - ARM Ltd
3ecf07a79SMarc Zyngier * Author: Marc Zyngier <marc.zyngier@arm.com>
4ecf07a79SMarc Zyngier *
5ecf07a79SMarc Zyngier * This program is free software; you can redistribute it and/or modify
6ecf07a79SMarc Zyngier * it under the terms of the GNU General Public License version 2 as
7ecf07a79SMarc Zyngier * published by the Free Software Foundation.
8ecf07a79SMarc Zyngier *
9ecf07a79SMarc Zyngier * This program is distributed in the hope that it will be useful,
10ecf07a79SMarc Zyngier * but WITHOUT ANY WARRANTY; without even the implied warranty of
11ecf07a79SMarc Zyngier * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12ecf07a79SMarc Zyngier * GNU General Public License for more details.
13ecf07a79SMarc Zyngier *
14ecf07a79SMarc Zyngier * You should have received a copy of the GNU General Public License
15ecf07a79SMarc Zyngier * along with this program.  If not, see <http://www.gnu.org/licenses/>.
16ecf07a79SMarc Zyngier */
17ecf07a79SMarc Zyngier
18ecf07a79SMarc Zyngier#include <config.h>
19ecf07a79SMarc Zyngier#include <linux/linkage.h>
203317b988SJan Kiszka#include <asm/macro.h>
21ecf07a79SMarc Zyngier#include <asm/psci.h>
22ecf07a79SMarc Zyngier
23ecf07a79SMarc Zyngier	.pushsection ._secure.text, "ax"
24ecf07a79SMarc Zyngier
25ecf07a79SMarc Zyngier	.arch_extension	sec
26ecf07a79SMarc Zyngier
27ecf07a79SMarc Zyngier	.align	5
28ecf07a79SMarc Zyngier	.globl _psci_vectors
29ecf07a79SMarc Zyngier_psci_vectors:
30ecf07a79SMarc Zyngier	b	default_psci_vector	@ reset
31ecf07a79SMarc Zyngier	b	default_psci_vector	@ undef
32ecf07a79SMarc Zyngier	b	_smc_psci		@ smc
33ecf07a79SMarc Zyngier	b	default_psci_vector	@ pabort
34ecf07a79SMarc Zyngier	b	default_psci_vector	@ dabort
35ecf07a79SMarc Zyngier	b	default_psci_vector	@ hyp
36ecf07a79SMarc Zyngier	b	default_psci_vector	@ irq
37ecf07a79SMarc Zyngier	b	psci_fiq_enter		@ fiq
38ecf07a79SMarc Zyngier
39ecf07a79SMarc ZyngierENTRY(psci_fiq_enter)
40ecf07a79SMarc Zyngier	movs	pc, lr
41ecf07a79SMarc ZyngierENDPROC(psci_fiq_enter)
42ecf07a79SMarc Zyngier.weak psci_fiq_enter
43ecf07a79SMarc Zyngier
44ecf07a79SMarc ZyngierENTRY(default_psci_vector)
45ecf07a79SMarc Zyngier	movs	pc, lr
46ecf07a79SMarc ZyngierENDPROC(default_psci_vector)
47ecf07a79SMarc Zyngier.weak default_psci_vector
48ecf07a79SMarc Zyngier
49116339d4SHongbo ZhangENTRY(psci_version)
50ecf07a79SMarc ZyngierENTRY(psci_cpu_suspend)
51ecf07a79SMarc ZyngierENTRY(psci_cpu_off)
52ecf07a79SMarc ZyngierENTRY(psci_cpu_on)
53116339d4SHongbo ZhangENTRY(psci_affinity_info)
54ecf07a79SMarc ZyngierENTRY(psci_migrate)
55116339d4SHongbo ZhangENTRY(psci_migrate_info_type)
56116339d4SHongbo ZhangENTRY(psci_migrate_info_up_cpu)
57116339d4SHongbo ZhangENTRY(psci_system_off)
58116339d4SHongbo ZhangENTRY(psci_system_reset)
59116339d4SHongbo ZhangENTRY(psci_features)
60116339d4SHongbo ZhangENTRY(psci_cpu_freeze)
61116339d4SHongbo ZhangENTRY(psci_cpu_default_suspend)
62116339d4SHongbo ZhangENTRY(psci_node_hw_state)
63116339d4SHongbo ZhangENTRY(psci_system_suspend)
64116339d4SHongbo ZhangENTRY(psci_set_suspend_mode)
65116339d4SHongbo ZhangENTRY(psi_stat_residency)
66116339d4SHongbo ZhangENTRY(psci_stat_count)
67ecf07a79SMarc Zyngier	mov	r0, #ARM_PSCI_RET_NI	@ Return -1 (Not Implemented)
68ecf07a79SMarc Zyngier	mov	pc, lr
69116339d4SHongbo ZhangENDPROC(psci_stat_count)
70116339d4SHongbo ZhangENDPROC(psi_stat_residency)
71116339d4SHongbo ZhangENDPROC(psci_set_suspend_mode)
72116339d4SHongbo ZhangENDPROC(psci_system_suspend)
73116339d4SHongbo ZhangENDPROC(psci_node_hw_state)
74116339d4SHongbo ZhangENDPROC(psci_cpu_default_suspend)
75116339d4SHongbo ZhangENDPROC(psci_cpu_freeze)
76116339d4SHongbo ZhangENDPROC(psci_features)
77116339d4SHongbo ZhangENDPROC(psci_system_reset)
78116339d4SHongbo ZhangENDPROC(psci_system_off)
79116339d4SHongbo ZhangENDPROC(psci_migrate_info_up_cpu)
80116339d4SHongbo ZhangENDPROC(psci_migrate_info_type)
81ecf07a79SMarc ZyngierENDPROC(psci_migrate)
82116339d4SHongbo ZhangENDPROC(psci_affinity_info)
83ecf07a79SMarc ZyngierENDPROC(psci_cpu_on)
84ecf07a79SMarc ZyngierENDPROC(psci_cpu_off)
85ecf07a79SMarc ZyngierENDPROC(psci_cpu_suspend)
86116339d4SHongbo ZhangENDPROC(psci_version)
87116339d4SHongbo Zhang.weak psci_version
88ecf07a79SMarc Zyngier.weak psci_cpu_suspend
89ecf07a79SMarc Zyngier.weak psci_cpu_off
90ecf07a79SMarc Zyngier.weak psci_cpu_on
91116339d4SHongbo Zhang.weak psci_affinity_info
92ecf07a79SMarc Zyngier.weak psci_migrate
93116339d4SHongbo Zhang.weak psci_migrate_info_type
94116339d4SHongbo Zhang.weak psci_migrate_info_up_cpu
95116339d4SHongbo Zhang.weak psci_system_off
96116339d4SHongbo Zhang.weak psci_system_reset
97116339d4SHongbo Zhang.weak psci_features
98116339d4SHongbo Zhang.weak psci_cpu_freeze
99116339d4SHongbo Zhang.weak psci_cpu_default_suspend
100116339d4SHongbo Zhang.weak psci_node_hw_state
101116339d4SHongbo Zhang.weak psci_system_suspend
102116339d4SHongbo Zhang.weak psci_set_suspend_mode
103116339d4SHongbo Zhang.weak psi_stat_residency
104116339d4SHongbo Zhang.weak psci_stat_count
105ecf07a79SMarc Zyngier
106ecf07a79SMarc Zyngier_psci_table:
107ecf07a79SMarc Zyngier	.word	ARM_PSCI_FN_CPU_SUSPEND
108ecf07a79SMarc Zyngier	.word	psci_cpu_suspend
109ecf07a79SMarc Zyngier	.word	ARM_PSCI_FN_CPU_OFF
110ecf07a79SMarc Zyngier	.word	psci_cpu_off
111ecf07a79SMarc Zyngier	.word	ARM_PSCI_FN_CPU_ON
112ecf07a79SMarc Zyngier	.word	psci_cpu_on
113ecf07a79SMarc Zyngier	.word	ARM_PSCI_FN_MIGRATE
114ecf07a79SMarc Zyngier	.word	psci_migrate
115116339d4SHongbo Zhang	.word	ARM_PSCI_0_2_FN_PSCI_VERSION
116116339d4SHongbo Zhang	.word	psci_version
117116339d4SHongbo Zhang	.word	ARM_PSCI_0_2_FN_CPU_SUSPEND
118116339d4SHongbo Zhang	.word	psci_cpu_suspend
119116339d4SHongbo Zhang	.word	ARM_PSCI_0_2_FN_CPU_OFF
120116339d4SHongbo Zhang	.word	psci_cpu_off
121116339d4SHongbo Zhang	.word	ARM_PSCI_0_2_FN_CPU_ON
122116339d4SHongbo Zhang	.word	psci_cpu_on
123116339d4SHongbo Zhang	.word	ARM_PSCI_0_2_FN_AFFINITY_INFO
124116339d4SHongbo Zhang	.word	psci_affinity_info
125116339d4SHongbo Zhang	.word	ARM_PSCI_0_2_FN_MIGRATE
126116339d4SHongbo Zhang	.word	psci_migrate
127116339d4SHongbo Zhang	.word	ARM_PSCI_0_2_FN_MIGRATE_INFO_TYPE
128116339d4SHongbo Zhang	.word	psci_migrate_info_type
129116339d4SHongbo Zhang	.word	ARM_PSCI_0_2_FN_MIGRATE_INFO_UP_CPU
130116339d4SHongbo Zhang	.word	psci_migrate_info_up_cpu
131116339d4SHongbo Zhang	.word	ARM_PSCI_0_2_FN_SYSTEM_OFF
132116339d4SHongbo Zhang	.word	psci_system_off
133116339d4SHongbo Zhang	.word	ARM_PSCI_0_2_FN_SYSTEM_RESET
134116339d4SHongbo Zhang	.word	psci_system_reset
135116339d4SHongbo Zhang	.word	ARM_PSCI_1_0_FN_PSCI_FEATURES
136116339d4SHongbo Zhang	.word	psci_features
137116339d4SHongbo Zhang	.word	ARM_PSCI_1_0_FN_CPU_FREEZE
138116339d4SHongbo Zhang	.word	psci_cpu_freeze
139116339d4SHongbo Zhang	.word	ARM_PSCI_1_0_FN_CPU_DEFAULT_SUSPEND
140116339d4SHongbo Zhang	.word	psci_cpu_default_suspend
141116339d4SHongbo Zhang	.word	ARM_PSCI_1_0_FN_NODE_HW_STATE
142116339d4SHongbo Zhang	.word	psci_node_hw_state
143116339d4SHongbo Zhang	.word	ARM_PSCI_1_0_FN_SYSTEM_SUSPEND
144116339d4SHongbo Zhang	.word	psci_system_suspend
145116339d4SHongbo Zhang	.word	ARM_PSCI_1_0_FN_SET_SUSPEND_MODE
146116339d4SHongbo Zhang	.word	psci_set_suspend_mode
147116339d4SHongbo Zhang	.word	ARM_PSCI_1_0_FN_STAT_RESIDENCY
148116339d4SHongbo Zhang	.word	psi_stat_residency
149116339d4SHongbo Zhang	.word	ARM_PSCI_1_0_FN_STAT_COUNT
150116339d4SHongbo Zhang	.word	psci_stat_count
151ecf07a79SMarc Zyngier	.word	0
152ecf07a79SMarc Zyngier	.word	0
153ecf07a79SMarc Zyngier
154ecf07a79SMarc Zyngier_smc_psci:
155ecf07a79SMarc Zyngier	push	{r4-r7,lr}
156ecf07a79SMarc Zyngier
157ecf07a79SMarc Zyngier	@ Switch to secure
158ecf07a79SMarc Zyngier	mrc	p15, 0, r7, c1, c1, 0
159ecf07a79SMarc Zyngier	bic	r4, r7, #1
160ecf07a79SMarc Zyngier	mcr	p15, 0, r4, c1, c1, 0
161ecf07a79SMarc Zyngier	isb
162ecf07a79SMarc Zyngier
163ecf07a79SMarc Zyngier	adr	r4, _psci_table
164ecf07a79SMarc Zyngier1:	ldr	r5, [r4]		@ Load PSCI function ID
165ecf07a79SMarc Zyngier	ldr	r6, [r4, #4]		@ Load target PC
166ecf07a79SMarc Zyngier	cmp	r5, #0			@ If reach the end, bail out
167ecf07a79SMarc Zyngier	moveq	r0, #ARM_PSCI_RET_INVAL	@ Return -2 (Invalid)
168ecf07a79SMarc Zyngier	beq	2f
169ecf07a79SMarc Zyngier	cmp	r0, r5			@ If not matching, try next entry
170ecf07a79SMarc Zyngier	addne	r4, r4, #8
171ecf07a79SMarc Zyngier	bne	1b
172ecf07a79SMarc Zyngier
173ecf07a79SMarc Zyngier	blx	r6			@ Execute PSCI function
174ecf07a79SMarc Zyngier
175ecf07a79SMarc Zyngier	@ Switch back to non-secure
176ecf07a79SMarc Zyngier2:	mcr	p15, 0, r7, c1, c1, 0
177ecf07a79SMarc Zyngier
178ecf07a79SMarc Zyngier	pop	{r4-r7, lr}
179ecf07a79SMarc Zyngier	movs	pc, lr			@ Return to the kernel
180ecf07a79SMarc Zyngier
181680f3968SJan Kiszka@ Requires dense and single-cluster CPU ID space
182680f3968SJan KiszkaENTRY(psci_get_cpu_id)
183680f3968SJan Kiszka	mrc	p15, 0, r0, c0, c0, 5	/* read MPIDR */
184680f3968SJan Kiszka	and	r0, r0, #0xff		/* return CPU ID in cluster */
185680f3968SJan Kiszka	bx	lr
186680f3968SJan KiszkaENDPROC(psci_get_cpu_id)
187680f3968SJan Kiszka.weak psci_get_cpu_id
188680f3968SJan Kiszka
189b0206e7dSJan Kiszka/* Imported from Linux kernel */
190d38def1fSHongbo ZhangENTRY(psci_v7_flush_dcache_all)
191778dc5f4SChen-Yu Tsai	stmfd	sp!, {r4-r5, r7, r9-r11, lr}
192b0206e7dSJan Kiszka	dmb					@ ensure ordering with previous memory accesses
193b0206e7dSJan Kiszka	mrc	p15, 1, r0, c0, c0, 1		@ read clidr
194b0206e7dSJan Kiszka	ands	r3, r0, #0x7000000		@ extract loc from clidr
195b0206e7dSJan Kiszka	mov	r3, r3, lsr #23			@ left align loc bit field
196b0206e7dSJan Kiszka	beq	finished			@ if loc is 0, then no need to clean
197b0206e7dSJan Kiszka	mov	r10, #0				@ start clean at cache level 0
198b0206e7dSJan Kiszkaflush_levels:
199b0206e7dSJan Kiszka	add	r2, r10, r10, lsr #1		@ work out 3x current cache level
200b0206e7dSJan Kiszka	mov	r1, r0, lsr r2			@ extract cache type bits from clidr
201b0206e7dSJan Kiszka	and	r1, r1, #7			@ mask of the bits for current cache only
202b0206e7dSJan Kiszka	cmp	r1, #2				@ see what cache we have at this level
203b0206e7dSJan Kiszka	blt	skip				@ skip if no cache, or just i-cache
204b0206e7dSJan Kiszka	mrs     r9, cpsr			@ make cssr&csidr read atomic
205b0206e7dSJan Kiszka	mcr	p15, 2, r10, c0, c0, 0		@ select current cache level in cssr
206b0206e7dSJan Kiszka	isb					@ isb to sych the new cssr&csidr
207b0206e7dSJan Kiszka	mrc	p15, 1, r1, c0, c0, 0		@ read the new csidr
208b0206e7dSJan Kiszka	msr     cpsr_c, r9
209b0206e7dSJan Kiszka	and	r2, r1, #7			@ extract the length of the cache lines
210b0206e7dSJan Kiszka	add	r2, r2, #4			@ add 4 (line length offset)
211b0206e7dSJan Kiszka	ldr	r4, =0x3ff
212b0206e7dSJan Kiszka	ands	r4, r4, r1, lsr #3		@ find maximum number on the way size
213b0206e7dSJan Kiszka	clz	r5, r4				@ find bit position of way size increment
214b0206e7dSJan Kiszka	ldr	r7, =0x7fff
215b0206e7dSJan Kiszka	ands	r7, r7, r1, lsr #13		@ extract max number of the index size
216b0206e7dSJan Kiszkaloop1:
217b0206e7dSJan Kiszka	mov	r9, r7				@ create working copy of max index
218b0206e7dSJan Kiszkaloop2:
219b0206e7dSJan Kiszka	orr	r11, r10, r4, lsl r5		@ factor way and cache number into r11
220b0206e7dSJan Kiszka	orr	r11, r11, r9, lsl r2		@ factor index number into r11
221b0206e7dSJan Kiszka	mcr	p15, 0, r11, c7, c14, 2		@ clean & invalidate by set/way
222b0206e7dSJan Kiszka	subs	r9, r9, #1			@ decrement the index
223b0206e7dSJan Kiszka	bge	loop2
224b0206e7dSJan Kiszka	subs	r4, r4, #1			@ decrement the way
225b0206e7dSJan Kiszka	bge	loop1
226b0206e7dSJan Kiszkaskip:
227b0206e7dSJan Kiszka	add	r10, r10, #2			@ increment cache number
228b0206e7dSJan Kiszka	cmp	r3, r10
229b0206e7dSJan Kiszka	bgt	flush_levels
230b0206e7dSJan Kiszkafinished:
231b0206e7dSJan Kiszka	mov	r10, #0				@ swith back to cache level 0
232b0206e7dSJan Kiszka	mcr	p15, 2, r10, c0, c0, 0		@ select current cache level in cssr
233b0206e7dSJan Kiszka	dsb	st
234b0206e7dSJan Kiszka	isb
235778dc5f4SChen-Yu Tsai	ldmfd	sp!, {r4-r5, r7, r9-r11, lr}
236b0206e7dSJan Kiszka	bx	lr
237d38def1fSHongbo ZhangENDPROC(psci_v7_flush_dcache_all)
238b0206e7dSJan Kiszka
239b0206e7dSJan KiszkaENTRY(psci_disable_smp)
240b0206e7dSJan Kiszka	mrc	p15, 0, r0, c1, c0, 1		@ ACTLR
241b0206e7dSJan Kiszka	bic	r0, r0, #(1 << 6)		@ Clear SMP bit
242b0206e7dSJan Kiszka	mcr	p15, 0, r0, c1, c0, 1		@ ACTLR
243b0206e7dSJan Kiszka	isb
244b0206e7dSJan Kiszka	dsb
245b0206e7dSJan Kiszka	bx	lr
246b0206e7dSJan KiszkaENDPROC(psci_disable_smp)
247b0206e7dSJan Kiszka.weak psci_disable_smp
248b0206e7dSJan Kiszka
2494ce4de1eSJan KiszkaENTRY(psci_enable_smp)
2504ce4de1eSJan Kiszka	mrc	p15, 0, r0, c1, c0, 1		@ ACTLR
2514ce4de1eSJan Kiszka	orr	r0, r0, #(1 << 6)		@ Set SMP bit
2524ce4de1eSJan Kiszka	mcr	p15, 0, r0, c1, c0, 1		@ ACTLR
2534ce4de1eSJan Kiszka	isb
2544ce4de1eSJan Kiszka	bx	lr
2554ce4de1eSJan KiszkaENDPROC(psci_enable_smp)
2564ce4de1eSJan Kiszka.weak psci_enable_smp
2574ce4de1eSJan Kiszka
258b0206e7dSJan KiszkaENTRY(psci_cpu_off_common)
259b0206e7dSJan Kiszka	push	{lr}
260b0206e7dSJan Kiszka
261fea7452cSPeng Fan	bl	psci_v7_flush_dcache_all
262fea7452cSPeng Fan
263fea7452cSPeng Fan	clrex					@ Why???
264fea7452cSPeng Fan
265b0206e7dSJan Kiszka	mrc	p15, 0, r0, c1, c0, 0		@ SCTLR
266b0206e7dSJan Kiszka	bic	r0, r0, #(1 << 2)		@ Clear C bit
267b0206e7dSJan Kiszka	mcr	p15, 0, r0, c1, c0, 0		@ SCTLR
268b0206e7dSJan Kiszka	isb
269b0206e7dSJan Kiszka	dsb
270b0206e7dSJan Kiszka
271d38def1fSHongbo Zhang	bl	psci_v7_flush_dcache_all
272b0206e7dSJan Kiszka
273b0206e7dSJan Kiszka	clrex					@ Why???
274b0206e7dSJan Kiszka
275b0206e7dSJan Kiszka	bl	psci_disable_smp
276b0206e7dSJan Kiszka
277b0206e7dSJan Kiszka	pop	{lr}
278b0206e7dSJan Kiszka	bx	lr
279b0206e7dSJan KiszkaENDPROC(psci_cpu_off_common)
280b0206e7dSJan Kiszka
2818c0ef7faSChen-Yu Tsai@ The stacks are allocated in reverse order, i.e.
2828c0ef7faSChen-Yu Tsai@ the stack for CPU0 has the highest memory address.
2838c0ef7faSChen-Yu Tsai@
2848c0ef7faSChen-Yu Tsai@ --------------------  __secure_stack_end
2858c0ef7faSChen-Yu Tsai@ |  CPU0 target PC  |
2868c0ef7faSChen-Yu Tsai@ |------------------|
2878c0ef7faSChen-Yu Tsai@ |                  |
2888c0ef7faSChen-Yu Tsai@ |    CPU0 stack    |
2898c0ef7faSChen-Yu Tsai@ |                  |
2908c0ef7faSChen-Yu Tsai@ |------------------|  __secure_stack_end - 1KB
2918c0ef7faSChen-Yu Tsai@ |        .         |
2928c0ef7faSChen-Yu Tsai@ |        .         |
2938c0ef7faSChen-Yu Tsai@ |        .         |
2948c0ef7faSChen-Yu Tsai@ |        .         |
2958c0ef7faSChen-Yu Tsai@ --------------------  __secure_stack_start
2968c0ef7faSChen-Yu Tsai@
2978c0ef7faSChen-Yu Tsai@ This expects CPU ID in r0 and returns stack top in r0
298b7073965SChen-Yu TsaiLENTRY(psci_get_cpu_stack_top)
2998c0ef7faSChen-Yu Tsai	@ stack top = __secure_stack_end - (cpuid << ARM_PSCI_STACK_SHIFT)
3008c0ef7faSChen-Yu Tsai	ldr	r3, =__secure_stack_end
3018c0ef7faSChen-Yu Tsai	sub	r0, r3, r0, LSL #ARM_PSCI_STACK_SHIFT
3028c0ef7faSChen-Yu Tsai	sub	r0, r0, #4		@ Save space for target PC
3034c681a3dSJan Kiszka	bx	lr
3044c681a3dSJan KiszkaENDPROC(psci_get_cpu_stack_top)
3054c681a3dSJan Kiszka
306b5281323SChen-Yu Tsai@ {r0, r1, r2, ip} from _do_nonsec_entry(kernel_entry, 0, machid, r2) in
307b5281323SChen-Yu Tsai@ arch/arm/lib/bootm.c:boot_jump_linux() must remain unchanged across
308b5281323SChen-Yu Tsai@ this function.
309b5281323SChen-Yu TsaiENTRY(psci_stack_setup)
310b5281323SChen-Yu Tsai	mov	r6, lr
311b5281323SChen-Yu Tsai	mov	r7, r0
312b5281323SChen-Yu Tsai	bl	psci_get_cpu_id		@ CPU ID => r0
313b5281323SChen-Yu Tsai	bl	psci_get_cpu_stack_top	@ stack top => r0
314b5281323SChen-Yu Tsai	mov	sp, r0
315b5281323SChen-Yu Tsai	mov	r0, r7
316b5281323SChen-Yu Tsai	bx	r6
317b5281323SChen-Yu TsaiENDPROC(psci_stack_setup)
318b5281323SChen-Yu Tsai
319b5281323SChen-Yu TsaiENTRY(psci_arch_init)
320b5281323SChen-Yu Tsai	mov	pc, lr
321b5281323SChen-Yu TsaiENDPROC(psci_arch_init)
322b5281323SChen-Yu Tsai.weak psci_arch_init
323b5281323SChen-Yu Tsai
324486daaa6SPatrick DelaunayENTRY(psci_arch_cpu_entry)
325486daaa6SPatrick Delaunay	mov	pc, lr
326486daaa6SPatrick DelaunayENDPROC(psci_arch_cpu_entry)
327486daaa6SPatrick Delaunay.weak psci_arch_cpu_entry
328486daaa6SPatrick Delaunay
3294ce4de1eSJan KiszkaENTRY(psci_cpu_entry)
3304ce4de1eSJan Kiszka	bl	psci_enable_smp
3314ce4de1eSJan Kiszka
3324ce4de1eSJan Kiszka	bl	_nonsec_init
3334ce4de1eSJan Kiszka
334*77fcc2ccSStefan Agner	bl	psci_stack_setup
335*77fcc2ccSStefan Agner
336486daaa6SPatrick Delaunay	bl	psci_arch_cpu_entry
337486daaa6SPatrick Delaunay
3383317b988SJan Kiszka	bl	psci_get_cpu_id			@ CPU ID => r0
3391a047c23SPatrick Delaunay	mov	r2, r0				@ CPU ID => r2
3401a047c23SPatrick Delaunay	bl	psci_get_context_id		@ context id => r0
3411a047c23SPatrick Delaunay	mov	r1, r0				@ context id => r1
3421a047c23SPatrick Delaunay	mov	r0, r2				@ CPU ID => r0
3436e6622deSChen-Yu Tsai	bl	psci_get_target_pc		@ target PC => r0
3444ce4de1eSJan Kiszka	b	_do_nonsec_entry
3454ce4de1eSJan KiszkaENDPROC(psci_cpu_entry)
3464ce4de1eSJan Kiszka
347ecf07a79SMarc Zyngier	.popsection
348