[PATCH] command: add FDT setup for bootelf by flag

Added the ability to use FDT for ELF applications, required to run some OS. To make FDT setup, you need to set the elf_needed_fdt environment variable to a value like y or yes.
Signed-off-by: Maxim Moskalets Maxim.Moskalets@kaspersky.com
Cc: Tom Rini trini@konsulko.com ---
cmd/elf.c | 14 ++++++++++++++ env/common.c | 5 +++++ include/env.h | 7 +++++++ 3 files changed, 26 insertions(+)
diff --git a/cmd/elf.c b/cmd/elf.c index b7b9f506a5..4d365771eb 100644 --- a/cmd/elf.c +++ b/cmd/elf.c @@ -38,6 +38,8 @@ static unsigned long do_bootelf_exec(ulong (*entry)(int, char * const[]), /* Interpreter command to boot an arbitrary ELF image from memory */ int do_bootelf(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { + unsigned long fdt_addr; + struct bootm_headers img = { 0 }; unsigned long addr; /* Address of the ELF image */ unsigned long rc; /* Return value from user code */ char *sload = NULL; @@ -68,6 +70,18 @@ int do_bootelf(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) else addr = load_elf_image_shdr(addr);
+ if (!env_get_elf_need_fdt()) { + if (argc >= 1 && strict_strtoul(argv[0], 16, &fdt_addr) != -EINVAL) { + printf("Got FDT at 0x%08lx ...\n", fdt_addr); + + if (image_setup_libfdt(&img, (void *)fdt_addr, 0, NULL)) { + printf("ERROR: Failed to process device tree\n"); + return 1; + } + } + } + + if (!env_get_autostart()) return rcode;
diff --git a/env/common.c b/env/common.c index 48a565107c..8cd8558c3f 100644 --- a/env/common.c +++ b/env/common.c @@ -346,6 +346,11 @@ bool env_get_autostart(void) return env_get_yesno("autostart") == 1; }
+bool env_get_elf_need_fdt(void) +{ + return env_get_yesno("elf_need_fdt") == 1; +} + /* * Look up the variable from the default environment */ diff --git a/include/env.h b/include/env.h index d2a5954ded..384c312d2e 100644 --- a/include/env.h +++ b/include/env.h @@ -148,6 +148,13 @@ int env_get_yesno(const char *var); */ bool env_get_autostart(void);
+/** + * env_get_elf_need_fdt() - Check if FDT is needed for ELF image + * + * Return: true if the "elf_need_fdt" env var exists and is set to "yes" + */ +bool env_get_elf_need_fdt(void); + /** * env_set() - set an environment variable *

On Sun, Feb 11, 2024 at 11:42:48PM +0300, Maxim Moskalets wrote:
diff --git a/cmd/elf.c b/cmd/elf.c index b7b9f506a5..4d365771eb 100644 --- a/cmd/elf.c +++ b/cmd/elf.c @@ -38,6 +38,8 @@ static unsigned long do_bootelf_exec(ulong (*entry)(int, char * const[]), /* Interpreter command to boot an arbitrary ELF image from memory */ int do_bootelf(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) {
- unsigned long fdt_addr;
- struct bootm_headers img = { 0 }; unsigned long addr; /* Address of the ELF image */ unsigned long rc; /* Return value from user code */ char *sload = NULL;
@@ -68,6 +70,18 @@ int do_bootelf(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) else addr = load_elf_image_shdr(addr);
- if (!env_get_elf_need_fdt()) {
Should the ! be there? This looks reversed...
if (argc >= 1 && strict_strtoul(argv[0], 16, &fdt_addr) != -EINVAL) {
printf("Got FDT at 0x%08lx ...\n", fdt_addr);
if (image_setup_libfdt(&img, (void *)fdt_addr, 0, NULL)) {
printf("ERROR: Failed to process device tree\n");
return 1;
}
}
- }
- if (!env_get_autostart()) return rcode;
There are a few style nits that I have with this change like the double blank line at the end. Try running scripts/checkpatch.pl on your patch. We could also combine the conditions and pull the code in a tab. Also I recognize that you just copied the != -EINVAL from a few lines earlier and it does work, but it's better to check for == 0 instead.
if (env_get_elf_need_fdt() && argc >= 1 && strict_strtoul(argv[0], 16, &fdt_addr) == 0) { printf("Got FDT at 0x%08lx ...\n", fdt_addr);
if (image_setup_libfdt(&img, (void *)fdt_addr, 0, NULL)) { printf("ERROR: Failed to process device tree\n"); return 1; } }
regards, dan carpenter
participants (2)
-
Dan Carpenter
-
Maxim Moskalets