diff mbox series

command: add FDT setup for bootelf by flag

Message ID 20240211204248.273295-1-Maxim.Moskalets@kaspersky.com
State Changes Requested
Delegated to: Tom Rini
Headers show
Series command: add FDT setup for bootelf by flag | expand

Commit Message

Maxim Moskalets Feb. 11, 2024, 8:42 p.m. UTC
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(+)

Comments

Dan Carpenter Feb. 13, 2024, 6:49 a.m. UTC | #1
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
diff mbox series

Patch

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
  *