There is an existing fdt command to deal with the working FDT. Enhance this
to support the control FDT also (CONFIG_OF_CONTROL).

Some nasty #ifdefs are added here - they are required until we move to
generic board and every arch has an fdt_blob.

Signed-off-by: Simon Glass <s...@chromium.org>
---
 common/cmd_fdt.c |   58 ++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 41 insertions(+), 17 deletions(-)

diff --git a/common/cmd_fdt.c b/common/cmd_fdt.c
index 0adebf1..a193cc3 100644
--- a/common/cmd_fdt.c
+++ b/common/cmd_fdt.c
@@ -101,42 +101,66 @@ 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;
+               void *blob;
                /*
                 * Set the address [and length] of the fdt.
                 */
-               if (argc == 2) {
-                       if (!fdt_valid(working_fdt)) {
-                               working_fdt = NULL;
+               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) {
+#ifdef CONFIG_OF_CONTROL
+                       if (control)
+                               blob = (void *)gd->fdt_blob;
+                       else
+#endif
+                               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)) {
-                       working_fdt = NULL;
-                       return 1;
+               addr = simple_strtoul(argv[0], NULL, 16);
+               blob = (void *)addr;
+               if (control) {
+#ifdef CONFIG_OF_CONTROL
+                       if (!fdt_valid(gd->fdt_blob))
+                               return 1;
+                       gd->fdt_blob = blob;
+#endif
+               } else {
+                       if (!fdt_valid(blob))
+                               return 1;
+                       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 +984,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
-- 
1.7.7.3

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to