Commit Graph

108 Commits

Author SHA1 Message Date
Che-yu Wu
af32f8918e extra/stack_analyzer: Eliminate annotated indirect calls.
Indirect calls can be eliminated by adding corresponding annotations.

BUG=chromium:648840
BRANCH=none
TEST=extra/stack_analyzer/stack_analyzer_unittest.py
     make BOARD=elm && extra/stack_analyzer/stack_analyzer.py \
         --objdump=arm-none-eabi-objdump \
         --addr2line=arm-none-eabi-addr2line \
         --export_taskinfo=./build/elm/util/export_taskinfo.so \
         --section=RW \
         --annotation=./extra/stack_analyzer/example_annotation.yaml \
         ./build/elm/RW/ec.RW.elf
     make BOARD=elm SECTION=RW \
         ANNOTATION=./extra/stack_analyzer/example_annotation.yaml \
         analyzestack

Change-Id: I18c317f9c6478b5b431ee04d882453791df27891
Signed-off-by: Che-yu Wu <cheyuw@google.com>
Reviewed-on: https://chromium-review.googlesource.com/631082
Reviewed-by: Nicolas Boichat <drinkcat@chromium.org>
Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
2017-08-29 04:45:51 -07:00
Nick Sanders
4fc9cf4c11 sweetberry: converter tool for servo_ina
convert_servo_ina.py can convert power log config
files from hdctools/servo/data into sweetberry configs

BRANCH=None
BUG=b:35578707
TEST=compare kevin_r0_loc.py output with kevin.board

Change-Id: Iadc57fe4eb1f5b220c6bffe3a3fe8a10b0d6b5a2
Signed-off-by: Nick Sanders <nsanders@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/634486
2017-08-28 21:15:34 -07:00
Nick Sanders
c2d4746c37 tigertool: add power log and version
--power provides a single sample from the INA
--powerlog [n] provides n samples
--check_version returns the tigertail's firmware version
--bus selects which bus to probe power on [vbus|cc1|cc2]

BRANCH=None
BUG=b:35849284
TEST=check power readings, version.

Change-Id: I728d954b6649fe0401093bf3beb7ec89f27822a6
Signed-off-by: Nick Sanders <nsanders@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/634566
Reviewed-by: Aseda Aboagye <aaboagye@chromium.org>
2017-08-25 21:52:51 -07:00
Che-yu Wu
4f21ee309c extra/stack_analyzer: Show indirect calls.
Show the indirect calls found in disassembly.

BUG=chromium:648840
BRANCH=none
TEST=extra/stack_analyzer/stack_analyzer_unittest.py
     make BOARD=elm && extra/stack_analyzer/stack_analyzer.py \
         --objdump=arm-none-eabi-objdump \
         --addr2line=arm-none-eabi-addr2line \
         --export_taskinfo=./build/elm/util/export_taskinfo.so \
         --section=RW \
         --annotation=./extra/stack_analyzer/example_annotation.yaml \
         ./build/elm/RW/ec.RW.elf
     make BOARD=elm SECTION=RW \
         ANNOTATION=./extra/stack_analyzer/example_annotation.yaml \
         analyzestack

Change-Id: Ib82e68e0bc6c4be56ab679c297f256cbfe94bbb7
Signed-off-by: Che-yu Wu <cheyuw@google.com>
Reviewed-on: https://chromium-review.googlesource.com/628048
Reviewed-by: Nicolas Boichat <drinkcat@chromium.org>
2017-08-24 01:25:51 -07:00
Che-yu Wu
eeeee803b7 extra/stack_analyzer: Show callsite information.
Show callsite details in the call trace.
Handle another addr2line failure output.

BUG=chromium:648840
BRANCH=none
TEST=extra/stack_analyzer/stack_analyzer_unittest.py
     make BOARD=elm && extra/stack_analyzer/stack_analyzer.py \
         --objdump=arm-none-eabi-objdump \
         --addr2line=arm-none-eabi-addr2line \
         --export_taskinfo=./build/elm/util/export_taskinfo.so \
         --section=RW \
         --annotation=./extra/stack_analyzer/example_annotation.yaml \
         ./build/elm/RW/ec.RW.elf
     make BOARD=elm SECTION=RW \
         ANNOTATION=./extra/stack_analyzer/example_annotation.yaml \
         analyzestack

Change-Id: I3f36584af85f578f1d298bcd06622ba8e7e5262d
Signed-off-by: Che-yu Wu <cheyuw@google.com>
Reviewed-on: https://chromium-review.googlesource.com/628000
Reviewed-by: Nicolas Boichat <drinkcat@chromium.org>
2017-08-23 23:13:38 -07:00
Nicolas Boichat
bee02b49b0 usb_updater2: Add support for INJECT_ENTROPY command
Necessary for pairing support. Cleaner implementation to be moved
to hammerd.

BRANCH=none
BUG=b:38487027
TEST=Flash hammer. On host, reboot hammer to RO:
     usb_updater2 -r; sleep 0.5; usb_updater2 -s
     usb_updater2 -e (adds entropy)
     EC console: check that rollbackinfo shows secret is updated

Change-Id: I7b354c7bb1b6d4260939dc33fe6cb4ab4ecd50e0
Signed-off-by: Nicolas Boichat <drinkcat@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/513809
Reviewed-by: Chun-ta Lin <itspeter@chromium.org>
2017-08-23 19:04:17 -07:00
Nick Sanders
493b974124 sweetberry: modify powerlog.py to support multiple devices
powerlog.py can now take -A serialA -B serialB to collect data
from both left and right sweetberries simultaneously.

Also, the Spower class has been modified to allow API usage
rather than console only usage.

BRANCH=None
BUG=chromium:608039
TEST=log from both sweetberries on marlin

