Skip to content

Commit

Permalink
efi: Add a flags parameter to efi_memory_map
Browse files Browse the repository at this point in the history
In preparation for garbage collecting dynamically allocated EFI memory
maps, where the allocation method of memblock vs slab needs to be
recalled, convert the existing 'late' flag into a 'flags' bitmask.

Arrange for the flag to be passed via 'struct efi_memory_map_data'. This
structure grows additional flags in follow-on changes.

Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Link: https://lore.kernel.org/r/20200113172245.27925-11-ardb@kernel.org
  • Loading branch information
Dan Williams authored and Ingo Molnar committed Jan 20, 2020
1 parent 62b605b commit 26c0e44
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 15 deletions.
31 changes: 17 additions & 14 deletions drivers/firmware/efi/memmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -52,21 +52,20 @@ phys_addr_t __init efi_memmap_alloc(unsigned int num_entries)
/**
* __efi_memmap_init - Common code for mapping the EFI memory map
* @data: EFI memory map data
* @late: Use early or late mapping function?
*
* This function takes care of figuring out which function to use to
* map the EFI memory map in efi.memmap based on how far into the boot
* we are.
*
* During bootup @late should be %false since we only have access to
* the early_memremap*() functions as the vmalloc space isn't setup.
* Once the kernel is fully booted we can fallback to the more robust
* memremap*() API.
* During bootup EFI_MEMMAP_LATE in data->flags should be clear since we
* only have access to the early_memremap*() functions as the vmalloc
* space isn't setup. Once the kernel is fully booted we can fallback
* to the more robust memremap*() API.
*
* Returns zero on success, a negative error code on failure.
*/
static int __init
__efi_memmap_init(struct efi_memory_map_data *data, bool late)
__efi_memmap_init(struct efi_memory_map_data *data)
{
struct efi_memory_map map;
phys_addr_t phys_map;
Expand All @@ -76,7 +75,7 @@ __efi_memmap_init(struct efi_memory_map_data *data, bool late)

phys_map = data->phys_map;

if (late)
if (data->flags & EFI_MEMMAP_LATE)
map.map = memremap(phys_map, data->size, MEMREMAP_WB);
else
map.map = early_memremap(phys_map, data->size);
Expand All @@ -92,7 +91,7 @@ __efi_memmap_init(struct efi_memory_map_data *data, bool late)

map.desc_version = data->desc_version;
map.desc_size = data->desc_size;
map.late = late;
map.flags = data->flags;

set_bit(EFI_MEMMAP, &efi.flags);

Expand All @@ -111,17 +110,18 @@ __efi_memmap_init(struct efi_memory_map_data *data, bool late)
int __init efi_memmap_init_early(struct efi_memory_map_data *data)
{
/* Cannot go backwards */
WARN_ON(efi.memmap.late);
WARN_ON(efi.memmap.flags & EFI_MEMMAP_LATE);

return __efi_memmap_init(data, false);
data->flags = 0;
return __efi_memmap_init(data);
}

void __init efi_memmap_unmap(void)
{
if (!efi_enabled(EFI_MEMMAP))
return;

if (!efi.memmap.late) {
if (!(efi.memmap.flags & EFI_MEMMAP_LATE)) {
unsigned long size;

size = efi.memmap.desc_size * efi.memmap.nr_map;
Expand Down Expand Up @@ -162,13 +162,14 @@ int __init efi_memmap_init_late(phys_addr_t addr, unsigned long size)
struct efi_memory_map_data data = {
.phys_map = addr,
.size = size,
.flags = EFI_MEMMAP_LATE,
};

/* Did we forget to unmap the early EFI memmap? */
WARN_ON(efi.memmap.map);

/* Were we already called? */
WARN_ON(efi.memmap.late);
WARN_ON(efi.memmap.flags & EFI_MEMMAP_LATE);

/*
* It makes no sense to allow callers to register different
Expand All @@ -178,7 +179,7 @@ int __init efi_memmap_init_late(phys_addr_t addr, unsigned long size)
data.desc_version = efi.memmap.desc_version;
data.desc_size = efi.memmap.desc_size;

return __efi_memmap_init(&data, true);
return __efi_memmap_init(&data);
}

/**
Expand All @@ -195,15 +196,17 @@ int __init efi_memmap_init_late(phys_addr_t addr, unsigned long size)
int __init efi_memmap_install(phys_addr_t addr, unsigned int nr_map)
{
struct efi_memory_map_data data;
unsigned long flags;

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;
data.flags = efi.memmap.flags & EFI_MEMMAP_LATE;

return __efi_memmap_init(&data, efi.memmap.late);
return __efi_memmap_init(&data);
}

/**
Expand Down
4 changes: 3 additions & 1 deletion include/linux/efi.h
Original file line number Diff line number Diff line change
Expand Up @@ -767,6 +767,7 @@ struct efi_memory_map_data {
unsigned long size;
unsigned long desc_version;
unsigned long desc_size;
unsigned long flags;
};

struct efi_memory_map {
Expand All @@ -776,7 +777,8 @@ struct efi_memory_map {
int nr_map;
unsigned long desc_version;
unsigned long desc_size;
bool late;
#define EFI_MEMMAP_LATE (1UL << 0)
unsigned long flags;
};

struct efi_mem_range {
Expand Down

0 comments on commit 26c0e44

Please sign in to comment.