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