Skip to contentSkip to conversation

cmd, fdt: add subcommand "get" to fdt header

PATCH Superseded Heiko Schocher 2 participants 2 messages Nov 14, 2018

v2 of 3 Superseded Latest is v3 →

lore
Share & tools
lore
#0 lore raw

PATCH v2 1/1 cmd, fdt: add subcommand "get" to fdt header

store fdt header member with name <member> in U-Boot Environment variable with name <var>.

for example to get the total length of the fdt and store it in filesize, call:

fdt header get filesize totalsize

For membernames look into fdt header definition at scripts/dtc/libfdt/libfdt.h

---

Changes in v2:
- add obviously missing "static const char *"

  cmd/fdt.c | 40 +++++++++++++++++++++++++++++++++++++++-
  1 file changed, 39 insertions(+), 1 deletion(-)
cmd/fdt.c +39 -1
index 8a19a3fdbf..501aa7c887 100644
@@ -73,6 +73,40 @@ static int fdt_value_env_set(const void *nodep, int len, const char *var)
  	return 0;
  }
 
+static const char * const fdt_member_table[] = {
+	"magic",
+	"totalsize",
+	"off_dt_struct",
+	"off_dt_strings",
+	"off_mem_rsvmap",
+	"version",
+	"last_comp_version",
+	"boot_cpuid_phys",
+	"size_dt_strings",
+	"size_dt_struct",
+};
+
+static int fdt_get_header_value(int argc, char * const argv[])
+{
+	fdt32_t *fdtp = (fdt32_t *)working_fdt;
+	ulong val;
+	int i;
+
+	if (argv[2][0] != 'g')
+		return CMD_RET_FAILURE;
+
+	for (i = 0; i < ARRAY_SIZE(fdt_member_table); i++) {
+		if (strcmp(fdt_member_table[i], argv[4]) == 0) {
+			val = fdt32_to_cpu(*fdtp);
+			env_set_hex(argv[3], val);
+			return CMD_RET_SUCCESS;
+		}
+		fdtp++;
+	}
+
+	return CMD_RET_FAILURE;
+}
+
  /*
   * Flattened Device Tree command, see the help for parameter definitions.
   */
@@ -491,6 +525,9 @@ static int do_fdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
  	 * Display header info
  	 */
  	} else if (argv[1][0] == 'h') {
+		if (argc == 5)
+			return fdt_get_header_value(argc, argv);
+
  		u32 version = fdt_version(working_fdt);
  		printf("magic:\t\t\t0x%x\n", fdt_magic(working_fdt));
  		printf("totalsize:\t\t0x%x (%d)\n", fdt_totalsize(working_fdt),
@@ -1090,7 +1127,8 @@ static char fdt_help_text[] =
  	"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 header [get <var> <member>]     - Display header info\n"
+	"                                      get - get header member <member> and store it in <var>\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"
Signature · 7 lines
2.13.6


-- 
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-52   Fax: +49-8142-66989-80   Email: hs at denx.de
#1 lore raw

PATCH v2 1/1 cmd, fdt: add subcommand "get" to fdt header

Quoted 43 lines · Heiko Schocher

store fdt header member with name <member> in U-Boot Environment variable with name <var>.

for example to get the total length of the fdt and store it in filesize, call:

fdt header get filesize totalsize

For membernames look into fdt header definition at scripts/dtc/libfdt/libfdt.h

---

Changes in v2:
- add obviously missing "static const char *"

 cmd/fdt.c | 40 +++++++++++++++++++++++++++++++++++++++-

 1 file changed, 39 insertions(+), 1 deletion(-)
cmd/fdt.c +14 -0
index 8a19a3fdbf..501aa7c887 100644
@@ -73,6 +73,40 @@ static int fdt_value_env_set(const void *nodep, int
 len, const char *var)
      return 0;
  }
 
+static const char * const fdt_member_table[] = {
+    "magic",
+    "totalsize",
+    "off_dt_struct",
+    "off_dt_strings",
+    "off_mem_rsvmap",
+    "version",
+    "last_comp_version",
+    "boot_cpuid_phys",
+    "size_dt_strings",
+    "size_dt_struct",
+};
+
+static int fdt_get_header_value(int argc, char * const argv[])

cmd/fdt.c static int fdt_value_env_set(const void *nodep, int · line 100

Quoted 10 lines
cmd/fdt.c +10 -0
+{
+    fdt32_t *fdtp = (fdt32_t *)working_fdt;
+    ulong val;
+    int i;
+
+    if (argv[2][0] != 'g')
+        return CMD_RET_FAILURE;
+
+    for (i = 0; i < ARRAY_SIZE(fdt_member_table); i++) {
+        if (strcmp(fdt_member_table[i], argv[4]) == 0) {

if (strcmp...)
continue;

cmd/fdt.c static int fdt_value_env_set(const void *nodep, int len, const char *var) · line 100

Quoted 1 line
cmd/fdt.c +1 -0
+            val = fdt32_to_cpu(*fdtp);

You can use fdtp[i]

cmd/fdt.c static int fdt_value_env_set(const void *nodep, int len, const char *var) · line 104

Quoted 4 lines
cmd/fdt.c +4 -0
+            env_set_hex(argv[3], val);
+            return CMD_RET_SUCCESS;
+        }
+        fdtp++;

And drop this

cmd/fdt.c static int fdt_value_env_set(const void *nodep, int · line 106

Quoted 1 line
cmd/fdt.c +1 -0
+    }

Looks great otherwise

Quoted 30 lines
cmd/fdt.c +3 -0
+    return CMD_RET_FAILURE;
+}
+
  /*
   * Flattened Device Tree command, see the help for parameter definitions.

  */

cmd/fdt.c +3 -0
@@ -491,6 +525,9 @@ static int do_fdt(cmd_tbl_t *cmdtp, int flag, int
 argc, char * const argv[])
       * Display header info
       */
      } else if (argv[1][0] == 'h') {
+        if (argc == 5)
+            return fdt_get_header_value(argc, argv);
+
          u32 version = fdt_version(working_fdt);
          printf("magic:\t\t\t0x%x\n", fdt_magic(working_fdt));

         printf("totalsize:\t\t0x%x (%d)\n", fdt_totalsize(working_fdt),

cmd/fdt.c +0 -0
@@ -1090,7 +1127,8 @@ static char fdt_help_text[] =

     "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 header [get <var> <member>]     - Display header info\n" +    "                                      get - get header member <member> and store it in <var>\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"

Signature · 2 lines
Best regards,
Marek Vasut