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