xref: /openbmc/linux/arch/arm/kernel/smccc-call.S (revision 8be98d2f2a0a262f8bf8a0bc1fdf522b3c7aab17)
19c92ab61SThomas Gleixner/* SPDX-License-Identifier: GPL-2.0-only */
2b329f95dSJens Wiklander/*
3b329f95dSJens Wiklander * Copyright (c) 2015, Linaro Limited
4b329f95dSJens Wiklander */
5b329f95dSJens Wiklander#include <linux/linkage.h>
6*57ac5166SManivannan Sadhasivam#include <linux/arm-smccc.h>
7b329f95dSJens Wiklander
8*57ac5166SManivannan Sadhasivam#include <asm/asm-offsets.h>
9b329f95dSJens Wiklander#include <asm/opcodes-sec.h>
10b329f95dSJens Wiklander#include <asm/opcodes-virt.h>
11b329f95dSJens Wiklander#include <asm/unwind.h>
12b329f95dSJens Wiklander
13b329f95dSJens Wiklander	/*
14b329f95dSJens Wiklander	 * Wrap c macros in asm macros to delay expansion until after the
15b329f95dSJens Wiklander	 * SMCCC asm macro is expanded.
16b329f95dSJens Wiklander	 */
17b329f95dSJens Wiklander	.macro SMCCC_SMC
18b329f95dSJens Wiklander	__SMC(0)
19b329f95dSJens Wiklander	.endm
20b329f95dSJens Wiklander
21b329f95dSJens Wiklander	.macro SMCCC_HVC
22b329f95dSJens Wiklander	__HVC(0)
23b329f95dSJens Wiklander	.endm
24b329f95dSJens Wiklander
25b329f95dSJens Wiklander	.macro SMCCC instr
26b329f95dSJens WiklanderUNWIND(	.fnstart)
27b329f95dSJens Wiklander	mov	r12, sp
28b329f95dSJens Wiklander	push	{r4-r7}
29b329f95dSJens WiklanderUNWIND(	.save	{r4-r7})
30b329f95dSJens Wiklander	ldm	r12, {r4-r7}
31b329f95dSJens Wiklander	\instr
32*57ac5166SManivannan Sadhasivam	ldr	r4, [sp, #36]
33*57ac5166SManivannan Sadhasivam	cmp	r4, #0
34*57ac5166SManivannan Sadhasivam	beq	1f			// No quirk structure
35*57ac5166SManivannan Sadhasivam	ldr     r5, [r4, #ARM_SMCCC_QUIRK_ID_OFFS]
36*57ac5166SManivannan Sadhasivam	cmp     r5, #ARM_SMCCC_QUIRK_QCOM_A6
37*57ac5166SManivannan Sadhasivam	bne	1f			// No quirk present
38*57ac5166SManivannan Sadhasivam	str	r6, [r4, #ARM_SMCCC_QUIRK_STATE_OFFS]
39*57ac5166SManivannan Sadhasivam1:	pop	{r4-r7}
40b329f95dSJens Wiklander	ldr	r12, [sp, #(4 * 4)]
41b329f95dSJens Wiklander	stm	r12, {r0-r3}
42b329f95dSJens Wiklander	bx	lr
43b329f95dSJens WiklanderUNWIND(	.fnend)
44b329f95dSJens Wiklander	.endm
45b329f95dSJens Wiklander
46b329f95dSJens Wiklander/*
47b329f95dSJens Wiklander * void smccc_smc(unsigned long a0, unsigned long a1, unsigned long a2,
48b329f95dSJens Wiklander *		  unsigned long a3, unsigned long a4, unsigned long a5,
49680a0873SAndy Gross *		  unsigned long a6, unsigned long a7, struct arm_smccc_res *res,
50680a0873SAndy Gross *		  struct arm_smccc_quirk *quirk)
51b329f95dSJens Wiklander */
52680a0873SAndy GrossENTRY(__arm_smccc_smc)
53b329f95dSJens Wiklander	SMCCC SMCCC_SMC
54680a0873SAndy GrossENDPROC(__arm_smccc_smc)
55b329f95dSJens Wiklander
56b329f95dSJens Wiklander/*
57b329f95dSJens Wiklander * void smccc_hvc(unsigned long a0, unsigned long a1, unsigned long a2,
58b329f95dSJens Wiklander *		  unsigned long a3, unsigned long a4, unsigned long a5,
59680a0873SAndy Gross *		  unsigned long a6, unsigned long a7, struct arm_smccc_res *res,
60680a0873SAndy Gross *		  struct arm_smccc_quirk *quirk)
61b329f95dSJens Wiklander */
62680a0873SAndy GrossENTRY(__arm_smccc_hvc)
63b329f95dSJens Wiklander	SMCCC SMCCC_HVC
64680a0873SAndy GrossENDPROC(__arm_smccc_hvc)
65