xref: /rk3399_rockchip-uboot/arch/arm/cpu/armv8/start.S (revision 2f96fde52db8dd705f6c1efc8530684405024993)
10ae76531SDavid Feng/*
20ae76531SDavid Feng * (C) Copyright 2013
30ae76531SDavid Feng * David Feng <fenghua@phytium.com.cn>
40ae76531SDavid Feng *
50ae76531SDavid Feng * SPDX-License-Identifier:	GPL-2.0+
60ae76531SDavid Feng */
70ae76531SDavid Feng
80ae76531SDavid Feng#include <asm-offsets.h>
90ae76531SDavid Feng#include <config.h>
100ae76531SDavid Feng#include <linux/linkage.h>
110ae76531SDavid Feng#include <asm/macro.h>
120ae76531SDavid Feng#include <asm/armv8/mmu.h>
130ae76531SDavid Feng
140ae76531SDavid Feng/*************************************************************************
150ae76531SDavid Feng *
160ae76531SDavid Feng * Startup Code (reset vector)
170ae76531SDavid Feng *
180ae76531SDavid Feng *************************************************************************/
190ae76531SDavid Feng
200ae76531SDavid Feng.globl	_start
210ae76531SDavid Feng_start:
22cdaa633fSAndre Przywara#ifdef CONFIG_ENABLE_ARM_SOC_BOOT0_HOOK
23cdaa633fSAndre Przywara/*
24cdaa633fSAndre Przywara * Various SoCs need something special and SoC-specific up front in
25cdaa633fSAndre Przywara * order to boot, allow them to set that in their boot0.h file and then
26cdaa633fSAndre Przywara * use it here.
27cdaa633fSAndre Przywara */
28cdaa633fSAndre Przywara#include <asm/arch/boot0.h>
29a5168a59SAndre Przywara#else
30a5168a59SAndre Przywara	b	reset
31cdaa633fSAndre Przywara#endif
32cdaa633fSAndre Przywara
3337e5dcc8SYouMin Chen#if !CONFIG_IS_ENABLED(TINY_FRAMEWORK)
340ae76531SDavid Feng	.align 3
350ae76531SDavid Feng
360ae76531SDavid Feng.globl	_TEXT_BASE
370ae76531SDavid Feng_TEXT_BASE:
386184121cSAndy Yan#if defined(CONFIG_SPL_BUILD)
396184121cSAndy Yan	.quad   CONFIG_SPL_TEXT_BASE
406184121cSAndy Yan#else
410ae76531SDavid Feng	.quad	CONFIG_SYS_TEXT_BASE
426184121cSAndy Yan#endif
430ae76531SDavid Feng
440ae76531SDavid Feng/*
450ae76531SDavid Feng * These are defined in the linker script.
460ae76531SDavid Feng */
470ae76531SDavid Feng.globl	_end_ofs
480ae76531SDavid Feng_end_ofs:
490ae76531SDavid Feng	.quad	_end - _start
500ae76531SDavid Feng
510ae76531SDavid Feng.globl	_bss_start_ofs
520ae76531SDavid Feng_bss_start_ofs:
530ae76531SDavid Feng	.quad	__bss_start - _start
540ae76531SDavid Feng
550ae76531SDavid Feng.globl	_bss_end_ofs
560ae76531SDavid Feng_bss_end_ofs:
570ae76531SDavid Feng	.quad	__bss_end - _start
580ae76531SDavid Feng
590ae76531SDavid Fengreset:
600e2b5350SStephen Warren	/* Allow the board to save important registers */
610e2b5350SStephen Warren	b	save_boot_params
620e2b5350SStephen Warren.globl	save_boot_params_ret
630e2b5350SStephen Warrensave_boot_params_ret:
640e2b5350SStephen Warren
65f00ac1e5SStephen Warren#if CONFIG_POSITION_INDEPENDENT
66f00ac1e5SStephen Warren	/*
67f00ac1e5SStephen Warren	 * Fix .rela.dyn relocations. This allows U-Boot to be loaded to and
68f00ac1e5SStephen Warren	 * executed at a different address than it was linked at.
69f00ac1e5SStephen Warren	 */
70f00ac1e5SStephen Warrenpie_fixup:
71f00ac1e5SStephen Warren	adr	x0, _start		/* x0 <- Runtime value of _start */
72f00ac1e5SStephen Warren	ldr	x1, _TEXT_BASE		/* x1 <- Linked value of _start */
73f00ac1e5SStephen Warren	sub	x9, x0, x1		/* x9 <- Run-vs-link offset */
74f00ac1e5SStephen Warren	adr	x2, __rel_dyn_start	/* x2 <- Runtime &__rel_dyn_start */
75f00ac1e5SStephen Warren	adr	x3, __rel_dyn_end	/* x3 <- Runtime &__rel_dyn_end */
76f00ac1e5SStephen Warrenpie_fix_loop:
77f00ac1e5SStephen Warren	ldp	x0, x1, [x2], #16	/* (x0, x1) <- (Link location, fixup) */
78f00ac1e5SStephen Warren	ldr	x4, [x2], #8		/* x4 <- addend */
79f00ac1e5SStephen Warren	cmp	w1, #1027		/* relative fixup? */
80f00ac1e5SStephen Warren	bne	pie_skip_reloc
81f00ac1e5SStephen Warren	/* relative fix: store addend plus offset at dest location */
82f00ac1e5SStephen Warren	add	x0, x0, x9
83f00ac1e5SStephen Warren	add	x4, x4, x9
84f00ac1e5SStephen Warren	str	x4, [x0]
85f00ac1e5SStephen Warrenpie_skip_reloc:
86f00ac1e5SStephen Warren	cmp	x2, x3
87f00ac1e5SStephen Warren	b.lo	pie_fix_loop
88f00ac1e5SStephen Warrenpie_fixup_done:
89f00ac1e5SStephen Warren#endif
90f00ac1e5SStephen Warren
9194f7ff36SSergey Temerkhanov#ifdef CONFIG_SYS_RESET_SCTRL
9294f7ff36SSergey Temerkhanov	bl reset_sctrl
9394f7ff36SSergey Temerkhanov#endif
940ae76531SDavid Feng	/*
950ae76531SDavid Feng	 * Could be EL3/EL2/EL1, Initial State:
960ae76531SDavid Feng	 * Little Endian, MMU Disabled, i/dCache Disabled
970ae76531SDavid Feng	 */
980ae76531SDavid Feng	adr	x0, vectors
990ae76531SDavid Feng	switch_el x1, 3f, 2f, 1f
1001277bac0SDavid Feng3:	msr	vbar_el3, x0
1011277bac0SDavid Feng	mrs	x0, scr_el3
102c71645adSDavid Feng	orr	x0, x0, #0xf			/* SCR_EL3.NS|IRQ|FIQ|EA */
103c71645adSDavid Feng	msr	scr_el3, x0
1040ae76531SDavid Feng	msr	cptr_el3, xzr			/* Enable FP/SIMD */
10570bcb43eSThierry Reding#ifdef COUNTER_FREQUENCY
1060ae76531SDavid Feng	ldr	x0, =COUNTER_FREQUENCY
1070ae76531SDavid Feng	msr	cntfrq_el0, x0			/* Initialize CNTFRQ */
10870bcb43eSThierry Reding#endif
1090ae76531SDavid Feng	b	0f
1100ae76531SDavid Feng2:	msr	vbar_el2, x0
1110ae76531SDavid Feng	mov	x0, #0x33ff
1120ae76531SDavid Feng	msr	cptr_el2, x0			/* Enable FP/SIMD */
1130ae76531SDavid Feng	b	0f
1140ae76531SDavid Feng1:	msr	vbar_el1, x0
1150ae76531SDavid Feng	mov	x0, #3 << 20
1160ae76531SDavid Feng	msr	cpacr_el1, x0			/* Enable FP/SIMD */
1170ae76531SDavid Feng0:
1180ae76531SDavid Feng
1193aec452eSMingkai Hu	/*
120f28e2313SJoseph Chen	 * Enable instruction cache (if required), stack pointer,
121f28e2313SJoseph Chen	 * data access alignment checks and SError.
122f28e2313SJoseph Chen	 */
123f28e2313SJoseph Chen#ifndef CONFIG_SYS_ICACHE_OFF
124f28e2313SJoseph Chen	mov x1, #CR_I
125f28e2313SJoseph Chen#else
126f28e2313SJoseph Chen	mov x1, #0
127f28e2313SJoseph Chen#endif
128f28e2313SJoseph Chen	switch_el x2, 3f, 2f, 1f
129f28e2313SJoseph Chen3:	mrs	x0, sctlr_el3
130f28e2313SJoseph Chen	orr	x0, x0, x1
131f28e2313SJoseph Chen	msr	sctlr_el3, x0
132f28e2313SJoseph Chen#ifndef CONFIG_SUPPORT_USBPLUG
133f28e2313SJoseph Chen	msr	daifclr, #4			/* Enable SError. SCR_EL3.EA=1 was already set in start.S */
134f28e2313SJoseph Chen#endif
135f28e2313SJoseph Chen	b	0f
136f28e2313SJoseph Chen2:	mrs	x0, sctlr_el2
137f28e2313SJoseph Chen	orr	x0, x0, x1
138f28e2313SJoseph Chen	msr	sctlr_el2, x0
139f28e2313SJoseph Chen
140f28e2313SJoseph Chen	mrs	x0, hcr_el2
141f28e2313SJoseph Chen	orr	x0, x0, #HCR_EL2_TGE
142f28e2313SJoseph Chen	orr	x0, x0, #HCR_EL2_AMO
143f28e2313SJoseph Chen#if CONFIG_IS_ENABLED(IRQ)
144f28e2313SJoseph Chen	orr	x0, x0, #HCR_EL2_IMO
145f28e2313SJoseph Chen#endif
146f28e2313SJoseph Chen	msr	hcr_el2, x0
147f28e2313SJoseph Chen	msr	daifclr, #4
148f28e2313SJoseph Chen	b	0f
149f28e2313SJoseph Chen1:	mrs	x0, sctlr_el1
150f28e2313SJoseph Chen	orr	x0, x0, x1
151f28e2313SJoseph Chen	msr	sctlr_el1, x0
152f28e2313SJoseph Chen	msr	daifclr, #4
153f28e2313SJoseph Chen0:
154f28e2313SJoseph Chen	isb
155f28e2313SJoseph Chen
156f28e2313SJoseph Chen	/*
1579ad7147bSDinh Nguyen	 * Enable SMPEN bit for coherency.
1583aec452eSMingkai Hu	 * This register is not architectural but at the moment
1593aec452eSMingkai Hu	 * this bit should be set for A53/A57/A72.
1603aec452eSMingkai Hu	 */
1613aec452eSMingkai Hu#ifdef CONFIG_ARMV8_SET_SMPEN
162399e2bb6SYork Sun	switch_el x1, 3f, 1f, 1f
163399e2bb6SYork Sun3:
1649ad7147bSDinh Nguyen	mrs     x0, S3_1_c15_c2_1               /* cpuectlr_el1 */
1653aec452eSMingkai Hu	orr     x0, x0, #0x40
1663aec452eSMingkai Hu	msr     S3_1_c15_c2_1, x0
167399e2bb6SYork Sun1:
1683aec452eSMingkai Hu#endif
1693aec452eSMingkai Hu
17037118fb2SBhupesh Sharma	/* Apply ARM core specific erratas */
17137118fb2SBhupesh Sharma	bl	apply_core_errata
17237118fb2SBhupesh Sharma
1731e6ad55cSYork Sun	/*
1741e6ad55cSYork Sun	 * Cache/BPB/TLB Invalidate
1751e6ad55cSYork Sun	 * i-cache is invalidated before enabled in icache_enable()
1761e6ad55cSYork Sun	 * tlb is invalidated before mmu is enabled in dcache_enable()
1771e6ad55cSYork Sun	 * d-cache is invalidated before enabled in dcache_enable()
1781e6ad55cSYork Sun	 */
1790ae76531SDavid Feng
1800ae76531SDavid Feng	/* Processor specific initialization */
1810ae76531SDavid Feng	bl	lowlevel_init
1820ae76531SDavid Feng
1834b105f6cSOded Gabbay#if defined(CONFIG_ARMV8_SPIN_TABLE) && !defined(CONFIG_SPL_BUILD)
1846b6024eaSMasahiro Yamada	branch_if_master x0, x1, master_cpu
1856b6024eaSMasahiro Yamada	b	spin_table_secondary_jump
1866b6024eaSMasahiro Yamada	/* never return */
1876b6024eaSMasahiro Yamada#elif defined(CONFIG_ARMV8_MULTIENTRY)
1880ae76531SDavid Feng	branch_if_master x0, x1, master_cpu
1890ae76531SDavid Feng
1900ae76531SDavid Feng	/*
1910ae76531SDavid Feng	 * Slave CPUs
1920ae76531SDavid Feng	 */
1930ae76531SDavid Fengslave_cpu:
1940ae76531SDavid Feng	wfe
1950ae76531SDavid Feng	ldr	x1, =CPU_RELEASE_ADDR
1960ae76531SDavid Feng	ldr	x0, [x1]
1970ae76531SDavid Feng	cbz	x0, slave_cpu
1980ae76531SDavid Feng	br	x0			/* branch to the given address */
19923b5877cSLinus Walleij#endif /* CONFIG_ARMV8_MULTIENTRY */
20036c449feSJoseph Chen
201*2f96fde5SJoseph Chen#if CONFIG_IS_ENABLED(SMP)
20236c449feSJoseph Chen	mrs	x0, mpidr_el1
20336c449feSJoseph Chen	and x0, x0, #0xfff
20436c449feSJoseph Chen	cmp x0, #0
20536c449feSJoseph Chen	beq master_cpu
20636c449feSJoseph Chen
20736c449feSJoseph Chen#ifdef SMP_CPU1
20836c449feSJoseph Chen	cmp x0, #(SMP_CPU1)
20936c449feSJoseph Chen	ldr x1, =(SMP_CPU1_STACK)
21036c449feSJoseph Chen	beq slave_cpu
21136c449feSJoseph Chen#endif
21236c449feSJoseph Chen
21336c449feSJoseph Chen#ifdef SMP_CPU2
21436c449feSJoseph Chen	cmp x0, #(SMP_CPU2)
21536c449feSJoseph Chen	ldr x1, =(SMP_CPU2_STACK)
21636c449feSJoseph Chen	beq slave_cpu
21736c449feSJoseph Chen#endif
21836c449feSJoseph Chen
21936c449feSJoseph Chen#ifdef SMP_CPU3
22036c449feSJoseph Chen	cmp x0, #(SMP_CPU3)
22136c449feSJoseph Chen	ldr x1, =(SMP_CPU3_STACK)
22236c449feSJoseph Chen	beq slave_cpu
22336c449feSJoseph Chen#endif
22436c449feSJoseph Chen	dsb sy
22536c449feSJoseph Chen	isb
22636c449feSJoseph Chen
22736c449feSJoseph Chenloop:
22836c449feSJoseph Chen	wfe
22936c449feSJoseph Chen	b loop
23036c449feSJoseph Chen
23136c449feSJoseph Chenslave_cpu:
23236c449feSJoseph Chen	bic	sp, x1, #0xf
23336c449feSJoseph Chen	bl	smp_entry
23436c449feSJoseph Chen	b	loop
23536c449feSJoseph Chen#endif
23636c449feSJoseph Chen
2376b6024eaSMasahiro Yamadamaster_cpu:
2380ae76531SDavid Feng	bl	_main
2390ae76531SDavid Feng
24094f7ff36SSergey Temerkhanov#ifdef CONFIG_SYS_RESET_SCTRL
24194f7ff36SSergey Temerkhanovreset_sctrl:
24294f7ff36SSergey Temerkhanov	switch_el x1, 3f, 2f, 1f
24394f7ff36SSergey Temerkhanov3:
24494f7ff36SSergey Temerkhanov	mrs	x0, sctlr_el3
24594f7ff36SSergey Temerkhanov	b	0f
24694f7ff36SSergey Temerkhanov2:
24794f7ff36SSergey Temerkhanov	mrs	x0, sctlr_el2
24894f7ff36SSergey Temerkhanov	b	0f
24994f7ff36SSergey Temerkhanov1:
25094f7ff36SSergey Temerkhanov	mrs	x0, sctlr_el1
25194f7ff36SSergey Temerkhanov
25294f7ff36SSergey Temerkhanov0:
25394f7ff36SSergey Temerkhanov	ldr	x1, =0xfdfffffa
25494f7ff36SSergey Temerkhanov	and	x0, x0, x1
25594f7ff36SSergey Temerkhanov
25694f7ff36SSergey Temerkhanov	switch_el x1, 6f, 5f, 4f
25794f7ff36SSergey Temerkhanov6:
25894f7ff36SSergey Temerkhanov	msr	sctlr_el3, x0
25994f7ff36SSergey Temerkhanov	b	7f
26094f7ff36SSergey Temerkhanov5:
26194f7ff36SSergey Temerkhanov	msr	sctlr_el2, x0
26294f7ff36SSergey Temerkhanov	b	7f
26394f7ff36SSergey Temerkhanov4:
26494f7ff36SSergey Temerkhanov	msr	sctlr_el1, x0
26594f7ff36SSergey Temerkhanov
26694f7ff36SSergey Temerkhanov7:
26794f7ff36SSergey Temerkhanov	dsb	sy
26894f7ff36SSergey Temerkhanov	isb
26994f7ff36SSergey Temerkhanov	b	__asm_invalidate_tlb_all
27094f7ff36SSergey Temerkhanov	ret
27194f7ff36SSergey Temerkhanov#endif
27294f7ff36SSergey Temerkhanov
2730ae76531SDavid Feng/*-----------------------------------------------------------------------*/
2740ae76531SDavid Feng
27537118fb2SBhupesh SharmaWEAK(apply_core_errata)
27637118fb2SBhupesh Sharma
27737118fb2SBhupesh Sharma	mov	x29, lr			/* Save LR */
27837118fb2SBhupesh Sharma	/* For now, we support Cortex-A57 specific errata only */
27937118fb2SBhupesh Sharma
28037118fb2SBhupesh Sharma	/* Check if we are running on a Cortex-A57 core */
28137118fb2SBhupesh Sharma	branch_if_a57_core x0, apply_a57_core_errata
28237118fb2SBhupesh Sharma0:
28337118fb2SBhupesh Sharma	mov	lr, x29			/* Restore LR */
28437118fb2SBhupesh Sharma	ret
28537118fb2SBhupesh Sharma
28637118fb2SBhupesh Sharmaapply_a57_core_errata:
28737118fb2SBhupesh Sharma
28837118fb2SBhupesh Sharma#ifdef CONFIG_ARM_ERRATA_828024
28937118fb2SBhupesh Sharma	mrs	x0, S3_1_c15_c2_0	/* cpuactlr_el1 */
29037118fb2SBhupesh Sharma	/* Disable non-allocate hint of w-b-n-a memory type */
291f299b5b0SBhupesh Sharma	orr	x0, x0, #1 << 49
29237118fb2SBhupesh Sharma	/* Disable write streaming no L1-allocate threshold */
293f299b5b0SBhupesh Sharma	orr	x0, x0, #3 << 25
29437118fb2SBhupesh Sharma	/* Disable write streaming no-allocate threshold */
295f299b5b0SBhupesh Sharma	orr	x0, x0, #3 << 27
29637118fb2SBhupesh Sharma	msr	S3_1_c15_c2_0, x0	/* cpuactlr_el1 */
29737118fb2SBhupesh Sharma#endif
29837118fb2SBhupesh Sharma
29937118fb2SBhupesh Sharma#ifdef CONFIG_ARM_ERRATA_826974
30037118fb2SBhupesh Sharma	mrs	x0, S3_1_c15_c2_0	/* cpuactlr_el1 */
30137118fb2SBhupesh Sharma	/* Disable speculative load execution ahead of a DMB */
302f299b5b0SBhupesh Sharma	orr	x0, x0, #1 << 59
30337118fb2SBhupesh Sharma	msr	S3_1_c15_c2_0, x0	/* cpuactlr_el1 */
30437118fb2SBhupesh Sharma#endif
30537118fb2SBhupesh Sharma
3062ea3a448SAshish kumar#ifdef CONFIG_ARM_ERRATA_833471
3072ea3a448SAshish kumar	mrs	x0, S3_1_c15_c2_0	/* cpuactlr_el1 */
3082ea3a448SAshish kumar	/* FPSCR write flush.
3092ea3a448SAshish kumar	 * Note that in some cases where a flush is unnecessary this
3102ea3a448SAshish kumar	    could impact performance. */
3112ea3a448SAshish kumar	orr	x0, x0, #1 << 38
3122ea3a448SAshish kumar	msr	S3_1_c15_c2_0, x0	/* cpuactlr_el1 */
3132ea3a448SAshish kumar#endif
3142ea3a448SAshish kumar
3152ea3a448SAshish kumar#ifdef CONFIG_ARM_ERRATA_829520
3162ea3a448SAshish kumar	mrs	x0, S3_1_c15_c2_0	/* cpuactlr_el1 */
3172ea3a448SAshish kumar	/* Disable Indirect Predictor bit will prevent this erratum
3182ea3a448SAshish kumar	    from occurring
3192ea3a448SAshish kumar	 * Note that in some cases where a flush is unnecessary this
3202ea3a448SAshish kumar	    could impact performance. */
3212ea3a448SAshish kumar	orr	x0, x0, #1 << 4
3222ea3a448SAshish kumar	msr	S3_1_c15_c2_0, x0	/* cpuactlr_el1 */
3232ea3a448SAshish kumar#endif
3242ea3a448SAshish kumar
32537118fb2SBhupesh Sharma#ifdef CONFIG_ARM_ERRATA_833069
32637118fb2SBhupesh Sharma	mrs	x0, S3_1_c15_c2_0	/* cpuactlr_el1 */
32737118fb2SBhupesh Sharma	/* Disable Enable Invalidates of BTB bit */
32837118fb2SBhupesh Sharma	and	x0, x0, #0xE
32937118fb2SBhupesh Sharma	msr	S3_1_c15_c2_0, x0	/* cpuactlr_el1 */
33037118fb2SBhupesh Sharma#endif
33137118fb2SBhupesh Sharma	b 0b
33237118fb2SBhupesh SharmaENDPROC(apply_core_errata)
33337118fb2SBhupesh Sharma
33437118fb2SBhupesh Sharma/*-----------------------------------------------------------------------*/
33537118fb2SBhupesh Sharma
3360ae76531SDavid FengWEAK(lowlevel_init)
3370ae76531SDavid Feng	mov	x29, lr			/* Save LR */
3380ae76531SDavid Feng
3397cef7918SJoseph Chen#if CONFIG_IS_ENABLED(IRQ)
340c71645adSDavid Feng	branch_if_slave x0, 1f
341c71645adSDavid Feng	ldr	x0, =GICD_BASE
342c71645adSDavid Feng	bl	gic_init_secure
343c71645adSDavid Feng1:
344c71645adSDavid Feng#if defined(CONFIG_GICV3)
345c71645adSDavid Feng	ldr	x0, =GICR_BASE
346c71645adSDavid Feng	bl	gic_init_secure_percpu
347c71645adSDavid Feng#elif defined(CONFIG_GICV2)
348c71645adSDavid Feng	ldr	x0, =GICD_BASE
349c71645adSDavid Feng	ldr	x1, =GICC_BASE
350c71645adSDavid Feng	bl	gic_init_secure_percpu
351c71645adSDavid Feng#endif
35211661193SStephen Warren#endif
353c71645adSDavid Feng
354d38fca40SMasahiro Yamada#ifdef CONFIG_ARMV8_MULTIENTRY
355c71645adSDavid Feng	branch_if_master x0, x1, 2f
3560ae76531SDavid Feng
3570ae76531SDavid Feng	/*
3580ae76531SDavid Feng	 * Slave should wait for master clearing spin table.
3590ae76531SDavid Feng	 * This sync prevent salves observing incorrect
3600ae76531SDavid Feng	 * value of spin table and jumping to wrong place.
3610ae76531SDavid Feng	 */
362c71645adSDavid Feng#if defined(CONFIG_GICV2) || defined(CONFIG_GICV3)
363c71645adSDavid Feng#ifdef CONFIG_GICV2
364c71645adSDavid Feng	ldr	x0, =GICC_BASE
365c71645adSDavid Feng#endif
366c71645adSDavid Feng	bl	gic_wait_for_interrupt
367c71645adSDavid Feng#endif
3680ae76531SDavid Feng
3690ae76531SDavid Feng	/*
370c71645adSDavid Feng	 * All slaves will enter EL2 and optionally EL1.
3710ae76531SDavid Feng	 */
3727c5e1febSAlison Wang	adr	x4, lowlevel_in_el2
3737c5e1febSAlison Wang	ldr	x5, =ES_TO_AARCH64
3740ae76531SDavid Feng	bl	armv8_switch_to_el2
375ec6617c3SAlison Wang
376ec6617c3SAlison Wanglowlevel_in_el2:
3770ae76531SDavid Feng#ifdef CONFIG_ARMV8_SWITCH_TO_EL1
3787c5e1febSAlison Wang	adr	x4, lowlevel_in_el1
3797c5e1febSAlison Wang	ldr	x5, =ES_TO_AARCH64
3800ae76531SDavid Feng	bl	armv8_switch_to_el1
381ec6617c3SAlison Wang
382ec6617c3SAlison Wanglowlevel_in_el1:
3830ae76531SDavid Feng#endif
3840ae76531SDavid Feng
38523b5877cSLinus Walleij#endif /* CONFIG_ARMV8_MULTIENTRY */
38623b5877cSLinus Walleij
387c71645adSDavid Feng2:
3880ae76531SDavid Feng	mov	lr, x29			/* Restore LR */
3890ae76531SDavid Feng	ret
3900ae76531SDavid FengENDPROC(lowlevel_init)
3910ae76531SDavid Feng
392c71645adSDavid FengWEAK(smp_kick_all_cpus)
393c71645adSDavid Feng	/* Kick secondary cpus up by SGI 0 interrupt */
394c71645adSDavid Feng#if defined(CONFIG_GICV2) || defined(CONFIG_GICV3)
395c71645adSDavid Feng	ldr	x0, =GICD_BASE
396afedf548SMasahiro Yamada	b	gic_kick_secondary_cpus
397c71645adSDavid Feng#endif
398c71645adSDavid Feng	ret
399c71645adSDavid FengENDPROC(smp_kick_all_cpus)
400c71645adSDavid Feng
4010ae76531SDavid Feng/*-----------------------------------------------------------------------*/
4020ae76531SDavid Feng
4030ae76531SDavid FengENTRY(c_runtime_cpu_setup)
4040ae76531SDavid Feng	/* Relocate vBAR */
4050ae76531SDavid Feng	adr	x0, vectors
4060ae76531SDavid Feng	switch_el x1, 3f, 2f, 1f
4070ae76531SDavid Feng3:	msr	vbar_el3, x0
4080ae76531SDavid Feng	b	0f
4090ae76531SDavid Feng2:	msr	vbar_el2, x0
4100ae76531SDavid Feng	b	0f
4110ae76531SDavid Feng1:	msr	vbar_el1, x0
4120ae76531SDavid Feng0:
4130ae76531SDavid Feng
4140ae76531SDavid Feng	ret
4150ae76531SDavid FengENDPROC(c_runtime_cpu_setup)
4160e2b5350SStephen Warren
4170e2b5350SStephen WarrenWEAK(save_boot_params)
4180e2b5350SStephen Warren	b	save_boot_params_ret	/* back to my caller */
4190e2b5350SStephen WarrenENDPROC(save_boot_params)
42037e5dcc8SYouMin Chen#endif
421