U-Boot Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Marek Vasut <marex@nabladev.com>
To: u-boot@lists.denx.de
Cc: Marek Vasut <marex@nabladev.com>,
	"NXP i.MX U-Boot Team" <uboot-imx@nxp.com>,
	Adam Ford <aford173@gmail.com>, Alexander Koch <akoch@initse.com>,
	Fabio Estevam <festevam@gmail.com>, Peng Fan <peng.fan@nxp.com>,
	Simon Glass <sjg@chromium.org>, Tom Rini <trini@konsulko.com>
Subject: [PATCH v2 1/3] binman: imx8mimage: Handle nxp,boot-from = "fspi"
Date: Tue, 26 May 2026 01:51:01 +0200	[thread overview]
Message-ID: <20260525235155.96167-1-marex@nabladev.com> (raw)

Boot from FSPI requires additional 448 Byte long header, with U-Boot SPL
starting at offset 0x1000. Currently, both i.MX8MM and i.MX8MN attempt
to generate this header using fspi_conf_block with filename pointing at
CONFIG_FSPI_CONF_FILE file. This does not work, for two reasons.

First, the CONFIG_FSPI_CONF_FILE is generated by mkimage -T imx8mimage
and may not be available yet when the fspi_conf_block is evaluated. That
leads to a race condition where highly parallel builds fail to find the
CONFIG_FSPI_CONF_FILE, which is usually called fspi_header.bin, on first
build attempt.

Second, binman gets confused and patches incorrect offset of DDR PHY
firmware blobs into U-Boot SPL, the offset is incremented by exactly
0x1000 which is the size of fspi_conf_block.

Fix both problems at once, make imx8mimage handle the generated FSPI
header and prepend it in front of the imx8mimage processed data. This
way, the race condition is solved, because the data generated by the
imx8mimage are surely combined only after mkimage -T imx8mimage ran.
The binman offset calculation is also solved, because there is no
fspi_conf_block node in the DT anymore.

Signed-off-by: Marek Vasut <marex@nabladev.com>
---
Cc: "NXP i.MX U-Boot Team" <uboot-imx@nxp.com>
Cc: Adam Ford <aford173@gmail.com>
Cc: Alexander Koch <akoch@initse.com>
Cc: Fabio Estevam <festevam@gmail.com>
Cc: Peng Fan <peng.fan@nxp.com>
Cc: Simon Glass <sjg@chromium.org>
Cc: Tom Rini <trini@konsulko.com>
Cc: u-boot@lists.denx.de
---
V2: - Move test into vendor/nxp_imx8m_fspi.dts
    - Fix up path handling in both etype and test
---
 tools/binman/etype/nxp_imx8mimage.py        | 11 ++++++++++-
 tools/binman/ftest.py                       |  9 +++++++++
 tools/binman/test/vendor/nxp_imx8m_fspi.dts | 18 ++++++++++++++++++
 3 files changed, 37 insertions(+), 1 deletion(-)
 create mode 100644 tools/binman/test/vendor/nxp_imx8m_fspi.dts

diff --git a/tools/binman/etype/nxp_imx8mimage.py b/tools/binman/etype/nxp_imx8mimage.py
index 8ad177b3b65..008d2f914db 100644
--- a/tools/binman/etype/nxp_imx8mimage.py
+++ b/tools/binman/etype/nxp_imx8mimage.py
@@ -7,6 +7,8 @@
 # configuration file and input data.
 #
 
+import os
+
 from collections import OrderedDict
 
 from binman.entry import Entry
@@ -33,6 +35,7 @@ class Entry_nxp_imx8mimage(Entry_mkimage):
     def ReadNode(self):
         super().ReadNode()
         self.boot_from = fdt_util.GetString(self._node, 'nxp,boot-from')
+        self.fspi_header = fdt_util.GetString(self._node, 'nxp,fspi-header-filename')
         self.loader_address = fdt_util.GetInt(self._node, 'nxp,loader-address')
         self.rom_version = fdt_util.GetInt(self._node, 'nxp,rom-version')
         self.ReadEntries()
