diff options
| author | Matt Fleming <matt@codeblueprint.co.uk> | 2016-03-01 18:02:56 -0500 |
|---|---|---|
| committer | Matt Fleming <matt@codeblueprint.co.uk> | 2016-09-09 11:08:36 -0400 |
| commit | 31ce8cc68180803aa481c0c1daac29d8eaceca9d (patch) | |
| tree | 8c5310d53093e288169a193b1776ce33b4237589 /drivers/firmware | |
| parent | 816e76129ed5fadd28e526c43397c79775194b5c (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.c | 35 |
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 | ||
| 17 | static void *efi_runtime_map; | ||
| 18 | static int nr_efi_runtime_map; | ||
| 19 | static u32 efi_memdesc_size; | ||
| 20 | |||
| 21 | struct efi_runtime_map_entry { | 17 | struct 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 = { | |||
| 106 | static struct kset *map_kset; | 102 | static struct kset *map_kset; |
| 107 | 103 | ||
| 108 | static struct efi_runtime_map_entry * | 104 | static struct efi_runtime_map_entry * |
| 109 | add_sysfs_runtime_map_entry(struct kobject *kobj, int nr) | 105 | add_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 | ||
| 143 | int efi_get_runtime_map_size(void) | 139 | int 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 | ||
| 148 | int efi_get_runtime_map_desc_size(void) | 144 | int efi_get_runtime_map_desc_size(void) |
| 149 | { | 145 | { |
| 150 | return efi_memdesc_size; | 146 | return efi.memmap.desc_size; |
| 151 | } | 147 | } |
| 152 | 148 | ||
| 153 | int efi_runtime_map_copy(void *buf, size_t bufsz) | 149 | int 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 | ||
| 164 | void 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 | |||
| 171 | int __init efi_runtime_map_init(struct kobject *efi_kobj) | 160 | int __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; |
