1*d4bd3d25SJens Wiklander /* SPDX-License-Identifier: BSD-2-Clause */ 2*d4bd3d25SJens Wiklander /* 3*d4bd3d25SJens Wiklander * Copyright (c) 2015-2018, Linaro Limited 4*d4bd3d25SJens Wiklander */ 5*d4bd3d25SJens Wiklander 6*d4bd3d25SJens Wiklander #ifndef _OPTEE_MSG_H 7*d4bd3d25SJens Wiklander #define _OPTEE_MSG_H 8*d4bd3d25SJens Wiklander 9*d4bd3d25SJens Wiklander #include <linux/bitops.h> 10*d4bd3d25SJens Wiklander #include <linux/types.h> 11*d4bd3d25SJens Wiklander 12*d4bd3d25SJens Wiklander /* 13*d4bd3d25SJens Wiklander * This file defines the OP-TEE message protocol used to communicate with 14*d4bd3d25SJens Wiklander * an instance of OP-TEE running in secure world. This file is based on 15*d4bd3d25SJens Wiklander * https://github.com/OP-TEE/optee_os/blob/master/core/include/optee_msg.h 16*d4bd3d25SJens Wiklander * and may need to be updated when introducing new features. 17*d4bd3d25SJens Wiklander * 18*d4bd3d25SJens Wiklander * This file is divided into three sections. 19*d4bd3d25SJens Wiklander * 1. Formatting of messages. 20*d4bd3d25SJens Wiklander * 2. Requests from normal world 21*d4bd3d25SJens Wiklander * 3. Requests from secure world, Remote Procedure Call (RPC), handled by 22*d4bd3d25SJens Wiklander * tee-supplicant. 23*d4bd3d25SJens Wiklander */ 24*d4bd3d25SJens Wiklander 25*d4bd3d25SJens Wiklander /***************************************************************************** 26*d4bd3d25SJens Wiklander * Part 1 - formatting of messages 27*d4bd3d25SJens Wiklander *****************************************************************************/ 28*d4bd3d25SJens Wiklander 29*d4bd3d25SJens Wiklander #define OPTEE_MSG_ATTR_TYPE_NONE 0x0 30*d4bd3d25SJens Wiklander #define OPTEE_MSG_ATTR_TYPE_VALUE_INPUT 0x1 31*d4bd3d25SJens Wiklander #define OPTEE_MSG_ATTR_TYPE_VALUE_OUTPUT 0x2 32*d4bd3d25SJens Wiklander #define OPTEE_MSG_ATTR_TYPE_VALUE_INOUT 0x3 33*d4bd3d25SJens Wiklander #define OPTEE_MSG_ATTR_TYPE_RMEM_INPUT 0x5 34*d4bd3d25SJens Wiklander #define OPTEE_MSG_ATTR_TYPE_RMEM_OUTPUT 0x6 35*d4bd3d25SJens Wiklander #define OPTEE_MSG_ATTR_TYPE_RMEM_INOUT 0x7 36*d4bd3d25SJens Wiklander #define OPTEE_MSG_ATTR_TYPE_TMEM_INPUT 0x9 37*d4bd3d25SJens Wiklander #define OPTEE_MSG_ATTR_TYPE_TMEM_OUTPUT 0xa 38*d4bd3d25SJens Wiklander #define OPTEE_MSG_ATTR_TYPE_TMEM_INOUT 0xb 39*d4bd3d25SJens Wiklander 40*d4bd3d25SJens Wiklander #define OPTEE_MSG_ATTR_TYPE_MASK GENMASK(7, 0) 41*d4bd3d25SJens Wiklander 42*d4bd3d25SJens Wiklander /* 43*d4bd3d25SJens Wiklander * Meta parameter to be absorbed by the Secure OS and not passed 44*d4bd3d25SJens Wiklander * to the Trusted Application. 45*d4bd3d25SJens Wiklander * 46*d4bd3d25SJens Wiklander * Currently only used with OPTEE_MSG_CMD_OPEN_SESSION. 47*d4bd3d25SJens Wiklander */ 48*d4bd3d25SJens Wiklander #define OPTEE_MSG_ATTR_META BIT(8) 49*d4bd3d25SJens Wiklander 50*d4bd3d25SJens Wiklander /* 51*d4bd3d25SJens Wiklander * Pointer to a list of pages used to register user-defined SHM buffer. 52*d4bd3d25SJens Wiklander * Used with OPTEE_MSG_ATTR_TYPE_TMEM_*. 53*d4bd3d25SJens Wiklander * buf_ptr should point to the beginning of the buffer. Buffer will contain 54*d4bd3d25SJens Wiklander * list of page addresses. OP-TEE core can reconstruct contiguous buffer from 55*d4bd3d25SJens Wiklander * that page addresses list. Page addresses are stored as 64 bit values. 56*d4bd3d25SJens Wiklander * Last entry on a page should point to the next page of buffer. 57*d4bd3d25SJens Wiklander * Every entry in buffer should point to a 4k page beginning (12 least 58*d4bd3d25SJens Wiklander * significant bits must be equal to zero). 59*d4bd3d25SJens Wiklander * 60*d4bd3d25SJens Wiklander * 12 least significant bints of optee_msg_param.u.tmem.buf_ptr should hold page 61*d4bd3d25SJens Wiklander * offset of the user buffer. 62*d4bd3d25SJens Wiklander * 63*d4bd3d25SJens Wiklander * So, entries should be placed like members of this structure: 64*d4bd3d25SJens Wiklander * 65*d4bd3d25SJens Wiklander * struct page_data { 66*d4bd3d25SJens Wiklander * uint64_t pages_array[OPTEE_MSG_NONCONTIG_PAGE_SIZE/sizeof(uint64_t) - 1]; 67*d4bd3d25SJens Wiklander * uint64_t next_page_data; 68*d4bd3d25SJens Wiklander * }; 69*d4bd3d25SJens Wiklander * 70*d4bd3d25SJens Wiklander * Structure is designed to exactly fit into the page size 71*d4bd3d25SJens Wiklander * OPTEE_MSG_NONCONTIG_PAGE_SIZE which is a standard 4KB page. 72*d4bd3d25SJens Wiklander * 73*d4bd3d25SJens Wiklander * The size of 4KB is chosen because this is the smallest page size for ARM 74*d4bd3d25SJens Wiklander * architectures. If REE uses larger pages, it should divide them to 4KB ones. 75*d4bd3d25SJens Wiklander */ 76*d4bd3d25SJens Wiklander #define OPTEE_MSG_ATTR_NONCONTIG BIT(9) 77*d4bd3d25SJens Wiklander 78*d4bd3d25SJens Wiklander /* 79*d4bd3d25SJens Wiklander * Memory attributes for caching passed with temp memrefs. The actual value 80*d4bd3d25SJens Wiklander * used is defined outside the message protocol with the exception of 81*d4bd3d25SJens Wiklander * OPTEE_MSG_ATTR_CACHE_PREDEFINED which means the attributes already 82*d4bd3d25SJens Wiklander * defined for the memory range should be used. If optee_smc.h is used as 83*d4bd3d25SJens Wiklander * bearer of this protocol OPTEE_SMC_SHM_* is used for values. 84*d4bd3d25SJens Wiklander */ 85*d4bd3d25SJens Wiklander #define OPTEE_MSG_ATTR_CACHE_SHIFT 16 86*d4bd3d25SJens Wiklander #define OPTEE_MSG_ATTR_CACHE_MASK GENMASK(2, 0) 87*d4bd3d25SJens Wiklander #define OPTEE_MSG_ATTR_CACHE_PREDEFINED 0 88*d4bd3d25SJens Wiklander 89*d4bd3d25SJens Wiklander /* 90*d4bd3d25SJens Wiklander * Same values as TEE_LOGIN_* from TEE Internal API 91*d4bd3d25SJens Wiklander */ 92*d4bd3d25SJens Wiklander #define OPTEE_MSG_LOGIN_PUBLIC 0x00000000 93*d4bd3d25SJens Wiklander #define OPTEE_MSG_LOGIN_USER 0x00000001 94*d4bd3d25SJens Wiklander #define OPTEE_MSG_LOGIN_GROUP 0x00000002 95*d4bd3d25SJens Wiklander #define OPTEE_MSG_LOGIN_APPLICATION 0x00000004 96*d4bd3d25SJens Wiklander #define OPTEE_MSG_LOGIN_APPLICATION_USER 0x00000005 97*d4bd3d25SJens Wiklander #define OPTEE_MSG_LOGIN_APPLICATION_GROUP 0x00000006 98*d4bd3d25SJens Wiklander 99*d4bd3d25SJens Wiklander /* 100*d4bd3d25SJens Wiklander * Page size used in non-contiguous buffer entries 101*d4bd3d25SJens Wiklander */ 102*d4bd3d25SJens Wiklander #define OPTEE_MSG_NONCONTIG_PAGE_SIZE 4096 103*d4bd3d25SJens Wiklander 104*d4bd3d25SJens Wiklander /** 105*d4bd3d25SJens Wiklander * struct optee_msg_param_tmem - temporary memory reference parameter 106*d4bd3d25SJens Wiklander * @buf_ptr: Address of the buffer 107*d4bd3d25SJens Wiklander * @size: Size of the buffer 108*d4bd3d25SJens Wiklander * @shm_ref: Temporary shared memory reference, pointer to a struct tee_shm 109*d4bd3d25SJens Wiklander * 110*d4bd3d25SJens Wiklander * Secure and normal world communicates pointers as physical address 111*d4bd3d25SJens Wiklander * instead of the virtual address. This is because secure and normal world 112*d4bd3d25SJens Wiklander * have completely independent memory mapping. Normal world can even have a 113*d4bd3d25SJens Wiklander * hypervisor which need to translate the guest physical address (AKA IPA 114*d4bd3d25SJens Wiklander * in ARM documentation) to a real physical address before passing the 115*d4bd3d25SJens Wiklander * structure to secure world. 116*d4bd3d25SJens Wiklander */ 117*d4bd3d25SJens Wiklander struct optee_msg_param_tmem { 118*d4bd3d25SJens Wiklander u64 buf_ptr; 119*d4bd3d25SJens Wiklander u64 size; 120*d4bd3d25SJens Wiklander u64 shm_ref; 121*d4bd3d25SJens Wiklander }; 122*d4bd3d25SJens Wiklander 123*d4bd3d25SJens Wiklander /** 124*d4bd3d25SJens Wiklander * struct optee_msg_param_rmem - registered memory reference parameter 125*d4bd3d25SJens Wiklander * @offs: Offset into shared memory reference 126*d4bd3d25SJens Wiklander * @size: Size of the buffer 127*d4bd3d25SJens Wiklander * @shm_ref: Shared memory reference, pointer to a struct tee_shm 128*d4bd3d25SJens Wiklander */ 129*d4bd3d25SJens Wiklander struct optee_msg_param_rmem { 130*d4bd3d25SJens Wiklander u64 offs; 131*d4bd3d25SJens Wiklander u64 size; 132*d4bd3d25SJens Wiklander u64 shm_ref; 133*d4bd3d25SJens Wiklander }; 134*d4bd3d25SJens Wiklander 135*d4bd3d25SJens Wiklander /** 136*d4bd3d25SJens Wiklander * struct optee_msg_param_value - opaque value parameter 137*d4bd3d25SJens Wiklander * 138*d4bd3d25SJens Wiklander * Value parameters are passed unchecked between normal and secure world. 139*d4bd3d25SJens Wiklander */ 140*d4bd3d25SJens Wiklander struct optee_msg_param_value { 141*d4bd3d25SJens Wiklander u64 a; 142*d4bd3d25SJens Wiklander u64 b; 143*d4bd3d25SJens Wiklander u64 c; 144*d4bd3d25SJens Wiklander }; 145*d4bd3d25SJens Wiklander 146*d4bd3d25SJens Wiklander /** 147*d4bd3d25SJens Wiklander * struct optee_msg_param - parameter used together with struct optee_msg_arg 148*d4bd3d25SJens Wiklander * @attr: attributes 149*d4bd3d25SJens Wiklander * @tmem: parameter by temporary memory reference 150*d4bd3d25SJens Wiklander * @rmem: parameter by registered memory reference 151*d4bd3d25SJens Wiklander * @value: parameter by opaque value 152*d4bd3d25SJens Wiklander * 153*d4bd3d25SJens Wiklander * @attr & OPTEE_MSG_ATTR_TYPE_MASK indicates if tmem, rmem or value is used in 154*d4bd3d25SJens Wiklander * the union. OPTEE_MSG_ATTR_TYPE_VALUE_* indicates value, 155*d4bd3d25SJens Wiklander * OPTEE_MSG_ATTR_TYPE_TMEM_* indicates @tmem and 156*d4bd3d25SJens Wiklander * OPTEE_MSG_ATTR_TYPE_RMEM_* indicates @rmem, 157*d4bd3d25SJens Wiklander * OPTEE_MSG_ATTR_TYPE_NONE indicates that none of the members are used. 158*d4bd3d25SJens Wiklander */ 159*d4bd3d25SJens Wiklander struct optee_msg_param { 160*d4bd3d25SJens Wiklander u64 attr; 161*d4bd3d25SJens Wiklander union { 162*d4bd3d25SJens Wiklander struct optee_msg_param_tmem tmem; 163*d4bd3d25SJens Wiklander struct optee_msg_param_rmem rmem; 164*d4bd3d25SJens Wiklander struct optee_msg_param_value value; 165*d4bd3d25SJens Wiklander } u; 166*d4bd3d25SJens Wiklander }; 167*d4bd3d25SJens Wiklander 168*d4bd3d25SJens Wiklander /** 169*d4bd3d25SJens Wiklander * struct optee_msg_arg - call argument 170*d4bd3d25SJens Wiklander * @cmd: Command, one of OPTEE_MSG_CMD_* or OPTEE_MSG_RPC_CMD_* 171*d4bd3d25SJens Wiklander * @func: Trusted Application function, specific to the Trusted Application, 172*d4bd3d25SJens Wiklander * used if cmd == OPTEE_MSG_CMD_INVOKE_COMMAND 173*d4bd3d25SJens Wiklander * @session: In parameter for all OPTEE_MSG_CMD_* except 174*d4bd3d25SJens Wiklander * OPTEE_MSG_CMD_OPEN_SESSION where it's an output parameter instead 175*d4bd3d25SJens Wiklander * @cancel_id: Cancellation id, a unique value to identify this request 176*d4bd3d25SJens Wiklander * @ret: return value 177*d4bd3d25SJens Wiklander * @ret_origin: origin of the return value 178*d4bd3d25SJens Wiklander * @num_params: number of parameters supplied to the OS Command 179*d4bd3d25SJens Wiklander * @params: the parameters supplied to the OS Command 180*d4bd3d25SJens Wiklander * 181*d4bd3d25SJens Wiklander * All normal calls to Trusted OS uses this struct. If cmd requires further 182*d4bd3d25SJens Wiklander * information than what these field holds it can be passed as a parameter 183*d4bd3d25SJens Wiklander * tagged as meta (setting the OPTEE_MSG_ATTR_META bit in corresponding 184*d4bd3d25SJens Wiklander * attrs field). All parameters tagged as meta has to come first. 185*d4bd3d25SJens Wiklander * 186*d4bd3d25SJens Wiklander * Temp memref parameters can be fragmented if supported by the Trusted OS 187*d4bd3d25SJens Wiklander * (when optee_smc.h is bearer of this protocol this is indicated with 188*d4bd3d25SJens Wiklander * OPTEE_SMC_SEC_CAP_UNREGISTERED_SHM). If a logical memref parameter is 189*d4bd3d25SJens Wiklander * fragmented then has all but the last fragment the 190*d4bd3d25SJens Wiklander * OPTEE_MSG_ATTR_FRAGMENT bit set in attrs. Even if a memref is fragmented 191*d4bd3d25SJens Wiklander * it will still be presented as a single logical memref to the Trusted 192*d4bd3d25SJens Wiklander * Application. 193*d4bd3d25SJens Wiklander */ 194*d4bd3d25SJens Wiklander struct optee_msg_arg { 195*d4bd3d25SJens Wiklander u32 cmd; 196*d4bd3d25SJens Wiklander u32 func; 197*d4bd3d25SJens Wiklander u32 session; 198*d4bd3d25SJens Wiklander u32 cancel_id; 199*d4bd3d25SJens Wiklander u32 pad; 200*d4bd3d25SJens Wiklander u32 ret; 201*d4bd3d25SJens Wiklander u32 ret_origin; 202*d4bd3d25SJens Wiklander u32 num_params; 203*d4bd3d25SJens Wiklander 204*d4bd3d25SJens Wiklander /* num_params tells the actual number of element in params */ 205*d4bd3d25SJens Wiklander struct optee_msg_param params[0]; 206*d4bd3d25SJens Wiklander }; 207*d4bd3d25SJens Wiklander 208*d4bd3d25SJens Wiklander /** 209*d4bd3d25SJens Wiklander * OPTEE_MSG_GET_ARG_SIZE - return size of struct optee_msg_arg 210*d4bd3d25SJens Wiklander * 211*d4bd3d25SJens Wiklander * @num_params: Number of parameters embedded in the struct optee_msg_arg 212*d4bd3d25SJens Wiklander * 213*d4bd3d25SJens Wiklander * Returns the size of the struct optee_msg_arg together with the number 214*d4bd3d25SJens Wiklander * of embedded parameters. 215*d4bd3d25SJens Wiklander */ 216*d4bd3d25SJens Wiklander #define OPTEE_MSG_GET_ARG_SIZE(num_params) \ 217*d4bd3d25SJens Wiklander (sizeof(struct optee_msg_arg) + \ 218*d4bd3d25SJens Wiklander sizeof(struct optee_msg_param) * (num_params)) 219*d4bd3d25SJens Wiklander 220*d4bd3d25SJens Wiklander /***************************************************************************** 221*d4bd3d25SJens Wiklander * Part 2 - requests from normal world 222*d4bd3d25SJens Wiklander *****************************************************************************/ 223*d4bd3d25SJens Wiklander 224*d4bd3d25SJens Wiklander /* 225*d4bd3d25SJens Wiklander * Return the following UID if using API specified in this file without 226*d4bd3d25SJens Wiklander * further extensions: 227*d4bd3d25SJens Wiklander * 384fb3e0-e7f8-11e3-af63-0002a5d5c51b. 228*d4bd3d25SJens Wiklander * Represented in 4 32-bit words in OPTEE_MSG_UID_0, OPTEE_MSG_UID_1, 229*d4bd3d25SJens Wiklander * OPTEE_MSG_UID_2, OPTEE_MSG_UID_3. 230*d4bd3d25SJens Wiklander */ 231*d4bd3d25SJens Wiklander #define OPTEE_MSG_UID_0 0x384fb3e0 232*d4bd3d25SJens Wiklander #define OPTEE_MSG_UID_1 0xe7f811e3 233*d4bd3d25SJens Wiklander #define OPTEE_MSG_UID_2 0xaf630002 234*d4bd3d25SJens Wiklander #define OPTEE_MSG_UID_3 0xa5d5c51b 235*d4bd3d25SJens Wiklander #define OPTEE_MSG_FUNCID_CALLS_UID 0xFF01 236*d4bd3d25SJens Wiklander 237*d4bd3d25SJens Wiklander /* 238*d4bd3d25SJens Wiklander * Returns 2.0 if using API specified in this file without further 239*d4bd3d25SJens Wiklander * extensions. Represented in 2 32-bit words in OPTEE_MSG_REVISION_MAJOR 240*d4bd3d25SJens Wiklander * and OPTEE_MSG_REVISION_MINOR 241*d4bd3d25SJens Wiklander */ 242*d4bd3d25SJens Wiklander #define OPTEE_MSG_REVISION_MAJOR 2 243*d4bd3d25SJens Wiklander #define OPTEE_MSG_REVISION_MINOR 0 244*d4bd3d25SJens Wiklander #define OPTEE_MSG_FUNCID_CALLS_REVISION 0xFF03 245*d4bd3d25SJens Wiklander 246*d4bd3d25SJens Wiklander /* 247*d4bd3d25SJens Wiklander * Get UUID of Trusted OS. 248*d4bd3d25SJens Wiklander * 249*d4bd3d25SJens Wiklander * Used by non-secure world to figure out which Trusted OS is installed. 250*d4bd3d25SJens Wiklander * Note that returned UUID is the UUID of the Trusted OS, not of the API. 251*d4bd3d25SJens Wiklander * 252*d4bd3d25SJens Wiklander * Returns UUID in 4 32-bit words in the same way as 253*d4bd3d25SJens Wiklander * OPTEE_MSG_FUNCID_CALLS_UID described above. 254*d4bd3d25SJens Wiklander */ 255*d4bd3d25SJens Wiklander #define OPTEE_MSG_OS_OPTEE_UUID_0 0x486178e0 256*d4bd3d25SJens Wiklander #define OPTEE_MSG_OS_OPTEE_UUID_1 0xe7f811e3 257*d4bd3d25SJens Wiklander #define OPTEE_MSG_OS_OPTEE_UUID_2 0xbc5e0002 258*d4bd3d25SJens Wiklander #define OPTEE_MSG_OS_OPTEE_UUID_3 0xa5d5c51b 259*d4bd3d25SJens Wiklander #define OPTEE_MSG_FUNCID_GET_OS_UUID 0x0000 260*d4bd3d25SJens Wiklander 261*d4bd3d25SJens Wiklander /* 262*d4bd3d25SJens Wiklander * Get revision of Trusted OS. 263*d4bd3d25SJens Wiklander * 264*d4bd3d25SJens Wiklander * Used by non-secure world to figure out which version of the Trusted OS 265*d4bd3d25SJens Wiklander * is installed. Note that the returned revision is the revision of the 266*d4bd3d25SJens Wiklander * Trusted OS, not of the API. 267*d4bd3d25SJens Wiklander * 268*d4bd3d25SJens Wiklander * Returns revision in 2 32-bit words in the same way as 269*d4bd3d25SJens Wiklander * OPTEE_MSG_CALLS_REVISION described above. 270*d4bd3d25SJens Wiklander */ 271*d4bd3d25SJens Wiklander #define OPTEE_MSG_FUNCID_GET_OS_REVISION 0x0001 272*d4bd3d25SJens Wiklander 273*d4bd3d25SJens Wiklander /* 274*d4bd3d25SJens Wiklander * Do a secure call with struct optee_msg_arg as argument 275*d4bd3d25SJens Wiklander * The OPTEE_MSG_CMD_* below defines what goes in struct optee_msg_arg::cmd 276*d4bd3d25SJens Wiklander * 277*d4bd3d25SJens Wiklander * OPTEE_MSG_CMD_OPEN_SESSION opens a session to a Trusted Application. 278*d4bd3d25SJens Wiklander * The first two parameters are tagged as meta, holding two value 279*d4bd3d25SJens Wiklander * parameters to pass the following information: 280*d4bd3d25SJens Wiklander * param[0].u.value.a-b uuid of Trusted Application 281*d4bd3d25SJens Wiklander * param[1].u.value.a-b uuid of Client 282*d4bd3d25SJens Wiklander * param[1].u.value.c Login class of client OPTEE_MSG_LOGIN_* 283*d4bd3d25SJens Wiklander * 284*d4bd3d25SJens Wiklander * OPTEE_MSG_CMD_INVOKE_COMMAND invokes a command a previously opened 285*d4bd3d25SJens Wiklander * session to a Trusted Application. struct optee_msg_arg::func is Trusted 286*d4bd3d25SJens Wiklander * Application function, specific to the Trusted Application. 287*d4bd3d25SJens Wiklander * 288*d4bd3d25SJens Wiklander * OPTEE_MSG_CMD_CLOSE_SESSION closes a previously opened session to 289*d4bd3d25SJens Wiklander * Trusted Application. 290*d4bd3d25SJens Wiklander * 291*d4bd3d25SJens Wiklander * OPTEE_MSG_CMD_CANCEL cancels a currently invoked command. 292*d4bd3d25SJens Wiklander * 293*d4bd3d25SJens Wiklander * OPTEE_MSG_CMD_REGISTER_SHM registers a shared memory reference. The 294*d4bd3d25SJens Wiklander * information is passed as: 295*d4bd3d25SJens Wiklander * [in] param[0].attr OPTEE_MSG_ATTR_TYPE_TMEM_INPUT 296*d4bd3d25SJens Wiklander * [| OPTEE_MSG_ATTR_FRAGMENT] 297*d4bd3d25SJens Wiklander * [in] param[0].u.tmem.buf_ptr physical address (of first fragment) 298*d4bd3d25SJens Wiklander * [in] param[0].u.tmem.size size (of first fragment) 299*d4bd3d25SJens Wiklander * [in] param[0].u.tmem.shm_ref holds shared memory reference 300*d4bd3d25SJens Wiklander * ... 301*d4bd3d25SJens Wiklander * The shared memory can optionally be fragmented, temp memrefs can follow 302*d4bd3d25SJens Wiklander * each other with all but the last with the OPTEE_MSG_ATTR_FRAGMENT bit set. 303*d4bd3d25SJens Wiklander * 304*d4bd3d25SJens Wiklander * OPTEE_MSG_CMD_UNREGISTER_SHM unregisteres a previously registered shared 305*d4bd3d25SJens Wiklander * memory reference. The information is passed as: 306*d4bd3d25SJens Wiklander * [in] param[0].attr OPTEE_MSG_ATTR_TYPE_RMEM_INPUT 307*d4bd3d25SJens Wiklander * [in] param[0].u.rmem.shm_ref holds shared memory reference 308*d4bd3d25SJens Wiklander * [in] param[0].u.rmem.offs 0 309*d4bd3d25SJens Wiklander * [in] param[0].u.rmem.size 0 310*d4bd3d25SJens Wiklander */ 311*d4bd3d25SJens Wiklander #define OPTEE_MSG_CMD_OPEN_SESSION 0 312*d4bd3d25SJens Wiklander #define OPTEE_MSG_CMD_INVOKE_COMMAND 1 313*d4bd3d25SJens Wiklander #define OPTEE_MSG_CMD_CLOSE_SESSION 2 314*d4bd3d25SJens Wiklander #define OPTEE_MSG_CMD_CANCEL 3 315*d4bd3d25SJens Wiklander #define OPTEE_MSG_CMD_REGISTER_SHM 4 316*d4bd3d25SJens Wiklander #define OPTEE_MSG_CMD_UNREGISTER_SHM 5 317*d4bd3d25SJens Wiklander #define OPTEE_MSG_FUNCID_CALL_WITH_ARG 0x0004 318*d4bd3d25SJens Wiklander 319*d4bd3d25SJens Wiklander /***************************************************************************** 320*d4bd3d25SJens Wiklander * Part 3 - Requests from secure world, RPC 321*d4bd3d25SJens Wiklander *****************************************************************************/ 322*d4bd3d25SJens Wiklander 323*d4bd3d25SJens Wiklander /* 324*d4bd3d25SJens Wiklander * All RPC is done with a struct optee_msg_arg as bearer of information, 325*d4bd3d25SJens Wiklander * struct optee_msg_arg::arg holds values defined by OPTEE_MSG_RPC_CMD_* below 326*d4bd3d25SJens Wiklander * 327*d4bd3d25SJens Wiklander * RPC communication with tee-supplicant is reversed compared to normal 328*d4bd3d25SJens Wiklander * client communication desribed above. The supplicant receives requests 329*d4bd3d25SJens Wiklander * and sends responses. 330*d4bd3d25SJens Wiklander */ 331*d4bd3d25SJens Wiklander 332*d4bd3d25SJens Wiklander /* 333*d4bd3d25SJens Wiklander * Load a TA into memory, defined in tee-supplicant 334*d4bd3d25SJens Wiklander */ 335*d4bd3d25SJens Wiklander #define OPTEE_MSG_RPC_CMD_LOAD_TA 0 336*d4bd3d25SJens Wiklander 337*d4bd3d25SJens Wiklander /* 338*d4bd3d25SJens Wiklander * Reserved 339*d4bd3d25SJens Wiklander */ 340*d4bd3d25SJens Wiklander #define OPTEE_MSG_RPC_CMD_RPMB 1 341*d4bd3d25SJens Wiklander 342*d4bd3d25SJens Wiklander /* 343*d4bd3d25SJens Wiklander * File system access, defined in tee-supplicant 344*d4bd3d25SJens Wiklander */ 345*d4bd3d25SJens Wiklander #define OPTEE_MSG_RPC_CMD_FS 2 346*d4bd3d25SJens Wiklander 347*d4bd3d25SJens Wiklander /* 348*d4bd3d25SJens Wiklander * Get time 349*d4bd3d25SJens Wiklander * 350*d4bd3d25SJens Wiklander * Returns number of seconds and nano seconds since the Epoch, 351*d4bd3d25SJens Wiklander * 1970-01-01 00:00:00 +0000 (UTC). 352*d4bd3d25SJens Wiklander * 353*d4bd3d25SJens Wiklander * [out] param[0].u.value.a Number of seconds 354*d4bd3d25SJens Wiklander * [out] param[0].u.value.b Number of nano seconds. 355*d4bd3d25SJens Wiklander */ 356*d4bd3d25SJens Wiklander #define OPTEE_MSG_RPC_CMD_GET_TIME 3 357*d4bd3d25SJens Wiklander 358*d4bd3d25SJens Wiklander /* 359*d4bd3d25SJens Wiklander * Wait queue primitive, helper for secure world to implement a wait queue. 360*d4bd3d25SJens Wiklander * 361*d4bd3d25SJens Wiklander * If secure world need to wait for a secure world mutex it issues a sleep 362*d4bd3d25SJens Wiklander * request instead of spinning in secure world. Conversely is a wakeup 363*d4bd3d25SJens Wiklander * request issued when a secure world mutex with a thread waiting thread is 364*d4bd3d25SJens Wiklander * unlocked. 365*d4bd3d25SJens Wiklander * 366*d4bd3d25SJens Wiklander * Waiting on a key 367*d4bd3d25SJens Wiklander * [in] param[0].u.value.a OPTEE_MSG_RPC_WAIT_QUEUE_SLEEP 368*d4bd3d25SJens Wiklander * [in] param[0].u.value.b wait key 369*d4bd3d25SJens Wiklander * 370*d4bd3d25SJens Wiklander * Waking up a key 371*d4bd3d25SJens Wiklander * [in] param[0].u.value.a OPTEE_MSG_RPC_WAIT_QUEUE_WAKEUP 372*d4bd3d25SJens Wiklander * [in] param[0].u.value.b wakeup key 373*d4bd3d25SJens Wiklander */ 374*d4bd3d25SJens Wiklander #define OPTEE_MSG_RPC_CMD_WAIT_QUEUE 4 375*d4bd3d25SJens Wiklander #define OPTEE_MSG_RPC_WAIT_QUEUE_SLEEP 0 376*d4bd3d25SJens Wiklander #define OPTEE_MSG_RPC_WAIT_QUEUE_WAKEUP 1 377*d4bd3d25SJens Wiklander 378*d4bd3d25SJens Wiklander /* 379*d4bd3d25SJens Wiklander * Suspend execution 380*d4bd3d25SJens Wiklander * 381*d4bd3d25SJens Wiklander * [in] param[0].value .a number of milliseconds to suspend 382*d4bd3d25SJens Wiklander */ 383*d4bd3d25SJens Wiklander #define OPTEE_MSG_RPC_CMD_SUSPEND 5 384*d4bd3d25SJens Wiklander 385*d4bd3d25SJens Wiklander /* 386*d4bd3d25SJens Wiklander * Allocate a piece of shared memory 387*d4bd3d25SJens Wiklander * 388*d4bd3d25SJens Wiklander * Shared memory can optionally be fragmented, to support that additional 389*d4bd3d25SJens Wiklander * spare param entries are allocated to make room for eventual fragments. 390*d4bd3d25SJens Wiklander * The spare param entries has .attr = OPTEE_MSG_ATTR_TYPE_NONE when 391*d4bd3d25SJens Wiklander * unused. All returned temp memrefs except the last should have the 392*d4bd3d25SJens Wiklander * OPTEE_MSG_ATTR_FRAGMENT bit set in the attr field. 393*d4bd3d25SJens Wiklander * 394*d4bd3d25SJens Wiklander * [in] param[0].u.value.a type of memory one of 395*d4bd3d25SJens Wiklander * OPTEE_MSG_RPC_SHM_TYPE_* below 396*d4bd3d25SJens Wiklander * [in] param[0].u.value.b requested size 397*d4bd3d25SJens Wiklander * [in] param[0].u.value.c required alignment 398*d4bd3d25SJens Wiklander * 399*d4bd3d25SJens Wiklander * [out] param[0].u.tmem.buf_ptr physical address (of first fragment) 400*d4bd3d25SJens Wiklander * [out] param[0].u.tmem.size size (of first fragment) 401*d4bd3d25SJens Wiklander * [out] param[0].u.tmem.shm_ref shared memory reference 402*d4bd3d25SJens Wiklander * ... 403*d4bd3d25SJens Wiklander * [out] param[n].u.tmem.buf_ptr physical address 404*d4bd3d25SJens Wiklander * [out] param[n].u.tmem.size size 405*d4bd3d25SJens Wiklander * [out] param[n].u.tmem.shm_ref shared memory reference (same value 406*d4bd3d25SJens Wiklander * as in param[n-1].u.tmem.shm_ref) 407*d4bd3d25SJens Wiklander */ 408*d4bd3d25SJens Wiklander #define OPTEE_MSG_RPC_CMD_SHM_ALLOC 6 409*d4bd3d25SJens Wiklander /* Memory that can be shared with a non-secure user space application */ 410*d4bd3d25SJens Wiklander #define OPTEE_MSG_RPC_SHM_TYPE_APPL 0 411*d4bd3d25SJens Wiklander /* Memory only shared with non-secure kernel */ 412*d4bd3d25SJens Wiklander #define OPTEE_MSG_RPC_SHM_TYPE_KERNEL 1 413*d4bd3d25SJens Wiklander 414*d4bd3d25SJens Wiklander /* 415*d4bd3d25SJens Wiklander * Free shared memory previously allocated with OPTEE_MSG_RPC_CMD_SHM_ALLOC 416*d4bd3d25SJens Wiklander * 417*d4bd3d25SJens Wiklander * [in] param[0].u.value.a type of memory one of 418*d4bd3d25SJens Wiklander * OPTEE_MSG_RPC_SHM_TYPE_* above 419*d4bd3d25SJens Wiklander * [in] param[0].u.value.b value of shared memory reference 420*d4bd3d25SJens Wiklander * returned in param[0].u.tmem.shm_ref 421*d4bd3d25SJens Wiklander * above 422*d4bd3d25SJens Wiklander */ 423*d4bd3d25SJens Wiklander #define OPTEE_MSG_RPC_CMD_SHM_FREE 7 424*d4bd3d25SJens Wiklander 425*d4bd3d25SJens Wiklander #endif /* _OPTEE_MSG_H */ 426