efi: Add efi_memmap_install() for installing new EFI memory maps
While efi_memmap_init_{early,late}() exist for architecture code to install memory maps from firmware data and for the virtual memory regions respectively, drivers don't care which stage of the boot we're at and just want to swap the existing memmap for a modified one. efi_memmap_install() abstracts the details of how the new memory map should be mapped and the existing one unmapped. 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> Cc: Taku Izumi <izumi.taku@jp.fujitsu.com> Signed-off-by: Matt Fleming <matt@codeblueprint.co.uk>
This commit is contained in:
parent
60863c0d1a
commit
c45f4da33a
@ -52,7 +52,6 @@ static int __init cmp_fake_mem(const void *x1, const void *x2)
|
|||||||
|
|
||||||
void __init efi_fake_memmap(void)
|
void __init efi_fake_memmap(void)
|
||||||
{
|
{
|
||||||
struct efi_memory_map_data data;
|
|
||||||
int new_nr_map = efi.memmap.nr_map;
|
int new_nr_map = efi.memmap.nr_map;
|
||||||
efi_memory_desc_t *md;
|
efi_memory_desc_t *md;
|
||||||
phys_addr_t new_memmap_phy;
|
phys_addr_t new_memmap_phy;
|
||||||
@ -90,13 +89,8 @@ void __init efi_fake_memmap(void)
|
|||||||
|
|
||||||
/* swap into new EFI memmap */
|
/* swap into new EFI memmap */
|
||||||
early_memunmap(new_memmap, efi.memmap.desc_size * new_nr_map);
|
early_memunmap(new_memmap, efi.memmap.desc_size * new_nr_map);
|
||||||
efi_memmap_unmap();
|
|
||||||
|
|
||||||
data.phys_map = new_memmap_phy;
|
efi_memmap_install(new_memmap_phy, new_nr_map);
|
||||||
data.size = efi.memmap.desc_size * new_nr_map;
|
|
||||||
data.desc_version = efi.memmap.desc_version;
|
|
||||||
data.desc_size = efi.memmap.desc_size;
|
|
||||||
efi_memmap_init_early(&data);
|
|
||||||
|
|
||||||
/* print new EFI memmap */
|
/* print new EFI memmap */
|
||||||
efi_print_memmap();
|
efi_print_memmap();
|
||||||
|
@ -139,6 +139,31 @@ int __init efi_memmap_init_late(phys_addr_t addr, unsigned long size)
|
|||||||
return __efi_memmap_init(&data, true);
|
return __efi_memmap_init(&data, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* efi_memmap_install - Install a new EFI memory map in efi.memmap
|
||||||
|
* @addr: Physical address of the memory map
|
||||||
|
* @nr_map: Number of entries in the memory map
|
||||||
|
*
|
||||||
|
* Unlike efi_memmap_init_*(), this function does not allow the caller
|
||||||
|
* to switch from early to late mappings. It simply uses the existing
|
||||||
|
* mapping function and installs the new memmap.
|
||||||
|
*
|
||||||
|
* Returns zero on success, a negative error code on failure.
|
||||||
|
*/
|
||||||
|
int __init efi_memmap_install(phys_addr_t addr, unsigned int nr_map)
|
||||||
|
{
|
||||||
|
struct efi_memory_map_data data;
|
||||||
|
|
||||||
|
efi_memmap_unmap();
|
||||||
|
|
||||||
|
data.phys_map = addr;
|
||||||
|
data.size = efi.memmap.desc_size * nr_map;
|
||||||
|
data.desc_version = efi.memmap.desc_version;
|
||||||
|
data.desc_size = efi.memmap.desc_size;
|
||||||
|
|
||||||
|
return __efi_memmap_init(&data, efi.memmap.late);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* efi_memmap_split_count - Count number of additional EFI memmap entries
|
* efi_memmap_split_count - Count number of additional EFI memmap entries
|
||||||
* @md: EFI memory descriptor to split
|
* @md: EFI memory descriptor to split
|
||||||
|
@ -923,6 +923,7 @@ extern void __iomem *efi_lookup_mapped_addr(u64 phys_addr);
|
|||||||
extern int __init efi_memmap_init_early(struct efi_memory_map_data *data);
|
extern int __init efi_memmap_init_early(struct efi_memory_map_data *data);
|
||||||
extern int __init efi_memmap_init_late(phys_addr_t addr, unsigned long size);
|
extern int __init efi_memmap_init_late(phys_addr_t addr, unsigned long size);
|
||||||
extern void __init efi_memmap_unmap(void);
|
extern void __init efi_memmap_unmap(void);
|
||||||
|
extern int __init efi_memmap_install(phys_addr_t addr, unsigned int nr_map);
|
||||||
extern int __init efi_memmap_split_count(efi_memory_desc_t *md,
|
extern int __init efi_memmap_split_count(efi_memory_desc_t *md,
|
||||||
struct range *range);
|
struct range *range);
|
||||||
extern void __init efi_memmap_insert(struct efi_memory_map *old_memmap,
|
extern void __init efi_memmap_insert(struct efi_memory_map *old_memmap,
|
||||||
|
Loading…
Reference in New Issue
Block a user