# 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()
