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