summaryrefslogtreecommitdiff
path: root/common/pd_log.c
diff options
context:
space:
mode:
authorShawn Nematbakhsh <shawnn@chromium.org>2015-02-11 19:32:15 -0800
committerChromeOS Commit Bot <chromeos-commit-bot@chromium.org>2015-02-12 23:08:45 +0000
commit96536de3f4c2b942b5c40ac18a2a42d282f98dbf (patch)
tree3c63f70b667905fc65a66445553779ae71e5662e /common/pd_log.c
parentabbcf4152946c2a086bde85a2f56db0bbf54996f (diff)
downloadchrome-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.c32
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)