Signed-off-by: Nick Sanders <nsanders@chromium.org>
Change-Id: Iaeaddad223f35f0e5cad1549b85fa3f7e4d5e1c7
Reviewed-on: https://chromium-review.googlesource.com/422496
Reviewed-by: Aseda Aboagye <aaboagye@chromium.org>
2017-08-22 21:34:43 -07:00
Sam Hurst
b59ba48d7e extra: Add Dummy RMA reset auth challenge-response application
Dummy RMA reset application that's used by the RMA Server
Side implementer. Currently everything is hard coded in the app.
This application will be replaced when the actual app is ready.

BUG=b:37952913
BRANCH=none
TEST=make buildall -j
     ./rma_test
     Board Id:
     Z Z C R

     Device Id:
     T H X 01 01 03 08 fe

     Server Key Id:
     10

     Server Private Key:
     47 3b a5 db c4 bb d6 77
     20 bd d8 bd c8 7a bb 07
     03 79 ba 7b 52 8c ec b3
     4d aa 69 f5 65 b4 31 ad

     Server Public Key:
     03 ae 2d 2c 06 23 e0 73
     0d d3 b7 92 ac 54 c5 fd
     7e 9c f0 a8 eb 7e 2a b5
     db f4 79 5f 8a 0f 28 3f

     Challenge:
     CC5QQ LALUS BUPJC TWSYN PAPPN AUEVZ HEMUD GD5DK
     DSM5C VH4SZ LJAZL GDUYM U4JPK FJUCA 2AEAS GCH8W

     Authorization Code:
     P5PSCTS6

     Challenge String:
https://www.google.com/chromeos/partner/console/cr50reset/request?challenge=CC5QQLALUSBUPJCTWSYNPAPPNAUEVZHEMUDGD5DKDSM5CVH4SZLJAZLGDUYMU4JPKFJUCA2AEASGCH8W&hwid=HWIDTEST2082

     Enter Authorization Code: abcd

     Code is invalid

     Enter Authorization Code: P5PSCTS6
     Code Accepted

Change-Id: Id4141861b53745cf7bb67a885fa01dd6f4b4cd04
Signed-off-by: Sam Hurst <shurst@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/622283
Commit-Ready: Sam Hurst <shurst@google.com>
Tested-by: Sam Hurst <shurst@google.com>
Reviewed-by: Michael Tang <ntang@chromium.org>
2017-08-22 21:34:42 -07:00
Che-yu Wu
00e0222729 extra/stack_analyzer: Fix cbz/cbnz and addr2line parsing.
Fix the cbz/cbnz operands parsing.
Parse the discriminator output of addr2line.

BUG=none
BRANCH=none
TEST=extra/stack_analyzer/stack_analyzer_unittest.py

Change-Id: Iade1c14db0dc63fa65ef0f5df778b4f4f1e4f802
Signed-off-by: Che-yu Wu <cheyuw@google.com>
Reviewed-on: https://chromium-review.googlesource.com/625498
Reviewed-by: Nicolas Boichat <drinkcat@chromium.org>
2017-08-22 05:08:48 -07:00
Che-yu Wu
ef09835e19 ec: Add annotation feature to the stack analyzer.
Get stack analyzer supported to read annotation file and do basic
annotation on the callgraph.

The basic annotation includes:
1. Add missing calls to the callgraph
2. Ignore functions on the callgraph

BUG=chromium:648840
BRANCH=none
TEST=extra/stack_analyzer/stack_analyzer_unittest.py
     make BOARD=elm && extra/stack_analyzer/stack_analyzer.py \
         --objdump=arm-none-eabi-objdump \
         --addr2line=arm-none-eabi-addr2line \
         --export_taskinfo=./build/elm/util/export_taskinfo.so \
         --section=RW \
         --annotation=./extra/stack_analyzer/example_annotation.yaml \
         ./build/elm/RW/ec.RW.elf
     make BOARD=elm SECTION=RW \
         ANNOTATION=./extra/stack_analyzer/example_annotation.yaml \
         analyzestack

Change-Id: I4cc7c34f422655708a7312db3f6b4416e1af917f
Signed-off-by: Che-yu Wu <cheyuw@google.com>
Reviewed-on: https://chromium-review.googlesource.com/614825
Reviewed-by: Nicolas Boichat <drinkcat@chromium.org>
Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
2017-08-21 23:48:14 -07:00
Che-yu Wu
79e3b1c5e2 ec: Fix object comparison in the stack analyzer
Handle the case of comparing with different kinds of objects.

BUG=none
BRANCH=none
TEST=extra/stack_analyzer/stack_analyzer_unittest.py

Change-Id: I01056cd39e14d75442d4029b6c64d9843c49cf2a
Signed-off-by: Che-yu Wu <cheyuw@google.com>
Reviewed-on: https://chromium-review.googlesource.com/616367
Reviewed-by: Nicolas Boichat <drinkcat@chromium.org>
2017-08-16 02:06:00 -07:00
Che-yu Wu
64ecddfd86 ec: Add a task information library for the stack analyzer.
Add a shared library to export task information.
Modified the stack analyzer to get information from the shared library.
Show allocated stack sizes of tasks in the stack analyzer.

To get the all task information (including the allocated stack size),
A shared library is added and compiled with the board to export all
configurations of the tasklist.

BUG=chromium:648840
BRANCH=none
TEST=extra/stack_analyzer/stack_analyzer_unittest.py
     make BOARD=elm && extra/stack_analyzer/stack_analyzer.py \
         --objdump=arm-none-eabi-objdump \
         --addr2line=arm-none-eabi-addr2line \
         --export_taskinfo=./build/elm/util/export_taskinfo.so \
         --section=RW \
         ./build/elm/RW/ec.RW.elf
     make BOARD=${BOARD} SECTION=${SECTION} analyzestack

