diff options
author | Jett Rink <jettrink@chromium.org> | 2019-02-26 16:12:23 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2019-03-04 17:44:56 -0800 |
commit | 58fee9dbc2ef12bb436ceb18ad116ad2e421dd2d (patch) | |
tree | 1541271b17e285dec837291fbef22e45ace959ea | |
parent | f06b101887b370dacb6a974023edbdbdb84f3d75 (diff) | |
download | chrome-ec-58fee9dbc2ef12bb436ceb18ad116ad2e421dd2d.tar.gz |
makefile: add manifest header support
The ISH FW image needs to have a static manifest header prepended to
built ISH image before it can be loaded on to hardware.
The header we prepend is static and is the bare minimum to make the
corresponding shim loader work correctly.
BRANCH=none
BUG=b:122371717,b:124788278
TEST=ec.bin output will chain load properly when sent to the kernel
driver.
Change-Id: I5458782d70308c99e297b823fd085a74480d252e
Signed-off-by: Jett Rink <jettrink@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/1490671
Reviewed-by: Jack Rosenthal <jrosenth@chromium.org>
-rw-r--r-- | chip/ish/build.mk | 6 | ||||
-rwxr-xr-x | chip/ish/util/pack_ec.py | 61 |
2 files changed, 66 insertions, 1 deletions
diff --git a/chip/ish/build.mk b/chip/ish/build.mk index 7ae315c505..2af293e258 100644 --- a/chip/ish/build.mk +++ b/chip/ish/build.mk @@ -32,4 +32,8 @@ SCRIPTDIR:=./chip/${CHIP}/util # Allow SPI size to be overridden by board specific size, default to 256KB. CHIP_SPI_SIZE_KB?=256 -$(out)/$(PROJECT).bin: +# Commands to convert $^ to $@.tmp - This will add the manifest header needed +# to load the FW onto the ISH HW. +cmd_obj_to_bin = $(OBJCOPY) --gap-fill=0xff -O binary $< $@.tmp1 ; \ + ${SCRIPTDIR}/pack_ec.py -o $@.tmp -i $@.tmp1 \ + --image_size $(_rw_size); rm -f $@.tmp1 diff --git a/chip/ish/util/pack_ec.py b/chip/ish/util/pack_ec.py new file mode 100755 index 0000000000..7cb659d86b --- /dev/null +++ b/chip/ish/util/pack_ec.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python + +# Copyright 2019 The Chromium OS Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# A script to pack EC binary with manifest header according to +# Based on 607297_Host_ISH_Firmware_Load_Chrome_OS_SAS_Rev0p5.pdf, +# https://chrome-internal.googlesource.com/chromeos/intel-ish/+/refs/heads/upstream/master/modules/api/ish_api/include/loader_common.h#211, +# and b/124788278#comment10 + +import argparse +import struct + +MANIFEST_ENTRY_SIZE = 0x80 +HEADER_SIZE = 0x1000 +PAGE_SIZE = 0x1000 + +def parseargs(): + parser = argparse.ArgumentParser() + parser.add_argument("-i", "--input", + help="EC binary to pack, usually ec.bin or ec.RO.flat.") + parser.add_argument("-o", "--output", + help="Output flash binary file") + parser.add_argument("--image_size", type=int, + help="Size of a single image") + + return parser.parse_args() + +def gen_manifest(ext_id, comp_app_name, code_offset, module_size): + """Returns a binary blob that represents a manifest entry""" + m = bytearray(MANIFEST_ENTRY_SIZE) + + # 4 bytes of ASCII encode ID (little endian) + struct.pack_into('<4s', m, 0, ext_id) + # 8 bytes of ASCII encode ID (little endian) + struct.pack_into('<8s', m, 32, comp_app_name) + # 4 bytes of code offset (little endian) + struct.pack_into('<I', m, 96, code_offset) + # 2 bytes of module in page size increments (little endian) + struct.pack_into('<H', m, 100, module_size / PAGE_SIZE) + + return m + +def main(): + args = parseargs() + + with open(args.output, 'wb') as f: + # Add manifest for main ISH binary + f.write(gen_manifest('ISHM', 'ISH_KERN', HEADER_SIZE, args.image_size)) + # Add manifest that signals end of manifests + f.write(gen_manifest('ISHE', '', 0, 0)) + # Pad the remaining HEADER with 0s + f.write('\x00' * (HEADER_SIZE - (MANIFEST_ENTRY_SIZE * 2))) + + # Append original image + with open(args.input, 'rb') as in_file: + f.write(in_file.read()) + +if __name__ == '__main__': + main()
\ No newline at end of file |