Point fdt_addr to the fdt embedded in the bloblist since fdt_addr
is a default address for bootefi, bootm and booti to look for the
device tree when launching the kernel.

Signed-off-by: Raymond Mao <raymond....@linaro.org>
---
 env/common.c | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/env/common.c b/env/common.c
index a58955a4f42..a38e5d107a8 100644
--- a/env/common.c
+++ b/env/common.c
@@ -16,6 +16,7 @@
 #include <asm/global_data.h>
 #include <linux/printk.h>
 #include <linux/stddef.h>
+#include <mapmem.h>
 #include <search.h>
 #include <errno.h>
 #include <malloc.h>
@@ -368,6 +369,18 @@ int env_get_default_into(const char *name, char *buf, 
unsigned int len)
        return env_get_from_linear(default_environment, name, buf, len);
 }
 
+static int env_update_fdt_addr_from_bloblist(void)
+{
+       /*
+        * fdt_addr is by default used by booti, bootm and bootefi,
+        * thus set it to point to the fdt embedded in a bloblist if it exists.
+        */
+       if (!CONFIG_IS_ENABLED(BLOBLIST) || gd->fdt_src != FDTSRC_BLOBLIST)
+               return 0;
+
+       return env_set_hex("fdt_addr", (uintptr_t)map_to_sysmem(gd->fdt_blob));
+}
+
 void env_set_default(const char *s, int flags)
 {
        if (s) {
@@ -392,6 +405,10 @@ void env_set_default(const char *s, int flags)
 
        gd->flags |= GD_FLG_ENV_READY;
        gd->flags |= GD_FLG_ENV_DEFAULT;
+
+       /* This has to be done after GD_FLG_ENV_READY is set */
+       if (env_update_fdt_addr_from_bloblist())
+               pr_err("Failed to set fdt_addr to point at DTB\n");
 }
 
 /* [re]set individual variables to their value in the default environment */
-- 
2.25.1

Reply via email to