Change-Id: I72f01424142bb0a99c6776a55735557308e2cab6
Signed-off-by: Che-yu Wu <cheyuw@google.com>
Reviewed-on: https://chromium-review.googlesource.com/611693
Reviewed-by: Nicolas Boichat <drinkcat@chromium.org>
2017-08-15 00:25:20 -07:00
Che-yu Wu
1bf7abdc20 ec: Add analysis tool for firmware stack usage.
Add a static analysis tool for firmware stack usage.
Add an new Makefile rule to analyze the stack usages of firmwares.

Details about the tool can be found in extra/stack_analyzer/README.md.

BUG=chromium:648840
BRANCH=none
TEST=extra/stack_analyzer/stack_analyzer_unittest.py
     make BOARD=elm && make BOARD=elm build/elm/RW/ec.RW.taskinfo && \
         extra/stack_analyzer/stack_analyzer.py \
         --objdump=arm-none-eabi-objdump \
         --addr2line=arm-none-eabi-addr2line \
         ./build/elm/RW/ec.RW.elf ./build/elm/RW/ec.RW.taskinfo
     make BOARD=${BOARD} SECTION=${SECTION} analyzestack

Change-Id: Ifb1b5f5ad6be8f8b125b14d6ee03e25cb385895b
Signed-off-by: Che-yu Wu <cheyuw@google.com>
Reviewed-on: https://chromium-review.googlesource.com/576411
Reviewed-by: Nicolas Boichat <drinkcat@chromium.org>
2017-08-14 05:54:35 -07:00
Gwendal Grignou
734ebcbbb4 extra: usb_updater: include config.h
board.h and config-chip.h should only be called from config.h, otherwise
some #define may not be set properly.

BUG=chromium:746471
BRANCH=none
TEST=Found a bug while compiling OTP changes (c/580289/)
(https://luci-milo.appspot.com/buildbot/chromiumos.tryserver/
         no_vmtest_pre_cq/81548)
The size of the serial number string is set in config.h when
CONFIG_USB_SERIALNO is needed.
Compile with ec-utils with cr50_onboard USE flag set.

Change-Id: I5a2306bd0dc1dea29265226f2986829b768cfb61
Signed-off-by: Gwendal Grignou <gwendal@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/581887
Reviewed-by: Randall Spangler <rspangler@chromium.org>
Reviewed-by: Nicolas Boichat <drinkcat@chromium.org>
2017-07-28 17:45:12 -07:00
Vadim Bendebury
a9c26a97ef usb_updater: fix transposed symbolic board ID representation
When usb_udpater reads board ID information from a binary blob, in
case the ID field can be represented as a 4 character ASCII string the
updater transposes the characters, resulting in a reversed string
printed.

Fix the transposition to verify that the result is printed properly.

BRANCH=none
BUG=b:63597142
TEST=ran the following commands:
  $ make BOARD=cr50
  $ CR50_BOARD_ID='TEST:ff00:ff00' H1_DEVIDS='0x0169c181 0x04656742' \
      ./util/signer/bs
  $  ./extra/usb_updater/usb_updater -b build/cr50/ec.bin
  read 524288(0x80000) bytes from build/cr50/ec.bin
  RO_A:4919.0.0 RW_A:0.0.21[TEST:0000ff00:0000ff00] RO_B:-1.-1.-1 ...

Change-Id: I852cf9505d6b8b9e7133ca1008be1b22081a9d88
Signed-off-by: Vadim Bendebury <vbendeb@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/567681
Reviewed-by: Mary Ruthven <mruthven@chromium.org>
2017-07-11 22:19:59 -07:00
Vadim Bendebury
f50e0086e6 usb_updater: display board ID information from RW headers
This patch adds code to interpret the contents of the Cr50 image's RW
headers board ID fields.

Board ID fields are added to the RW and RW_B version strings, as a
three field colon separated value.

The actual board ID is likely to be a 4 symbol ASCII string, if it
is, the 4 ASCII characters are displayed. If it is not - the 8
character hex value is printed. The rest of the fields are displayed
as 8 characters hex values.

BRANCH=none
BUG=b:62294740
TEST=tried the new option on various Cr50 images:
  $ ./extra/usb_updater/usb_updater -b build/cr50/ec.bin
  read 524288(0x80000) bytes from build/cr50/ec.bin
  RO_A:4919.0.0 RW_A:0.0.21[00000000:00000000:00000000] ...
  $ ./extra/usb_updater/usb_updater  -b cr50.bin.dev
  read 524288(0x80000) bytes from cr50.bin.dev
  RO_A:0.0.10 RW_A:0.0.21[XXXR:00000004:00000001]...

Change-Id: I5a92a600d24e4a7d6d615f256b5979414e883d77
Signed-off-by: Vadim Bendebury <vbendeb@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/562919
Reviewed-by: Randall Spangler <rspangler@chromium.org>
2017-07-10 11:22:36 -07:00
Chun-Ta Lin
b3a7ede47d hammer: prepare and update the trackpad firmware
Implement the necessary bits for updating the trackpad firmware over
I2C, primarily following the protocol from open source driver.

BRANCH=none
BUG=b:35587174
TEST=Manually update firmware and confirmed reported FW version changed.

Change-Id: Ice5098269803f524de0b6a853f5a98f28382a7fb
Reviewed-on: https://chromium-review.googlesource.com/532765
Commit-Ready: Nicolas Boichat <drinkcat@chromium.org>
Tested-by: Chun-ta Lin <itspeter@chromium.org>
Reviewed-by: Nicolas Boichat <drinkcat@chromium.org>
2017-06-22 03:34:50 -07:00
Vadim Bendebury
bdbb45b14a usb_updater: allow symbolic Board IDs
When specifying board ID to program, it is convenient to be able to
specify the ID as a string, as reported by the RLZ stored in the VPD.

With this patch the first component of the board_id command line
option is considered a string if it is no longer than 4 bytes.

BRANCH=cr50
BUG=b:35587387,b:35587053

