Prepare v2023.10
[platform/kernel/u-boot.git] / include / mm_communication.h
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  *  Copyright 2022-2023 Arm Limited and/or its affiliates <open-source-office@arm.com>
10  *    Authors:
11  *      Abdellatif El Khlifi <abdellatif.elkhlifi@arm.com>
12  */
13
14 #ifndef _MM_COMMUNICATION_H_
15 #define _MM_COMMUNICATION_H_
16
17 #include <part_efi.h>
18
19 #if CONFIG_IS_ENABLED(ARM_FFA_TRANSPORT)
20 /* MM service UUID string (big-endian format). This UUID is  common across all MM SPs */
21 #define MM_SP_UUID      "33d532ed-e699-0942-c09c-a798d9cd722d"
22 #endif
23
24 /*
25  * Interface to the pseudo Trusted Application (TA), which provides a
26  * communication channel with the Standalone MM (Management Mode)
27  * Secure Partition running at Secure-EL0
28  */
29
30 #define PTA_STMM_CMDID_COMMUNICATE 0
31
32 /* OP-TEE is using big endian GUIDs while UEFI uses little endian ones */
33 #define PTA_STMM_UUID { 0xed32d533, 0x99e6, 0x4209, {\
34                         0x9c, 0xc0, 0x2d, 0x72, 0xcd, 0xd9, 0x98, 0xa7 } }
35
36 #define EFI_MM_VARIABLE_GUID \
37         EFI_GUID(0xed32d533, 0x99e6, 0x4209, \
38                  0x9c, 0xc0, 0x2d, 0x72, 0xcd, 0xd9, 0x98, 0xa7)
39
40 /* Defined in EDK2 MdePkg/Include/Protocol/MmCommunication.h */
41
42 /**
43  * struct efi_mm_communicate_header - Header used for SMM variable communication
44
45  * @header_guid:  header use for disambiguation of content
46  * @message_len:  length of the message. Does not include the size of the
47  *                header
48  * @data:         payload of the message
49  *
50  * Defined in EDK2 as EFI_MM_COMMUNICATE_HEADER.
51  * To avoid confusion in interpreting frames, the communication buffer should
52  * always begin with efi_mm_communicate_header.
53  */
54 struct __packed efi_mm_communicate_header {
55         efi_guid_t header_guid;
56         size_t     message_len;
57         u8         data[];
58 };
59
60 #define MM_COMMUNICATE_HEADER_SIZE \
61         (sizeof(struct efi_mm_communicate_header))
62
63 /* Defined in EDK2 ArmPkg/Include/IndustryStandard/ArmMmSvc.h */
64
65 /* SPM return error codes */
66 #define ARM_SVC_SPM_RET_SUCCESS               0
67 #define ARM_SVC_SPM_RET_NOT_SUPPORTED        -1
68 #define ARM_SVC_SPM_RET_INVALID_PARAMS       -2
69 #define ARM_SVC_SPM_RET_DENIED               -3
70 #define ARM_SVC_SPM_RET_NO_MEMORY            -5
71
72 /* Defined in EDK2 MdeModulePkg/Include/Guid/SmmVariableCommon.h */
73
74 #define SMM_VARIABLE_FUNCTION_GET_VARIABLE  1
75 /*
76  * The payload for this function is
77  * SMM_VARIABLE_COMMUNICATE_GET_NEXT_VARIABLE_NAME.
78  */
79 #define SMM_VARIABLE_FUNCTION_GET_NEXT_VARIABLE_NAME  2
80 /*
81  * The payload for this function is SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE.
82  */
83 #define SMM_VARIABLE_FUNCTION_SET_VARIABLE  3
84 /*
85  * The payload for this function is
86  * SMM_VARIABLE_COMMUNICATE_QUERY_VARIABLE_INFO.
87  */
88 #define SMM_VARIABLE_FUNCTION_QUERY_VARIABLE_INFO  4
89 /*
90  * It is a notify event, no extra payload for this function.
91  */
92 #define SMM_VARIABLE_FUNCTION_READY_TO_BOOT  5
93 /*
94  * It is a notify event, no extra payload for this function.
95  */
96 #define SMM_VARIABLE_FUNCTION_EXIT_BOOT_SERVICE  6
97 /*
98  * The payload for this function is VARIABLE_INFO_ENTRY.
99  * The GUID in EFI_SMM_COMMUNICATE_HEADER is gEfiSmmVariableProtocolGuid.
100  */
101 #define SMM_VARIABLE_FUNCTION_GET_STATISTICS  7
102 /*
103  * The payload for this function is SMM_VARIABLE_COMMUNICATE_LOCK_VARIABLE
104  */
105 #define SMM_VARIABLE_FUNCTION_LOCK_VARIABLE   8
106
107 #define SMM_VARIABLE_FUNCTION_VAR_CHECK_VARIABLE_PROPERTY_SET  9
108
109 #define SMM_VARIABLE_FUNCTION_VAR_CHECK_VARIABLE_PROPERTY_GET  10
110
111 #define SMM_VARIABLE_FUNCTION_GET_PAYLOAD_SIZE  11
112 /*
113  * The payload for this function is
114  * SMM_VARIABLE_COMMUNICATE_RUNTIME_VARIABLE_CACHE_CONTEXT
115  */
116 #define SMM_VARIABLE_FUNCTION_INIT_RUNTIME_VARIABLE_CACHE_CONTEXT 12
117
118 #define SMM_VARIABLE_FUNCTION_SYNC_RUNTIME_CACHE  13
119 /*
120  * The payload for this function is
121  * SMM_VARIABLE_COMMUNICATE_GET_RUNTIME_CACHE_INFO
122  */
123 #define SMM_VARIABLE_FUNCTION_GET_RUNTIME_CACHE_INFO  14
124
125 /**
126  * struct smm_variable_communicate_header - Used for SMM variable communication
127
128  * @function:     function to call in Smm.
129  * @ret_status:   return status
130  * @data:         payload
131  *
132  * Defined in EDK2 as SMM_VARIABLE_COMMUNICATE_HEADER.
133  */
134 struct smm_variable_communicate_header {
135         efi_uintn_t  function;
136         efi_status_t ret_status;
137         u8           data[];
138 };
139
140 #define MM_VARIABLE_COMMUNICATE_SIZE \
141         (sizeof(struct smm_variable_communicate_header))
142
143 /**
144  * struct smm_variable_access - Used to communicate with StMM by
145  *                              SetVariable and GetVariable.
146
147  * @guid:         vendor GUID
148  * @data_size:    size of EFI variable data
149  * @name_size:    size of EFI name
150  * @attr:         attributes
151  * @name:         variable name
152  *
153  * Defined in EDK2 as SMM_VARIABLE_COMMUNICATE_ACCESS_VARIABLE.
154  *
155  */
156 struct smm_variable_access {
157         efi_guid_t  guid;
158         efi_uintn_t data_size;
159         efi_uintn_t name_size;
160         u32         attr;
161         u16         name[];
162 };
163
164 #define MM_VARIABLE_ACCESS_HEADER_SIZE \
165         (sizeof(struct smm_variable_access))
166 /**
167  * struct smm_variable_payload_size - Used to get the max allowed
168  *                                    payload used in StMM.
169  *
170  * @size:  size to fill in
171  *
172  * Defined in EDK2 as SMM_VARIABLE_COMMUNICATE_GET_PAYLOAD_SIZE.
173  *
174  */
175 struct smm_variable_payload_size {
176         efi_uintn_t size;
177 };
178
179 /**
180  * struct smm_variable_getnext - Used to communicate with StMM for
181  *                               GetNextVariableName.
182  *
183  * @guid:       vendor GUID
184  * @name_size:  size of the name of the variable
185  * @name:       variable name
186  *
187  * Defined in EDK2 as SMM_VARIABLE_COMMUNICATE_GET_NEXT_VARIABLE_NAME.
188  */
189 struct smm_variable_getnext {
190         efi_guid_t  guid;
191         efi_uintn_t name_size;
192         u16         name[];
193 };
194
195 #define MM_VARIABLE_GET_NEXT_HEADER_SIZE \
196         (sizeof(struct smm_variable_getnext))
197
198 /**
199  * struct smm_variable_query_info - Used to communicate with StMM for
200  *                                  QueryVariableInfo.
201  *
202  * @max_variable_storage:        max available storage
203  * @remaining_variable_storage:  remaining available storage
204  * @max_variable_size:           max variable supported size
205  * @attr:                        attributes to query storage for
206  *
207  * Defined in EDK2 as SMM_VARIABLE_COMMUNICATE_QUERY_VARIABLE_INFO.
208  */
209 struct smm_variable_query_info {
210         u64 max_variable_storage;
211         u64 remaining_variable_storage;
212         u64 max_variable_size;
213         u32 attr;
214 };
215
216 #define VAR_CHECK_VARIABLE_PROPERTY_REVISION 0x0001
217 #define VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY BIT(0)
218 /**
219  * struct var_check_property - Used to store variable properties in StMM
220  *
221  * @revision:   magic revision number for variable property checking
222  * @property:   properties mask for the variable used in StMM.
223  *              Currently RO flag is supported
224  * @attributes: variable attributes used in StMM checking when properties
225  *              for a variable are enabled
226  * @minsize:    minimum allowed size for variable payload checked against
227  *              smm_variable_access->datasize in StMM
228  * @maxsize:    maximum allowed size for variable payload checked against
229  *              smm_variable_access->datasize in StMM
230  *
231  * Defined in EDK2 as VAR_CHECK_VARIABLE_PROPERTY.
232  */
233 struct var_check_property {
234         u16         revision;
235         u16         property;
236         u32         attributes;
237         efi_uintn_t minsize;
238         efi_uintn_t maxsize;
239 };
240
241 /**
242  * struct smm_variable_var_check_property - Used to communicate variable
243  *                                          properties with StMM
244  *
245  * @guid:       vendor GUID
246  * @name_size:  size of EFI name
247  * @property:   variable properties struct
248  * @name:       variable name
249  *
250  * Defined in EDK2 as SMM_VARIABLE_COMMUNICATE_VAR_CHECK_VARIABLE_PROPERTY.
251  */
252 struct smm_variable_var_check_property {
253         efi_guid_t                guid;
254         efi_uintn_t               name_size;
255         struct var_check_property property;
256         u16                       name[];
257 };
258
259 #if CONFIG_IS_ENABLED(ARM_FFA_TRANSPORT)
260 /* supported MM transports */
261 enum mm_comms_select {
262         MM_COMMS_UNDEFINED,
263         MM_COMMS_FFA,
264         MM_COMMS_OPTEE
265 };
266 #endif
267
268 #endif /* _MM_COMMUNICATION_H_ */