| # SPDX-License-Identifier: GPL-2.0+ | |
| # Copyright 2022 Google LLC | |
| # | |
| """Bintool implementation for ifwitool | |
| ifwitool provides a way to package firmware in an Intel Firmware Image (IFWI) | |
| file on some Intel SoCs, e.g. Apolo Lake. | |
| Documentation is not really available so far as I can tell | |
| Source code is at tools/ifwitool.c which is a cleaned-up version of | |
| https://github.com/coreboot/coreboot/blob/master/util/cbfstool/ifwitool.c | |
| Here is the help: | |
| ifwitool: Utility for IFWI manipulation | |
| USAGE: | |
| /tmp/b/sandbox/tools/ifwitool [-h] | |
| /tmp/b/sandbox/tools/ifwitool FILE COMMAND [PARAMETERS] | |
| COMMANDs: | |
| add -f FILE -n NAME [-d -e ENTRY] | |
| create -f FILE | |
| delete -n NAME | |
| extract -f FILE -n NAME [-d -e ENTRY] | |
| print [-d] | |
| replace -f FILE -n NAME [-d -e ENTRY] | |
| OPTIONs: | |
| -f FILE : File to read/write/create/extract | |
| -d : Perform directory operation | |
| -e ENTRY: Name of directory entry to operate on | |
| -v : Verbose level | |
| -h : Help message | |
| -n NAME : Name of sub-partition to operate on | |
| NAME should be one of: | |
| SMIP(SMIP) | |
| RBEP(CSE_RBE) | |
| FTPR(CSE_BUP) | |
| UCOD(Microcode) | |
| IBBP(Bootblock) | |
| S_BPDT(S-BPDT) | |
| OBBP(OEM boot block) | |
| NFTP(CSE_MAIN) | |
| ISHP(ISH) | |
| DLMP(CSE_IDLM) | |
| IFP_OVERRIDE(IFP_OVERRIDE) | |
| DEBUG_TOKENS(Debug Tokens) | |
| UFS_PHY(UFS Phy) | |
| UFS_GPP(UFS GPP) | |
| PMCP(PMC firmware) | |
| IUNP(IUNIT) | |
| NVM_CONFIG(NVM Config) | |
| UEP(UEP) | |
| UFS_RATE_B(UFS Rate B Config) | |
| """ | |
| from binman import bintool | |
| class Bintoolifwitool(bintool.Bintool): | |
| """Handles the 'ifwitool' tool | |
| This bintool supports running `ifwitool` with some basic parameters as | |
| neeed by binman. It includes creating a file from a FIT as well as adding, | |
| replacing, deleting and extracting subparts. | |
| The tool is built as part of U-Boot, but a binary version can be fetched if | |
| required. | |
| ifwitool provides a way to package firmware in an Intel Firmware Image | |
| (IFWI) file on some Intel SoCs, e.g. Apolo Lake. | |
| """ | |
| def __init__(self, name): | |
| super().__init__(name, 'Manipulate Intel IFWI files') | |
| def create_ifwi(self, intel_fit, ifwi_file): | |
| """Create a new IFWI file, using an existing Intel FIT binary | |
| Args: | |
| intel_fit (str): Filename of exist Intel FIT file | |
| ifwi_file (str): Output filename to write the new IFWI too | |
| Returns: | |
| str: Tool output | |
| """ | |
| args = [intel_fit, 'create', '-f', ifwi_file] | |
| return self.run_cmd(*args) | |
| def delete_subpart(self, ifwi_file, subpart): | |
| """Delete a subpart within the IFWI file | |
| Args: | |
| ifwi_file (str): IFWI filename to update | |
| subpart (str): Name of subpart to delete, e.g. 'OBBP' | |
| Returns: | |
| str: Tool output | |
| """ | |
| args = [ifwi_file, 'delete', '-n', subpart] | |
| return self.run_cmd(*args) | |
| # pylint: disable=R0913 | |
| def add_subpart(self, ifwi_file, subpart, entry_name, infile, | |
| replace=False): | |
| """Add or replace a subpart within the IFWI file | |
| Args: | |
| ifwi_file (str): IFWI filename to update | |
| subpart (str): Name of subpart to add/replace | |
| entry_nme (str): Name of entry to add/replace | |
| replace (bool): True to replace the existing entry, False to add a | |
| new one | |
| Returns: | |
| str: Tool output | |
| """ | |
| args = [ | |
| ifwi_file, | |
| 'replace' if replace else 'add', | |
| '-n', subpart, | |
| '-d', '-e', entry_name, | |
| '-f', infile, | |
| ] | |
| return self.run_cmd(*args) | |
| def extract(self, ifwi_file, subpart, entry_name, outfile): | |
| """Extract a subpart from the IFWI file | |
| Args: | |
| ifwi_file (str): IFWI filename to extract from | |
| subpart (str): Name of subpart to extract | |
| entry_nme (str): Name of entry to extract | |
| Returns: | |
| str: Tool output | |
| """ | |
| args = [ | |
| ifwi_file, | |
| 'extract', | |
| '-n', subpart, | |
| '-d', '-e', entry_name, | |
| '-f', outfile, | |
| ] | |
| return self.run_cmd(*args) | |
| def fetch(self, method): | |
| """Fetch handler for ifwitool | |
| This installs ifwitool using a binary download. | |
| Args: | |
| method (FETCH_...): Method to use | |
| Returns: | |
| True if the file was fetched, None if a method other than FETCH_BIN | |
| was requested | |
| Raises: | |
| Valuerror: Fetching could not be completed | |
| """ | |
| if method != bintool.FETCH_BIN: | |
| return None | |
| fname, tmpdir = self.fetch_from_drive( | |
| '18JDghOxlt2Hcc5jv51O1t6uNVHQ0XKJS') | |
| return fname, tmpdir |