fdt: Add -q option to fdt addr for distro_bootcmd
authorPeter Hoyes <Peter.Hoyes@arm.com>
Thu, 31 Mar 2022 10:53:22 +0000 (11:53 +0100)
committerTom Rini <trini@konsulko.com>
Fri, 22 Apr 2022 19:44:10 +0000 (15:44 -0400)
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@arm.com>
cmd/fdt.c
include/config_distro_bootcmd.h

index 7d7cae8..c07342c 100644 (file)
--- 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
index 2f90929..c550238 100644 (file)
 #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;"                                \
        "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};"     \
        "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};"     \