forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-09 b22da3d8526a935aa31e086e63f60ff3246cb61c
kernel/drivers/firmware/efi/efi.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * efi.c - EFI subsystem
34 *
....@@ -9,8 +10,6 @@
910 * allowing the efivarfs to be mounted or the efivars module to be loaded.
1011 * The existance of /sys/firmware/efi may also be used by userspace to
1112 * determine that the system supports EFI.
12
- *
13
- * This file is released under the GPLv2.
1413 */
1514
1615 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
....@@ -18,10 +17,10 @@
1817 #include <linux/kobject.h>
1918 #include <linux/module.h>
2019 #include <linux/init.h>
20
+#include <linux/debugfs.h>
2121 #include <linux/device.h>
2222 #include <linux/efi.h>
2323 #include <linux/of.h>
24
-#include <linux/of_fdt.h>
2524 #include <linux/io.h>
2625 #include <linux/kexec.h>
2726 #include <linux/platform_device.h>
....@@ -31,55 +30,35 @@
3130 #include <linux/acpi.h>
3231 #include <linux/ucs2_string.h>
3332 #include <linux/memblock.h>
33
+#include <linux/security.h>
3434
3535 #include <asm/early_ioremap.h>
3636
3737 struct efi __read_mostly efi = {
38
- .mps = EFI_INVALID_TABLE_ADDR,
38
+ .runtime_supported_mask = EFI_RT_SUPPORTED_ALL,
3939 .acpi = EFI_INVALID_TABLE_ADDR,
4040 .acpi20 = EFI_INVALID_TABLE_ADDR,
4141 .smbios = EFI_INVALID_TABLE_ADDR,
4242 .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,
5143 .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
44
+ .tpm_log = EFI_INVALID_TABLE_ADDR,
45
+ .tpm_final_log = EFI_INVALID_TABLE_ADDR,
46
+#ifdef CONFIG_LOAD_UEFI_KEYS
47
+ .mokvar_table = EFI_INVALID_TABLE_ADDR,
48
+#endif
5649 };
5750 EXPORT_SYMBOL(efi);
5851
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
-};
52
+unsigned long __ro_after_init efi_rng_seed = EFI_INVALID_TABLE_ADDR;
53
+static unsigned long __initdata mem_reserve = EFI_INVALID_TABLE_ADDR;
54
+static unsigned long __initdata rt_prop = EFI_INVALID_TABLE_ADDR;
7755
7856 struct mm_struct efi_mm = {
7957 .mm_rb = RB_ROOT,
8058 .mm_users = ATOMIC_INIT(2),
8159 .mm_count = ATOMIC_INIT(1),
82
- .mmap_sem = __RWSEM_INITIALIZER(efi_mm.mmap_sem),
60
+ .write_protect_seq = SEQCNT_ZERO(efi_mm.write_protect_seq),
61
+ MMAP_LOCK_INITIALIZER(efi_mm)
8362 .page_table_lock = __SPIN_LOCK_UNLOCKED(efi_mm.page_table_lock),
8463 .mmlist = LIST_HEAD_INIT(efi_mm.mmlist),
8564 .cpu_bitmap = { [BITS_TO_LONGS(NR_CPUS)] = 0},
....@@ -87,7 +66,7 @@
8766
8867 struct workqueue_struct *efi_rts_wq;
8968
90
-static bool disable_runtime = IS_ENABLED(CONFIG_PREEMPT_RT_BASE);
69
+static bool disable_runtime = IS_ENABLED(CONFIG_PREEMPT_RT);
9170 static int __init setup_noefi(char *arg)
9271 {
9372 disable_runtime = true;
....@@ -98,6 +77,11 @@
9877 bool efi_runtime_disabled(void)
9978 {
10079 return disable_runtime;
80
+}
81
+
82
+bool __pure __efi_soft_reserve_enabled(void)
83
+{
84
+ return !efi_enabled(EFI_MEM_NO_SOFT_RESERVE);
10185 }
10286
10387 static int __init parse_efi_cmdline(char *str)
....@@ -115,6 +99,9 @@
11599
116100 if (parse_option_str(str, "runtime"))
117101 disable_runtime = false;
102
+
103
+ if (parse_option_str(str, "nosoftreserve"))
104
+ set_bit(EFI_MEM_NO_SOFT_RESERVE, &efi.flags);
118105
119106 return 0;
120107 }
....@@ -136,8 +123,6 @@
136123 if (!kobj || !buf)
137124 return -EINVAL;
138125
139
- if (efi.mps != EFI_INVALID_TABLE_ADDR)
140
- str += sprintf(str, "MPS=0x%lx\n", efi.mps);
141126 if (efi.acpi20 != EFI_INVALID_TABLE_ADDR)
142127 str += sprintf(str, "ACPI20=0x%lx\n", efi.acpi20);
143128 if (efi.acpi != EFI_INVALID_TABLE_ADDR)
....@@ -151,30 +136,14 @@
151136 str += sprintf(str, "SMBIOS3=0x%lx\n", efi.smbios3);
152137 if (efi.smbios != EFI_INVALID_TABLE_ADDR)
153138 str += sprintf(str, "SMBIOS=0x%lx\n", efi.smbios);
154
- if (efi.hcdp != EFI_INVALID_TABLE_ADDR)
155
- str += sprintf(str, "HCDP=0x%lx\n", efi.hcdp);
156
- if (efi.boot_info != EFI_INVALID_TABLE_ADDR)
157
- str += sprintf(str, "BOOTINFO=0x%lx\n", efi.boot_info);
158
- if (efi.uga != EFI_INVALID_TABLE_ADDR)
159
- str += sprintf(str, "UGA=0x%lx\n", efi.uga);
139
+
140
+ if (IS_ENABLED(CONFIG_IA64) || IS_ENABLED(CONFIG_X86))
141
+ str = efi_systab_show_arch(str);
160142
161143 return str - buf;
162144 }
163145
164146 static struct kobj_attribute efi_attr_systab = __ATTR_RO_MODE(systab, 0400);
165
-
166
-#define EFI_FIELD(var) efi.var
167
-
168
-#define EFI_ATTR_SHOW(name) \
169
-static ssize_t name##_show(struct kobject *kobj, \
170
- struct kobj_attribute *attr, char *buf) \
171
-{ \
172
- return sprintf(buf, "0x%lx\n", EFI_FIELD(name)); \
173
-}
174
-
175
-EFI_ATTR_SHOW(fw_vendor);
176
-EFI_ATTR_SHOW(runtime);
177
-EFI_ATTR_SHOW(config_table);
178147
179148 static ssize_t fw_platform_size_show(struct kobject *kobj,
180149 struct kobj_attribute *attr, char *buf)
....@@ -182,36 +151,24 @@
182151 return sprintf(buf, "%d\n", efi_enabled(EFI_64BIT) ? 64 : 32);
183152 }
184153
185
-static struct kobj_attribute efi_attr_fw_vendor = __ATTR_RO(fw_vendor);
186
-static struct kobj_attribute efi_attr_runtime = __ATTR_RO(runtime);
187
-static struct kobj_attribute efi_attr_config_table = __ATTR_RO(config_table);
154
+extern __weak struct kobj_attribute efi_attr_fw_vendor;
155
+extern __weak struct kobj_attribute efi_attr_runtime;
156
+extern __weak struct kobj_attribute efi_attr_config_table;
188157 static struct kobj_attribute efi_attr_fw_platform_size =
189158 __ATTR_RO(fw_platform_size);
190159
191160 static struct attribute *efi_subsys_attrs[] = {
192161 &efi_attr_systab.attr,
162
+ &efi_attr_fw_platform_size.attr,
193163 &efi_attr_fw_vendor.attr,
194164 &efi_attr_runtime.attr,
195165 &efi_attr_config_table.attr,
196
- &efi_attr_fw_platform_size.attr,
197166 NULL,
198167 };
199168
200
-static umode_t efi_attr_is_visible(struct kobject *kobj,
201
- struct attribute *attr, int n)
169
+umode_t __weak efi_attr_is_visible(struct kobject *kobj, struct attribute *attr,
170
+ int n)
202171 {
203
- if (attr == &efi_attr_fw_vendor.attr) {
204
- if (efi_enabled(EFI_PARAVIRT) ||
205
- efi.fw_vendor == EFI_INVALID_TABLE_ADDR)
206
- return 0;
207
- } else if (attr == &efi_attr_runtime.attr) {
208
- if (efi.runtime == EFI_INVALID_TABLE_ADDR)
209
- return 0;
210
- } else if (attr == &efi_attr_config_table.attr) {
211
- if (efi.config_table == EFI_INVALID_TABLE_ADDR)
212
- return 0;
213
- }
214
-
215172 return attr->mode;
216173 }
217174
....@@ -226,11 +183,13 @@
226183 static int generic_ops_register(void)
227184 {
228185 generic_ops.get_variable = efi.get_variable;
229
- generic_ops.set_variable = efi.set_variable;
230
- generic_ops.set_variable_nonblocking = efi.set_variable_nonblocking;
231186 generic_ops.get_next_variable = efi.get_next_variable;
232187 generic_ops.query_variable_store = efi_query_variable_store;
233188
189
+ if (efi_rt_services_supported(EFI_RT_SUPPORTED_SET_VARIABLE)) {
190
+ generic_ops.set_variable = efi.set_variable;
191
+ generic_ops.set_variable_nonblocking = efi.set_variable_nonblocking;
192
+ }
234193 return efivars_register(&generic_efivars, &generic_ops, efi_kobj);
235194 }
236195
....@@ -244,11 +203,16 @@
244203 static char efivar_ssdt[EFIVAR_SSDT_NAME_MAX] __initdata;
245204 static int __init efivar_ssdt_setup(char *str)
246205 {
206
+ int ret = security_locked_down(LOCKDOWN_ACPI_TABLES);
207
+
208
+ if (ret)
209
+ return ret;
210
+
247211 if (strlen(str) < sizeof(efivar_ssdt))
248212 memcpy(efivar_ssdt, str, strlen(str));
249213 else
250214 pr_warn("efivar_ssdt: name too long: %s\n", str);
251
- return 0;
215
+ return 1;
252216 }
253217 __setup("efivar_ssdt=", efivar_ssdt_setup);
254218
....@@ -313,7 +277,7 @@
313277 goto free_data;
314278 }
315279
316
- ret = acpi_load_table(data);
280
+ ret = acpi_load_table(data, NULL);
317281 if (ret) {
318282 pr_err("failed to load table: %d\n", ret);
319283 goto free_data;
....@@ -334,6 +298,59 @@
334298 static inline int efivar_ssdt_load(void) { return 0; }
335299 #endif
336300
301
+#ifdef CONFIG_DEBUG_FS
302
+
303
+#define EFI_DEBUGFS_MAX_BLOBS 32
304
+
305
+static struct debugfs_blob_wrapper debugfs_blob[EFI_DEBUGFS_MAX_BLOBS];
306
+
307
+static void __init efi_debugfs_init(void)
308
+{
309
+ struct dentry *efi_debugfs;
310
+ efi_memory_desc_t *md;
311
+ char name[32];
312
+ int type_count[EFI_BOOT_SERVICES_DATA + 1] = {};
313
+ int i = 0;
314
+
315
+ efi_debugfs = debugfs_create_dir("efi", NULL);
316
+ if (IS_ERR_OR_NULL(efi_debugfs))
317
+ return;
318
+
319
+ for_each_efi_memory_desc(md) {
320
+ switch (md->type) {
321
+ case EFI_BOOT_SERVICES_CODE:
322
+ snprintf(name, sizeof(name), "boot_services_code%d",
323
+ type_count[md->type]++);
324
+ break;
325
+ case EFI_BOOT_SERVICES_DATA:
326
+ snprintf(name, sizeof(name), "boot_services_data%d",
327
+ type_count[md->type]++);
328
+ break;
329
+ default:
330
+ continue;
331
+ }
332
+
333
+ if (i >= EFI_DEBUGFS_MAX_BLOBS) {
334
+ pr_warn("More then %d EFI boot service segments, only showing first %d in debugfs\n",
335
+ EFI_DEBUGFS_MAX_BLOBS, EFI_DEBUGFS_MAX_BLOBS);
336
+ break;
337
+ }
338
+
339
+ debugfs_blob[i].size = md->num_pages << EFI_PAGE_SHIFT;
340
+ debugfs_blob[i].data = memremap(md->phys_addr,
341
+ debugfs_blob[i].size,
342
+ MEMREMAP_WB);
343
+ if (!debugfs_blob[i].data)
344
+ continue;
345
+
346
+ debugfs_create_blob(name, 0400, efi_debugfs, &debugfs_blob[i]);
347
+ i++;
348
+ }
349
+}
350
+#else
351
+static inline void efi_debugfs_init(void) {}
352
+#endif
353
+
337354 /*
338355 * We register the efi subsystem with the firmware subsystem and the
339356 * efivars subsystem with the efi subsystem, if the system was booted with
....@@ -343,20 +360,29 @@
343360 {
344361 int error;
345362
363
+ if (!efi_enabled(EFI_RUNTIME_SERVICES))
364
+ efi.runtime_supported_mask = 0;
365
+
346366 if (!efi_enabled(EFI_BOOT))
347367 return 0;
348368
349
- /*
350
- * Since we process only one efi_runtime_service() at a time, an
351
- * ordered workqueue (which creates only one execution context)
352
- * should suffice all our needs.
353
- */
354
- efi_rts_wq = alloc_ordered_workqueue("efi_rts_wq", 0);
355
- if (!efi_rts_wq) {
356
- pr_err("Creating efi_rts_wq failed, EFI runtime services disabled.\n");
357
- clear_bit(EFI_RUNTIME_SERVICES, &efi.flags);
358
- return 0;
369
+ if (efi.runtime_supported_mask) {
370
+ /*
371
+ * Since we process only one efi_runtime_service() at a time, an
372
+ * ordered workqueue (which creates only one execution context)
373
+ * should suffice for all our needs.
374
+ */
375
+ efi_rts_wq = alloc_ordered_workqueue("efi_rts_wq", 0);
376
+ if (!efi_rts_wq) {
377
+ pr_err("Creating efi_rts_wq failed, EFI runtime services disabled.\n");
378
+ clear_bit(EFI_RUNTIME_SERVICES, &efi.flags);
379
+ efi.runtime_supported_mask = 0;
380
+ return 0;
381
+ }
359382 }
383
+
384
+ if (efi_rt_services_supported(EFI_RT_SUPPORTED_TIME_SERVICES))
385
+ platform_device_register_simple("rtc-efi", 0, NULL, 0);
360386
361387 /* We register the efi directory at /sys/firmware/efi */
362388 efi_kobj = kobject_create_and_add("efi", firmware_kobj);
....@@ -366,12 +392,14 @@
366392 return -ENOMEM;
367393 }
368394
369
- error = generic_ops_register();
370
- if (error)
371
- goto err_put;
372
-
373
- if (efi_enabled(EFI_RUNTIME_SERVICES))
395
+ if (efi_rt_services_supported(EFI_RT_SUPPORTED_GET_VARIABLE |
396
+ EFI_RT_SUPPORTED_GET_NEXT_VARIABLE_NAME)) {
397
+ error = generic_ops_register();
398
+ if (error)
399
+ goto err_put;
374400 efivar_ssdt_load();
401
+ platform_device_register_simple("efivars", 0, NULL, 0);
402
+ }
375403
376404 error = sysfs_create_group(efi_kobj, &efi_subsys_attr_group);
377405 if (error) {
....@@ -391,12 +419,17 @@
391419 goto err_remove_group;
392420 }
393421
422
+ if (efi_enabled(EFI_DBG) && efi_enabled(EFI_PRESERVE_BS_REGIONS))
423
+ efi_debugfs_init();
424
+
394425 return 0;
395426
396427 err_remove_group:
397428 sysfs_remove_group(efi_kobj, &efi_subsys_attr_group);
398429 err_unregister:
399
- generic_ops_unregister();
430
+ if (efi_rt_services_supported(EFI_RT_SUPPORTED_GET_VARIABLE |
431
+ EFI_RT_SUPPORTED_GET_NEXT_VARIABLE_NAME))
432
+ generic_ops_unregister();
400433 err_put:
401434 kobject_put(efi_kobj);
402435 destroy_workqueue(efi_rts_wq);
....@@ -478,98 +511,99 @@
478511 efi_arch_mem_reserve(addr, size);
479512 }
480513
481
-static __initdata efi_config_table_type_t common_tables[] = {
482
- {ACPI_20_TABLE_GUID, "ACPI 2.0", &efi.acpi20},
483
- {ACPI_TABLE_GUID, "ACPI", &efi.acpi},
484
- {HCDP_TABLE_GUID, "HCDP", &efi.hcdp},
485
- {MPS_TABLE_GUID, "MPS", &efi.mps},
486
- {SAL_SYSTEM_TABLE_GUID, "SALsystab", &efi.sal_systab},
487
- {SMBIOS_TABLE_GUID, "SMBIOS", &efi.smbios},
488
- {SMBIOS3_TABLE_GUID, "SMBIOS 3.0", &efi.smbios3},
489
- {UGA_IO_PROTOCOL_GUID, "UGA", &efi.uga},
490
- {EFI_SYSTEM_RESOURCE_TABLE_GUID, "ESRT", &efi.esrt},
491
- {EFI_PROPERTIES_TABLE_GUID, "PROP", &efi.properties_table},
492
- {EFI_MEMORY_ATTRIBUTES_TABLE_GUID, "MEMATTR", &efi.mem_attr_table},
493
- {LINUX_EFI_RANDOM_SEED_TABLE_GUID, "RNG", &efi.rng_seed},
494
- {LINUX_EFI_TPM_EVENT_LOG_GUID, "TPMEventLog", &efi.tpm_log},
495
- {NULL_GUID, NULL, NULL},
514
+static const efi_config_table_type_t common_tables[] __initconst = {
515
+ {ACPI_20_TABLE_GUID, &efi.acpi20, "ACPI 2.0" },
516
+ {ACPI_TABLE_GUID, &efi.acpi, "ACPI" },
517
+ {SMBIOS_TABLE_GUID, &efi.smbios, "SMBIOS" },
518
+ {SMBIOS3_TABLE_GUID, &efi.smbios3, "SMBIOS 3.0" },
519
+ {EFI_SYSTEM_RESOURCE_TABLE_GUID, &efi.esrt, "ESRT" },
520
+ {EFI_MEMORY_ATTRIBUTES_TABLE_GUID, &efi_mem_attr_table, "MEMATTR" },
521
+ {LINUX_EFI_RANDOM_SEED_TABLE_GUID, &efi_rng_seed, "RNG" },
522
+ {LINUX_EFI_TPM_EVENT_LOG_GUID, &efi.tpm_log, "TPMEventLog" },
523
+ {LINUX_EFI_TPM_FINAL_LOG_GUID, &efi.tpm_final_log, "TPMFinalLog" },
524
+ {LINUX_EFI_MEMRESERVE_TABLE_GUID, &mem_reserve, "MEMRESERVE" },
525
+ {EFI_RT_PROPERTIES_TABLE_GUID, &rt_prop, "RTPROP" },
526
+#ifdef CONFIG_EFI_RCI2_TABLE
527
+ {DELLEMC_EFI_RCI2_TABLE_GUID, &rci2_table_phys },
528
+#endif
529
+#ifdef CONFIG_LOAD_UEFI_KEYS
530
+ {LINUX_EFI_MOK_VARIABLE_TABLE_GUID, &efi.mokvar_table, "MOKvar" },
531
+#endif
532
+ {},
496533 };
497534
498
-static __init int match_config_table(efi_guid_t *guid,
535
+static __init int match_config_table(const efi_guid_t *guid,
499536 unsigned long table,
500
- efi_config_table_type_t *table_types)
537
+ const efi_config_table_type_t *table_types)
501538 {
502539 int i;
503540
504
- if (table_types) {
505
- for (i = 0; efi_guidcmp(table_types[i].guid, NULL_GUID); i++) {
506
- if (!efi_guidcmp(*guid, table_types[i].guid)) {
507
- *(table_types[i].ptr) = table;
508
- if (table_types[i].name)
509
- pr_cont(" %s=0x%lx ",
510
- table_types[i].name, table);
511
- return 1;
512
- }
541
+ for (i = 0; efi_guidcmp(table_types[i].guid, NULL_GUID); i++) {
542
+ if (!efi_guidcmp(*guid, table_types[i].guid)) {
543
+ *(table_types[i].ptr) = table;
544
+ if (table_types[i].name[0])
545
+ pr_cont("%s=0x%lx ",
546
+ table_types[i].name, table);
547
+ return 1;
513548 }
514549 }
515550
516551 return 0;
517552 }
518553
519
-int __init efi_config_parse_tables(void *config_tables, int count, int sz,
520
- efi_config_table_type_t *arch_tables)
554
+int __init efi_config_parse_tables(const efi_config_table_t *config_tables,
555
+ int count,
556
+ const efi_config_table_type_t *arch_tables)
521557 {
522
- void *tablep;
558
+ const efi_config_table_64_t *tbl64 = (void *)config_tables;
559
+ const efi_config_table_32_t *tbl32 = (void *)config_tables;
560
+ const efi_guid_t *guid;
561
+ unsigned long table;
523562 int i;
524563
525
- tablep = config_tables;
526564 pr_info("");
527565 for (i = 0; i < count; i++) {
528
- efi_guid_t guid;
529
- unsigned long table;
566
+ if (!IS_ENABLED(CONFIG_X86)) {
567
+ guid = &config_tables[i].guid;
568
+ table = (unsigned long)config_tables[i].table;
569
+ } else if (efi_enabled(EFI_64BIT)) {
570
+ guid = &tbl64[i].guid;
571
+ table = tbl64[i].table;
530572
531
- if (efi_enabled(EFI_64BIT)) {
532
- u64 table64;
533
- guid = ((efi_config_table_64_t *)tablep)->guid;
534
- table64 = ((efi_config_table_64_t *)tablep)->table;
535
- table = table64;
536
-#ifndef CONFIG_64BIT
537
- if (table64 >> 32) {
573
+ if (IS_ENABLED(CONFIG_X86_32) &&
574
+ tbl64[i].table > U32_MAX) {
538575 pr_cont("\n");
539576 pr_err("Table located above 4GB, disabling EFI.\n");
540577 return -EINVAL;
541578 }
542
-#endif
543579 } else {
544
- guid = ((efi_config_table_32_t *)tablep)->guid;
545
- table = ((efi_config_table_32_t *)tablep)->table;
580
+ guid = &tbl32[i].guid;
581
+ table = tbl32[i].table;
546582 }
547583
548
- if (!match_config_table(&guid, table, common_tables))
549
- match_config_table(&guid, table, arch_tables);
550
-
551
- tablep += sz;
584
+ if (!match_config_table(guid, table, common_tables) && arch_tables)
585
+ match_config_table(guid, table, arch_tables);
552586 }
553587 pr_cont("\n");
554588 set_bit(EFI_CONFIG_TABLES, &efi.flags);
555589
556
- if (efi.rng_seed != EFI_INVALID_TABLE_ADDR) {
590
+ if (efi_rng_seed != EFI_INVALID_TABLE_ADDR) {
557591 struct linux_efi_random_seed *seed;
558592 u32 size = 0;
559593
560
- seed = early_memremap(efi.rng_seed, sizeof(*seed));
594
+ seed = early_memremap(efi_rng_seed, sizeof(*seed));
561595 if (seed != NULL) {
562
- size = seed->size;
596
+ size = min(seed->size, EFI_RANDOM_SEED_SIZE);
563597 early_memunmap(seed, sizeof(*seed));
564598 } else {
565599 pr_err("Could not map UEFI random seed!\n");
566600 }
567601 if (size > 0) {
568
- seed = early_memremap(efi.rng_seed,
602
+ seed = early_memremap(efi_rng_seed,
569603 sizeof(*seed) + size);
570604 if (seed != NULL) {
571605 pr_notice("seeding entropy pool\n");
572
- add_device_randomness(seed->bits, seed->size);
606
+ add_bootloader_randomness(seed->bits, size);
573607 early_memunmap(seed, sizeof(*seed) + size);
574608 } else {
575609 pr_err("Could not map UEFI random seed!\n");
....@@ -582,202 +616,122 @@
582616
583617 efi_tpm_eventlog_init();
584618
585
- /* Parse the EFI Properties table if it exists */
586
- if (efi.properties_table != EFI_INVALID_TABLE_ADDR) {
587
- efi_properties_table_t *tbl;
619
+ if (mem_reserve != EFI_INVALID_TABLE_ADDR) {
620
+ unsigned long prsv = mem_reserve;
588621
589
- tbl = early_memremap(efi.properties_table, sizeof(*tbl));
590
- if (tbl == NULL) {
591
- pr_err("Could not map Properties table!\n");
592
- return -ENOMEM;
622
+ while (prsv) {
623
+ struct linux_efi_memreserve *rsv;
624
+ u8 *p;
625
+
626
+ /*
627
+ * Just map a full page: that is what we will get
628
+ * anyway, and it permits us to map the entire entry
629
+ * before knowing its size.
630
+ */
631
+ p = early_memremap(ALIGN_DOWN(prsv, PAGE_SIZE),
632
+ PAGE_SIZE);
633
+ if (p == NULL) {
634
+ pr_err("Could not map UEFI memreserve entry!\n");
635
+ return -ENOMEM;
636
+ }
637
+
638
+ rsv = (void *)(p + prsv % PAGE_SIZE);
639
+
640
+ /* reserve the entry itself */
641
+ memblock_reserve(prsv,
642
+ struct_size(rsv, entry, rsv->size));
643
+
644
+ for (i = 0; i < atomic_read(&rsv->count); i++) {
645
+ memblock_reserve(rsv->entry[i].base,
646
+ rsv->entry[i].size);
647
+ }
648
+
649
+ prsv = rsv->next;
650
+ early_memunmap(p, PAGE_SIZE);
593651 }
652
+ }
594653
595
- if (tbl->memory_protection_attribute &
596
- EFI_PROPERTIES_RUNTIME_MEMORY_PROTECTION_NON_EXECUTABLE_PE_DATA)
597
- set_bit(EFI_NX_PE_DATA, &efi.flags);
654
+ if (rt_prop != EFI_INVALID_TABLE_ADDR) {
655
+ efi_rt_properties_table_t *tbl;
598656
599
- early_memunmap(tbl, sizeof(*tbl));
657
+ tbl = early_memremap(rt_prop, sizeof(*tbl));
658
+ if (tbl) {
659
+ efi.runtime_supported_mask &= tbl->runtime_services_supported;
660
+ early_memunmap(tbl, sizeof(*tbl));
661
+ }
600662 }
601663
602664 return 0;
603665 }
604666
605
-int __init efi_config_init(efi_config_table_type_t *arch_tables)
667
+int __init efi_systab_check_header(const efi_table_hdr_t *systab_hdr,
668
+ int min_major_version)
606669 {
607
- void *config_tables;
608
- int sz, ret;
609
-
610
- if (efi_enabled(EFI_64BIT))
611
- sz = sizeof(efi_config_table_64_t);
612
- else
613
- sz = sizeof(efi_config_table_32_t);
614
-
615
- /*
616
- * Let's see what config tables the firmware passed to us.
617
- */
618
- config_tables = early_memremap(efi.systab->tables,
619
- efi.systab->nr_tables * sz);
620
- if (config_tables == NULL) {
621
- pr_err("Could not map Configuration table!\n");
622
- return -ENOMEM;
670
+ if (systab_hdr->signature != EFI_SYSTEM_TABLE_SIGNATURE) {
671
+ pr_err("System table signature incorrect!\n");
672
+ return -EINVAL;
623673 }
624674
625
- ret = efi_config_parse_tables(config_tables, efi.systab->nr_tables, sz,
626
- arch_tables);
675
+ if ((systab_hdr->revision >> 16) < min_major_version)
676
+ pr_err("Warning: System table version %d.%02d, expected %d.00 or greater!\n",
677
+ systab_hdr->revision >> 16,
678
+ systab_hdr->revision & 0xffff,
679
+ min_major_version);
627680
628
- early_memunmap(config_tables, efi.systab->nr_tables * sz);
681
+ return 0;
682
+}
683
+
684
+#ifndef CONFIG_IA64
685
+static const efi_char16_t *__init map_fw_vendor(unsigned long fw_vendor,
686
+ size_t size)
687
+{
688
+ const efi_char16_t *ret;
689
+
690
+ ret = early_memremap_ro(fw_vendor, size);
691
+ if (!ret)
692
+ pr_err("Could not map the firmware vendor!\n");
629693 return ret;
630694 }
631695
632
-#ifdef CONFIG_EFI_VARS_MODULE
633
-static int __init efi_load_efivars(void)
696
+static void __init unmap_fw_vendor(const void *fw_vendor, size_t size)
634697 {
635
- struct platform_device *pdev;
636
-
637
- if (!efi_enabled(EFI_RUNTIME_SERVICES))
638
- return 0;
639
-
640
- pdev = platform_device_register_simple("efivars", 0, NULL, 0);
641
- return PTR_ERR_OR_ZERO(pdev);
698
+ early_memunmap((void *)fw_vendor, size);
642699 }
643
-device_initcall(efi_load_efivars);
700
+#else
701
+#define map_fw_vendor(p, s) __va(p)
702
+#define unmap_fw_vendor(v, s)
644703 #endif
645704
646
-#ifdef CONFIG_EFI_PARAMS_FROM_FDT
705
+void __init efi_systab_report_header(const efi_table_hdr_t *systab_hdr,
706
+ unsigned long fw_vendor)
707
+{
708
+ char vendor[100] = "unknown";
709
+ const efi_char16_t *c16;
710
+ size_t i;
647711
648
-#define UEFI_PARAM(name, prop, field) \
649
- { \
650
- { name }, \
651
- { prop }, \
652
- offsetof(struct efi_fdt_params, field), \
653
- FIELD_SIZEOF(struct efi_fdt_params, field) \
712
+ c16 = map_fw_vendor(fw_vendor, sizeof(vendor) * sizeof(efi_char16_t));
713
+ if (c16) {
714
+ for (i = 0; i < sizeof(vendor) - 1 && c16[i]; ++i)
715
+ vendor[i] = c16[i];
716
+ vendor[i] = '\0';
717
+
718
+ unmap_fw_vendor(c16, sizeof(vendor) * sizeof(efi_char16_t));
654719 }
655720
656
-struct params {
657
- const char name[32];
658
- const char propname[32];
659
- int offset;
660
- int size;
661
-};
721
+ pr_info("EFI v%u.%.02u by %s\n",
722
+ systab_hdr->revision >> 16,
723
+ systab_hdr->revision & 0xffff,
724
+ vendor);
662725
663
-static __initdata struct params fdt_params[] = {
664
- UEFI_PARAM("System Table", "linux,uefi-system-table", system_table),
665
- UEFI_PARAM("MemMap Address", "linux,uefi-mmap-start", mmap),
666
- UEFI_PARAM("MemMap Size", "linux,uefi-mmap-size", mmap_size),
667
- UEFI_PARAM("MemMap Desc. Size", "linux,uefi-mmap-desc-size", desc_size),
668
- UEFI_PARAM("MemMap Desc. Version", "linux,uefi-mmap-desc-ver", desc_ver)
669
-};
670
-
671
-static __initdata struct params xen_fdt_params[] = {
672
- UEFI_PARAM("System Table", "xen,uefi-system-table", system_table),
673
- UEFI_PARAM("MemMap Address", "xen,uefi-mmap-start", mmap),
674
- UEFI_PARAM("MemMap Size", "xen,uefi-mmap-size", mmap_size),
675
- UEFI_PARAM("MemMap Desc. Size", "xen,uefi-mmap-desc-size", desc_size),
676
- UEFI_PARAM("MemMap Desc. Version", "xen,uefi-mmap-desc-ver", desc_ver)
677
-};
678
-
679
-#define EFI_FDT_PARAMS_SIZE ARRAY_SIZE(fdt_params)
680
-
681
-static __initdata struct {
682
- const char *uname;
683
- const char *subnode;
684
- struct params *params;
685
-} dt_params[] = {
686
- { "hypervisor", "uefi", xen_fdt_params },
687
- { "chosen", NULL, fdt_params },
688
-};
689
-
690
-struct param_info {
691
- int found;
692
- void *params;
693
- const char *missing;
694
-};
695
-
696
-static int __init __find_uefi_params(unsigned long node,
697
- struct param_info *info,
698
- struct params *params)
699
-{
700
- const void *prop;
701
- void *dest;
702
- u64 val;
703
- int i, len;
704
-
705
- for (i = 0; i < EFI_FDT_PARAMS_SIZE; i++) {
706
- prop = of_get_flat_dt_prop(node, params[i].propname, &len);
707
- if (!prop) {
708
- info->missing = params[i].name;
709
- return 0;
710
- }
711
-
712
- dest = info->params + params[i].offset;
713
- info->found++;
714
-
715
- val = of_read_number(prop, len / sizeof(u32));
716
-
717
- if (params[i].size == sizeof(u32))
718
- *(u32 *)dest = val;
719
- else
720
- *(u64 *)dest = val;
721
-
722
- if (efi_enabled(EFI_DBG))
723
- pr_info(" %s: 0x%0*llx\n", params[i].name,
724
- params[i].size * 2, val);
726
+ if (IS_ENABLED(CONFIG_X86_64) &&
727
+ systab_hdr->revision > EFI_1_10_SYSTEM_TABLE_REVISION &&
728
+ !strcmp(vendor, "Apple")) {
729
+ pr_info("Apple Mac detected, using EFI v1.10 runtime services only\n");
730
+ efi.runtime_version = EFI_1_10_SYSTEM_TABLE_REVISION;
725731 }
726
-
727
- return 1;
728732 }
729733
730
-static int __init fdt_find_uefi_params(unsigned long node, const char *uname,
731
- int depth, void *data)
732
-{
733
- struct param_info *info = data;
734
- int i;
735
-
736
- for (i = 0; i < ARRAY_SIZE(dt_params); i++) {
737
- const char *subnode = dt_params[i].subnode;
738
-
739
- if (depth != 1 || strcmp(uname, dt_params[i].uname) != 0) {
740
- info->missing = dt_params[i].params[0].name;
741
- continue;
742
- }
743
-
744
- if (subnode) {
745
- int err = of_get_flat_dt_subnode_by_name(node, subnode);
746
-
747
- if (err < 0)
748
- return 0;
749
-
750
- node = err;
751
- }
752
-
753
- return __find_uefi_params(node, info, dt_params[i].params);
754
- }
755
-
756
- return 0;
757
-}
758
-
759
-int __init efi_get_fdt_params(struct efi_fdt_params *params)
760
-{
761
- struct param_info info;
762
- int ret;
763
-
764
- pr_info("Getting EFI parameters from FDT:\n");
765
-
766
- info.found = 0;
767
- info.params = params;
768
-
769
- ret = of_scan_flat_dt(fdt_find_uefi_params, &info);
770
- if (!info.found)
771
- pr_info("UEFI not found.\n");
772
- else if (!ret)
773
- pr_err("Can't find '%s' in device tree!\n",
774
- info.missing);
775
-
776
- return ret;
777
-}
778
-#endif /* CONFIG_EFI_PARAMS_FROM_FDT */
779
-
780
-static __initdata char memory_type_name[][20] = {
734
+static __initdata char memory_type_name[][13] = {
781735 "Reserved",
782736 "Loader Code",
783737 "Loader Data",
....@@ -785,14 +739,14 @@
785739 "Boot Data",
786740 "Runtime Code",
787741 "Runtime Data",
788
- "Conventional Memory",
789
- "Unusable Memory",
790
- "ACPI Reclaim Memory",
791
- "ACPI Memory NVS",
792
- "Memory Mapped I/O",
793
- "MMIO Port Space",
742
+ "Conventional",
743
+ "Unusable",
744
+ "ACPI Reclaim",
745
+ "ACPI Mem NVS",
746
+ "MMIO",
747
+ "MMIO Port",
794748 "PAL Code",
795
- "Persistent Memory",
749
+ "Persistent",
796750 };
797751
798752 char * __init efi_md_typeattr_format(char *buf, size_t size,
....@@ -819,25 +773,27 @@
819773 if (attr & ~(EFI_MEMORY_UC | EFI_MEMORY_WC | EFI_MEMORY_WT |
820774 EFI_MEMORY_WB | EFI_MEMORY_UCE | EFI_MEMORY_RO |
821775 EFI_MEMORY_WP | EFI_MEMORY_RP | EFI_MEMORY_XP |
822
- EFI_MEMORY_NV |
776
+ EFI_MEMORY_NV | EFI_MEMORY_SP | EFI_MEMORY_CPU_CRYPTO |
823777 EFI_MEMORY_RUNTIME | EFI_MEMORY_MORE_RELIABLE))
824778 snprintf(pos, size, "|attr=0x%016llx]",
825779 (unsigned long long)attr);
826780 else
827781 snprintf(pos, size,
828
- "|%3s|%2s|%2s|%2s|%2s|%2s|%2s|%3s|%2s|%2s|%2s|%2s]",
829
- attr & EFI_MEMORY_RUNTIME ? "RUN" : "",
830
- attr & EFI_MEMORY_MORE_RELIABLE ? "MR" : "",
831
- attr & EFI_MEMORY_NV ? "NV" : "",
832
- attr & EFI_MEMORY_XP ? "XP" : "",
833
- attr & EFI_MEMORY_RP ? "RP" : "",
834
- attr & EFI_MEMORY_WP ? "WP" : "",
835
- attr & EFI_MEMORY_RO ? "RO" : "",
836
- attr & EFI_MEMORY_UCE ? "UCE" : "",
837
- attr & EFI_MEMORY_WB ? "WB" : "",
838
- attr & EFI_MEMORY_WT ? "WT" : "",
839
- attr & EFI_MEMORY_WC ? "WC" : "",
840
- attr & EFI_MEMORY_UC ? "UC" : "");
782
+ "|%3s|%2s|%2s|%2s|%2s|%2s|%2s|%2s|%2s|%3s|%2s|%2s|%2s|%2s]",
783
+ attr & EFI_MEMORY_RUNTIME ? "RUN" : "",
784
+ attr & EFI_MEMORY_MORE_RELIABLE ? "MR" : "",
785
+ attr & EFI_MEMORY_CPU_CRYPTO ? "CC" : "",
786
+ attr & EFI_MEMORY_SP ? "SP" : "",
787
+ attr & EFI_MEMORY_NV ? "NV" : "",
788
+ attr & EFI_MEMORY_XP ? "XP" : "",
789
+ attr & EFI_MEMORY_RP ? "RP" : "",
790
+ attr & EFI_MEMORY_WP ? "WP" : "",
791
+ attr & EFI_MEMORY_RO ? "RO" : "",
792
+ attr & EFI_MEMORY_UCE ? "UCE" : "",
793
+ attr & EFI_MEMORY_WB ? "WB" : "",
794
+ attr & EFI_MEMORY_WT ? "WT" : "",
795
+ attr & EFI_MEMORY_WC ? "WC" : "",
796
+ attr & EFI_MEMORY_UC ? "UC" : "");
841797 return buf;
842798 }
843799
....@@ -876,7 +832,7 @@
876832 *
877833 * Search in the EFI memory map for the region covering @phys_addr.
878834 * Returns the EFI memory type if the region was found in the memory
879
- * map, EFI_RESERVED_TYPE (zero) otherwise.
835
+ * map, -EINVAL otherwise.
880836 */
881837 int efi_mem_type(unsigned long phys_addr)
882838 {
....@@ -931,19 +887,120 @@
931887 return err;
932888 }
933889
934
-bool efi_is_table_address(unsigned long phys_addr)
890
+static DEFINE_SPINLOCK(efi_mem_reserve_persistent_lock);
891
+static struct linux_efi_memreserve *efi_memreserve_root __ro_after_init;
892
+
893
+static int __init efi_memreserve_map_root(void)
935894 {
936
- unsigned int i;
895
+ if (mem_reserve == EFI_INVALID_TABLE_ADDR)
896
+ return -ENODEV;
937897
938
- if (phys_addr == EFI_INVALID_TABLE_ADDR)
939
- return false;
940
-
941
- for (i = 0; i < ARRAY_SIZE(efi_tables); i++)
942
- if (*(efi_tables[i]) == phys_addr)
943
- return true;
944
-
945
- return false;
898
+ efi_memreserve_root = memremap(mem_reserve,
899
+ sizeof(*efi_memreserve_root),
900
+ MEMREMAP_WB);
901
+ if (WARN_ON_ONCE(!efi_memreserve_root))
902
+ return -ENOMEM;
903
+ return 0;
946904 }
905
+
906
+static int efi_mem_reserve_iomem(phys_addr_t addr, u64 size)
907
+{
908
+ struct resource *res, *parent;
909
+ int ret;
910
+
911
+ res = kzalloc(sizeof(struct resource), GFP_ATOMIC);
912
+ if (!res)
913
+ return -ENOMEM;
914
+
915
+ res->name = "reserved";
916
+ res->flags = IORESOURCE_MEM;
917
+ res->start = addr;
918
+ res->end = addr + size - 1;
919
+
920
+ /* we expect a conflict with a 'System RAM' region */
921
+ parent = request_resource_conflict(&iomem_resource, res);
922
+ ret = parent ? request_resource(parent, res) : 0;
923
+
924
+ /*
925
+ * Given that efi_mem_reserve_iomem() can be called at any
926
+ * time, only call memblock_reserve() if the architecture
927
+ * keeps the infrastructure around.
928
+ */
929
+ if (IS_ENABLED(CONFIG_ARCH_KEEP_MEMBLOCK) && !ret)
930
+ memblock_reserve(addr, size);
931
+
932
+ return ret;
933
+}
934
+
935
+int __ref efi_mem_reserve_persistent(phys_addr_t addr, u64 size)
936
+{
937
+ struct linux_efi_memreserve *rsv;
938
+ unsigned long prsv;
939
+ int rc, index;
940
+
941
+ if (efi_memreserve_root == (void *)ULONG_MAX)
942
+ return -ENODEV;
943
+
944
+ if (!efi_memreserve_root) {
945
+ rc = efi_memreserve_map_root();
946
+ if (rc)
947
+ return rc;
948
+ }
949
+
950
+ /* first try to find a slot in an existing linked list entry */
951
+ for (prsv = efi_memreserve_root->next; prsv; ) {
952
+ rsv = memremap(prsv, sizeof(*rsv), MEMREMAP_WB);
953
+ index = atomic_fetch_add_unless(&rsv->count, 1, rsv->size);
954
+ if (index < rsv->size) {
955
+ rsv->entry[index].base = addr;
956
+ rsv->entry[index].size = size;
957
+
958
+ memunmap(rsv);
959
+ return efi_mem_reserve_iomem(addr, size);
960
+ }
961
+ prsv = rsv->next;
962
+ memunmap(rsv);
963
+ }
964
+
965
+ /* no slot found - allocate a new linked list entry */
966
+ rsv = (struct linux_efi_memreserve *)__get_free_page(GFP_ATOMIC);
967
+ if (!rsv)
968
+ return -ENOMEM;
969
+
970
+ rc = efi_mem_reserve_iomem(__pa(rsv), SZ_4K);
971
+ if (rc) {
972
+ free_page((unsigned long)rsv);
973
+ return rc;
974
+ }
975
+
976
+ /*
977
+ * The memremap() call above assumes that a linux_efi_memreserve entry
978
+ * never crosses a page boundary, so let's ensure that this remains true
979
+ * even when kexec'ing a 4k pages kernel from a >4k pages kernel, by
980
+ * using SZ_4K explicitly in the size calculation below.
981
+ */
982
+ rsv->size = EFI_MEMRESERVE_COUNT(SZ_4K);
983
+ atomic_set(&rsv->count, 1);
984
+ rsv->entry[0].base = addr;
985
+ rsv->entry[0].size = size;
986
+
987
+ spin_lock(&efi_mem_reserve_persistent_lock);
988
+ rsv->next = efi_memreserve_root->next;
989
+ efi_memreserve_root->next = __pa(rsv);
990
+ spin_unlock(&efi_mem_reserve_persistent_lock);
991
+
992
+ return efi_mem_reserve_iomem(addr, size);
993
+}
994
+
995
+static int __init efi_memreserve_root_init(void)
996
+{
997
+ if (efi_memreserve_root)
998
+ return 0;
999
+ if (efi_memreserve_map_root())
1000
+ efi_memreserve_root = (void *)ULONG_MAX;
1001
+ return 0;
1002
+}
1003
+early_initcall(efi_memreserve_root_init);
9471004
9481005 #ifdef CONFIG_KEXEC
9491006 static int update_efi_random_seed(struct notifier_block *nb,
....@@ -955,7 +1012,7 @@
9551012 if (!kexec_in_progress)
9561013 return NOTIFY_DONE;
9571014
958
- seed = memremap(efi.rng_seed, sizeof(*seed), MEMREMAP_WB);
1015
+ seed = memremap(efi_rng_seed, sizeof(*seed), MEMREMAP_WB);
9591016 if (seed != NULL) {
9601017 size = min(seed->size, EFI_RANDOM_SEED_SIZE);
9611018 memunmap(seed);
....@@ -963,7 +1020,7 @@
9631020 pr_err("Could not map UEFI random seed!\n");
9641021 }
9651022 if (size > 0) {
966
- seed = memremap(efi.rng_seed, sizeof(*seed) + size,
1023
+ seed = memremap(efi_rng_seed, sizeof(*seed) + size,
9671024 MEMREMAP_WB);
9681025 if (seed != NULL) {
9691026 seed->size = size;
....@@ -980,9 +1037,9 @@
9801037 .notifier_call = update_efi_random_seed,
9811038 };
9821039
983
-static int register_update_efi_random_seed(void)
1040
+static int __init register_update_efi_random_seed(void)
9841041 {
985
- if (efi.rng_seed == EFI_INVALID_TABLE_ADDR)
1042
+ if (efi_rng_seed == EFI_INVALID_TABLE_ADDR)
9861043 return 0;
9871044 return register_reboot_notifier(&efi_random_seed_nb);
9881045 }