summaryrefslogtreecommitdiff
path: root/common/port80.c
diff options
context:
space:
mode:
authorDuncan Laurie <dlaurie@chromium.org>2012-08-13 09:14:11 -0700
committerGerrit <chrome-bot@google.com>2012-08-13 14:58:38 -0700
commit3b8b1bd586f13d8137d2830210c64e12dab1adc6 (patch)
treee03db5267624ab3df3c8b11bb7afb66e96b99782 /common/port80.c
parent521e97fd135cfaeb199e1de0f87aa2e45b4aa804 (diff)
downloadchrome-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.c33
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));