[PATCH 07/15] imx8mq: Correct signed_hdmi firmware position

Peng Fan (OSS) peng.fan at oss.nxp.com
Tue Apr 21 15:41:19 CEST 2026


From: Peng Fan <peng.fan at nxp.com>

signed_hdmi_imx8m.bin is already signed and has a IVT header. It should not
be put in u-boot-spl-mkimage.signed.bin. Move it to head of flash.bin
following NXP imx-mkimage. Keeping it in u-boot-spl-mkimage.signed.bin also
consumes a lot of TCM space which is not expected.

While moving it to head of flash.bin, other changes are required,
u-boot.itb is put at sector 768 per defconfig, so u-boot.itb binman
offset should be updated and it should be moved out from binman section.

Also binman symbol address are updated, so need to subtract u-boot-spl
image_pos + CONFIG_SPL_TEXT_BASE to find the correct location of ddr phy
firmware.

Because there is 1KB padding in HDMI firmware, use 32KB when burning
flash.bin to sd card.

Signed-off-by: Peng Fan <peng.fan at nxp.com>
---
 arch/arm/dts/imx8mq-librem5-r4-u-boot.dtsi |   2 +-
 arch/arm/dts/imx8mq-u-boot.dtsi            | 240 ++++++++++++++++-------------
 doc/board/nxp/imx8mq_evk.rst               |   4 +-
 drivers/ddr/imx/phy/helper.c               |  13 ++
 4 files changed, 148 insertions(+), 111 deletions(-)

diff --git a/arch/arm/dts/imx8mq-librem5-r4-u-boot.dtsi b/arch/arm/dts/imx8mq-librem5-r4-u-boot.dtsi
index 98da015a444..4d326040c0a 100644
--- a/arch/arm/dts/imx8mq-librem5-r4-u-boot.dtsi
+++ b/arch/arm/dts/imx8mq-librem5-r4-u-boot.dtsi
@@ -10,7 +10,7 @@
 	bootph-pre-ram;
 };
 
