]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - common/cmd_fdt.c
include/bitfield.h: Assure new bitfield value doesn't touch unwanted bits
[karo-tx-uboot.git] / common / cmd_fdt.c
index a6744ed9c2509eb14cb441df45d4cb64974f385c..4c18962d853283b501729d0b36c6326548c00a1c 100644 (file)
@@ -15,6 +15,7 @@
 #include <asm/global_data.h>
 #include <libfdt.h>
 #include <fdt_support.h>
+#include <mapmem.h>
 #include <asm/io.h>
 
 #define MAX_LEVEL      32              /* how deeply nested we will go */
@@ -38,13 +39,13 @@ static int is_printable_string(const void *data, int len);
  */
 struct fdt_header *working_fdt;
 
-void set_working_fdt_addr(void *addr)
+void set_working_fdt_addr(ulong addr)
 {
        void *buf;
 
-       buf = map_sysmem((ulong)addr, 0);
+       buf = map_sysmem(addr, 0);
        working_fdt = buf;
-       setenv_addr("fdtaddr", addr);
+       setenv_hex("fdtaddr", addr);
 }
 
 /*
@@ -111,7 +112,7 @@ static int do_fdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                        if (!blob || !fdt_valid(&blob))
                                return 1;
                        printf("The address of the fdt is %#08lx\n",
-                              control ? (ulong)blob :
+                              control ? (ulong)map_to_sysmem(blob) :
                                        getenv_hex("fdtaddr", 0));
                        return 0;
                }
@@ -123,7 +124,7 @@ static int do_fdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                if (control)
                        gd->fdt_blob = blob;
                else
-                       set_working_fdt_addr(blob);
+                       set_working_fdt_addr(addr);
 
                if (argc >= 2) {
                        int  len;
@@ -566,8 +567,27 @@ static int do_fdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        }
 #ifdef CONFIG_OF_BOARD_SETUP
        /* Call the board-specific fixup routine */
-       else if (strncmp(argv[1], "boa", 3) == 0)
-               ft_board_setup(working_fdt, gd->bd);
+       else if (strncmp(argv[1], "boa", 3) == 0) {
+               int err = ft_board_setup(working_fdt, gd->bd);
+
+               if (err) {
+                       printf("Failed to update board information in FDT: %s\n",
+                              fdt_strerror(err));
+                       return CMD_RET_FAILURE;
+               }
+       }
+#endif
+#ifdef CONFIG_OF_SYSTEM_SETUP
+       /* Call the board-specific fixup routine */
+       else if (strncmp(argv[1], "sys", 3) == 0) {
+               int err = ft_system_setup(working_fdt, gd->bd);
+
+               if (err) {
+                       printf("Failed to add system information to FDT: %s\n",
+                              fdt_strerror(err));
+                       return CMD_RET_FAILURE;
+               }
+       }
 #endif
        /* Create a chosen node */
        else if (strncmp(argv[1], "cho", 3) == 0) {
@@ -581,8 +601,8 @@ static int do_fdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                        initrd_end = simple_strtoul(argv[3], NULL, 16);
                }
 
-               fdt_chosen(working_fdt, 1);
-               fdt_initrd(working_fdt, initrd_start, initrd_end, 1);
+               fdt_chosen(working_fdt);
+               fdt_initrd(working_fdt, initrd_start, initrd_end);
 
 #if defined(CONFIG_FIT_SIGNATURE)
        } else if (strncmp(argv[1], "che", 3) == 0) {
@@ -612,7 +632,7 @@ static int do_fdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                }
 
                ret = fit_config_verify(working_fdt, cfg_noffset);
-               if (ret == 1)
+               if (ret == 0)
                        return CMD_RET_SUCCESS;
                else
                        return CMD_RET_FAILURE;
@@ -621,7 +641,7 @@ static int do_fdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        }
        /* resize the fdt */
        else if (strncmp(argv[1], "re", 2) == 0) {
-               fdt_resize(working_fdt);
+               fdt_shrink_to_minimum(working_fdt);
        }
        else {
                /* Unrecognized command */
@@ -1007,6 +1027,9 @@ static char fdt_help_text[] =
        "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
+#ifdef CONFIG_OF_SYSTEM_SETUP
+       "fdt systemsetup                     - Do system-specific set up\n"
 #endif
        "fdt move   <fdt> <newaddr> <length> - Copy the fdt to <addr> and make it active\n"
        "fdt resize                          - Resize fdt to size + padding to 4k addr\n"