aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/firmware
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/firmware')
-rw-r--r--drivers/firmware/efi/arm-init.c4
-rw-r--r--drivers/firmware/efi/arm-runtime.c2
-rw-r--r--drivers/firmware/efi/efi.c35
-rw-r--r--drivers/firmware/efi/libstub/arm-stub.c3
-rw-r--r--drivers/firmware/efi/libstub/fdt.c4
-rw-r--r--drivers/firmware/efi/memmap.c3
-rw-r--r--drivers/firmware/efi/runtime-wrappers.c2
7 files changed, 39 insertions, 14 deletions
diff --git a/drivers/firmware/efi/arm-init.c b/drivers/firmware/efi/arm-init.c
index 388a929baf95..1a6a77df8a5e 100644
--- a/drivers/firmware/efi/arm-init.c
+++ b/drivers/firmware/efi/arm-init.c
@@ -265,6 +265,10 @@ void __init efi_init(void)
265 (params.mmap & ~PAGE_MASK))); 265 (params.mmap & ~PAGE_MASK)));
266 266
267 init_screen_info(); 267 init_screen_info();
268
269 /* ARM does not permit early mappings to persist across paging_init() */
270 if (IS_ENABLED(CONFIG_ARM))
271 efi_memmap_unmap();
268} 272}
269 273
270static int __init register_gop_device(void) 274static int __init register_gop_device(void)
diff --git a/drivers/firmware/efi/arm-runtime.c b/drivers/firmware/efi/arm-runtime.c
index 922cfb813109..a00934d263c5 100644
--- a/drivers/firmware/efi/arm-runtime.c
+++ b/drivers/firmware/efi/arm-runtime.c
@@ -110,7 +110,7 @@ static int __init arm_enable_runtime_services(void)
110{ 110{
111 u64 mapsize; 111 u64 mapsize;
112 112
113 if (!efi_enabled(EFI_BOOT) || !efi_enabled(EFI_MEMMAP)) { 113 if (!efi_enabled(EFI_BOOT)) {
114 pr_info("EFI services will not be available.\n"); 114 pr_info("EFI services will not be available.\n");
115 return 0; 115 return 0;
116 } 116 }
diff --git a/drivers/firmware/efi/efi.c b/drivers/firmware/efi/efi.c
index 249eb70691b0..fad7c62cfc0e 100644
--- a/drivers/firmware/efi/efi.c
+++ b/drivers/firmware/efi/efi.c
@@ -592,7 +592,11 @@ int __init efi_config_parse_tables(void *config_tables, int count, int sz,
592 592
593 early_memunmap(tbl, sizeof(*tbl)); 593 early_memunmap(tbl, sizeof(*tbl));
594 } 594 }
595 return 0;
596}
595 597
598int __init efi_apply_persistent_mem_reservations(void)
599{
596 if (efi.mem_reserve != EFI_INVALID_TABLE_ADDR) { 600 if (efi.mem_reserve != EFI_INVALID_TABLE_ADDR) {
597 unsigned long prsv = efi.mem_reserve; 601 unsigned long prsv = efi.mem_reserve;
598 602
@@ -963,36 +967,43 @@ bool efi_is_table_address(unsigned long phys_addr)
963} 967}
964 968
965static DEFINE_SPINLOCK(efi_mem_reserve_persistent_lock); 969static DEFINE_SPINLOCK(efi_mem_reserve_persistent_lock);
970static struct linux_efi_memreserve *efi_memreserve_root __ro_after_init;
966 971
967int efi_mem_reserve_persistent(phys_addr_t addr, u64 size) 972int efi_mem_reserve_persistent(phys_addr_t addr, u64 size)
968{ 973{
969 struct linux_efi_memreserve *rsv, *parent; 974 struct linux_efi_memreserve *rsv;
970 975
971 if (efi.mem_reserve == EFI_INVALID_TABLE_ADDR) 976 if (!efi_memreserve_root)
972 return -ENODEV; 977 return -ENODEV;
973 978
974 rsv = kmalloc(sizeof(*rsv), GFP_KERNEL); 979 rsv = kmalloc(sizeof(*rsv), GFP_ATOMIC);
975 if (!rsv) 980 if (!rsv)
976 return -ENOMEM; 981 return -ENOMEM;
977 982
978 parent = memremap(efi.mem_reserve, sizeof(*rsv), MEMREMAP_WB);
979 if (!parent) {
980 kfree(rsv);
981 return -ENOMEM;
982 }
983
984 rsv->base = addr; 983 rsv->base = addr;
985 rsv->size = size; 984 rsv->size = size;
986 985
987 spin_lock(&efi_mem_reserve_persistent_lock); 986 spin_lock(&efi_mem_reserve_persistent_lock);
988 rsv->next = parent->next; 987 rsv->next = efi_memreserve_root->next;
989 parent->next = __pa(rsv); 988 efi_memreserve_root->next = __pa(rsv);
990 spin_unlock(&efi_mem_reserve_persistent_lock); 989 spin_unlock(&efi_mem_reserve_persistent_lock);
991 990
992 memunmap(parent); 991 return 0;
992}
993 993
994static int __init efi_memreserve_root_init(void)
995{
996 if (efi.mem_reserve == EFI_INVALID_TABLE_ADDR)
997 return -ENODEV;
998
999 efi_memreserve_root = memremap(efi.mem_reserve,
1000 sizeof(*efi_memreserve_root),
1001 MEMREMAP_WB);
1002 if (!efi_memreserve_root)
1003 return -ENOMEM;
994 return 0; 1004 return 0;
995} 1005}
1006early_initcall(efi_memreserve_root_init);
996 1007
997#ifdef CONFIG_KEXEC 1008#ifdef CONFIG_KEXEC
998static int update_efi_random_seed(struct notifier_block *nb, 1009static int update_efi_random_seed(struct notifier_block *nb,
diff --git a/drivers/firmware/efi/libstub/arm-stub.c b/drivers/firmware/efi/libstub/arm-stub.c
index 30ac0c975f8a..3d36142cf812 100644
--- a/drivers/firmware/efi/libstub/arm-stub.c
+++ b/drivers/firmware/efi/libstub/arm-stub.c
@@ -75,6 +75,9 @@ void install_memreserve_table(efi_system_table_t *sys_table_arg)
75 efi_guid_t memreserve_table_guid = LINUX_EFI_MEMRESERVE_TABLE_GUID; 75 efi_guid_t memreserve_table_guid = LINUX_EFI_MEMRESERVE_TABLE_GUID;
76 efi_status_t status; 76 efi_status_t status;
77 77
78 if (IS_ENABLED(CONFIG_ARM))
79 return;
80
78 status = efi_call_early(allocate_pool, EFI_LOADER_DATA, sizeof(*rsv), 81 status = efi_call_early(allocate_pool, EFI_LOADER_DATA, sizeof(*rsv),
79 (void **)&rsv); 82 (void **)&rsv);
80 if (status != EFI_SUCCESS) { 83 if (status != EFI_SUCCESS) {
diff --git a/drivers/firmware/efi/libstub/fdt.c b/drivers/firmware/efi/libstub/fdt.c
index 8830fa601e45..0c0d2312f4a8 100644
--- a/drivers/firmware/efi/libstub/fdt.c
+++ b/drivers/firmware/efi/libstub/fdt.c
@@ -158,6 +158,10 @@ static efi_status_t update_fdt(efi_system_table_t *sys_table, void *orig_fdt,
158 return efi_status; 158 return efi_status;
159 } 159 }
160 } 160 }
161
162 /* shrink the FDT back to its minimum size */
163 fdt_pack(fdt);
164
161 return EFI_SUCCESS; 165 return EFI_SUCCESS;
162 166
163fdt_set_fail: 167fdt_set_fail:
diff --git a/drivers/firmware/efi/memmap.c b/drivers/firmware/efi/memmap.c
index fa2904fb841f..38b686c67b17 100644
--- a/drivers/firmware/efi/memmap.c
+++ b/drivers/firmware/efi/memmap.c
@@ -118,6 +118,9 @@ int __init efi_memmap_init_early(struct efi_memory_map_data *data)
118 118
119void __init efi_memmap_unmap(void) 119void __init efi_memmap_unmap(void)
120{ 120{
121 if (!efi_enabled(EFI_MEMMAP))
122 return;
123
121 if (!efi.memmap.late) { 124 if (!efi.memmap.late) {
122 unsigned long size; 125 unsigned long size;
123 126
diff --git a/drivers/firmware/efi/runtime-wrappers.c b/drivers/firmware/efi/runtime-wrappers.c
index a19d845bdb06..8903b9ccfc2b 100644
--- a/drivers/firmware/efi/runtime-wrappers.c
+++ b/drivers/firmware/efi/runtime-wrappers.c
@@ -67,7 +67,7 @@ struct efi_runtime_work efi_rts_work;
67 } \ 67 } \
68 \ 68 \
69 init_completion(&efi_rts_work.efi_rts_comp); \ 69 init_completion(&efi_rts_work.efi_rts_comp); \
70 INIT_WORK_ONSTACK(&efi_rts_work.work, efi_call_rts); \ 70 INIT_WORK(&efi_rts_work.work, efi_call_rts); \
71 efi_rts_work.arg1 = _arg1; \ 71 efi_rts_work.arg1 = _arg1; \
72 efi_rts_work.arg2 = _arg2; \ 72 efi_rts_work.arg2 = _arg2; \
73 efi_rts_work.arg3 = _arg3; \ 73 efi_rts_work.arg3 = _arg3; \