1aa5da461SJens Wiklander /* 205c69cf7SJeffrey Kardatzke * Copyright (c) 2014-2023, ARM Limited and Contributors. All rights reserved. 3aa5da461SJens Wiklander * 482cb2c1aSdp-arm * SPDX-License-Identifier: BSD-3-Clause 5aa5da461SJens Wiklander */ 6aa5da461SJens Wiklander 7aa5da461SJens Wiklander /* Copyright (c) 2014, Linaro Limited. All rights reserved. */ 8aa5da461SJens Wiklander 9aa5da461SJens Wiklander #ifndef TEESMC_OPTEED_H 10aa5da461SJens Wiklander #define TEESMC_OPTEED_H 11aa5da461SJens Wiklander 1205c69cf7SJeffrey Kardatzke #include "teesmc_opteed_macros.h" 1305c69cf7SJeffrey Kardatzke 14aa5da461SJens Wiklander /* 1505c69cf7SJeffrey Kardatzke * This section specifies SMC function IDs used when returning from TEE to the 16aa5da461SJens Wiklander * secure monitor. 17aa5da461SJens Wiklander * 18aa5da461SJens Wiklander * All SMC Function IDs indicates SMC32 Calling Convention but will carry 19aa5da461SJens Wiklander * full 64 bit values in the argument registers if invoked from Aarch64 20aa5da461SJens Wiklander * mode. This violates the SMC Calling Convention, but since this 218aabea33SPaul Beesley * convention only coveres API towards Normal World it's something that 22bd97f83aSJohn Tsichritzis * only concerns the OP-TEE Dispatcher in Trusted Firmware-A and OP-TEE 23aa5da461SJens Wiklander * OS at Secure EL1. 24aa5da461SJens Wiklander */ 25aa5da461SJens Wiklander 26aa5da461SJens Wiklander /* 27aa5da461SJens Wiklander * Issued when returning from initial entry. 28aa5da461SJens Wiklander * 29aa5da461SJens Wiklander * Register usage: 30aa5da461SJens Wiklander * r0/x0 SMC Function ID, TEESMC_OPTEED_RETURN_ENTRY_DONE 31aa5da461SJens Wiklander * r1/x1 Pointer to entry vector 32aa5da461SJens Wiklander */ 33aa5da461SJens Wiklander #define TEESMC_OPTEED_FUNCID_RETURN_ENTRY_DONE 0 34aa5da461SJens Wiklander #define TEESMC_OPTEED_RETURN_ENTRY_DONE \ 35aa5da461SJens Wiklander TEESMC_OPTEED_RV(TEESMC_OPTEED_FUNCID_RETURN_ENTRY_DONE) 36aa5da461SJens Wiklander 37aa5da461SJens Wiklander 38aa5da461SJens Wiklander 39aa5da461SJens Wiklander /* 40aa5da461SJens Wiklander * Issued when returning from "cpu_on" vector 41aa5da461SJens Wiklander * 42aa5da461SJens Wiklander * Register usage: 43aa5da461SJens Wiklander * r0/x0 SMC Function ID, TEESMC_OPTEED_RETURN_ON_DONE 44aa5da461SJens Wiklander * r1/x1 0 on success and anything else to indicate error condition 45aa5da461SJens Wiklander */ 46aa5da461SJens Wiklander #define TEESMC_OPTEED_FUNCID_RETURN_ON_DONE 1 47aa5da461SJens Wiklander #define TEESMC_OPTEED_RETURN_ON_DONE \ 48aa5da461SJens Wiklander TEESMC_OPTEED_RV(TEESMC_OPTEED_FUNCID_RETURN_ON_DONE) 49aa5da461SJens Wiklander 50aa5da461SJens Wiklander /* 51aa5da461SJens Wiklander * Issued when returning from "cpu_off" vector 52aa5da461SJens Wiklander * 53aa5da461SJens Wiklander * Register usage: 54aa5da461SJens Wiklander * r0/x0 SMC Function ID, TEESMC_OPTEED_RETURN_OFF_DONE 55aa5da461SJens Wiklander * r1/x1 0 on success and anything else to indicate error condition 56aa5da461SJens Wiklander */ 57aa5da461SJens Wiklander #define TEESMC_OPTEED_FUNCID_RETURN_OFF_DONE 2 58aa5da461SJens Wiklander #define TEESMC_OPTEED_RETURN_OFF_DONE \ 59aa5da461SJens Wiklander TEESMC_OPTEED_RV(TEESMC_OPTEED_FUNCID_RETURN_OFF_DONE) 60aa5da461SJens Wiklander 61aa5da461SJens Wiklander /* 62aa5da461SJens Wiklander * Issued when returning from "cpu_suspend" vector 63aa5da461SJens Wiklander * 64aa5da461SJens Wiklander * Register usage: 65aa5da461SJens Wiklander * r0/x0 SMC Function ID, TEESMC_OPTEED_RETURN_SUSPEND_DONE 66aa5da461SJens Wiklander * r1/x1 0 on success and anything else to indicate error condition 67aa5da461SJens Wiklander */ 68aa5da461SJens Wiklander #define TEESMC_OPTEED_FUNCID_RETURN_SUSPEND_DONE 3 69aa5da461SJens Wiklander #define TEESMC_OPTEED_RETURN_SUSPEND_DONE \ 70aa5da461SJens Wiklander TEESMC_OPTEED_RV(TEESMC_OPTEED_FUNCID_RETURN_SUSPEND_DONE) 71aa5da461SJens Wiklander 72aa5da461SJens Wiklander /* 73aa5da461SJens Wiklander * Issued when returning from "cpu_resume" vector 74aa5da461SJens Wiklander * 75aa5da461SJens Wiklander * Register usage: 76aa5da461SJens Wiklander * r0/x0 SMC Function ID, TEESMC_OPTEED_RETURN_RESUME_DONE 77aa5da461SJens Wiklander * r1/x1 0 on success and anything else to indicate error condition 78aa5da461SJens Wiklander */ 79aa5da461SJens Wiklander #define TEESMC_OPTEED_FUNCID_RETURN_RESUME_DONE 4 80aa5da461SJens Wiklander #define TEESMC_OPTEED_RETURN_RESUME_DONE \ 81aa5da461SJens Wiklander TEESMC_OPTEED_RV(TEESMC_OPTEED_FUNCID_RETURN_RESUME_DONE) 82aa5da461SJens Wiklander 83aa5da461SJens Wiklander /* 84aa5da461SJens Wiklander * Issued when returning from "std_smc" or "fast_smc" vector 85aa5da461SJens Wiklander * 86aa5da461SJens Wiklander * Register usage: 87aa5da461SJens Wiklander * r0/x0 SMC Function ID, TEESMC_OPTEED_RETURN_CALL_DONE 88aa5da461SJens Wiklander * r1-4/x1-4 Return value 0-3 which will passed to normal world in 89aa5da461SJens Wiklander * r0-3/x0-3 90aa5da461SJens Wiklander */ 91aa5da461SJens Wiklander #define TEESMC_OPTEED_FUNCID_RETURN_CALL_DONE 5 92aa5da461SJens Wiklander #define TEESMC_OPTEED_RETURN_CALL_DONE \ 93aa5da461SJens Wiklander TEESMC_OPTEED_RV(TEESMC_OPTEED_FUNCID_RETURN_CALL_DONE) 94aa5da461SJens Wiklander 95aa5da461SJens Wiklander /* 96aa5da461SJens Wiklander * Issued when returning from "fiq" vector 97aa5da461SJens Wiklander * 98aa5da461SJens Wiklander * Register usage: 99aa5da461SJens Wiklander * r0/x0 SMC Function ID, TEESMC_OPTEED_RETURN_FIQ_DONE 100aa5da461SJens Wiklander */ 101aa5da461SJens Wiklander #define TEESMC_OPTEED_FUNCID_RETURN_FIQ_DONE 6 102aa5da461SJens Wiklander #define TEESMC_OPTEED_RETURN_FIQ_DONE \ 103aa5da461SJens Wiklander TEESMC_OPTEED_RV(TEESMC_OPTEED_FUNCID_RETURN_FIQ_DONE) 104aa5da461SJens Wiklander 105aa5da461SJens Wiklander /* 106aa5da461SJens Wiklander * Issued when returning from "system_off" vector 107aa5da461SJens Wiklander * 108aa5da461SJens Wiklander * Register usage: 109aa5da461SJens Wiklander * r0/x0 SMC Function ID, TEESMC_OPTEED_RETURN_SYSTEM_OFF_DONE 110aa5da461SJens Wiklander */ 111aa5da461SJens Wiklander #define TEESMC_OPTEED_FUNCID_RETURN_SYSTEM_OFF_DONE 7 112aa5da461SJens Wiklander #define TEESMC_OPTEED_RETURN_SYSTEM_OFF_DONE \ 113aa5da461SJens Wiklander TEESMC_OPTEED_RV(TEESMC_OPTEED_FUNCID_RETURN_SYSTEM_OFF_DONE) 114aa5da461SJens Wiklander 115aa5da461SJens Wiklander /* 116aa5da461SJens Wiklander * Issued when returning from "system_reset" vector 117aa5da461SJens Wiklander * 118aa5da461SJens Wiklander * Register usage: 119aa5da461SJens Wiklander * r0/x0 SMC Function ID, TEESMC_OPTEED_RETURN_SYSTEM_RESET_DONE 120aa5da461SJens Wiklander */ 121aa5da461SJens Wiklander #define TEESMC_OPTEED_FUNCID_RETURN_SYSTEM_RESET_DONE 8 122aa5da461SJens Wiklander #define TEESMC_OPTEED_RETURN_SYSTEM_RESET_DONE \ 123aa5da461SJens Wiklander TEESMC_OPTEED_RV(TEESMC_OPTEED_FUNCID_RETURN_SYSTEM_RESET_DONE) 124aa5da461SJens Wiklander 12505c69cf7SJeffrey Kardatzke /* 12605c69cf7SJeffrey Kardatzke * This section specifies SMC function IDs used when the secure monitor is 12705c69cf7SJeffrey Kardatzke * invoked from the non-secure world. 12805c69cf7SJeffrey Kardatzke */ 12905c69cf7SJeffrey Kardatzke 13005c69cf7SJeffrey Kardatzke /* 13105c69cf7SJeffrey Kardatzke * Load OP-TEE image from the payload specified in the registers. 13205c69cf7SJeffrey Kardatzke * 13305c69cf7SJeffrey Kardatzke * WARNING: Use this cautiously as it could lead to insecure loading of the 13405c69cf7SJeffrey Kardatzke * Trusted OS. Further details are in opteed.mk. 13505c69cf7SJeffrey Kardatzke * 13605c69cf7SJeffrey Kardatzke * Call register usage: 13705c69cf7SJeffrey Kardatzke * x0 SMC Function ID, OPTEE_SMC_CALL_LOAD_IMAGE 13805c69cf7SJeffrey Kardatzke * x1 Upper 32bit of a 64bit size for the payload 13905c69cf7SJeffrey Kardatzke * x2 Lower 32bit of a 64bit size for the payload 14005c69cf7SJeffrey Kardatzke * x3 Upper 32bit of the physical address for the payload 14105c69cf7SJeffrey Kardatzke * x4 Lower 32bit of the physical address for the payload 14205c69cf7SJeffrey Kardatzke * 14305c69cf7SJeffrey Kardatzke * The payload consists of a optee_header struct that contains optee_image 14405c69cf7SJeffrey Kardatzke * structs in a flex array, immediately following that in memory is the data 14505c69cf7SJeffrey Kardatzke * referenced by the optee_image structs. 14605c69cf7SJeffrey Kardatzke * Example: 14705c69cf7SJeffrey Kardatzke * 14805c69cf7SJeffrey Kardatzke * struct optee_header (with n images specified) 14905c69cf7SJeffrey Kardatzke * image 0 data 15005c69cf7SJeffrey Kardatzke * image 1 data 15105c69cf7SJeffrey Kardatzke * ... 15205c69cf7SJeffrey Kardatzke * image n-1 data 15305c69cf7SJeffrey Kardatzke * 15405c69cf7SJeffrey Kardatzke * Returns 0 on success and an error code otherwise. 15505c69cf7SJeffrey Kardatzke */ 15605c69cf7SJeffrey Kardatzke #define NSSMC_OPTEED_FUNCID_LOAD_IMAGE 2 15705c69cf7SJeffrey Kardatzke #define NSSMC_OPTEED_CALL_LOAD_IMAGE \ 15805c69cf7SJeffrey Kardatzke NSSMC_OPTEED_CALL(NSSMC_OPTEED_FUNCID_LOAD_IMAGE) 15905c69cf7SJeffrey Kardatzke 160*85ab8823SJeffrey Kardatzke /* 161*85ab8823SJeffrey Kardatzke * Returns the UID of the OP-TEE image loading service if image loading is 162*85ab8823SJeffrey Kardatzke * enabled and the image had not been loaded yet. Otherwise this call will be 163*85ab8823SJeffrey Kardatzke * passed through to OP-TEE where it will return the OP-TEE UID. 164*85ab8823SJeffrey Kardatzke */ 165*85ab8823SJeffrey Kardatzke #define NSSMC_OPTEED_FUNCID_CALLS_UID 0xFF01 166*85ab8823SJeffrey Kardatzke #define NSSMC_OPTEED_CALL_UID \ 167*85ab8823SJeffrey Kardatzke NSSMC_OPTEED_CALL(NSSMC_OPTEED_FUNCID_CALLS_UID) 168*85ab8823SJeffrey Kardatzke 169aa5da461SJens Wiklander #endif /*TEESMC_OPTEED_H*/ 170