u-boot/tools/binman/btool/ifwitool.py
Simon Glass 6f7eb0c037 binman: Add a bintool implementation for ifwitool
Add a Bintool for this, which is used to build Intel IFWI images. It
supports the features needed by the tests as well as downloading a binary
from Google Drive. Although this is built in the U-Boot tree, it is not
currently included with u-boot-tools, so it may be useful to install a
binary on the system.

Signed-off-by: Simon Glass <sjg@chromium.org>
2022-01-25 12:36:11 -07:00

166 lines
4.6 KiB
Python

# 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