<p>Furquan Shaikh has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/22079">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">elog: Support logging S0ix sleep/wake info in elog<br><br>1. Add support for new GSMI commands to log S0ix entry/exit<br>information in elog.<br>2. Skip logging anything if the sleep type is not S0ix i.e. if<br>suspend/resume are using ACPI sleep.<br>3. In case of resume, provide callbacks to allow platform and<br>mainboard to log any wake source information.<br><br>BUG=b:67874513<br>BRANCH=None<br>TEST=None<br><br>Change-Id: I593e8a9e31cad720ac1f77aab447a0dbdbe9a28b<br>Signed-off-by: Furquan Shaikh <furquan@chromium.org><br>---<br>M src/drivers/elog/gsmi.c<br>M src/include/elog.h<br>2 files changed, 65 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/79/22079/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">diff --git a/src/drivers/elog/gsmi.c b/src/drivers/elog/gsmi.c<br>index cd94cf6..bf27ed3 100644<br>--- a/src/drivers/elog/gsmi.c<br>+++ b/src/drivers/elog/gsmi.c<br>@@ -25,6 +25,8 @@<br> <br> #define GSMI_CMD_SET_EVENT_LOG              0x08<br> #define GSMI_CMD_CLEAR_EVENT_LOG 0x09<br>+#define GSMI_CMD_LOG_SLEEP_INFO          0x0a<br>+#define GSMI_CMD_LOG_WAKE_INFO           0x0b<br> #define GSMI_CMD_HANDSHAKE_TYPE          0xc1<br> <br> #define GSMI_HANDSHAKE_NONE           0x7f<br>@@ -46,12 +48,34 @@<br>     u32 data_type;<br> } __packed;<br> <br>+/*<br>+ * Sleep/Wake info flags:<br>+ * Bit 0     - ACPI sleep or wake(1) / Non-ACPI sleep or wake(0)<br>+ * Bits 1:15 - Reserved<br>+ */<br>+#define GSMI_FLAGS_ACPI_SX                (1 << 0)<br>+<br>+struct gsmi_log_sleep_wake_info_param {<br>+  u16 flags;<br>+} __packed;<br>+<br>+void __attribute__((weak)) elog_gsmi_cb_platform_log_wake_source(void)<br>+{<br>+     /* Default weak implementation, does nothing. */<br>+}<br>+<br>+void __attribute__((weak)) elog_gsmi_cb_mainboard_log_wake_source(void)<br>+{<br>+        /* Default weak implementation, does nothing. */<br>+}<br>+<br> /* Param is usually EBX, ret in EAX */<br> u32 gsmi_exec(u8 command, u32 *param)<br> {<br>  struct gsmi_set_eventlog_param *sel;<br>  struct gsmi_set_eventlog_type1 *type1;<br>        struct gsmi_clear_eventlog_param *cel;<br>+       struct gsmi_log_sleep_wake_info_param *info;<br>  u32 ret = GSMI_RET_UNSUPPORTED;<br> <br>    switch (command) {<br>@@ -105,6 +129,31 @@<br>                      ret = GSMI_RET_SUCCESS;<br>               break;<br> <br>+    case GSMI_CMD_LOG_SLEEP_INFO:<br>+        case GSMI_CMD_LOG_WAKE_INFO:<br>+         info = (struct gsmi_log_sleep_wake_info_param *)(*param);<br>+            if (!info)<br>+                   break;<br>+<br>+            ret = GSMI_RET_SUCCESS;<br>+<br>+           /*<br>+            * If suspend/resume happens via firmware, there is no need to<br>+                * log anything here. Normal suspend/resume paths will take care<br>+              * of handling the logging in that case.<br>+              */<br>+          if (info->flags & GSMI_FLAGS_ACPI_SX)<br>+                 break;<br>+<br>+            if (command == GSMI_CMD_LOG_SLEEP_INFO)<br>+                      elog_add_event(ELOG_TYPE_S0IX_ENTER);<br>+                else {<br>+                       elog_add_event(ELOG_TYPE_S0IX_EXIT);<br>+                 elog_gsmi_cb_platform_log_wake_source();<br>+                     elog_gsmi_cb_mainboard_log_wake_source();<br>+            }<br>+            break;<br>+<br>     default:<br>              printk(BIOS_DEBUG, "GSMI Unknown: 0x%02x\n", command);<br>              break;<br>diff --git a/src/include/elog.h b/src/include/elog.h<br>index bab7eb0..0f6a811 100644<br>--- a/src/include/elog.h<br>+++ b/src/include/elog.h<br>@@ -215,6 +215,10 @@<br> #define ELOG_EC_DEVICE_EVENT_DSP            0x02<br> #define ELOG_EC_DEVICE_EVENT_WIFI           0x03<br> <br>+/* S0ix sleep/wake */<br>+#define ELOG_TYPE_S0IX_ENTER              0xaf<br>+#define ELOG_TYPE_S0IX_EXIT               0xb0<br>+<br> #if IS_ENABLED(CONFIG_ELOG)<br> /* Eventlog backing storage must be initialized before calling elog_init(). */<br> extern int elog_init(void);<br>@@ -249,4 +253,16 @@<br> u32 boot_count_read(void);<br> u32 boot_count_increment(void);<br> <br>+/*<br>+ * Callback from GSMI handler to allow platform to log any wake source<br>+ * information.<br>+ */<br>+void elog_gsmi_cb_platform_log_wake_source(void);<br>+<br>+/*<br>+ * Callback from GSMI handler to allow mainboard to log any wake source<br>+ * information.<br>+ */<br>+void elog_gsmi_cb_mainboard_log_wake_source(void);<br>+<br> #endif /* ELOG_H_ */<br></pre><p>To view, visit <a href="https://review.coreboot.org/22079">change 22079</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/22079"/><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: I593e8a9e31cad720ac1f77aab447a0dbdbe9a28b </div>
<div style="display:none"> Gerrit-Change-Number: 22079 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Furquan Shaikh <furquan@google.com> </div>