mirror of
https://github.com/smaeul/u-boot.git
synced 2025-10-14 04:46:01 +01:00
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:
parent
866e2ac5aa
commit
ce1dc0cc17
@ -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;
|
||||||
|
|
||||||
|
34
cmd/efi.c
34
cmd/efi.c
@ -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)
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
x
Reference in New Issue
Block a user