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