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

Reply via email to