
From: Simon Glass <sjg@chromium.org> This command was written before the lmb unification, so does not currently build. Tidy it up and enable it for the EFI app, by default. Also allow it to search any partition, not just a FAT one, since we may have the kernel on ext4 Signed-off-by: Simon Glass <sjg@chromium.org> --- cmd/Kconfig | 3 ++- cmd/addr_find.c | 40 +++++++++++++--------------------------- 2 files changed, 15 insertions(+), 28 deletions(-) diff --git a/cmd/Kconfig b/cmd/Kconfig index 4d564ab5ac6..b7b80cbe59f 100644 --- a/cmd/Kconfig +++ b/cmd/Kconfig @@ -129,7 +129,8 @@ config CMD_ACPI want to make hardware changes without the OS needing to be adjusted. config CMD_ADDR_FIND - bool "addr_find" + bool "addr_find" + default y if EFI_APP help This command searches for an unused region of address space sufficiently large to hold a file. If successful, it sets the diff --git a/cmd/addr_find.c b/cmd/addr_find.c index 8dcad300ad8..876c58feabd 100644 --- a/cmd/addr_find.c +++ b/cmd/addr_find.c @@ -16,19 +16,17 @@ DECLARE_GLOBAL_DATA_PTR; int do_addr_find(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { - struct lmb_region *mem, *reserved; const char *filename; - struct lmb lmb; loff_t size; + ulong addr; int ret; - int i, j; if (!gd->fdt_blob) { log_err("No FDT setup\n"); return CMD_RET_FAILURE; } - if (fs_set_blk_dev(argv[1], argc >= 3 ? argv[2] : NULL, FS_TYPE_FAT)) { + if (fs_set_blk_dev(argv[1], argc >= 3 ? argv[2] : NULL, FS_TYPE_ANY)) { log_err("Can't set block device\n"); return CMD_RET_FAILURE; } @@ -49,32 +47,20 @@ int do_addr_find(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) return CMD_RET_FAILURE; } - lmb_init_and_reserve(&lmb, gd->bd, (void *)gd->fdt_blob); - mem = &lmb.memory; - reserved = &lmb.reserved; - - for (i = 0; i < mem->cnt; i++) { - unsigned long long start, end; + addr = lmb_alloc(size, SZ_1M); + if (!addr) { + log_err("Failed to find enough RAM for 0x%llx bytes\n", size); + return CMD_RET_FAILURE; + } - start = mem->region[i].base; - end = mem->region[i].base + mem->region[i].size - 1; - if ((start + size) > end) - continue; - for (j = 0; j < reserved->cnt; j++) { - if ((reserved->region[j].base + reserved->region[j].size) < start) - continue; - if ((start + size) > reserved->region[j].base) - start = reserved->region[j].base + reserved->region[j].size; - } - if ((start + size) <= end) { - env_set_hex("loadaddr", start); - debug("Set loadaddr to 0x%llx\n", start); - return CMD_RET_SUCCESS; - } + if (env_set_hex("loadaddr", addr)) { + log_err("Could not set loadaddr\n"); + return CMD_RET_FAILURE; } - log_err("Failed to find enough RAM for 0x%llx bytes\n", size); - return CMD_RET_FAILURE; + log_debug("Set loadaddr to %lx\n", addr); + + return CMD_RET_SUCCESS; } U_BOOT_CMD( -- 2.43.0