diff options
Diffstat (limited to 'drivers/firmware')
-rw-r--r-- | drivers/firmware/efi/arm-init.c | 4 | ||||
-rw-r--r-- | drivers/firmware/efi/arm-runtime.c | 2 | ||||
-rw-r--r-- | drivers/firmware/efi/efi.c | 35 | ||||
-rw-r--r-- | drivers/firmware/efi/libstub/arm-stub.c | 3 | ||||
-rw-r--r-- | drivers/firmware/efi/libstub/fdt.c | 4 | ||||
-rw-r--r-- | drivers/firmware/efi/memmap.c | 3 | ||||
-rw-r--r-- | drivers/firmware/efi/runtime-wrappers.c | 2 |
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 | ||
270 | static int __init register_gop_device(void) | 274 | static 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 | ||
598 | int __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 | ||
965 | static DEFINE_SPINLOCK(efi_mem_reserve_persistent_lock); | 969 | static DEFINE_SPINLOCK(efi_mem_reserve_persistent_lock); |
970 | static struct linux_efi_memreserve *efi_memreserve_root __ro_after_init; | ||
966 | 971 | ||
967 | int efi_mem_reserve_persistent(phys_addr_t addr, u64 size) | 972 | int 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 | ||
994 | static 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 | } |
1006 | early_initcall(efi_memreserve_root_init); | ||
996 | 1007 | ||
997 | #ifdef CONFIG_KEXEC | 1008 | #ifdef CONFIG_KEXEC |
998 | static int update_efi_random_seed(struct notifier_block *nb, | 1009 | static 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 | ||
163 | fdt_set_fail: | 167 | fdt_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 | ||
119 | void __init efi_memmap_unmap(void) | 119 | void __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; \ |