xref: /linux/drivers/firmware/efi/stmm/mm_communication.h (revision 06d07429858317ded2db7986113a9e0129cd599b)
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