summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKumar Gala <galak@kernel.crashing.org>2008-08-15 08:24:39 -0500
committerWolfgang Denk <wd@denx.de>2008-08-26 23:37:54 +0200
commit54f9c86691309b2f919f567f9255b8bcad2c7651 (patch)
tree80d5b034600494cdbbbac4a3fba2a78487e052cd
parent06a09918f3903450313e2047a9cc258bf5872f46 (diff)
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>
-rw-r--r--common/cmd_bootm.c8
-rw-r--r--common/cmd_fdt.c14
-rw-r--r--common/image.c1
-rw-r--r--include/fdt_support.h2
4 files changed, 24 insertions, 1 deletions
diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c
index 9a745f1e20f..022cef8460a 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 94bca4646ad..8bc900aa795 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 18d667de89e..55c4ccec8bc 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 f2f2cd5532c..f14ab68ffb8 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 */