From 7378a1792a986ca5137da9bd0868bbc1b496839d Mon Sep 17 00:00:00 2001 From: Duncan Laurie Date: Thu, 29 Jun 2017 23:52:17 -0700 Subject: ec/google/chromeec: Add support for EC device events Add support for the new EC device event interface which is used to report events from devices that are connected behind the EC. This can be used to differentiate wake sources from the EC in the case that the EC has the wake pins from various devices. This can be used in case the AP is unable to directly wake from the device itself, for example when using the Deep S3 state on Intel platforms only a few pins can directly wake the AP. BUG=b:30624430 TEST=build google/* boards that use chrome EC. Feature is used and tested further in a subsequent commit. Change-Id: I5126c6d6ffb6b0ef6e8db8dcd5aec62db925a371 Signed-off-by: Duncan Laurie Reviewed-on: https://review.coreboot.org/20426 Tested-by: build bot (Jenkins) Reviewed-by: Aaron Durbin Reviewed-by: Furquan Shaikh --- src/ec/google/chromeec/ec.c | 83 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 82 insertions(+), 1 deletion(-) (limited to 'src/ec/google/chromeec/ec.c') diff --git a/src/ec/google/chromeec/ec.c b/src/ec/google/chromeec/ec.c index de17495ff6..2efc66a77c 100644 --- a/src/ec/google/chromeec/ec.c +++ b/src/ec/google/chromeec/ec.c @@ -24,7 +24,6 @@ #include #include #include -#include #include #include #include @@ -161,6 +160,88 @@ int google_chromeec_clear_events_b(u32 mask) EC_CMD_HOST_EVENT_CLEAR_B, mask); } +/* Get the current device event mask */ +uint32_t google_chromeec_get_device_enabled_events(void) +{ + struct ec_params_device_event req; + struct ec_response_device_event rsp; + struct chromeec_command cmd; + + req.param = EC_DEVICE_EVENT_PARAM_GET_ENABLED_EVENTS; + cmd.cmd_code = EC_CMD_DEVICE_EVENT; + cmd.cmd_version = 0; + cmd.cmd_data_in = &req; + cmd.cmd_size_in = sizeof(req); + cmd.cmd_data_out = &rsp; + cmd.cmd_size_out = sizeof(rsp); + cmd.cmd_dev_index = 0; + + if (google_chromeec_command(&cmd) == 0) + return rsp.event_mask; + return 0; +} + +/* Set the current device event mask */ +int google_chromeec_set_device_enabled_events(uint32_t mask) +{ + struct ec_params_device_event req; + struct ec_response_device_event rsp; + struct chromeec_command cmd; + + req.event_mask = mask; + req.param = EC_DEVICE_EVENT_PARAM_SET_ENABLED_EVENTS; + cmd.cmd_code = EC_CMD_DEVICE_EVENT; + cmd.cmd_version = 0; + cmd.cmd_data_in = &req; + cmd.cmd_size_in = sizeof(req); + cmd.cmd_data_out = &rsp; + cmd.cmd_size_out = sizeof(rsp); + cmd.cmd_dev_index = 0; + + return google_chromeec_command(&cmd); +} + +/* Read and clear pending device events */ +uint32_t google_chromeec_get_device_current_events(void) +{ + struct ec_params_device_event req; + struct ec_response_device_event rsp; + struct chromeec_command cmd; + + req.param = EC_DEVICE_EVENT_PARAM_GET_CURRENT_EVENTS; + cmd.cmd_code = EC_CMD_DEVICE_EVENT; + cmd.cmd_version = 0; + cmd.cmd_data_in = &req; + cmd.cmd_size_in = sizeof(req); + cmd.cmd_data_out = &rsp; + cmd.cmd_size_out = sizeof(rsp); + cmd.cmd_dev_index = 0; + + if (google_chromeec_command(&cmd) == 0) + return rsp.event_mask; + return 0; +} + +void google_chromeec_log_device_events(uint32_t mask) +{ + uint32_t events; + int i; + + if (!IS_ENABLED(CONFIG_ELOG)) + return; + + if (google_chromeec_check_feature(EC_FEATURE_DEVICE_EVENT) != 1) + return; + + events = google_chromeec_get_device_current_events() & mask; + printk(BIOS_INFO, "EC Device Events: 0x%08x\n", events); + + for (i = 0; i < sizeof(events) * 8; i++) { + if (EC_DEVICE_EVENT_MASK(i) & events) + elog_add_event_byte(ELOG_TYPE_EC_DEVICE_EVENT, i); + } +} + int google_chromeec_check_feature(int feature) { struct chromeec_command cmd; -- cgit v1.2.3