[PATCH] command: add FDT setup for bootelf by flag
Maxim Moskalets
maximmosk4 at gmail.com
Sun Feb 11 21:42:48 CET 2024
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 at kaspersky.com>
Cc: Tom Rini <trini at 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
*
--
2.39.2
More information about the U-Boot
mailing list