xref: /linux/drivers/firmware/efi/stmm/mm_communication.h (revision ea518afc992032f7570c0a89ac9240b387dc0faf)
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  */
45 struct 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  */
119 struct 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  */
139 struct 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  */
156 struct 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  */
169 struct 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  */
188 struct 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  */
211 struct 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  */
229 struct 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_ */
237