Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 | # 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 |