binman: add a new entry type for packing DDR PHY firmware images

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.guo@nxp.com>
This commit is contained in:
Alice Guo 2025-04-28 18:37:39 +08:00 committed by Fabio Estevam
parent d292f30d52
commit 0318c26c2f
4 changed files with 74 additions and 0 deletions

View File

@ -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

View File

@ -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

View File

@ -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)
@ -7848,6 +7852,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:

View File

@ -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";
};
};
};
};