xref: /rk3399_rockchip-uboot/arch/arm/cpu/armv7/smccc-call.S (revision 4f66e09bb9fbc47b73f67c3cc08ee2663e8fcdb1)
1c2da86f3SMasahiro Yamada/*
2c2da86f3SMasahiro Yamada * Copyright (c) 2015, Linaro Limited
3c2da86f3SMasahiro Yamada *
4*c54bcf68SMasahiro Yamada * SPDX-License-Identifier:	GPL-2.0
5c2da86f3SMasahiro Yamada */
6c2da86f3SMasahiro Yamada#include <linux/linkage.h>
7c2da86f3SMasahiro Yamada
8c2da86f3SMasahiro Yamada#include <asm/opcodes-sec.h>
9c2da86f3SMasahiro Yamada#include <asm/opcodes-virt.h>
10c2da86f3SMasahiro Yamada
11*c54bcf68SMasahiro Yamada#define UNWIND(x...)
12c2da86f3SMasahiro Yamada	/*
13c2da86f3SMasahiro Yamada	 * Wrap c macros in asm macros to delay expansion until after the
14c2da86f3SMasahiro Yamada	 * SMCCC asm macro is expanded.
15c2da86f3SMasahiro Yamada	 */
16c2da86f3SMasahiro Yamada	.macro SMCCC_SMC
17c2da86f3SMasahiro Yamada	__SMC(0)
18c2da86f3SMasahiro Yamada	.endm
19c2da86f3SMasahiro Yamada
20c2da86f3SMasahiro Yamada	.macro SMCCC_HVC
21c2da86f3SMasahiro Yamada	__HVC(0)
22c2da86f3SMasahiro Yamada	.endm
23c2da86f3SMasahiro Yamada
24c2da86f3SMasahiro Yamada	.macro SMCCC instr
25c2da86f3SMasahiro YamadaUNWIND(	.fnstart)
26c2da86f3SMasahiro Yamada	mov	r12, sp
27c2da86f3SMasahiro Yamada	push	{r4-r7}
28c2da86f3SMasahiro YamadaUNWIND(	.save	{r4-r7})
29c2da86f3SMasahiro Yamada	ldm	r12, {r4-r7}
30c2da86f3SMasahiro Yamada	\instr
31c2da86f3SMasahiro Yamada	pop	{r4-r7}
32c2da86f3SMasahiro Yamada	ldr	r12, [sp, #(4 * 4)]
33c2da86f3SMasahiro Yamada	stm	r12, {r0-r3}
34c2da86f3SMasahiro Yamada	bx	lr
35c2da86f3SMasahiro YamadaUNWIND(	.fnend)
36c2da86f3SMasahiro Yamada	.endm
37c2da86f3SMasahiro Yamada
38c2da86f3SMasahiro Yamada/*
39c2da86f3SMasahiro Yamada * void smccc_smc(unsigned long a0, unsigned long a1, unsigned long a2,
40c2da86f3SMasahiro Yamada *		  unsigned long a3, unsigned long a4, unsigned long a5,
41c2da86f3SMasahiro Yamada *		  unsigned long a6, unsigned long a7, struct arm_smccc_res *res,
42c2da86f3SMasahiro Yamada *		  struct arm_smccc_quirk *quirk)
43c2da86f3SMasahiro Yamada */
44c2da86f3SMasahiro YamadaENTRY(__arm_smccc_smc)
45c2da86f3SMasahiro Yamada	SMCCC SMCCC_SMC
46c2da86f3SMasahiro YamadaENDPROC(__arm_smccc_smc)
47c2da86f3SMasahiro Yamada
48c2da86f3SMasahiro Yamada/*
49c2da86f3SMasahiro Yamada * void smccc_hvc(unsigned long a0, unsigned long a1, unsigned long a2,
50c2da86f3SMasahiro Yamada *		  unsigned long a3, unsigned long a4, unsigned long a5,
51c2da86f3SMasahiro Yamada *		  unsigned long a6, unsigned long a7, struct arm_smccc_res *res,
52c2da86f3SMasahiro Yamada *		  struct arm_smccc_quirk *quirk)
53c2da86f3SMasahiro Yamada */
54c2da86f3SMasahiro YamadaENTRY(__arm_smccc_hvc)
55c2da86f3SMasahiro Yamada	SMCCC SMCCC_HVC
56c2da86f3SMasahiro YamadaENDPROC(__arm_smccc_hvc)
57