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