From 1432cbc4da8991bcddd15e847a73792760edc62e Mon Sep 17 00:00:00 2001 From: Furquan Shaikh Date: Fri, 13 Oct 2017 11:31:35 -0700 Subject: [PATCH] google/chromeec: Do not set wake mask before logging EC events Earlier the EC expected the host to set appropriate masks before reading host events. However, with recent change in EC, this is no longer required. This change removes the setting of wake_mask before and after reading the host events. However, in order to support older versions of EC, a new feature flag is added on the EC side that informs the host whether or not it is using the new way of reporting host events without having to set wake mask. CQ-DEPEND=CL:719578 TEST=Verified that EC wake events are correctly logged with both old and new versions of EC. Change-Id: Ib17e1296fb7d3bbc84fc7581fd0a9bd179ac87b9 Signed-off-by: Furquan Shaikh Reviewed-on: https://review.coreboot.org/22006 Reviewed-by: Duncan Laurie Reviewed-by: Aaron Durbin Tested-by: build bot (Jenkins) --- src/ec/google/chromeec/ec.c | 16 ++++++++++++---- src/ec/google/chromeec/ec_commands.h | 2 ++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/ec/google/chromeec/ec.c b/src/ec/google/chromeec/ec.c index de7c317d93..537fe25283 100644 --- a/src/ec/google/chromeec/ec.c +++ b/src/ec/google/chromeec/ec.c @@ -261,20 +261,28 @@ void google_chromeec_log_events(u32 mask) { u8 event; u32 wake_mask; + bool restore_wake_mask = false; if (!IS_ENABLED(CONFIG_ELOG)) return; - /* Set wake mask so events will be read from ACPI interface */ - wake_mask = google_chromeec_get_wake_mask(); - google_chromeec_set_wake_mask(mask); + /* + * If the EC supports unified wake masks, then there is no need to set + * wake mask before reading out the host events. + */ + if (google_chromeec_check_feature(EC_FEATURE_UNIFIED_WAKE_MASKS) != 1) { + wake_mask = google_chromeec_get_wake_mask(); + google_chromeec_set_wake_mask(mask); + restore_wake_mask = true; + } while ((event = google_chromeec_get_event()) != 0) { if (EC_HOST_EVENT_MASK(event) & mask) elog_add_event_byte(ELOG_TYPE_EC_EVENT, event); } - google_chromeec_set_wake_mask(wake_mask); + if (restore_wake_mask) + google_chromeec_set_wake_mask(wake_mask); } void google_chromeec_events_init(const struct google_chromeec_event_info *info, diff --git a/src/ec/google/chromeec/ec_commands.h b/src/ec/google/chromeec/ec_commands.h index c5d27d2149..c4e4e3175a 100644 --- a/src/ec/google/chromeec/ec_commands.h +++ b/src/ec/google/chromeec/ec_commands.h @@ -1112,6 +1112,8 @@ enum ec_feature_code { EC_FEATURE_RWSIG = 30, /* EC has device events support */ EC_FEATURE_DEVICE_EVENT = 31, + /* EC supports the unified wake masks for LPC/eSPI systems */ + EC_FEATURE_UNIFIED_WAKE_MASKS = 32, }; #define EC_FEATURE_MASK_0(event_code) (1UL << (event_code % 32))