diff options
author | Randall Spangler <rspangler@chromium.org> | 2014-04-15 09:40:34 -0700 |
---|---|---|
committer | chrome-internal-fetch <chrome-internal-fetch@google.com> | 2014-04-17 16:43:36 +0000 |
commit | d899fdaaeef175e97923b954342dad3a33c5c387 (patch) | |
tree | 86d42c80252555336e1c28ef498b9db0e2f3bdcf /chip/mec1322/lpc.c | |
parent | 21d46dc03e7a636433bab0bc8c6bdd401808509f (diff) | |
download | chrome-ec-d899fdaaeef175e97923b954342dad3a33c5c387.tar.gz |
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 <rspangler@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/194935
Reviewed-by: Duncan Laurie <dlaurie@chromium.org>
Diffstat (limited to 'chip/mec1322/lpc.c')
-rw-r--r-- | chip/mec1322/lpc.c | 18 |
1 files changed, 15 insertions, 3 deletions
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; |