1e43888b8SJens Wiklander /* 2e43888b8SJens Wiklander * Copyright (c) 2015, Linaro Limited 3e43888b8SJens Wiklander * All rights reserved. 4e43888b8SJens Wiklander * 5e43888b8SJens Wiklander * Redistribution and use in source and binary forms, with or without 6e43888b8SJens Wiklander * modification, are permitted provided that the following conditions are met: 7e43888b8SJens Wiklander * 8e43888b8SJens Wiklander * 1. Redistributions of source code must retain the above copyright notice, 9e43888b8SJens Wiklander * this list of conditions and the following disclaimer. 10e43888b8SJens Wiklander * 11e43888b8SJens Wiklander * 2. Redistributions in binary form must reproduce the above copyright notice, 12e43888b8SJens Wiklander * this list of conditions and the following disclaimer in the documentation 13e43888b8SJens Wiklander * and/or other materials provided with the distribution. 14e43888b8SJens Wiklander * 15e43888b8SJens Wiklander * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 16e43888b8SJens Wiklander * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17e43888b8SJens Wiklander * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18e43888b8SJens Wiklander * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 19e43888b8SJens Wiklander * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 20e43888b8SJens Wiklander * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 21e43888b8SJens Wiklander * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 22e43888b8SJens Wiklander * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23e43888b8SJens Wiklander * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 24e43888b8SJens Wiklander * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25e43888b8SJens Wiklander * POSSIBILITY OF SUCH DAMAGE. 26e43888b8SJens Wiklander */ 27e43888b8SJens Wiklander #ifndef _OPTEE_MSG_H 28e43888b8SJens Wiklander #define _OPTEE_MSG_H 29e43888b8SJens Wiklander 30e43888b8SJens Wiklander /* 31e43888b8SJens Wiklander * This file defines the OP-TEE message protocol used to communicate 32e43888b8SJens Wiklander * with an instance of OP-TEE running in secure world. 33e43888b8SJens Wiklander * 34e43888b8SJens Wiklander * This file is divided into three sections. 35e43888b8SJens Wiklander * 1. Formatting of messages. 36e43888b8SJens Wiklander * 2. Requests from normal world 37e43888b8SJens Wiklander * 3. Requests from secure world, Remote Procedure Call (RPC), handled by 38e43888b8SJens Wiklander * tee-supplicant. 39e43888b8SJens Wiklander */ 40e43888b8SJens Wiklander 41e43888b8SJens Wiklander /***************************************************************************** 42e43888b8SJens Wiklander * Part 1 - formatting of messages 43e43888b8SJens Wiklander *****************************************************************************/ 44e43888b8SJens Wiklander 45e43888b8SJens Wiklander #define OPTEE_MSG_ATTR_TYPE_NONE 0x0 46e43888b8SJens Wiklander #define OPTEE_MSG_ATTR_TYPE_VALUE_INPUT 0x1 47e43888b8SJens Wiklander #define OPTEE_MSG_ATTR_TYPE_VALUE_OUTPUT 0x2 48e43888b8SJens Wiklander #define OPTEE_MSG_ATTR_TYPE_VALUE_INOUT 0x3 49e43888b8SJens Wiklander #define OPTEE_MSG_ATTR_TYPE_RMEM_INPUT 0x5 50e43888b8SJens Wiklander #define OPTEE_MSG_ATTR_TYPE_RMEM_OUTPUT 0x6 51e43888b8SJens Wiklander #define OPTEE_MSG_ATTR_TYPE_RMEM_INOUT 0x7 52e43888b8SJens Wiklander #define OPTEE_MSG_ATTR_TYPE_TMEM_INPUT 0x9 53e43888b8SJens Wiklander #define OPTEE_MSG_ATTR_TYPE_TMEM_OUTPUT 0xa 54e43888b8SJens Wiklander #define OPTEE_MSG_ATTR_TYPE_TMEM_INOUT 0xb 55e43888b8SJens Wiklander 56e43888b8SJens Wiklander #define OPTEE_MSG_ATTR_TYPE_MASK 0xff 57e43888b8SJens Wiklander 58e43888b8SJens Wiklander /* 59e43888b8SJens Wiklander * Meta parameter to be absorbed by the Secure OS and not passed 60e43888b8SJens Wiklander * to the Trusted Application. 61e43888b8SJens Wiklander * 62e43888b8SJens Wiklander * Currently only used with OPTEE_MSG_CMD_OPEN_SESSION. 63e43888b8SJens Wiklander */ 64e43888b8SJens Wiklander #define OPTEE_MSG_ATTR_META (1 << 8) 65e43888b8SJens Wiklander 66e43888b8SJens Wiklander /* 67e43888b8SJens Wiklander * The temporary shared memory object is not physically contiguous and this 68e43888b8SJens Wiklander * temp memref is followed by another fragment until the last temp memref 69e43888b8SJens Wiklander * that doesn't have this bit set. 70e43888b8SJens Wiklander */ 71e43888b8SJens Wiklander #define OPTEE_MSG_ATTR_FRAGMENT (1 << 9) 72e43888b8SJens Wiklander 73e43888b8SJens Wiklander /* 74e43888b8SJens Wiklander * Memory attributes for caching passed with temp memrefs. The actual value 75e43888b8SJens Wiklander * used is defined outside the message protocol with the exception of 76e43888b8SJens Wiklander * OPTEE_MSG_ATTR_CACHE_PREDEFINED which means the attributes already 77e43888b8SJens Wiklander * defined for the memory range should be used. If optee_smc.h is used as 78e43888b8SJens Wiklander * bearer of this protocol OPTEE_SMC_SHM_* is used for values. 79e43888b8SJens Wiklander */ 80e43888b8SJens Wiklander #define OPTEE_MSG_ATTR_CACHE_SHIFT 16 81e43888b8SJens Wiklander #define OPTEE_MSG_ATTR_CACHE_MASK 0x7 82e43888b8SJens Wiklander #define OPTEE_MSG_ATTR_CACHE_PREDEFINED 0 83e43888b8SJens Wiklander 84e43888b8SJens Wiklander /* 85e43888b8SJens Wiklander * Same values as TEE_LOGIN_* from TEE Internal API 86e43888b8SJens Wiklander */ 87e43888b8SJens Wiklander #define OPTEE_MSG_LOGIN_PUBLIC 0x00000000 88e43888b8SJens Wiklander #define OPTEE_MSG_LOGIN_USER 0x00000001 89e43888b8SJens Wiklander #define OPTEE_MSG_LOGIN_GROUP 0x00000002 90e43888b8SJens Wiklander #define OPTEE_MSG_LOGIN_APPLICATION 0x00000004 91e43888b8SJens Wiklander #define OPTEE_MSG_LOGIN_APPLICATION_USER 0x00000005 92e43888b8SJens Wiklander #define OPTEE_MSG_LOGIN_APPLICATION_GROUP 0x00000006 93e43888b8SJens Wiklander 94e43888b8SJens Wiklander #ifndef ASM 95e43888b8SJens Wiklander /** 96e43888b8SJens Wiklander * struct optee_msg_param_tmem - temporary memory reference 97e43888b8SJens Wiklander * @buf_ptr: Address of the buffer 98e43888b8SJens Wiklander * @size: Size of the buffer 99e43888b8SJens Wiklander * @shm_ref: Temporary shared memory reference, pointer to a struct tee_shm 100e43888b8SJens Wiklander * 101e43888b8SJens Wiklander * Secure and normal world communicates pointers as physical address 102e43888b8SJens Wiklander * instead of the virtual address. This is because secure and normal world 103e43888b8SJens Wiklander * have completely independent memory mapping. Normal world can even have a 104e43888b8SJens Wiklander * hypervisor which need to translate the guest physical address (AKA IPA 105e43888b8SJens Wiklander * in ARM documentation) to a real physical address before passing the 106e43888b8SJens Wiklander * structure to secure world. 107e43888b8SJens Wiklander */ 108e43888b8SJens Wiklander struct optee_msg_param_tmem { 109e43888b8SJens Wiklander uint64_t buf_ptr; 110e43888b8SJens Wiklander uint64_t size; 111e43888b8SJens Wiklander uint64_t shm_ref; 112e43888b8SJens Wiklander }; 113e43888b8SJens Wiklander 114e43888b8SJens Wiklander /** 115e43888b8SJens Wiklander * struct optee_msg_param_rmem - registered memory reference 116e43888b8SJens Wiklander * @offs: Offset into shared memory reference 117e43888b8SJens Wiklander * @size: Size of the buffer 118e43888b8SJens Wiklander * @shm_ref: Shared memory reference, pointer to a struct tee_shm 119e43888b8SJens Wiklander */ 120e43888b8SJens Wiklander struct optee_msg_param_rmem { 121e43888b8SJens Wiklander uint64_t offs; 122e43888b8SJens Wiklander uint64_t size; 123e43888b8SJens Wiklander uint64_t shm_ref; 124e43888b8SJens Wiklander }; 125e43888b8SJens Wiklander 126e43888b8SJens Wiklander /** 127e43888b8SJens Wiklander * struct optee_msg_param_value - values 128e43888b8SJens Wiklander * @a: first value 129e43888b8SJens Wiklander * @b: second value 130e43888b8SJens Wiklander * @c: third value 131e43888b8SJens Wiklander */ 132e43888b8SJens Wiklander struct optee_msg_param_value { 133e43888b8SJens Wiklander uint64_t a; 134e43888b8SJens Wiklander uint64_t b; 135e43888b8SJens Wiklander uint64_t c; 136e43888b8SJens Wiklander }; 137e43888b8SJens Wiklander 138e43888b8SJens Wiklander /** 139e43888b8SJens Wiklander * struct optee_msg_param - parameter 140e43888b8SJens Wiklander * @attr: attributes 141e43888b8SJens Wiklander * @memref: a memory reference 142e43888b8SJens Wiklander * @value: a value 143e43888b8SJens Wiklander * 144e43888b8SJens Wiklander * @attr & OPTEE_MSG_ATTR_TYPE_MASK indicates if tmem, rmem or value is used in 145e43888b8SJens Wiklander * the union. OPTEE_MSG_ATTR_TYPE_VALUE_* indicates value, 146e43888b8SJens Wiklander * OPTEE_MSG_ATTR_TYPE_TMEM_* indicates tmem and 147e43888b8SJens Wiklander * OPTEE_MSG_ATTR_TYPE_RMEM_* indicates rmem. 148e43888b8SJens Wiklander * OPTEE_MSG_ATTR_TYPE_NONE indicates that none of the members are used. 149e43888b8SJens Wiklander */ 150e43888b8SJens Wiklander struct optee_msg_param { 151e43888b8SJens Wiklander uint64_t attr; 152e43888b8SJens Wiklander union { 153e43888b8SJens Wiklander struct optee_msg_param_tmem tmem; 154e43888b8SJens Wiklander struct optee_msg_param_rmem rmem; 155e43888b8SJens Wiklander struct optee_msg_param_value value; 156e43888b8SJens Wiklander } u; 157e43888b8SJens Wiklander }; 158e43888b8SJens Wiklander 159e43888b8SJens Wiklander /** 160e43888b8SJens Wiklander * struct optee_msg_arg - call argument 161e43888b8SJens Wiklander * @cmd: Command, one of OPTEE_MSG_CMD_* or OPTEE_MSG_RPC_CMD_* 162e43888b8SJens Wiklander * @func: Trusted Application function, specific to the Trusted Application, 163e43888b8SJens Wiklander * used if cmd == OPTEE_MSG_CMD_INVOKE_COMMAND 164e43888b8SJens Wiklander * @session: In parameter for all OPTEE_MSG_CMD_* except 165e43888b8SJens Wiklander * OPTEE_MSG_CMD_OPEN_SESSION where it's an output parameter instead 166e43888b8SJens Wiklander * @cancel_id: Cancellation id, a unique value to identify this request 167e43888b8SJens Wiklander * @ret: return value 168e43888b8SJens Wiklander * @ret_origin: origin of the return value 169e43888b8SJens Wiklander * @num_params: number of parameters supplied to the OS Command 170e43888b8SJens Wiklander * @params: the parameters supplied to the OS Command 171e43888b8SJens Wiklander * 172e43888b8SJens Wiklander * All normal calls to Trusted OS uses this struct. If cmd requires further 173e43888b8SJens Wiklander * information than what these fields hold it can be passed as a parameter 174e43888b8SJens Wiklander * tagged as meta (setting the OPTEE_MSG_ATTR_META bit in corresponding 175e43888b8SJens Wiklander * attrs field). All parameters tagged as meta have to come first. 176e43888b8SJens Wiklander * 177e43888b8SJens Wiklander * Temp memref parameters can be fragmented if supported by the Trusted OS 178e43888b8SJens Wiklander * (when optee_smc.h is bearer of this protocol this is indicated with 179e43888b8SJens Wiklander * OPTEE_SMC_SEC_CAP_UNREGISTERED_SHM). If a logical memref parameter is 180e43888b8SJens Wiklander * fragmented then all but the last fragment have the 181e43888b8SJens Wiklander * OPTEE_MSG_ATTR_FRAGMENT bit set in attrs. Even if a memref is fragmented 182e43888b8SJens Wiklander * it will still be presented as a single logical memref to the Trusted 183e43888b8SJens Wiklander * Application. 184e43888b8SJens Wiklander */ 185e43888b8SJens Wiklander struct optee_msg_arg { 186e43888b8SJens Wiklander uint32_t cmd; 187e43888b8SJens Wiklander uint32_t func; 188e43888b8SJens Wiklander uint32_t session; 189e43888b8SJens Wiklander uint32_t cancel_id; 190e43888b8SJens Wiklander uint32_t pad; 191e43888b8SJens Wiklander uint32_t ret; 192e43888b8SJens Wiklander uint32_t ret_origin; 193e43888b8SJens Wiklander uint32_t num_params; 194e43888b8SJens Wiklander 195e43888b8SJens Wiklander /* 196e43888b8SJens Wiklander * this struct is 8 byte aligned since the 'struct optee_msg_param' 197e43888b8SJens Wiklander * which follows requires 8 byte alignment. 198e43888b8SJens Wiklander * 199e43888b8SJens Wiklander * Commented out element used to visualize the layout dynamic part 200e43888b8SJens Wiklander * of the struct. This field is not available at all if 201e43888b8SJens Wiklander * num_params == 0. 202e43888b8SJens Wiklander * 203e43888b8SJens Wiklander * params is accessed through the macro OPTEE_MSG_GET_PARAMS 204e43888b8SJens Wiklander * 205e43888b8SJens Wiklander * struct optee_msg_param params[num_params]; 206e43888b8SJens Wiklander */ 207e43888b8SJens Wiklander } __aligned(8); 208e43888b8SJens Wiklander 209e43888b8SJens Wiklander /** 210e43888b8SJens Wiklander * OPTEE_MSG_GET_PARAMS - return pointer to struct optee_msg_param * 211e43888b8SJens Wiklander * 212e43888b8SJens Wiklander * @x: Pointer to a struct optee_msg_arg 213e43888b8SJens Wiklander * 214e43888b8SJens Wiklander * Returns a pointer to the params[] inside a struct optee_msg_arg. 215e43888b8SJens Wiklander */ 216e43888b8SJens Wiklander #define OPTEE_MSG_GET_PARAMS(x) \ 217e43888b8SJens Wiklander (struct optee_msg_param *)(((struct optee_msg_arg *)(x)) + 1) 218e43888b8SJens Wiklander 219e43888b8SJens Wiklander /** 220e43888b8SJens Wiklander * OPTEE_MSG_GET_ARG_SIZE - return size of struct optee_msg_arg 221e43888b8SJens Wiklander * 222e43888b8SJens Wiklander * @num_params: Number of parameters embedded in the struct optee_msg_arg 223e43888b8SJens Wiklander * 224e43888b8SJens Wiklander * Returns the size of the struct optee_msg_arg together with the number 225e43888b8SJens Wiklander * of embedded parameters. 226e43888b8SJens Wiklander */ 227e43888b8SJens Wiklander #define OPTEE_MSG_GET_ARG_SIZE(num_params) \ 228e43888b8SJens Wiklander (sizeof(struct optee_msg_arg) + \ 229e43888b8SJens Wiklander sizeof(struct optee_msg_param) * (num_params)) 230e43888b8SJens Wiklander #endif /*ASM*/ 231e43888b8SJens Wiklander 232e43888b8SJens Wiklander /***************************************************************************** 233e43888b8SJens Wiklander * Part 2 - requests from normal world 234e43888b8SJens Wiklander *****************************************************************************/ 235e43888b8SJens Wiklander 236e43888b8SJens Wiklander /* 237e43888b8SJens Wiklander * Return the following UID if using API specified in this file without 238e43888b8SJens Wiklander * further extensions: 239e43888b8SJens Wiklander * 384fb3e0-e7f8-11e3-af63-0002a5d5c51b. 240e43888b8SJens Wiklander * Represented in 4 32-bit words in OPTEE_MSG_UID_0, OPTEE_MSG_UID_1, 241e43888b8SJens Wiklander * OPTEE_MSG_UID_2, OPTEE_MSG_UID_3. 242e43888b8SJens Wiklander */ 243e43888b8SJens Wiklander #define OPTEE_MSG_UID_0 0x384fb3e0 244e43888b8SJens Wiklander #define OPTEE_MSG_UID_1 0xe7f811e3 245e43888b8SJens Wiklander #define OPTEE_MSG_UID_2 0xaf630002 246e43888b8SJens Wiklander #define OPTEE_MSG_UID_3 0xa5d5c51b 247e43888b8SJens Wiklander #define OPTEE_MSG_FUNCID_CALLS_UID 0xFF01 248e43888b8SJens Wiklander 249e43888b8SJens Wiklander /* 250e43888b8SJens Wiklander * Returns 2.0 if using API specified in this file without further 251e43888b8SJens Wiklander * extensions. Represented in 2 32-bit words in OPTEE_MSG_REVISION_MAJOR 252e43888b8SJens Wiklander * and OPTEE_MSG_REVISION_MINOR 253e43888b8SJens Wiklander */ 254e43888b8SJens Wiklander #define OPTEE_MSG_REVISION_MAJOR 2 255e43888b8SJens Wiklander #define OPTEE_MSG_REVISION_MINOR 0 256e43888b8SJens Wiklander #define OPTEE_MSG_FUNCID_CALLS_REVISION 0xFF03 257e43888b8SJens Wiklander 258e43888b8SJens Wiklander /* 259e43888b8SJens Wiklander * Get UUID of Trusted OS. 260e43888b8SJens Wiklander * 261e43888b8SJens Wiklander * Used by non-secure world to figure out which Trusted OS is installed. 262e43888b8SJens Wiklander * Note that returned UUID is the UUID of the Trusted OS, not of the API. 263e43888b8SJens Wiklander * 264e43888b8SJens Wiklander * Returns UUID in 4 32-bit words in the same way as 265e43888b8SJens Wiklander * OPTEE_MSG_FUNCID_CALLS_UID described above. 266e43888b8SJens Wiklander */ 267e43888b8SJens Wiklander #define OPTEE_MSG_OS_OPTEE_UUID_0 0x486178e0 268e43888b8SJens Wiklander #define OPTEE_MSG_OS_OPTEE_UUID_1 0xe7f811e3 269e43888b8SJens Wiklander #define OPTEE_MSG_OS_OPTEE_UUID_2 0xbc5e0002 270e43888b8SJens Wiklander #define OPTEE_MSG_OS_OPTEE_UUID_3 0xa5d5c51b 271e43888b8SJens Wiklander #define OPTEE_MSG_FUNCID_GET_OS_UUID 0x0000 272e43888b8SJens Wiklander 273e43888b8SJens Wiklander /* 274e43888b8SJens Wiklander * Get revision of Trusted OS. 275e43888b8SJens Wiklander * 276e43888b8SJens Wiklander * Used by non-secure world to figure out which version of the Trusted OS 277e43888b8SJens Wiklander * is installed. Note that the returned revision is the revision of the 278e43888b8SJens Wiklander * Trusted OS, not of the API. 279e43888b8SJens Wiklander * 280e43888b8SJens Wiklander * Returns revision in 2 32-bit words in the same way as 281e43888b8SJens Wiklander * OPTEE_MSG_CALLS_REVISION described above. 282e43888b8SJens Wiklander */ 283e43888b8SJens Wiklander #define OPTEE_MSG_FUNCID_GET_OS_REVISION 0x0001 284e43888b8SJens Wiklander 285e43888b8SJens Wiklander /* 286e43888b8SJens Wiklander * Do a secure call with struct optee_msg_arg as argument 287e43888b8SJens Wiklander * The OPTEE_MSG_CMD_* below defines what goes in struct optee_msg_arg::cmd 288e43888b8SJens Wiklander * 289e43888b8SJens Wiklander * OPTEE_MSG_CMD_OPEN_SESSION opens a session to a Trusted Application. 290e43888b8SJens Wiklander * The first two parameters are tagged as meta, holding two value 291e43888b8SJens Wiklander * parameters to pass the following information: 292e43888b8SJens Wiklander * param[0].u.value.a-b uuid of Trusted Application 293e43888b8SJens Wiklander * param[1].u.value.a-b uuid of Client 294e43888b8SJens Wiklander * param[1].u.value.c Login class of client OPTEE_MSG_LOGIN_* 295e43888b8SJens Wiklander * 296e43888b8SJens Wiklander * OPTEE_MSG_CMD_INVOKE_COMMAND invokes a command a previously opened 297e43888b8SJens Wiklander * session to a Trusted Application. struct optee_msg_arg::func is Trusted 298e43888b8SJens Wiklander * Application function, specific to the Trusted Application. 299e43888b8SJens Wiklander * 300e43888b8SJens Wiklander * OPTEE_MSG_CMD_CLOSE_SESSION closes a previously opened session to 301e43888b8SJens Wiklander * Trusted Application. 302e43888b8SJens Wiklander * 303e43888b8SJens Wiklander * OPTEE_MSG_CMD_CANCEL cancels a currently invoked command. 304e43888b8SJens Wiklander * 305e43888b8SJens Wiklander * OPTEE_MSG_CMD_REGISTER_SHM registers a shared memory reference. The 306e43888b8SJens Wiklander * information is passed as: 307e43888b8SJens Wiklander * [in] param[0].attr OPTEE_MSG_ATTR_TYPE_TMEM_INPUT 308e43888b8SJens Wiklander * [| OPTEE_MSG_ATTR_FRAGMENT] 309e43888b8SJens Wiklander * [in] param[0].u.tmem.buf_ptr physical address (of first fragment) 310e43888b8SJens Wiklander * [in] param[0].u.tmem.size size (of first fragment) 311e43888b8SJens Wiklander * [in] param[0].u.tmem.shm_ref holds shared memory reference 312e43888b8SJens Wiklander * ... 313e43888b8SJens Wiklander * The shared memory can optionally be fragmented, temp memrefs can follow 314e43888b8SJens Wiklander * each other with all but the last with the OPTEE_MSG_ATTR_FRAGMENT bit set. 315e43888b8SJens Wiklander * 316e43888b8SJens Wiklander * OPTEE_MSG_CMD_UNREGISTER_SHM unregisteres a previously registered shared 317e43888b8SJens Wiklander * memory reference. The information is passed as: 318e43888b8SJens Wiklander * [in] param[0].attr OPTEE_MSG_ATTR_TYPE_RMEM_INPUT 319e43888b8SJens Wiklander * [in] param[0].u.rmem.shm_ref holds shared memory reference 320e43888b8SJens Wiklander * [in] param[0].u.rmem.offs 0 321e43888b8SJens Wiklander * [in] param[0].u.rmem.size 0 322e43888b8SJens Wiklander */ 323e43888b8SJens Wiklander #define OPTEE_MSG_CMD_OPEN_SESSION 0 324e43888b8SJens Wiklander #define OPTEE_MSG_CMD_INVOKE_COMMAND 1 325e43888b8SJens Wiklander #define OPTEE_MSG_CMD_CLOSE_SESSION 2 326e43888b8SJens Wiklander #define OPTEE_MSG_CMD_CANCEL 3 327e43888b8SJens Wiklander #define OPTEE_MSG_CMD_REGISTER_SHM 4 328e43888b8SJens Wiklander #define OPTEE_MSG_CMD_UNREGISTER_SHM 5 329e43888b8SJens Wiklander #define OPTEE_MSG_FUNCID_CALL_WITH_ARG 0x0004 330e43888b8SJens Wiklander 331e43888b8SJens Wiklander /***************************************************************************** 332e43888b8SJens Wiklander * Part 3 - Requests from secure world, RPC 333e43888b8SJens Wiklander *****************************************************************************/ 334e43888b8SJens Wiklander 335e43888b8SJens Wiklander /* 336e43888b8SJens Wiklander * All RPC is done with a struct optee_msg_arg as bearer of information, 337e43888b8SJens Wiklander * struct optee_msg_arg::arg holds values defined by OPTEE_MSG_RPC_CMD_* below 338e43888b8SJens Wiklander * 339e43888b8SJens Wiklander * RPC communication with tee-supplicant is reversed compared to normal 340e43888b8SJens Wiklander * client communication desribed above. The supplicant receives requests 341e43888b8SJens Wiklander * and sends responses. 342e43888b8SJens Wiklander */ 343e43888b8SJens Wiklander 344e43888b8SJens Wiklander /* 345e43888b8SJens Wiklander * Load a TA into memory, defined in tee-supplicant 346e43888b8SJens Wiklander */ 347e43888b8SJens Wiklander #define OPTEE_MSG_RPC_CMD_LOAD_TA 0 348e43888b8SJens Wiklander 349e43888b8SJens Wiklander /* 350e43888b8SJens Wiklander * Replay Protected Memory Block access, defined in tee-supplicant 351e43888b8SJens Wiklander */ 352e43888b8SJens Wiklander #define OPTEE_MSG_RPC_CMD_RPMB 1 353e43888b8SJens Wiklander 354e43888b8SJens Wiklander /* 355e43888b8SJens Wiklander * File system access, defined in tee-supplicant 356e43888b8SJens Wiklander */ 357e43888b8SJens Wiklander #define OPTEE_MSG_RPC_CMD_FS 2 358e43888b8SJens Wiklander 359e43888b8SJens Wiklander /* 360e43888b8SJens Wiklander * Get time 361e43888b8SJens Wiklander * 362e43888b8SJens Wiklander * Returns number of seconds and nano seconds since the Epoch, 363e43888b8SJens Wiklander * 1970-01-01 00:00:00 +0000 (UTC). 364e43888b8SJens Wiklander * 365e43888b8SJens Wiklander * [out] param[0].u.value.a Number of seconds 366e43888b8SJens Wiklander * [out] param[0].u.value.b Number of nano seconds. 367e43888b8SJens Wiklander */ 368e43888b8SJens Wiklander #define OPTEE_MSG_RPC_CMD_GET_TIME 3 369e43888b8SJens Wiklander 370e43888b8SJens Wiklander /* 371e43888b8SJens Wiklander * Wait queue primitive, helper for secure world to implement a wait queue 372e43888b8SJens Wiklander * 373e43888b8SJens Wiklander * Waiting on a key 374e43888b8SJens Wiklander * [in] param[0].u.value.a OPTEE_MSG_RPC_WAIT_QUEUE_SLEEP 375e43888b8SJens Wiklander * [in] param[0].u.value.b wait key 376e43888b8SJens Wiklander * 377e43888b8SJens Wiklander * Waking up a key 378e43888b8SJens Wiklander * [in] param[0].u.value.a OPTEE_MSG_RPC_WAIT_QUEUE_WAKEUP 379e43888b8SJens Wiklander * [in] param[0].u.value.b wakeup key 380e43888b8SJens Wiklander */ 381e43888b8SJens Wiklander #define OPTEE_MSG_RPC_CMD_WAIT_QUEUE 4 382e43888b8SJens Wiklander #define OPTEE_MSG_RPC_WAIT_QUEUE_SLEEP 0 383e43888b8SJens Wiklander #define OPTEE_MSG_RPC_WAIT_QUEUE_WAKEUP 1 384e43888b8SJens Wiklander 385e43888b8SJens Wiklander /* 386e43888b8SJens Wiklander * Suspend execution 387e43888b8SJens Wiklander * 388e43888b8SJens Wiklander * [in] param[0].value .a number of milliseconds to suspend 389e43888b8SJens Wiklander */ 390e43888b8SJens Wiklander #define OPTEE_MSG_RPC_CMD_SUSPEND 5 391e43888b8SJens Wiklander 392e43888b8SJens Wiklander /* 393e43888b8SJens Wiklander * Allocate a piece of shared memory 394e43888b8SJens Wiklander * 395e43888b8SJens Wiklander * Shared memory can optionally be fragmented, to support that additional 396e43888b8SJens Wiklander * spare param entries are allocated to make room for eventual fragments. 397e43888b8SJens Wiklander * The spare param entries has .attr = OPTEE_MSG_ATTR_TYPE_NONE when 398e43888b8SJens Wiklander * unused. All returned temp memrefs except the last should have the 399e43888b8SJens Wiklander * OPTEE_MSG_ATTR_FRAGMENT bit set in the attr field. 400e43888b8SJens Wiklander * 401e43888b8SJens Wiklander * [in] param[0].u.value.a type of memory one of 402e43888b8SJens Wiklander * OPTEE_MSG_RPC_SHM_TYPE_* below 403e43888b8SJens Wiklander * [in] param[0].u.value.b requested size 404e43888b8SJens Wiklander * [in] param[0].u.value.c required alignment 405e43888b8SJens Wiklander * 406e43888b8SJens Wiklander * [out] param[0].u.tmem.buf_ptr physical address (of first fragment) 407e43888b8SJens Wiklander * [out] param[0].u.tmem.size size (of first fragment) 408e43888b8SJens Wiklander * [out] param[0].u.tmem.shm_ref shared memory reference 409e43888b8SJens Wiklander * ... 410e43888b8SJens Wiklander * [out] param[n].u.tmem.buf_ptr physical address 411e43888b8SJens Wiklander * [out] param[n].u.tmem.size size 412e43888b8SJens Wiklander * [out] param[n].u.tmem.shm_ref shared memory reference (same value 413e43888b8SJens Wiklander * as in param[n-1].u.tmem.shm_ref) 414e43888b8SJens Wiklander */ 415e43888b8SJens Wiklander #define OPTEE_MSG_RPC_CMD_SHM_ALLOC 6 416e43888b8SJens Wiklander /* Memory that can be shared with a non-secure user space application */ 417e43888b8SJens Wiklander #define OPTEE_MSG_RPC_SHM_TYPE_APPL 0 418e43888b8SJens Wiklander /* Memory only shared with non-secure kernel */ 419e43888b8SJens Wiklander #define OPTEE_MSG_RPC_SHM_TYPE_KERNEL 1 420e43888b8SJens Wiklander 421*8a86d345SJens Wiklander /* 422*8a86d345SJens Wiklander * Free shared memory previously allocated with OPTEE_MSG_RPC_CMD_SHM_ALLOC 423*8a86d345SJens Wiklander * 424*8a86d345SJens Wiklander * [in] param[0].u.value.a type of memory one of 425*8a86d345SJens Wiklander * OPTEE_MSG_RPC_SHM_TYPE_* above 426*8a86d345SJens Wiklander * [in] param[0].u.value.b value of shared memory reference 427*8a86d345SJens Wiklander * returned in param[0].u.tmem.shm_ref 428*8a86d345SJens Wiklander * above 429*8a86d345SJens Wiklander */ 430*8a86d345SJens Wiklander #define OPTEE_MSG_RPC_CMD_SHM_FREE 7 431*8a86d345SJens Wiklander 432*8a86d345SJens Wiklander 433e43888b8SJens Wiklander #endif /* _OPTEE_MSG_H */ 434