xref: /openbmc/u-boot/arch/arm/cpu/armv8/smccc-call.S (revision c2da86f39ed6cbccccc2736bdc421fd606734232)
1*c2da86f3SMasahiro Yamada/*
2*c2da86f3SMasahiro Yamada * Copyright (c) 2015, Linaro Limited
3*c2da86f3SMasahiro Yamada *
4*c2da86f3SMasahiro Yamada * This program is free software; you can redistribute it and/or modify
5*c2da86f3SMasahiro Yamada * it under the terms of the GNU General Public License Version 2 as
6*c2da86f3SMasahiro Yamada * published by the Free Software Foundation.
7*c2da86f3SMasahiro Yamada *
8*c2da86f3SMasahiro Yamada * This program is distributed in the hope that it will be useful,
9*c2da86f3SMasahiro Yamada * but WITHOUT ANY WARRANTY; without even the implied warranty of
10*c2da86f3SMasahiro Yamada * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11*c2da86f3SMasahiro Yamada * GNU General Public License for more details.
12*c2da86f3SMasahiro Yamada *
13*c2da86f3SMasahiro Yamada */
14*c2da86f3SMasahiro Yamada#include <linux/linkage.h>
15*c2da86f3SMasahiro Yamada#include <linux/arm-smccc.h>
16*c2da86f3SMasahiro Yamada#include <asm/asm-offsets.h>
17*c2da86f3SMasahiro Yamada
18*c2da86f3SMasahiro Yamada	.macro SMCCC instr
19*c2da86f3SMasahiro Yamada	.cfi_startproc
20*c2da86f3SMasahiro Yamada	\instr	#0
21*c2da86f3SMasahiro Yamada	ldr	x4, [sp]
22*c2da86f3SMasahiro Yamada	stp	x0, x1, [x4, #ARM_SMCCC_RES_X0_OFFS]
23*c2da86f3SMasahiro Yamada	stp	x2, x3, [x4, #ARM_SMCCC_RES_X2_OFFS]
24*c2da86f3SMasahiro Yamada	ldr	x4, [sp, #8]
25*c2da86f3SMasahiro Yamada	cbz	x4, 1f /* no quirk structure */
26*c2da86f3SMasahiro Yamada	ldr	x9, [x4, #ARM_SMCCC_QUIRK_ID_OFFS]
27*c2da86f3SMasahiro Yamada	cmp	x9, #ARM_SMCCC_QUIRK_QCOM_A6
28*c2da86f3SMasahiro Yamada	b.ne	1f
29*c2da86f3SMasahiro Yamada	str	x6, [x4, ARM_SMCCC_QUIRK_STATE_OFFS]
30*c2da86f3SMasahiro Yamada1:	ret
31*c2da86f3SMasahiro Yamada	.cfi_endproc
32*c2da86f3SMasahiro Yamada	.endm
33*c2da86f3SMasahiro Yamada
34*c2da86f3SMasahiro Yamada/*
35*c2da86f3SMasahiro Yamada * void arm_smccc_smc(unsigned long a0, unsigned long a1, unsigned long a2,
36*c2da86f3SMasahiro Yamada *		  unsigned long a3, unsigned long a4, unsigned long a5,
37*c2da86f3SMasahiro Yamada *		  unsigned long a6, unsigned long a7, struct arm_smccc_res *res,
38*c2da86f3SMasahiro Yamada *		  struct arm_smccc_quirk *quirk)
39*c2da86f3SMasahiro Yamada */
40*c2da86f3SMasahiro YamadaENTRY(__arm_smccc_smc)
41*c2da86f3SMasahiro Yamada	SMCCC	smc
42*c2da86f3SMasahiro YamadaENDPROC(__arm_smccc_smc)
43*c2da86f3SMasahiro Yamada
44*c2da86f3SMasahiro Yamada/*
45*c2da86f3SMasahiro Yamada * void arm_smccc_hvc(unsigned long a0, unsigned long a1, unsigned long a2,
46*c2da86f3SMasahiro Yamada *		  unsigned long a3, unsigned long a4, unsigned long a5,
47*c2da86f3SMasahiro Yamada *		  unsigned long a6, unsigned long a7, struct arm_smccc_res *res,
48*c2da86f3SMasahiro Yamada *		  struct arm_smccc_quirk *quirk)
49*c2da86f3SMasahiro Yamada */
50*c2da86f3SMasahiro YamadaENTRY(__arm_smccc_hvc)
51*c2da86f3SMasahiro Yamada	SMCCC	hvc
52*c2da86f3SMasahiro YamadaENDPROC(__arm_smccc_hvc)
53