From d899fdaaeef175e97923b954342dad3a33c5c387 Mon Sep 17 00:00:00 2001 From: Randall Spangler Date: Tue, 15 Apr 2014 09:40:34 -0700 Subject: lpc: ACPI query-next-event drops masked events Previously, you could use EC_CMD_ACPI_QUERY_EVENT to read events that were masked off (that is, events which would not generate SCI/SMI/wake signals). The handlers for those signals on the host would still act on the masked-off events - for example, causing unwanted power button keypresses/releases. Now, EC_CMD_ACPI_QUERY_EVENT will only return events which are unmasked. This does not affect storing of events at event generation time. Events are still queued; they won't be dropped until the host attempts to read the next event. This gives the host a chance to set a mask later in boot (but before querying any events) to capture events which happened early in the boot process. BUG=chrome-os-partner:26574 BRANCH=rambi TEST=At EC console, type 'hostevent set 0x80' but don't press enter. Hold down the power button; UI starts fading to white. Press enter at the EC console to issue the hostevent command. System should continue shutting down, not fade back as if the power button were released. Change-Id: Id2cb14b0979f49cdd42424b9a61b310a2bb506f5 Signed-off-by: Randall Spangler Reviewed-on: https://chromium-review.googlesource.com/194935 Reviewed-by: Duncan Laurie --- chip/mec1322/lpc.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) (limited to 'chip/mec1322') diff --git a/chip/mec1322/lpc.c b/chip/mec1322/lpc.c index db57c9235e..265b7598e9 100644 --- a/chip/mec1322/lpc.c +++ b/chip/mec1322/lpc.c @@ -355,12 +355,25 @@ void lpc_set_host_event_state(uint32_t mask) int lpc_query_host_event_state(void) { + const uint32_t any_mask = event_mask[0] | event_mask[1] | event_mask[2]; int evt_index = 0; int i; for (i = 0; i < 32; i++) { - if (host_events & (1 << i)) { - host_clear_events(1 << i); + const uint32_t e = (1 << i); + + if (host_events & e) { + host_clear_events(e); + + /* + * If host hasn't unmasked this event, drop it. We do + * this at query time rather than event generation time + * so that the host has a chance to unmask events + * before they're dropped by a query. + */ + if (!(e & any_mask)) + continue; + evt_index = i + 1; /* Events are 1-based */ break; } @@ -369,7 +382,6 @@ int lpc_query_host_event_state(void) return evt_index; } - void lpc_set_host_event_mask(enum lpc_host_event_type type, uint32_t mask) { event_mask[type] = mask; -- cgit v1.2.1