summaryrefslogtreecommitdiff
path: root/common/host_command_pd.c
diff options
context:
space:
mode:
authorAlec Berg <alecaberg@chromium.org>2015-02-14 10:19:55 -0800
committerChromeOS Commit Bot <chromeos-commit-bot@chromium.org>2015-02-18 04:53:59 +0000
commit02d0ce1526f844020b8a8fbed2987a8d5efba481 (patch)
treea1a80d729986dde597c2a2620c83075d04b302e8 /common/host_command_pd.c
parentd00847782480e492401ba3bc5a8a8e6f026b08ba (diff)
downloadchrome-ec-02d0ce1526f844020b8a8fbed2987a8d5efba481.tar.gz
samus: panic reboot EC if PD MCU crashes
Use the EC to check if PD MCU has crashed. The EC knows this by checking the PD status bits: if PD MCU was in RW, and is now in RO, AND it did not get to RO via a sysjump, then it must have crashed. When the EC detects this, the EC will also panic and reboot the entire system, so that we can software sync to a known good state. Also, when EC panics due to PD crash, it will log panic info. BUG=chrome-os-partner:36636 BRANCH=samus TEST=load onto samus EC and PD, try sysjump'ing back and forth on PD MCU console and verify EC does not do anything. Crash the PD MCU when in RW by reboot command and crash divzero command, and make sure the EC panics with PD crash panic message. Crash the PD MCU when in RO (before sysjumping to RW) and make sure EC does not panic. Change-Id: I57961028e6b23a878b8e477a9d8e180cb121a742 Signed-off-by: Alec Berg <alecaberg@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/250100 Tested-by: Shawn N <shawnn@chromium.org> Reviewed-by: Shawn N <shawnn@chromium.org>
Diffstat (limited to 'common/host_command_pd.c')
-rw-r--r--common/host_command_pd.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/common/host_command_pd.c b/common/host_command_pd.c
index ca315c574f..140c71ea4e 100644
--- a/common/host_command_pd.c
+++ b/common/host_command_pd.c
@@ -10,6 +10,8 @@
#include "console.h"
#include "host_command.h"
#include "lightbar.h"
+#include "panic.h"
+#include "system.h"
#include "task.h"
#include "timer.h"
#include "util.h"
@@ -43,6 +45,9 @@ static void pd_exchange_status(void)
struct ec_params_pd_status ec_status;
struct ec_response_pd_status pd_status;
int rv = 0;
+#ifdef CONFIG_HOSTCMD_PD_PANIC
+ static int pd_in_rw;
+#endif
/* Send PD charge state and battery state of charge */
ec_status.charge_state = charge_state;
@@ -66,6 +71,21 @@ static void pd_exchange_status(void)
return;
}
+#ifdef CONFIG_HOSTCMD_PD_PANIC
+ /*
+ * Check if PD MCU is in RW. If PD MCU was in RW and is now in RO
+ * AND it did not sysjump to RO, then it must have crashed, and
+ * therefore we should panic as well.
+ */
+ if (pd_status.status & PD_STATUS_IN_RW) {
+ pd_in_rw = 1;
+ } else if (pd_in_rw &&
+ !(pd_status.status & PD_STATUS_JUMPED_TO_IMAGE)) {
+ panic_printf("PD crash");
+ software_panic(PANIC_SW_PD_CRASH, 0);
+ }
+#endif
+
#ifdef HAS_TASK_LIGHTBAR
/*
* If charge port has changed, and it was initialized, then show