<p>Duncan Laurie has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/20426">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">ec/google/chromeec: Add support for EC device events<br><br>Add support for the new EC device event interface which is used to<br>report events from devices that are connected behind the EC.<br><br>This can be used to differentiate wake sources from the EC in the case<br>that the EC has the wake pins from various devices.<br><br>This can be used in case the AP is unable to directly wake from the<br>device itself, for example when using the Deep S3 state on Intel<br>platforms only a few pins can directly wake the AP.<br><br>BUG=b:30624430<br>TEST=build google/* boards that use chrome EC.  Feature is used and<br>tested further in a subsequent commit.<br><br>Change-Id: I5126c6d6ffb6b0ef6e8db8dcd5aec62db925a371<br>Signed-off-by: Duncan Laurie <dlaurie@chromium.org><br>---<br>M src/ec/google/chromeec/ec.c<br>M src/ec/google/chromeec/ec.h<br>M src/ec/google/chromeec/smihandler.c<br>M src/ec/google/chromeec/smm.h<br>4 files changed, 112 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://review.coreboot.org:29418/coreboot refs/changes/26/20426/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">diff --git a/src/ec/google/chromeec/ec.c b/src/ec/google/chromeec/ec.c<br>index de17495..062e42f 100644<br>--- a/src/ec/google/chromeec/ec.c<br>+++ b/src/ec/google/chromeec/ec.c<br>@@ -161,6 +161,87 @@<br>           EC_CMD_HOST_EVENT_CLEAR_B, mask);<br> }<br> <br>+/* Get the current device event mask */<br>+uint32_t google_chromeec_get_device_enabled_events(void)<br>+{<br>+    struct ec_params_device_event req;<br>+   struct ec_response_device_event rsp;<br>+ struct chromeec_command cmd;<br>+<br>+      req.param = EC_DEVICE_EVENT_PARAM_GET_ENABLED_EVENTS;<br>+        cmd.cmd_code = EC_CMD_DEVICE_EVENT;<br>+  cmd.cmd_version = 0;<br>+ cmd.cmd_data_in = &req;<br>+  cmd.cmd_size_in = sizeof(req);<br>+       cmd.cmd_data_out = &rsp;<br>+ cmd.cmd_size_out = sizeof(rsp);<br>+      cmd.cmd_dev_index = 0;<br>+<br>+    if (google_chromeec_command(&cmd) == 0)<br>+          return rsp.event_mask;<br>+       return 0;<br>+}<br>+<br>+/* Set the current device event mask */<br>+int google_chromeec_set_device_enabled_events(uint32_t mask)<br>+{<br>+        struct ec_params_device_event req;<br>+   struct ec_response_device_event rsp;<br>+ struct chromeec_command cmd;<br>+<br>+      req.event_mask = mask;<br>+       req.param = EC_DEVICE_EVENT_PARAM_SET_ENABLED_EVENTS;<br>+        cmd.cmd_code = EC_CMD_DEVICE_EVENT;<br>+  cmd.cmd_version = 0;<br>+ cmd.cmd_data_in = &req;<br>+  cmd.cmd_size_in = sizeof(req);<br>+       cmd.cmd_data_out = &rsp;<br>+ cmd.cmd_size_out = sizeof(rsp);<br>+      cmd.cmd_dev_index = 0;<br>+<br>+    return google_chromeec_command(&cmd);<br>+}<br>+<br>+/* Read and clear pending device events */<br>+uint32_t google_chromeec_get_device_current_events(void)<br>+{<br>+ struct ec_params_device_event req;<br>+   struct ec_response_device_event rsp;<br>+ struct chromeec_command cmd;<br>+<br>+      req.param = EC_DEVICE_EVENT_PARAM_GET_CURRENT_EVENTS;<br>+        cmd.cmd_code = EC_CMD_DEVICE_EVENT;<br>+  cmd.cmd_version = 0;<br>+ cmd.cmd_data_in = &req;<br>+  cmd.cmd_size_in = sizeof(req);<br>+       cmd.cmd_data_out = &rsp;<br>+ cmd.cmd_size_out = sizeof(rsp);<br>+      cmd.cmd_dev_index = 0;<br>+<br>+    if (google_chromeec_command(&cmd) == 0)<br>+          return rsp.event_mask;<br>+       return 0;<br>+}<br>+<br>+void google_chromeec_log_device_events(uint32_t mask)<br>+{<br>+#if CONFIG_ELOG<br>+       uint32_t events;<br>+     int i;<br>+<br>+    if (google_chromeec_check_feature(EC_FEATURE_DEVICE_EVENT) != 1)<br>+             return;<br>+<br>+   events = google_chromeec_get_device_current_events() & mask;<br>+     printk(BIOS_INFO, "EC Device Events: 0x%08x\n", events);<br>+<br>+        for (i = 0; i < sizeof(events)*4; i++) {<br>+          if (EC_DEVICE_EVENT_MASK(i) & events)<br>+                    elog_add_event_byte(ELOG_TYPE_EC_DEVICE_EVENT, i);<br>+   }<br>+#endif<br>+}<br>+<br> int google_chromeec_check_feature(int feature)<br> {<br>        struct chromeec_command cmd;<br>diff --git a/src/ec/google/chromeec/ec.h b/src/ec/google/chromeec/ec.h<br>index 4a45f7f..b2b63e8 100644<br>--- a/src/ec/google/chromeec/ec.h<br>+++ b/src/ec/google/chromeec/ec.h<br>@@ -34,6 +34,12 @@<br> int google_ec_running_ro(void);<br> void google_chromeec_init(void);<br> <br>+/* Device events */<br>+uint32_t google_chromeec_get_device_enabled_events(void);<br>+int google_chromeec_set_device_enabled_events(uint32_t mask);<br>+uint32_t google_chromeec_get_device_current_events(void);<br>+void google_chromeec_log_device_events(uint32_t mask);<br>+<br> /* If recovery mode is enabled and EC is not running RO firmware reboot. */<br> void google_chromeec_early_init(void);<br> /* Reboot if EC firmware is not expected type. */<br>diff --git a/src/ec/google/chromeec/smihandler.c b/src/ec/google/chromeec/smihandler.c<br>index 75636ea..379ff68 100644<br>--- a/src/ec/google/chromeec/smihandler.c<br>+++ b/src/ec/google/chromeec/smihandler.c<br>@@ -73,6 +73,24 @@<br>   clear_pending_events();<br> }<br> <br>+void chromeec_smi_device_event_sleep(int slp_type, uint32_t s3_mask,<br>+                                     uint32_t s5_mask)<br>+{<br>+   switch (slp_type) {<br>+  case ACPI_S3:<br>+                /* Enable device wake events */<br>+              google_chromeec_set_device_enabled_events(s3_mask);<br>+          break;<br>+       case ACPI_S5:<br>+                /* Enable device wake events */<br>+              google_chromeec_set_device_enabled_events(s5_mask);<br>+          break;<br>+       }<br>+<br>+ /* Read and clear pending events that may trigger immediate wake */<br>+  google_chromeec_get_device_current_events();<br>+}<br>+<br> void chromeec_smi_apmc(int apmc, uint32_t sci_mask, uint32_t smi_mask)<br> {<br>      switch (apmc) {<br>diff --git a/src/ec/google/chromeec/smm.h b/src/ec/google/chromeec/smm.h<br>index 03d6e00..8265cdd 100644<br>--- a/src/ec/google/chromeec/smm.h<br>+++ b/src/ec/google/chromeec/smm.h<br>@@ -28,6 +28,13 @@<br> void chromeec_smi_sleep(int slp_type, uint32_t s3_mask, uint32_t s5_mask);<br> <br> /*<br>+ * Set device event masks according to sleep type,<br>+ * and clear any pending device events.<br>+ */<br>+void chromeec_smi_device_event_sleep(int slp_type, uint32_t s3_mask,<br>+                                     uint32_t s5_mask);<br>+<br>+/*<br>  * Provided the APMC command do the following while clearing pending events.<br>  * APM_CNT_ACPI_ENABLE: clear SMI mask. set SCI mask.<br>  * APM_CNT_ACPI_DISABLE: clear SCI mask. set SMI mask.<br></pre><p>To view, visit <a href="https://review.coreboot.org/20426">change 20426</a>. To unsubscribe, visit <a href="https://review.coreboot.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://review.coreboot.org/20426"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: coreboot </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I5126c6d6ffb6b0ef6e8db8dcd5aec62db925a371 </div>
<div style="display:none"> Gerrit-Change-Number: 20426 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Duncan Laurie <dlaurie@chromium.org> </div>