aboutsummaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorMarek Vasut <marex@denx.de>2024-04-26 01:00:35 +0200
committerFabio Estevam <festevam@gmail.com>2024-04-28 12:10:13 -0300
commita9f2ff5922e1e43852c8f438501603559cf30824 (patch)
tree8f5584f1345492caed95394f74c2a94665a317a1 /tools
parent6bc68ed4df647c2e56d6d63a25b3368f3fe50811 (diff)
downloadu-boot-a9f2ff5922e1e43852c8f438501603559cf30824.zip
u-boot-a9f2ff5922e1e43852c8f438501603559cf30824.tar.gz
u-boot-a9f2ff5922e1e43852c8f438501603559cf30824.tar.bz2
binman: Add nxp_imx8mimage etype
Add new binman etype derived from mkimage etype which generates configuration input file for mkimage -T imx8mimage, and runs the mkimage on input data. The mkimage -T imx8mimage is used to generate combined image with SPL and DDR PHY blobs which is bootable on i.MX8M. The configuration file generated here is equivalent of imx8mimage.cfg, which is the file passed to '$ mkimage -T imx8mimage -n imx8mimage.cfg ...' . The settings generated into the imx8mimage.cfg file are configured via supported binman DT properties, nxp,boot-from, nxp,loader-address, nxp,rom-version. Signed-off-by: Marek Vasut <marex@denx.de>
Diffstat (limited to 'tools')
-rw-r--r--tools/binman/etype/nxp_imx8mimage.py74
1 files changed, 74 insertions, 0 deletions
diff --git a/tools/binman/etype/nxp_imx8mimage.py b/tools/binman/etype/nxp_imx8mimage.py
new file mode 100644
index 0000000..3585120
--- /dev/null
+++ b/tools/binman/etype/nxp_imx8mimage.py
@@ -0,0 +1,74 @@
+# SPDX-License-Identifier: GPL-2.0+
+# Copyright 2023-2024 Marek Vasut <marex@denx.de>
+# Written with much help from Simon Glass <sjg@chromium.org>
+#
+# Entry-type module for generating the i.MX8M mkimage -T imx8mimage
+# configuration file and invocation of mkimage -T imx8mimage on the
+# configuration file and input data.
+#
+
+from collections import OrderedDict
+
+from binman.entry import Entry
+from binman.etype.mkimage import Entry_mkimage
+from binman.etype.section import Entry_section
+from binman import elf
+from dtoc import fdt_util
+from u_boot_pylib import tools
+
+class Entry_nxp_imx8mimage(Entry_mkimage):
+ """NXP i.MX8M imx8mimage .cfg file generator and mkimage invoker
+
+ Properties / Entry arguments:
+ - nxp,boot-from - device to boot from (e.g. 'sd')
+ - nxp,loader-address - loader address (SPL text base)
+ - nxp,rom-version - BootROM version ('2' for i.MX8M Nano and Plus)
+ """
+
+ def __init__(self, section, etype, node):
+ super().__init__(section, etype, node)
+ self.required_props = ['nxp,boot-from', 'nxp,rom-version', 'nxp,loader-address']
+
+ def ReadNode(self):
+ super().ReadNode()
+ self.boot_from = fdt_util.GetString(self._node, 'nxp,boot-from')
+ self.loader_address = fdt_util.GetInt(self._node, 'nxp,loader-address')
+ self.rom_version = fdt_util.GetInt(self._node, 'nxp,rom-version')
+ self.ReadEntries()
+
+ def BuildSectionData(self, required):
+ data, input_fname, uniq = self.collect_contents_to_file(
+ self._entries.values(), 'input')
+ # Generate mkimage configuration file similar to imx8mimage.cfg
+ # and pass it to mkimage to generate SPL image for us here.
+ cfg_fname = tools.get_output_filename('nxp.imx8mimage.cfg.%s' % uniq)
+ with open(cfg_fname, 'w') as outf:
+ print('ROM_VERSION v%d' % self.rom_version, file=outf)
+ print('BOOT_FROM %s' % self.boot_from, file=outf)
+ print('LOADER %s %#x' % (input_fname, self.loader_address), file=outf)
+
+ output_fname = tools.get_output_filename(f'cfg-out.{uniq}')
+ 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)
+ else:
+ # Bintool is missing; just use the input data as the output
+ self.record_missing_bintool(self.mkimage)
+ return data
+
+ def SetImagePos(self, image_pos):
+ # Customized SoC specific SetImagePos which skips the mkimage etype
+ # implementation and removes the 0x48 offset introduced there. That
+ # offset is only used for uImage/fitImage, which is not the case in
+ # here.
+ upto = 0x00
+ for entry in super().GetEntries().values():
+ entry.SetOffsetSize(upto, None)
+
+ # Give up if any entries lack a size
+ if entry.size is None:
+ return
+ upto += entry.size
+
+ Entry_section.SetImagePos(self, image_pos)