summaryrefslogtreecommitdiff
path: root/common/mkbp_event.c
diff options
context:
space:
mode:
authorShawn Nematbakhsh <shawnn@chromium.org>2016-08-11 17:02:41 -0700
committerchrome-bot <chrome-bot@chromium.org>2016-08-12 13:45:35 -0700
commitde4d25964de310effe8ede09e5ba6fa2f40dc52b (patch)
treeff590ba65dfe3063d9c9e504f89bbd760e838f92 /common/mkbp_event.c
parent88428882b827b818df9b99ca37ef26b8f1927e9a (diff)
downloadchrome-ec-de4d25964de310effe8ede09e5ba6fa2f40dc52b.tar.gz
mkbp_event: Allow host to report sleep state for non-wake event skipping
Allow the host to self-report its sleep state through EC_CMD_HOST_SLEEP_EVENT, which will typically be sent with SUSPEND param when the host begins its sleep process. While the host has self-reported that it is in SUSPEND, don't assert the interrupt line, except for designated wake events. BUG=chrome-os-partner:56156 BRANCH=None TEST=On kevin, run 'ectool hostsleepstate suspend', verify that interrupt assertion is skipped for battery host event. Run 'ectool hostsleepstate resume' and verify interrupt is again asserted by the battery host event. Signed-off-by: Shawn Nematbakhsh <shawnn@chromium.org> Change-Id: I74288465587ccf7185cec717f7c1810602361b8c Reviewed-on: https://chromium-review.googlesource.com/368391 Commit-Ready: Shawn N <shawnn@chromium.org> Tested-by: Shawn N <shawnn@chromium.org> Reviewed-by: Aseda Aboagye <aaboagye@chromium.org>
Diffstat (limited to 'common/mkbp_event.c')
-rw-r--r--common/mkbp_event.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/common/mkbp_event.c b/common/mkbp_event.c
index d2545f3f7e..b59d8dd23c 100644
--- a/common/mkbp_event.c
+++ b/common/mkbp_event.c
@@ -11,6 +11,7 @@
#include "host_command.h"
#include "link_defs.h"
#include "mkbp_event.h"
+#include "power.h"
#include "util.h"
static uint32_t events;
@@ -44,13 +45,28 @@ static void set_host_interrupt(int active)
#endif
}
+/**
+ * Check if the host is sleeping. Check our power state in addition to the
+ * self-reported sleep state of host (CONFIG_POWER_TRACK_HOST_SLEEP_STATE).
+ */
+static inline int host_is_sleeping(void)
+{
+ int is_sleeping = !chipset_in_state(CHIPSET_STATE_ON);
+
+#ifdef CONFIG_POWER_TRACK_HOST_SLEEP_STATE
+ is_sleeping |=
+ (power_get_host_sleep_state() == HOST_SLEEP_EVENT_S3_SUSPEND);
+#endif
+ return is_sleeping;
+}
+
void mkbp_send_event(uint8_t event_type)
{
set_event(event_type);
#ifdef CONFIG_MKBP_WAKEUP_MASK
- /* checking the event if AP is not in S0 */
- if (!chipset_in_state(CHIPSET_STATE_ON)) {
+ /* Only assert interrupt for wake events if host is sleeping */
+ if (host_is_sleeping()) {
uint32_t events;
events = *(uint32_t *)host_get_memmap(EC_MEMMAP_HOST_EVENTS);
/*