summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2013-04-20 08:42:44 +0000
committerTom Rini <trini@ti.com>2013-05-01 11:17:21 -0400
commit4b5786550db2da6192f8d5f38eeccbb372f878a8 (patch)
tree33795148f242abe84fc3353c176af1c3cf2c9f98
parent76b8f79c299ee8029c64c14a65cb0615bad77319 (diff)
downloadu-boot-4b5786550db2da6192f8d5f38eeccbb372f878a8.tar.gz
u-boot-4b5786550db2da6192f8d5f38eeccbb372f878a8.tar.xz
u-boot-4b5786550db2da6192f8d5f38eeccbb372f878a8.zip
fdt: Allow fdt command to check and update control FDT
There is an existing fdt command to deal with the working FDT. Enhance this to support the control FDT also (CONFIG_OF_CONTROL). Signed-off-by: Simon Glass <sjg@chromium.org>
-rw-r--r--common/cmd_fdt.c47
1 files changed, 34 insertions, 13 deletions
diff --git a/common/cmd_fdt.c b/common/cmd_fdt.c
index 07072f3283..e5829616fc 100644
--- a/common/cmd_fdt.c
+++ b/common/cmd_fdt.c
@@ -100,38 +100,59 @@ static int do_fdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
*/
if (argv[1][0] == 'a') {
unsigned long addr;
+ int control = 0;
+ struct fdt_header *blob;
/*
* Set the address [and length] of the fdt.
*/
- if (argc == 2) {
- if (!fdt_valid(&working_fdt))
+ argc -= 2;
+ argv += 2;
+/* Temporary #ifdef - some archs don't have fdt_blob yet */
+#ifdef CONFIG_OF_CONTROL
+ if (argc && !strcmp(*argv, "-c")) {
+ control = 1;
+ argc--;
+ argv++;
+ }
+#endif
+ if (argc == 0) {
+ if (control)
+ blob = (struct fdt_header *)gd->fdt_blob;
+ else
+ blob = working_fdt;
+ if (!blob || !fdt_valid(&blob))
return 1;
- printf("The address of the fdt is %p\n", working_fdt);
+ printf("The address of the fdt is %#08lx\n",
+ control ? (ulong)blob :
+ getenv_hex("fdtaddr", 0));
return 0;
}
- addr = simple_strtoul(argv[2], NULL, 16);
- set_working_fdt_addr((void *)addr);
-
- if (!fdt_valid(&working_fdt))
+ addr = simple_strtoul(argv[0], NULL, 16);
+ blob = (struct fdt_header *)addr;
+ if (!fdt_valid(&blob))
return 1;
+ if (control)
+ gd->fdt_blob = blob;
+ else
+ set_working_fdt_addr((void *)addr);
- if (argc >= 4) {
+ if (argc >= 2) {
int len;
int err;
/*
* Optional new length
*/
- len = simple_strtoul(argv[3], NULL, 16);
- if (len < fdt_totalsize(working_fdt)) {
+ len = simple_strtoul(argv[1], NULL, 16);
+ if (len < fdt_totalsize(blob)) {
printf ("New length %d < existing length %d, "
"ignoring.\n",
- len, fdt_totalsize(working_fdt));
+ len, fdt_totalsize(blob));
} else {
/*
* Open in place with a new length.
*/
- err = fdt_open_into(working_fdt, working_fdt, len);
+ err = fdt_open_into(blob, blob, len);
if (err != 0) {
printf ("libfdt fdt_open_into(): %s\n",
fdt_strerror(err));
@@ -960,7 +981,7 @@ static int fdt_print(const char *pathp, char *prop, int depth)
/********************************************************************/
#ifdef CONFIG_SYS_LONGHELP
static char fdt_help_text[] =
- "addr <addr> [<length>] - Set the fdt location to <addr>\n"
+ "addr [-c] <addr> [<length>] - Set the [control] fdt location to <addr>\n"
#ifdef CONFIG_OF_BOARD_SETUP
"fdt boardsetup - Do board-specific set up\n"
#endif