183d290c5STom Rini/* SPDX-License-Identifier: GPL-2.0+ */
2b45db3b5SHou Zhiqiang/*
3b45db3b5SHou Zhiqiang * Copyright 2016 NXP Semiconductor, Inc.
4b45db3b5SHou Zhiqiang */
5b45db3b5SHou Zhiqiang
6b45db3b5SHou Zhiqiang#include <config.h>
7b45db3b5SHou Zhiqiang#include <linux/linkage.h>
8b45db3b5SHou Zhiqiang#include <asm/system.h>
9b45db3b5SHou Zhiqiang#include <asm/macro.h>
10b45db3b5SHou Zhiqiang
11b45db3b5SHou ZhiqiangWEAK(_sec_firmware_entry)
12b45db3b5SHou Zhiqiang	/*
13b45db3b5SHou Zhiqiang	 * x0: Secure Firmware entry point
14b45db3b5SHou Zhiqiang	 * x1: Exception return address Low
15b45db3b5SHou Zhiqiang	 * x2: Exception return address High
16b45db3b5SHou Zhiqiang	 */
17b45db3b5SHou Zhiqiang
18b45db3b5SHou Zhiqiang	/* Save stack pointer for EL2 */
19b45db3b5SHou Zhiqiang	mov	x3, sp
20b45db3b5SHou Zhiqiang	msr	sp_el2, x3
21b45db3b5SHou Zhiqiang
22b45db3b5SHou Zhiqiang	/* Set exception return address hold pointer */
23b45db3b5SHou Zhiqiang        adr	x4, 1f
24b45db3b5SHou Zhiqiang        mov	x3, x4
250897eb2cSHou Zhiqiang#ifdef CONFIG_ARMV8_SEC_FIRMWARE_ERET_ADDR_REVERT
26b45db3b5SHou Zhiqiang        rev	w3, w3
27b45db3b5SHou Zhiqiang#endif
28b45db3b5SHou Zhiqiang        str	w3, [x1]
29b45db3b5SHou Zhiqiang        lsr	x3, x4, #32
300897eb2cSHou Zhiqiang#ifdef CONFIG_ARMV8_SEC_FIRMWARE_ERET_ADDR_REVERT
31b45db3b5SHou Zhiqiang        rev	w3, w3
32b45db3b5SHou Zhiqiang#endif
33b45db3b5SHou Zhiqiang        str	w3, [x2]
34b45db3b5SHou Zhiqiang
35b45db3b5SHou Zhiqiang	/* Call SEC monitor */
36b45db3b5SHou Zhiqiang        br	x0
37b45db3b5SHou Zhiqiang
38b45db3b5SHou Zhiqiang1:
39b45db3b5SHou Zhiqiang        mov	x0, #0
40b45db3b5SHou Zhiqiang        ret
41b45db3b5SHou ZhiqiangENDPROC(_sec_firmware_entry)
42b45db3b5SHou Zhiqiang
43daa92644SHou Zhiqiang#ifdef CONFIG_SEC_FIRMWARE_ARMV8_PSCI
44b45db3b5SHou ZhiqiangENTRY(_sec_firmware_support_psci_version)
45b45db3b5SHou Zhiqiang	mov	x0, 0x84000000
46b45db3b5SHou Zhiqiang	mov	x1, 0x0
47b45db3b5SHou Zhiqiang	mov	x2, 0x0
48b45db3b5SHou Zhiqiang	mov	x3, 0x0
49b45db3b5SHou Zhiqiang	smc	#0
50b45db3b5SHou Zhiqiang	ret
51b45db3b5SHou ZhiqiangENDPROC(_sec_firmware_support_psci_version)
523db86f4bSAlison Wang
533db86f4bSAlison Wang/*
543db86f4bSAlison Wang * Switch from AArch64 EL2 to AArch32 EL2
553db86f4bSAlison Wang * @param inputs:
563db86f4bSAlison Wang * x0: argument, zero
573db86f4bSAlison Wang * x1: machine nr
583db86f4bSAlison Wang * x2: fdt address
597c5e1febSAlison Wang * x3: input argument
607c5e1febSAlison Wang * x4: kernel entry point
613db86f4bSAlison Wang * @param outputs for secure firmware:
623db86f4bSAlison Wang * x0: function id
633db86f4bSAlison Wang * x1: kernel entry point
643db86f4bSAlison Wang * x2: machine nr
653db86f4bSAlison Wang * x3: fdt address
663db86f4bSAlison Wang*/
673db86f4bSAlison WangENTRY(armv8_el2_to_aarch32)
683db86f4bSAlison Wang	mov	x3, x2
693db86f4bSAlison Wang	mov	x2, x1
707c5e1febSAlison Wang	mov	x1, x4
71*339fb297SRajesh Bhagat	ldr	x0, =0xc200ff17
723db86f4bSAlison Wang	smc	#0
733db86f4bSAlison Wang	ret
743db86f4bSAlison WangENDPROC(armv8_el2_to_aarch32)
75b45db3b5SHou Zhiqiang#endif
76