Merge https://gitlab.denx.de/u-boot/custodians/u-boot-fsl-qoriq
authorTom Rini <trini@konsulko.com>
Thu, 3 Mar 2022 13:24:13 +0000 (08:24 -0500)
committerTom Rini <trini@konsulko.com>
Thu, 3 Mar 2022 13:24:13 +0000 (08:24 -0500)
Update and fixes for sl28, lx2, pblimage generation for some powerpc
products

14 files changed:
Makefile
arch/arm/mach-apple/board.c
board/eets/pdu001/Makefile
board/eets/pdu001/board.c
board/ste/stemmy/stemmy.c
configs/apple_m1_defconfig
configs/stemmy_defconfig
doc/mkimage.1
drivers/phy/nop-phy.c
include/configs/apple.h
tools/dumpimage.c
tools/imagetool.c
tools/imagetool.h
tools/mkimage.c

index 4d9cda7..f8f3f24 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -3,7 +3,7 @@
 VERSION = 2022
 PATCHLEVEL = 04
 SUBLEVEL =
-EXTRAVERSION = -rc2
+EXTRAVERSION = -rc3
 NAME =
 
 # *DOCUMENTATION*
index f9f8a2f..54005f3 100644 (file)
@@ -265,3 +265,36 @@ u64 get_page_table_size(void)
 {
        return SZ_256K;
 }
+
+int board_late_init(void)
+{
+       unsigned long base;
+       unsigned long top;
+       u32 status = 0;
+
+       /* Reserve 4M each for scriptaddr and pxefile_addr_r at the top of RAM
+        * at least 1M below the stack.
+        */
+       top = gd->start_addr_sp - CONFIG_STACK_SIZE - SZ_8M - SZ_1M;
+       top = ALIGN_DOWN(top, SZ_8M);
+
+       status |= env_set_hex("scriptaddr", top + SZ_4M);
+       status |= env_set_hex("pxefile_addr_r", top);
+
+       /* somewhat based on the Linux Kernel boot requirements:
+        * align by 2M and maximal FDT size 2M
+        */
+       base = ALIGN(gd->ram_base, SZ_2M);
+
+       status |= env_set_hex("fdt_addr_r", base);
+       status |= env_set_hex("kernel_addr_r", base + SZ_2M);
+       status |= env_set_hex("ramdisk_addr_r", base + SZ_128M);
+       status |= env_set_hex("loadaddr", base + SZ_2G);
+       status |= env_set_hex("kernel_comp_addr_r", base + SZ_2G - SZ_128M);
+       status |= env_set_hex("kernel_comp_size", SZ_128M);
+
+       if (status)
+               log_warning("late_init: Failed to set run time variables\n");
+
+       return 0;
+}
index a5990ce..35ea397 100644 (file)
@@ -6,8 +6,4 @@
 # SPDX-License-Identifier: GPL-2.0+
 #
 
-ifeq ($(CONFIG_$(SPL_)SKIP_LOWLEVEL_INIT),)
-obj-y  := mux.o
-endif
-
-obj-y  += board.o
+obj-y  := board.o mux.o
index 9f3cfd4..2b483da 100644 (file)
@@ -216,6 +216,36 @@ const struct dpll_params *get_dpll_ddr_params(void)
        return &dpll_ddr;
 }
 
+void set_uart_mux_conf(void)
+{
+       switch (CONFIG_CONS_INDEX) {
+               case 1: {
+                       enable_uart0_pin_mux();
+                       break;
+               }
+               case 2: {
+                       enable_uart1_pin_mux();
+                       break;
+               }
+               case 3: {
+                       enable_uart2_pin_mux();
+                       break;
+               }
+               case 4: {
+                       enable_uart3_pin_mux();
+                       break;
+               }
+               case 5: {
+                       enable_uart4_pin_mux();
+                       break;
+               }
+               case 6: {
+                       enable_uart5_pin_mux();
+                       break;
+               }
+       }
+}
+
 void set_mux_conf_regs(void)
 {
        /* done first by the ROM and afterwards by the pin controller driver */
@@ -240,6 +270,8 @@ void sdram_init(void)
 #ifdef CONFIG_DEBUG_UART
 void board_debug_uart_init(void)
 {
+       setup_early_clocks();
+
        /* done by pin controller driver if not debugging */
        enable_uart_pin_mux(CONFIG_DEBUG_UART_BASE);
 }
index 5f1150c..060d562 100644 (file)
@@ -4,6 +4,7 @@
  */
 #include <common.h>
 #include <env.h>
+#include <fdt_support.h>
 #include <init.h>
 #include <log.h>
 #include <stdlib.h>
@@ -95,6 +96,33 @@ static void parse_serial(const struct tag_serialnr *serialnr)
        env_set("serial#", serial);
 }
 
+#define SBL_BOARD "board_id="
+#define SBL_LCDTYPE "lcdtype="
+static ulong board_id = 0;
+static ulong lcdtype = 0;
+
+static void parse_cmdline(const struct tag_cmdline *cmdline)
+{
+       char *buf;
+
+       /* Export this to sbl_cmdline (secondary boot loader command line) */
+       env_set("sbl_cmdline", cmdline->cmdline);
+
+       buf = strstr(cmdline->cmdline, SBL_BOARD);
+       if (!buf)
+               return;
+       buf += strlen(SBL_BOARD);
+
+       board_id = simple_strtoul(buf, NULL, 10);
+
+       buf = strstr(cmdline->cmdline, SBL_LCDTYPE);
+       if (!buf)
+               return;
+       buf += strlen(SBL_LCDTYPE);
+
+       lcdtype = simple_strtoul(buf, NULL, 10);
+}
+
 /*
  * The downstream/vendor kernel (provided by Samsung) uses ATAGS for booting.
  * It also requires an extremely long cmdline provided by the primary bootloader
@@ -126,6 +154,9 @@ static void copy_atags(const struct tag *tags)
                if (t->hdr.tag == ATAG_SERIAL)
                        parse_serial(&t->u.serialnr);
 
+               if (t->hdr.tag == ATAG_CMDLINE)
+                       parse_cmdline(&t->u.cmdline);
+
                fw_atags_size += t->hdr.size * sizeof(u32);
        }
 
@@ -165,3 +196,287 @@ void setup_board_tags(struct tag **in_params)
        memcpy(*in_params, fw_atags_copy, fw_atags_size);
        *(u8 **)in_params += fw_atags_size;
 }
+
+/* These numbers are unique per product but not across all products */
+#define SAMSUNG_CODINA_LCD_LMS380KF01 4
+#define SAMSUNG_CODINA_LCD_S6D27A1 13
+#define SAMSUNG_SKOMER_LCD_HVA40WV1 10
+#define SAMSUNG_SKOMER_LCD_NT35512 12
+
+static void codina_patch_display(void *fdt)
+{
+       int node;
+       int ret;
+
+       node = fdt_path_offset(fdt, "/spi-gpio-0/panel");
+       if (node < 0) {
+               printf("cannot find Codina panel node\n");
+               return;
+       }
+       if (lcdtype == SAMSUNG_CODINA_LCD_LMS380KF01) {
+               ret = fdt_setprop_string(fdt, node, "compatible", "samsung,lms380kf01");
+               if (ret < 0)
+                       printf("could not set LCD compatible\n");
+               else
+                       printf("updated LCD compatible to LMS380KF01\n");
+       } else if (lcdtype == SAMSUNG_CODINA_LCD_S6D27A1) {
+               ret = fdt_setprop_string(fdt, node, "compatible", "samsung,s6d27a1");
+               if (ret < 0)
+                       printf("could not set LCD compatible\n");
+               else
+                       printf("updated LCD compatible to S6D27A1\n");
+       } else {
+               printf("unknown LCD type\n");
+       }
+}
+
+static void skomer_kyle_patch_display(void *fdt)
+{
+       int node;
+       int ret;
+
+       node = fdt_path_offset(fdt, "/soc/mcde/dsi/panel");
+       if (node < 0) {
+               printf("cannot find Skomer/Kyle panel node\n");
+               return;
+       }
+       if (lcdtype == SAMSUNG_SKOMER_LCD_HVA40WV1) {
+               ret = fdt_setprop_string(fdt, node, "compatible", "hydis,hva40wv1");
+               if (ret < 0)
+                       printf("could not set LCD compatible\n");
+               else
+                       printf("updated LCD compatible to Hydis HVA40WV1\n");
+       } else if (lcdtype == SAMSUNG_SKOMER_LCD_NT35512) {
+               /*
+                * FIXME: This panel is actually a BOE product, but we don't know
+                * the exact product name, so the compatible for the NT35512
+                * is used for the time being. The vendor drivers also call it NT35512.
+                */
+               ret = fdt_setprop_string(fdt, node, "compatible", "novatek,nt35512");
+               if (ret < 0)
+                       printf("could not set LCD compatible\n");
+               else
+                       printf("updated LCD compatible to Novatek NT35512\n");
+       } else {
+               printf("unknown LCD type\n");
+       }
+}
+
+int ft_board_setup(void *fdt, struct bd_info *bd)
+{
+       const char *str;
+       int node;
+       int ret;
+
+       printf("stemmy patch: DTB at 0x%08lx\n", (ulong)fdt);
+
+       /* Inspect FDT to see what we've got here */
+       ret = fdt_check_header(fdt);
+       if (ret < 0) {
+               printf("invalid DTB\n");
+               return ret;
+       }
+       node = fdt_path_offset(fdt, "/");
+       if (node < 0) {
+               printf("cannot find root node\n");
+               return node;
+       }
+       str = fdt_stringlist_get(fdt, node, "compatible", 0, NULL);
+       if (!str) {
+               printf("could not find board compatible\n");
+               return -1;
+       }
+
+       if (!strcmp(str, "samsung,janice")) {
+               switch(board_id) {
+               case 7:
+                       printf("Janice GT-I9070 Board Rev 0.0\n");
+                       break;
+               case 8:
+                       printf("Janice GT-I9070 Board Rev 0.1\n");
+                       break;
+               case 9:
+                       printf("Janice GT-I9070 Board Rev 0.2\n");
+                       break;
+               case 10:
+                       printf("Janice GT-I9070 Board Rev 0.3\n");
+                       break;
+               case 11:
+                       printf("Janice GT-I9070 Board Rev 0.4\n");
+                       break;
+               case 12:
+                       printf("Janice GT-I9070 Board Rev 0.5\n");
+                       break;
+               case 13:
+                       printf("Janice GT-I9070 Board Rev 0.6\n");
+                       break;
+               default:
+                       break;
+               }
+       } else if (!strcmp(str, "samsung,gavini")) {
+               switch(board_id) {
+               case 7:
+                       printf("Gavini GT-I8530 Board Rev 0.0\n");
+                       break;
+               case 8:
+                       printf("Gavini GT-I8530 Board Rev 0.0A\n");
+                       break;
+               case 9:
+                       printf("Gavini GT-I8530 Board Rev 0.0B\n");
+                       break;
+               case 10:
+                       printf("Gavini GT-I8530 Board Rev 0.0A_EMUL\n");
+                       break;
+               case 11:
+                       printf("Gavini GT-I8530 Board Rev 0.0C\n");
+                       break;
+               case 12:
+                       printf("Gavini GT-I8530 Board Rev 0.0D\n");
+                       break;
+               case 13:
+                       printf("Gavini GT-I8530 Board Rev 0.1\n");
+                       break;
+               case 14:
+                       printf("Gavini GT-I8530 Board Rev 0.3\n");
+                       break;
+               default:
+                       break;
+               }
+       } else if (!strcmp(str, "samsung,codina")) {
+               switch(board_id) {
+               case 7:
+                       printf("Codina GT-I8160 Board Rev 0.0\n");
+                       break;
+               case 8:
+                       printf("Codina GT-I8160 Board Rev 0.1\n");
+                       break;
+               case 9:
+                       printf("Codina GT-I8160 Board Rev 0.2\n");
+                       break;
+               case 10:
+                       printf("Codina GT-I8160 Board Rev 0.3\n");
+                       break;
+               case 11:
+                       printf("Codina GT-I8160 Board Rev 0.4\n");
+                       break;
+               case 12:
+                       printf("Codina GT-I8160 Board Rev 0.5\n");
+                       break;
+               default:
+                       break;
+               }
+               codina_patch_display(fdt);
+       } else if (!strcmp(str, "samsung,codina-tmo")) {
+               switch(board_id) {
+               case 0x101:
+                       printf("Codina SGH-T599 Board pre-Rev 0.0\n");
+                       break;
+               case 0x102:
+                       printf("Codina SGH-T599 Board Rev 0.0\n");
+                       break;
+               case 0x103:
+                       printf("Codina SGH-T599 Board Rev 0.1\n");
+                       break;
+               case 0x104:
+                       printf("Codina SGH-T599 Board Rev 0.2\n");
+                       break;
+               case 0x105:
+                       printf("Codina SGH-T599 Board Rev 0.4\n");
+                       break;
+               case 0x106:
+                       printf("Codina SGH-T599 Board Rev 0.6\n");
+                       break;
+               case 0x107:
+                       printf("Codina SGH-T599 Board Rev 0.7\n");
+                       break;
+               default:
+                       break;
+               }
+               codina_patch_display(fdt);
+       } else if (!strcmp(str, "samsung,golden")) {
+               switch(board_id) {
+               case 0x102:
+                       printf("Golden GT-I8190 Board SW bringup\n");
+                       break;
+               case 0x103:
+                       printf("Golden GT-I8190 Board Rev 0.2\n");
+                       break;
+               case 0x104:
+                       printf("Golden GT-I8190 Board Rev 0.3\n");
+                       break;
+               case 0x105:
+                       printf("Golden GT-I8190 Board Rev 0.4\n");
+                       break;
+               case 0x106:
+                       printf("Golden GT-I8190 Board Rev 0.5\n");
+                       break;
+               case 0x107:
+                       printf("Golden GT-I8190 Board Rev 0.6\n");
+                       break;
+               default:
+                       break;
+               }
+       } else if (!strcmp(str, "samsung,skomer")) {
+               switch(board_id) {
+               case 0x101:
+                       printf("Skomer GT-S7710 Board Rev 0.0\n");
+                       break;
+               case 0x102:
+                       printf("Skomer GT-S7710 Board Rev 0.1\n");
+                       break;
+               case 0x103:
+                       printf("Skomer GT-S7710 Board Rev 0.2\n");
+                       break;
+               case 0x104:
+                       printf("Skomer GT-S7710 Board Rev 0.3\n");
+                       break;
+               case 0x105:
+                       printf("Skomer GT-S7710 Board Rev 0.4\n");
+                       break;
+               case 0x106:
+                       printf("Skomer GT-S7710 Board Rev 0.5\n");
+                       break;
+               case 0x107:
+                       printf("Skomer GT-S7710 Board Rev 0.6\n");
+                       break;
+               case 0x108:
+                       printf("Skomer GT-S7710 Board Rev 0.7\n");
+                       break;
+               case 0x109:
+                       printf("Skomer GT-S7710 Board Rev 0.8\n");
+                       break;
+               default:
+                       break;
+               }
+               skomer_kyle_patch_display(fdt);
+       } else if (!strcmp(str, "samsung,kyle")) {
+               switch(board_id) {
+               case 0x101:
+                       printf("Kyle SGH-I407 Board Rev 0.0\n");
+                       break;
+               case 0x102:
+                       printf("Kyle SGH-I407 Board Rev 0.1\n");
+                       break;
+               case 0x103:
+                       printf("Kyle SGH-I407 Board Rev 0.2\n");
+                       break;
+               case 0x104:
+                       printf("Kyle SGH-I407 Board Rev 0.3\n");
+                       break;
+               case 0x105:
+                       printf("Kyle SGH-I407 Board Rev 0.4\n");
+                       break;
+               case 0x106:
+                       printf("Kyle SGH-I407 Board Rev 0.5\n");
+                       break;
+               case 0x107:
+                       printf("Kyle SGH-I407 Board Rev 0.6\n");
+                       break;
+               default:
+                       break;
+               }
+               skomer_kyle_patch_display(fdt);
+       }
+
+       return 0;
+}
index 9254e24..360ec3f 100644 (file)
@@ -3,10 +3,11 @@ CONFIG_ARCH_APPLE=y
 CONFIG_DEFAULT_DEVICE_TREE="t8103-j274"
 CONFIG_DEBUG_UART_BASE=0x235200000
 CONFIG_DEBUG_UART_CLOCK=24000000
