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