[PATCH 10/12] binman: btool: Add Xilinx Bootgen btool

Simon Glass sjg at chromium.org
Sun Jul 2 17:48:24 CEST 2023


Hi Lukas,

On Fri, 30 Jun 2023 at 13:28, Lukas Funke
<lukas.funke-oss at weidmueller.com> wrote:
>
> On 30.06.2023 06:18, Simon Glass wrote:
> > Hi,
> >
> > On Thu, 29 Jun 2023 at 15:59, <lukas.funke-oss at weidmueller.com> wrote:
> >>
> >> From: Lukas Funke <lukas.funke at weidmueller.com>
> >>
> >> Add the Xilinx Bootgen as bintool. Xilinx Bootgen is used to create
> >> bootable SPL (FSBL in Xilinx terms) images for Zynq/ZynqMP devices. The
> >> btool creates a signed version of the SPL.
> >>
> >> Signed-off-by: Lukas Funke <lukas.funke at weidmueller.com>
> >> ---
> >>
> >>   tools/binman/btool/bootgen.py | 82 +++++++++++++++++++++++++++++++++++
> >>   1 file changed, 82 insertions(+)
> >>   create mode 100644 tools/binman/btool/bootgen.py
> >>
> >> diff --git a/tools/binman/btool/bootgen.py b/tools/binman/btool/bootgen.py
> >> new file mode 100644
> >> index 0000000000..8bc727a54f
> >> --- /dev/null
> >> +++ b/tools/binman/btool/bootgen.py
> >> @@ -0,0 +1,82 @@
> >> +# SPDX-License-Identifier: GPL-2.0+
> >> +# Copyright (C) 2023 Weidmüller Interface GmbH & Co. KG
> >> +# Lukas Funke <lukas.funke at weidmueller.com>
> >> +#
> >> +"""Bintool implementation for bootgen
> >> +
> >> +bootgen allows creating bootable SPL for Zynq(MP)
> >> +
> >> +Documentation is available via::
> >> +https://www.xilinx.com/support/documents/sw_manuals/xilinx2022_1/ug1283-bootgen-user-guide.pdf
> >
> > But you need to create some info here. It is good to have that link,
> > but we also need some about of info about it here.
> >
> > Overall this whole patch needs more docs and detail.
> >
> >> +
> >> +Source code is available at:
> >> +
> >> +https://github.com/Xilinx/bootgen
> >> +
> >> +"""
> >> +import tempfile
> >> +
> >> +from binman import bintool
> >> +from u_boot_pylib import tools
> >> +
> >> +# pylint: disable=C0103
> >> +class Bintoolbootgen(bintool.Bintool):
> >> +    """Generate bootable fsbl image for zynq/zynqmp
> >> +
> >> +    This bintools supports running Xilinx "bootgen" in order
> >> +    to generate a bootable, authenticated image form an SPL.
> >> +
> >> +    """
> >> +    def __init__(self, name):
> >> +        super().__init__(name, 'Xilinx Bootgen',
> >> +                         version_regex=r'^\*\*\*\*\*\* Xilinx Bootgen',
> >> +                         version_args='')
> >> +
> >> +    # pylint: disable=R0913
> >> +    def sign(self, arch, spl_elf_fname, pmufw_elf_fname,
> >> +             psk_fname, ssk_fname, fsbl_config, auth_params, output_fname):
> >> +        """ Sign FSBL(SPL) elf file and bundle it with pmu firmware
> >> +            to a bootable image
> >> +
> >> +        Args:
> >> +            arch (str): Xilinx SoC architecture
> >
> > what options are valid?
> >
> >> +            spl_elf_fname (str): Filename of FSBL ELF file
> >
> > what is FSBL?
> >
> >> +            pmufw_elf_fname (str): Filename pmu firmware
> >
> > what is pmu?
> >
> >> +            psk_fname (str): Filename of the primary secret key
> >> +            ssk_fname (str): Filename of the secondary secret key
> >
> > why are there two keys? What format is used for these keys?
> >
> >> +            fsbl_config (str): FSBL config options
> >
> > what options are available? What are valid vaulues for this arg?
> >
> >> +            auth_params (str): Authentication parameter
> >
> > what are valid values?
> >
> >> +            output_fname (str): Filename where bootgen should write the result
> >
> > This should really be handled automatically, I think. See how the
> > mkimage etype creates an output filename.
>
> Simon, thanks for the review!
>
> What to you mean by automatically? The mkimage btool also has an
> 'output_fname' argument as well. And the output filename is passed down
> from the mkimage etype to the mkimage btool. Should the bootgen btool
> generate the output_fname by itself and pass it back to the caller?

Oh I think I was getting confused with the 'filename' property used by
the mkimage entry type. What you are doing here looks fine to me.

>
> >
> >> +        """
> >> +
> >> +        _fsbl_config = f"[fsbl_config] {fsbl_config}" if fsbl_config else ""
> >> +        _auth_params = f"[auth_params] {auth_params}" if auth_params else ""
> >> +
> >> +        bif_template = f"""u_boot_spl_aes_rsa: {{
> >> +            [pskfile] {psk_fname}
> >> +            [sskfile] {ssk_fname}
> >> +            {_fsbl_config}
> >> +            {_auth_params}
> >> +            [ bootloader,
> >> +              authentication = rsa,
> >> +              destination_cpu=a53-0] {spl_elf_fname}
> >> +            [pmufw_image] {pmufw_elf_fname}
> >> +        }}"""
> >> +        args = ["-arch", arch]
> >> +
> >> +        with tempfile.NamedTemporaryFile(suffix=".bif",
> >> +                                         dir=tools.get_output_dir()) as bif:
> >
> > Please use a deterministic name - see mkimage etype for an example.
>
> The .bif file is a temporary input file passed to 'bootgen'.
>
> My intention was to make sure that the file is deleted afterwards. Would
> you prefer that the intermediate files are kept and the output file is
> deterministically created with "uniq = self.GetUniqueName()" and
> "output_fname = tools.get_output_filename('foo.%s' % uniq)"?
>
> If so, I would also change the way the ELF file is created in order to
> keep the intermediate results.
>
> >
> >> +            tools.write_file(bif.name, bif_template, binary=False)
> >> +            args += ["-image", bif.name, '-w', '-o', output_fname]
> >> +            self.run_cmd(*args)
> >> +
> >> +    def fetch(self, method):
> >> +        """Fetch bootgen from git"""
> >> +        if method != bintool.FETCH_BUILD:
> >> +            return None
> >> +
> >> +        result = self.build_from_git(
> >> +            'https://github.com/Xilinx/bootgen',
> >> +            'all',
> >> +            'build/bootgen/bootgen')
> >> +        return result
> >> --
> >> 2.30.2
> >>
Regards,
Simon


More information about the U-Boot mailing list