bootm: Set working fdt address as part of the bootm flow

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>
This commit is contained in:
Kumar Gala 2008-08-15 08:24:39 -05:00 committed by Wolfgang Denk
parent 06a09918f3
commit 54f9c86691
4 changed files with 24 additions and 1 deletions

View file

@ -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
}

View 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;

View 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:

View 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 */