diff options
author | Hu, Hebo <hebo.hu@intel.com> | 2019-03-29 15:10:31 +0800 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2019-04-08 02:51:30 -0700 |
commit | b6354559eac579681232adc63449a5aed2d25950 (patch) | |
tree | e273bb8ce5f0765efb15ee1c342b6f1e309406e9 /chip | |
parent | 6beb629714ce05108399cefc621b098fc58f03ce (diff) | |
download | chrome-ec-b6354559eac579681232adc63449a5aed2d25950.tar.gz |
ish/ish5: packing aontask binary and ecos main FW binary to final ec.bin
1: fixed module size not round up with page issue
2: fixed wrong kernel binary file issue, ISH only support RW image at current
3: add aontask binary into ec.bin
BUG=b:122364080, b:120682121
BRANCH=none
TEST=tested on arcada
Change-Id: I786169c32b0e2c50cbe6ad7bf476ae9c56ea1d09
Signed-off-by: Hu, Hebo <hebo.hu@intel.com>
Reviewed-on: https://chromium-review.googlesource.com/1545073
Commit-Ready: Hebo Hu <hebo.hu@intel.corp-partner.google.com>
Tested-by: Jett Rink <jettrink@chromium.org>
Reviewed-by: Yuval Peress <peress@chromium.org>
Reviewed-by: Jack Rosenthal <jrosenth@chromium.org>
Reviewed-by: Jett Rink <jettrink@chromium.org>
Reviewed-by: Hebo Hu <hebo.hu@intel.corp-partner.google.com>
Diffstat (limited to 'chip')
-rw-r--r-- | chip/ish/build.mk | 27 | ||||
-rwxr-xr-x | chip/ish/util/pack_ec.py | 70 |
2 files changed, 82 insertions, 15 deletions
diff --git a/chip/ish/build.mk b/chip/ish/build.mk index 4e7fdaa26a..b1481dfaf6 100644 --- a/chip/ish/build.mk +++ b/chip/ish/build.mk @@ -28,20 +28,39 @@ chip-$(CONFIG_DMA_PAGING)+=dma.o chip-$(CONFIG_LOW_POWER_IDLE)+=power_mgt.o ifeq ($(CONFIG_ISH_PM_AONTASK),y) + ish-aontask-fw=chip/ish/aontaskfw/ish_aontask ish-aontask-dma=chip/ish/dma ish-aontask-fw-bin=$(out)/$(ish-aontask-fw).bin PROJECT_EXTRA+=$(ish-aontask-fw-bin) + +_aon_size_str=$(shell stat -L -c %s $(ish-aontask-fw-bin)) +_aon_size=$(shell echo "$$(($(_aon_size_str)))") + +$(out)/$(PROJECT).bin: $(ish-aontask-fw-bin) $(out)/RW/$(PROJECT).RW.flat + endif +_kernel_size_str=$(shell stat -L -c %s $(out)/RW/$(PROJECT).RW.flat) +_kernel_size=$(shell echo "$$(($(_kernel_size_str)))") + # location of the scripts and keys used to pack the SPI flash image SCRIPTDIR:=./chip/${CHIP}/util # Allow SPI size to be overridden by board specific size, default to 256KB. CHIP_SPI_SIZE_KB?=256 -# Commands to convert $^ to $@.tmp - This will add the manifest header needed +# Commands to convert ec.RW.flat 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 + +ifeq ($(CONFIG_ISH_PM_AONTASK),y) +cmd_obj_to_bin = ${SCRIPTDIR}/pack_ec.py -o $@.tmp \ + -k $(out)/RW/$(PROJECT).RW.flat \ + --kernel-size $(_kernel_size) \ + -a $(ish-aontask-fw-bin) \ + --aon-size $(_aon_size); +else +cmd_obj_to_bin = ${SCRIPTDIR}/pack_ec.py -o $@.tmp \ + -k $(out)/RW/$(PROJECT).RW.flat \ + --kernel-size $(_kernel_size); +endif diff --git a/chip/ish/util/pack_ec.py b/chip/ish/util/pack_ec.py index 7cb659d86b..71a63dd42f 100755 --- a/chip/ish/util/pack_ec.py +++ b/chip/ish/util/pack_ec.py @@ -1,4 +1,5 @@ -#!/usr/bin/env python +#!/usr/bin/env python2 +# -*- coding: utf-8 -*-" # Copyright 2019 The Chromium OS Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be @@ -9,6 +10,14 @@ # 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 +"""Script to pack EC binary with manifest header. + +Package ecos main FW binary (kernel) and AON task binary into final EC binary +image with a manifest header, ISH shim loader will parse this header and load +each binaries into right memory location. +""" + +from __future__ import print_function import argparse import struct @@ -18,12 +27,22 @@ 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("-k", "--kernel", + help="EC kernel binary to pack, \ + usually ec.RW.bin or ec.RW.flat.", + required=True) + parser.add_argument("--kernel-size", type=int, + help="Size of EC kernel image", + required=True) + parser.add_argument("-a", "--aon", + help="EC aontask binary to pack, \ + usually ish_aontask.bin.", + required=False) + parser.add_argument("--aon-size", type=int, + help="Size of EC aontask image", + required=False) 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() @@ -38,24 +57,53 @@ def gen_manifest(ext_id, comp_app_name, code_offset, module_size): # 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) + struct.pack_into('<H', m, 100, module_size) return m +def roundup_page(size): + """Returns roundup-ed page size from size of bytes""" + return int(size / PAGE_SIZE) + (size % PAGE_SIZE > 0) + def main(): args = parseargs() + print(" Packing EC image file for ISH") with open(args.output, 'wb') as f: + print(" kernel binary size: %i" % args.kernel_size) + kern_rdup_pg_size = roundup_page(args.kernel_size) # Add manifest for main ISH binary - f.write(gen_manifest('ISHM', 'ISH_KERN', HEADER_SIZE, args.image_size)) + f.write(gen_manifest('ISHM', 'ISH_KERN', HEADER_SIZE, kern_rdup_pg_size)) + + if args.aon is not None: + print(" AON binary size: %i" % args.aon_size) + aon_rdup_pg_size = roundup_page(args.aon_size) + # Add manifest for aontask binary + f.write(gen_manifest('ISHM', 'AON_TASK', + (HEADER_SIZE + kern_rdup_pg_size * PAGE_SIZE - + MANIFEST_ENTRY_SIZE), aon_rdup_pg_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))) + if args.aon is not None: + f.write('\x00' * (HEADER_SIZE - (MANIFEST_ENTRY_SIZE * 3))) + else: + f.write('\x00' * (HEADER_SIZE - (MANIFEST_ENTRY_SIZE * 2))) - # Append original image - with open(args.input, 'rb') as in_file: + # Append original kernel image + with open(args.kernel, 'rb') as in_file: f.write(in_file.read()) + # Filling padings due to size round up as pages + f.write('\x00' * (kern_rdup_pg_size * PAGE_SIZE - args.kernel_size)) + + if args.aon is not None: + # Append original aon image + with open(args.aon, 'rb') as in_file: + f.write(in_file.read()) + # Filling padings due to size round up as pages + f.write('\x00' * (aon_rdup_pg_size * PAGE_SIZE - args.aon_size)) if __name__ == '__main__': - main()
\ No newline at end of file + main() |