xref: /openbmc/linux/drivers/firmware/efi/efi.c (revision a2cce7a9)
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/platform_device.h>
27 
28 struct efi __read_mostly efi = {
29 	.mps        = EFI_INVALID_TABLE_ADDR,
30 	.acpi       = EFI_INVALID_TABLE_ADDR,
31 	.acpi20     = EFI_INVALID_TABLE_ADDR,
32 	.smbios     = EFI_INVALID_TABLE_ADDR,
33 	.smbios3    = EFI_INVALID_TABLE_ADDR,
34 	.sal_systab = EFI_INVALID_TABLE_ADDR,
35 	.boot_info  = EFI_INVALID_TABLE_ADDR,
36 	.hcdp       = EFI_INVALID_TABLE_ADDR,
37 	.uga        = EFI_INVALID_TABLE_ADDR,
38 	.uv_systab  = EFI_INVALID_TABLE_ADDR,
39 	.fw_vendor  = EFI_INVALID_TABLE_ADDR,
40 	.runtime    = EFI_INVALID_TABLE_ADDR,
41 	.config_table  = EFI_INVALID_TABLE_ADDR,
42 	.esrt       = EFI_INVALID_TABLE_ADDR,
43 };
44 EXPORT_SYMBOL(efi);
45 
46 static bool disable_runtime;
47 static int __init setup_noefi(char *arg)
48 {
49 	disable_runtime = true;
50 	return 0;
51 }
52 early_param("noefi", setup_noefi);
53 
54 bool efi_runtime_disabled(void)
55 {
56 	return disable_runtime;
57 }
58 
59 static int __init parse_efi_cmdline(char *str)
60 {
61 	if (!str) {
62 		pr_warn("need at least one option\n");
63 		return -EINVAL;
64 	}
65 
66 	if (parse_option_str(str, "noruntime"))
67 		disable_runtime = true;
68 
69 	return 0;
70 }
71 early_param("efi", parse_efi_cmdline);
72 
73 struct kobject *efi_kobj;
74 
75 /*
76  * Let's not leave out systab information that snuck into
77  * the efivars driver
78  */
79 static ssize_t systab_show(struct kobject *kobj,
80 			   struct kobj_attribute *attr, char *buf)
81 {
82 	char *str = buf;
83 
84 	if (!kobj || !buf)
85 		return -EINVAL;
86 
87 	if (efi.mps != EFI_INVALID_TABLE_ADDR)
88 		str += sprintf(str, "MPS=0x%lx\n", efi.mps);
89 	if (efi.acpi20 != EFI_INVALID_TABLE_ADDR)
90 		str += sprintf(str, "ACPI20=0x%lx\n", efi.acpi20);
91 	if (efi.acpi != EFI_INVALID_TABLE_ADDR)
92 		str += sprintf(str, "ACPI=0x%lx\n", efi.acpi);
93 	/*
94 	 * If both SMBIOS and SMBIOS3 entry points are implemented, the
95 	 * SMBIOS3 entry point shall be preferred, so we list it first to
96 	 * let applications stop parsing after the first match.
97 	 */
98 	if (efi.smbios3 != EFI_INVALID_TABLE_ADDR)
99 		str += sprintf(str, "SMBIOS3=0x%lx\n", efi.smbios3);
100 	if (efi.smbios != EFI_INVALID_TABLE_ADDR)
101 		str += sprintf(str, "SMBIOS=0x%lx\n", efi.smbios);
102 	if (efi.hcdp != EFI_INVALID_TABLE_ADDR)
103 		str += sprintf(str, "HCDP=0x%lx\n", efi.hcdp);
104 	if (efi.boot_info != EFI_INVALID_TABLE_ADDR)
105 		str += sprintf(str, "BOOTINFO=0x%lx\n", efi.boot_info);
106 	if (efi.uga != EFI_INVALID_TABLE_ADDR)
107 		str += sprintf(str, "UGA=0x%lx\n", efi.uga);
108 
109 	return str - buf;
110 }
111 
112 static struct kobj_attribute efi_attr_systab =
113 			__ATTR(systab, 0400, systab_show, NULL);
114 
115 #define EFI_FIELD(var) efi.var
116 
117 #define EFI_ATTR_SHOW(name) \
118 static ssize_t name##_show(struct kobject *kobj, \
119 				struct kobj_attribute *attr, char *buf) \
120 { \
121 	return sprintf(buf, "0x%lx\n", EFI_FIELD(name)); \
122 }
123 
124 EFI_ATTR_SHOW(fw_vendor);
125 EFI_ATTR_SHOW(runtime);
126 EFI_ATTR_SHOW(config_table);
127 
128 static ssize_t fw_platform_size_show(struct kobject *kobj,
129 				     struct kobj_attribute *attr, char *buf)
130 {
131 	return sprintf(buf, "%d\n", efi_enabled(EFI_64BIT) ? 64 : 32);
132 }
133 
134 static struct kobj_attribute efi_attr_fw_vendor = __ATTR_RO(fw_vendor);
135 static struct kobj_attribute efi_attr_runtime = __ATTR_RO(runtime);
136 static struct kobj_attribute efi_attr_config_table = __ATTR_RO(config_table);
137 static struct kobj_attribute efi_attr_fw_platform_size =
138 	__ATTR_RO(fw_platform_size);
139 
140 static struct attribute *efi_subsys_attrs[] = {
141 	&efi_attr_systab.attr,
142 	&efi_attr_fw_vendor.attr,
143 	&efi_attr_runtime.attr,
144 	&efi_attr_config_table.attr,
145 	&efi_attr_fw_platform_size.attr,
146 	NULL,
147 };
148 
149 static umode_t efi_attr_is_visible(struct kobject *kobj,
150 				   struct attribute *attr, int n)
151 {
152 	if (attr == &efi_attr_fw_vendor.attr) {
153 		if (efi_enabled(EFI_PARAVIRT) ||
154 				efi.fw_vendor == EFI_INVALID_TABLE_ADDR)
155 			return 0;
156 	} else if (attr == &efi_attr_runtime.attr) {
157 		if (efi.runtime == EFI_INVALID_TABLE_ADDR)
158 			return 0;
159 	} else if (attr == &efi_attr_config_table.attr) {
160 		if (efi.config_table == EFI_INVALID_TABLE_ADDR)
161 			return 0;
162 	}
163 
164 	return attr->mode;
165 }
166 
167 static struct attribute_group efi_subsys_attr_group = {
168 	.attrs = efi_subsys_attrs,
169 	.is_visible = efi_attr_is_visible,
170 };
171 
172 static struct efivars generic_efivars;
173 static struct efivar_operations generic_ops;
174 
175 static int generic_ops_register(void)
176 {
177 	generic_ops.get_variable = efi.get_variable;
178 	generic_ops.set_variable = efi.set_variable;
179 	generic_ops.get_next_variable = efi.get_next_variable;
180 	generic_ops.query_variable_store = efi_query_variable_store;
181 
182 	return efivars_register(&generic_efivars, &generic_ops, efi_kobj);
183 }
184 
185 static void generic_ops_unregister(void)
186 {
187 	efivars_unregister(&generic_efivars);
188 }
189 
190 /*
191  * We register the efi subsystem with the firmware subsystem and the
192  * efivars subsystem with the efi subsystem, if the system was booted with
193  * EFI.
194  */
195 static int __init efisubsys_init(void)
196 {
197 	int error;
198 
199 	if (!efi_enabled(EFI_BOOT))
200 		return 0;
201 
202 	/* We register the efi directory at /sys/firmware/efi */
203 	efi_kobj = kobject_create_and_add("efi", firmware_kobj);
204 	if (!efi_kobj) {
205 		pr_err("efi: Firmware registration failed.\n");
206 		return -ENOMEM;
207 	}
208 
209 	error = generic_ops_register();
210 	if (error)
211 		goto err_put;
212 
213 	error = sysfs_create_group(efi_kobj, &efi_subsys_attr_group);
214 	if (error) {
215 		pr_err("efi: Sysfs attribute export failed with error %d.\n",
216 		       error);
217 		goto err_unregister;
218 	}
219 
220 	error = efi_runtime_map_init(efi_kobj);
221 	if (error)
222 		goto err_remove_group;
223 
224 	/* and the standard mountpoint for efivarfs */
225 	error = sysfs_create_mount_point(efi_kobj, "efivars");
226 	if (error) {
227 		pr_err("efivars: Subsystem registration failed.\n");
228 		goto err_remove_group;
229 	}
230 
231 	return 0;
232 
233 err_remove_group:
234 	sysfs_remove_group(efi_kobj, &efi_subsys_attr_group);
235 err_unregister:
236 	generic_ops_unregister();
237 err_put:
238 	kobject_put(efi_kobj);
239 	return error;
240 }
241 
242 subsys_initcall(efisubsys_init);
243 
244 /*
245  * Find the efi memory descriptor for a given physical address.  Given a
246  * physicall address, determine if it exists within an EFI Memory Map entry,
247  * and if so, populate the supplied memory descriptor with the appropriate
248  * data.
249  */
250 int __init efi_mem_desc_lookup(u64 phys_addr, efi_memory_desc_t *out_md)
251 {
252 	struct efi_memory_map *map = efi.memmap;
253 	void *p, *e;
254 
255 	if (!efi_enabled(EFI_MEMMAP)) {
256 		pr_err_once("EFI_MEMMAP is not enabled.\n");
257 		return -EINVAL;
258 	}
259 
260 	if (!map) {
261 		pr_err_once("efi.memmap is not set.\n");
262 		return -EINVAL;
263 	}
264 	if (!out_md) {
265 		pr_err_once("out_md is null.\n");
266 		return -EINVAL;
267         }
268 	if (WARN_ON_ONCE(!map->phys_map))
269 		return -EINVAL;
270 	if (WARN_ON_ONCE(map->nr_map == 0) || WARN_ON_ONCE(map->desc_size == 0))
271 		return -EINVAL;
272 
273 	e = map->phys_map + map->nr_map * map->desc_size;
274 	for (p = map->phys_map; p < e; p += map->desc_size) {
275 		efi_memory_desc_t *md;
276 		u64 size;
277 		u64 end;
278 
279 		/*
280 		 * If a driver calls this after efi_free_boot_services,
281 		 * ->map will be NULL, and the target may also not be mapped.
282 		 * So just always get our own virtual map on the CPU.
283 		 *
284 		 */
285 		md = early_memremap((phys_addr_t)p, sizeof (*md));
286 		if (!md) {
287 			pr_err_once("early_memremap(%p, %zu) failed.\n",
288 				    p, sizeof (*md));
289 			return -ENOMEM;
290 		}
291 
292 		if (!(md->attribute & EFI_MEMORY_RUNTIME) &&
293 		    md->type != EFI_BOOT_SERVICES_DATA &&
294 		    md->type != EFI_RUNTIME_SERVICES_DATA) {
295 			early_memunmap(md, sizeof (*md));
296 			continue;
297 		}
298 
299 		size = md->num_pages << EFI_PAGE_SHIFT;
300 		end = md->phys_addr + size;
301 		if (phys_addr >= md->phys_addr && phys_addr < end) {
302 			memcpy(out_md, md, sizeof(*out_md));
303 			early_memunmap(md, sizeof (*md));
304 			return 0;
305 		}
306 
307 		early_memunmap(md, sizeof (*md));
308 	}
309 	pr_err_once("requested map not found.\n");
310 	return -ENOENT;
311 }
312 
313 /*
314  * Calculate the highest address of an efi memory descriptor.
315  */
316 u64 __init efi_mem_desc_end(efi_memory_desc_t *md)
317 {
318 	u64 size = md->num_pages << EFI_PAGE_SHIFT;
319 	u64 end = md->phys_addr + size;
320 	return end;
321 }
322 
323 /*
324  * We can't ioremap data in EFI boot services RAM, because we've already mapped
325  * it as RAM.  So, look it up in the existing EFI memory map instead.  Only
326  * callable after efi_enter_virtual_mode and before efi_free_boot_services.
327  */
328 void __iomem *efi_lookup_mapped_addr(u64 phys_addr)
329 {
330 	struct efi_memory_map *map;
331 	void *p;
332 	map = efi.memmap;
333 	if (!map)
334 		return NULL;
335 	if (WARN_ON(!map->map))
336 		return NULL;
337 	for (p = map->map; p < map->map_end; p += map->desc_size) {
338 		efi_memory_desc_t *md = p;
339 		u64 size = md->num_pages << EFI_PAGE_SHIFT;
340 		u64 end = md->phys_addr + size;
341 		if (!(md->attribute & EFI_MEMORY_RUNTIME) &&
342 		    md->type != EFI_BOOT_SERVICES_CODE &&
343 		    md->type != EFI_BOOT_SERVICES_DATA)
344 			continue;
345 		if (!md->virt_addr)
346 			continue;
347 		if (phys_addr >= md->phys_addr && phys_addr < end) {
348 			phys_addr += md->virt_addr - md->phys_addr;
349 			return (__force void __iomem *)(unsigned long)phys_addr;
350 		}
351 	}
352 	return NULL;
353 }
354 
355 static __initdata efi_config_table_type_t common_tables[] = {
356 	{ACPI_20_TABLE_GUID, "ACPI 2.0", &efi.acpi20},
357 	{ACPI_TABLE_GUID, "ACPI", &efi.acpi},
358 	{HCDP_TABLE_GUID, "HCDP", &efi.hcdp},
359 	{MPS_TABLE_GUID, "MPS", &efi.mps},
360 	{SAL_SYSTEM_TABLE_GUID, "SALsystab", &efi.sal_systab},
361 	{SMBIOS_TABLE_GUID, "SMBIOS", &efi.smbios},
362 	{SMBIOS3_TABLE_GUID, "SMBIOS 3.0", &efi.smbios3},
363 	{UGA_IO_PROTOCOL_GUID, "UGA", &efi.uga},
364 	{EFI_SYSTEM_RESOURCE_TABLE_GUID, "ESRT", &efi.esrt},
365 	{NULL_GUID, NULL, NULL},
366 };
367 
368 static __init int match_config_table(efi_guid_t *guid,
369 				     unsigned long table,
370 				     efi_config_table_type_t *table_types)
371 {
372 	int i;
373 
374 	if (table_types) {
375 		for (i = 0; efi_guidcmp(table_types[i].guid, NULL_GUID); i++) {
376 			if (!efi_guidcmp(*guid, table_types[i].guid)) {
377 				*(table_types[i].ptr) = table;
378 				pr_cont(" %s=0x%lx ",
379 					table_types[i].name, table);
380 				return 1;
381 			}
382 		}
383 	}
384 
385 	return 0;
386 }
387 
388 int __init efi_config_parse_tables(void *config_tables, int count, int sz,
389 				   efi_config_table_type_t *arch_tables)
390 {
391 	void *tablep;
392 	int i;
393 
394 	tablep = config_tables;
395 	pr_info("");
396 	for (i = 0; i < count; i++) {
397 		efi_guid_t guid;
398 		unsigned long table;
399 
400 		if (efi_enabled(EFI_64BIT)) {
401 			u64 table64;
402 			guid = ((efi_config_table_64_t *)tablep)->guid;
403 			table64 = ((efi_config_table_64_t *)tablep)->table;
404 			table = table64;
405 #ifndef CONFIG_64BIT
406 			if (table64 >> 32) {
407 				pr_cont("\n");
408 				pr_err("Table located above 4GB, disabling EFI.\n");
409 				return -EINVAL;
410 			}
411 #endif
412 		} else {
413 			guid = ((efi_config_table_32_t *)tablep)->guid;
414 			table = ((efi_config_table_32_t *)tablep)->table;
415 		}
416 
417 		if (!match_config_table(&guid, table, common_tables))
418 			match_config_table(&guid, table, arch_tables);
419 
420 		tablep += sz;
421 	}
422 	pr_cont("\n");
423 	set_bit(EFI_CONFIG_TABLES, &efi.flags);
424 	return 0;
425 }
426 
427 int __init efi_config_init(efi_config_table_type_t *arch_tables)
428 {
429 	void *config_tables;
430 	int sz, ret;
431 
432 	if (efi_enabled(EFI_64BIT))
433 		sz = sizeof(efi_config_table_64_t);
434 	else
435 		sz = sizeof(efi_config_table_32_t);
436 
437 	/*
438 	 * Let's see what config tables the firmware passed to us.
439 	 */
440 	config_tables = early_memremap(efi.systab->tables,
441 				       efi.systab->nr_tables * sz);
442 	if (config_tables == NULL) {
443 		pr_err("Could not map Configuration table!\n");
444 		return -ENOMEM;
445 	}
446 
447 	ret = efi_config_parse_tables(config_tables, efi.systab->nr_tables, sz,
448 				      arch_tables);
449 
450 	early_memunmap(config_tables, efi.systab->nr_tables * sz);
451 	return ret;
452 }
453 
454 #ifdef CONFIG_EFI_VARS_MODULE
455 static int __init efi_load_efivars(void)
456 {
457 	struct platform_device *pdev;
458 
459 	if (!efi_enabled(EFI_RUNTIME_SERVICES))
460 		return 0;
461 
462 	pdev = platform_device_register_simple("efivars", 0, NULL, 0);
463 	return IS_ERR(pdev) ? PTR_ERR(pdev) : 0;
464 }
465 device_initcall(efi_load_efivars);
466 #endif
467 
468 #ifdef CONFIG_EFI_PARAMS_FROM_FDT
469 
470 #define UEFI_PARAM(name, prop, field)			   \
471 	{						   \
472 		{ name },				   \
473 		{ prop },				   \
474 		offsetof(struct efi_fdt_params, field),    \
475 		FIELD_SIZEOF(struct efi_fdt_params, field) \
476 	}
477 
478 static __initdata struct {
479 	const char name[32];
480 	const char propname[32];
481 	int offset;
482 	int size;
483 } dt_params[] = {
484 	UEFI_PARAM("System Table", "linux,uefi-system-table", system_table),
485 	UEFI_PARAM("MemMap Address", "linux,uefi-mmap-start", mmap),
486 	UEFI_PARAM("MemMap Size", "linux,uefi-mmap-size", mmap_size),
487 	UEFI_PARAM("MemMap Desc. Size", "linux,uefi-mmap-desc-size", desc_size),
488 	UEFI_PARAM("MemMap Desc. Version", "linux,uefi-mmap-desc-ver", desc_ver)
489 };
490 
491 struct param_info {
492 	int verbose;
493 	int found;
494 	void *params;
495 };
496 
497 static int __init fdt_find_uefi_params(unsigned long node, const char *uname,
498 				       int depth, void *data)
499 {
500 	struct param_info *info = data;
501 	const void *prop;
502 	void *dest;
503 	u64 val;
504 	int i, len;
505 
506 	if (depth != 1 || strcmp(uname, "chosen") != 0)
507 		return 0;
508 
509 	for (i = 0; i < ARRAY_SIZE(dt_params); i++) {
510 		prop = of_get_flat_dt_prop(node, dt_params[i].propname, &len);
511 		if (!prop)
512 			return 0;
513 		dest = info->params + dt_params[i].offset;
514 		info->found++;
515 
516 		val = of_read_number(prop, len / sizeof(u32));
517 
518 		if (dt_params[i].size == sizeof(u32))
519 			*(u32 *)dest = val;
520 		else
521 			*(u64 *)dest = val;
522 
523 		if (info->verbose)
524 			pr_info("  %s: 0x%0*llx\n", dt_params[i].name,
525 				dt_params[i].size * 2, val);
526 	}
527 	return 1;
528 }
529 
530 int __init efi_get_fdt_params(struct efi_fdt_params *params, int verbose)
531 {
532 	struct param_info info;
533 	int ret;
534 
535 	pr_info("Getting EFI parameters from FDT:\n");
536 
537 	info.verbose = verbose;
538 	info.found = 0;
539 	info.params = params;
540 
541 	ret = of_scan_flat_dt(fdt_find_uefi_params, &info);
542 	if (!info.found)
543 		pr_info("UEFI not found.\n");
544 	else if (!ret)
545 		pr_err("Can't find '%s' in device tree!\n",
546 		       dt_params[info.found].name);
547 
548 	return ret;
549 }
550 #endif /* CONFIG_EFI_PARAMS_FROM_FDT */
551 
552 static __initdata char memory_type_name[][20] = {
553 	"Reserved",
554 	"Loader Code",
555 	"Loader Data",
556 	"Boot Code",
557 	"Boot Data",
558 	"Runtime Code",
559 	"Runtime Data",
560 	"Conventional Memory",
561 	"Unusable Memory",
562 	"ACPI Reclaim Memory",
563 	"ACPI Memory NVS",
564 	"Memory Mapped I/O",
565 	"MMIO Port Space",
566 	"PAL Code"
567 };
568 
569 char * __init efi_md_typeattr_format(char *buf, size_t size,
570 				     const efi_memory_desc_t *md)
571 {
572 	char *pos;
573 	int type_len;
574 	u64 attr;
575 
576 	pos = buf;
577 	if (md->type >= ARRAY_SIZE(memory_type_name))
578 		type_len = snprintf(pos, size, "[type=%u", md->type);
579 	else
580 		type_len = snprintf(pos, size, "[%-*s",
581 				    (int)(sizeof(memory_type_name[0]) - 1),
582 				    memory_type_name[md->type]);
583 	if (type_len >= size)
584 		return buf;
585 
586 	pos += type_len;
587 	size -= type_len;
588 
589 	attr = md->attribute;
590 	if (attr & ~(EFI_MEMORY_UC | EFI_MEMORY_WC | EFI_MEMORY_WT |
591 		     EFI_MEMORY_WB | EFI_MEMORY_UCE | EFI_MEMORY_WP |
592 		     EFI_MEMORY_RP | EFI_MEMORY_XP | EFI_MEMORY_RUNTIME))
593 		snprintf(pos, size, "|attr=0x%016llx]",
594 			 (unsigned long long)attr);
595 	else
596 		snprintf(pos, size, "|%3s|%2s|%2s|%2s|%3s|%2s|%2s|%2s|%2s]",
597 			 attr & EFI_MEMORY_RUNTIME ? "RUN" : "",
598 			 attr & EFI_MEMORY_XP      ? "XP"  : "",
599 			 attr & EFI_MEMORY_RP      ? "RP"  : "",
600 			 attr & EFI_MEMORY_WP      ? "WP"  : "",
601 			 attr & EFI_MEMORY_UCE     ? "UCE" : "",
602 			 attr & EFI_MEMORY_WB      ? "WB"  : "",
603 			 attr & EFI_MEMORY_WT      ? "WT"  : "",
604 			 attr & EFI_MEMORY_WC      ? "WC"  : "",
605 			 attr & EFI_MEMORY_UC      ? "UC"  : "");
606 	return buf;
607 }
608