]>
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. <sughosh.ganu@linaro.org> | |
8 | * Copyright (C) 2020 Linaro Ltd. <ilias.apalodimas@linaro.org> | |
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 | */ | |
46 | struct efi_mm_communicate_header { | |
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 | ||
55 | /* Defined in EDK2 ArmPkg/Include/IndustryStandard/ArmStdSmc.h */ | |
56 | ||
57 | /* MM return error codes */ | |
58 | #define ARM_SMC_MM_RET_SUCCESS 0 | |
59 | #define ARM_SMC_MM_RET_NOT_SUPPORTED -1 | |
60 | #define ARM_SMC_MM_RET_INVALID_PARAMS -2 | |
61 | #define ARM_SMC_MM_RET_DENIED -3 | |
62 | #define ARM_SMC_MM_RET_NO_MEMORY -4 | |
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 | ||
208 | #endif /* _MM_COMMUNICATION_H_ */ |