1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2014-2023, ARM Limited and Contributors. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu /* Copyright (c) 2014, Linaro Limited. All rights reserved. */ 8*91f16700Schasinglulu 9*91f16700Schasinglulu #ifndef TEESMC_OPTEED_H 10*91f16700Schasinglulu #define TEESMC_OPTEED_H 11*91f16700Schasinglulu 12*91f16700Schasinglulu #include "teesmc_opteed_macros.h" 13*91f16700Schasinglulu 14*91f16700Schasinglulu /* 15*91f16700Schasinglulu * This section specifies SMC function IDs used when returning from TEE to the 16*91f16700Schasinglulu * secure monitor. 17*91f16700Schasinglulu * 18*91f16700Schasinglulu * All SMC Function IDs indicates SMC32 Calling Convention but will carry 19*91f16700Schasinglulu * full 64 bit values in the argument registers if invoked from Aarch64 20*91f16700Schasinglulu * mode. This violates the SMC Calling Convention, but since this 21*91f16700Schasinglulu * convention only coveres API towards Normal World it's something that 22*91f16700Schasinglulu * only concerns the OP-TEE Dispatcher in Trusted Firmware-A and OP-TEE 23*91f16700Schasinglulu * OS at Secure EL1. 24*91f16700Schasinglulu */ 25*91f16700Schasinglulu 26*91f16700Schasinglulu /* 27*91f16700Schasinglulu * Issued when returning from initial entry. 28*91f16700Schasinglulu * 29*91f16700Schasinglulu * Register usage: 30*91f16700Schasinglulu * r0/x0 SMC Function ID, TEESMC_OPTEED_RETURN_ENTRY_DONE 31*91f16700Schasinglulu * r1/x1 Pointer to entry vector 32*91f16700Schasinglulu */ 33*91f16700Schasinglulu #define TEESMC_OPTEED_FUNCID_RETURN_ENTRY_DONE 0 34*91f16700Schasinglulu #define TEESMC_OPTEED_RETURN_ENTRY_DONE \ 35*91f16700Schasinglulu TEESMC_OPTEED_RV(TEESMC_OPTEED_FUNCID_RETURN_ENTRY_DONE) 36*91f16700Schasinglulu 37*91f16700Schasinglulu 38*91f16700Schasinglulu 39*91f16700Schasinglulu /* 40*91f16700Schasinglulu * Issued when returning from "cpu_on" vector 41*91f16700Schasinglulu * 42*91f16700Schasinglulu * Register usage: 43*91f16700Schasinglulu * r0/x0 SMC Function ID, TEESMC_OPTEED_RETURN_ON_DONE 44*91f16700Schasinglulu * r1/x1 0 on success and anything else to indicate error condition 45*91f16700Schasinglulu */ 46*91f16700Schasinglulu #define TEESMC_OPTEED_FUNCID_RETURN_ON_DONE 1 47*91f16700Schasinglulu #define TEESMC_OPTEED_RETURN_ON_DONE \ 48*91f16700Schasinglulu TEESMC_OPTEED_RV(TEESMC_OPTEED_FUNCID_RETURN_ON_DONE) 49*91f16700Schasinglulu 50*91f16700Schasinglulu /* 51*91f16700Schasinglulu * Issued when returning from "cpu_off" vector 52*91f16700Schasinglulu * 53*91f16700Schasinglulu * Register usage: 54*91f16700Schasinglulu * r0/x0 SMC Function ID, TEESMC_OPTEED_RETURN_OFF_DONE 55*91f16700Schasinglulu * r1/x1 0 on success and anything else to indicate error condition 56*91f16700Schasinglulu */ 57*91f16700Schasinglulu #define TEESMC_OPTEED_FUNCID_RETURN_OFF_DONE 2 58*91f16700Schasinglulu #define TEESMC_OPTEED_RETURN_OFF_DONE \ 59*91f16700Schasinglulu TEESMC_OPTEED_RV(TEESMC_OPTEED_FUNCID_RETURN_OFF_DONE) 60*91f16700Schasinglulu 61*91f16700Schasinglulu /* 62*91f16700Schasinglulu * Issued when returning from "cpu_suspend" vector 63*91f16700Schasinglulu * 64*91f16700Schasinglulu * Register usage: 65*91f16700Schasinglulu * r0/x0 SMC Function ID, TEESMC_OPTEED_RETURN_SUSPEND_DONE 66*91f16700Schasinglulu * r1/x1 0 on success and anything else to indicate error condition 67*91f16700Schasinglulu */ 68*91f16700Schasinglulu #define TEESMC_OPTEED_FUNCID_RETURN_SUSPEND_DONE 3 69*91f16700Schasinglulu #define TEESMC_OPTEED_RETURN_SUSPEND_DONE \ 70*91f16700Schasinglulu TEESMC_OPTEED_RV(TEESMC_OPTEED_FUNCID_RETURN_SUSPEND_DONE) 71*91f16700Schasinglulu 72*91f16700Schasinglulu /* 73*91f16700Schasinglulu * Issued when returning from "cpu_resume" vector 74*91f16700Schasinglulu * 75*91f16700Schasinglulu * Register usage: 76*91f16700Schasinglulu * r0/x0 SMC Function ID, TEESMC_OPTEED_RETURN_RESUME_DONE 77*91f16700Schasinglulu * r1/x1 0 on success and anything else to indicate error condition 78*91f16700Schasinglulu */ 79*91f16700Schasinglulu #define TEESMC_OPTEED_FUNCID_RETURN_RESUME_DONE 4 80*91f16700Schasinglulu #define TEESMC_OPTEED_RETURN_RESUME_DONE \ 81*91f16700Schasinglulu TEESMC_OPTEED_RV(TEESMC_OPTEED_FUNCID_RETURN_RESUME_DONE) 82*91f16700Schasinglulu 83*91f16700Schasinglulu /* 84*91f16700Schasinglulu * Issued when returning from "std_smc" or "fast_smc" vector 85*91f16700Schasinglulu * 86*91f16700Schasinglulu * Register usage: 87*91f16700Schasinglulu * r0/x0 SMC Function ID, TEESMC_OPTEED_RETURN_CALL_DONE 88*91f16700Schasinglulu * r1-4/x1-4 Return value 0-3 which will passed to normal world in 89*91f16700Schasinglulu * r0-3/x0-3 90*91f16700Schasinglulu */ 91*91f16700Schasinglulu #define TEESMC_OPTEED_FUNCID_RETURN_CALL_DONE 5 92*91f16700Schasinglulu #define TEESMC_OPTEED_RETURN_CALL_DONE \ 93*91f16700Schasinglulu TEESMC_OPTEED_RV(TEESMC_OPTEED_FUNCID_RETURN_CALL_DONE) 94*91f16700Schasinglulu 95*91f16700Schasinglulu /* 96*91f16700Schasinglulu * Issued when returning from "fiq" vector 97*91f16700Schasinglulu * 98*91f16700Schasinglulu * Register usage: 99*91f16700Schasinglulu * r0/x0 SMC Function ID, TEESMC_OPTEED_RETURN_FIQ_DONE 100*91f16700Schasinglulu */ 101*91f16700Schasinglulu #define TEESMC_OPTEED_FUNCID_RETURN_FIQ_DONE 6 102*91f16700Schasinglulu #define TEESMC_OPTEED_RETURN_FIQ_DONE \ 103*91f16700Schasinglulu TEESMC_OPTEED_RV(TEESMC_OPTEED_FUNCID_RETURN_FIQ_DONE) 104*91f16700Schasinglulu 105*91f16700Schasinglulu /* 106*91f16700Schasinglulu * Issued when returning from "system_off" vector 107*91f16700Schasinglulu * 108*91f16700Schasinglulu * Register usage: 109*91f16700Schasinglulu * r0/x0 SMC Function ID, TEESMC_OPTEED_RETURN_SYSTEM_OFF_DONE 110*91f16700Schasinglulu */ 111*91f16700Schasinglulu #define TEESMC_OPTEED_FUNCID_RETURN_SYSTEM_OFF_DONE 7 112*91f16700Schasinglulu #define TEESMC_OPTEED_RETURN_SYSTEM_OFF_DONE \ 113*91f16700Schasinglulu TEESMC_OPTEED_RV(TEESMC_OPTEED_FUNCID_RETURN_SYSTEM_OFF_DONE) 114*91f16700Schasinglulu 115*91f16700Schasinglulu /* 116*91f16700Schasinglulu * Issued when returning from "system_reset" vector 117*91f16700Schasinglulu * 118*91f16700Schasinglulu * Register usage: 119*91f16700Schasinglulu * r0/x0 SMC Function ID, TEESMC_OPTEED_RETURN_SYSTEM_RESET_DONE 120*91f16700Schasinglulu */ 121*91f16700Schasinglulu #define TEESMC_OPTEED_FUNCID_RETURN_SYSTEM_RESET_DONE 8 122*91f16700Schasinglulu #define TEESMC_OPTEED_RETURN_SYSTEM_RESET_DONE \ 123*91f16700Schasinglulu TEESMC_OPTEED_RV(TEESMC_OPTEED_FUNCID_RETURN_SYSTEM_RESET_DONE) 124*91f16700Schasinglulu 125*91f16700Schasinglulu /* 126*91f16700Schasinglulu * This section specifies SMC function IDs used when the secure monitor is 127*91f16700Schasinglulu * invoked from the non-secure world. 128*91f16700Schasinglulu */ 129*91f16700Schasinglulu 130*91f16700Schasinglulu /* 131*91f16700Schasinglulu * Load OP-TEE image from the payload specified in the registers. 132*91f16700Schasinglulu * 133*91f16700Schasinglulu * WARNING: Use this cautiously as it could lead to insecure loading of the 134*91f16700Schasinglulu * Trusted OS. Further details are in opteed.mk. 135*91f16700Schasinglulu * 136*91f16700Schasinglulu * Call register usage: 137*91f16700Schasinglulu * x0 SMC Function ID, OPTEE_SMC_CALL_LOAD_IMAGE 138*91f16700Schasinglulu * x1 Upper 32bit of a 64bit size for the payload 139*91f16700Schasinglulu * x2 Lower 32bit of a 64bit size for the payload 140*91f16700Schasinglulu * x3 Upper 32bit of the physical address for the payload 141*91f16700Schasinglulu * x4 Lower 32bit of the physical address for the payload 142*91f16700Schasinglulu * 143*91f16700Schasinglulu * The payload consists of a optee_header struct that contains optee_image 144*91f16700Schasinglulu * structs in a flex array, immediately following that in memory is the data 145*91f16700Schasinglulu * referenced by the optee_image structs. 146*91f16700Schasinglulu * Example: 147*91f16700Schasinglulu * 148*91f16700Schasinglulu * struct optee_header (with n images specified) 149*91f16700Schasinglulu * image 0 data 150*91f16700Schasinglulu * image 1 data 151*91f16700Schasinglulu * ... 152*91f16700Schasinglulu * image n-1 data 153*91f16700Schasinglulu * 154*91f16700Schasinglulu * Returns 0 on success and an error code otherwise. 155*91f16700Schasinglulu */ 156*91f16700Schasinglulu #define NSSMC_OPTEED_FUNCID_LOAD_IMAGE 2 157*91f16700Schasinglulu #define NSSMC_OPTEED_CALL_LOAD_IMAGE \ 158*91f16700Schasinglulu NSSMC_OPTEED_CALL(NSSMC_OPTEED_FUNCID_LOAD_IMAGE) 159*91f16700Schasinglulu 160*91f16700Schasinglulu /* 161*91f16700Schasinglulu * Returns the UID of the OP-TEE image loading service if image loading is 162*91f16700Schasinglulu * enabled and the image had not been loaded yet. Otherwise this call will be 163*91f16700Schasinglulu * passed through to OP-TEE where it will return the OP-TEE UID. 164*91f16700Schasinglulu */ 165*91f16700Schasinglulu #define NSSMC_OPTEED_FUNCID_CALLS_UID 0xFF01 166*91f16700Schasinglulu #define NSSMC_OPTEED_CALL_UID \ 167*91f16700Schasinglulu NSSMC_OPTEED_CALL(NSSMC_OPTEED_FUNCID_CALLS_UID) 168*91f16700Schasinglulu 169*91f16700Schasinglulu #endif /*TEESMC_OPTEED_H*/ 170