summaryrefslogtreecommitdiff
path: root/common/mkbp_event.c
diff options
context:
space:
mode:
authorEnrico Granata <egranata@chromium.org>2018-11-16 16:41:23 -0800
committerchrome-bot <chrome-bot@chromium.org>2018-11-28 12:47:57 -0800
commitfd6412f0ec89fd5570279d6081ae425107b3c9ea (patch)
treea03c0ade8ab40080fef1d40bfc6c839beb71cac3 /common/mkbp_event.c
parent7491fb02976c649d186d79299bb76b8974c02521 (diff)
downloadchrome-ec-fd6412f0ec89fd5570279d6081ae425107b3c9ea.tar.gz
mkbp: Enable the EC to report whether it has more events on mkbp_get_next_event
On all platforms where there is a GPIO interrupt line between EC and AP for MKBP events, the EC will keep the interrupt pin set as long as there are events to be served, but the AP will need to re-enter its IRQ handler once per event in order to serve all the events in the FIFO. This commit adds a version 2 of EC_CMD_GET_NEXT_EVENT, such that the EC will use the most-significant bit of the event type to record the fact that the EC has more events available. This, in turn, enables the AP to keep its interrupt handler thread awake and loop until all events are served. Since it uses a new command version, this change is forward and backward compatible: - new EC, old kernel: the old kernel will use the V1 command and never see the flag - new kernel, old EC: the old EC will not accept the V2 command and never send the flag BUG=b:119570064 TEST=patched Linux kernel can see and use the flag on nocturne BRANCH=nocturne Change-Id: I5bae7fdc85efcd26f7bdebcd31a7f27ecf570d88 Signed-off-by: Enrico Granata <egranata@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/1341159 Commit-Ready: Gwendal Grignou <gwendal@chromium.org> Reviewed-by: Jett Rink <jettrink@chromium.org>
Diffstat (limited to 'common/mkbp_event.c')
-rw-r--r--common/mkbp_event.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/common/mkbp_event.c b/common/mkbp_event.c
index 44cec336b5..9dddcab519 100644
--- a/common/mkbp_event.c
+++ b/common/mkbp_event.c
@@ -164,6 +164,8 @@ static int mkbp_get_next_event(struct host_cmd_handler_args *args)
if (!events)
set_host_interrupt(0);
+ else if (args->version >= 2)
+ resp[0] |= EC_MKBP_HAS_MORE_EVENTS;
if (data_size < 0)
return EC_RES_ERROR;
@@ -173,7 +175,7 @@ static int mkbp_get_next_event(struct host_cmd_handler_args *args)
}
DECLARE_HOST_COMMAND(EC_CMD_GET_NEXT_EVENT,
mkbp_get_next_event,
- EC_VER_MASK(0) | EC_VER_MASK(1));
+ EC_VER_MASK(0) | EC_VER_MASK(1) | EC_VER_MASK(2));
#ifdef CONFIG_MKBP_WAKEUP_MASK
static int mkbp_get_wake_mask(struct host_cmd_handler_args *args)