[PATCH RFC 1/3] tools: binman: Enable getting file from specific directory

Simon Glass sjg at chromium.org
Fri Jul 28 04:35:26 CEST 2023


Hi Neha,

On Thu, 27 Jul 2023 at 06:12, Neha Malcom Francis <n-francis at ti.com> wrote:
>
> While we have the option of using '-a <file-dir> to grab a file from a
> specific directory, this is problematic when searching for a filename
> shared by multiple files across directories. An example would be FDT
> generated in SPL_BUILD vs. non-SPL_BUILD that is present in spl/dts and
> arch/arm/dts respectively with the same DTB name. Maybe running binman

Do you mean spl/arch/arm/dts and arch/arch/dts ?

> twice could also solve this issue, but this seems like a valid
> implementation.
>
> Signed-off-by: Neha Malcom Francis <n-francis at ti.com>
> ---
>  tools/binman/etype/blob.py  | 12 ++++++++++--
>  tools/binman/etype/fit.py   | 15 ++++++++++++++-
>  tools/u_boot_pylib/tools.py |  7 ++++++-
>  3 files changed, 30 insertions(+), 4 deletions(-)
>

I don't fully understand this, but perhaps it would make sense to give
the indirs names, like:

binman -I spl:path/to/spl  -I name2:path/to/somewhere-else

then you could use the names below, instead of the paths. It provide
at least a little separation.

Perhaps if you listed out the two dirs and the files they contain,
that would help me understand better.

> diff --git a/tools/binman/etype/blob.py b/tools/binman/etype/blob.py
> index 064fae5036..eccf6f87ac 100644
> --- a/tools/binman/etype/blob.py
> +++ b/tools/binman/etype/blob.py
> @@ -19,6 +19,8 @@ class Entry_blob(Entry):
>
>      Properties / Entry arguments:
>          - filename: Filename of file to read into entry
> +        - indir-path: Specific directory to fetch file from, if not provided
> +        default indir paths will be searched
>          - compress: Compression algorithm to use:
>              none: No compression
>              lz4: Use lz4 compression (via 'lz4' command-line utility)
> @@ -35,6 +37,7 @@ class Entry_blob(Entry):
>          super().__init__(section, etype, node,
>                           auto_write_symbols=auto_write_symbols)
>          self._filename = fdt_util.GetString(self._node, 'filename', self.etype)
> +        self._indir_path = fdt_util.GetString(self._node, 'indir-path', None)
>          self.elf_fname = fdt_util.GetString(self._node, 'elf-filename',
>                                              self.elf_fname)
>          self.elf_base_sym = fdt_util.GetString(self._node, 'elf-base-sym')
> @@ -44,8 +47,13 @@ class Entry_blob(Entry):
>
>      def ObtainContents(self, fake_size=0):
>          self._filename = self.GetDefaultFilename()
> -        self._pathname = tools.get_input_filename(self._filename,
> -            self.external and (self.optional or self.section.GetAllowMissing()))
> +        if self._indir_path:
> +            self._pathname = tools.get_input_filename(self._filename,
> +                self.external and (self.optional or self.section.GetAllowMissing()),
> +                self._indir_path)

I think this might as well just read the file, rather than calling
tools.get_input_filename()

> +        else:
> +            self._pathname = tools.get_input_filename(self._filename,
> +                self.external and (self.optional or self.section.GetAllowMissing()))
>          # Allow the file to be missing
>          if not self._pathname:
>              self._pathname, faked = self.check_fake_fname(self._filename,
> diff --git a/tools/binman/etype/fit.py b/tools/binman/etype/fit.py
> index ef4d066757..46db816370 100644
> --- a/tools/binman/etype/fit.py
> +++ b/tools/binman/etype/fit.py
> @@ -87,6 +87,15 @@ class Entry_fit(Entry_section):
>
>                  fit,fdt-list-val = "dtb1", "dtb2";
>
> +        fit,fdt-indir
> +            Indicates the specific directory (if any) to be used to pick up fdts
> +            generated in the gen-fdt-nodes property. For example, picking fdt from
> +            spl/dts instead of arch/arm/dts. This is equivalent to '-a spl/dts' but
> +            helps when multiple directories contain same named fdt to choose a
> +            specific one
> +
> +                fit,fdt-indir = "spl/dts"

Should this be a named indir? Otherwise you have to use the actual
dirs and that could be come quite brittle when things change.

> +
>      Substitutions
>      ~~~~~~~~~~~~~
>
> @@ -362,6 +371,7 @@ class Entry_fit(Entry_section):
>              if pname.startswith('fit,'):
>                  self._fit_props[pname] = prop
>          self._fit_list_prop = self._fit_props.get('fit,fdt-list')
> +        self._fit_indir = fdt_util.GetString(self._node, 'fit,fdt-indir', None)
>          if self._fit_list_prop:
>              fdts, = self.GetEntryArgsOrProps(
>                  [EntryArg(self._fit_list_prop.value, str)])
> @@ -583,7 +593,10 @@ class Entry_fit(Entry_section):
>                  # Generate nodes for each FDT
>                  for seq, fdt_fname in enumerate(self._fdts):
>                      node_name = node.name[1:].replace('SEQ', str(seq + 1))
> -                    fname = tools.get_input_filename(fdt_fname + '.dtb')
> +                    if self._fit_indir:
> +                        fname = tools.get_input_filename(fdt_fname + '.dtb', specific_indir=self._fit_indir)
> +                    else:
> +                        fname = tools.get_input_filename(fdt_fname + '.dtb')
>                      with fsw.add_node(node_name):
>                          for pname, prop in node.props.items():
>                              if pname == 'fit,firmware':
> diff --git a/tools/u_boot_pylib/tools.py b/tools/u_boot_pylib/tools.py
> index 187725b501..1b6f6b71d8 100644
> --- a/tools/u_boot_pylib/tools.py
> +++ b/tools/u_boot_pylib/tools.py
> @@ -123,12 +123,13 @@ def set_input_dirs(dirname):
>      indir = dirname
>      tout.debug("Using input directories %s" % indir)
>
> -def get_input_filename(fname, allow_missing=False):
> +def get_input_filename(fname, allow_missing=False, specific_indir=None):
>      """Return a filename for use as input.
>
>      Args:
>          fname: Filename to use for new file
>          allow_missing: True if the filename can be missing
> +        specific_indir: Directory to use to get file
>
>      Returns:
>          fname, if indir is None;
> @@ -140,6 +141,10 @@ def get_input_filename(fname, allow_missing=False):
>      """
>      if not indir or fname[:1] == '/':
>          return fname
> +    if specific_indir:
> +        pathname = os.path.join(specific_indir, fname)
> +        if os.path.exists(pathname):
> +            return pathname
>      for dirname in indir:
>          pathname = os.path.join(dirname, fname)
>          if os.path.exists(pathname):
> --
> 2.34.1
>

Regards,
Simon


More information about the U-Boot mailing list