[Concept,v2,11/22] efi: Fix up the addr_find command

Message ID 20250819185900.835939-12-sjg@u-boot.org
State New
Headers
Series efi: Improvements for the EFI app on ARM |

Commit Message

Simon Glass Aug. 19, 2025, 6:58 p.m. UTC
  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(-)
  

Patch

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(