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