TEST=ran the following commands (interleaved with erasing INFO1 on the
     target):

  localhost ~ # usb_updater -s -i
  Board ID space: ffffffff:ffffffff:ffffffff
  localhost ~ # usb_updater -s -i ABCD
  localhost ~ # usb_updater -s -i
  Board ID space: 41424344:bebdbcbb:0000ff00
  localhost ~ # usb_updater -s -i
  Board ID space: ffffffff:ffffffff:ffffffff
  localhost ~ # usb_updater -s -i 0x41424344:0x1234
  localhost ~ # usb_updater -s -i
  Board ID space: 41424344:bebdbcbb:00001234
  localhost ~ # usb_updater -s -i
  Board ID space: ffffffff:ffffffff:ffffffff
  localhost ~ # usb_updater -s -i ABCD:0x1234
  localhost ~ # usb_updater -s -i
  Board ID space: 41424344:bebdbcbb:00001234

Change-Id: Ied8b240d60ea50f6fc8633f919ce4bc81ac17727
Signed-off-by: Vadim Bendebury <vbendeb@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/528440
Reviewed-by: Randall Spangler <rspangler@chromium.org>
2017-06-09 13:27:52 -07:00
Chun-Ta Lin
0b5e3aa642 hammer: initial commit for trackpad firmware updater
Tool to update the trackpad firmware over USB. Primarily borrowed from
extra/usb_console/usb_console.c

BRANCH=none
BUG=b:35587174
TEST=Manually executed with hammer

Change-Id: Icad951d2478a3e231f293e11fb461eaae20e5042
Reviewed-on: https://chromium-review.googlesource.com/525192
Commit-Ready: Chun-ta Lin <itspeter@chromium.org>
Tested-by: Chun-ta Lin <itspeter@chromium.org>
Reviewed-by: Nicolas Boichat <drinkcat@chromium.org>
2017-06-09 07:10:41 -07:00
Vadim Bendebury
25fb7bb3e5 Cr50: usb_updater: add commands to get/set board id
This patch enhances the Cr50 usb_updater to allow to get and set Board
ID value saved in the Cr50's INFO1 space using the earlier introduced
dedicated vendor commands.

Getting or Setting the board ID does not require establishing a
connection with the Cr50, the new option is --board_id/-i. When
specified without a parameter, the new option will cause the Board ID
to be read. When specified with a parameter, the board ID value will
be set. The parameter includes one or two values in a single string,
the values separated by a colon.

The first value is a 4 byte board ID, and the second value is the
flags field. The default flags field is set to 0xff00.

BRANCH=cr50
BUG=b:35587387,b:35587053
TEST=verified that it is possible to get and set the board ID value
      using usb_updater, both over USB and TPM.

      verified that it is not possible to set a new board ID value is
      the INFO1 space has been already programmed.

      verified that it is not possible to set a board ID value which
      would not allow the currently running image to start (even
      though there is no run time check yet).

Change-Id: Ief175d8b2ef3177db13fa86f831914088d9447b0
Signed-off-by: Vadim Bendebury <vbendeb@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/525096
Reviewed-by: Aseda Aboagye <aaboagye@chromium.org>
2017-06-07 03:02:55 -07:00
Vadim Bendebury
885c02a92d cr50: usb_updater: do not send setup request unless necessary
There are only two usb_updater actions which require establishing a
connection with the Cr50: transferring the firmware image during
update and reporting the version of the running image (because the
version is reported when the connection is established).

This patch refactors usb_updater code to establish the connection only
when necessary.

BRANCH=cr50
BUG=b:35587387,b:35587053
TEST=verified that 'usb_updater -c' succeeds both issued over USB and
      TPM

Change-Id: I6a0c82eb440c092263d4802f124f458f148a8ab5
Signed-off-by: Vadim Bendebury <vbendeb@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/525095
Reviewed-by: Aseda Aboagye <aaboagye@chromium.org>
2017-06-06 17:09:28 -07:00
Vadim Bendebury
b06942187e cr50: usb_updater: add proper vendor command processing
So far vendor command processing has been a second class citizen in
the Cr50 usb_updater: return codes were mostly ignored even when using
TPM, when using USB there was no way to communicate return codes at
all.

This patch refactors the source code to use a single function to
process vendor commands over both USB and TPM, adding proper passing
of the result codes back to the caller in both cases, retrieving the
return code from the response header when using TPM and from the first
byte of the response payload when using USB.

BRANCH=cr50
BUG=b:35587387,b:35587053
TEST=verified that it is possible to update rw13, rw18 and rw20 both
     over TPM and USB, which indicates that vendor commands are
     properly handled.

Change-Id: I837e17b29d3b025fbca5b1ef49463cfb1729fe6c
Signed-off-by: Vadim Bendebury <vbendeb@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/525094
Reviewed-by: Aseda Aboagye <aaboagye@chromium.org>
2017-06-06 17:09:27 -07:00
Vadim Bendebury
9f4ba5940a usb_updater: add usb_updater2 to gitignore
The newly generated file is now showing up in 'git status' output,
let's hide it.

BRANCH=none
BUG=none
TEST='git status' output is now clean even after running 'make -C
     extra/usb_updater'.

Change-Id: I6f7e93b303cfff89ec8ae7b3a74286a743e9c27e
Signed-off-by: Vadim Bendebury <vbendeb@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/517677
Reviewed-by: Nicolas Boichat <drinkcat@chromium.org>
2017-05-31 21:14:30 -07:00
Vadim Bendebury
bd0f74a6f4 usb_updater: when communicating over tpm treat upgrades differently
All extension and vendor commands' payloads need to be passed to the
processing functions the same way, whether they arrive over /dev/tpm0
or over USB. The upgrade PDUs sent over USB need to include two
additional fields which are stripped off by the reassembly layer on
the Cr50.

This patch makes sure that none of other than EXTENSION_FW_UPGRADE
commands sent over /dev/tpm0 by usb_updater have the extra
encapsulation.

