]>
Commit | Line | Data |
---|---|---|
23a397d2 SG |
1 | /* SPDX-License-Identifier: GPL-2.0+ */ |
2 | /* | |
3 | * Headers for EFI variable service via StandAloneMM, EDK2 application running | |
4 | * in OP-TEE | |
5 | * | |
6 | * Copyright (c) 2017, Intel Corporation. All rights reserved. | |
7 | * Copyright (C) 2020 Linaro Ltd. <[email protected]> | |
8 | * Copyright (C) 2020 Linaro Ltd. <[email protected]> | |
218b062e AEK |
9 | * Copyright 2022-2023 Arm Limited and/or its affiliates <[email protected]> |
10 | * Authors: | |
11 | * Abdellatif El Khlifi <[email protected]> | |
23a397d2 SG |
12 | */ |
13 | ||
14 | #ifndef _MM_COMMUNICATION_H_ | |
15 | #define _MM_COMMUNICATION_H_ | |
16 | ||
17 | #include <part_efi.h> | |
18 | ||
218b062e AEK |
19 | #if CONFIG_IS_ENABLED(ARM_FFA_TRANSPORT) |
20 | /* MM service UUID string (big-endian format). This UUID is common across all MM SPs */ | |
21 | #define MM_SP_UUID "33d532ed-e699-0942-c09c-a798d9cd722d" | |
22 | #endif | |
23 | ||
23a397d2 SG |
24 | /* |
25 | * Interface to the pseudo Trusted Application (TA), which provides a | |
26 | * communication channel with the Standalone MM (Management Mode) | |
27 | * Secure Partition running at Secure-EL0 | |
28 | */ | |
29 | ||
30 | #define PTA_STMM_CMDID_COMMUNICATE 0 | |
31 | ||
32 | /* OP-TEE is using big endian GUIDs while UEFI uses little endian ones */ | |
33 | #define PTA_STMM_UUID { 0xed32d533, 0x99e6, 0x4209, {\ | |
34 | 0x9c, 0xc0, 0x2d, 0x72, 0xcd, 0xd9, 0x98, 0xa7 } } | |
35 | ||
36 | #define EFI_MM_VARIABLE_GUID \ | |
37 | EFI_GUID(0xed32d533, 0x99e6, 0x4209, \ | |
38 | 0x9c, 0xc0, 0x2d, 0x72, 0xcd, 0xd9, 0x98, 0xa7) | |
39 | ||
40 | /* Defined in EDK2 MdePkg/Include/Protocol/MmCommunication.h */ | |
41 | ||
42 | /** | |
43 | * struct efi_mm_communicate_header - Header used for SMM variable communication | |
44 | ||
45 | * @header_guid: header use for disambiguation of content | |
46 | * @message_len: length of the message. Does not include the size of the | |
47 | * header | |
48 | * @data: payload of the message | |
49 | * | |
50 | * Defined in EDK2 as EFI_MM_COMMUNICATE_HEADER. | |
51 | * To avoid confusion in interpreting frames, the communication buffer should | |
52 | * always begin with efi_mm_communicate_header. | |
53 | */ | |
03699bc7 | 54 | struct __packed efi_mm_communicate_header { |
23a397d2 SG |
55 | efi_guid_t header_guid; |
56 | size_t message_len; | |
57 | u8 data[]; | |
58 | }; | |
59 | ||
60 | #define MM_COMMUNICATE_HEADER_SIZE \ | |
61 | (sizeof(struct efi_mm_communicate_header)) | |
62 | ||
5d1f79ba | 63 | /* Defined in EDK2 ArmPkg/Include/IndustryStandard/ArmMmSvc.h */ |
23a397d2 | 64 | |
5d1f79ba IA |
65 | /* SPM return error codes */ |
66 | #define ARM_SVC_SPM_RET_SUCCESS 0 | |
67 | #define ARM_SVC_SPM_RET_NOT_SUPPORTED -1 | |
68 | #define ARM_SVC_SPM_RET_INVALID_PARAMS -2 | |
69 | #define ARM_SVC_SPM_RET_DENIED -3 | |
70 | #define ARM_SVC_SPM_RET_NO_MEMORY -5 | |
23a397d2 SG |
71 | |
72 | /* Defined in EDK2 MdeModulePkg/Include/Guid/SmmVariableCommon.h */ | |
73 | ||
74 | #define SMM_VARIABLE_FUNCTION_GET_VARIABLE 1 | |
75 | /* | |
76 | * The payload for this function is | |
77 | * SMM_VARIABLE_COMMUNICATE_GET_NEXT_VARIABLE_NAME. | |
78 | */ | |
79 | #define SMM_VARIABLE_FUNCTION_GET_NEXT_VARIABLE_NAME 2 | |
80 | /* | |
81 | * The payload for this function is SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE. | |
82 | */ | |
83 | #define SMM_VARIABLE_FUNCTION_SET_VARIABLE 3 | |
84 | /* | |
85 | * The payload for this function is | |
86 | * SMM_VARIABLE_COMMUNICATE_QUERY_VARIABLE_INFO. | |
87 | */ | |
88 | #define SMM_VARIABLE_FUNCTION_QUERY_VARIABLE_INFO 4 | |
89 | /* | |
90 | * It is a notify event, no extra payload for this function. | |
91 | */ | |
92 | #define SMM_VARIABLE_FUNCTION_READY_TO_BOOT 5 | |
93 | /* | |
94 | * It is a notify event, no extra payload for this function. | |
95 | */ | |
96 | #define SMM_VARIABLE_FUNCTION_EXIT_BOOT_SERVICE 6 | |
97 | /* | |
98 | * The payload for this function is VARIABLE_INFO_ENTRY. | |
99 | * The GUID in EFI_SMM_COMMUNICATE_HEADER is gEfiSmmVariableProtocolGuid. | |
100 | */ | |
101 | #define SMM_VARIABLE_FUNCTION_GET_STATISTICS 7 | |
102 | /* | |
103 | * The payload for this function is SMM_VARIABLE_COMMUNICATE_LOCK_VARIABLE | |
104 | */ | |
105 | #define SMM_VARIABLE_FUNCTION_LOCK_VARIABLE 8 | |
106 | ||
107 | #define SMM_VARIABLE_FUNCTION_VAR_CHECK_VARIABLE_PROPERTY_SET 9 | |
108 | ||
109 | #define SMM_VARIABLE_FUNCTION_VAR_CHECK_VARIABLE_PROPERTY_GET 10 | |
110 | ||
111 | #define SMM_VARIABLE_FUNCTION_GET_PAYLOAD_SIZE 11 | |
112 | /* | |
113 | * The payload for this function is | |
114 | * SMM_VARIABLE_COMMUNICATE_RUNTIME_VARIABLE_CACHE_CONTEXT | |
115 | */ | |
116 | #define SMM_VARIABLE_FUNCTION_INIT_RUNTIME_VARIABLE_CACHE_CONTEXT 12 | |
117 | ||
118 | #define SMM_VARIABLE_FUNCTION_SYNC_RUNTIME_CACHE 13 | |
119 | /* | |
120 | * The payload for this function is | |
121 | * SMM_VARIABLE_COMMUNICATE_GET_RUNTIME_CACHE_INFO | |
122 | */ | |
123 | #define SMM_VARIABLE_FUNCTION_GET_RUNTIME_CACHE_INFO 14 | |
124 | ||
125 | /** | |
126 | * struct smm_variable_communicate_header - Used for SMM variable communication | |
127 | ||
128 | * @function: function to call in Smm. | |
129 | * @ret_status: return status | |
130 | * @data: payload | |
131 | * | |
132 | * Defined in EDK2 as SMM_VARIABLE_COMMUNICATE_HEADER. | |
133 | */ | |
134 | struct smm_variable_communicate_header { | |
135 | efi_uintn_t function; | |
136 | efi_status_t ret_status; | |
137 | u8 data[]; | |
138 | }; | |
139 | ||
140 | #define MM_VARIABLE_COMMUNICATE_SIZE \ | |
141 | (sizeof(struct smm_variable_communicate_header)) | |
142 | ||
143 | /** | |
144 | * struct smm_variable_access - Used to communicate with StMM by | |
145 | * SetVariable and GetVariable. | |
146 | ||
147 | * @guid: vendor GUID | |
148 | * @data_size: size of EFI variable data | |
149 | * @name_size: size of EFI name | |
150 | * @attr: attributes | |
151 | * @name: variable name | |
152 | * | |
153 | * Defined in EDK2 as SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE. | |
154 | * | |
155 | */ | |
156 | struct smm_variable_access { | |
157 | efi_guid_t guid; | |
158 | efi_uintn_t data_size; | |
159 | efi_uintn_t name_size; | |
160 | u32 attr; | |
161 | u16 name[]; | |
162 | }; | |
163 | ||
164 | #define MM_VARIABLE_ACCESS_HEADER_SIZE \ | |
165 | (sizeof(struct smm_variable_access)) | |
166 | /** | |
167 | * struct smm_variable_payload_size - Used to get the max allowed | |
168 | * payload used in StMM. | |
169 | * | |
170 | * @size: size to fill in | |
171 | * | |
172 | * Defined in EDK2 as SMM_VARIABLE_COMMUNICATE_GET_PAYLOAD_SIZE. | |
173 | * | |
174 | */ | |
175 | struct smm_variable_payload_size { | |
176 | efi_uintn_t size; | |
177 | }; | |
178 | ||
179 | /** | |
180 | * struct smm_variable_getnext - Used to communicate with StMM for | |
181 | * GetNextVariableName. | |
182 | * | |
183 | * @guid: vendor GUID | |
184 | * @name_size: size of the name of the variable | |
185 | * @name: variable name | |
186 | * | |
187 | * Defined in EDK2 as SMM_VARIABLE_COMMUNICATE_GET_NEXT_VARIABLE_NAME. | |
188 | */ | |
189 | struct smm_variable_getnext { | |
190 | efi_guid_t guid; | |
191 | efi_uintn_t name_size; | |
192 | u16 name[]; | |
193 | }; | |
194 | ||
195 | #define MM_VARIABLE_GET_NEXT_HEADER_SIZE \ | |
196 | (sizeof(struct smm_variable_getnext)) | |
197 | ||
198 | /** | |
199 | * struct smm_variable_query_info - Used to communicate with StMM for | |
200 | * QueryVariableInfo. | |
201 | * | |
202 | * @max_variable_storage: max available storage | |
203 | * @remaining_variable_storage: remaining available storage | |
204 | * @max_variable_size: max variable supported size | |
205 | * @attr: attributes to query storage for | |
206 | * | |
207 | * Defined in EDK2 as SMM_VARIABLE_COMMUNICATE_QUERY_VARIABLE_INFO. | |
208 | */ | |
209 | struct smm_variable_query_info { | |
210 | u64 max_variable_storage; | |
211 | u64 remaining_variable_storage; | |
212 | u64 max_variable_size; | |
213 | u32 attr; | |
214 | }; | |
215 | ||
f96744b2 IA |
216 | #define VAR_CHECK_VARIABLE_PROPERTY_REVISION 0x0001 |
217 | #define VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY BIT(0) | |
218 | /** | |
219 | * struct var_check_property - Used to store variable properties in StMM | |
220 | * | |
221 | * @revision: magic revision number for variable property checking | |
222 | * @property: properties mask for the variable used in StMM. | |
223 | * Currently RO flag is supported | |
224 | * @attributes: variable attributes used in StMM checking when properties | |
225 | * for a variable are enabled | |
226 | * @minsize: minimum allowed size for variable payload checked against | |
227 | * smm_variable_access->datasize in StMM | |
228 | * @maxsize: maximum allowed size for variable payload checked against | |
229 | * smm_variable_access->datasize in StMM | |
230 | * | |
231 | * Defined in EDK2 as VAR_CHECK_VARIABLE_PROPERTY. | |
232 | */ | |
233 | struct var_check_property { | |
234 | u16 revision; | |
235 | u16 property; | |
236 | u32 attributes; | |
237 | efi_uintn_t minsize; | |
238 | efi_uintn_t maxsize; | |
239 | }; | |
240 | ||
241 | /** | |
242 | * struct smm_variable_var_check_property - Used to communicate variable | |
243 | * properties with StMM | |
244 | * | |
245 | * @guid: vendor GUID | |
246 | * @name_size: size of EFI name | |
247 | * @property: variable properties struct | |
248 | * @name: variable name | |
249 | * | |
250 | * Defined in EDK2 as SMM_VARIABLE_COMMUNICATE_VAR_CHECK_VARIABLE_PROPERTY. | |
251 | */ | |
252 | struct smm_variable_var_check_property { | |
253 | efi_guid_t guid; | |
254 | efi_uintn_t name_size; | |
255 | struct var_check_property property; | |
256 | u16 name[]; | |
257 | }; | |
258 | ||
218b062e AEK |
259 | #if CONFIG_IS_ENABLED(ARM_FFA_TRANSPORT) |
260 | /* supported MM transports */ | |
261 | enum mm_comms_select { | |
262 | MM_COMMS_UNDEFINED, | |
263 | MM_COMMS_FFA, | |
264 | MM_COMMS_OPTEE | |
265 | }; | |
266 | #endif | |
267 | ||
23a397d2 | 268 | #endif /* _MM_COMMUNICATION_H_ */ |