If /chosen/fdtfile exists in the devicetree and the fdtfile variable
isn't set in the default environment then populate it. This allows for
U-Boot to load the devicetree from the boot partition or ESP that should
more closely match the OS being booted.

Signed-off-by: Casey Connolly <casey.conno...@linaro.org>
---
 common/board_r.c | 35 +++++++++++++++++++++++++++++++++++
 1 file changed, 35 insertions(+)

diff --git a/common/board_r.c b/common/board_r.c
index 
41c8dec8d49ef21a12fd41272581dd94484dfa08..594c7827c39cfca5f4561b4699e5b66de54e11c2
 100644
--- a/common/board_r.c
+++ b/common/board_r.c
@@ -448,8 +448,41 @@ static int should_load_env(void)
 
        return 1;
 }
 
+/**
+ * fdtdec_setup_fdtfile - set fdtfile variable from /chosen/fdtfile
+ *
+ * This function will look for a string property named "fdtfile" under
+ * the chosen node and if found set the "fdtfile" environment variable.
+ *
+ * This devicetree property is used to identify the path to the FDT in
+ * use so that the same path can be checked in the dtbs directory on
+ * the boot partition or ESP.
+ */
+int setup_fdtfile(void)
+{
+       ofnode node;
+       const char *path;
+
+       if (env_get("fdtfile"))
+               return -EINVAL;
+
+       node = ofnode_path("/chosen");
+       if (!ofnode_valid(node))
+               return -ENOENT;
+
+       path = ofnode_read_string(node, "fdtfile");
+       if (!path)
+               return -ENOENT;
+
+       printf("Setting fdtfile to %s\n", path);
+       if (env_set("fdtfile", path))
+               return -EIO;
+
+       return 0;
+}
+
 static int initr_env(void)
 {
        /* initialize environment */
        if (should_load_env())
@@ -458,8 +491,10 @@ static int initr_env(void)
                env_set_default(NULL, 0);
 
        env_import_fdt();
 
+       setup_fdtfile();
+
        if (IS_ENABLED(CONFIG_OF_CONTROL))
                env_set_hex("fdtcontroladdr",
                            (unsigned long)map_to_sysmem(gd->fdt_blob));
 

-- 
2.49.0

Reply via email to