Merge https://source.denx.de/u-boot/custodians/u-boot-spi
[platform/kernel/u-boot.git] / cmd / fdt.c
index 10d8f32..2a207bf 100644 (file)
--- a/cmd/fdt.c
+++ b/cmd/fdt.c
@@ -9,6 +9,8 @@
 
 #include <common.h>
 #include <command.h>
+#include <env.h>
+#include <image.h>
 #include <linux/ctype.h>
 #include <linux/types.h>
 #include <asm/global_data.h>
 
 #define MAX_LEVEL      32              /* how deeply nested we will go */
 #define SCRATCHPAD     1024            /* bytes of scratchpad memory */
-#define CMD_FDT_MAX_DUMP 64
 
 /*
  * Global data (for the gd->bd)
  */
 DECLARE_GLOBAL_DATA_PTR;
 
-static int fdt_valid(struct fdt_header **blobp);
 static int fdt_parse_prop(char *const*newval, int count, char *data, int *len);
 static int fdt_print(const char *pathp, char *prop, int depth);
 static int is_printable_string(const void *data, int len);
@@ -86,7 +86,7 @@ static const char * const fdt_member_table[] = {
        "size_dt_struct",
 };
 
-static int fdt_get_header_value(int argc, char * const argv[])
+static int fdt_get_header_value(int argc, char *const argv[])
 {
        fdt32_t *fdtp = (fdt32_t *)working_fdt;
        ulong val;
@@ -110,31 +110,25 @@ static int fdt_get_header_value(int argc, char * const argv[])
 /*
  * Flattened Device Tree command, see the help for parameter definitions.
  */
-static int do_fdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+static int do_fdt(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
 {
        if (argc < 2)
                return CMD_RET_USAGE;
 
-       /*
-        * Set the address of the fdt
-        */
+       /* fdt addr: Set the address of the fdt */
        if (strncmp(argv[1], "ad", 2) == 0) {
                unsigned long addr;
                int control = 0;
                struct fdt_header *blob;
-               /*
-                * Set the address [and length] of the fdt.
-                */
+
+               /* Set the address [and length] of the 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;
@@ -142,13 +136,14 @@ static int do_fdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                                blob = working_fdt;
                        if (!blob || !fdt_valid(&blob))
                                return 1;
-                       printf("The address of the fdt is %#08lx\n",
+                       printf("%s fdt: %08lx\n",
+                              control ? "Control" : "Working",
                               control ? (ulong)map_to_sysmem(blob) :
-                                       env_get_hex("fdtaddr", 0));
+                              env_get_hex("fdtaddr", 0));
                        return 0;
                }
 
-               addr = simple_strtoul(argv[0], NULL, 16);
+               addr = hextoul(argv[0], NULL);
                blob = map_sysmem(addr, 0);
                if (!fdt_valid(&blob))
                        return 1;
@@ -160,22 +155,18 @@ static int do_fdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                if (argc >= 2) {
                        int  len;
                        int  err;
-                       /*
-                        * Optional new length
-                        */
-                       len = simple_strtoul(argv[1], NULL, 16);
+
+                       /* Optional new length */
+                       len = hextoul(argv[1], NULL);
                        if (len < fdt_totalsize(blob)) {
-                               printf ("New length %d < existing length %d, "
-                                       "ignoring.\n",
-                                       len, fdt_totalsize(blob));
+                               printf("New length %d < existing length %d, ignoring\n",
+                                      len, fdt_totalsize(blob));
                        } else {
-                               /*
-                                * Open in place with a new length.
-                                */
+                               /* Open in place with a new length */
                                err = fdt_open_into(blob, blob, len);
                                if (err != 0) {
-                                       printf ("libfdt fdt_open_into(): %s\n",
-                                               fdt_strerror(err));
+                                       printf("libfdt fdt_open_into(): %s\n",
+                                              fdt_strerror(err));
                                }
                        }
                }
@@ -184,10 +175,9 @@ static int do_fdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        }
 
        if (!working_fdt) {
-               puts(
-                       "No FDT memory address configured. Please configure\n"
-                       "the FDT address via \"fdt addr <address>\" command.\n"
-                       "Aborting!\n");
+               puts("No FDT memory address configured. Please configure\n"
+                    "the FDT address via \"fdt addr <address>\" command.\n"
+                    "Aborting!\n");
                return CMD_RET_FAILURE;
        }
 
@@ -205,11 +195,11 @@ static int do_fdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                /*
                 * Set the address and length of the fdt.
                 */
-               working_fdt = (struct fdt_header *)simple_strtoul(argv[2], NULL, 16);
+               working_fdt = (struct fdt_header *)hextoul(argv[2], NULL);
                if (!fdt_valid(&working_fdt))
                        return 1;
 
-               newaddr = (struct fdt_header *)simple_strtoul(argv[3],NULL,16);
+               newaddr = (struct fdt_header *)hextoul(argv[3], NULL);
 
                /*
                 * If the user specifies a length, use that.  Otherwise use the
@@ -218,7 +208,7 @@ static int do_fdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                if (argc <= 4) {
                        len = fdt_totalsize(working_fdt);
                } else {
-                       len = simple_strtoul(argv[4], NULL, 16);
+                       len = hextoul(argv[4], NULL);
                        if (len < fdt_totalsize(working_fdt)) {
                                printf ("New length 0x%X < existing length "
                                        "0x%X, aborting.\n",
@@ -285,7 +275,7 @@ static int do_fdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        /*
         * Set the value of a property in the working_fdt.
         */
-       } else if (argv[1][0] == 's') {
+       } else if (strncmp(argv[1], "se", 2) == 0) {
                char *pathp;            /* path */
                char *prop;             /* property */
                int  nodeoffset;        /* node offset from libfdt */
@@ -374,21 +364,22 @@ static int do_fdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                }
 
                if (subcmd[0] == 'n' || (subcmd[0] == 's' && argc == 5)) {
-                       int reqIndex = -1;
+                       int req_index = -1;
                        int startDepth = fdt_node_depth(
                                working_fdt, nodeoffset);
                        int curDepth = startDepth;
-                       int curIndex = -1;
+                       int cur_index = -1;
                        int nextNodeOffset = fdt_next_node(
                                working_fdt, nodeoffset, &curDepth);
 
                        if (subcmd[0] == 'n')
-                               reqIndex = simple_strtoul(argv[5], NULL, 16);
+                               req_index = hextoul(argv[5], NULL);
 
                        while (curDepth > startDepth) {
                                if (curDepth == startDepth + 1)
-                                       curIndex++;
-                               if (subcmd[0] == 'n' && curIndex == reqIndex) {
+                                       cur_index++;
+                               if (subcmd[0] == 'n' &&
+                                   cur_index == req_index) {
                                        const char *node_name;
 
                                        node_name = fdt_get_name(working_fdt,
@@ -404,7 +395,7 @@ static int do_fdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                        }
                        if (subcmd[0] == 's') {
                                /* get the num nodes at this level */
-                               env_set_ulong(var, curIndex + 1);
+                               env_set_ulong(var, cur_index + 1);
                        } else {
                                /* node index not found */
                                printf("libfdt node not found\n");
@@ -558,7 +549,7 @@ static int do_fdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
         * Set boot cpu id
         */
        } else if (strncmp(argv[1], "boo", 3) == 0) {
-               unsigned long tmp = simple_strtoul(argv[2], NULL, 16);
+               unsigned long tmp = hextoul(argv[2], NULL);
                fdt_set_boot_cpuid_phys(working_fdt, tmp);
 
        /*
@@ -610,7 +601,7 @@ static int do_fdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                                return err;
                        }
                } else if (argv[2][0] == 'd') {
-                       unsigned long idx = simple_strtoul(argv[3], NULL, 16);
+                       unsigned long idx = hextoul(argv[3], NULL);
                        int err = fdt_del_mem_rsv(working_fdt, idx);
 
                        if (err < 0) {
@@ -633,7 +624,7 @@ static int do_fdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                               fdt_strerror(err));
                        return CMD_RET_FAILURE;
                }
-#ifdef CONFIG_SOC_KEYSTONE
+#ifdef CONFIG_ARCH_KEYSTONE
                ft_board_setup_ex(working_fdt, gd->bd);
 #endif
        }
@@ -646,8 +637,8 @@ static int do_fdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                        return CMD_RET_USAGE;
 
                if (argc == 4) {
-                       initrd_start = simple_strtoul(argv[2], NULL, 16);
-                       initrd_end = simple_strtoul(argv[3], NULL, 16);
+                       initrd_start = hextoul(argv[2], NULL);
+                       initrd_end = hextoul(argv[3], NULL);
                }
 
                fdt_chosen(working_fdt);
@@ -664,7 +655,7 @@ static int do_fdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                        return CMD_RET_FAILURE;
 
                if (argc > 2) {
-                       addr = simple_strtoul(argv[2], NULL, 16);
+                       addr = hextoul(argv[2], NULL);
                        blob = map_sysmem(addr, 0);
                } else {
                        blob = (struct fdt_header *)gd->fdt_blob;
@@ -701,7 +692,7 @@ static int do_fdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                if (!working_fdt)
                        return CMD_RET_FAILURE;
 
-               addr = simple_strtoul(argv[2], NULL, 16);
+               addr = hextoul(argv[2], NULL);
                blob = map_sysmem(addr, 0);
                if (!fdt_valid(&blob))
                        return CMD_RET_FAILURE;
@@ -716,7 +707,7 @@ static int do_fdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        else if (strncmp(argv[1], "re", 2) == 0) {
                uint extrasize;
                if (argc > 2)
-                       extrasize = simple_strtoul(argv[2], NULL, 16);
+                       extrasize = hextoul(argv[2], NULL);
                else
                        extrasize = 0;
                fdt_shrink_to_minimum(working_fdt, extrasize);
@@ -731,54 +722,6 @@ static int do_fdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 
 /****************************************************************************/
 
-/**
- * fdt_valid() - Check if an FDT is valid. If not, change it to NULL
- *
- * @blobp: Pointer to FDT pointer
- * @return 1 if OK, 0 if bad (in which case *blobp is set to NULL)
- */
-static int fdt_valid(struct fdt_header **blobp)
-{
-       const void *blob = *blobp;
-       int err;
-
-       if (blob == NULL) {
-               printf ("The address of the fdt is invalid (NULL).\n");
-               return 0;
-       }
-
-       err = fdt_check_header(blob);
-       if (err == 0)
-               return 1;       /* valid */
-
-       if (err < 0) {
-               printf("libfdt fdt_check_header(): %s", fdt_strerror(err));
-               /*
-                * Be more informative on bad version.
-                */
-               if (err == -FDT_ERR_BADVERSION) {
-                       if (fdt_version(blob) <
-                           FDT_FIRST_SUPPORTED_VERSION) {
-                               printf (" - too old, fdt %d < %d",
-                                       fdt_version(blob),
-                                       FDT_FIRST_SUPPORTED_VERSION);
-                       }
-                       if (fdt_last_comp_version(blob) >
-                           FDT_LAST_SUPPORTED_VERSION) {
-                               printf (" - too new, fdt %d > %d",
-                                       fdt_version(blob),
-                                       FDT_LAST_SUPPORTED_VERSION);
-                       }
-               }
-               printf("\n");
-               *blobp = NULL;
-               return 0;
-       }
-       return 1;
-}
-
-/****************************************************************************/
-
 /*
  * Parse the user's input, partially heuristic.  Valid formats:
  * <0x00112233 4 05>   - an array of cells.  Numbers follow standard
@@ -855,7 +798,7 @@ static int fdt_parse_prop(char * const *newval, int count, char *data, int *len)
                        }
                        if (!isxdigit(*newp))
                                break;
-                       tmp = simple_strtoul(newp, &newp, 16);
+                       tmp = hextoul(newp, &newp);
                        *data++ = tmp & 0xFF;
                        *len    = *len + 1;
                }
@@ -932,11 +875,17 @@ static int is_printable_string(const void *data, int len)
 static void print_data(const void *data, int len)
 {
        int j;
+       const char *env_max_dump;
+       ulong max_dump = ULONG_MAX;
 
        /* no data, don't print */
        if (len == 0)
                return;
 
+       env_max_dump = env_get("fdt_max_dump");
+       if (env_max_dump)
+               max_dump = hextoul(env_max_dump, NULL);
+
        /*
         * It is a string, but it may have multiple strings (embedded '\0's).
         */
@@ -955,7 +904,7 @@ static void print_data(const void *data, int len)
        }
 
        if ((len %4) == 0) {
-               if (len > CMD_FDT_MAX_DUMP)
+               if (len > max_dump)
                        printf("* 0x%p [0x%08x]", data, len);
                else {
                        const __be32 *p;
@@ -967,7 +916,7 @@ static void print_data(const void *data, int len)
                        printf(">");
                }
        } else { /* anything else... hexdump */
-               if (len > CMD_FDT_MAX_DUMP)
+               if (len > max_dump)
                        printf("* 0x%p [0x%08x]", data, len);
                else {
                        const u8 *s;