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 __packed 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/ArmMmSvc.h */ 56 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 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 #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 251 #endif /* _MM_COMMUNICATION_H_ */ 252