aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/firmware
diff options
context:
space:
mode:
authorMatt Fleming <matt@codeblueprint.co.uk>2016-03-01 18:02:56 -0500
committerMatt Fleming <matt@codeblueprint.co.uk>2016-09-09 11:08:36 -0400
commit31ce8cc68180803aa481c0c1daac29d8eaceca9d (patch)
tree8c5310d53093e288169a193b1776ce33b4237589 /drivers/firmware
parent816e76129ed5fadd28e526c43397c79775194b5c (diff)
efi/runtime-map: Use efi.memmap directly instead of a copy
Now that efi.memmap is available all of the time there's no need to allocate and build a separate copy of the EFI memory map. Furthermore, efi.memmap contains boot services regions but only those regions that have been reserved via efi_mem_reserve(). Using efi.memmap allows us to pass boot services across kexec reboot so that the ESRT and BGRT drivers will now work. Tested-by: Dave Young <dyoung@redhat.com> [kexec/kdump] Tested-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> [arm] Acked-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Cc: Leif Lindholm <leif.lindholm@linaro.org> Cc: Peter Jones <pjones@redhat.com> Cc: Borislav Petkov <bp@alien8.de> Cc: Mark Rutland <mark.rutland@arm.com> Signed-off-by: Matt Fleming <matt@codeblueprint.co.uk>
Diffstat (limited to 'drivers/firmware')
-rw-r--r--drivers/firmware/efi/runtime-map.c35
1 files changed, 13 insertions, 22 deletions
diff --git a/drivers/firmware/efi/runtime-map.c b/drivers/firmware/efi/runtime-map.c
index 5c55227a34c8..8e64b77aeac9 100644
--- a/drivers/firmware/efi/runtime-map.c
+++ b/drivers/firmware/efi/runtime-map.c
@@ -14,10 +14,6 @@
14 14
15#include <asm/setup.h> 15#include <asm/setup.h>
16 16
17static void *efi_runtime_map;
18static int nr_efi_runtime_map;
19static u32 efi_memdesc_size;
20
21struct efi_runtime_map_entry { 17struct efi_runtime_map_entry {
22 efi_memory_desc_t md; 18 efi_memory_desc_t md;
23 struct kobject kobj; /* kobject for each entry */ 19 struct kobject kobj; /* kobject for each entry */
@@ -106,7 +102,8 @@ static struct kobj_type __refdata map_ktype = {
106static struct kset *map_kset; 102static struct kset *map_kset;
107 103
108static struct efi_runtime_map_entry * 104static struct efi_runtime_map_entry *
109add_sysfs_runtime_map_entry(struct kobject *kobj, int nr) 105add_sysfs_runtime_map_entry(struct kobject *kobj, int nr,
106 efi_memory_desc_t *md)
110{ 107{
111 int ret; 108 int ret;
112 struct efi_runtime_map_entry *entry; 109 struct efi_runtime_map_entry *entry;
@@ -124,8 +121,7 @@ add_sysfs_runtime_map_entry(struct kobject *kobj, int nr)
124 return ERR_PTR(-ENOMEM); 121 return ERR_PTR(-ENOMEM);
125 } 122 }
126 123
127 memcpy(&entry->md, efi_runtime_map + nr * efi_memdesc_size, 124 memcpy(&entry->md, md, sizeof(efi_memory_desc_t));
128 sizeof(efi_memory_desc_t));
129 125
130 kobject_init(&entry->kobj, &map_ktype); 126 kobject_init(&entry->kobj, &map_ktype);
131 entry->kobj.kset = map_kset; 127 entry->kobj.kset = map_kset;
@@ -142,12 +138,12 @@ add_sysfs_runtime_map_entry(struct kobject *kobj, int nr)
142 138
143int efi_get_runtime_map_size(void) 139int efi_get_runtime_map_size(void)
144{ 140{
145 return nr_efi_runtime_map * efi_memdesc_size; 141 return efi.memmap.nr_map * efi.memmap.desc_size;
146} 142}
147 143
148int efi_get_runtime_map_desc_size(void) 144int efi_get_runtime_map_desc_size(void)
149{ 145{
150 return efi_memdesc_size; 146 return efi.memmap.desc_size;
151} 147}
152 148
153int efi_runtime_map_copy(void *buf, size_t bufsz) 149int efi_runtime_map_copy(void *buf, size_t bufsz)
@@ -157,38 +153,33 @@ int efi_runtime_map_copy(void *buf, size_t bufsz)
157 if (sz > bufsz) 153 if (sz > bufsz)
158 sz = bufsz; 154 sz = bufsz;
159 155
160 memcpy(buf, efi_runtime_map, sz); 156 memcpy(buf, efi.memmap.map, sz);
161 return 0; 157 return 0;
162} 158}
163 159
164void efi_runtime_map_setup(void *map, int nr_entries, u32 desc_size)
165{
166 efi_runtime_map = map;
167 nr_efi_runtime_map = nr_entries;
168 efi_memdesc_size = desc_size;
169}
170
171int __init efi_runtime_map_init(struct kobject *efi_kobj) 160int __init efi_runtime_map_init(struct kobject *efi_kobj)
172{ 161{
173 int i, j, ret = 0; 162 int i, j, ret = 0;
174 struct efi_runtime_map_entry *entry; 163 struct efi_runtime_map_entry *entry;
164 efi_memory_desc_t *md;
175 165
176 if (!efi_runtime_map) 166 if (!efi_enabled(EFI_MEMMAP))
177 return 0; 167 return 0;
178 168
179 map_entries = kzalloc(nr_efi_runtime_map * sizeof(entry), GFP_KERNEL); 169 map_entries = kzalloc(efi.memmap.nr_map * sizeof(entry), GFP_KERNEL);
180 if (!map_entries) { 170 if (!map_entries) {
181 ret = -ENOMEM; 171 ret = -ENOMEM;
182 goto out; 172 goto out;
183 } 173 }
184 174
185 for (i = 0; i < nr_efi_runtime_map; i++) { 175 i = 0;
186 entry = add_sysfs_runtime_map_entry(efi_kobj, i); 176 for_each_efi_memory_desc(md) {
177 entry = add_sysfs_runtime_map_entry(efi_kobj, i, md);
187 if (IS_ERR(entry)) { 178 if (IS_ERR(entry)) {
188 ret = PTR_ERR(entry); 179 ret = PTR_ERR(entry);
189 goto out_add_entry; 180 goto out_add_entry;
190 } 181 }
191 *(map_entries + i) = entry; 182 *(map_entries + i++) = entry;
192 } 183 }
193 184
194 return 0; 185 return 0;