]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
imx8mq: Correct signed_hdmi firmware position
authorPeng Fan <peng.fan@nxp.com>
Tue, 21 Apr 2026 13:41:19 +0000 (21:41 +0800)
committerFabio Estevam <festevam@gmail.com>
Tue, 21 Apr 2026 23:49:39 +0000 (20:49 -0300)
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@nxp.com>
arch/arm/dts/imx8mq-librem5-r4-u-boot.dtsi
arch/arm/dts/imx8mq-u-boot.dtsi
doc/board/nxp/imx8mq_evk.rst
drivers/ddr/imx/phy/helper.c

index 98da015a4443868c64ed2327e0328e9169bc164f..4d326040c0ac94377dd21cef3a80ebf410918115 100644 (file)
@@ -10,7 +10,7 @@
        bootph-pre-ram;
 };
 
-&binman_imx_spl {
+&binman {
        section {
                signed-hdmi-imx8m {
                        filename = "signed_dp_imx8m.bin";
index 0687fcdbd68b210aa9cfb89e87713e9a5aff0754..ed2c704f2e5b07796505af8e97af8cd3076e06c1 100644 (file)
        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 {
 #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@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@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
 };
index 4b0624e7e8617a5de5623c43fbccbf5ebc255d75..4a9d9e404c5a1339adca68ecf76cd9215d2e6152 100644 (file)
@@ -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
 ----
index b0dfc3a0b4f3f8cbbefc27b122b360e64d6cd6a2..147ec9ab061101f7ac66f87f440393d68e2beb5b 100644 (file)
@@ -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;