@@ -52,7 +55,13 @@ class Entry_nxp_imx8mimage(Entry_mkimage):
         args = ['-d', input_fname, '-n', cfg_fname, '-T', 'imx8mimage',
                 output_fname]
         if self.mkimage.run_cmd(*args) is not None:
-            return tools.read_file(output_fname)
+            outdata = tools.read_file(output_fname)
+            if self.boot_from == 'fspi' and self.fspi_header:
+                spidata = tools.read_file(os.path.join(tools.get_output_dir(), self.fspi_header))
+                if len(spidata) < 0x1000:
+                    spidata += tools.get_bytes(0, 0x1000 - len(spidata))
+                outdata = spidata + outdata
+            return outdata
         else:
             # Bintool is missing; just use the input data as the output
             self.record_missing_bintool(self.mkimage)
diff --git a/tools/binman/ftest.py b/tools/binman/ftest.py
index 9a3811c1732..d85ecffdc21 100644
--- a/tools/binman/ftest.py
+++ b/tools/binman/ftest.py
@@ -8099,6 +8099,15 @@ fdt         fdtmap                Extract the devicetree blob from the fdtmap
             result = cst.fetch(bintool.FETCH_BUILD)
             self.assertEqual(('cst', None), result)
 
+    def testNxpImx8MFSPI(self):
+        """Test that binman can produce an iMX8m FSPI image"""
+        testdir = tempfile.mkdtemp(prefix='binman.')
+        image_path = os.path.join(testdir, 'fspi_header.bin')
+        with open(image_path, 'w') as f:
+            f.write(bytes([0x87]).decode('latin1') * 448)
+        with terminal.capture():
+            self._DoTestFile('vendor/nxp_imx8m_fspi.dts', output_dir=testdir)
+
     def testNxpHeaderDdrfw(self):
         """Test that binman can add a header to DDR PHY firmware images"""
         data = self._DoReadFile('vendor/nxp_ddrfw_imx95.dts')
diff --git a/tools/binman/test/vendor/nxp_imx8m_fspi.dts b/tools/binman/test/vendor/nxp_imx8m_fspi.dts
new file mode 100644
index 00000000000..6b04eca757c
--- /dev/null
+++ b/tools/binman/test/vendor/nxp_imx8m_fspi.dts
@@ -0,0 +1,18 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+/dts-v1/;
+
+/ {
+	#address-cells = <1>;
+	#size-cells = <1>;
+
+	binman {
+		nxp-imx8mimage {
+			args;	/* TODO: Needed by mkimage etype superclass */
+			nxp,boot-from = "fspi";
+			nxp,fspi-header-filename = "fspi_header.bin";
+			nxp,rom-version = <2>;
+			nxp,loader-address = <0x10>;
+		};
+	};
+};
-- 
2.53.0


             reply	other threads:[~2026-05-25 23:52 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-05-25 23:51 Marek Vasut [this message]
2026-05-25 23:51 ` [PATCH v2 2/3] arm64: dts: imx8mm: Generate FSPI header using binman imx8mimage Marek Vasut
2026-06-03 16:45   ` Simon Glass
2026-05-25 23:51 ` [PATCH v2 3/3] arm64: dts: imx8mn: " Marek Vasut
2026-06-03 16:45   ` Simon Glass
2026-05-28 12:43 ` [PATCH v2 1/3] binman: imx8mimage: Handle nxp,boot-from = "fspi" Fabio Estevam
2026-05-29 10:53   ` Marek Vasut
2026-05-29 22:03 ` Simon Glass
2026-05-30 17:12   ` Marek Vasut

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260525235155.96167-1-marex@nabladev.com \
    --to=marex@nabladev.com \
    --cc=aford173@gmail.com \
    --cc=akoch@initse.com \
    --cc=festevam@gmail.com \
    --cc=peng.fan@nxp.com \
    --cc=sjg@chromium.org \
    --cc=trini@konsulko.com \
    --cc=u-boot@lists.denx.de \
    --cc=uboot-imx@nxp.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox