diff options
Diffstat (limited to 'common')
-rw-r--r-- | common/cmd_fdt.c | 26 | ||||
-rw-r--r-- | common/fdt_support.c | 73 |
2 files changed, 52 insertions, 47 deletions
diff --git a/common/cmd_fdt.c b/common/cmd_fdt.c index 4639126..9cd22ee 100644 --- a/common/cmd_fdt.c +++ b/common/cmd_fdt.c @@ -184,23 +184,28 @@ int do_fdt (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) } else if (argv[1][0] == 's') { char *pathp; /* path */ char *prop; /* property */ - char *newval; /* value from the user (as a string) */ int nodeoffset; /* node offset from libfdt */ static char data[SCRATCHPAD]; /* storage for the property */ int len; /* new length of the property */ int ret; /* return value */ /* - * Parameters: Node path, property, value. + * Parameters: Node path, property, optional value. */ - if (argc < 5) { + if (argc < 4) { printf ("Usage:\n%s\n", cmdtp->usage); return 1; } pathp = argv[2]; prop = argv[3]; - newval = argv[4]; + if (argc == 4) { + len = 0; + } else { + ret = fdt_parse_prop(pathp, prop, argv[4], data, &len); + if (ret != 0) + return ret; + } nodeoffset = fdt_path_offset (fdt, pathp); if (nodeoffset < 0) { @@ -211,9 +216,6 @@ int do_fdt (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) fdt_strerror(nodeoffset)); return 1; } - ret = fdt_parse_prop(pathp, prop, newval, data, &len); - if (ret != 0) - return ret; ret = fdt_setprop(fdt, nodeoffset, prop, data, len); if (ret < 0) { @@ -681,7 +683,7 @@ U_BOOT_CMD( #ifdef CONFIG_OF_BOARD_SETUP "fdt boardsetup - Do board-specific set up\n" #endif - "fdt move <fdt> <newaddr> <length> - Copy the fdt to <addr>\n" + "fdt move <fdt> <newaddr> <length> - Copy the fdt to <addr> and make it active\n" "fdt print <path> [<prop>] - Recursive print starting at <path>\n" "fdt list <path> [<prop>] - Print one level starting at <path>\n" "fdt set <path> <prop> [<val>] - Set <property> [to <val>]\n" @@ -694,10 +696,6 @@ U_BOOT_CMD( #ifdef CONFIG_OF_HAS_BD_T "fdt bd_t - Add/replace the /bd_t branch in the tree\n" #endif - "Hints:\n" - " If the property you are setting/printing has a '#' character or spaces,\n" - " you MUST escape it with a \\ character or quote it with \".\n" - "Examples: fdt print / # print the whole tree\n" - " fdt print /cpus \"#address-cells\"\n" - " fdt set /cpus \"#address-cells\" \"[00 00 00 01]\"\n" + "NOTE: If the path or property you are setting/printing has a '#' character\n" + " or spaces, you MUST escape it with a \\ character or quote it with \".\n" ); diff --git a/common/fdt_support.c b/common/fdt_support.c index b5ee6e9..92f1c7f 100644 --- a/common/fdt_support.c +++ b/common/fdt_support.c @@ -111,6 +111,7 @@ int fdt_chosen(void *fdt, ulong initrd_start, ulong initrd_end, int force) int err; u32 tmp; /* used to set 32 bit integer properties */ char *str; /* used to set string properties */ + const char *path; err = fdt_check_header(fdt); if (err < 0) { @@ -148,14 +149,7 @@ int fdt_chosen(void *fdt, ulong initrd_start, ulong initrd_end, int force) nodeoffset = fdt_path_offset (fdt, "/chosen"); /* - * If we have a "chosen" node already the "force the writing" - * is not set, our job is done. - */ - if ((nodeoffset >= 0) && !force) - return 0; - - /* - * No "chosen" node in the blob: create it. + * If there is no "chosen" node in the blob, create it. */ if (nodeoffset < 0) { /* @@ -170,42 +164,55 @@ int fdt_chosen(void *fdt, ulong initrd_start, ulong initrd_end, int force) } /* - * Update pre-existing properties, create them if non-existant. + * Create /chosen properites that don't exist in the fdt. + * If the property exists, update it only if the "force" parameter + * is true. */ str = getenv("bootargs"); if (str != NULL) { - err = fdt_setprop(fdt, nodeoffset, - "bootargs", str, strlen(str)+1); - if (err < 0) - printf("WARNING: could not set bootargs %s.\n", - fdt_strerror(err)); + path = fdt_getprop(fdt, nodeoffset, "bootargs", NULL); + if ((path == NULL) || force) { + err = fdt_setprop(fdt, nodeoffset, + "bootargs", str, strlen(str)+1); + if (err < 0) + printf("WARNING: could not set bootargs %s.\n", + fdt_strerror(err)); + } } if (initrd_start && initrd_end) { - tmp = __cpu_to_be32(initrd_start); - err = fdt_setprop(fdt, nodeoffset, - "linux,initrd-start", &tmp, sizeof(tmp)); - if (err < 0) - printf("WARNING: " - "could not set linux,initrd-start %s.\n", - fdt_strerror(err)); - tmp = __cpu_to_be32(initrd_end); - err = fdt_setprop(fdt, nodeoffset, - "linux,initrd-end", &tmp, sizeof(tmp)); - if (err < 0) - printf("WARNING: could not set linux,initrd-end %s.\n", - fdt_strerror(err)); + path = fdt_getprop(fdt, nodeoffset, "linux,initrd-start", NULL); + if ((path == NULL) || force) { + tmp = __cpu_to_be32(initrd_start); + err = fdt_setprop(fdt, nodeoffset, + "linux,initrd-start", &tmp, sizeof(tmp)); + if (err < 0) + printf("WARNING: " + "could not set linux,initrd-start %s.\n", + fdt_strerror(err)); + tmp = __cpu_to_be32(initrd_end); + err = fdt_setprop(fdt, nodeoffset, + "linux,initrd-end", &tmp, sizeof(tmp)); + if (err < 0) + printf("WARNING: could not set linux,initrd-end %s.\n", + fdt_strerror(err)); + } } #ifdef CONFIG_OF_STDOUT_VIA_ALIAS - err = fdt_fixup_stdout(fdt, nodeoffset); + path = fdt_getprop(fdt, nodeoffset, "linux,stdout-path", NULL); + if ((path == NULL) || force) + err = fdt_fixup_stdout(fdt, nodeoffset); #endif #ifdef OF_STDOUT_PATH - err = fdt_setprop(fdt, nodeoffset, - "linux,stdout-path", OF_STDOUT_PATH, strlen(OF_STDOUT_PATH)+1); - if (err < 0) - printf("WARNING: could not set linux,stdout-path %s.\n", - fdt_strerror(err)); + path = fdt_getprop(fdt, nodeoffset, "linux,stdout-path", NULL); + if ((path == NULL) || force) { + err = fdt_setprop(fdt, nodeoffset, + "linux,stdout-path", OF_STDOUT_PATH, strlen(OF_STDOUT_PATH)+1); + if (err < 0) + printf("WARNING: could not set linux,stdout-path %s.\n", + fdt_strerror(err)); + } #endif return err; |