[U-Boot-Users] [PATCH] Add sub-commands to fdt

fdt header - Display header info fdt bootcpu <id> - Set boot cpuid fdt memory <addr> <size> - Add/Update memory node fdt memrsv print - Show current mem reserves fdt memrsv add <addr> <size> - Add a mem reserve fdt memrsv delete <index> - Delete a mem reserves
Signed-off-by: Kumar Gala galak@kernel.crashing.org --- common/cmd_fdt.c | 111 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 111 insertions(+), 0 deletions(-)
diff --git a/common/cmd_fdt.c b/common/cmd_fdt.c index 9cd22ee..d0f8c27 100644 --- a/common/cmd_fdt.c +++ b/common/cmd_fdt.c @@ -296,6 +296,111 @@ int do_fdt (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) return err; } } + + /******************************************************************** + * Display header info + ********************************************************************/ + } else if (argv[1][0] == 'h') { + u32 version = fdt_version(fdt); + printf("magic:\t\t\t0x%x\n", fdt_magic(fdt)); + printf("totalsize:\t\t0x%x (%d)\n", fdt_totalsize(fdt), fdt_totalsize(fdt)); + printf("off_dt_struct:\t\t0x%x\n", fdt_off_dt_struct(fdt)); + printf("off_dt_strings:\t\t0x%x\n", fdt_off_dt_strings(fdt)); + printf("off_mem_rsvmap:\t\t0x%x\n", fdt_off_mem_rsvmap(fdt)); + printf("version:\t\t%d\n", version); + printf("last_comp_version:\t%d\n", fdt_last_comp_version(fdt)); + if (version >= 2) + printf("boot_cpuid_phys:\t0x%x\n", + fdt_boot_cpuid_phys(fdt)); + if (version >= 3) + printf("size_dt_strings:\t0x%x\n", + fdt_size_dt_strings(fdt)); + if (version >= 17) + printf("size_dt_struct:\t\t0x%x\n", + fdt_size_dt_struct(fdt)); + printf("\n"); + + /******************************************************************** + * Set boot cpu id + ********************************************************************/ + } else if ((argv[1][0] == 'b') && (argv[1][1] == 'o')) { + unsigned long tmp = simple_strtoul(argv[2], NULL, 16); + fdt_set_boot_cpuid_phys(fdt, tmp); + + /******************************************************************** + * memory command + ********************************************************************/ + } else if ((argv[1][0] == 'm') && (argv[1][1] == 'e') && + (argv[1][3] == 'o')) { + uint64_t addr, size; + int err; +#ifdef CFG_64BIT_STRTOUL + addr = simple_strtoull(argv[2], NULL, 16); + size = simple_strtoull(argv[3], NULL, 16); +#else + addr = simple_strtoul(argv[2], NULL, 16); + size = simple_strtoul(argv[3], NULL, 16); +#endif + err = fdt_fixup_memory(fdt, addr, size); + if (err < 0) + return err; + + /******************************************************************** + * mem reserve commands + ********************************************************************/ + } else if ((argv[1][0] == 'm') && (argv[1][1] == 'e') && + (argv[1][3] == 'r')) { + if (argv[2][0] == 'p') { + uint64_t addr, size; + int total = fdt_num_mem_rsv(fdt); + int j, err; + printf("index\t\t start\t\t size\n"); + printf("-------------------------------" + "-----------------\n"); + for (j = 0; j < total; j++) { + err = fdt_get_mem_rsv(fdt, j, &addr, &size); + if (err < 0) { + printf("libfdt fdt_get_mem_rsv(): %s\n", + fdt_strerror(err)); + return err; + } + printf(" %x\t%08x%08x\t%08x%08x\n", j, + (u32)(addr >> 32), + (u32)(addr & 0xffffffff), + (u32)(size >> 32), + (u32)(size & 0xffffffff)); + } + } else if (argv[2][0] == 'a') { + uint64_t addr, size; + int err; +#ifdef CFG_64BIT_STRTOUL + addr = simple_strtoull(argv[3], NULL, 16); + size = simple_strtoull(argv[4], NULL, 16); +#else + addr = simple_strtoul(argv[3], NULL, 16); + size = simple_strtoul(argv[4], NULL, 16); +#endif + err = fdt_add_mem_rsv(fdt, addr, size); + + if (err < 0) { + printf("libfdt fdt_add_mem_rsv(): %s\n", + fdt_strerror(err)); + return err; + } + } else if (argv[2][0] == 'd') { + unsigned long idx = simple_strtoul(argv[3], NULL, 16); + int err = fdt_del_mem_rsv(fdt, idx); + + if (err < 0) { + printf("libfdt fdt_del_mem_rsv(): %s\n", + fdt_strerror(err)); + return err; + } + } else { + /* Unrecognized command */ + printf ("Usage:\n%s\n", cmdtp->usage); + return 1; + } } #ifdef CONFIG_OF_BOARD_SETUP /* Call the board-specific fixup routine */ @@ -689,6 +794,12 @@ U_BOOT_CMD( "fdt set <path> <prop> [<val>] - Set <property> [to <val>]\n" "fdt mknode <path> <node> - Create a new node after <path>\n" "fdt rm <path> [<prop>] - Delete the node or <property>\n" + "fdt header - Display header info\n" + "fdt bootcpu <id> - Set boot cpuid\n" + "fdt memory <addr> <size> - Add/Update memory node\n" + "fdt memrsv print - Show current mem reserves\n" + "fdt memrsv add <addr> <size> - Add a mem reserve\n" + "fdt memrsv delete <index> - Delete a mem reserves\n" "fdt chosen - Add/update the /chosen branch in the tree\n" #ifdef CONFIG_OF_HAS_UBOOT_ENV "fdt env - Add/replace the /u-boot-env branch in the tree\n"

Kumar Gala wrote:
fdt header - Display header info fdt bootcpu <id> - Set boot cpuid fdt memory <addr> <size> - Add/Update memory node fdt memrsv print - Show current mem reserves fdt memrsv add <addr> <size> - Add a mem reserve fdt memrsv delete <index> - Delete a mem reserves
Signed-off-by: Kumar Gala galak@kernel.crashing.org
Cool, procrastination pays off again! :-)
common/cmd_fdt.c | 111 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 111 insertions(+), 0 deletions(-)
diff --git a/common/cmd_fdt.c b/common/cmd_fdt.c index 9cd22ee..d0f8c27 100644 --- a/common/cmd_fdt.c +++ b/common/cmd_fdt.c @@ -296,6 +296,111 @@ int do_fdt (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) return err; } }
- /********************************************************************
* Display header info
********************************************************************/
- } else if (argv[1][0] == 'h') {
u32 version = fdt_version(fdt);
printf("magic:\t\t\t0x%x\n", fdt_magic(fdt));
printf("totalsize:\t\t0x%x (%d)\n", fdt_totalsize(fdt), fdt_totalsize(fdt));
printf("off_dt_struct:\t\t0x%x\n", fdt_off_dt_struct(fdt));
printf("off_dt_strings:\t\t0x%x\n", fdt_off_dt_strings(fdt));
printf("off_mem_rsvmap:\t\t0x%x\n", fdt_off_mem_rsvmap(fdt));
printf("version:\t\t%d\n", version);
printf("last_comp_version:\t%d\n", fdt_last_comp_version(fdt));
if (version >= 2)
printf("boot_cpuid_phys:\t0x%x\n",
fdt_boot_cpuid_phys(fdt));
if (version >= 3)
printf("size_dt_strings:\t0x%x\n",
fdt_size_dt_strings(fdt));
if (version >= 17)
printf("size_dt_struct:\t\t0x%x\n",
fdt_size_dt_struct(fdt));
printf("\n");
Very nice. * I think we should add the size of the reserved map. * It would be very useful to know how much space is available in the reserved map * It would be very useful to know how much space is available in the dt_struct and dt_space space (I believe the "spare" in the blob can be used for both the dt_struct and the dt_strings, but I'm not sure, don't have time to look it up right now).
- /********************************************************************
* Set boot cpu id
********************************************************************/
- } else if ((argv[1][0] == 'b') && (argv[1][1] == 'o')) {
unsigned long tmp = simple_strtoul(argv[2], NULL, 16);
fdt_set_boot_cpuid_phys(fdt, tmp);
- /********************************************************************
* memory command
********************************************************************/
- } else if ((argv[1][0] == 'm') && (argv[1][1] == 'e') &&
(argv[1][3] == 'o')) {
Did we miss (argv[1][2] == 'm'), is the term checking (argv[1][3] == 'o') wrong, or are we trying to accommodate dyslecix people? I can picture our fearless leader typing "fdt meromy", assuming he types that many characters. :-D
uint64_t addr, size;
int err;
+#ifdef CFG_64BIT_STRTOUL
addr = simple_strtoull(argv[2], NULL, 16);
size = simple_strtoull(argv[3], NULL, 16);
+#else
addr = simple_strtoul(argv[2], NULL, 16);
size = simple_strtoul(argv[3], NULL, 16);
+#endif
err = fdt_fixup_memory(fdt, addr, size);
if (err < 0)
return err;
- /********************************************************************
* mem reserve commands
********************************************************************/
- } else if ((argv[1][0] == 'm') && (argv[1][1] == 'e') &&
(argv[1][3] == 'r')) {
Hmm, missing (argv[1][2] == 'm') again. Once is an accident, twice is by design. I take it you are skipping the argv[1][2] check since it isn't a significant character - code savings. I can accept that, although it really hurts my humor to have a logical explanation (pun intended ;-).
if (argv[2][0] == 'p') {
uint64_t addr, size;
int total = fdt_num_mem_rsv(fdt);
int j, err;
printf("index\t\t start\t\t size\n");
printf("-------------------------------"
"-----------------\n");
for (j = 0; j < total; j++) {
err = fdt_get_mem_rsv(fdt, j, &addr, &size);
if (err < 0) {
printf("libfdt fdt_get_mem_rsv(): %s\n",
fdt_strerror(err));
return err;
}
printf(" %x\t%08x%08x\t%08x%08x\n", j,
(u32)(addr >> 32),
(u32)(addr & 0xffffffff),
(u32)(size >> 32),
(u32)(size & 0xffffffff));
Trivia: If the compiler supports CFG_64BIT_STRTOUL, it /probably/ supports the "%llx" format. I ran into trouble with this originally (the compiler for my mpc8360 had problems passing a 64 bit varargs arg, IIRC). The above works in both 32bit and 64bit support cases and I personally prefer the above slightly extra work rather than Yet Another #ifdef (YA#).
}
} else if (argv[2][0] == 'a') {
uint64_t addr, size;
int err;
+#ifdef CFG_64BIT_STRTOUL
...but some are unavoidable.
addr = simple_strtoull(argv[3], NULL, 16);
size = simple_strtoull(argv[4], NULL, 16);
+#else
addr = simple_strtoul(argv[3], NULL, 16);
size = simple_strtoul(argv[4], NULL, 16);
+#endif
[snip]
#ifdef CONFIG_OF_BOARD_SETUP /* Call the board-specific fixup routine */ @@ -689,6 +794,12 @@ U_BOOT_CMD( "fdt set <path> <prop> [<val>] - Set <property> [to <val>]\n" "fdt mknode <path> <node> - Create a new node after <path>\n" "fdt rm <path> [<prop>] - Delete the node or <property>\n"
- "fdt header - Display header info\n"
- "fdt bootcpu <id> - Set boot cpuid\n"
- "fdt memory <addr> <size> - Add/Update memory node\n"
- "fdt memrsv print - Show current mem reserves\n"
- "fdt memrsv add <addr> <size> - Add a mem reserve\n"
^^^
- "fdt memrsv add <addr> <size> - Add a mem reserve\n"
It is a weakly held personal preference, but I would kill the extra spaces between add and <addr>, I don't see that it helps readability.
- "fdt memrsv delete <index> - Delete a mem reserves\n" "fdt chosen - Add/update the /chosen branch in the tree\n"
#ifdef CONFIG_OF_HAS_UBOOT_ENV "fdt env - Add/replace the /u-boot-env branch in the tree\n"
THANKS! gvb

On Feb 15, 2008, at 8:09 AM, Jerry Van Baren wrote:
Kumar Gala wrote:
fdt header - Display header info fdt bootcpu <id> - Set boot cpuid fdt memory <addr> <size> - Add/Update memory node fdt memrsv print - Show current mem reserves fdt memrsv add <addr> <size> - Add a mem reserve fdt memrsv delete <index> - Delete a mem reserves Signed-off-by: Kumar Gala galak@kernel.crashing.org
Cool, procrastination pays off again! :-)
common/cmd_fdt.c | 111 ++++++++++++++++++++++++++++++++++++++++++++ ++++++++++ 1 files changed, 111 insertions(+), 0 deletions(-) diff --git a/common/cmd_fdt.c b/common/cmd_fdt.c index 9cd22ee..d0f8c27 100644 --- a/common/cmd_fdt.c +++ b/common/cmd_fdt.c @@ -296,6 +296,111 @@ int do_fdt (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) return err; } }
- /
* Display header info
********************************************************************/
- } else if (argv[1][0] == 'h') {
u32 version = fdt_version(fdt);
printf("magic:\t\t\t0x%x\n", fdt_magic(fdt));
printf("totalsize:\t\t0x%x (%d)\n", fdt_totalsize(fdt),
fdt_totalsize(fdt));
printf("off_dt_struct:\t\t0x%x\n", fdt_off_dt_struct(fdt));
printf("off_dt_strings:\t\t0x%x\n", fdt_off_dt_strings(fdt));
printf("off_mem_rsvmap:\t\t0x%x\n", fdt_off_mem_rsvmap(fdt));
printf("version:\t\t%d\n", version);
printf("last_comp_version:\t%d\n", fdt_last_comp_version(fdt));
if (version >= 2)
printf("boot_cpuid_phys:\t0x%x\n",
fdt_boot_cpuid_phys(fdt));
if (version >= 3)
printf("size_dt_strings:\t0x%x\n",
fdt_size_dt_strings(fdt));
if (version >= 17)
printf("size_dt_struct:\t\t0x%x\n",
fdt_size_dt_struct(fdt));
printf("\n");
Very nice.
- I think we should add the size of the reserved map.
done
- It would be very useful to know how much space is available in the
reserved map
not sure how we do this.
- It would be very useful to know how much space is available in the
dt_struct and dt_space space (I believe the "spare" in the blob can be used for both the dt_struct and the dt_strings, but I'm not sure, don't have time to look it up right now).
How about I leave that as an exercise for the reader :)
- /
* Set boot cpu id
********************************************************************/
- } else if ((argv[1][0] == 'b') && (argv[1][1] == 'o')) {
unsigned long tmp = simple_strtoul(argv[2], NULL, 16);
fdt_set_boot_cpuid_phys(fdt, tmp);
- /
* memory command
********************************************************************/
- } else if ((argv[1][0] == 'm') && (argv[1][1] == 'e') &&
(argv[1][3] == 'o')) {
Did we miss (argv[1][2] == 'm'), is the term checking (argv[1][3] == 'o') wrong, or are we trying to accommodate dyslecix people? I can picture our fearless leader typing "fdt meromy", assuming he types that many characters. :-D
I was trying to be slightly smart, I can add the check for argv[1][2] == 'm'
uint64_t addr, size;
int err;
+#ifdef CFG_64BIT_STRTOUL
addr = simple_strtoull(argv[2], NULL, 16);
size = simple_strtoull(argv[3], NULL, 16);
+#else
addr = simple_strtoul(argv[2], NULL, 16);
size = simple_strtoul(argv[3], NULL, 16);
+#endif
err = fdt_fixup_memory(fdt, addr, size);
if (err < 0)
return err;
- /
* mem reserve commands
********************************************************************/
- } else if ((argv[1][0] == 'm') && (argv[1][1] == 'e') &&
(argv[1][3] == 'r')) {
Hmm, missing (argv[1][2] == 'm') again. Once is an accident, twice is by design. I take it you are skipping the argv[1][2] check since it isn't a significant character - code savings. I can accept that, although it really hurts my humor to have a logical explanation (pun intended ;-).
ditto.
if (argv[2][0] == 'p') {
uint64_t addr, size;
int total = fdt_num_mem_rsv(fdt);
int j, err;
printf("index\t\t start\t\t size\n");
printf("-------------------------------"
"-----------------\n");
for (j = 0; j < total; j++) {
err = fdt_get_mem_rsv(fdt, j, &addr, &size);
if (err < 0) {
printf("libfdt fdt_get_mem_rsv(): %s\n",
fdt_strerror(err));
return err;
}
printf(" %x\t%08x%08x\t%08x%08x\n", j,
(u32)(addr >> 32),
(u32)(addr & 0xffffffff),
(u32)(size >> 32),
(u32)(size & 0xffffffff));
Trivia: If the compiler supports CFG_64BIT_STRTOUL, it /probably/ supports the "%llx" format. I ran into trouble with this originally (the compiler for my mpc8360 had problems passing a 64 bit varargs arg, IIRC). The above works in both 32bit and 64bit support cases and I personally prefer the above slightly extra work rather than Yet Another #ifdef (YA#).
yeah, wanted less #ifdef's.
}
} else if (argv[2][0] == 'a') {
uint64_t addr, size;
int err;
+#ifdef CFG_64BIT_STRTOUL
...but some are unavoidable.
addr = simple_strtoull(argv[3], NULL, 16);
size = simple_strtoull(argv[4], NULL, 16);
+#else
addr = simple_strtoul(argv[3], NULL, 16);
size = simple_strtoul(argv[4], NULL, 16);
+#endif
[snip]
#ifdef CONFIG_OF_BOARD_SETUP /* Call the board-specific fixup routine */ @@ -689,6 +794,12 @@ U_BOOT_CMD( "fdt set <path> <prop> [<val>] - Set <property> [to <val>]\n" "fdt mknode <path> <node> - Create a new node after <path>\n" "fdt rm <path> [<prop>] - Delete the node or <property>\n"
- "fdt header - Display header info\n"
- "fdt bootcpu <id> - Set boot cpuid\n"
- "fdt memory <addr> <size> - Add/Update memory node\n"
- "fdt memrsv print - Show current mem reserves\n"
- "fdt memrsv add <addr> <size> - Add a mem reserve\n"
^^^
- "fdt memrsv add <addr> <size> - Add a mem reserve\n"
It is a weakly held personal preference, but I would kill the extra spaces between add and <addr>, I don't see that it helps readability.
will fix.
- "fdt memrsv delete <index> - Delete a mem reserves\n" "fdt chosen - Add/update the /chosen branch in the tree\n"
#ifdef CONFIG_OF_HAS_UBOOT_ENV "fdt env - Add/replace the /u-boot-env branch in the tree\n"
THANKS! gvb

fdt header - Display header info fdt bootcpu <id> - Set boot cpuid fdt memory <addr> <size> - Add/Update memory node fdt memrsv print - Show current mem reserves fdt memrsv add <addr> <size> - Add a mem reserve fdt memrsv delete <index> - Delete a mem reserves
Signed-off-by: Kumar Gala galak@kernel.crashing.org ---
fix help white space be more explicit in arg checking for "memory" vs "memrsv"
common/cmd_fdt.c | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 112 insertions(+), 0 deletions(-)
diff --git a/common/cmd_fdt.c b/common/cmd_fdt.c index 9cd22ee..fb5d663 100644 --- a/common/cmd_fdt.c +++ b/common/cmd_fdt.c @@ -296,6 +296,112 @@ int do_fdt (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) return err; } } + + /******************************************************************** + * Display header info + ********************************************************************/ + } else if (argv[1][0] == 'h') { + u32 version = fdt_version(fdt); + printf("magic:\t\t\t0x%x\n", fdt_magic(fdt)); + printf("totalsize:\t\t0x%x (%d)\n", fdt_totalsize(fdt), fdt_totalsize(fdt)); + printf("off_dt_struct:\t\t0x%x\n", fdt_off_dt_struct(fdt)); + printf("off_dt_strings:\t\t0x%x\n", fdt_off_dt_strings(fdt)); + printf("off_mem_rsvmap:\t\t0x%x\n", fdt_off_mem_rsvmap(fdt)); + printf("version:\t\t%d\n", version); + printf("last_comp_version:\t%d\n", fdt_last_comp_version(fdt)); + if (version >= 2) + printf("boot_cpuid_phys:\t0x%x\n", + fdt_boot_cpuid_phys(fdt)); + if (version >= 3) + printf("size_dt_strings:\t0x%x\n", + fdt_size_dt_strings(fdt)); + if (version >= 17) + printf("size_dt_struct:\t\t0x%x\n", + fdt_size_dt_struct(fdt)); + printf("number mem_rsv:\t\t0x%x\n", fdt_num_mem_rsv(fdt)); + printf("\n"); + + /******************************************************************** + * Set boot cpu id + ********************************************************************/ + } else if ((argv[1][0] == 'b') && (argv[1][1] == 'o')) { + unsigned long tmp = simple_strtoul(argv[2], NULL, 16); + fdt_set_boot_cpuid_phys(fdt, tmp); + + /******************************************************************** + * memory command + ********************************************************************/ + } else if ((argv[1][0] == 'm') && (argv[1][1] == 'e') && + (argv[1][2] == 'm') && (argv[1][3] == 'o')) { + uint64_t addr, size; + int err; +#ifdef CFG_64BIT_STRTOUL + addr = simple_strtoull(argv[2], NULL, 16); + size = simple_strtoull(argv[3], NULL, 16); +#else + addr = simple_strtoul(argv[2], NULL, 16); + size = simple_strtoul(argv[3], NULL, 16); +#endif + err = fdt_fixup_memory(fdt, addr, size); + if (err < 0) + return err; + + /******************************************************************** + * mem reserve commands + ********************************************************************/ + } else if ((argv[1][0] == 'm') && (argv[1][1] == 'e') && + (argv[1][2] == 'm') && (argv[1][3] == 'r')) { + if (argv[2][0] == 'p') { + uint64_t addr, size; + int total = fdt_num_mem_rsv(fdt); + int j, err; + printf("index\t\t start\t\t size\n"); + printf("-------------------------------" + "-----------------\n"); + for (j = 0; j < total; j++) { + err = fdt_get_mem_rsv(fdt, j, &addr, &size); + if (err < 0) { + printf("libfdt fdt_get_mem_rsv(): %s\n", + fdt_strerror(err)); + return err; + } + printf(" %x\t%08x%08x\t%08x%08x\n", j, + (u32)(addr >> 32), + (u32)(addr & 0xffffffff), + (u32)(size >> 32), + (u32)(size & 0xffffffff)); + } + } else if (argv[2][0] == 'a') { + uint64_t addr, size; + int err; +#ifdef CFG_64BIT_STRTOUL + addr = simple_strtoull(argv[3], NULL, 16); + size = simple_strtoull(argv[4], NULL, 16); +#else + addr = simple_strtoul(argv[3], NULL, 16); + size = simple_strtoul(argv[4], NULL, 16); +#endif + err = fdt_add_mem_rsv(fdt, addr, size); + + if (err < 0) { + printf("libfdt fdt_add_mem_rsv(): %s\n", + fdt_strerror(err)); + return err; + } + } else if (argv[2][0] == 'd') { + unsigned long idx = simple_strtoul(argv[3], NULL, 16); + int err = fdt_del_mem_rsv(fdt, idx); + + if (err < 0) { + printf("libfdt fdt_del_mem_rsv(): %s\n", + fdt_strerror(err)); + return err; + } + } else { + /* Unrecognized command */ + printf ("Usage:\n%s\n", cmdtp->usage); + return 1; + } } #ifdef CONFIG_OF_BOARD_SETUP /* Call the board-specific fixup routine */ @@ -689,6 +795,12 @@ U_BOOT_CMD( "fdt set <path> <prop> [<val>] - Set <property> [to <val>]\n" "fdt mknode <path> <node> - Create a new node after <path>\n" "fdt rm <path> [<prop>] - Delete the node or <property>\n" + "fdt header - Display header info\n" + "fdt bootcpu <id> - Set boot cpuid\n" + "fdt memory <addr> <size> - Add/Update memory node\n" + "fdt memrsv print - Show current mem reserves\n" + "fdt memrsv add <addr> <size> - Add a mem reserve\n" + "fdt memrsv delete <index> - Delete a mem reserves\n" "fdt chosen - Add/update the /chosen branch in the tree\n" #ifdef CONFIG_OF_HAS_UBOOT_ENV "fdt env - Add/replace the /u-boot-env branch in the tree\n"

Kumar Gala wrote:
fdt header - Display header info fdt bootcpu <id> - Set boot cpuid fdt memory <addr> <size> - Add/Update memory node fdt memrsv print - Show current mem reserves fdt memrsv add <addr> <size> - Add a mem reserve fdt memrsv delete <index> - Delete a mem reserves
Signed-off-by: Kumar Gala galak@kernel.crashing.org
Hi Kumar,
I was thinking about this a bit more. How about if we change the "memrsv" subcommand to "rsvmem" then we can abbreviate the commands more: fdt mo[ve] fdt me[mory] fdt rm <- would no longer be distinctive on 'r', NBD fdt rs[vmem] and save ourselves some typing.
What do you think? gvb

On Feb 15, 2008, at 3:44 PM, Jerry Van Baren wrote:
Kumar Gala wrote:
fdt header - Display header info fdt bootcpu <id> - Set boot cpuid fdt memory <addr> <size> - Add/Update memory node fdt memrsv print - Show current mem reserves fdt memrsv add <addr> <size> - Add a mem reserve fdt memrsv delete <index> - Delete a mem reserves Signed-off-by: Kumar Gala galak@kernel.crashing.org
Hi Kumar,
I was thinking about this a bit more. How about if we change the "memrsv" subcommand to "rsvmem" then we can abbreviate the commands more: fdt mo[ve] fdt me[mory] fdt rm <- would no longer be distinctive on 'r', NBD fdt rs[vmem] and save ourselves some typing.
works for me. I'll make these changes.
I don't plan on dealing with the header info you asked about (beyond reporting the number of memrsv). I've given you the framework, I'll leave it to you to figure out how to compute the values you want :)
I also have some questions about how we can "dynamically" grow the device tree so we don't have to pad the .dtb's
- k

From e76f97d16c5932d19d698e42c6376d6bbdca2ecf Mon Sep 17 00:00:00 2001
From: Kumar Gala galak@kernel.crashing.org Date: Fri, 15 Feb 2008 03:34:36 -0600 Subject: [PATCH] Add sub-commands to fdt
fdt header - Display header info fdt bootcpu <id> - Set boot cpuid fdt memory <addr> <size> - Add/Update memory node fdt rsvmem print - Show current mem reserves fdt rsvmem add <addr> <size> - Add a mem reserve fdt rsvmem delete <index> - Delete a mem reserves
Signed-off-by: Kumar Gala galak@kernel.crashing.org --- renamed memrsv to rsvmem to be unique from memory
common/cmd_fdt.c | 112 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 111 insertions(+), 1 deletions(-)
diff --git a/common/cmd_fdt.c b/common/cmd_fdt.c index 9cd22ee..c31560b 100644 --- a/common/cmd_fdt.c +++ b/common/cmd_fdt.c @@ -260,7 +260,7 @@ int do_fdt (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) /******************************************************************** * Remove a property/node ********************************************************************/ - } else if (argv[1][0] == 'r') { + } else if ((argv[1][0] == 'r') && (argv[1][1] == 'm')) { int nodeoffset; /* node offset from libfdt */ int err;
@@ -296,6 +296,110 @@ int do_fdt (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) return err; } } + + /******************************************************************** + * Display header info + ********************************************************************/ + } else if (argv[1][0] == 'h') { + u32 version = fdt_version(fdt); + printf("magic:\t\t\t0x%x\n", fdt_magic(fdt)); + printf("totalsize:\t\t0x%x (%d)\n", fdt_totalsize(fdt), fdt_totalsize(fdt)); + printf("off_dt_struct:\t\t0x%x\n", fdt_off_dt_struct(fdt)); + printf("off_dt_strings:\t\t0x%x\n", fdt_off_dt_strings(fdt)); + printf("off_mem_rsvmap:\t\t0x%x\n", fdt_off_mem_rsvmap(fdt)); + printf("version:\t\t%d\n", version); + printf("last_comp_version:\t%d\n", fdt_last_comp_version(fdt)); + if (version >= 2) + printf("boot_cpuid_phys:\t0x%x\n", + fdt_boot_cpuid_phys(fdt)); + if (version >= 3) + printf("size_dt_strings:\t0x%x\n", + fdt_size_dt_strings(fdt)); + if (version >= 17) + printf("size_dt_struct:\t\t0x%x\n", + fdt_size_dt_struct(fdt)); + printf("number mem_rsv:\t\t0x%x\n", fdt_num_mem_rsv(fdt)); + printf("\n"); + + /******************************************************************** + * Set boot cpu id + ********************************************************************/ + } else if ((argv[1][0] == 'b') && (argv[1][1] == 'o')) { + unsigned long tmp = simple_strtoul(argv[2], NULL, 16); + fdt_set_boot_cpuid_phys(fdt, tmp); + + /******************************************************************** + * memory command + ********************************************************************/ + } else if ((argv[1][0] == 'm') && (argv[1][1] == 'e')) { + uint64_t addr, size; + int err; +#ifdef CFG_64BIT_STRTOUL + addr = simple_strtoull(argv[2], NULL, 16); + size = simple_strtoull(argv[3], NULL, 16); +#else + addr = simple_strtoul(argv[2], NULL, 16); + size = simple_strtoul(argv[3], NULL, 16); +#endif + err = fdt_fixup_memory(fdt, addr, size); + if (err < 0) + return err; + + /******************************************************************** + * mem reserve commands + ********************************************************************/ + } else if ((argv[1][0] == 'r') && (argv[1][1] == 's')) { + if (argv[2][0] == 'p') { + uint64_t addr, size; + int total = fdt_num_mem_rsv(fdt); + int j, err; + printf("index\t\t start\t\t size\n"); + printf("-------------------------------" + "-----------------\n"); + for (j = 0; j < total; j++) { + err = fdt_get_mem_rsv(fdt, j, &addr, &size); + if (err < 0) { + printf("libfdt fdt_get_mem_rsv(): %s\n", + fdt_strerror(err)); + return err; + } + printf(" %x\t%08x%08x\t%08x%08x\n", j, + (u32)(addr >> 32), + (u32)(addr & 0xffffffff), + (u32)(size >> 32), + (u32)(size & 0xffffffff)); + } + } else if (argv[2][0] == 'a') { + uint64_t addr, size; + int err; +#ifdef CFG_64BIT_STRTOUL + addr = simple_strtoull(argv[3], NULL, 16); + size = simple_strtoull(argv[4], NULL, 16); +#else + addr = simple_strtoul(argv[3], NULL, 16); + size = simple_strtoul(argv[4], NULL, 16); +#endif + err = fdt_add_mem_rsv(fdt, addr, size); + + if (err < 0) { + printf("libfdt fdt_add_mem_rsv(): %s\n", + fdt_strerror(err)); + return err; + } + } else if (argv[2][0] == 'd') { + unsigned long idx = simple_strtoul(argv[3], NULL, 16); + int err = fdt_del_mem_rsv(fdt, idx); + + if (err < 0) { + printf("libfdt fdt_del_mem_rsv(): %s\n", + fdt_strerror(err)); + return err; + } + } else { + /* Unrecognized command */ + printf ("Usage:\n%s\n", cmdtp->usage); + return 1; + } } #ifdef CONFIG_OF_BOARD_SETUP /* Call the board-specific fixup routine */ @@ -689,6 +793,12 @@ U_BOOT_CMD( "fdt set <path> <prop> [<val>] - Set <property> [to <val>]\n" "fdt mknode <path> <node> - Create a new node after <path>\n" "fdt rm <path> [<prop>] - Delete the node or <property>\n" + "fdt header - Display header info\n" + "fdt bootcpu <id> - Set boot cpuid\n" + "fdt memory <addr> <size> - Add/Update memory node\n" + "fdt rsvmem print - Show current mem reserves\n" + "fdt rsvmem add <addr> <size> - Add a mem reserve\n" + "fdt rsvmem delete <index> - Delete a mem reserves\n" "fdt chosen - Add/update the /chosen branch in the tree\n" #ifdef CONFIG_OF_HAS_UBOOT_ENV "fdt env - Add/replace the /u-boot-env branch in the tree\n"

Kumar Gala wrote:
From e76f97d16c5932d19d698e42c6376d6bbdca2ecf Mon Sep 17 00:00:00 2001
From: Kumar Gala galak@kernel.crashing.org Date: Fri, 15 Feb 2008 03:34:36 -0600 Subject: [PATCH] Add sub-commands to fdt
fdt header - Display header info fdt bootcpu <id> - Set boot cpuid fdt memory <addr> <size> - Add/Update memory node fdt rsvmem print - Show current mem reserves fdt rsvmem add <addr> <size> - Add a mem reserve fdt rsvmem delete <index> - Delete a mem reserves
Signed-off-by: Kumar Gala galak@kernel.crashing.org
Applied to u-boot-fdt. Thanks.
FWIIW, I found that fdt header when the fdt address (blob) is invalid crashes my board. On the one hand, that's what you get from playing with sharp knives - I'm reluctant to inhibit the header printout if the blob is invalid, because that may be what I'm trying to find out. On the other hand, I hate to crash a board when it can be avoided.
At this point, I'm inclined to validate the magic number (only) before doing the dump.
gvb
participants (3)
-
Jerry Van Baren
-
Jerry Van Baren
-
Kumar Gala