From: Alice Guo <alice....@nxp.com> i.MX95 needs to combine DDR PHY firmware images and their byte counts together, so add a new entry type nxp-header-ddrfw for this requirement.
Signed-off-by: Alice Guo <alice....@nxp.com> --- tools/binman/entries.rst | 10 ++++++++++ tools/binman/etype/nxp_header_ddrfw.py | 29 +++++++++++++++++++++++++++++ tools/binman/ftest.py | 11 +++++++++++ tools/binman/test/346_nxp_ddrfw_imx95.dts | 24 ++++++++++++++++++++++++ 4 files changed, 74 insertions(+) diff --git a/tools/binman/entries.rst b/tools/binman/entries.rst index 780e9817fb6..4f05aa0a323 100644 --- a/tools/binman/entries.rst +++ b/tools/binman/entries.rst @@ -1663,6 +1663,16 @@ Properties / Entry arguments: +.. _etype_nxp_header_ddrfw: + +Entry: nxp-header-ddrfw: add a header to DDR PHY firmware images +---------------------------------------------------------------- + +This entry is used to combine DDR PHY firmware images and their byte counts +together. See imx95_evk.rst for how to get DDR PHY Firmware Images. + + + .. _etype_opensbi: Entry: opensbi: RISC-V OpenSBI fw_dynamic blob diff --git a/tools/binman/etype/nxp_header_ddrfw.py b/tools/binman/etype/nxp_header_ddrfw.py new file mode 100644 index 00000000000..655699e6ffa --- /dev/null +++ b/tools/binman/etype/nxp_header_ddrfw.py @@ -0,0 +1,29 @@ +# SPDX-License-Identifier: GPL-2.0+ +# +# Copyright 2025 NXP + +from binman.etype.section import Entry_section + +class Entry_nxp_header_ddrfw(Entry_section): + """Add a header to DDR PHY firmware images + + This entry is used for i.MX95 to combine DDR PHY firmware images and their + byte counts together. + + See imx95_evk.rst for how to get DDR PHY Firmware Images. + """ + + def __init__(self, section, etype, node): + super().__init__(section, etype, node) + + def BuildSectionData(self, required): + section_data = bytearray() + header_data = bytearray() + + for entry in self._entries.values(): + entry_data = entry.GetData(required) + + section_data += entry_data + header_data += entry.contents_size.to_bytes(4, 'little') + + return header_data + section_data diff --git a/tools/binman/ftest.py b/tools/binman/ftest.py index 1a92a99b511..301e4927886 100644 --- a/tools/binman/ftest.py +++ b/tools/binman/ftest.py @@ -104,6 +104,8 @@ PRE_LOAD_VERSION = 0x11223344.to_bytes(4, 'big') PRE_LOAD_HDR_SIZE = 0x00001000.to_bytes(4, 'big') TI_BOARD_CONFIG_DATA = b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' TI_UNSECURE_DATA = b'unsecuredata' +IMX_LPDDR_IMEM_DATA = b'qwertyuiop1234567890' +IMX_LPDDR_DMEM_DATA = b'asdfghjklzxcvbnm' # Subdirectory of the input dir to use to put test FDTs TEST_FDT_SUBDIR = 'fdts' @@ -202,6 +204,8 @@ class TestFunctional(unittest.TestCase): TestFunctional._MakeInputFile('fsp_m.bin', FSP_M_DATA) TestFunctional._MakeInputFile('fsp_s.bin', FSP_S_DATA) TestFunctional._MakeInputFile('fsp_t.bin', FSP_T_DATA) + TestFunctional._MakeInputFile('lpddr5_imem.bin', IMX_LPDDR_IMEM_DATA) + TestFunctional._MakeInputFile('lpddr5_dmem.bin', IMX_LPDDR_DMEM_DATA) cls._elf_testdir = os.path.join(cls._indir, 'elftest') elf_test.BuildElfTestFiles(cls._elf_testdir) @@ -7845,6 +7849,13 @@ fdt fdtmap Extract the devicetree blob from the fdtmap """Test that binman can produce an iMX8 image""" self._DoTestFile('339_nxp_imx8.dts') + def testNxpHeaderDdrfw(self): + """Test that binman can add a header to DDR PHY firmware images""" + data = self._DoReadFile('346_nxp_ddrfw_imx95.dts') + self.assertEqual(len(IMX_LPDDR_IMEM_DATA).to_bytes(4, 'little') + + len(IMX_LPDDR_DMEM_DATA).to_bytes(4, 'little') + + IMX_LPDDR_IMEM_DATA + IMX_LPDDR_DMEM_DATA, data) + def testFitSignSimple(self): """Test that image with FIT and signature nodes can be signed""" if not elf.ELF_TOOLS: diff --git a/tools/binman/test/346_nxp_ddrfw_imx95.dts b/tools/binman/test/346_nxp_ddrfw_imx95.dts new file mode 100644 index 00000000000..889f6f29860 --- /dev/null +++ b/tools/binman/test/346_nxp_ddrfw_imx95.dts @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: GPL-2.0+ + +/dts-v1/; + +/ { + #address-cells = <1>; + #size-cells = <1>; + + binman { + imx-lpddr { + type = "nxp-header-ddrfw"; + + imx-lpddr-imem { + filename = "lpddr5_imem.bin"; + type = "blob-ext"; + }; + + imx-lpddr-dmem { + filename = "lpddr5_dmem.bin"; + type = "blob-ext"; + }; + }; + }; +}; -- 2.43.0