summaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-imx/xload-esdhc.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mach-imx/xload-esdhc.c')
-rw-r--r--arch/arm/mach-imx/xload-esdhc.c43
1 files changed, 33 insertions, 10 deletions
diff --git a/arch/arm/mach-imx/xload-esdhc.c b/arch/arm/mach-imx/xload-esdhc.c
index 55d6c69299..6455cabf98 100644
--- a/arch/arm/mach-imx/xload-esdhc.c
+++ b/arch/arm/mach-imx/xload-esdhc.c
@@ -224,24 +224,47 @@ esdhc_start_image(struct esdhc *esdhc, ptrdiff_t address, ptrdiff_t entry, u32 o
{
void *buf = (void *)address;
- struct imx_flash_header_v2 *hdr = buf + offset + SZ_1K;
+ struct imx_flash_header_v2 *hdr;
int ret, len;
void __noreturn (*bb)(void);
unsigned int ofs;
+ int i, header_count = 1;
len = imx_image_size();
len = ALIGN(len, SECTOR_SIZE);
- ret = esdhc_read_blocks(esdhc, buf, offset + SZ_1K + SECTOR_SIZE);
- if (ret)
- return ret;
+ for (i = 0; i < header_count; i++) {
+ ret = esdhc_read_blocks(esdhc, buf,
+ offset + SZ_1K + SECTOR_SIZE);
+ if (ret)
+ return ret;
- if (!is_imx_flash_header_v2(hdr)) {
- pr_debug("IVT header not found on SD card. "
- "Found tag: 0x%02x length: 0x%04x version: %02x\n",
- hdr->header.tag, hdr->header.length,
- hdr->header.version);
- return -EINVAL;
+ hdr = buf + offset + SZ_1K;
+
+ if (!is_imx_flash_header_v2(hdr)) {
+ pr_debug("IVT header not found on SD card. "
+ "Found tag: 0x%02x length: 0x%04x "
+ "version: %02x\n",
+ hdr->header.tag, hdr->header.length,
+ hdr->header.version);
+ return -EINVAL;
+ }
+
+ if (IS_ENABLED(CONFIG_ARCH_IMX8MQ) &&
+ hdr->boot_data.plugin & PLUGIN_HDMI_IMAGE) {
+ /*
+ * In images that include signed HDMI
+ * firmware, first v2 header would be
+ * dedicated to that and would not contain any
+ * useful for us information. In order for us
+ * to pull the rest of the bootloader image
+ * in, we need to re-read header from SD/MMC,
+ * this time skipping anything HDMI firmware
+ * related.
+ */
+ offset += hdr->boot_data.size + hdr->header.length;
+ header_count++;
+ }
}
pr_debug("Check ok, loading image\n");