summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJett Rink <jettrink@chromium.org>2019-02-26 16:12:23 -0700
committerchrome-bot <chrome-bot@chromium.org>2019-03-04 17:44:56 -0800
commit58fee9dbc2ef12bb436ceb18ad116ad2e421dd2d (patch)
tree1541271b17e285dec837291fbef22e45ace959ea
parentf06b101887b370dacb6a974023edbdbdb84f3d75 (diff)
downloadchrome-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.mk6
-rwxr-xr-xchip/ish/util/pack_ec.py61
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