binman: Add a bintool implementation for fiptool

Add a Bintool for this, which is used to run FIP tests. It supports
the features needed by the tests as well as building a binary from
the git tree.

Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Simon Glass 2022-01-09 20:13:53 -07:00
parent d38833373b
commit bf87b203a3

View File

@ -0,0 +1,123 @@
# SPDX-License-Identifier: GPL-2.0+
# Copyright 2022 Google LLC
#
"""Bintool implementation for fiptool
fiptool provides a way to package firmware in an ARM Trusted Firmware Firmware
Image Package (ATF FIP) format. It is used with Trusted Firmware A, for example.
Documentation is at:
https://trustedfirmware-a.readthedocs.io/en/latest/getting_started/tools-build.html?highlight=fiptool#building-and-using-the-fip-tool
Source code is at:
https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git
Here is the help:
usage: fiptool [--verbose] <command> [<args>]
Global options supported:
--verbose Enable verbose output for all commands.
Commands supported:
info List images contained in FIP.
create Create a new FIP with the given images.
update Update an existing FIP with the given images.
unpack Unpack images from FIP.
remove Remove images from FIP.
version Show fiptool version.
help Show help for given command.
"""
from binman import bintool
class Bintoolfiptool(bintool.Bintool):
"""Image generation for ARM Trusted Firmware
This bintool supports running `fiptool` with some basic parameters as
neeed by binman.
It also supports build fiptool from source.
fiptool provides a way to package firmware in an ARM Trusted Firmware
Firmware Image Package (ATF FIP) format. It is used with Trusted Firmware A,
for example.
See `TF-A FIP tool documentation`_ for more information.
.. _`TF-A FIP tool documentation`:
https://trustedfirmware-a.readthedocs.io/en/latest/getting_started/tools-build.html?highlight=fiptool#building-and-using-the-fip-tool
"""
def __init__(self, name):
super().__init__(name, 'Manipulate ATF FIP files')
def info(self, fname):
"""Get info on a FIP image
Args:
fname (str): Filename to check
Returns:
str: Tool output
"""
args = ['info', fname]
return self.run_cmd(*args)
# pylint: disable=R0913
def create_new(self, fname, align, plat_toc_flags, fwu, tb_fw, blob_uuid,
blob_file):
"""Create a new FIP
Args:
fname (str): Filename to write to
align (int): Alignment to use for entries
plat_toc_flags (int): Flags to use for the TOC header
fwu (str): Filename for the fwu entry
tb_fw (str): Filename for the tb_fw entry
blob_uuid (str): UUID for the blob entry
blob_file (str): Filename for the blob entry
Returns:
str: Tool output
"""
args = [
'create',
'--align', f'{align:x}',
'--plat-toc-flags', f'{plat_toc_flags:#x}',
'--fwu', fwu,
'--tb-fw', tb_fw,
'--blob', f'uuid={blob_uuid},file={blob_file}',
fname]
return self.run_cmd(*args)
def create_bad(self):
"""Run fiptool with invalid arguments"""
args = ['create', '--fred']
return self.run_cmd_result(*args)
def fetch(self, method):
"""Fetch handler for fiptool
This builds the tool from source
Returns:
tuple:
str: Filename of fetched file to copy to a suitable directory
str: Name of temp directory to remove, or None
"""
if method != bintool.FETCH_BUILD:
return None
result = self.build_from_git(
'https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git',
'fiptool',
'tools/fiptool/fiptool')
return result
def version(self):
"""Version handler for fiptool
Returns:
str: Version number of fiptool
"""
out = self.run_cmd('version').strip()
return out or super().version()