xref: /openbmc/linux/drivers/firmware/efi/efi.c (revision e5c86679)
1 /*
2  * efi.c - EFI subsystem
3  *
4  * Copyright (C) 2001,2003,2004 Dell <Matt_Domsch@dell.com>
5  * Copyright (C) 2004 Intel Corporation <matthew.e.tolentino@intel.com>
6  * Copyright (C) 2013 Tom Gundersen <teg@jklm.no>
7  *
8  * This code registers /sys/firmware/efi{,/efivars} when EFI is supported,
9  * allowing the efivarfs to be mounted or the efivars module to be loaded.
10  * The existance of /sys/firmware/efi may also be used by userspace to
11  * determine that the system supports EFI.
12  *
13  * This file is released under the GPLv2.
14  */
15 
16 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
17 
18 #include <linux/kobject.h>
19 #include <linux/module.h>
20 #include <linux/init.h>
21 #include <linux/device.h>
22 #include <linux/efi.h>
23 #include <linux/of.h>
24 #include <linux/of_fdt.h>
25 #include <linux/io.h>
26 #include <linux/kexec.h>
27 #include <linux/platform_device.h>
28 #include <linux/random.h>
29 #include <linux/reboot.h>
30 #include <linux/slab.h>
31 #include <linux/acpi.h>
32 #include <linux/ucs2_string.h>
33 #include <linux/memblock.h>
34 
35 #include <asm/early_ioremap.h>
36 
37 struct efi __read_mostly efi = {
38 	.mps			= EFI_INVALID_TABLE_ADDR,
39 	.acpi			= EFI_INVALID_TABLE_ADDR,
40 	.acpi20			= EFI_INVALID_TABLE_ADDR,
41 	.smbios			= EFI_INVALID_TABLE_ADDR,
42 	.smbios3		= EFI_INVALID_TABLE_ADDR,
43 	.sal_systab		= EFI_INVALID_TABLE_ADDR,
44 	.boot_info		= EFI_INVALID_TABLE_ADDR,
45 	.hcdp			= EFI_INVALID_TABLE_ADDR,
46 	.uga			= EFI_INVALID_TABLE_ADDR,
47 	.uv_systab		= EFI_INVALID_TABLE_ADDR,
48 	.fw_vendor		= EFI_INVALID_TABLE_ADDR,
49 	.runtime		= EFI_INVALID_TABLE_ADDR,
50 	.config_table		= EFI_INVALID_TABLE_ADDR,
51 	.esrt			= EFI_INVALID_TABLE_ADDR,
52 	.properties_table	= EFI_INVALID_TABLE_ADDR,
53 	.mem_attr_table		= EFI_INVALID_TABLE_ADDR,
54 	.rng_seed		= EFI_INVALID_TABLE_ADDR,
55 };
56 EXPORT_SYMBOL(efi);
57 
58 static bool disable_runtime;
59 static int __init setup_noefi(char *arg)
60 {
61 	disable_runtime = true;
62 	return 0;
63 }
64 early_param("noefi", setup_noefi);
65 
66 bool efi_runtime_disabled(void)
67 {
68 	return disable_runtime;
69 }
70 
71 static int __init parse_efi_cmdline(char *str)
72 {
73 	if (!str) {
74 		pr_warn("need at least one option\n");
75 		return -EINVAL;
76 	}
77 
78 	if (parse_option_str(str, "debug"))
79 		set_bit(EFI_DBG, &efi.flags);
80 
81 	if (parse_option_str(str, "noruntime"))
82 		disable_runtime = true;
83 
84 	return 0;
85 }
86 early_param("efi", parse_efi_cmdline);
87 
88 struct kobject *efi_kobj;
89 
90 /*
91  * Let's not leave out systab information that snuck into
92  * the efivars driver
93  */
94 static ssize_t systab_show(struct kobject *kobj,
95 			   struct kobj_attribute *attr, char *buf)
96 {
97 	char *str = buf;
98 
99 	if (!kobj || !buf)
100 		return -EINVAL;
101 
102 	if (efi.mps != EFI_INVALID_TABLE_ADDR)
103 		str += sprintf(str, "MPS=0x%lx\n", efi.mps);
104 	if (efi.acpi20 != EFI_INVALID_TABLE_ADDR)
105 		str += sprintf(str, "ACPI20=0x%lx\n", efi.acpi20);
106 	if (efi.acpi != EFI_INVALID_TABLE_ADDR)
107 		str += sprintf(str, "ACPI=0x%lx\n", efi.acpi);
108 	/*
109 	 * If both SMBIOS and SMBIOS3 entry points are implemented, the
110 	 * SMBIOS3 entry point shall be preferred, so we list it first to
111 	 * let applications stop parsing after the first match.
112 	 */
113 	if (efi.smbios3 != EFI_INVALID_TABLE_ADDR)
114 		str += sprintf(str, "SMBIOS3=0x%lx\n", efi.smbios3);
115 	if (efi.smbios != EFI_INVALID_TABLE_ADDR)
116 		str += sprintf(str, "SMBIOS=0x%lx\n", efi.smbios);
117 	if (efi.hcdp != EFI_INVALID_TABLE_ADDR)
118 		str += sprintf(str, "HCDP=0x%lx\n", efi.hcdp);
119 	if (efi.boot_info != EFI_INVALID_TABLE_ADDR)
120 		str += sprintf(str, "BOOTINFO=0x%lx\n", efi.boot_info);
121 	if (efi.uga != EFI_INVALID_TABLE_ADDR)
122 		str += sprintf(str, "UGA=0x%lx\n", efi.uga);
123 
124 	return str - buf;
125 }
126 
127 static struct kobj_attribute efi_attr_systab =
128 			__ATTR(systab, 0400, systab_show, NULL);
129 
130 #define EFI_FIELD(var) efi.var
131 
132 #define EFI_ATTR_SHOW(name) \
133 static ssize_t name##_show(struct kobject *kobj, \
134 				struct kobj_attribute *attr, char *buf) \
135 { \
136 	return sprintf(buf, "0x%lx\n", EFI_FIELD(name)); \
137 }
138 
139 EFI_ATTR_SHOW(fw_vendor);
140 EFI_ATTR_SHOW(runtime);
141 EFI_ATTR_SHOW(config_table);
142 
143 static ssize_t fw_platform_size_show(struct kobject *kobj,
144 				     struct kobj_attribute *attr, char *buf)
145 {
146 	return sprintf(buf, "%d\n", efi_enabled(EFI_64BIT) ? 64 : 32);
147 }
148 
149 static struct kobj_attribute efi_attr_fw_vendor = __ATTR_RO(fw_vendor);
150 static struct kobj_attribute efi_attr_runtime = __ATTR_RO(runtime);
151 static struct kobj_attribute efi_attr_config_table = __ATTR_RO(config_table);
152 static struct kobj_attribute efi_attr_fw_platform_size =
153 	__ATTR_RO(fw_platform_size);
154 
155 static struct attribute *efi_subsys_attrs[] = {
156 	&efi_attr_systab.attr,
157 	&efi_attr_fw_vendor.attr,
158 	&efi_attr_runtime.attr,
159 	&efi_attr_config_table.attr,
160 	&efi_attr_fw_platform_size.attr,
161 	NULL,
162 };
163 
164 static umode_t efi_attr_is_visible(struct kobject *kobj,
165 				   struct attribute *attr, int n)
166 {
167 	if (attr == &efi_attr_fw_vendor.attr) {
168 		if (efi_enabled(EFI_PARAVIRT) ||
169 				efi.fw_vendor == EFI_INVALID_TABLE_ADDR)
170 			return 0;
171 	} else if (attr == &efi_attr_runtime.attr) {
172 		if (efi.runtime == EFI_INVALID_TABLE_ADDR)
173 			return 0;
174 	} else if (attr == &efi_attr_config_table.attr) {
175 		if (efi.config_table == EFI_INVALID_TABLE_ADDR)
176 			return 0;
177 	}
178 
179 	return attr->mode;
180 }
181 
182 static struct attribute_group efi_subsys_attr_group = {
183 	.attrs = efi_subsys_attrs,
184 	.is_visible = efi_attr_is_visible,
185 };
186 
187 static struct efivars generic_efivars;
188 static struct efivar_operations generic_ops;
189 
190 static int generic_ops_register(void)
191 {
192 	generic_ops.get_variable = efi.get_variable;
193 	generic_ops.set_variable = efi.set_variable;
194 	generic_ops.set_variable_nonblocking = efi.set_variable_nonblocking;
195 	generic_ops.get_next_variable = efi.get_next_variable;
196 	generic_ops.query_variable_store = efi_query_variable_store;
197 
198 	return efivars_register(&generic_efivars, &generic_ops, efi_kobj);
199 }
200 
201 static void generic_ops_unregister(void)
202 {
203 	efivars_unregister(&generic_efivars);
204 }
205 
206 #if IS_ENABLED(CONFIG_ACPI)
207 #define EFIVAR_SSDT_NAME_MAX	16
208 static char efivar_ssdt[EFIVAR_SSDT_NAME_MAX] __initdata;
209 static int __init efivar_ssdt_setup(char *str)
210 {
211 	if (strlen(str) < sizeof(efivar_ssdt))
212 		memcpy(efivar_ssdt, str, strlen(str));
213 	else
214 		pr_warn("efivar_ssdt: name too long: %s\n", str);
215 	return 0;
216 }
217 __setup("efivar_ssdt=", efivar_ssdt_setup);
218 
219 static __init int efivar_ssdt_iter(efi_char16_t *name, efi_guid_t vendor,
220 				   unsigned long name_size, void *data)
221 {
222 	struct efivar_entry *entry;
223 	struct list_head *list = data;
224 	char utf8_name[EFIVAR_SSDT_NAME_MAX];
225 	int limit = min_t(unsigned long, EFIVAR_SSDT_NAME_MAX, name_size);
226 
227 	ucs2_as_utf8(utf8_name, name, limit - 1);
228 	if (strncmp(utf8_name, efivar_ssdt, limit) != 0)
229 		return 0;
230 
231 	entry = kmalloc(sizeof(*entry), GFP_KERNEL);
232 	if (!entry)
233 		return 0;
234 
235 	memcpy(entry->var.VariableName, name, name_size);
236 	memcpy(&entry->var.VendorGuid, &vendor, sizeof(efi_guid_t));
237 
238 	efivar_entry_add(entry, list);
239 
240 	return 0;
241 }
242 
243 static __init int efivar_ssdt_load(void)
244 {
245 	LIST_HEAD(entries);
246 	struct efivar_entry *entry, *aux;
247 	unsigned long size;
248 	void *data;
249 	int ret;
250 
251 	ret = efivar_init(efivar_ssdt_iter, &entries, true, &entries);
252 
253 	list_for_each_entry_safe(entry, aux, &entries, list) {
254 		pr_info("loading SSDT from variable %s-%pUl\n", efivar_ssdt,
255 			&entry->var.VendorGuid);
256 
257 		list_del(&entry->list);
258 
259 		ret = efivar_entry_size(entry, &size);
260 		if (ret) {
261 			pr_err("failed to get var size\n");
262 			goto free_entry;
263 		}
264 
265 		data = kmalloc(size, GFP_KERNEL);
266 		if (!data) {
267 			ret = -ENOMEM;
268 			goto free_entry;
269 		}
270 
271 		ret = efivar_entry_get(entry, NULL, &size, data);
272 		if (ret) {
273 			pr_err("failed to get var data\n");
274 			goto free_data;
275 		}
276 
277 		ret = acpi_load_table(data);
278 		if (ret) {
279 			pr_err("failed to load table: %d\n", ret);
280 			goto free_data;
281 		}
282 
283 		goto free_entry;
284 
285 free_data:
286 		kfree(data);
287 
288 free_entry:
289 		kfree(entry);
290 	}
291 
292 	return ret;
293 }
294 #else
295 static inline int efivar_ssdt_load(void) { return 0; }
296 #endif
297 
298 /*
299  * We register the efi subsystem with the firmware subsystem and the
300  * efivars subsystem with the efi subsystem, if the system was booted with
301  * EFI.
302  */
303 static int __init efisubsys_init(void)
304 {
305 	int error;
306 
307 	if (!efi_enabled(EFI_BOOT))
308 		return 0;
309 
310 	/* We register the efi directory at /sys/firmware/efi */
311 	efi_kobj = kobject_create_and_add("efi", firmware_kobj);
312 	if (!efi_kobj) {
313 		pr_err("efi: Firmware registration failed.\n");
314 		return -ENOMEM;
315 	}
316 
317 	error = generic_ops_register();
318 	if (error)
319 		goto err_put;
320 
321 	if (efi_enabled(EFI_RUNTIME_SERVICES))
322 		efivar_ssdt_load();
323 
324 	error = sysfs_create_group(efi_kobj, &efi_subsys_attr_group);
325 	if (error) {
326 		pr_err("efi: Sysfs attribute export failed with error %d.\n",
327 		       error);
328 		goto err_unregister;
329 	}
330 
331 	error = efi_runtime_map_init(efi_kobj);
332 	if (error)
333 		goto err_remove_group;
334 
335 	/* and the standard mountpoint for efivarfs */
336 	error = sysfs_create_mount_point(efi_kobj, "efivars");
337 	if (error) {
338 		pr_err("efivars: Subsystem registration failed.\n");
339 		goto err_remove_group;
340 	}
341 
342 	return 0;
343 
344 err_remove_group:
345 	sysfs_remove_group(efi_kobj, &efi_subsys_attr_group);
346 err_unregister:
347 	generic_ops_unregister();
348 err_put:
349 	kobject_put(efi_kobj);
350 	return error;
351 }
352 
353 subsys_initcall(efisubsys_init);
354 
355 /*
356  * Find the efi memory descriptor for a given physical address.  Given a
357  * physical address, determine if it exists within an EFI Memory Map entry,
358  * and if so, populate the supplied memory descriptor with the appropriate
359  * data.
360  */
361 int __init efi_mem_desc_lookup(u64 phys_addr, efi_memory_desc_t *out_md)
362 {
363 	efi_memory_desc_t *md;
364 
365 	if (!efi_enabled(EFI_MEMMAP)) {
366 		pr_err_once("EFI_MEMMAP is not enabled.\n");
367 		return -EINVAL;
368 	}
369 
370 	if (!out_md) {
371 		pr_err_once("out_md is null.\n");
372 		return -EINVAL;
373         }
374 
375 	for_each_efi_memory_desc(md) {
376 		u64 size;
377 		u64 end;
378 
379 		if (!(md->attribute & EFI_MEMORY_RUNTIME) &&
380 		    md->type != EFI_BOOT_SERVICES_DATA &&
381 		    md->type != EFI_RUNTIME_SERVICES_DATA) {
382 			continue;
383 		}
384 
385 		size = md->num_pages << EFI_PAGE_SHIFT;
386 		end = md->phys_addr + size;
387 		if (phys_addr >= md->phys_addr && phys_addr < end) {
388 			memcpy(out_md, md, sizeof(*out_md));
389 			return 0;
390 		}
391 	}
392 	return -ENOENT;
393 }
394 
395 /*
396  * Calculate the highest address of an efi memory descriptor.
397  */
398 u64 __init efi_mem_desc_end(efi_memory_desc_t *md)
399 {
400 	u64 size = md->num_pages << EFI_PAGE_SHIFT;
401 	u64 end = md->phys_addr + size;
402 	return end;
403 }
404 
405 void __init __weak efi_arch_mem_reserve(phys_addr_t addr, u64 size) {}
406 
407 /**
408  * efi_mem_reserve - Reserve an EFI memory region
409  * @addr: Physical address to reserve
410  * @size: Size of reservation
411  *
412  * Mark a region as reserved from general kernel allocation and
413  * prevent it being released by efi_free_boot_services().
414  *
415  * This function should be called drivers once they've parsed EFI
416  * configuration tables to figure out where their data lives, e.g.
417  * efi_esrt_init().
418  */
419 void __init efi_mem_reserve(phys_addr_t addr, u64 size)
420 {
421 	if (!memblock_is_region_reserved(addr, size))
422 		memblock_reserve(addr, size);
423 
424 	/*
425 	 * Some architectures (x86) reserve all boot services ranges
426 	 * until efi_free_boot_services() because of buggy firmware
427 	 * implementations. This means the above memblock_reserve() is
428 	 * superfluous on x86 and instead what it needs to do is
429 	 * ensure the @start, @size is not freed.
430 	 */
431 	efi_arch_mem_reserve(addr, size);
432 }
433 
434 static __initdata efi_config_table_type_t common_tables[] = {
435 	{ACPI_20_TABLE_GUID, "ACPI 2.0", &efi.acpi20},
436 	{ACPI_TABLE_GUID, "ACPI", &efi.acpi},
437 	{HCDP_TABLE_GUID, "HCDP", &efi.hcdp},
438 	{MPS_TABLE_GUID, "MPS", &efi.mps},
439 	{SAL_SYSTEM_TABLE_GUID, "SALsystab", &efi.sal_systab},
440 	{SMBIOS_TABLE_GUID, "SMBIOS", &efi.smbios},
441 	{SMBIOS3_TABLE_GUID, "SMBIOS 3.0", &efi.smbios3},
442 	{UGA_IO_PROTOCOL_GUID, "UGA", &efi.uga},
443 	{EFI_SYSTEM_RESOURCE_TABLE_GUID, "ESRT", &efi.esrt},
444 	{EFI_PROPERTIES_TABLE_GUID, "PROP", &efi.properties_table},
445 	{EFI_MEMORY_ATTRIBUTES_TABLE_GUID, "MEMATTR", &efi.mem_attr_table},
446 	{LINUX_EFI_RANDOM_SEED_TABLE_GUID, "RNG", &efi.rng_seed},
447 	{NULL_GUID, NULL, NULL},
448 };
449 
450 static __init int match_config_table(efi_guid_t *guid,
451 				     unsigned long table,
452 				     efi_config_table_type_t *table_types)
453 {
454 	int i;
455 
456 	if (table_types) {
457 		for (i = 0; efi_guidcmp(table_types[i].guid, NULL_GUID); i++) {
458 			if (!efi_guidcmp(*guid, table_types[i].guid)) {
459 				*(table_types[i].ptr) = table;
460 				if (table_types[i].name)
461 					pr_cont(" %s=0x%lx ",
462 						table_types[i].name, table);
463 				return 1;
464 			}
465 		}
466 	}
467 
468 	return 0;
469 }
470 
471 int __init efi_config_parse_tables(void *config_tables, int count, int sz,
472 				   efi_config_table_type_t *arch_tables)
473 {
474 	void *tablep;
475 	int i;
476 
477 	tablep = config_tables;
478 	pr_info("");
479 	for (i = 0; i < count; i++) {
480 		efi_guid_t guid;
481 		unsigned long table;
482 
483 		if (efi_enabled(EFI_64BIT)) {
484 			u64 table64;
485 			guid = ((efi_config_table_64_t *)tablep)->guid;
486 			table64 = ((efi_config_table_64_t *)tablep)->table;
487 			table = table64;
488 #ifndef CONFIG_64BIT
489 			if (table64 >> 32) {
490 				pr_cont("\n");
491 				pr_err("Table located above 4GB, disabling EFI.\n");
492 				return -EINVAL;
493 			}
494 #endif
495 		} else {
496 			guid = ((efi_config_table_32_t *)tablep)->guid;
497 			table = ((efi_config_table_32_t *)tablep)->table;
498 		}
499 
500 		if (!match_config_table(&guid, table, common_tables))
501 			match_config_table(&guid, table, arch_tables);
502 
503 		tablep += sz;
504 	}
505 	pr_cont("\n");
506 	set_bit(EFI_CONFIG_TABLES, &efi.flags);
507 
508 	if (efi.rng_seed != EFI_INVALID_TABLE_ADDR) {
509 		struct linux_efi_random_seed *seed;
510 		u32 size = 0;
511 
512 		seed = early_memremap(efi.rng_seed, sizeof(*seed));
513 		if (seed != NULL) {
514 			size = seed->size;
515 			early_memunmap(seed, sizeof(*seed));
516 		} else {
517 			pr_err("Could not map UEFI random seed!\n");
518 		}
519 		if (size > 0) {
520 			seed = early_memremap(efi.rng_seed,
521 					      sizeof(*seed) + size);
522 			if (seed != NULL) {
523 				add_device_randomness(seed->bits, seed->size);
524 				early_memunmap(seed, sizeof(*seed) + size);
525 			} else {
526 				pr_err("Could not map UEFI random seed!\n");
527 			}
528 		}
529 	}
530 
531 	efi_memattr_init();
532 
533 	/* Parse the EFI Properties table if it exists */
534 	if (efi.properties_table != EFI_INVALID_TABLE_ADDR) {
535 		efi_properties_table_t *tbl;
536 
537 		tbl = early_memremap(efi.properties_table, sizeof(*tbl));
538 		if (tbl == NULL) {
539 			pr_err("Could not map Properties table!\n");
540 			return -ENOMEM;
541 		}
542 
543 		if (tbl->memory_protection_attribute &
544 		    EFI_PROPERTIES_RUNTIME_MEMORY_PROTECTION_NON_EXECUTABLE_PE_DATA)
545 			set_bit(EFI_NX_PE_DATA, &efi.flags);
546 
547 		early_memunmap(tbl, sizeof(*tbl));
548 	}
549 
550 	return 0;
551 }
552 
553 int __init efi_config_init(efi_config_table_type_t *arch_tables)
554 {
555 	void *config_tables;
556 	int sz, ret;
557 
558 	if (efi_enabled(EFI_64BIT))
559 		sz = sizeof(efi_config_table_64_t);
560 	else
561 		sz = sizeof(efi_config_table_32_t);
562 
563 	/*
564 	 * Let's see what config tables the firmware passed to us.
565 	 */
566 	config_tables = early_memremap(efi.systab->tables,
567 				       efi.systab->nr_tables * sz);
568 	if (config_tables == NULL) {
569 		pr_err("Could not map Configuration table!\n");
570 		return -ENOMEM;
571 	}
572 
573 	ret = efi_config_parse_tables(config_tables, efi.systab->nr_tables, sz,
574 				      arch_tables);
575 
576 	early_memunmap(config_tables, efi.systab->nr_tables * sz);
577 	return ret;
578 }
579 
580 #ifdef CONFIG_EFI_VARS_MODULE
581 static int __init efi_load_efivars(void)
582 {
583 	struct platform_device *pdev;
584 
585 	if (!efi_enabled(EFI_RUNTIME_SERVICES))
586 		return 0;
587 
588 	pdev = platform_device_register_simple("efivars", 0, NULL, 0);
589 	return IS_ERR(pdev) ? PTR_ERR(pdev) : 0;
590 }
591 device_initcall(efi_load_efivars);
592 #endif
593 
594 #ifdef CONFIG_EFI_PARAMS_FROM_FDT
595 
596 #define UEFI_PARAM(name, prop, field)			   \
597 	{						   \
598 		{ name },				   \
599 		{ prop },				   \
600 		offsetof(struct efi_fdt_params, field),    \
601 		FIELD_SIZEOF(struct efi_fdt_params, field) \
602 	}
603 
604 struct params {
605 	const char name[32];
606 	const char propname[32];
607 	int offset;
608 	int size;
609 };
610 
611 static __initdata struct params fdt_params[] = {
612 	UEFI_PARAM("System Table", "linux,uefi-system-table", system_table),
613 	UEFI_PARAM("MemMap Address", "linux,uefi-mmap-start", mmap),
614 	UEFI_PARAM("MemMap Size", "linux,uefi-mmap-size", mmap_size),
615 	UEFI_PARAM("MemMap Desc. Size", "linux,uefi-mmap-desc-size", desc_size),
616 	UEFI_PARAM("MemMap Desc. Version", "linux,uefi-mmap-desc-ver", desc_ver)
617 };
618 
619 static __initdata struct params xen_fdt_params[] = {
620 	UEFI_PARAM("System Table", "xen,uefi-system-table", system_table),
621 	UEFI_PARAM("MemMap Address", "xen,uefi-mmap-start", mmap),
622 	UEFI_PARAM("MemMap Size", "xen,uefi-mmap-size", mmap_size),
623 	UEFI_PARAM("MemMap Desc. Size", "xen,uefi-mmap-desc-size", desc_size),
624 	UEFI_PARAM("MemMap Desc. Version", "xen,uefi-mmap-desc-ver", desc_ver)
625 };
626 
627 #define EFI_FDT_PARAMS_SIZE	ARRAY_SIZE(fdt_params)
628 
629 static __initdata struct {
630 	const char *uname;
631 	const char *subnode;
632 	struct params *params;
633 } dt_params[] = {
634 	{ "hypervisor", "uefi", xen_fdt_params },
635 	{ "chosen", NULL, fdt_params },
636 };
637 
638 struct param_info {
639 	int found;
640 	void *params;
641 	const char *missing;
642 };
643 
644 static int __init __find_uefi_params(unsigned long node,
645 				     struct param_info *info,
646 				     struct params *params)
647 {
648 	const void *prop;
649 	void *dest;
650 	u64 val;
651 	int i, len;
652 
653 	for (i = 0; i < EFI_FDT_PARAMS_SIZE; i++) {
654 		prop = of_get_flat_dt_prop(node, params[i].propname, &len);
655 		if (!prop) {
656 			info->missing = params[i].name;
657 			return 0;
658 		}
659 
660 		dest = info->params + params[i].offset;
661 		info->found++;
662 
663 		val = of_read_number(prop, len / sizeof(u32));
664 
665 		if (params[i].size == sizeof(u32))
666 			*(u32 *)dest = val;
667 		else
668 			*(u64 *)dest = val;
669 
670 		if (efi_enabled(EFI_DBG))
671 			pr_info("  %s: 0x%0*llx\n", params[i].name,
672 				params[i].size * 2, val);
673 	}
674 
675 	return 1;
676 }
677 
678 static int __init fdt_find_uefi_params(unsigned long node, const char *uname,
679 				       int depth, void *data)
680 {
681 	struct param_info *info = data;
682 	int i;
683 
684 	for (i = 0; i < ARRAY_SIZE(dt_params); i++) {
685 		const char *subnode = dt_params[i].subnode;
686 
687 		if (depth != 1 || strcmp(uname, dt_params[i].uname) != 0) {
688 			info->missing = dt_params[i].params[0].name;
689 			continue;
690 		}
691 
692 		if (subnode) {
693 			int err = of_get_flat_dt_subnode_by_name(node, subnode);
694 
695 			if (err < 0)
696 				return 0;
697 
698 			node = err;
699 		}
700 
701 		return __find_uefi_params(node, info, dt_params[i].params);
702 	}
703 
704 	return 0;
705 }
706 
707 int __init efi_get_fdt_params(struct efi_fdt_params *params)
708 {
709 	struct param_info info;
710 	int ret;
711 
712 	pr_info("Getting EFI parameters from FDT:\n");
713 
714 	info.found = 0;
715 	info.params = params;
716 
717 	ret = of_scan_flat_dt(fdt_find_uefi_params, &info);
718 	if (!info.found)
719 		pr_info("UEFI not found.\n");
720 	else if (!ret)
721 		pr_err("Can't find '%s' in device tree!\n",
722 		       info.missing);
723 
724 	return ret;
725 }
726 #endif /* CONFIG_EFI_PARAMS_FROM_FDT */
727 
728 static __initdata char memory_type_name[][20] = {
729 	"Reserved",
730 	"Loader Code",
731 	"Loader Data",
732 	"Boot Code",
733 	"Boot Data",
734 	"Runtime Code",
735 	"Runtime Data",
736 	"Conventional Memory",
737 	"Unusable Memory",
738 	"ACPI Reclaim Memory",
739 	"ACPI Memory NVS",
740 	"Memory Mapped I/O",
741 	"MMIO Port Space",
742 	"PAL Code",
743 	"Persistent Memory",
744 };
745 
746 char * __init efi_md_typeattr_format(char *buf, size_t size,
747 				     const efi_memory_desc_t *md)
748 {
749 	char *pos;
750 	int type_len;
751 	u64 attr;
752 
753 	pos = buf;
754 	if (md->type >= ARRAY_SIZE(memory_type_name))
755 		type_len = snprintf(pos, size, "[type=%u", md->type);
756 	else
757 		type_len = snprintf(pos, size, "[%-*s",
758 				    (int)(sizeof(memory_type_name[0]) - 1),
759 				    memory_type_name[md->type]);
760 	if (type_len >= size)
761 		return buf;
762 
763 	pos += type_len;
764 	size -= type_len;
765 
766 	attr = md->attribute;
767 	if (attr & ~(EFI_MEMORY_UC | EFI_MEMORY_WC | EFI_MEMORY_WT |
768 		     EFI_MEMORY_WB | EFI_MEMORY_UCE | EFI_MEMORY_RO |
769 		     EFI_MEMORY_WP | EFI_MEMORY_RP | EFI_MEMORY_XP |
770 		     EFI_MEMORY_NV |
771 		     EFI_MEMORY_RUNTIME | EFI_MEMORY_MORE_RELIABLE))
772 		snprintf(pos, size, "|attr=0x%016llx]",
773 			 (unsigned long long)attr);
774 	else
775 		snprintf(pos, size,
776 			 "|%3s|%2s|%2s|%2s|%2s|%2s|%2s|%3s|%2s|%2s|%2s|%2s]",
777 			 attr & EFI_MEMORY_RUNTIME ? "RUN" : "",
778 			 attr & EFI_MEMORY_MORE_RELIABLE ? "MR" : "",
779 			 attr & EFI_MEMORY_NV      ? "NV"  : "",
780 			 attr & EFI_MEMORY_XP      ? "XP"  : "",
781 			 attr & EFI_MEMORY_RP      ? "RP"  : "",
782 			 attr & EFI_MEMORY_WP      ? "WP"  : "",
783 			 attr & EFI_MEMORY_RO      ? "RO"  : "",
784 			 attr & EFI_MEMORY_UCE     ? "UCE" : "",
785 			 attr & EFI_MEMORY_WB      ? "WB"  : "",
786 			 attr & EFI_MEMORY_WT      ? "WT"  : "",
787 			 attr & EFI_MEMORY_WC      ? "WC"  : "",
788 			 attr & EFI_MEMORY_UC      ? "UC"  : "");
789 	return buf;
790 }
791 
792 /*
793  * efi_mem_attributes - lookup memmap attributes for physical address
794  * @phys_addr: the physical address to lookup
795  *
796  * Search in the EFI memory map for the region covering
797  * @phys_addr. Returns the EFI memory attributes if the region
798  * was found in the memory map, 0 otherwise.
799  *
800  * Despite being marked __weak, most architectures should *not*
801  * override this function. It is __weak solely for the benefit
802  * of ia64 which has a funky EFI memory map that doesn't work
803  * the same way as other architectures.
804  */
805 u64 __weak efi_mem_attributes(unsigned long phys_addr)
806 {
807 	efi_memory_desc_t *md;
808 
809 	if (!efi_enabled(EFI_MEMMAP))
810 		return 0;
811 
812 	for_each_efi_memory_desc(md) {
813 		if ((md->phys_addr <= phys_addr) &&
814 		    (phys_addr < (md->phys_addr +
815 		    (md->num_pages << EFI_PAGE_SHIFT))))
816 			return md->attribute;
817 	}
818 	return 0;
819 }
820 
821 int efi_status_to_err(efi_status_t status)
822 {
823 	int err;
824 
825 	switch (status) {
826 	case EFI_SUCCESS:
827 		err = 0;
828 		break;
829 	case EFI_INVALID_PARAMETER:
830 		err = -EINVAL;
831 		break;
832 	case EFI_OUT_OF_RESOURCES:
833 		err = -ENOSPC;
834 		break;
835 	case EFI_DEVICE_ERROR:
836 		err = -EIO;
837 		break;
838 	case EFI_WRITE_PROTECTED:
839 		err = -EROFS;
840 		break;
841 	case EFI_SECURITY_VIOLATION:
842 		err = -EACCES;
843 		break;
844 	case EFI_NOT_FOUND:
845 		err = -ENOENT;
846 		break;
847 	case EFI_ABORTED:
848 		err = -EINTR;
849 		break;
850 	default:
851 		err = -EINVAL;
852 	}
853 
854 	return err;
855 }
856 
857 #ifdef CONFIG_KEXEC
858 static int update_efi_random_seed(struct notifier_block *nb,
859 				  unsigned long code, void *unused)
860 {
861 	struct linux_efi_random_seed *seed;
862 	u32 size = 0;
863 
864 	if (!kexec_in_progress)
865 		return NOTIFY_DONE;
866 
867 	seed = memremap(efi.rng_seed, sizeof(*seed), MEMREMAP_WB);
868 	if (seed != NULL) {
869 		size = min(seed->size, 32U);
870 		memunmap(seed);
871 	} else {
872 		pr_err("Could not map UEFI random seed!\n");
873 	}
874 	if (size > 0) {
875 		seed = memremap(efi.rng_seed, sizeof(*seed) + size,
876 				MEMREMAP_WB);
877 		if (seed != NULL) {
878 			seed->size = size;
879 			get_random_bytes(seed->bits, seed->size);
880 			memunmap(seed);
881 		} else {
882 			pr_err("Could not map UEFI random seed!\n");
883 		}
884 	}
885 	return NOTIFY_DONE;
886 }
887 
888 static struct notifier_block efi_random_seed_nb = {
889 	.notifier_call = update_efi_random_seed,
890 };
891 
892 static int register_update_efi_random_seed(void)
893 {
894 	if (efi.rng_seed == EFI_INVALID_TABLE_ADDR)
895 		return 0;
896 	return register_reboot_notifier(&efi_random_seed_nb);
897 }
898 late_initcall(register_update_efi_random_seed);
899 #endif
900