diff options
-rw-r--r-- | src/ec/google/chromeec/ec.c | 16 | ||||
-rw-r--r-- | 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)) |