File Index
Files and directories
Sign in
FILE

mm_communication.h

File preview with syntax highlighting.

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