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 | |