1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3 * EFI setup code
4 *
5 * Copyright (c) 2016-2018 Alexander Graf et al.
6 */
7
8 #define LOG_CATEGORY LOGC_EFI
9
10 #include <efi_loader.h>
11 #include <efi_variable.h>
12 #include <log.h>
13 #include <asm-generic/unaligned.h>
14 #include <net.h>
15
16 #define OBJ_LIST_INITIALIZED 0
17 #define OBJ_LIST_NOT_INITIALIZED 1
18
19 efi_status_t efi_obj_list_initialized = OBJ_LIST_NOT_INITIALIZED;
20
21 const efi_guid_t efi_debug_image_info_table_guid =
22 EFI_DEBUG_IMAGE_INFO_TABLE_GUID;
23
24 /*
25 * Allow unaligned memory access.
26 *
27 * This routine is overridden by architectures providing this feature.
28 */
allow_unaligned(void)29 void __weak allow_unaligned(void)
30 {
31 }
32
33 /**
34 * efi_init_platform_lang() - define supported languages
35 *
36 * Set the PlatformLangCodes and PlatformLang variables.
37 *
38 * Return: status code
39 */
efi_init_platform_lang(void)40 static efi_status_t efi_init_platform_lang(void)
41 {
42 efi_status_t ret;
43 efi_uintn_t data_size = 0;
44 char *lang = CONFIG_EFI_PLATFORM_LANG_CODES;
45 char *pos;
46
47 /*
48 * Variable PlatformLangCodes defines the language codes that the
49 * machine can support.
50 */
51 ret = efi_set_variable_int(u"PlatformLangCodes",
52 &efi_global_variable_guid,
53 EFI_VARIABLE_BOOTSERVICE_ACCESS |
54 EFI_VARIABLE_RUNTIME_ACCESS |
55 EFI_VARIABLE_READ_ONLY,
56 sizeof(CONFIG_EFI_PLATFORM_LANG_CODES),
57 CONFIG_EFI_PLATFORM_LANG_CODES, false);
58 if (ret != EFI_SUCCESS)
59 goto out;
60
61 /*
62 * Variable PlatformLang defines the language that the machine has been
63 * configured for.
64 */
65 ret = efi_get_variable_int(u"PlatformLang",
66 &efi_global_variable_guid,
67 NULL, &data_size, &pos, NULL);
68 if (ret == EFI_BUFFER_TOO_SMALL) {
69 /* The variable is already set. Do not change it. */
70 ret = EFI_SUCCESS;
71 goto out;
72 }
73
74 /*
75 * The list of supported languages is semicolon separated. Use the first
76 * language to initialize PlatformLang.
77 */
78 pos = strchr(lang, ';');
79 if (pos)
80 *pos = 0;
81
82 ret = efi_set_variable_int(u"PlatformLang",
83 &efi_global_variable_guid,
84 EFI_VARIABLE_NON_VOLATILE |
85 EFI_VARIABLE_BOOTSERVICE_ACCESS |
86 EFI_VARIABLE_RUNTIME_ACCESS,
87 1 + strlen(lang), lang, false);
88 out:
89 if (ret != EFI_SUCCESS)
90 printf("EFI: cannot initialize platform language settings\n");
91 return ret;
92 }
93
94 /**
95 * efi_init_secure_boot - initialize secure boot state
96 *
97 * Return: status code
98 */
efi_init_secure_boot(void)99 static efi_status_t efi_init_secure_boot(void)
100 {
101 efi_guid_t signature_types[] = {
102 EFI_CERT_SHA256_GUID,
103 EFI_CERT_X509_GUID,
104 };
105 efi_status_t ret;
106
107 ret = efi_set_variable_int(u"SignatureSupport",
108 &efi_global_variable_guid,
109 EFI_VARIABLE_READ_ONLY |
110 EFI_VARIABLE_BOOTSERVICE_ACCESS |
111 EFI_VARIABLE_RUNTIME_ACCESS,
112 sizeof(signature_types),
113 &signature_types, false);
114 if (ret != EFI_SUCCESS)
115 printf("EFI: cannot initialize SignatureSupport variable\n");
116
117 return ret;
118 }
119
120 /**
121 * efi_init_capsule - initialize capsule update state
122 *
123 * Return: status code
124 */
efi_init_capsule(void)125 static efi_status_t efi_init_capsule(void)
126 {
127 efi_status_t ret = EFI_SUCCESS;
128
129 if (IS_ENABLED(CONFIG_EFI_HAVE_CAPSULE_SUPPORT)) {
130 u16 var_name16[12];
131
132 efi_create_indexed_name(var_name16, sizeof(var_name16),
133 "Capsule", CONFIG_EFI_CAPSULE_MAX);
134
135 ret = efi_set_variable_int(u"CapsuleMax",
136 &efi_guid_capsule_report,
137 EFI_VARIABLE_READ_ONLY |
138 EFI_VARIABLE_BOOTSERVICE_ACCESS |
139 EFI_VARIABLE_RUNTIME_ACCESS,
140 22, var_name16, false);
141 if (ret != EFI_SUCCESS)
142 printf("EFI: cannot initialize CapsuleMax variable\n");
143 }
144
145 return ret;
146 }
147
148 /**
149 * efi_init_os_indications() - indicate supported features for OS requests
150 *
151 * Set the OsIndicationsSupported variable.
152 *
153 * Return: status code
154 */
efi_init_os_indications(void)155 static efi_status_t efi_init_os_indications(void)
156 {
157 u64 os_indications_supported = 0;
158
159 if (IS_ENABLED(CONFIG_EFI_HAVE_CAPSULE_SUPPORT))
160 os_indications_supported |=
161 EFI_OS_INDICATIONS_CAPSULE_RESULT_VAR_SUPPORTED;
162
163 if (IS_ENABLED(CONFIG_EFI_CAPSULE_ON_DISK))
164 os_indications_supported |=
165 EFI_OS_INDICATIONS_FILE_CAPSULE_DELIVERY_SUPPORTED;
166
167 if (IS_ENABLED(CONFIG_EFI_CAPSULE_FIRMWARE_MANAGEMENT))
168 os_indications_supported |=
169 EFI_OS_INDICATIONS_FMP_CAPSULE_SUPPORTED;
170
171 return efi_set_variable_int(u"OsIndicationsSupported",
172 &efi_global_variable_guid,
173 EFI_VARIABLE_BOOTSERVICE_ACCESS |
174 EFI_VARIABLE_RUNTIME_ACCESS |
175 EFI_VARIABLE_READ_ONLY,
176 sizeof(os_indications_supported),
177 &os_indications_supported, false);
178 }
179
180 /**
181 * efi_init_early() - handle initialization at early stage
182 *
183 * expected to be called in board_init_r().
184 *
185 * Return: status code
186 */
efi_init_early(void)187 int efi_init_early(void)
188 {
189 efi_status_t ret;
190
191 /* Allow unaligned memory access */
192 allow_unaligned();
193
194 /* Initialize root node */
195 ret = efi_root_node_register();
196 if (ret != EFI_SUCCESS)
197 goto out;
198
199 ret = efi_console_register();
200 if (ret != EFI_SUCCESS)
201 goto out;
202
203 /* Initialize EFI driver uclass */
204 ret = efi_driver_init();
205 if (ret != EFI_SUCCESS)
206 goto out;
207
208 return 0;
209 out:
210 /* never re-init UEFI subsystem */
211 efi_obj_list_initialized = ret;
212
213 return -1;
214 }
215
216 /**
217 * efi_start_obj_list() - Start EFI object list
218 *
219 * Return: status code
220 */
efi_start_obj_list(void)221 static efi_status_t efi_start_obj_list(void)
222 {
223 efi_status_t ret = EFI_SUCCESS;
224
225 if (IS_ENABLED(CONFIG_NETDEVICES))
226 ret = efi_net_do_start(eth_get_dev());
227
228 return ret;
229 }
230
231 /**
232 * efi_init_obj_list() - Initialize and populate EFI object list
233 *
234 * Return: status code
235 */
efi_init_obj_list(void)236 efi_status_t efi_init_obj_list(void)
237 {
238 efi_status_t ret = EFI_SUCCESS;
239
240 /* Initialize only once, but start every time if correctly initialized*/
241 if (efi_obj_list_initialized == OBJ_LIST_INITIALIZED)
242 return efi_start_obj_list();
243 if (efi_obj_list_initialized != OBJ_LIST_NOT_INITIALIZED)
244 return efi_obj_list_initialized;
245
246 /* Set up console modes */
247 efi_setup_console_size();
248
249 /*
250 * Probe block devices to find the ESP.
251 * efi_disks_register() must be called before efi_init_variables().
252 */
253 ret = efi_disks_register();
254 if (ret != EFI_SUCCESS)
255 goto out;
256
257 /* Initialize variable services */
258 ret = efi_init_variables();
259 if (ret != EFI_SUCCESS)
260 goto out;
261
262 if (IS_ENABLED(CONFIG_CMD_BOOTEFI_BOOTMGR)) {
263 /* update boot option after variable service initialized */
264 ret = efi_bootmgr_update_media_device_boot_option();
265 if (ret != EFI_SUCCESS)
266 goto out;
267 }
268
269 /* Define supported languages */
270 ret = efi_init_platform_lang();
271 if (ret != EFI_SUCCESS)
272 goto out;
273
274 /* Indicate supported features */
275 ret = efi_init_os_indications();
276 if (ret != EFI_SUCCESS)
277 goto out;
278
279 /* Initialize system table */
280 ret = efi_initialize_system_table();
281 if (ret != EFI_SUCCESS)
282 goto out;
283
284 /* Initialize system table pointer */
285 if (IS_ENABLED(CONFIG_EFI_DEBUG_SUPPORT)) {
286 efi_guid_t debug_image_info_table_guid =
287 efi_debug_image_info_table_guid;
288
289 ret = efi_initialize_system_table_pointer();
290 if (ret != EFI_SUCCESS)
291 goto out;
292
293 ret = efi_install_configuration_table(&debug_image_info_table_guid,
294 &efi_m_debug_info_table_header);
295 if (ret != EFI_SUCCESS)
296 goto out;
297 }
298
299 if (IS_ENABLED(CONFIG_EFI_ECPT)) {
300 ret = efi_ecpt_register();
301 if (ret != EFI_SUCCESS)
302 goto out;
303 }
304
305 if (IS_ENABLED(CONFIG_EFI_ESRT)) {
306 ret = efi_esrt_register();
307 if (ret != EFI_SUCCESS)
308 goto out;
309 }
310
311 if (IS_ENABLED(CONFIG_EFI_TCG2_PROTOCOL)) {
312 ret = efi_tcg2_register();
313 if (ret != EFI_SUCCESS)
314 goto out;
315
316 ret = efi_tcg2_do_initial_measurement();
317 if (ret == EFI_SECURITY_VIOLATION)
318 goto out;
319 }
320
321 /* Install EFI_RNG_PROTOCOL */
322 if (IS_ENABLED(CONFIG_EFI_RNG_PROTOCOL)) {
323 ret = efi_rng_register();
324 if (ret != EFI_SUCCESS)
325 goto out;
326 }
327
328 if (IS_ENABLED(CONFIG_EFI_RISCV_BOOT_PROTOCOL)) {
329 ret = efi_riscv_register();
330 if (ret != EFI_SUCCESS)
331 goto out;
332 }
333
334 /* Secure boot */
335 if (IS_ENABLED(CONFIG_EFI_SECURE_BOOT)) {
336 ret = efi_init_secure_boot();
337 if (ret != EFI_SUCCESS)
338 goto out;
339 }
340
341 /* Indicate supported runtime services */
342 ret = efi_init_runtime_supported();
343 if (ret != EFI_SUCCESS)
344 goto out;
345
346 if (IS_ENABLED(CONFIG_EFI_HAVE_CAPSULE_SUPPORT)) {
347 ret = efi_load_capsule_drivers();
348 if (ret != EFI_SUCCESS)
349 goto out;
350 }
351
352 if (IS_ENABLED(CONFIG_VIDEO)) {
353 ret = efi_gop_register();
354 if (ret != EFI_SUCCESS)
355 goto out;
356 }
357 if (IS_ENABLED(CONFIG_NETDEVICES)) {
358 ret = efi_net_register(eth_get_dev());
359 if (ret != EFI_SUCCESS)
360 goto out;
361 }
362 if (IS_ENABLED(CONFIG_ACPI)) {
363 ret = efi_acpi_register();
364 if (ret != EFI_SUCCESS)
365 goto out;
366 }
367 if (IS_ENABLED(CONFIG_SMBIOS)) {
368 ret = efi_smbios_register();
369 if (ret != EFI_SUCCESS)
370 goto out;
371 }
372 ret = efi_watchdog_register();
373 if (ret != EFI_SUCCESS)
374 goto out;
375
376 ret = efi_init_capsule();
377 if (ret != EFI_SUCCESS)
378 goto out;
379
380 /* Initialize EFI runtime services */
381 ret = efi_reset_system_init();
382 if (ret != EFI_SUCCESS)
383 goto out;
384
385 /* Execute capsules after reboot */
386 if (IS_ENABLED(CONFIG_EFI_CAPSULE_ON_DISK) &&
387 !IS_ENABLED(CONFIG_EFI_CAPSULE_ON_DISK_EARLY))
388 ret = efi_launch_capsules();
389 if (ret != EFI_SUCCESS)
390 goto out;
391
392 ret = efi_start_obj_list();
393 out:
394 efi_obj_list_initialized = ret;
395 return ret;
396 }
397