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>
---
(no changes since v1)
cmd/Kconfig | 3 ++-
cmd/addr_find.c | 40 +++++++++++++---------------------------
2 files changed, 15 insertions(+), 28 deletions(-)
@@ -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
@@ -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(