On 07.02.22 23:08, Alper Nebi Yasak wrote: > The binman FIT entry type shares some code with the Section entry type. > This shared code is bound to grow, since FIT entries are conceptually a > variation of Section entries. > > Make FIT entry type a subclass of Section entry type, simplifying it a > bit and providing us the features that Section implements. Also fix the > subentry alignment test which now attempts to write symbols to a > nonexistent SPL ELF test file by creating it first. > > Signed-off-by: Alper Nebi Yasak <alpernebiya...@gmail.com> > Reviewed-by: Simon Glass <s...@chromium.org> > --- > > Changes in v2: > - Add tag: "Reviewed-by: Simon Glass <s...@chromium.org>" > > tools/binman/etype/fit.py | 70 +++++++++++---------------------------- > tools/binman/ftest.py | 1 + > 2 files changed, 20 insertions(+), 51 deletions(-) > > diff --git a/tools/binman/etype/fit.py b/tools/binman/etype/fit.py > index 9dffcd5adbd6..0f8c88a9720e 100644 > --- a/tools/binman/etype/fit.py > +++ b/tools/binman/etype/fit.py > @@ -9,11 +9,12 @@ > import libfdt > > from binman.entry import Entry, EntryArg > +from binman.etype.section import Entry_section > from dtoc import fdt_util > from dtoc.fdt import Fdt > from patman import tools > > -class Entry_fit(Entry): > +class Entry_fit(Entry_section): > """Flat Image Tree (FIT) > > This calls mkimage to create a FIT (U-Boot Flat Image Tree) based on the > @@ -112,15 +113,15 @@ def __init__(self, section, etype, node): > """ > Members: > _fit: FIT file being built > - _fit_sections: dict: > + _entries: dict from Entry_section: > key: relative path to entry Node (from the base of the FIT) > value: Entry_section object comprising the contents of this > node > """ > super().__init__(section, etype, node) > self._fit = None > - self._fit_sections = {} > self._fit_props = {} > + > for pname, prop in self._node.props.items(): > if pname.startswith('fit,'): > self._fit_props[pname] = prop > @@ -185,7 +186,7 @@ def _AddNode(base_node, depth, node): > # 'data' property later. > entry = Entry.Create(self.section, node, etype='section') > entry.ReadNode() > - self._fit_sections[rel_path] = entry > + self._entries[rel_path] = entry > > for subnode in node.subnodes: > if has_images and not (subnode.name.startswith('hash') or > @@ -237,18 +238,19 @@ def _AddNode(base_node, depth, node): > self._fdt = Fdt.FromData(fdt.as_bytearray()) > self._fdt.Scan() > > - def ExpandEntries(self): > - super().ExpandEntries() > - for section in self._fit_sections.values(): > - section.ExpandEntries() > - > - def ObtainContents(self): > - """Obtain the contents of the FIT > + def BuildSectionData(self, required): > + """Build FIT entry contents > > This adds the 'data' properties to the input ITB (Image-tree Binary) > then runs mkimage to process it. > + > + Args: > + required: True if the data must be present, False if it is OK to > + return None > + > + Returns: > + Contents of the section (bytes) > """ > - # self._BuildInput() either returns bytes or raises an exception. > data = self._BuildInput(self._fdt) > uniq = self.GetUniqueName() > input_fname = tools.GetOutputFilename('%s.itb' % uniq) > @@ -264,14 +266,12 @@ def ObtainContents(self): > 'pad': fdt_util.fdt32_to_cpu(ext_offset.value) > } > if self.mkimage.run(reset_timestamp=True, output_fname=output_fname, > - **args) is not None: > - self.SetContents(tools.ReadFile(output_fname)) > - else: > + **args) is None: > # Bintool is missing; just use empty data as the output > self.record_missing_bintool(self.mkimage) > - self.SetContents(tools.GetBytes(0, 1024)) > + return tools.GetBytes(0, 1024) > > - return True > + return tools.ReadFile(output_fname) > > def _BuildInput(self, fdt): > """Finish the FIT by adding the 'data' properties to it > @@ -282,12 +282,8 @@ def _BuildInput(self, fdt): > Returns: > New fdt contents (bytes) > """ > - for path, section in self._fit_sections.items(): > + for path, section in self._entries.items(): > node = fdt.GetNode(path) > - # Entry_section.ObtainContents() either returns True or > - # raises an exception. > - section.ObtainContents() > - section.Pack(0) > data = section.GetData() > node.AddData('data', data) > > @@ -295,34 +291,6 @@ def _BuildInput(self, fdt): > data = fdt.GetContents() > return data > > - def CheckMissing(self, missing_list): > - """Check if any entries in this FIT have missing external blobs > - > - If there are missing blobs, the entries are added to the list > - > - Args: > - missing_list: List of Entry objects to be added to > - """ > - for path, section in self._fit_sections.items(): > - section.CheckMissing(missing_list) > - > - def SetAllowMissing(self, allow_missing): > - for section in self._fit_sections.values(): > - section.SetAllowMissing(allow_missing) > - > def AddBintools(self, tools): > - for section in self._fit_sections.values(): > - section.AddBintools(tools) > + super().AddBintools(tools) > self.mkimage = self.AddBintool(tools, 'mkimage') > - > - def check_missing_bintools(self, missing_list): > - """Check if any entries in this section have missing bintools > - > - If there are missing bintools, these are added to the list > - > - Args: > - missing_list: List of Bintool objects to be added to > - """ > - super().check_missing_bintools(missing_list) > - for entry in self._fit_sections.values(): > - entry.check_missing_bintools(missing_list) > diff --git a/tools/binman/ftest.py b/tools/binman/ftest.py > index bc073587cc07..f16798960b84 100644 > --- a/tools/binman/ftest.py > +++ b/tools/binman/ftest.py > @@ -3850,6 +3850,7 @@ def testPadInSections(self): > > def testFitImageSubentryAlignment(self): > """Test relative alignability of FIT image subentries""" > + self._SetupSplElf() > entry_args = { > 'test-id': TEXT_DATA, > }
Only came to testing this now, and it causes a regression. Before this commit (I've added fdtmap to arch/arm/dts/k3-am65-iot2050-boot-image.dtsi for this): $ source/tools/binman/binman -D ls -i flash.bin Name Image-pos Size Entry-type Offset Uncomp-size ---------------------------------------------------------------------------------- main-section 0 8c0000 section 0 blob-ext@0x000000 0 37373 blob-ext@0x000000 0 blob@0x080000 80000 84484 blob@0x080000 80000 fit@0x280000 280000 f445f fit@0x280000 280000 fdtmap 37445f cf9 fdtmap 37445f fill@0x680000 680000 20000 fill@0x680000 680000 fill@0x6a0000 6a0000 20000 fill@0x6a0000 6a0000 blob-ext@0x6c0000 6c0000 415de blob-ext@0x6c0000 6c0000 blob-ext@0x740000 740000 43952 blob-ext@0x740000 740000 blob-ext@0x7c0000 7c0000 415e2 blob-ext@0x7c0000 7c0000 blob-ext@0x840000 840000 4395a blob-ext@0x840000 840000 With this commit: $ source/tools/binman/binman -D ls -i flash.bin Name Image-pos Size Entry-type Offset Uncomp-size ------------------------------------------------------------------------------------------- main-section 0 8c0000 section 0 blob-ext@0x000000 0 37373 blob-ext@0x000000 0 blob@0x080000 80000 84484 blob@0x080000 80000 fit@0x280000 fit@0x280000 280000 u-boot section u-boot-nodtb u-boot-nodtb fdt-iot2050-basic section blob blob fdt-iot2050-basic-pg2 section blob blob fdt-iot2050-advanced section blob blob fdt-iot2050-advanced-pg2 section blob blob k3-rti-wdt-firmware section blob-ext blob-ext fdtmap 37445f cd9 fdtmap 37445f fill@0x680000 680000 20000 fill@0x680000 680000 fill@0x6a0000 6a0000 20000 fill@0x6a0000 6a0000 blob-ext@0x6c0000 6c0000 415de blob-ext@0x6c0000 6c0000 blob-ext@0x740000 740000 43952 blob-ext@0x740000 740000 blob-ext@0x7c0000 7c0000 415e2 blob-ext@0x7c0000 7c0000 blob-ext@0x840000 840000 4395a blob-ext@0x840000 840000 The fit is nicely shown but its Image-pos column is now empty. And that leads to: $ source/tools/binman/binman -D extract -i flash.bin -f extr.bin fit@0x280000 binman: unsupported operand type(s) for +: 'int' and 'NoneType' Traceback (most recent call last): File "source/tools/binman/binman", line 141, in RunBinman ret_code = control.Binman(args) File "/data/u-boot/tools/binman/control.py", line 639, in Binman not args.uncompressed, args.format) File "/data/u-boot/tools/binman/control.py", line 260, in ExtractEntries data = entry.ReadData(decomp, alt_format) File "/data/u-boot/tools/binman/etype/section.py", line 763, in ReadData data = parent_data[offset:offset + self.size] TypeError: unsupported operand type(s) for +: 'int' and 'NoneType' Similar breakages for "replace" and likely more sub-commands. I have to revert this locally for now - no time to debug. Jan -- Siemens AG, Technology Competence Center Embedded Linux