-CONFIG_SYS_LOAD_ADDR=0x880000000
+CONFIG_SYS_LOAD_ADDR=0x0
 CONFIG_USE_PREBOOT=y
 # CONFIG_DISPLAY_CPUINFO is not set
 CONFIG_DISPLAY_BOARDINFO_LATE=y
+CONFIG_BOARD_LATE_INIT=y
 # CONFIG_NET is not set
 CONFIG_APPLE_SPI_KEYB=y
 # CONFIG_MMC is not set
index ea43cb6..c02db99 100644 (file)
@@ -36,3 +36,5 @@ CONFIG_DM_VIDEO=y
 CONFIG_SYS_WHITE_ON_BLACK=y
 CONFIG_VIDEO_MCDE_SIMPLE=y
 # CONFIG_EFI_LOADER is not set
+CONFIG_OF_BOARD_SETUP=y
+CONFIG_OF_LIBFDT=y
index fc84cca..2870062 100644 (file)
@@ -1,10 +1,10 @@
-.TH MKIMAGE 1 "2010-05-16"
+.TH MKIMAGE 1 "2022-02-07"
 
 .SH NAME
 mkimage \- Generate image for U-Boot
 .SH SYNOPSIS
 .B mkimage
-.RB "\-l [" "uimage file name" "]"
+.RB [ \-T " \fItype\fP] " \-l " [\fIuimage file name\fP]"
 
 .B mkimage
 .RB [\fIoptions\fP] " \-f [" "image tree source file" "]" " [" "uimage file name" "]"
@@ -47,6 +47,12 @@ supports verified boot.
 .BI "\-l [" "uimage file name" "]"
 mkimage lists the information contained in the header of an existing U-Boot image.
 
+.TP
+.BI "\-T [" "image type" "]"
+Parse image file as type.
+Pass \-h as the image to see the list of supported image type.
+Without this option image type is autodetected.
+
 .P
 .B Create old legacy image:
 
index e2ee6e9..d0904f4 100644 (file)
@@ -45,11 +45,13 @@ static int nop_phy_init(struct phy *phy)
 
 #if CONFIG_IS_ENABLED(DM_GPIO)
        /* Take phy out of reset */
-       ret = dm_gpio_set_value(&priv->reset_gpio, false);
-       if (ret) {
-               if (CONFIG_IS_ENABLED(CLK))
-                       clk_disable_bulk(&priv->bulk);
-               return ret;
+       if (dm_gpio_is_valid(&priv->reset_gpio)) {
+               ret = dm_gpio_set_value(&priv->reset_gpio, false);
+               if (ret) {
+                       if (CONFIG_IS_ENABLED(CLK))
+                               clk_disable_bulk(&priv->bulk);
+                       return ret;
+               }
        }
 #endif
        return 0;
index f12e9bd..b06660a 100644 (file)
@@ -9,10 +9,6 @@
        "stdout=serial,vidconsole\0" \
        "stderr=serial,vidconsole\0"
 
-#define ENV_MEM_LAYOUT_SETTINGS \
-       "fdt_addr_r=0x960100000\0" \
-       "kernel_addr_r=0x960200000\0"
-
 #if CONFIG_IS_ENABLED(CMD_NVME)
        #define BOOT_TARGET_NVME(func) func(NVME, nvme, 0)
 #else
@@ -33,7 +29,6 @@
 
 #define CONFIG_EXTRA_ENV_SETTINGS \
        ENV_DEVICE_SETTINGS \
-       ENV_MEM_LAYOUT_SETTINGS \
        BOOTENV
 
 #endif
index e548143..4791dd0 100644 (file)
@@ -12,9 +12,7 @@
 static void usage(void);
 
 /* parameters initialized by core will be used by the image type code */
-static struct image_tool_params params = {
-       .type = IH_TYPE_KERNEL,
-};
+static struct image_tool_params params;
 
 /*
  * dumpimage_extract_subimage -
@@ -110,7 +108,7 @@ int main(int argc, char **argv)
                }
        }
 
-       if (argc < 2)
+       if (argc < 2 || (params.iflag && params.lflag))
                usage();
 
        if (optind >= argc) {
@@ -122,7 +120,7 @@ int main(int argc, char **argv)
 
        /* set tparams as per input type_id */
        tparams = imagetool_get_type(params.type);
-       if (tparams == NULL) {
+       if (!params.lflag && tparams == NULL) {
                fprintf(stderr, "%s: unsupported type: %s\n",
                        params.cmdname, genimg_get_type_name(params.type));
                exit(EXIT_FAILURE);
@@ -132,7 +130,7 @@ int main(int argc, char **argv)
         * check the passed arguments parameters meets the requirements
         * as per image type to be generated/listed
         */
-       if (tparams->check_params) {
+       if (tparams && tparams->check_params) {
                if (tparams->check_params(&params)) {
                        fprintf(stderr, "%s: Parameter check failed\n",
                                params.cmdname);
@@ -159,7 +157,7 @@ int main(int argc, char **argv)
                exit(EXIT_FAILURE);
        }
 
-       if ((uint32_t)sbuf.st_size < tparams->header_size) {
+       if (tparams && (uint32_t)sbuf.st_size < tparams->header_size) {
                fprintf(stderr, "%s: Bad size: \"%s\" is not valid image\n",
                        params.cmdname, params.imagefile);
                exit(EXIT_FAILURE);
@@ -203,8 +201,9 @@ int main(int argc, char **argv)
 
 static void usage(void)
 {
-       fprintf(stderr, "Usage: %s -l image\n"
-               "          -l ==> list image header information\n",
+       fprintf(stderr, "Usage: %s [-T type] -l image\n"
+               "          -l ==> list image header information\n"
+               "          -T ==> parse image file as 'type'\n",
                params.cmdname);
        fprintf(stderr,
                "       %s [-T type] [-p position] [-o outfile] image\n"
index ba1f64a..5ad6d74 100644 (file)
@@ -26,6 +26,12 @@ struct image_type_params *imagetool_get_type(int type)
        return NULL;
 }
 
+static int imagetool_verify_print_header_by_type(
+       void *ptr,
+       struct stat *sbuf,
+       struct image_type_params *tparams,
+       struct image_tool_params *params);
+
 int imagetool_verify_print_header(
        void *ptr,
        struct stat *sbuf,
@@ -39,6 +45,9 @@ int imagetool_verify_print_header(
        struct image_type_params **start = __start_image_type;
        struct image_type_params **end = __stop_image_type;
 
+       if (tparams)
+               return imagetool_verify_print_header_by_type(ptr, sbuf, tparams, params);
+
        for (curr = start; curr != end; curr++) {
                if ((*curr)->verify_header) {
                        retval = (*curr)->verify_header((unsigned char *)ptr,
@@ -65,7 +74,7 @@ int imagetool_verify_print_header(
        return retval;
 }
 
-int imagetool_verify_print_header_by_type(
+static int imagetool_verify_print_header_by_type(
        void *ptr,
        struct stat *sbuf,
        struct image_type_params *tparams,
index c3f80fc..5169b02 100644 (file)
@@ -178,33 +178,19 @@ struct image_type_params *imagetool_get_type(int type);
 /*
  * imagetool_verify_print_header() - verifies the image header
  *
- * Scan registered image types and verify the image_header for each
- * supported image type. If verification is successful, this prints
- * the respective header.
- *
- * Return: 0 on success, negative if input image format does not match with
- * any of supported image types
- */
-int imagetool_verify_print_header(
-       void *ptr,
-       struct stat *sbuf,
-       struct image_type_params *tparams,
-       struct image_tool_params *params);
-
-/*
- * imagetool_verify_print_header_by_type() - verifies the image header
- *
  * Verify the image_header for the image type given by tparams.
+ * If tparams is NULL then scan registered image types and verify the
+ * image_header for each supported image type.
  * If verification is successful, this prints the respective header.
  * @ptr: pointer the the image header
  * @sbuf: stat information about the file pointed to by ptr
- * @tparams: image type parameters
+ * @tparams: image type parameters or NULL
  * @params: mkimage parameters
  *
  * Return: 0 on success, negative if input image format does not match with
  * the given image type
  */
-int imagetool_verify_print_header_by_type(
+int imagetool_verify_print_header(
        void *ptr,
        struct stat *sbuf,
        struct image_type_params *tparams,
index c8f4ecd..7601451 100644 (file)
@@ -82,8 +82,9 @@ static int show_valid_options(enum ih_category category)
 static void usage(const char *msg)
 {
        fprintf(stderr, "Error: %s\n", msg);
-       fprintf(stderr, "Usage: %s -l image\n"
-                        "          -l ==> list image header information\n",
+       fprintf(stderr, "Usage: %s [-T type] -l image\n"
+                        "          -l ==> list image header information\n"
+                        "          -T ==> parse image file as 'type'\n",
                params.cmdname);
        fprintf(stderr,
                "       %s [-x] -A arch -O os -T type -C comp -a addr -e ep -n name -d data_file[:data_file...] image\n"
@@ -329,7 +330,7 @@ static void process_args(int argc, char **argv)
                        params.datafile = datafile;
                else if (!params.datafile)
                        usage("Missing data file for auto-FIT (use -d)");
-       } else if (type != IH_TYPE_INVALID) {
+       } else if (params.lflag || type != IH_TYPE_INVALID) {
                if (type == IH_TYPE_SCRIPT && !params.datafile)
                        usage("Missing data file for script (use -d)");
                params.type = type;
@@ -358,7 +359,7 @@ int main(int argc, char **argv)
 
        /* set tparams as per input type_id */
        tparams = imagetool_get_type(params.type);
-       if (tparams == NULL) {
+       if (tparams == NULL && !params.lflag) {
                fprintf (stderr, "%s: unsupported type %s\n",
                        params.cmdname, genimg_get_type_name(params.type));
                exit (EXIT_FAILURE);
@@ -368,14 +369,14 @@ int main(int argc, char **argv)
         * check the passed arguments parameters meets the requirements
         * as per image type to be generated/listed
         */
-       if (tparams->check_params)
+       if (tparams && tparams->check_params)
                if (tparams->check_params (&params))
                        usage("Bad parameters for image type");
 
        if (!params.eflag) {
                params.ep = params.addr;
                /* If XIP, entry point must be after the U-Boot header */
-               if (params.xflag)
+               if (params.xflag && tparams)
                        params.ep += tparams->header_size;
        }
 
@@ -436,7 +437,7 @@ int main(int argc, char **argv)
                                params.cmdname, params.imagefile);
                        exit (EXIT_FAILURE);
 #endif
-               } else if (sbuf.st_size < (off_t)tparams->header_size) {
+               } else if (tparams && sbuf.st_size < (off_t)tparams->header_size) {
                        fprintf (stderr,
                                "%s: Bad size: \"%s\" is not valid image: size %llu < %u\n",
                                params.cmdname, params.imagefile,
@@ -455,21 +456,12 @@ int main(int argc, char **argv)
                        exit (EXIT_FAILURE);
                }
 
-               if (params.fflag) {
-                       /*
-                        * Verifies the header format based on the expected header for image
-                        * type in tparams
-                        */
-                       retval = imagetool_verify_print_header_by_type(ptr, &sbuf,
-                                       tparams, &params);
-               } else {
-                       /**
-                        * When listing the image, we are not given the image type. Simply check all
-                        * image types to find one that matches our header
-                        */
-                       retval = imagetool_verify_print_header(ptr, &sbuf,
-                                       tparams, &params);
-               }
+               /*
+                * Verifies the header format based on the expected header for image
+                * type in tparams. If tparams is NULL simply check all image types
+                * to find one that matches our header.
+                */
+               retval = imagetool_verify_print_header(ptr, &sbuf, tparams, &params);
 
                (void) munmap((void *)ptr, sbuf.st_size);
                (void) close (ifd);