BRANCH=cr50
BUG=b:62106898
TEST=verified that updates work the same way over TPM and USB (which
     includes sending the 'turn_update_on' commands. Before this patch
     the turn_update_on command sent by usb_updater over TPM was not
     processed properly (the timeout value was wrong).

Change-Id: I3f4ab7330037f6eb1ce8bac7c63faa5d7c309c94
Signed-off-by: Vadim Bendebury <vbendeb@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/517416
Reviewed-by: Andrey Pronin <apronin@chromium.org>
2017-05-31 21:14:29 -07:00
Nick Sanders
3219d9988b tigertool: update pyusb calls
Update pyusb calling format to match chroot
version.

BRANCH=None
BUG=b:35849284
TEST=flash, control tigertail successfully

Change-Id: I27f34d63c8ddc09c903dcc1da39d18e7dbf15710
Reviewed-on: https://chromium-review.googlesource.com/511668
Commit-Ready: Nick Sanders <nsanders@chromium.org>
Tested-by: Nick Sanders <nsanders@chromium.org>
Reviewed-by: Aseda Aboagye <aaboagye@chromium.org>
2017-05-25 00:14:08 -07:00
Nicolas Boichat
1d10236f07 usb_updater2: USB updater for common code EC
This is copied chip/g version as of commit 0e5497db6, plus the following
uncommited usb_update patch (CL:458469):
a0176a1cc usb_updater: Flush all data from endpoint before trying to update

On top of that, a good number of common-code specific modifications are
added: new extra commands, new first_response_pdu format, use of FMAP.

BRANCH=none
BUG=b:35587170
TEST=usb_updater binary identical before and after this change.
TEST=make BOARD=hammer -j && \
     ( cd extra/usb_updater && make && \
       time sudo ./usb_updater2 ../../build/hammer/ec.bin )
TEST=cd extra/usb_updater; make
     # Jump to RW
     sudo ./usb_updater2 -j
     sleep 0.5
     # Update RO, then reboot
     sudo ./usb_updater2 ../../build/hammer/ec.bin
     sleep 0.5
     # Update RW (first tell RO to not jump to RW)
     sudo ./usb_updater2 -s
     sudo ./usb_updater2 ../../build/hammer/ec.bin
TEST=cd extra/usb_updater; make
     # Tell RW to jump back to RO
     sudo ./usb_updater2 -w
     sleep 0.5
     # Update RW, then reboot
     sudo ./usb_updater2 -s
     sudo ./usb_updater2 ../../build/hammer/ec.bin
TEST=usb_updater2 can update hammer, and read its version, rollback
     version and key version.

Change-Id: I09da894d83e2b4d6c2e46cab301522c27fa0160c
Reviewed-on: https://chromium-review.googlesource.com/458468
Commit-Ready: Nicolas Boichat <drinkcat@chromium.org>
Tested-by: Nicolas Boichat <drinkcat@chromium.org>
Reviewed-by: Nick Sanders <nsanders@chromium.org>
2017-05-21 03:06:24 -07:00
Nick Sanders
395fce39e2 tigertail: tigertool command line api
This tool allows an easy commandline interface to set the
USB-C mux position, as well as init and reboot.

BRANCH=None
BUG=b:35849284
TEST=flash, control tigertail successfully

Change-Id: I8d60c215fee04de158c22edca5377c3c6cd48cf0
Reviewed-on: https://chromium-review.googlesource.com/493617
Commit-Ready: Nick Sanders <nsanders@chromium.org>
Tested-by: Nick Sanders <nsanders@chromium.org>
Reviewed-by: Aseda Aboagye <aaboagye@chromium.org>
2017-05-16 00:09:24 -07:00
Vadim Bendebury
32eebe3c5f usb_updater: do not filter out dev cr50 versions
The usb_updater code comparing versions to decide which one is newer
filters out values in excess of 1000 to not consider dev build
versions to be newer than the released versions.

In fact this logic is flawed: with node locked RO it is possible to
build dev (self signed) version, which can run on the device, and this
version should take over the released version, if it is currently
present on the device.

If the RO is not node locked, the dev RW version will not verify, so
it is safe to download it to the chip, it would be ignored.

BRANCH=cr50
BUG=none
TEST=with this patch applied it is possible to update self signed
     versions running on H1 (the updater considers them newer than
     0.0.18 and sends the chip the vendor command to enable the
     downloaded image after download completes).

Change-Id: Ibb5761e4bb24fcc7dee5cc10b2f26af7a8e9aa2e
Signed-off-by: Vadim Bendebury <vbendeb@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/492087
Tested-by: Nicolas Boichat <drinkcat@chromium.org>
Reviewed-by: Mary Ruthven <mruthven@chromium.org>
2017-05-02 09:42:32 -07:00
Mary Ruthven
bcc4e087a1 usb_updater: post a reset during upstart on old versions
If Cr50 does not have support for invalidating the RW header and
restoring it, then upstart should still post a reset. This changes
usb_updater to post a restart during upstart if the RW minor version is
less than 19.

BUG=none
BRANCH=cr50
TEST=manual
	Copy new usb_updater onto the DUT. run 'sync'

	Build two cr50 debug images one with 0.0.19 and one with 0.1.12

	verify update process works

	test_that $DUT_IP -b $BOARD firmware_Cr50Update
	--args="old_release_image=$PATH_TO_PROD_13
	release_image=$PATH_TO_PROD_18 dev_image=$DBG_IMAGE_19"

	Build a firmware image with
	https://review.coreboot.org/#/c/18946/3

	test_that $DUT_IP -b $BOARD firmware_Cr50Update
	--args="old_release_image=$PATH_TO_PROD_18
	release_image=$DBG_IMAGE_19 dev_image=$DBG_IMAGE_1_12"

Change-Id: I811977de26999b1d26bd2d4126b88b1c55a93931
Signed-off-by: Mary Ruthven <mruthven@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/470326
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
2017-04-07 14:15:36 -07:00
Brian Norris
6277174bff usb_updater: /dev/tmp0 -> /dev/tpm0
That's a typo.

BUG=none
TEST=none
BRANCH=none

Change-Id: I4577a746c113b6c1d2c6745975272532909c8a8a
Signed-off-by: Brian Norris <briannorris@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/470507
Reviewed-by: Andrey Pronin <apronin@chromium.org>
2017-04-06 17:59:06 -07:00
Mary Ruthven
56e3c669e8 usb_updater: only run send_done on usb transfers
show_fw_ver runs send_done on both usb and tpm transfers. This changes
usb_update, so it will only run send_done on usb transfers

BUG=none
BRANCH=cr50
TEST=copy to dut. stop trunksd. Run 'usb_updater -f -s && usb_updater -f
&& usb_updater -f'

Change-Id: I3a09c003ae41a4651c9961092552d7807656a68a
Reviewed-on: https://chromium-review.googlesource.com/470169
Commit-Ready: Mary Ruthven <mruthven@chromium.org>
Tested-by: Mary Ruthven <mruthven@chromium.org>
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
2017-04-06 17:59:04 -07:00
Mary Ruthven
e69a103884 usb_updater: fix --fwver
This change adds a send_done call at the end of show_fw_ver. With this
change Cr50 will set the state to rx_idle after every usb_update -f
call.

Cr50 cannot process any vendor commands unless the updater state is
idle. After a vendor command is sent cr50 wont set the state to idle
unless it receives a send_done call. It will also reset the state if it
sees that it has been more than 5 seconds since the last transfer.

In the current state you cannot use usb_updater -f back to back because
usb_updater doesn't call send_done through the -f path. If you wait 5
seconds between calls, then it will work. If the call fails and you keep
retrying waiting less than 5 seconds between calls, then it will fail
forever. The last transfer time will get reset with each call and Cr50
will never reach the timeout to reset the usb_update state to idle.

BUG=none
BRANCH=cr50
TEST=run 'sudo ./usb_updater -f && sudo ./usb_updater -f'. Verify both
calls succeed.

Change-Id: I5daca8e03ece840288abb61e02a528a9af0ada30
Signed-off-by: Mary Ruthven <mruthven@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/465491
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
2017-04-03 19:09:26 -07:00
Mary Ruthven
24fd8060fd usb_updater: fix -b option
We want the -b option to be parsed the same way as the -u option,
because usb_updater should handle reading the file the same way. This
changes binver hasarg to be 0, so that it doesn't eat the filename.

BUG=none
BRANCH=cr50
TEST=usb_updater --binver $IMAGE

Change-Id: I0b868bc5d316e5fb42fc34bc746bbee868d20630
Signed-off-by: Mary Ruthven <mruthven@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/465490
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
2017-03-31 18:57:01 -07:00
Vadim Bendebury
218f65dda6 usb_updater: separate image updates and resets, add restore image option
With the upcoming availability of the downloaded header corruption,
there needs to be a mechanism for usb_updater to restore the corrupted
header, so that the downloaded code can run right away.

This patch separates image download and reset functionality. Download
happens as before, and the UPGRADE_DONE PDU is sent immediately once
image transfer completes. This puts the receive state machine into the
idle state and allows to send other commands.

The reset function is different for the target supporting protocol
versions 5 and above. The only command version 5 recognizes is the
indirect reboot command (the UPGRADE_DONE PDU sent the second time in
a row). For protocol version 6 and above the reset could be immediate
or posted, and for targets running RW version 19 or above the command
to restore the corrupted header is required.

When running on the target the command to restore the corrupted header
would be generated by the AP firmware on the reboot.

BRANCH=cr50
BUG=b:35580805
TEST=with the next patch of the series applied observed the corrupted
     header properly restored and the device rebooted.

Change-Id: If87c12fe8578cd6f1b4beed6d113471356f6b6c2
Signed-off-by: Vadim Bendebury <vbendeb@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/457677
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
2017-03-22 20:05:58 -07:00
Vadim Bendebury
bd30d3f2cd usb_updater: stop supporting protocol versions below 5
There are no early H1 chips left in circulation, all released chips
(starting with RW 0.0.10) support update protocol version 5.

This patch drops all technical debt associated with supporting earlier
protocol versions.

BRANCH=cr50
BUG=b:35580805
TEST=downgraded an H1 test board to ro 0.0.8 rw 0.0.9. Updated it to
     the latest image (ro 0.0.10 rw 0.0.18).

Change-Id: I28c9b0c597122c7aa602a88fb56f9c7bf04b9984
Signed-off-by: Vadim Bendebury <vbendeb@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/457500
Reviewed-by: Nicolas Boichat <drinkcat@chromium.org>
2017-03-21 23:15:07 -07:00
Vadim Bendebury
ee1ccf4fbe usb_updater: fix command line options description
The -b command line option should not be described as requiring a
parameter, as the binary file is given to most of invocations of
usb_updater.

Also adding the missing -p command line option description.

BRANCH=none
BUG=none
TEST='usb_updater -b <file name>' does not fail any more

Change-Id: I6ceefa8c4dda841db63177d6134a611600a43078
Signed-off-by: Vadim Bendebury <vbendeb@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/448956
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
2017-03-02 18:34:10 -08:00
Vadim Bendebury
6ceabb07e3 usb_updater: change command line option from --spi to --systemdev
The command line option to trigger communicating with the cr50 over
/dev/tpm0 has been set to 'spi' originally, as SPI was the interface
to communicate with the TPM on first devices using cr50.

This is not technically correct, as many devices use i2c for this
purpose. Let's rename the command line option from 'spi' to 'dev' and
correct names and comments to reflect this too.

BRANCH=none
BUG=none
TEST=ran on a reef device:
    localhost tmp # ./usb_updater -f --systemdev
    Could not open TPM: Device or resource busy
    localhost tmp # initctl stop trunksd
    trunksd stop/waiting
    localhost tmp # ./usb_updater -f --systemdev
    start
    target running protocol version 6
    offsets: backup RO at 0x40000, backup RW at 0x4000
    keyids: RO 0xaa66150f, RW 0xb93d6539
    Current versions:
    RO 0.0.10
    RW 0.0.16
    localhost tmp # ./usb_updater -f -s
    start
    target running protocol version 6
    offsets: backup RO at 0x40000, backup RW at 0x4000
    keyids: RO 0xaa66150f, RW 0xb93d6539
    Current versions:
    RO 0.0.10
    RW 0.0.16

Change-Id: Ifbdd3618209ad9930e0678cf50e82a789ae5e2cd
Signed-off-by: Vadim Bendebury <vbendeb@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/447781
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
2017-02-28 22:33:47 -08:00
Vadim Bendebury
31cfc63b80 g: usb_updater: fix option description and add post_reset
The new option allows the operator to explicitly request the post
reset reboot instead of immediate reboot (which is now ignored by
production cr50 images).

Also sort option descriptions and move the colons where they belong
(after command line arguments requiring additional parameters),

BRANCH=none
BUG=none
TEST=running usb_updater with -b or -d without extra parameter causes
     the return error code and the help message printed.

     running

     $ ./extra/usb_updater/usb_updater -p build/cr50/ec.bin

     results in a proper image transfer, with the following reboot of
     the chromeos device triggering cr50 reset and the new downloaded
     image running.

Change-Id: I64328973a2dfac1b78262f1ffacd677e52956d27
Signed-off-by: Vadim Bendebury <vbendeb@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/446939
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
2017-02-26 17:14:28 -08:00
Vadim Bendebury
5221d127e1 g: rate limit firmware updates
This patch introduces a delay between accepted cr50 firmware upload
attempts. The next attempt to write into the same or lower address in
flash would be accepted no sooner than in 60 seconds after the
previous attempt.

This would prevent a rogue user from wearing the flash by repeated
uploads to the same address.

This limitation is not imposed by dev images (those compiled with
CR50_DEV=1).

BRANCH=none
BUG=chrome-os-partner:63098

TEST=verified that attempts to update soon after the previous update
     result in the following error message issued by usb_updater:

     sending 0x2d8b8 bytes to 0x4000
     Error: status 0x9

     Modified usb_updater to send one random pdu twice. Observed the
     same error message.

Change-Id: Idca55ad091d09daaddd0a4cad5b1f871af1ede93
Signed-off-by: Vadim Bendebury <vbendeb@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/445496
Reviewed-by: Randall Spangler <rspangler@chromium.org>
2017-02-22 18:25:14 -08:00
Nick Sanders
10db53d0a4 Revert "servo_v4: Remove PSTATE to create more space in RO"
This reverts commit 7ed9a96cd7.

Change-Id: Ifb3c31d04c8ff10c6186370c98ab127295b0f117
Reviewed-on: https://chromium-review.googlesource.com/422478
Commit-Ready: Scott Collyer <scollyer@chromium.org>
Tested-by: Nick Sanders <nsanders@chromium.org>
Reviewed-by: Scott Collyer <scollyer@chromium.org>
2016-12-29 19:09:57 -08:00
Scott
7ed9a96cd7 servo_v4: Remove PSTATE to create more space in RO
When including USB PD support, the image won't fit in the default RO
size of 0xf000, but does fit in the 0x10000 RW. This change removes
PSTATE and increases the RO to 0x10000.

BRANCH=none
BUG=chrome-os-partner:61170
TEST=manual
Verfied the image still builds and can run after updating via
util/flash_ec and via /usb_updater/fw_update.py -b servo_v4.json

Change-Id: I8f60bb1f107060e26390e6c8292a3add58703c0d
Signed-off-by: Scott <scollyer@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/422450
Commit-Ready: Scott Collyer <scollyer@chromium.org>
Tested-by: Scott Collyer <scollyer@chromium.org>
Reviewed-by: Shawn N <shawnn@chromium.org>
2016-12-20 21:56:47 -08:00
Vadim Bendebury
e5805287d0 usb_updater: initialize corrupt_inactive_rw before using it
The earlier change introduced the uninitialized variable bug, which
was not caught by the compiler.

Let's make sure the variable is always initialized, and also let's add
a message informing the user that the binary image is ignored when -f
or -c command line options are given.

BRANCH=none
BUG=chrome-os-partner:55667
TEST=there is no accidental attempts to erase the inactive firmware
     any more. The message is printed when the binary image is ignored.

Change-Id: If67841fa3933e7c2df772348ed5308ff722a6e3a
Signed-off-by: Vadim Bendebury <vbendeb@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/421498
Reviewed-by: Bill Richardson <wfrichar@chromium.org>
2016-12-20 18:05:09 -08:00
Mary Ruthven
0929bcf05f usb_updater: add command to corrupt rw
This change adds a option to use the vendor command
VENDOR_CC_INVALIDATE_INACTIVE_RW to invalidate the inactive rw image.

BUG=chrome-os-partner:55667
BRANCH=none
TEST=run 'usb_updater -c' use the cr50 console to verify the inactive rw
image version is 'Error'

Change-Id: Id460f7ac9f20146902da7596613bee566f473dd2
Signed-off-by: Mary Ruthven <mruthven@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/421141
Reviewed-by: Vadim Bendebury <vbendeb@chromium.org>
2016-12-16 23:47:07 -08:00
Nick Sanders
ccff336503 sweetberry: add power logging tool
powerlog.py can access sweetberry and log power data.
Also included are marlin and kevin example board configs.

BUG=chromium:608039
TEST=log power data
BRANCH=None

Change-Id: I0f868d95d17d86522dca045a227a824563f93cd0
Signed-off-by: Nick Sanders <nsanders@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/413293
Reviewed-by: Aseda Aboagye <aaboagye@chromium.org>
2016-12-16 20:56:49 -08:00
Vadim Bendebury
35c5e0fa42 usb_updater: close connection when no data is transferred
When usb_updater is invoked with the '-f' option and without
specifying the binary file to transmit, the cr50 still enters the data
transfer mode, even though the host is not transferring anything.

As a result cr50 stays in the 'rx_outside_block' state until timeout
expires. Another usb_updater invocation fails if attempted before
timeout expiration.

The UPGRADE_DONE PDU sent by the host causes the state machine to
switch to the idle state immediately.

BRANCH=none
BUG=none
TEST=ran the following commands:
   usb_updater -f && usb_updater -f

  the second invocation used to fail before this change, now it succeeds.

Change-Id: Iceafeb30de6011975fbf47dabc7c6c494177c0f7
Signed-off-by: Vadim Bendebury <vbendeb@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/415554
Reviewed-by: Bill Richardson <wfrichar@chromium.org>
2016-12-01 20:00:10 -08:00
Vadim Bendebury
ed194f7a9a usb_updater: protocol version 6 (vendor commands over usb)
This patch introduces version 6 of the cr50 USB update protocol. This
version allows to multiplex TPM vendor and extension commands over the
same USB endpoint which is used for firmware updates.

When channeling TPM vendor commands the USB update frame looks as follows:

   4 bytes      4 bytes         4 bytes       2 bytes      variable size
 +-----------+--------------+---------------+-----------+------~~~-------+
 + total size| block digest |    EXT_CMD    | Vend. sub.|      data      |
 +-----------+--------------+---------------+-----------+------~~~-------+

Where 'Vend. sub' is the vendor subcommand, and data field is
subcommand dependent. The target tells between update PDUs and
encapsulated vendor subcommands by looking at the EXT_CMD value - it
is set to 0xbaccd00a and as such is guaranteed not to be a valid
update PDU destination address.

In the previous protocol versions target reset was requested by the
host sending a 4 byte PDU after the target receives the UPGRADE_DONE
message and moves the state machine to the 'awaiting_reset' state.

With the ability to transfer vendor commands, there is no need for the
target to have a special state for reset. The host can send the posted
or immediate reboot request using the appropriate vendor command.

As a result the 'awaiting_reset' state has been removed, the target
accepts vendor commands only when state machine is in the rx_idle
state.

Vendor command response size is not fixed, it is subcommand dependent.
In the current implementation the total size of the vendor command PDU
can not exceed 64 bytes, as there is no reassembly on the target side.

For backwards compatibility in case the target is running protocol
version earlier than 6, the 4 byte PDU is still sent to the target
after UPGRADE_DONE is sent.

BRANCH=none
BUG=chrome-os-partner:60013
TEST=tested updates on Reef and Gru, observed that it is possible to
     update earlier versions of firmware, and that it is possible to
     request immediate and posted reset (depending on the presence of
     the -u flag in the usb_updater invocation).

Change-Id: I6ea9e9f742c96b8ab0670e9cec87a83cd47bb20e
Signed-off-by: Vadim Bendebury <vbendeb@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/414948
Reviewed-by: Bill Richardson <wfrichar@chromium.org>
2016-11-28 20:53:54 -08:00
Vadim Bendebury
56310c97bf usb_updater: improve debugability
When usb update errors happen it helps a lot to be able to see the
actual error code returned by the target and where the error was
generated.

This patch adds a few printouts to help with debugging.

BRANCH=none
BUG=none
TEST=observed proper error messages generated while debugging
     introduction of extension/vendor commands transfer over USB.

Change-Id: I06c77e7467f7f9547704c88c4b673866fb2e6032
Signed-off-by: Vadim Bendebury <vbendeb@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/414947
Reviewed-by: Bill Richardson <wfrichar@chromium.org>
2016-11-28 20:53:53 -08:00
Vadim Bendebury
6eae52a094 usb_updater: use proper TPM command code for vendor commands
Until extension commands using incompatible TPM command code are
phased out, the function sending vendor/extension commands to the TPM
needs to be aware of the subcommand code and use the matching TPM
command code.

BRANCH=none
BUG=chrome-os-partner:60013
TEST=with the rest of the patches applied both posted and immediate
     reset commands operate on Gru as expected.

Change-Id: I8977df22e4c2fadfd3427c0b4f70035f7f532e00
Signed-off-by: Vadim Bendebury <vbendeb@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/414946
Reviewed-by: Bill Richardson <wfrichar@chromium.org>
2016-11-28 20:53:51 -08:00
Vadim Bendebury
1461cc8043 tpm: move extension and vendor command definitions into own file
Let's make sure that both embedded and host side use the same command
definitions. To avoid host compilation problems move the definitions
into a separate file.

BRANCH=none
BUG=none
TEST=compilation still works.

Change-Id: Id0d85a51aebabed0637965b3b19d7ed42c46e75e
Signed-off-by: Vadim Bendebury <vbendeb@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/414945
Reviewed-by: Bill Richardson <wfrichar@chromium.org>
2016-11-28 20:53:50 -08:00
Vadim Bendebury
b7f86ed3a1 usb_updater: unify normal and error messages
Just for consistency sake, make all normal messages generated by the
utility in the course of firmware update start with lower case letters
and all error messages start with upper case letters.

BRANCH=none
BUG=none
TEST=make buildall -j still succeeds

Change-Id: Ifb0bd8dec4c2bb5cbbb2c93b1918fc699c2f33dd
Signed-off-by: Vadim Bendebury <vbendeb@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/414944
Reviewed-by: Mary Ruthven <mruthven@chromium.org>
2016-11-28 20:53:45 -08:00