-&binman_imx_spl {
+&binman {
 	section {
 		signed-hdmi-imx8m {
 			filename = "signed_dp_imx8m.bin";
diff --git a/arch/arm/dts/imx8mq-u-boot.dtsi b/arch/arm/dts/imx8mq-u-boot.dtsi
index 0687fcdbd68..ed2c704f2e5 100644
--- a/arch/arm/dts/imx8mq-u-boot.dtsi
+++ b/arch/arm/dts/imx8mq-u-boot.dtsi
@@ -41,6 +41,33 @@
 	filename = "flash.bin";
 	section {
 		pad-byte = <0x00>;
+		/*
+		 * signed_hdmi_imx8m.bin contains a 1KB zero-filled padding at
+		 * its beginning. This padding has no functional purpose, but
+		 * the firmware is provided and signed by NXP, so the head
+		 * must be preserved and should not be removed.
+		 *
+		 * When the signed HDMI firmware is placed at the beginning of
+		 * flash.bin, the IVT header of u-boot-spl must still reside at
+		 * a 4KB-aligned address. Since flash.bin starts with the HDMI
+		 * firmware (including its 1KB padding), there is already a 1KB
+		 * empty region at the head of flash.bin.
+		 *
+		 * The required 4KB alignment is therefore calculated relative
+		 * to the location after this 1KB padding. To achieve this, we
+		 * explicitly set align and align-size to 0x1000, and add an
+		 * additional 0x400 (1KB) fill to account for the padding.
+		 */
+		signed-hdmi-imx8m {
+			filename = "signed_hdmi_imx8m.bin";
+			type = "blob-ext";
+			align = <0x1000>;
+			align-size = <0x1000>;
+		};
+
+		fill {
+			size = <0x400>;
+		};
 
 #ifdef CONFIG_IMX_HAB
 		nxp-imx8mcst at 0 {
@@ -51,145 +78,142 @@
 #endif
 
 			binman_imx_spl: nxp-imx8mimage {
-				filename = "u-boot-spl-mkimage.bin";
-				nxp,boot-from = "sd";
-				nxp,rom-version = <1>;
-				nxp,loader-address = <CONFIG_SPL_TEXT_BASE>;
-				args;	/* Needed by mkimage etype superclass */
-
-				section {
-					align = <4>;
-					align-size = <4>;
-					filename = "u-boot-spl-ddr.bin";
-					pad-byte = <0xff>;
-
-					u-boot-spl {
-						align-end = <4>;
-						filename = "u-boot-spl.bin";
-					};
+			filename = "u-boot-spl-mkimage.bin";
+			nxp,boot-from = "sd";
+			nxp,rom-version = <1>;
+			nxp,loader-address = <CONFIG_SPL_TEXT_BASE>;
+			args;	/* Needed by mkimage etype superclass */
 
-					ddr-1d-imem-fw {
-						filename = "lpddr4_pmu_train_1d_imem.bin";
-						align-end = <4>;
-						type = "blob-ext";
-					};
+			section {
+				align = <4>;
+				align-size = <4>;
+				filename = "u-boot-spl-ddr.bin";
+				pad-byte = <0xff>;
 
-					ddr-1d-dmem-fw {
-						filename = "lpddr4_pmu_train_1d_dmem.bin";
-						align-end = <4>;
-						type = "blob-ext";
-					};
+				u-boot-spl {
+					align-end = <4>;
+					filename = "u-boot-spl.bin";
+				};
 
-					ddr-2d-imem-fw {
-						filename = "lpddr4_pmu_train_2d_imem.bin";
-						align-end = <4>;
-						type = "blob-ext";
-					};
+				ddr-1d-imem-fw {
+					filename = "lpddr4_pmu_train_1d_imem.bin";
+					align-end = <4>;
+					type = "blob-ext";
+				};
 
-					ddr-2d-dmem-fw {
-						filename = "lpddr4_pmu_train_2d_dmem.bin";
-						align-end = <4>;
-						type = "blob-ext";
-					};
+				ddr-1d-dmem-fw {
+					filename = "lpddr4_pmu_train_1d_dmem.bin";
+					align-end = <4>;
+					type = "blob-ext";
+				};
 
-					signed-hdmi-imx8m {
-						filename = "signed_hdmi_imx8m.bin";
-						type = "blob-ext";
-					};
+				ddr-2d-imem-fw {
+					filename = "lpddr4_pmu_train_2d_imem.bin";
+					align-end = <4>;
+					type = "blob-ext";
+				};
+
+				ddr-2d-dmem-fw {
+					filename = "lpddr4_pmu_train_2d_dmem.bin";
+					align-end = <4>;
+					type = "blob-ext";
 				};
 			};
+		};
 #ifdef CONFIG_IMX_HAB
 		};
+#endif
+	};
 
-		nxp-imx8mcst at 1 {
-			filename = "u-boot-fit.signed.bin";
-			nxp,loader-address = <CONFIG_SPL_LOAD_FIT_ADDRESS>;
-			offset = <0x58000>;
-			args;	/* Needed by mkimage etype superclass */
+#ifdef CONFIG_IMX_HAB
+	nxp-imx8mcst at 1 {
+		filename = "u-boot-fit.signed.bin";
+		nxp,loader-address = <CONFIG_SPL_LOAD_FIT_ADDRESS>;
+		offset = <0x58400>;
+		args;	/* Needed by mkimage etype superclass */
 #endif
 
-			binman_imx_fit: fit {
-				description = "Configuration to load ATF before U-Boot";
-				filename = "u-boot.itb";
+		binman_imx_fit: fit {
+			description = "Configuration to load ATF before U-Boot";
+			filename = "u-boot.itb";
 #ifndef CONFIG_IMX_HAB
-				fit,external-offset = <CONFIG_FIT_EXTERNAL_OFFSET>;
+			fit,external-offset = <CONFIG_FIT_EXTERNAL_OFFSET>;
 #endif
-				#address-cells = <1>;
-
-				offset = <0x57c00>;
-
-				images {
-					uboot {
-						arch = "arm64";
-						compression = "none";
-						description = "U-Boot (64-bit)";
-						load = <CONFIG_TEXT_BASE>;
-						type = "standalone";
-
-						uboot-blob {
-							filename = "u-boot-nodtb.bin";
-							type = "blob-ext";
-						};
+			#address-cells = <1>;
+
+			offset = <0x58000>;
+
+			images {
+				uboot {
+					arch = "arm64";
+					compression = "none";
+					description = "U-Boot (64-bit)";
+					load = <CONFIG_TEXT_BASE>;
+					type = "standalone";
+
+					uboot-blob {
+						filename = "u-boot-nodtb.bin";
+						type = "blob-ext";
 					};
+				};
 
 #ifndef CONFIG_ARMV8_PSCI
-					atf {
-						arch = "arm64";
-						compression = "none";
-						description = "ARM Trusted Firmware";
-						entry = <0x910000>;
-						load = <0x910000>;
-						type = "firmware";
-
-						atf-blob {
-							filename = "bl31.bin";
-							type = "blob-ext";
-						};
+				atf {
+					arch = "arm64";
+					compression = "none";
+					description = "ARM Trusted Firmware";
+					entry = <0x910000>;
+					load = <0x910000>;
+					type = "firmware";
+
+					atf-blob {
+						filename = "bl31.bin";
+						type = "blob-ext";
 					};
+				};
 #endif
 
-					tee: tee {
-						description = "OP-TEE";
-						type = "tee";
-						arch = "arm64";
-						compression = "none";
-						os = "tee";
-						load = <CONFIG_IMX8M_OPTEE_LOAD_ADDR>;
-						entry = <CONFIG_IMX8M_OPTEE_LOAD_ADDR>;
-
-						tee-os {
-							filename = "tee.bin";
-							optional;
-						};
+				tee: tee {
+					description = "OP-TEE";
+					type = "tee";
+					arch = "arm64";
+					compression = "none";
+					os = "tee";
+					load = <CONFIG_IMX8M_OPTEE_LOAD_ADDR>;
+					entry = <CONFIG_IMX8M_OPTEE_LOAD_ADDR>;
+
+					tee-os {
+						filename = "tee.bin";
+						optional;
 					};
+				};
 
-					fdt {
-						compression = "none";
-						description = "NAME";
-						type = "flat_dt";
+				fdt {
+					compression = "none";
+					description = "NAME";
+					type = "flat_dt";
 
-						uboot-fdt-blob {
-							filename = "u-boot.dtb";
-							type = "blob-ext";
-						};
+					uboot-fdt-blob {
+						filename = "u-boot.dtb";
+						type = "blob-ext";
 					};
 				};
+			};
 
-				configurations {
-					default = "conf";
+			configurations {
+				default = "conf";
 
-					conf {
-						description = "NAME";
-						fdt = "fdt";
-						firmware = "uboot";
+				conf {
+					description = "NAME";
+					fdt = "fdt";
+					firmware = "uboot";
 #ifndef CONFIG_ARMV8_PSCI
-						loadables = "atf", "tee";
+					loadables = "atf", "tee";
 #endif
-					};
 				};
 			};
-#ifdef CONFIG_IMX_HAB
 		};
-#endif
+#ifdef CONFIG_IMX_HAB
 	};
+#endif
 };
diff --git a/doc/board/nxp/imx8mq_evk.rst b/doc/board/nxp/imx8mq_evk.rst
index 4b0624e7e86..4a9d9e404c5 100644
--- a/doc/board/nxp/imx8mq_evk.rst
+++ b/doc/board/nxp/imx8mq_evk.rst
@@ -45,11 +45,11 @@ Build U-Boot
    $ make imx8mq_evk_defconfig
    $ make
 
-Burn the flash.bin to MicroSD card offset 33KB:
+Burn the flash.bin to MicroSD card offset 32KB:
 
 .. code-block:: bash
 
-   $sudo dd if=flash.bin of=/dev/sd[x] bs=1024 seek=33 conv=notrunc
+   $sudo dd if=flash.bin of=/dev/sd[x] bs=1024 seek=32 conv=notrunc
 
 Boot
 ----
diff --git a/drivers/ddr/imx/phy/helper.c b/drivers/ddr/imx/phy/helper.c
index b0dfc3a0b4f..147ec9ab061 100644
--- a/drivers/ddr/imx/phy/helper.c
+++ b/drivers/ddr/imx/phy/helper.c
@@ -38,6 +38,8 @@ binman_sym_declare(ulong, ddr_2d_dmem_fw, image_pos);
 binman_sym_declare(ulong, ddr_2d_dmem_fw, size);
 #endif
 
+binman_sym_declare(ulong, u_boot_spl, image_pos);
+
 /* We need PHY iMEM PHY is 32KB padded */
 void ddr_load_train_firmware(enum fw_type type)
 {
@@ -49,6 +51,7 @@ void ddr_load_train_firmware(enum fw_type type)
 	unsigned long dmem_start;
 	unsigned long imem_len = IMEM_LEN, dmem_len = DMEM_LEN;
 	static enum fw_type last_type = -1;
+	unsigned long spl_start = 0;
 
 	/* If FW doesn't change, we can save the loading. */
 	if (last_type == type)
@@ -67,6 +70,9 @@ void ddr_load_train_firmware(enum fw_type type)
 	dmem_start = imem_start + imem_len;
 
 	if (BINMAN_SYMS_OK) {
+		if (IS_ENABLED(CONFIG_IMX8MQ))
+			spl_start = binman_sym(ulong, u_boot_spl, image_pos);
+
 		switch (type) {
 		case FW_1D_IMAGE:
 			imem_start = binman_sym(ulong, ddr_1d_imem_fw, image_pos);
@@ -83,6 +89,13 @@ void ddr_load_train_firmware(enum fw_type type)
 #endif
 			break;
 		}
+
+		if (IS_ENABLED(CONFIG_IMX8MQ)) {
+			imem_start -= spl_start;
+			imem_start += CONFIG_SPL_TEXT_BASE;
+			dmem_start -= spl_start;
+			dmem_start += CONFIG_SPL_TEXT_BASE;
+		}
 	}
 
 	pr_from32 = imem_start;

-- 
2.51.0



More information about the U-Boot mailing list