[PATCH 1/4] arm64: dts: imx8mn: Fix FSPI booting

Adam Ford aford173 at gmail.com
Sat Nov 9 21:06:02 CET 2024


When FSPI_CONF_HEADER is set, the binary needs to be built such
that there is a configuration file located at 0x400 and the start
of the file that would normally be flash.bin starts at 0x1000.
This used to be done properly until the device tree was converted to
nxp_imx8mimage.

Building these with the offsets built into the binman device tree
changes impacts how the actual image is built and the locations
of the various blobs aren't fetched properly and booting fails.

Fix this by building a standard image as if it were to boot from
eMMC or SD, then use that image as the input for a second image
which adds this FSPI header at 0x400, and then places the standard
image at offset 0x1000.  This also has the benefit of being able
to create both SD/eMMC image at the same time as a fspi image
called flexspi.bin.

Fixes: 37e50627efac ("ARM: dts: imx: Convert i.MX8M flash.bin image generation to binman")
Signed-off-by: Adam Ford <aford173 at gmail.com>
---
 arch/arm/dts/imx8mn-u-boot.dtsi | 266 +++++++++++++++++---------------
 1 file changed, 138 insertions(+), 128 deletions(-)

diff --git a/arch/arm/dts/imx8mn-u-boot.dtsi b/arch/arm/dts/imx8mn-u-boot.dtsi
index 6875c6d44f..157e6b9a26 100644
--- a/arch/arm/dts/imx8mn-u-boot.dtsi
+++ b/arch/arm/dts/imx8mn-u-boot.dtsi
@@ -91,185 +91,195 @@
 };
 
 &binman {
-	filename = "flash.bin";
-	section {
-		pad-byte = <0x00>;
+	multiple-images;
 
-#ifdef CONFIG_FSPI_CONF_HEADER
-		fspi_conf_block {
-			filename = CONFIG_FSPI_CONF_FILE;
-			type = "blob-ext";
-			offset = <0x400>;
-		};
-#endif
+	standard_image: image1 {
+		filename = "flash.bin";
+		section {
+			pad-byte = <0x00>;
 
 #ifdef CONFIG_IMX_HAB
-		nxp-imx8mcst at 0 {
-			filename = "u-boot-spl-mkimage.signed.bin";
-			nxp,loader-address = <CONFIG_SPL_TEXT_BASE>;
-			nxp,unlock;
-			args;	/* Needed by mkimage etype superclass */
-#endif
-
-			binman_imx_spl: nxp-imx8mimage {
-				filename = "u-boot-spl-mkimage.bin";
-				nxp,boot-from = "sd";
-				nxp,rom-version = <2>;
+			nxp-imx8mcst at 0 {
+				filename = "u-boot-spl-mkimage.signed.bin";
 				nxp,loader-address = <CONFIG_SPL_TEXT_BASE>;
+				nxp,unlock;
 				args;	/* Needed by mkimage etype superclass */
+#endif
 
-				section {
-					filename = "u-boot-spl-ddr.bin";
-					pad-byte = <0xff>;
-					align-size = <4>;
-					align = <4>;
-
-					u-boot-spl {
-						align-end = <4>;
-						filename = "u-boot-spl.bin";
-					};
+				binman_imx_spl: nxp-imx8mimage {
+					filename = "u-boot-spl-mkimage.bin";
+					nxp,boot-from = "sd";
+					nxp,rom-version = <2>;
+					nxp,loader-address = <CONFIG_SPL_TEXT_BASE>;
+					args;	/* Needed by mkimage etype superclass */
+
+					section {
+						filename = "u-boot-spl-ddr.bin";
+						pad-byte = <0xff>;
+						align-size = <4>;
+						align = <4>;
+
+						u-boot-spl {
+							align-end = <4>;
+							filename = "u-boot-spl.bin";
+						};
 
-					ddr-1d-imem-fw {
+						ddr-1d-imem-fw {
 #ifdef CONFIG_IMX8M_LPDDR4
-						filename = "lpddr4_pmu_train_1d_imem.bin";
+							filename = "lpddr4_pmu_train_1d_imem.bin";
 #elif CONFIG_IMX8M_DDR4
-						filename = "ddr4_imem_1d_201810.bin";
+							filename = "ddr4_imem_1d_201810.bin";
 #else
-						filename = "ddr3_imem_1d.bin";
+							filename = "ddr3_imem_1d.bin";
 #endif
-						type = "blob-ext";
-						align-end = <4>;
-					};
+							type = "blob-ext";
+							align-end = <4>;
+						};
 
-					ddr-1d-dmem-fw {
+						ddr-1d-dmem-fw {
 #ifdef CONFIG_IMX8M_LPDDR4
-						filename = "lpddr4_pmu_train_1d_dmem.bin";
+							filename = "lpddr4_pmu_train_1d_dmem.bin";
 #elif CONFIG_IMX8M_DDR4
-						filename = "ddr4_dmem_1d_201810.bin";
+							filename = "ddr4_dmem_1d_201810.bin";
 #else
-						filename = "ddr3_dmem_1d.bin";
+							filename = "ddr3_dmem_1d.bin";
 #endif
-						type = "blob-ext";
-						align-end = <4>;
-					};
+							type = "blob-ext";
+							align-end = <4>;
+						};
 
 #if defined(CONFIG_IMX8M_LPDDR4) || defined(CONFIG_IMX8M_DDR4)
-					ddr-2d-imem-fw {
+						ddr-2d-imem-fw {
 #ifdef CONFIG_IMX8M_LPDDR4
-						filename = "lpddr4_pmu_train_2d_imem.bin";
+							filename = "lpddr4_pmu_train_2d_imem.bin";
 #else
-						filename = "ddr4_imem_2d_201810.bin";
+							filename = "ddr4_imem_2d_201810.bin";
 #endif
-						type = "blob-ext";
-						align-end = <4>;
-					};
+							type = "blob-ext";
+							align-end = <4>;
+						};
 
-					ddr-2d-dmem-fw {
+						ddr-2d-dmem-fw {
 #ifdef CONFIG_IMX8M_LPDDR4
-						filename = "lpddr4_pmu_train_2d_dmem.bin";
+							filename = "lpddr4_pmu_train_2d_dmem.bin";
 #else
-						filename = "ddr4_dmem_2d_201810.bin";
+							filename = "ddr4_dmem_2d_201810.bin";
 #endif
-						type = "blob-ext";
-						align-end = <4>;
-					};
+							type = "blob-ext";
+							align-end = <4>;
+						};
 #endif
+					};
 				};
-			};
 
 #ifdef CONFIG_IMX_HAB
-		};
+			};
 
-		nxp-imx8mcst at 1 {
-			filename = "u-boot-fit.signed.bin";
-			nxp,loader-address = <CONFIG_SPL_LOAD_FIT_ADDRESS>;
-#ifdef CONFIG_FSPI_CONF_HEADER
-			offset = <0x59000>;
-#else
-			offset = <0x58000>;
-#endif
-			args;	/* Needed by mkimage etype superclass */
+			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 */
 #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
-				fit,fdt-list = "of-list";
-				#address-cells = <1>;
-#ifdef CONFIG_FSPI_CONF_HEADER
-				offset = <0x59000>;
-#else
-				offset = <0x58000>;
-#endif
-
-				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";
+					fit,fdt-list = "of-list";
+					#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 = <0x960000>;
-						load = <0x960000>;
-						type = "firmware";
-
-						atf-blob {
-							filename = "bl31.bin";
-							type = "atf-bl31";
+						atf {
+							arch = "arm64";
+							compression = "none";
+							description = "ARM Trusted Firmware";
+							entry = <0x960000>;
+							load = <0x960000>;
+							type = "firmware";
+
+							atf-blob {
+								filename = "bl31.bin";
+								type = "atf-bl31";
+							};
 						};
-					};
 #endif
 
-					binman_fip: fip {
-						arch = "arm64";
-						compression = "none";
-						description = "Trusted Firmware FIP";
-						load = <0x40310000>;
-						type = "firmware";
-					};
+						binman_fip: fip {
+							arch = "arm64";
+							compression = "none";
+							description = "Trusted Firmware FIP";
+							load = <0x40310000>;
+							type = "firmware";
+						};
 
-					@fdt-SEQ {
-						compression = "none";
-						description = "NAME";
-						type = "flat_dt";
+						@fdt-SEQ {
+							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 = "@config-DEFAULT-SEQ";
+					configurations {
+						default = "@config-DEFAULT-SEQ";
 
-					@config-SEQ {
-						description = "NAME";
-						fdt = "fdt-SEQ";
-						firmware = "uboot";
+						@config-SEQ {
+							description = "NAME";
+							fdt = "fdt-SEQ";
+							firmware = "uboot";
 #ifndef CONFIG_ARMV8_PSCI
-						loadables = "atf";
+							loadables = "atf";
 #endif
+						};
 					};
 				};
-			};
 #ifdef CONFIG_IMX_HAB
-		};
+			};
 #endif
+		};
+	};
+
+#ifdef CONFIG_FSPI_CONF_HEADER
+	flexspi_image: image2 {
+		filename = "flexspi.bin";
+		section {
+			pad-byte = <0x00>;
+
+			fspi_conf_block {
+				filename = CONFIG_FSPI_CONF_FILE;
+				type = "blob-ext";
+				offset = <0x400>;
+			};
+
+			flashbin {
+				filename = "flash.bin";
+				type = "blob-ext";
+				offset = <0x1000>;
+			};
+		};
+
 	};
+#endif
 };
-- 
2.45.2



More information about the U-Boot mailing list