x86: efi: Update efi_get_next_mem_desc() to avoid needing a map

At present this function requires a pointer to struct efi_entry_memmap
but the only field used in there is the desc_size. We want to be able
to use it from the app, so update it to use desc_size directly.

Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Simon Glass 2022-01-04 03:51:11 -07:00 committed by Heinrich Schuchardt
parent 866e2ac5aa
commit ce1dc0cc17
3 changed files with 24 additions and 22 deletions

View File

@ -51,7 +51,7 @@ ulong board_get_usable_ram_top(ulong total_size)
end = (struct efi_mem_desc *)((ulong)map + size); end = (struct efi_mem_desc *)((ulong)map + size);
desc = map->desc; desc = map->desc;
for (; desc < end; desc = efi_get_next_mem_desc(map, desc)) { for (; desc < end; desc = efi_get_next_mem_desc(desc, map->desc_size)) {
if (desc->type != EFI_CONVENTIONAL_MEMORY || if (desc->type != EFI_CONVENTIONAL_MEMORY ||
desc->physical_start >= 1ULL << 32) desc->physical_start >= 1ULL << 32)
continue; continue;
@ -89,7 +89,7 @@ int dram_init(void)
end = (struct efi_mem_desc *)((ulong)map + size); end = (struct efi_mem_desc *)((ulong)map + size);
gd->ram_size = 0; gd->ram_size = 0;
desc = map->desc; desc = map->desc;
for (; desc < end; desc = efi_get_next_mem_desc(map, desc)) { for (; desc < end; desc = efi_get_next_mem_desc(desc, map->desc_size)) {
if (desc->type < EFI_MMAP_IO) if (desc->type < EFI_MMAP_IO)
gd->ram_size += desc->num_pages << EFI_PAGE_SHIFT; gd->ram_size += desc->num_pages << EFI_PAGE_SHIFT;
} }
@ -114,7 +114,7 @@ int dram_init_banksize(void)
desc = map->desc; desc = map->desc;
for (num_banks = 0; for (num_banks = 0;
desc < end && num_banks < CONFIG_NR_DRAM_BANKS; desc < end && num_banks < CONFIG_NR_DRAM_BANKS;
desc = efi_get_next_mem_desc(map, desc)) { desc = efi_get_next_mem_desc(desc, map->desc_size)) {
/* /*
* We only use conventional memory and ignore * We only use conventional memory and ignore
* anything less than 1MB. * anything less than 1MB.
@ -197,7 +197,7 @@ unsigned int install_e820_map(unsigned int max_entries,
end = (struct efi_mem_desc *)((ulong)map + size); end = (struct efi_mem_desc *)((ulong)map + size);
for (desc = map->desc; desc < end; for (desc = map->desc; desc < end;
desc = efi_get_next_mem_desc(map, desc)) { desc = efi_get_next_mem_desc(desc, map->desc_size)) {
if (desc->num_pages == 0) if (desc->num_pages == 0)
continue; continue;

View File

@ -75,16 +75,17 @@ static int h_cmp_entry(const void *v1, const void *v2)
/** /**
* efi_build_mem_table() - make a sorted copy of the memory table * efi_build_mem_table() - make a sorted copy of the memory table
* *
* @map: Pointer to EFI memory map table * @desc_base: Pointer to EFI memory map table
* @size: Size of table in bytes * @size: Size of table in bytes
* @desc_size: Size of each @desc_base record
* @skip_bs: True to skip boot-time memory and merge it with conventional * @skip_bs: True to skip boot-time memory and merge it with conventional
* memory. This will significantly reduce the number of table * memory. This will significantly reduce the number of table
* entries. * entries.
* Return: pointer to the new table. It should be freed with free() by the * Return: pointer to the new table. It should be freed with free() by the
* caller. * caller.
*/ */
static void *efi_build_mem_table(struct efi_entry_memmap *map, int size, static void *efi_build_mem_table(struct efi_mem_desc *desc_base, int size,
bool skip_bs) int desc_size, bool skip_bs)
{ {
struct efi_mem_desc *desc, *end, *base, *dest, *prev; struct efi_mem_desc *desc, *end, *base, *dest, *prev;
int count; int count;
@ -95,15 +96,16 @@ static void *efi_build_mem_table(struct efi_entry_memmap *map, int size,
debug("%s: Cannot allocate %#x bytes\n", __func__, size); debug("%s: Cannot allocate %#x bytes\n", __func__, size);
return NULL; return NULL;
} }
end = (struct efi_mem_desc *)((ulong)map + size); end = (void *)desc_base + size;
count = ((ulong)end - (ulong)map->desc) / map->desc_size; count = ((ulong)end - (ulong)desc_base) / desc_size;
memcpy(base, map->desc, (ulong)end - (ulong)map->desc); memcpy(base, desc_base, (ulong)end - (ulong)desc_base);
qsort(base, count, map->desc_size, h_cmp_entry); qsort(base, count, desc_size, h_cmp_entry);
prev = NULL; prev = NULL;
addr = 0; addr = 0;
dest = base; dest = base;
end = (struct efi_mem_desc *)((ulong)base + count * map->desc_size); end = (struct efi_mem_desc *)((ulong)base + count * desc_size);
for (desc = base; desc < end; desc = efi_get_next_mem_desc(map, desc)) { for (desc = base; desc < end;
desc = efi_get_next_mem_desc(desc, desc_size)) {
bool merge = true; bool merge = true;
u32 type = desc->type; u32 type = desc->type;
@ -116,7 +118,7 @@ static void *efi_build_mem_table(struct efi_entry_memmap *map, int size,
if (skip_bs && is_boot_services(desc->type)) if (skip_bs && is_boot_services(desc->type))
type = EFI_CONVENTIONAL_MEMORY; type = EFI_CONVENTIONAL_MEMORY;
memcpy(dest, desc, map->desc_size); memcpy(dest, desc, desc_size);
dest->type = type; dest->type = type;
if (!skip_bs || !prev) if (!skip_bs || !prev)
merge = false; merge = false;
@ -131,7 +133,7 @@ static void *efi_build_mem_table(struct efi_entry_memmap *map, int size,
prev->num_pages += desc->num_pages; prev->num_pages += desc->num_pages;
} else { } else {
prev = dest; prev = dest;
dest = efi_get_next_mem_desc(map, dest); dest = efi_get_next_mem_desc(dest, desc_size);
} }
addr = desc->physical_start + (desc->num_pages << addr = desc->physical_start + (desc->num_pages <<
EFI_PAGE_SHIFT); EFI_PAGE_SHIFT);
@ -143,8 +145,8 @@ static void *efi_build_mem_table(struct efi_entry_memmap *map, int size,
return base; return base;
} }
static void efi_print_mem_table(struct efi_entry_memmap *map, static void efi_print_mem_table(struct efi_mem_desc *desc, int desc_size,
struct efi_mem_desc *desc, bool skip_bs) bool skip_bs)
{ {
u64 attr_seen[ATTR_SEEN_MAX]; u64 attr_seen[ATTR_SEEN_MAX];
int attr_seen_count; int attr_seen_count;
@ -158,7 +160,7 @@ static void efi_print_mem_table(struct efi_entry_memmap *map,
attr_seen_count = 0; attr_seen_count = 0;
addr = 0; addr = 0;
for (upto = 0; desc->type != EFI_MAX_MEMORY_TYPE; for (upto = 0; desc->type != EFI_MAX_MEMORY_TYPE;
upto++, desc = efi_get_next_mem_desc(map, desc)) { upto++, desc = efi_get_next_mem_desc(desc, desc_size)) {
const char *name; const char *name;
u64 size; u64 size;
@ -238,13 +240,13 @@ static int do_efi_mem(struct cmd_tbl *cmdtp, int flag, int argc,
goto done; goto done;
} }
desc = efi_build_mem_table(map, size, skip_bs); desc = efi_build_mem_table(map->desc, size, map->desc_size, skip_bs);
if (!desc) { if (!desc) {
ret = -ENOMEM; ret = -ENOMEM;
goto done; goto done;
} }
efi_print_mem_table(map, desc, skip_bs); efi_print_mem_table(desc, map->desc_size, skip_bs);
free(desc); free(desc);
done: done:
if (ret) if (ret)

View File

@ -395,9 +395,9 @@ struct efi_entry_systable {
}; };
static inline struct efi_mem_desc *efi_get_next_mem_desc( static inline struct efi_mem_desc *efi_get_next_mem_desc(
struct efi_entry_memmap *map, struct efi_mem_desc *desc) struct efi_mem_desc *desc, int desc_size)
{ {
return (struct efi_mem_desc *)((ulong)desc + map->desc_size); return (struct efi_mem_desc *)((ulong)desc + desc_size);
} }
/** /**