diff options
author | Shawn Nematbakhsh <shawnn@chromium.org> | 2015-02-11 19:32:15 -0800 |
---|---|---|
committer | ChromeOS Commit Bot <chromeos-commit-bot@chromium.org> | 2015-02-12 23:08:45 +0000 |
commit | 96536de3f4c2b942b5c40ac18a2a42d282f98dbf (patch) | |
tree | 3c63f70b667905fc65a66445553779ae71e5662e /common/pd_log.c | |
parent | abbcf4152946c2a086bde85a2f56db0bbf54996f (diff) | |
download | chrome-ec-96536de3f4c2b942b5c40ac18a2a42d282f98dbf.tar.gz |
pd_log: Add command to request PD MCU to write a log
When we find that charging is in a wedged state, we may wish to write a
PD log entry, but the PD MCU cannot detect such a state on its own.
Therefore, add a new command to ask the PD MCU to write a log of a given
type, and add a new board-specific custom log event.
BUG=chrome-os-partner:36668
TEST=Manual on samus:
./ectool --dev=1 pdwritelog charge 0
./ectool --dev=1 pdwritelog charge 1
./ectool --dev=1 pdwritelog 1 0
./ectool --dev=1 pdwritelog 2 0
./ectool --dev=1 pdlog
Verify log output matches expectation:
2015-02-12 11:12:49.290 P0 SRC
2015-02-12 11:12:49.296 P1 SNK Charger PD 20286mV max 20000mV / 3000mA
2015-02-12 11:12:49.303 P0 New connection
2015-02-12 11:12:49.310 P0 Board-custom event
--- END OF LOG --
Also, verify kernel logging of wedged event:
[ 181.378420] PDLOG 2015/02/12 19:13:44.019 P0 Event 02 (0000) []
Also, trigger wedged state on Samus and verify log entry is written.
BRANCH=Samus
Change-Id: I55c7c839cf8300fcd3931dccdaaf16c1065e31a8
Signed-off-by: Shawn Nematbakhsh <shawnn@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/248981
Reviewed-by: Alec Berg <alecaberg@chromium.org>
Diffstat (limited to 'common/pd_log.c')
-rw-r--r-- | common/pd_log.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/common/pd_log.c b/common/pd_log.c index fa9b8c3bf5..96d55f9330 100644 --- a/common/pd_log.c +++ b/common/pd_log.c @@ -3,6 +3,7 @@ * found in the LICENSE file. */ +#include "charge_manager.h" #include "console.h" #include "hooks.h" #include "host_command.h" @@ -194,6 +195,37 @@ dequeue_retry: DECLARE_HOST_COMMAND(EC_CMD_PD_GET_LOG_ENTRY, hc_pd_get_log_entry, EC_VER_MASK(0)); + +static int hc_pd_write_log_entry(struct host_cmd_handler_args *args) +{ + const struct ec_params_pd_write_log_entry *p = args->params; + uint8_t type = p->type; + uint8_t port = p->port; + + if (type < PD_EVENT_MCU_BASE || type >= PD_EVENT_ACC_BASE) + return EC_RES_INVALID_PARAM; + if (port > 0 && port >= PD_PORT_COUNT) + return EC_RES_INVALID_PARAM; + + switch (type) { + /* Charge event: Log data for all ports */ + case PD_EVENT_MCU_CHARGE: + charge_manager_save_log(port); + break; + + /* Other events: no extra data, just log event type + port */ + case PD_EVENT_MCU_CONNECT: + case PD_EVENT_MCU_BOARD_CUSTOM: + default: + pd_log_event(type, PD_LOG_PORT_SIZE(port, 0), 0, NULL); + break; + } + + return EC_RES_SUCCESS; +} +DECLARE_HOST_COMMAND(EC_CMD_PD_WRITE_LOG_ENTRY, + hc_pd_write_log_entry, + EC_VER_MASK(0)); #else /* !HAS_TASK_HOSTCMD */ /* we are a PD accessory, send back the events as a VDM (VDO_CMD_GET_LOG) */ int pd_vdm_get_log_entry(uint32_t *payload) |