diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c index 9a745f1e20f97d9fa53ff32cd713fff3df53df6a..022cef8460ada2bed9a1774592b575848937bbe5 100644 --- a/common/cmd_bootm.c +++ b/common/cmd_bootm.c @@ -44,6 +44,12 @@ #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 } diff --git a/common/cmd_fdt.c b/common/cmd_fdt.c index 94bca4646ad6046495290b8d6c9b9d44fdcd56fd..8bc900aa795757a59829edc3b94305038d421cae 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 18d667de89eb367ed164b3ec77a022508ef22b80..55c4ccec8bc0fa4b7422d72e50148b00322d901c 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 f2f2cd5532c457bf22a5a6bba969b85126316646..f14ab68ffb8736c66e4cf9d84fd9343513b62f27 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 */