efi_loader: pre-seed UEFI variables
[platform/kernel/u-boot.git] / include / efi_variable.h
1 /* SPDX-License-Identifier: GPL-2.0+ */
2 /*
3  * Copyright (c) 2020, Heinrich Schuchardt <xypron.glpk@gmx.de>
4  */
5
6 #ifndef _EFI_VARIABLE_H
7 #define _EFI_VARIABLE_H
8
9 #include <linux/bitops.h>
10
11 #define EFI_VARIABLE_READ_ONLY BIT(31)
12
13 enum efi_auth_var_type {
14         EFI_AUTH_VAR_NONE = 0,
15         EFI_AUTH_VAR_PK,
16         EFI_AUTH_VAR_KEK,
17         EFI_AUTH_VAR_DB,
18         EFI_AUTH_VAR_DBX,
19         EFI_AUTH_VAR_DBT,
20         EFI_AUTH_VAR_DBR,
21 };
22
23 /**
24  * efi_get_variable() - retrieve value of a UEFI variable
25  *
26  * @variable_name:      name of the variable
27  * @vendor:             vendor GUID
28  * @attributes:         attributes of the variable
29  * @data_size:          size of the buffer to which the variable value is copied
30  * @data:               buffer to which the variable value is copied
31  * @timep:              authentication time (seconds since start of epoch)
32  * Return:              status code
33  */
34 efi_status_t efi_get_variable_int(u16 *variable_name, const efi_guid_t *vendor,
35                                   u32 *attributes, efi_uintn_t *data_size,
36                                   void *data, u64 *timep);
37
38 /**
39  * efi_set_variable() - set value of a UEFI variable
40  *
41  * @variable_name:      name of the variable
42  * @vendor:             vendor GUID
43  * @attributes:         attributes of the variable
44  * @data_size:          size of the buffer with the variable value
45  * @data:               buffer with the variable value
46  * @ro_check:           check the read only read only bit in attributes
47  * Return:              status code
48  */
49 efi_status_t efi_set_variable_int(u16 *variable_name, const efi_guid_t *vendor,
50                                   u32 attributes, efi_uintn_t data_size,
51                                   const void *data, bool ro_check);
52
53 /**
54  * efi_get_next_variable_name_int() - enumerate the current variable names
55  *
56  * @variable_name_size: size of variable_name buffer in byte
57  * @variable_name:      name of uefi variable's name in u16
58  * @vendor:             vendor's guid
59  *
60  * See the Unified Extensible Firmware Interface (UEFI) specification for
61  * details.
62  *
63  * Return: status code
64  */
65 efi_status_t efi_get_next_variable_name_int(efi_uintn_t *variable_name_size,
66                                             u16 *variable_name,
67                                             efi_guid_t *vendor);
68
69 /**
70  * efi_query_variable_info_int() - get information about EFI variables
71  *
72  * This function implements the QueryVariableInfo() runtime service.
73  *
74  * See the Unified Extensible Firmware Interface (UEFI) specification for
75  * details.
76  *
77  * @attributes:                         bitmask to select variables to be
78  *                                      queried
79  * @maximum_variable_storage_size:      maximum size of storage area for the
80  *                                      selected variable types
81  * @remaining_variable_storage_size:    remaining size of storage are for the
82  *                                      selected variable types
83  * @maximum_variable_size:              maximum size of a variable of the
84  *                                      selected type
85  * Returns:                             status code
86  */
87 efi_status_t efi_query_variable_info_int(u32 attributes,
88                                          u64 *maximum_variable_storage_size,
89                                          u64 *remaining_variable_storage_size,
90                                          u64 *maximum_variable_size);
91
92 #define EFI_VAR_FILE_NAME "ubootefi.var"
93
94 #define EFI_VAR_BUF_SIZE 0x4000
95
96 #define EFI_VAR_FILE_MAGIC 0x0161566966456255 /* UbEfiVa, version 1 */
97
98 /**
99  * struct efi_var_entry - UEFI variable file entry
100  *
101  * @length:     length of enty, multiple of 8
102  * @attr:       variable attributes
103  * @time:       authentication time (seconds since start of epoch)
104  * @guid:       vendor GUID
105  * @name:       UTF16 variable name
106  */
107 struct efi_var_entry {
108         u32 length;
109         u32 attr;
110         u64 time;
111         efi_guid_t guid;
112         u16 name[];
113 };
114
115 /**
116  * struct efi_var_file - file for storing UEFI variables
117  *
118  * @reserved:   unused, may be overwritten by memory probing
119  * @magic:      identifies file format
120  * @length:     length including header
121  * @crc32:      CRC32 without header
122  * @var:        variables
123  */
124 struct efi_var_file {
125         u64 reserved;
126         u64 magic;
127         u32 length;
128         u32 crc32;
129         struct efi_var_entry var[];
130 };
131
132 /**
133  * efi_var_to_file() - save non-volatile variables as file
134  *
135  * File ubootefi.var is created on the EFI system partion.
136  *
137  * Return:      status code
138  */
139 efi_status_t efi_var_to_file(void);
140
141 /**
142  * efi_var_restore() - restore EFI variables from buffer
143  *
144  * @buf:        buffer
145  * Return:      status code
146  */
147 efi_status_t efi_var_restore(struct efi_var_file *buf);
148
149 /**
150  * efi_var_from_file() - read variables from file
151  *
152  * File ubootefi.var is read from the EFI system partitions and the variables
153  * stored in the file are created.
154  *
155  * In case the file does not exist yet or a variable cannot be set EFI_SUCCESS
156  * is returned.
157  *
158  * Return:      status code
159  */
160 efi_status_t efi_var_from_file(void);
161
162 /**
163  * efi_var_mem_init() - set-up variable list
164  *
165  * Return:      status code
166  */
167 efi_status_t efi_var_mem_init(void);
168
169 /**
170  * efi_var_mem_find() - find a variable in the list
171  *
172  * @guid:       GUID of the variable
173  * @name:       name of the variable
174  * @next:       on exit pointer to the next variable after the found one
175  * Return:      found variable
176  */
177 struct efi_var_entry *efi_var_mem_find(const efi_guid_t *guid, const u16 *name,
178                                        struct efi_var_entry **next);
179
180 /**
181  * efi_var_mem_del() - delete a variable from the list of variables
182  *
183  * @var:        variable to delete
184  */
185 void efi_var_mem_del(struct efi_var_entry *var);
186
187 /**
188  * efi_var_mem_ins() - append a variable to the list of variables
189  *
190  * The variable is appended without checking if a variable of the same name
191  * already exists. The two data buffers are concatenated.
192  *
193  * @variable_name:      variable name
194  * @vendor:             GUID
195  * @attributes:         variable attributes
196  * @size1:              size of the first data buffer
197  * @data1:              first data buffer
198  * @size2:              size of the second data field
199  * @data2:              second data buffer
200  * @time:               time of authentication (as seconds since start of epoch)
201  * Result:              status code
202  */
203 efi_status_t efi_var_mem_ins(u16 *variable_name,
204                              const efi_guid_t *vendor, u32 attributes,
205                              const efi_uintn_t size1, const void *data1,
206                              const efi_uintn_t size2, const void *data2,
207                              const u64 time);
208
209 /**
210  * efi_var_mem_free() - determine free memory for variables
211  *
212  * Return:      maximum data size plus variable name size
213  */
214 u64 efi_var_mem_free(void);
215
216 /**
217  * efi_init_secure_state - initialize secure boot state
218  *
219  * Return:      status code
220  */
221 efi_status_t efi_init_secure_state(void);
222
223 /**
224  * efi_auth_var_get_type() - convert variable name and guid to enum
225  *
226  * @name:       name of UEFI variable
227  * @guid:       guid of UEFI variable
228  * Return:      identifier for authentication related variables
229  */
230 enum efi_auth_var_type efi_auth_var_get_type(u16 *name, const efi_guid_t *guid);
231
232 #endif