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