summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRandall Spangler <rspangler@chromium.org>2014-04-15 09:40:34 -0700
committerchrome-internal-fetch <chrome-internal-fetch@google.com>2014-04-17 16:43:36 +0000
commitd899fdaaeef175e97923b954342dad3a33c5c387 (patch)
tree86d42c80252555336e1c28ef498b9db0e2f3bdcf
parent21d46dc03e7a636433bab0bc8c6bdd401808509f (diff)
downloadchrome-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>
-rw-r--r--chip/lm4/lpc.c18
-rw-r--r--chip/mec1322/lpc.c18
2 files changed, 30 insertions, 6 deletions
diff --git a/chip/lm4/lpc.c b/chip/lm4/lpc.c
index e59b0a9fb6..3f1d878457 100644
--- a/chip/lm4/lpc.c
+++ b/chip/lm4/lpc.c
@@ -389,12 +389,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;
}
@@ -403,7 +416,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;
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;