| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- # 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
|