diff options
author | Duncan Laurie <dlaurie@chromium.org> | 2012-08-13 09:14:11 -0700 |
---|---|---|
committer | Gerrit <chrome-bot@google.com> | 2012-08-13 14:58:38 -0700 |
commit | 3b8b1bd586f13d8137d2830210c64e12dab1adc6 (patch) | |
tree | e03db5267624ab3df3c8b11bb7afb66e96b99782 /common/port80.c | |
parent | 521e97fd135cfaeb199e1de0f87aa2e45b4aa804 (diff) | |
download | chrome-ec-3b8b1bd586f13d8137d2830210c64e12dab1adc6.tar.gz |
port80: Track and export last post code in previous boot
- Add a special port80 event for LPC reset assertion and use that event
to store the previous post code.
- Add a new command to retrive the last saved post code so I can easily
query it at boot/resume and log unusual codes.
BUG=none
TEST=manual (with additional coreboot/mosys changes)
- interrupt boot process by issuing x86reset on EC console or
by using warm reset button on servo
- read event log with mosys on next boot
78 | 2012-08-13 09:24:04 | System boot | 262
79 | 2012-08-13 09:24:04 | Last post code in previous boot | 0x9e
80 | 2012-08-13 09:24:04 | System Reset
Change-Id: I7b9f10442b9c468d89fde4e75adb94b0c07c2c8d
Signed-off-by: Duncan Laurie <dlaurie@chromium.org>
Reviewed-on: https://gerrit.chromium.org/gerrit/29995
Reviewed-by: Randall Spangler <rspangler@chromium.org>
Diffstat (limited to 'common/port80.c')
-rw-r--r-- | common/port80.c | 33 |
1 files changed, 31 insertions, 2 deletions
diff --git a/common/port80.c b/common/port80.c index f8a6c8395d..72b8ccde11 100644 --- a/common/port80.c +++ b/common/port80.c @@ -7,6 +7,7 @@ #include "board.h" #include "console.h" +#include "host_command.h" #include "port80.h" #include "util.h" @@ -16,6 +17,7 @@ static uint16_t history[HISTORY_LEN]; static int writes; /* Number of port 80 writes so far */ +static int last_boot; /* Last code from previous boot */ static int scroll; static int print_in_int = 1; @@ -30,6 +32,15 @@ void port_80_write(int data) if (print_in_int) CPRINTF("%c[%T Port 80: 0x%02x]", scroll ? '\n' : '\r', data); + /* Save current port80 code if system is resetting */ + if (data == PORT_80_EVENT_RESET && writes) { + int prev = history[(writes-1) % ARRAY_SIZE(history)]; + + /* Ignore special event codes */ + if (prev < 0x100) + last_boot = prev; + } + history[writes % ARRAY_SIZE(history)] = data; writes++; } @@ -82,10 +93,16 @@ static int command_port80(int argc, char **argv) ccputs("Port 80 writes:"); for (i = tail; i < head; i++) { int e = history[i % ARRAY_SIZE(history)]; - if (e == PORT_80_EVENT_RESUME) { + switch (e) { + case PORT_80_EVENT_RESUME: ccprintf("\n(S3->S0)"); printed = 0; - } else { + break; + case PORT_80_EVENT_RESET: + ccprintf("\n(RESET)"); + printed = 0; + break; + default: if (!(printed++ % 20)) { ccputs("\n "); cflush(); @@ -100,3 +117,15 @@ DECLARE_CONSOLE_COMMAND(port80, command_port80, "[scroll | intprint | flush]", "Print port80 writes or toggle port80 scrolling", NULL); + +int port80_last_boot(struct host_cmd_handler_args *args) +{ + struct ec_response_port80_last_boot *r = args->response; + + args->response_size = sizeof(*r); + r->code = last_boot; + + return EC_RES_SUCCESS; +} +DECLARE_HOST_COMMAND(EC_CMD_PORT80_LAST_BOOT, + port80_last_boot, EC_VER_MASK(0)); |