bootm: Set working fdt address as part of the bootm flow
authorKumar Gala <galak@kernel.crashing.org>
Fri, 15 Aug 2008 13:24:39 +0000 (08:24 -0500)
committerWolfgang Denk <wd@denx.de>
Tue, 26 Aug 2008 21:37:54 +0000 (23:37 +0200)
Set the fdt working address so "fdt FOO" commands can be used as part
of the bootm flow.  Also set an the environment variable "fdtaddr"
with the value.

Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
common/cmd_bootm.c
common/cmd_fdt.c
common/image.c
include/fdt_support.h

index 9a745f1..022cef8 100644 (file)
 #include <hush.h>
 #endif
 
+#if defined(CONFIG_OF_LIBFDT)
+#include <fdt.h>
+#include <libfdt.h>
+#include <fdt_support.h>
+#endif
+
 DECLARE_GLOBAL_DATA_PTR;
 
 extern int gunzip (void *dst, int dstlen, unsigned char *src, unsigned long *lenp);
@@ -267,6 +273,8 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
                        puts ("Could not find a valid device tree\n");
                        return 1;
                }
+
+               set_working_fdt_addr(images.ft_addr);
 #endif
        }
 
index 94bca46..8bc900a 100644 (file)
@@ -50,6 +50,16 @@ static int fdt_print(const char *pathp, char *prop, int depth);
  */
 struct fdt_header *working_fdt;
 
+void set_working_fdt_addr(void *addr)
+{
+       char buf[17];
+
+       working_fdt = addr;
+
+       sprintf(buf, "%lx", (unsigned long)addr);
+       setenv("fdtaddr", buf);
+}
+
 /*
  * Flattened Device Tree command, see the help for parameter definitions.
  */
@@ -64,6 +74,7 @@ int do_fdt (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
         * Set the address of the fdt
         ********************************************************************/
        if (argv[1][0] == 'a') {
+               unsigned long addr;
                /*
                 * Set the address [and length] of the fdt.
                 */
@@ -75,7 +86,8 @@ int do_fdt (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
                        return 0;
                }
 
-               working_fdt = (struct fdt_header *)simple_strtoul(argv[2], NULL, 16);
+               addr = simple_strtoul(argv[2], NULL, 16);
+               set_working_fdt_addr((void *)addr);
 
                if (!fdt_valid()) {
                        return 1;
index 18d667d..55c4cce 100644 (file)
@@ -1245,6 +1245,7 @@ int boot_relocate_fdt (struct lmb *lmb, ulong bootmap_base,
                *of_size = of_len;
        }
 
+       set_working_fdt_addr(*of_flat_tree);
        return 0;
 
 error:
index f2f2cd5..f14ab68 100644 (file)
@@ -68,5 +68,7 @@ void ft_cpu_setup(void *blob, bd_t *bd);
 void ft_pci_setup(void *blob, bd_t *bd);
 #endif
 
+void set_working_fdt_addr(void *addr);
+
 #endif /* ifdef CONFIG_OF_LIBFDT */
 #endif /* ifndef __FDT_SUPPORT_H */