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