xref: /openbmc/u-boot/arch/arm/cpu/armv8/psci.S (revision 0c4b382f9041f9f2f00246c8a0ece90dae5451be)
183d290c5STom Rini/* SPDX-License-Identifier: GPL-2.0+ */
214bf25d5Smacro.wave.z@gmail.com/*
314bf25d5Smacro.wave.z@gmail.com * Copyright 2016 Freescale Semiconductor, Inc.
414bf25d5Smacro.wave.z@gmail.com * Author: Hongbo Zhang <hongbo.zhang@nxp.com>
514bf25d5Smacro.wave.z@gmail.com * This file implements LS102X platform PSCI SYSTEM-SUSPEND function
614bf25d5Smacro.wave.z@gmail.com */
714bf25d5Smacro.wave.z@gmail.com
814bf25d5Smacro.wave.z@gmail.com#include <config.h>
914bf25d5Smacro.wave.z@gmail.com#include <linux/linkage.h>
1014bf25d5Smacro.wave.z@gmail.com#include <asm/psci.h>
1114bf25d5Smacro.wave.z@gmail.com
1214bf25d5Smacro.wave.z@gmail.com/* Default PSCI function, return -1, Not Implemented */
1314bf25d5Smacro.wave.z@gmail.com#define PSCI_DEFAULT(__fn) \
1414bf25d5Smacro.wave.z@gmail.com	ENTRY(__fn); \
1514bf25d5Smacro.wave.z@gmail.com	mov	w0, #ARM_PSCI_RET_NI; \
1614bf25d5Smacro.wave.z@gmail.com	ret; \
1714bf25d5Smacro.wave.z@gmail.com	ENDPROC(__fn); \
1814bf25d5Smacro.wave.z@gmail.com	.weak __fn
1914bf25d5Smacro.wave.z@gmail.com
2014bf25d5Smacro.wave.z@gmail.com/* PSCI function and ID table definition*/
2114bf25d5Smacro.wave.z@gmail.com#define PSCI_TABLE(__id, __fn) \
2214bf25d5Smacro.wave.z@gmail.com	.word __id; \
2314bf25d5Smacro.wave.z@gmail.com	.word __fn
2414bf25d5Smacro.wave.z@gmail.com
2514bf25d5Smacro.wave.z@gmail.com.pushsection ._secure.text, "ax"
2614bf25d5Smacro.wave.z@gmail.com
2714bf25d5Smacro.wave.z@gmail.com/* 32 bits PSCI default functions */
2814bf25d5Smacro.wave.z@gmail.comPSCI_DEFAULT(psci_version)
2914bf25d5Smacro.wave.z@gmail.comPSCI_DEFAULT(psci_cpu_suspend)
3014bf25d5Smacro.wave.z@gmail.comPSCI_DEFAULT(psci_cpu_off)
3114bf25d5Smacro.wave.z@gmail.comPSCI_DEFAULT(psci_cpu_on)
3214bf25d5Smacro.wave.z@gmail.comPSCI_DEFAULT(psci_affinity_info)
3314bf25d5Smacro.wave.z@gmail.comPSCI_DEFAULT(psci_migrate)
3414bf25d5Smacro.wave.z@gmail.comPSCI_DEFAULT(psci_migrate_info_type)
3514bf25d5Smacro.wave.z@gmail.comPSCI_DEFAULT(psci_migrate_info_up_cpu)
3614bf25d5Smacro.wave.z@gmail.comPSCI_DEFAULT(psci_system_off)
3714bf25d5Smacro.wave.z@gmail.comPSCI_DEFAULT(psci_system_reset)
3814bf25d5Smacro.wave.z@gmail.comPSCI_DEFAULT(psci_features)
3914bf25d5Smacro.wave.z@gmail.comPSCI_DEFAULT(psci_cpu_freeze)
4014bf25d5Smacro.wave.z@gmail.comPSCI_DEFAULT(psci_cpu_default_suspend)
4114bf25d5Smacro.wave.z@gmail.comPSCI_DEFAULT(psci_node_hw_state)
4214bf25d5Smacro.wave.z@gmail.comPSCI_DEFAULT(psci_system_suspend)
4314bf25d5Smacro.wave.z@gmail.comPSCI_DEFAULT(psci_set_suspend_mode)
4414bf25d5Smacro.wave.z@gmail.comPSCI_DEFAULT(psi_stat_residency)
4514bf25d5Smacro.wave.z@gmail.comPSCI_DEFAULT(psci_stat_count)
4614bf25d5Smacro.wave.z@gmail.com
4714bf25d5Smacro.wave.z@gmail.com.align 3
4814bf25d5Smacro.wave.z@gmail.com_psci_32_table:
4914bf25d5Smacro.wave.z@gmail.comPSCI_TABLE(ARM_PSCI_FN_CPU_SUSPEND, psci_cpu_suspend)
5014bf25d5Smacro.wave.z@gmail.comPSCI_TABLE(ARM_PSCI_FN_CPU_OFF, psci_cpu_off)
5114bf25d5Smacro.wave.z@gmail.comPSCI_TABLE(ARM_PSCI_FN_CPU_ON, psci_cpu_on)
5214bf25d5Smacro.wave.z@gmail.comPSCI_TABLE(ARM_PSCI_FN_MIGRATE, psci_migrate)
5314bf25d5Smacro.wave.z@gmail.comPSCI_TABLE(ARM_PSCI_0_2_FN_PSCI_VERSION, psci_version)
5414bf25d5Smacro.wave.z@gmail.comPSCI_TABLE(ARM_PSCI_0_2_FN_CPU_SUSPEND, psci_cpu_suspend)
5514bf25d5Smacro.wave.z@gmail.comPSCI_TABLE(ARM_PSCI_0_2_FN_CPU_OFF, psci_cpu_off)
5614bf25d5Smacro.wave.z@gmail.comPSCI_TABLE(ARM_PSCI_0_2_FN_CPU_ON, psci_cpu_on)
5714bf25d5Smacro.wave.z@gmail.comPSCI_TABLE(ARM_PSCI_0_2_FN_AFFINITY_INFO, psci_affinity_info)
5814bf25d5Smacro.wave.z@gmail.comPSCI_TABLE(ARM_PSCI_0_2_FN_MIGRATE, psci_migrate)
5914bf25d5Smacro.wave.z@gmail.comPSCI_TABLE(ARM_PSCI_0_2_FN_MIGRATE_INFO_TYPE, psci_migrate_info_type)
6014bf25d5Smacro.wave.z@gmail.comPSCI_TABLE(ARM_PSCI_0_2_FN_MIGRATE_INFO_UP_CPU, psci_migrate_info_up_cpu)
6114bf25d5Smacro.wave.z@gmail.comPSCI_TABLE(ARM_PSCI_0_2_FN_SYSTEM_OFF, psci_system_off)
6214bf25d5Smacro.wave.z@gmail.comPSCI_TABLE(ARM_PSCI_0_2_FN_SYSTEM_RESET, psci_system_reset)
6314bf25d5Smacro.wave.z@gmail.comPSCI_TABLE(ARM_PSCI_1_0_FN_PSCI_FEATURES, psci_features)
6414bf25d5Smacro.wave.z@gmail.comPSCI_TABLE(ARM_PSCI_1_0_FN_CPU_FREEZE, psci_cpu_freeze)
6514bf25d5Smacro.wave.z@gmail.comPSCI_TABLE(ARM_PSCI_1_0_FN_CPU_DEFAULT_SUSPEND, psci_cpu_default_suspend)
6614bf25d5Smacro.wave.z@gmail.comPSCI_TABLE(ARM_PSCI_1_0_FN_NODE_HW_STATE, psci_node_hw_state)
6714bf25d5Smacro.wave.z@gmail.comPSCI_TABLE(ARM_PSCI_1_0_FN_SYSTEM_SUSPEND, psci_system_suspend)
6814bf25d5Smacro.wave.z@gmail.comPSCI_TABLE(ARM_PSCI_1_0_FN_SET_SUSPEND_MODE, psci_set_suspend_mode)
6914bf25d5Smacro.wave.z@gmail.comPSCI_TABLE(ARM_PSCI_1_0_FN_STAT_RESIDENCY, psi_stat_residency)
7014bf25d5Smacro.wave.z@gmail.comPSCI_TABLE(ARM_PSCI_1_0_FN_STAT_COUNT, psci_stat_count)
7114bf25d5Smacro.wave.z@gmail.comPSCI_TABLE(0, 0)
7214bf25d5Smacro.wave.z@gmail.com
7314bf25d5Smacro.wave.z@gmail.com/* 64 bits PSCI default functions */
7414bf25d5Smacro.wave.z@gmail.comPSCI_DEFAULT(psci_cpu_suspend_64)
7514bf25d5Smacro.wave.z@gmail.comPSCI_DEFAULT(psci_cpu_on_64)
7614bf25d5Smacro.wave.z@gmail.comPSCI_DEFAULT(psci_affinity_info_64)
7714bf25d5Smacro.wave.z@gmail.comPSCI_DEFAULT(psci_migrate_64)
7814bf25d5Smacro.wave.z@gmail.comPSCI_DEFAULT(psci_migrate_info_up_cpu_64)
7914bf25d5Smacro.wave.z@gmail.comPSCI_DEFAULT(psci_cpu_default_suspend_64)
8014bf25d5Smacro.wave.z@gmail.comPSCI_DEFAULT(psci_node_hw_state_64)
8114bf25d5Smacro.wave.z@gmail.comPSCI_DEFAULT(psci_system_suspend_64)
8214bf25d5Smacro.wave.z@gmail.comPSCI_DEFAULT(psci_stat_residency_64)
8314bf25d5Smacro.wave.z@gmail.comPSCI_DEFAULT(psci_stat_count_64)
8414bf25d5Smacro.wave.z@gmail.com
8514bf25d5Smacro.wave.z@gmail.com.align 3
8614bf25d5Smacro.wave.z@gmail.com_psci_64_table:
8714bf25d5Smacro.wave.z@gmail.comPSCI_TABLE(ARM_PSCI_0_2_FN64_CPU_SUSPEND, psci_cpu_suspend_64)
8814bf25d5Smacro.wave.z@gmail.comPSCI_TABLE(ARM_PSCI_0_2_FN64_CPU_ON, psci_cpu_on_64)
8914bf25d5Smacro.wave.z@gmail.comPSCI_TABLE(ARM_PSCI_0_2_FN64_AFFINITY_INFO, psci_affinity_info_64)
9014bf25d5Smacro.wave.z@gmail.comPSCI_TABLE(ARM_PSCI_0_2_FN64_MIGRATE, psci_migrate_64)
9114bf25d5Smacro.wave.z@gmail.comPSCI_TABLE(ARM_PSCI_0_2_FN64_MIGRATE_INFO_UP_CPU, psci_migrate_info_up_cpu_64)
9214bf25d5Smacro.wave.z@gmail.comPSCI_TABLE(ARM_PSCI_1_0_FN64_CPU_DEFAULT_SUSPEND, psci_cpu_default_suspend_64)
9314bf25d5Smacro.wave.z@gmail.comPSCI_TABLE(ARM_PSCI_1_0_FN64_NODE_HW_STATE, psci_node_hw_state_64)
9414bf25d5Smacro.wave.z@gmail.comPSCI_TABLE(ARM_PSCI_1_0_FN64_SYSTEM_SUSPEND, psci_system_suspend_64)
9514bf25d5Smacro.wave.z@gmail.comPSCI_TABLE(ARM_PSCI_1_0_FN64_STAT_RESIDENCY, psci_stat_residency_64)
9614bf25d5Smacro.wave.z@gmail.comPSCI_TABLE(ARM_PSCI_1_0_FN64_STAT_COUNT, psci_stat_count_64)
9714bf25d5Smacro.wave.z@gmail.comPSCI_TABLE(0, 0)
9814bf25d5Smacro.wave.z@gmail.com
9914bf25d5Smacro.wave.z@gmail.com.macro	psci_enter
10014bf25d5Smacro.wave.z@gmail.com	/* PSCI call is Fast Call(atomic), so mask DAIF */
10114bf25d5Smacro.wave.z@gmail.com	mrs	x15, DAIF
10214bf25d5Smacro.wave.z@gmail.com	stp	x15, xzr, [sp, #-16]!
10314bf25d5Smacro.wave.z@gmail.com	ldr	x15, =0x3C0
10414bf25d5Smacro.wave.z@gmail.com	msr	DAIF, x15
10514bf25d5Smacro.wave.z@gmail.com	/* SMC convention, x18 ~ x30 should be saved by callee */
10614bf25d5Smacro.wave.z@gmail.com	stp	x29, x30, [sp, #-16]!
10714bf25d5Smacro.wave.z@gmail.com	stp	x27, x28, [sp, #-16]!
10814bf25d5Smacro.wave.z@gmail.com	stp	x25, x26, [sp, #-16]!
10914bf25d5Smacro.wave.z@gmail.com	stp	x23, x24, [sp, #-16]!
11014bf25d5Smacro.wave.z@gmail.com	stp	x21, x22, [sp, #-16]!
11114bf25d5Smacro.wave.z@gmail.com	stp	x19, x20, [sp, #-16]!
11214bf25d5Smacro.wave.z@gmail.com	mrs	x15, elr_el3
11314bf25d5Smacro.wave.z@gmail.com	stp	x18, x15, [sp, #-16]!
11414bf25d5Smacro.wave.z@gmail.com.endm
11514bf25d5Smacro.wave.z@gmail.com
11614bf25d5Smacro.wave.z@gmail.com.macro	psci_return
11714bf25d5Smacro.wave.z@gmail.com	/* restore registers */
11814bf25d5Smacro.wave.z@gmail.com	ldp	x18, x15, [sp], #16
11914bf25d5Smacro.wave.z@gmail.com	msr	elr_el3, x15
12014bf25d5Smacro.wave.z@gmail.com	ldp	x19, x20, [sp], #16
12114bf25d5Smacro.wave.z@gmail.com	ldp	x21, x22, [sp], #16
12214bf25d5Smacro.wave.z@gmail.com	ldp	x23, x24, [sp], #16
12314bf25d5Smacro.wave.z@gmail.com	ldp	x25, x26, [sp], #16
12414bf25d5Smacro.wave.z@gmail.com	ldp	x27, x28, [sp], #16
12514bf25d5Smacro.wave.z@gmail.com	ldp	x29, x30, [sp], #16
12614bf25d5Smacro.wave.z@gmail.com	/* restore DAIF */
12714bf25d5Smacro.wave.z@gmail.com	ldp	x15, xzr, [sp], #16
12814bf25d5Smacro.wave.z@gmail.com	msr	DAIF, x15
12914bf25d5Smacro.wave.z@gmail.com	eret
13014bf25d5Smacro.wave.z@gmail.com.endm
13114bf25d5Smacro.wave.z@gmail.com
13214bf25d5Smacro.wave.z@gmail.com/* Caller must put PSCI function-ID table base in x9 */
13314bf25d5Smacro.wave.z@gmail.comhandle_psci:
13414bf25d5Smacro.wave.z@gmail.com	psci_enter
13514bf25d5Smacro.wave.z@gmail.com1:	ldr x10, [x9]			/* Load PSCI function table */
13614bf25d5Smacro.wave.z@gmail.com	ubfx x11, x10, #32, #32
13714bf25d5Smacro.wave.z@gmail.com	ubfx x10, x10, #0, #32
13814bf25d5Smacro.wave.z@gmail.com	cbz	x10, 3f			/* If reach the end, bail out */
13914bf25d5Smacro.wave.z@gmail.com	cmp	x10, x0
14014bf25d5Smacro.wave.z@gmail.com	b.eq	2f			/* PSCI function found */
14114bf25d5Smacro.wave.z@gmail.com	add x9, x9, #8			/* If not match, try next entry */
14214bf25d5Smacro.wave.z@gmail.com	b	1b
14314bf25d5Smacro.wave.z@gmail.com
14414bf25d5Smacro.wave.z@gmail.com2:	blr	x11			/* Call PSCI function */
14514bf25d5Smacro.wave.z@gmail.com	psci_return
14614bf25d5Smacro.wave.z@gmail.com
14714bf25d5Smacro.wave.z@gmail.com3:	mov	x0, #ARM_PSCI_RET_NI
14814bf25d5Smacro.wave.z@gmail.com	psci_return
14914bf25d5Smacro.wave.z@gmail.com
15014bf25d5Smacro.wave.z@gmail.comunknown_smc_id:
15114bf25d5Smacro.wave.z@gmail.com	ldr	x0, =0xFFFFFFFF
15214bf25d5Smacro.wave.z@gmail.com	eret
15314bf25d5Smacro.wave.z@gmail.com
15414bf25d5Smacro.wave.z@gmail.comhandle_smc32:
15514bf25d5Smacro.wave.z@gmail.com	/* SMC function ID  0x84000000-0x8400001F: 32 bits PSCI */
15614bf25d5Smacro.wave.z@gmail.com	ldr	w9, =0x8400001F
15714bf25d5Smacro.wave.z@gmail.com	cmp	w0, w9
15814bf25d5Smacro.wave.z@gmail.com	b.gt	unknown_smc_id
15914bf25d5Smacro.wave.z@gmail.com	ldr	w9, =0x84000000
16014bf25d5Smacro.wave.z@gmail.com	cmp	w0, w9
16114bf25d5Smacro.wave.z@gmail.com	b.lt	unknown_smc_id
16214bf25d5Smacro.wave.z@gmail.com
16314bf25d5Smacro.wave.z@gmail.com	adr	x9, _psci_32_table
16414bf25d5Smacro.wave.z@gmail.com	b	handle_psci
16514bf25d5Smacro.wave.z@gmail.com
16614bf25d5Smacro.wave.z@gmail.comhandle_smc64:
16714bf25d5Smacro.wave.z@gmail.com	/* check SMC32 or SMC64 calls */
16814bf25d5Smacro.wave.z@gmail.com	ubfx	x9, x0, #30, #1
16914bf25d5Smacro.wave.z@gmail.com	cbz	x9, handle_smc32
17014bf25d5Smacro.wave.z@gmail.com
17114bf25d5Smacro.wave.z@gmail.com	/* SMC function ID 0xC4000000-0xC400001F: 64 bits PSCI */
17214bf25d5Smacro.wave.z@gmail.com	ldr	x9, =0xC400001F
17314bf25d5Smacro.wave.z@gmail.com	cmp	x0, x9
17414bf25d5Smacro.wave.z@gmail.com	b.gt	unknown_smc_id
17514bf25d5Smacro.wave.z@gmail.com	ldr	x9, =0xC4000000
17614bf25d5Smacro.wave.z@gmail.com	cmp	x0, x9
17714bf25d5Smacro.wave.z@gmail.com	b.lt	unknown_smc_id
17814bf25d5Smacro.wave.z@gmail.com
17914bf25d5Smacro.wave.z@gmail.com	adr	x9, _psci_64_table
18014bf25d5Smacro.wave.z@gmail.com	b	handle_psci
18114bf25d5Smacro.wave.z@gmail.com
18214bf25d5Smacro.wave.z@gmail.com/*
18314bf25d5Smacro.wave.z@gmail.com * Get CPU ID from MPIDR, suppose every cluster has same number of CPU cores,
18414bf25d5Smacro.wave.z@gmail.com * Platform with asymmetric clusters should implement their own interface.
18514bf25d5Smacro.wave.z@gmail.com * In case this function being called by other platform's C code, the ARM
18614bf25d5Smacro.wave.z@gmail.com * Architecture Procedure Call Standard is considered, e.g. register X0 is
18714bf25d5Smacro.wave.z@gmail.com * used for the return value, while in this PSCI environment, X0 usually holds
18814bf25d5Smacro.wave.z@gmail.com * the SMC function identifier, so X0 should be saved by caller function.
18914bf25d5Smacro.wave.z@gmail.com */
19014bf25d5Smacro.wave.z@gmail.comENTRY(psci_get_cpu_id)
19114bf25d5Smacro.wave.z@gmail.com#ifdef CONFIG_ARMV8_PSCI_CPUS_PER_CLUSTER
19214bf25d5Smacro.wave.z@gmail.com	mrs	x9, MPIDR_EL1
19314bf25d5Smacro.wave.z@gmail.com	ubfx	x9, x9, #8, #8
19414bf25d5Smacro.wave.z@gmail.com	ldr	x10, =CONFIG_ARMV8_PSCI_CPUS_PER_CLUSTER
19514bf25d5Smacro.wave.z@gmail.com	mul	x9, x10, x9
19614bf25d5Smacro.wave.z@gmail.com#else
19714bf25d5Smacro.wave.z@gmail.com	mov	x9, xzr
19814bf25d5Smacro.wave.z@gmail.com#endif
19914bf25d5Smacro.wave.z@gmail.com	mrs	x10, MPIDR_EL1
20014bf25d5Smacro.wave.z@gmail.com	ubfx	x10, x10, #0, #8
20114bf25d5Smacro.wave.z@gmail.com	add	x0, x10, x9
20214bf25d5Smacro.wave.z@gmail.com	ret
20314bf25d5Smacro.wave.z@gmail.comENDPROC(psci_get_cpu_id)
20414bf25d5Smacro.wave.z@gmail.com.weak psci_get_cpu_id
20514bf25d5Smacro.wave.z@gmail.com
20614bf25d5Smacro.wave.z@gmail.com/* CPU ID input in x0, stack top output in x0*/
20714bf25d5Smacro.wave.z@gmail.comLENTRY(psci_get_cpu_stack_top)
20814bf25d5Smacro.wave.z@gmail.com	adr	x9, __secure_stack_end
20914bf25d5Smacro.wave.z@gmail.com	lsl	x0, x0, #ARM_PSCI_STACK_SHIFT
21014bf25d5Smacro.wave.z@gmail.com	sub	x0, x9, x0
21114bf25d5Smacro.wave.z@gmail.com	ret
21214bf25d5Smacro.wave.z@gmail.comENDPROC(psci_get_cpu_stack_top)
21314bf25d5Smacro.wave.z@gmail.com
21414bf25d5Smacro.wave.z@gmail.comunhandled_exception:
21514bf25d5Smacro.wave.z@gmail.com	b	unhandled_exception	/* simply dead loop */
21614bf25d5Smacro.wave.z@gmail.com
21714bf25d5Smacro.wave.z@gmail.comhandle_sync:
21814bf25d5Smacro.wave.z@gmail.com	mov	x15, x30
21914bf25d5Smacro.wave.z@gmail.com	mov	x14, x0
22014bf25d5Smacro.wave.z@gmail.com
22114bf25d5Smacro.wave.z@gmail.com	bl	psci_get_cpu_id
22214bf25d5Smacro.wave.z@gmail.com	bl	psci_get_cpu_stack_top
22314bf25d5Smacro.wave.z@gmail.com	mov	x9, #1
22414bf25d5Smacro.wave.z@gmail.com	msr	spsel, x9
22514bf25d5Smacro.wave.z@gmail.com	mov	sp, x0
22614bf25d5Smacro.wave.z@gmail.com
22714bf25d5Smacro.wave.z@gmail.com	mov	x0, x14
22814bf25d5Smacro.wave.z@gmail.com	mov	x30, x15
22914bf25d5Smacro.wave.z@gmail.com
23014bf25d5Smacro.wave.z@gmail.com	mrs	x9, esr_el3
23114bf25d5Smacro.wave.z@gmail.com	ubfx	x9, x9, #26, #6
23214bf25d5Smacro.wave.z@gmail.com	cmp	x9, #0x13
23314bf25d5Smacro.wave.z@gmail.com	b.eq	handle_smc32
23414bf25d5Smacro.wave.z@gmail.com	cmp	x9, #0x17
23514bf25d5Smacro.wave.z@gmail.com	b.eq	handle_smc64
23614bf25d5Smacro.wave.z@gmail.com
23714bf25d5Smacro.wave.z@gmail.com	b	unhandled_exception
23814bf25d5Smacro.wave.z@gmail.com
239*eb13ddddSChee Hong Ang#ifdef CONFIG_ARMV8_EA_EL3_FIRST
240*eb13ddddSChee Hong Ang/*
241*eb13ddddSChee Hong Ang * Override this function if custom error handling is
242*eb13ddddSChee Hong Ang * needed for asynchronous aborts
243*eb13ddddSChee Hong Ang */
244*eb13ddddSChee Hong AngENTRY(plat_error_handler)
245*eb13ddddSChee Hong Ang	ret
246*eb13ddddSChee Hong AngENDPROC(plat_error_handler)
247*eb13ddddSChee Hong Ang.weak plat_error_handler
248*eb13ddddSChee Hong Ang
249*eb13ddddSChee Hong Anghandle_error:
250*eb13ddddSChee Hong Ang	bl	psci_get_cpu_id
251*eb13ddddSChee Hong Ang	bl	psci_get_cpu_stack_top
252*eb13ddddSChee Hong Ang	mov	x9, #1
253*eb13ddddSChee Hong Ang	msr	spsel, x9
254*eb13ddddSChee Hong Ang	mov	sp, x0
255*eb13ddddSChee Hong Ang
256*eb13ddddSChee Hong Ang	bl	plat_error_handler	/* Platform specific error handling */
257*eb13ddddSChee Hong Angdeadloop:
258*eb13ddddSChee Hong Ang	b	deadloop		/* Never return */
259*eb13ddddSChee Hong Ang#endif
260*eb13ddddSChee Hong Ang
26114bf25d5Smacro.wave.z@gmail.com	.align	11
26214bf25d5Smacro.wave.z@gmail.com	.globl	el3_exception_vectors
26314bf25d5Smacro.wave.z@gmail.comel3_exception_vectors:
26414bf25d5Smacro.wave.z@gmail.com	b	unhandled_exception	/* Sync, Current EL using SP0 */
26514bf25d5Smacro.wave.z@gmail.com	.align	7
26614bf25d5Smacro.wave.z@gmail.com	b	unhandled_exception	/* IRQ, Current EL using SP0 */
26714bf25d5Smacro.wave.z@gmail.com	.align	7
26814bf25d5Smacro.wave.z@gmail.com	b	unhandled_exception	/* FIQ, Current EL using SP0 */
26914bf25d5Smacro.wave.z@gmail.com	.align	7
27014bf25d5Smacro.wave.z@gmail.com	b	unhandled_exception	/* SError, Current EL using SP0 */
27114bf25d5Smacro.wave.z@gmail.com	.align	7
27214bf25d5Smacro.wave.z@gmail.com	b	unhandled_exception	/* Sync, Current EL using SPx */
27314bf25d5Smacro.wave.z@gmail.com	.align	7
27414bf25d5Smacro.wave.z@gmail.com	b	unhandled_exception	/* IRQ, Current EL using SPx */
27514bf25d5Smacro.wave.z@gmail.com	.align	7
27614bf25d5Smacro.wave.z@gmail.com	b	unhandled_exception	/* FIQ, Current EL using SPx */
27714bf25d5Smacro.wave.z@gmail.com	.align	7
27814bf25d5Smacro.wave.z@gmail.com	b	unhandled_exception	/* SError, Current EL using SPx */
27914bf25d5Smacro.wave.z@gmail.com	.align	7
28014bf25d5Smacro.wave.z@gmail.com	b	handle_sync		/* Sync, Lower EL using AArch64 */
28114bf25d5Smacro.wave.z@gmail.com	.align	7
28214bf25d5Smacro.wave.z@gmail.com	b	unhandled_exception	/* IRQ, Lower EL using AArch64 */
28314bf25d5Smacro.wave.z@gmail.com	.align	7
28414bf25d5Smacro.wave.z@gmail.com	b	unhandled_exception	/* FIQ, Lower EL using AArch64 */
28514bf25d5Smacro.wave.z@gmail.com	.align	7
286*eb13ddddSChee Hong Ang#ifdef CONFIG_ARMV8_EA_EL3_FIRST
287*eb13ddddSChee Hong Ang	b	handle_error		/* SError, Lower EL using AArch64 */
288*eb13ddddSChee Hong Ang#else
28914bf25d5Smacro.wave.z@gmail.com	b	unhandled_exception	/* SError, Lower EL using AArch64 */
290*eb13ddddSChee Hong Ang#endif
29114bf25d5Smacro.wave.z@gmail.com	.align	7
29214bf25d5Smacro.wave.z@gmail.com	b	unhandled_exception	/* Sync, Lower EL using AArch32 */
29314bf25d5Smacro.wave.z@gmail.com	.align	7
29414bf25d5Smacro.wave.z@gmail.com	b	unhandled_exception	/* IRQ, Lower EL using AArch32 */
29514bf25d5Smacro.wave.z@gmail.com	.align	7
29614bf25d5Smacro.wave.z@gmail.com	b	unhandled_exception	/* FIQ, Lower EL using AArch32 */
29714bf25d5Smacro.wave.z@gmail.com	.align	7
29814bf25d5Smacro.wave.z@gmail.com	b	unhandled_exception	/* SError, Lower EL using AArch32 */
29914bf25d5Smacro.wave.z@gmail.com
30014bf25d5Smacro.wave.z@gmail.comENTRY(psci_setup_vectors)
30114bf25d5Smacro.wave.z@gmail.com	adr	x0, el3_exception_vectors
30214bf25d5Smacro.wave.z@gmail.com	msr	vbar_el3, x0
30314bf25d5Smacro.wave.z@gmail.com	ret
30414bf25d5Smacro.wave.z@gmail.comENDPROC(psci_setup_vectors)
30514bf25d5Smacro.wave.z@gmail.com
30614bf25d5Smacro.wave.z@gmail.comENTRY(psci_arch_init)
30714bf25d5Smacro.wave.z@gmail.com	ret
30814bf25d5Smacro.wave.z@gmail.comENDPROC(psci_arch_init)
30914bf25d5Smacro.wave.z@gmail.com.weak psci_arch_init
31014bf25d5Smacro.wave.z@gmail.com
31114bf25d5Smacro.wave.z@gmail.com.popsection
312