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
};
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)
{
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)
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);
#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;