1 /* SPDX-License-Identifier: MIT */ 2 3 /* 4 * Copyright 2019 Advanced Micro Devices, Inc. 5 */ 6 7 /* 8 * This file has definitions related to Host and AMD-TEE Trusted OS interface. 9 * These definitions must match the definitions on the TEE side. 10 */ 11 12 #ifndef AMDTEE_IF_H 13 #define AMDTEE_IF_H 14 15 #include <linux/types.h> 16 17 /***************************************************************************** 18 ** TEE Param 19 ******************************************************************************/ 20 #define TEE_MAX_PARAMS 4 21 22 /** 23 * struct memref - memory reference structure 24 * @buf_id: buffer ID of the buffer mapped by TEE_CMD_ID_MAP_SHARED_MEM 25 * @offset: offset in bytes from beginning of the buffer 26 * @size: data size in bytes 27 */ 28 struct memref { 29 u32 buf_id; 30 u32 offset; 31 u32 size; 32 }; 33 34 struct value { 35 u32 a; 36 u32 b; 37 }; 38 39 /* 40 * Parameters passed to open_session or invoke_command 41 */ 42 union tee_op_param { 43 struct memref mref; 44 struct value val; 45 }; 46 47 struct tee_operation { 48 u32 param_types; 49 union tee_op_param params[TEE_MAX_PARAMS]; 50 }; 51 52 /* Must be same as in GP TEE specification */ 53 #define TEE_OP_PARAM_TYPE_NONE 0 54 #define TEE_OP_PARAM_TYPE_VALUE_INPUT 1 55 #define TEE_OP_PARAM_TYPE_VALUE_OUTPUT 2 56 #define TEE_OP_PARAM_TYPE_VALUE_INOUT 3 57 #define TEE_OP_PARAM_TYPE_INVALID 4 58 #define TEE_OP_PARAM_TYPE_MEMREF_INPUT 5 59 #define TEE_OP_PARAM_TYPE_MEMREF_OUTPUT 6 60 #define TEE_OP_PARAM_TYPE_MEMREF_INOUT 7 61 62 #define TEE_PARAM_TYPE_GET(t, i) (((t) >> ((i) * 4)) & 0xF) 63 #define TEE_PARAM_TYPES(t0, t1, t2, t3) \ 64 ((t0) | ((t1) << 4) | ((t2) << 8) | ((t3) << 12)) 65 66 /***************************************************************************** 67 ** TEE Commands 68 *****************************************************************************/ 69 70 /* 71 * The shared memory between rich world and secure world may be physically 72 * non-contiguous. Below structures are meant to describe a shared memory region 73 * via scatter/gather (sg) list 74 */ 75 76 /** 77 * struct tee_sg_desc - sg descriptor for a physically contiguous buffer 78 * @low_addr: [in] bits[31:0] of buffer's physical address. Must be 4KB aligned 79 * @hi_addr: [in] bits[63:32] of the buffer's physical address 80 * @size: [in] size in bytes (must be multiple of 4KB) 81 */ 82 struct tee_sg_desc { 83 u32 low_addr; 84 u32 hi_addr; 85 u32 size; 86 }; 87 88 /** 89 * struct tee_sg_list - structure describing a scatter/gather list 90 * @count: [in] number of sg descriptors 91 * @size: [in] total size of all buffers in the list. Must be multiple of 4KB 92 * @buf: [in] list of sg buffer descriptors 93 */ 94 #define TEE_MAX_SG_DESC 64 95 struct tee_sg_list { 96 u32 count; 97 u32 size; 98 struct tee_sg_desc buf[TEE_MAX_SG_DESC]; 99 }; 100 101 /** 102 * struct tee_cmd_map_shared_mem - command to map shared memory 103 * @buf_id: [out] return buffer ID value 104 * @sg_list: [in] list describing memory to be mapped 105 */ 106 struct tee_cmd_map_shared_mem { 107 u32 buf_id; 108 struct tee_sg_list sg_list; 109 }; 110 111 /** 112 * struct tee_cmd_unmap_shared_mem - command to unmap shared memory 113 * @buf_id: [in] buffer ID of memory to be unmapped 114 */ 115 struct tee_cmd_unmap_shared_mem { 116 u32 buf_id; 117 }; 118 119 /** 120 * struct tee_cmd_load_ta - load Trusted Application (TA) binary into TEE 121 * @low_addr: [in] bits [31:0] of the physical address of the TA binary 122 * @hi_addr: [in] bits [63:32] of the physical address of the TA binary 123 * @size: [in] size of TA binary in bytes 124 * @ta_handle: [out] return handle of the loaded TA 125 * @return_origin: [out] origin of return code after TEE processing 126 */ 127 struct tee_cmd_load_ta { 128 u32 low_addr; 129 u32 hi_addr; 130 u32 size; 131 u32 ta_handle; 132 u32 return_origin; 133 }; 134 135 /** 136 * struct tee_cmd_unload_ta - command to unload TA binary from TEE environment 137 * @ta_handle: [in] handle of the loaded TA to be unloaded 138 */ 139 struct tee_cmd_unload_ta { 140 u32 ta_handle; 141 }; 142 143 /** 144 * struct tee_cmd_open_session - command to call TA_OpenSessionEntryPoint in TA 145 * @ta_handle: [in] handle of the loaded TA 146 * @session_info: [out] pointer to TA allocated session data 147 * @op: [in/out] operation parameters 148 * @return_origin: [out] origin of return code after TEE processing 149 */ 150 struct tee_cmd_open_session { 151 u32 ta_handle; 152 u32 session_info; 153 struct tee_operation op; 154 u32 return_origin; 155 }; 156 157 /** 158 * struct tee_cmd_close_session - command to call TA_CloseSessionEntryPoint() 159 * in TA 160 * @ta_handle: [in] handle of the loaded TA 161 * @session_info: [in] pointer to TA allocated session data 162 */ 163 struct tee_cmd_close_session { 164 u32 ta_handle; 165 u32 session_info; 166 }; 167 168 /** 169 * struct tee_cmd_invoke_cmd - command to call TA_InvokeCommandEntryPoint() in 170 * TA 171 * @ta_handle: [in] handle of the loaded TA 172 * @cmd_id: [in] TA command ID 173 * @session_info: [in] pointer to TA allocated session data 174 * @op: [in/out] operation parameters 175 * @return_origin: [out] origin of return code after TEE processing 176 */ 177 struct tee_cmd_invoke_cmd { 178 u32 ta_handle; 179 u32 cmd_id; 180 u32 session_info; 181 struct tee_operation op; 182 u32 return_origin; 183 }; 184 185 #endif /*AMDTEE_IF_H*/ 186