acpi: Support writing a string
[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 /*
97  * This constant identifies the file format for storing UEFI variables in
98  * struct efi_var_file.
99  */
100 #define EFI_VAR_FILE_MAGIC 0x0161566966456255 /* UbEfiVa, version 1 */
101
102 /**
103  * struct efi_var_entry - UEFI variable file entry
104  *
105  * @length:     length of enty, multiple of 8
106  * @attr:       variable attributes
107  * @time:       authentication time (seconds since start of epoch)
108  * @guid:       vendor GUID
109  * @name:       UTF16 variable name
110  */
111 struct efi_var_entry {
112         u32 length;
113         u32 attr;
114         u64 time;
115         efi_guid_t guid;
116         u16 name[];
117 };
118
119 /**
120  * struct efi_var_file - file for storing UEFI variables
121  *
122  * @reserved:   unused, may be overwritten by memory probing
123  * @magic:      identifies file format, takes value %EFI_VAR_FILE_MAGIC
124  * @length:     length including header
125  * @crc32:      CRC32 without header
126  * @var:        variables
127  */
128 struct efi_var_file {
129         u64 reserved;
130         u64 magic;
131         u32 length;
132         u32 crc32;
133         struct efi_var_entry var[];
134 };
135
136 /**
137  * efi_var_to_file() - save non-volatile variables as file
138  *
139  * File ubootefi.var is created on the EFI system partion.
140  *
141  * Return:      status code
142  */
143 efi_status_t efi_var_to_file(void);
144
145 /**
146  * efi_var_restore() - restore EFI variables from buffer
147  *
148  * @buf:        buffer
149  * Return:      status code
150  */
151 efi_status_t efi_var_restore(struct efi_var_file *buf);
152
153 /**
154  * efi_var_from_file() - read variables from file
155  *
156  * File ubootefi.var is read from the EFI system partitions and the variables
157  * stored in the file are created.
158  *
159  * In case the file does not exist yet or a variable cannot be set EFI_SUCCESS
160  * is returned.
161  *
162  * Return:      status code
163  */
164 efi_status_t efi_var_from_file(void);
165
166 /**
167  * efi_var_mem_init() - set-up variable list
168  *
169  * Return:      status code
170  */
171 efi_status_t efi_var_mem_init(void);
172
173 /**
174  * efi_var_mem_find() - find a variable in the list
175  *
176  * @guid:       GUID of the variable
177  * @name:       name of the variable
178  * @next:       on exit pointer to the next variable after the found one
179  * Return:      found variable
180  */
181 struct efi_var_entry *efi_var_mem_find(const efi_guid_t *guid, const u16 *name,
182                                        struct efi_var_entry **next);
183
184 /**
185  * efi_var_mem_del() - delete a variable from the list of variables
186  *
187  * @var:        variable to delete
188  */
189 void efi_var_mem_del(struct efi_var_entry *var);
190
191 /**
192  * efi_var_mem_ins() - append a variable to the list of variables
193  *
194  * The variable is appended without checking if a variable of the same name
195  * already exists. The two data buffers are concatenated.
196  *
197  * @variable_name:      variable name
198  * @vendor:             GUID
199  * @attributes:         variable attributes
200  * @size1:              size of the first data buffer
201  * @data1:              first data buffer
202  * @size2:              size of the second data field
203  * @data2:              second data buffer
204  * @time:               time of authentication (as seconds since start of epoch)
205  * Result:              status code
206  */
207 efi_status_t efi_var_mem_ins(u16 *variable_name,
208                              const efi_guid_t *vendor, u32 attributes,
209                              const efi_uintn_t size1, const void *data1,
210                              const efi_uintn_t size2, const void *data2,
211                              const u64 time);
212
213 /**
214  * efi_var_mem_free() - determine free memory for variables
215  *
216  * Return:      maximum data size plus variable name size
217  */
218 u64 efi_var_mem_free(void);
219
220 /**
221  * efi_init_secure_state - initialize secure boot state
222  *
223  * Return:      status code
224  */
225 efi_status_t efi_init_secure_state(void);
226
227 /**
228  * efi_auth_var_get_type() - convert variable name and guid to enum
229  *
230  * @name:       name of UEFI variable
231  * @guid:       guid of UEFI variable
232  * Return:      identifier for authentication related variables
233  */
234 enum efi_auth_var_type efi_auth_var_get_type(u16 *name, const efi_guid_t *guid);
235
236 #endif