From 5b6dba2924bd8bd9a4c295e5a5eba8dfaf0730b7 Mon Sep 17 00:00:00 2001 From: Peng Fan Date: Tue, 21 Apr 2026 21:41:19 +0800 Subject: [PATCH] imx8mq: Correct signed_hdmi firmware position 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 --- arch/arm/dts/imx8mq-librem5-r4-u-boot.dtsi | 2 +- arch/arm/dts/imx8mq-u-boot.dtsi | 282 +++++++++++---------- doc/board/nxp/imx8mq_evk.rst | 4 +- drivers/ddr/imx/phy/helper.c | 13 + 4 files changed, 169 insertions(+), 132 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@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 = ; - 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"; - }; - - ddr-1d-imem-fw { - filename = "lpddr4_pmu_train_1d_imem.bin"; - align-end = <4>; - type = "blob-ext"; - }; - - ddr-1d-dmem-fw { - filename = "lpddr4_pmu_train_1d_dmem.bin"; - align-end = <4>; - 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"; - }; - - signed-hdmi-imx8m { - filename = "signed_hdmi_imx8m.bin"; - type = "blob-ext"; - }; - }; - }; -#ifdef CONFIG_IMX_HAB - }; - - nxp-imx8mcst@1 { - filename = "u-boot-fit.signed.bin"; - nxp,loader-address = ; - offset = <0x58000>; + filename = "u-boot-spl-mkimage.bin"; + nxp,boot-from = "sd"; + nxp,rom-version = <1>; + nxp,loader-address = ; args; /* Needed by mkimage etype superclass */ -#endif - binman_imx_fit: fit { - description = "Configuration to load ATF before U-Boot"; - filename = "u-boot.itb"; -#ifndef CONFIG_IMX_HAB - fit,external-offset = ; -#endif - #address-cells = <1>; + section { + align = <4>; + align-size = <4>; + filename = "u-boot-spl-ddr.bin"; + pad-byte = <0xff>; - offset = <0x57c00>; - - images { - uboot { - arch = "arm64"; - compression = "none"; - description = "U-Boot (64-bit)"; - load = ; - 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"; - }; - }; -#endif - - tee: tee { - description = "OP-TEE"; - type = "tee"; - arch = "arm64"; - compression = "none"; - os = "tee"; - load = ; - entry = ; - - tee-os { - filename = "tee.bin"; - optional; - }; - }; - - fdt { - compression = "none"; - description = "NAME"; - type = "flat_dt"; - - uboot-fdt-blob { - filename = "u-boot.dtb"; - type = "blob-ext"; - }; - }; + u-boot-spl { + align-end = <4>; + filename = "u-boot-spl.bin"; }; - configurations { - default = "conf"; + ddr-1d-imem-fw { + filename = "lpddr4_pmu_train_1d_imem.bin"; + align-end = <4>; + type = "blob-ext"; + }; - conf { - description = "NAME"; - fdt = "fdt"; - firmware = "uboot"; -#ifndef CONFIG_ARMV8_PSCI - loadables = "atf", "tee"; -#endif - }; + ddr-1d-dmem-fw { + filename = "lpddr4_pmu_train_1d_dmem.bin"; + align-end = <4>; + 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 }; + +#ifdef CONFIG_IMX_HAB + nxp-imx8mcst@1 { + filename = "u-boot-fit.signed.bin"; + nxp,loader-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"; +#ifndef CONFIG_IMX_HAB + fit,external-offset = ; +#endif + #address-cells = <1>; + + offset = <0x58000>; + + images { + uboot { + arch = "arm64"; + compression = "none"; + description = "U-Boot (64-bit)"; + load = ; + 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"; + }; + }; +#endif + + tee: tee { + description = "OP-TEE"; + type = "tee"; + arch = "arm64"; + compression = "none"; + os = "tee"; + load = ; + entry = ; + + tee-os { + filename = "tee.bin"; + optional; + }; + }; + + fdt { + compression = "none"; + description = "NAME"; + type = "flat_dt"; + + uboot-fdt-blob { + filename = "u-boot.dtb"; + type = "blob-ext"; + }; + }; + }; + + configurations { + default = "conf"; + + conf { + description = "NAME"; + fdt = "fdt"; + firmware = "uboot"; +#ifndef CONFIG_ARMV8_PSCI + loadables = "atf", "tee"; +#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;