11802d0beSThomas Gleixner/* SPDX-License-Identifier: GPL-2.0-only */ 214457459SJens Wiklander/* 314457459SJens Wiklander * Copyright (c) 2015, Linaro Limited 414457459SJens Wiklander */ 514457459SJens Wiklander#include <linux/linkage.h> 682bcd087SAndy Gross#include <linux/arm-smccc.h> 723fe04c0SMark Rutland 814457459SJens Wiklander#include <asm/asm-offsets.h> 923fe04c0SMark Rutland#include <asm/assembler.h> 1014457459SJens Wiklander 1114457459SJens Wiklander .macro SMCCC instr 1214457459SJens Wiklander \instr #0 13*701fae8dSMark Rutland ldr x4, [sp] 1414457459SJens Wiklander stp x0, x1, [x4, #ARM_SMCCC_RES_X0_OFFS] 1514457459SJens Wiklander stp x2, x3, [x4, #ARM_SMCCC_RES_X2_OFFS] 16*701fae8dSMark Rutland ldr x4, [sp, #8] 1782bcd087SAndy Gross cbz x4, 1f /* no quirk structure */ 1882bcd087SAndy Gross ldr x9, [x4, #ARM_SMCCC_QUIRK_ID_OFFS] 1982bcd087SAndy Gross cmp x9, #ARM_SMCCC_QUIRK_QCOM_A6 2082bcd087SAndy Gross b.ne 1f 2182bcd087SAndy Gross str x6, [x4, ARM_SMCCC_QUIRK_STATE_OFFS] 22*701fae8dSMark Rutland1: ret 2314457459SJens Wiklander .endm 2414457459SJens Wiklander 2514457459SJens Wiklander/* 2614457459SJens Wiklander * void arm_smccc_smc(unsigned long a0, unsigned long a1, unsigned long a2, 2714457459SJens Wiklander * unsigned long a3, unsigned long a4, unsigned long a5, 28680a0873SAndy Gross * unsigned long a6, unsigned long a7, struct arm_smccc_res *res, 29680a0873SAndy Gross * struct arm_smccc_quirk *quirk) 3014457459SJens Wiklander */ 310343a7e4SMark BrownSYM_FUNC_START(__arm_smccc_smc) 3214457459SJens Wiklander SMCCC smc 330343a7e4SMark BrownSYM_FUNC_END(__arm_smccc_smc) 3423fe04c0SMark RutlandEXPORT_SYMBOL(__arm_smccc_smc) 3514457459SJens Wiklander 3614457459SJens Wiklander/* 3714457459SJens Wiklander * void arm_smccc_hvc(unsigned long a0, unsigned long a1, unsigned long a2, 3814457459SJens Wiklander * unsigned long a3, unsigned long a4, unsigned long a5, 39680a0873SAndy Gross * unsigned long a6, unsigned long a7, struct arm_smccc_res *res, 40680a0873SAndy Gross * struct arm_smccc_quirk *quirk) 4114457459SJens Wiklander */ 420343a7e4SMark BrownSYM_FUNC_START(__arm_smccc_hvc) 4314457459SJens Wiklander SMCCC hvc 440343a7e4SMark BrownSYM_FUNC_END(__arm_smccc_hvc) 4523fe04c0SMark RutlandEXPORT_SYMBOL(__arm_smccc_hvc) 463fdc0cb5SSudeep Holla 473fdc0cb5SSudeep Holla .macro SMCCC_1_2 instr 483fdc0cb5SSudeep Holla /* Save `res` and free a GPR that won't be clobbered */ 493fdc0cb5SSudeep Holla stp x1, x19, [sp, #-16]! 503fdc0cb5SSudeep Holla 513fdc0cb5SSudeep Holla /* Ensure `args` won't be clobbered while loading regs in next step */ 523fdc0cb5SSudeep Holla mov x19, x0 533fdc0cb5SSudeep Holla 543fdc0cb5SSudeep Holla /* Load the registers x0 - x17 from the struct arm_smccc_1_2_regs */ 553fdc0cb5SSudeep Holla ldp x0, x1, [x19, #ARM_SMCCC_1_2_REGS_X0_OFFS] 563fdc0cb5SSudeep Holla ldp x2, x3, [x19, #ARM_SMCCC_1_2_REGS_X2_OFFS] 573fdc0cb5SSudeep Holla ldp x4, x5, [x19, #ARM_SMCCC_1_2_REGS_X4_OFFS] 583fdc0cb5SSudeep Holla ldp x6, x7, [x19, #ARM_SMCCC_1_2_REGS_X6_OFFS] 593fdc0cb5SSudeep Holla ldp x8, x9, [x19, #ARM_SMCCC_1_2_REGS_X8_OFFS] 603fdc0cb5SSudeep Holla ldp x10, x11, [x19, #ARM_SMCCC_1_2_REGS_X10_OFFS] 613fdc0cb5SSudeep Holla ldp x12, x13, [x19, #ARM_SMCCC_1_2_REGS_X12_OFFS] 623fdc0cb5SSudeep Holla ldp x14, x15, [x19, #ARM_SMCCC_1_2_REGS_X14_OFFS] 633fdc0cb5SSudeep Holla ldp x16, x17, [x19, #ARM_SMCCC_1_2_REGS_X16_OFFS] 643fdc0cb5SSudeep Holla 653fdc0cb5SSudeep Holla \instr #0 663fdc0cb5SSudeep Holla 673fdc0cb5SSudeep Holla /* Load the `res` from the stack */ 683fdc0cb5SSudeep Holla ldr x19, [sp] 693fdc0cb5SSudeep Holla 703fdc0cb5SSudeep Holla /* Store the registers x0 - x17 into the result structure */ 713fdc0cb5SSudeep Holla stp x0, x1, [x19, #ARM_SMCCC_1_2_REGS_X0_OFFS] 723fdc0cb5SSudeep Holla stp x2, x3, [x19, #ARM_SMCCC_1_2_REGS_X2_OFFS] 733fdc0cb5SSudeep Holla stp x4, x5, [x19, #ARM_SMCCC_1_2_REGS_X4_OFFS] 743fdc0cb5SSudeep Holla stp x6, x7, [x19, #ARM_SMCCC_1_2_REGS_X6_OFFS] 753fdc0cb5SSudeep Holla stp x8, x9, [x19, #ARM_SMCCC_1_2_REGS_X8_OFFS] 763fdc0cb5SSudeep Holla stp x10, x11, [x19, #ARM_SMCCC_1_2_REGS_X10_OFFS] 773fdc0cb5SSudeep Holla stp x12, x13, [x19, #ARM_SMCCC_1_2_REGS_X12_OFFS] 783fdc0cb5SSudeep Holla stp x14, x15, [x19, #ARM_SMCCC_1_2_REGS_X14_OFFS] 793fdc0cb5SSudeep Holla stp x16, x17, [x19, #ARM_SMCCC_1_2_REGS_X16_OFFS] 803fdc0cb5SSudeep Holla 813fdc0cb5SSudeep Holla /* Restore original x19 */ 823fdc0cb5SSudeep Holla ldp xzr, x19, [sp], #16 833fdc0cb5SSudeep Holla ret 843fdc0cb5SSudeep Holla.endm 853fdc0cb5SSudeep Holla 863fdc0cb5SSudeep Holla/* 873fdc0cb5SSudeep Holla * void arm_smccc_1_2_hvc(const struct arm_smccc_1_2_regs *args, 883fdc0cb5SSudeep Holla * struct arm_smccc_1_2_regs *res); 893fdc0cb5SSudeep Holla */ 903fdc0cb5SSudeep HollaSYM_FUNC_START(arm_smccc_1_2_hvc) 913fdc0cb5SSudeep Holla SMCCC_1_2 hvc 923fdc0cb5SSudeep HollaSYM_FUNC_END(arm_smccc_1_2_hvc) 933fdc0cb5SSudeep HollaEXPORT_SYMBOL(arm_smccc_1_2_hvc) 943fdc0cb5SSudeep Holla 953fdc0cb5SSudeep Holla/* 963fdc0cb5SSudeep Holla * void arm_smccc_1_2_smc(const struct arm_smccc_1_2_regs *args, 973fdc0cb5SSudeep Holla * struct arm_smccc_1_2_regs *res); 983fdc0cb5SSudeep Holla */ 993fdc0cb5SSudeep HollaSYM_FUNC_START(arm_smccc_1_2_smc) 1003fdc0cb5SSudeep Holla SMCCC_1_2 smc 1013fdc0cb5SSudeep HollaSYM_FUNC_END(arm_smccc_1_2_smc) 1023fdc0cb5SSudeep HollaEXPORT_SYMBOL(arm_smccc_1_2_smc) 103