diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c index 9a745f1e2..022cef846 100644 --- a/common/cmd_bootm.c +++ b/common/cmd_bootm.c @@ -44,6 +44,12 @@ #include #endif +#if defined(CONFIG_OF_LIBFDT) +#include +#include +#include +#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 } diff --git a/common/cmd_fdt.c b/common/cmd_fdt.c index 94bca4646..8bc900aa7 100644 --- a/common/cmd_fdt.c +++ b/common/cmd_fdt.c @@ -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; diff --git a/common/image.c b/common/image.c index 18d667de8..55c4ccec8 100644 --- a/common/image.c +++ b/common/image.c @@ -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: diff --git a/include/fdt_support.h b/include/fdt_support.h index f2f2cd553..f14ab68ff 100644 --- a/include/fdt_support.h +++ b/include/fdt_support.h @@ -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 */