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 */ 28struct memref { 29 u32 buf_id; 30 u32 offset; 31 u32 size; 32}; 33 34struct value { 35 u32 a; 36 u32 b; 37}; 38 39/* 40 * Parameters passed to open_session or invoke_command 41 */ 42union tee_op_param { 43 struct memref mref; 44 struct value val; 45}; 46 47struct 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 */ 82struct 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 95struct 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 */ 106struct 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 */ 115struct 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 */ 127struct 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 */ 139struct 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 */ 150struct 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 */ 163struct 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 */ 177struct 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