[PATCH] fdt: Add -q option to fdt addr for distro_bootcmd

Peter Hoyes peter.hoyes at arm.com
Thu Mar 31 12:53:22 CEST 2022


From: Peter Hoyes <Peter.Hoyes at arm.com>

distro_bootcmd uses this construct a few times to test $fdt_addr_r,
and fall back on $fdtcontroladdr if not set/invalid:

    if fdt addr ${fdt_addr_r}; then
        ...
    else
        ...
    fi

If the `fdt addr` test fails, it prints the following  message on the
console, suggesting there is an error when there is not:

    libfdt fdt_check_header(): FDT_ERR_BADMAGIC

To remove this potentially confusing error message, this patch adds -q
as a 'quiet' option for fdt addr, and uses this flag in
config_distro_bootcmd.h

Signed-off-by: Peter Hoyes <Peter.Hoyes at arm.com>
---
 cmd/fdt.c                       | 30 +++++++++++++++++++++++-------
 include/config_distro_bootcmd.h |  6 +++---
 2 files changed, 26 insertions(+), 10 deletions(-)

diff --git a/cmd/fdt.c b/cmd/fdt.c
index 2a207bf2b5..fc2fddfb3c 100644
--- a/cmd/fdt.c
+++ b/cmd/fdt.c
@@ -119,13 +119,27 @@ static int do_fdt(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
 	if (strncmp(argv[1], "ad", 2) == 0) {
 		unsigned long addr;
 		int control = 0;
+		int quiet = 0;
 		struct fdt_header *blob;
 
 		/* Set the address [and length] of the fdt */
 		argc -= 2;
 		argv += 2;
-		if (argc && !strcmp(*argv, "-c")) {
-			control = 1;
+		while (argc > 0 && **argv == '-') {
+			char *arg = *argv;
+
+			while (*++arg) {
+				switch (*arg) {
+				case 'c':
+					control = 1;
+					break;
+				case 'q':
+					quiet = 1;
+					break;
+				default:
+					return CMD_RET_USAGE;
+				}
+			}
 			argc--;
 			argv++;
 		}
@@ -145,7 +159,8 @@ static int do_fdt(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
 
 		addr = hextoul(argv[0], NULL);
 		blob = map_sysmem(addr, 0);
-		if (!fdt_valid(&blob))
+		if ((quiet && fdt_check_header(blob)) ||
+		    (!quiet && !fdt_valid(&blob)))
 			return 1;
 		if (control)
 			gd->fdt_blob = blob;
@@ -159,12 +174,13 @@ static int do_fdt(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
 			/* 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));
+				if (!quiet)
+					printf("New length %d < existing length %d, ignoring\n",
+					       len, fdt_totalsize(blob));
 			} else {
 				/* Open in place with a new length */
 				err = fdt_open_into(blob, blob, len);
-				if (err != 0) {
+				if (!quiet && err != 0) {
 					printf("libfdt fdt_open_into(): %s\n",
 					       fdt_strerror(err));
 				}
@@ -1055,7 +1071,7 @@ static int fdt_print(const char *pathp, char *prop, int depth)
 /********************************************************************/
 #ifdef CONFIG_SYS_LONGHELP
 static char fdt_help_text[] =
-	"addr [-c]  <addr> [<length>]   - Set the [control] fdt location to <addr>\n"
+	"addr [-cq]  <addr> [<length>]   - Set the [control] fdt location to <addr>\n"
 #ifdef CONFIG_OF_LIBFDT_OVERLAY
 	"fdt apply <addr>                    - Apply overlay to the DT\n"
 #endif
diff --git a/include/config_distro_bootcmd.h b/include/config_distro_bootcmd.h
index 2f90929178..c55023889c 100644
--- a/include/config_distro_bootcmd.h
+++ b/include/config_distro_bootcmd.h
@@ -126,7 +126,7 @@
 #ifdef CONFIG_CMD_BOOTEFI_BOOTMGR
 #define BOOTENV_EFI_BOOTMGR                                               \
 	"boot_efi_bootmgr="                                               \
-		"if fdt addr ${fdt_addr_r}; then "                        \
+		"if fdt addr -q ${fdt_addr_r}; then "                     \
 			"bootefi bootmgr ${fdt_addr_r};"                  \
 		"else "                                                   \
 			"bootefi bootmgr;"                                \
@@ -141,7 +141,7 @@
 	"boot_efi_binary="                                                \
 		"load ${devtype} ${devnum}:${distro_bootpart} "           \
 			"${kernel_addr_r} efi/boot/"BOOTEFI_NAME"; "      \
-		"if fdt addr ${fdt_addr_r}; then "                        \
+		"if fdt addr -q ${fdt_addr_r}; then "                     \
 			"bootefi ${kernel_addr_r} ${fdt_addr_r};"         \
 		"else "                                                   \
 			"bootefi ${kernel_addr_r} ${fdtcontroladdr};"     \
@@ -360,7 +360,7 @@
 	"setenv bootp_arch " BOOTENV_EFI_PXE_ARCH ";"                     \
 	"if dhcp ${kernel_addr_r}; then "                                 \
 		"tftpboot ${fdt_addr_r} dtb/${efi_fdtfile};"              \
-		"if fdt addr ${fdt_addr_r}; then "                        \
+		"if fdt addr -q ${fdt_addr_r}; then "                     \
 			"bootefi ${kernel_addr_r} ${fdt_addr_r}; "        \
 		"else "                                                   \
 			"bootefi ${kernel_addr_r} ${fdtcontroladdr};"     \
-- 
2.25.1



More information about the U-Boot mailing list