<p>Jonathan Brandmeyer has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/27621">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">chromeec: Read EC uptime info on boot.<br><br>Details: Additional diagnostic information about the EC and the most<br>recent reasons why it has reset the AP are read out and logged via<br>printk.  This may aid in debugging spurious hangs and/or resets on the<br>AP by providing traceability to the EC when it triggered the reset.<br>Merely knowing that the EC was also recently reset may provide valuable<br>intelligence.  See also crrev.com/c/1139028.<br><br>Change-Id: Ie6abe645d5acefb570b9f6a3c4a4b60d5bcd63cd<br>Signed-off-by: Jonathan Brandmeyer <jbrandmeyer@chromium.org><br>---<br>M src/ec/google/chromeec/ec.c<br>1 file changed, 110 insertions(+), 4 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://review.coreboot.org:29418/coreboot refs/changes/21/27621/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/ec/google/chromeec/ec.c b/src/ec/google/chromeec/ec.c</span><br><span>index 734c90c..d8db074 100644</span><br><span>--- a/src/ec/google/chromeec/ec.c</span><br><span>+++ b/src/ec/google/chromeec/ec.c</span><br><span>@@ -892,8 +892,7 @@</span><br><span> </span><br><span> #ifndef __SMM__</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static</span><br><span style="color: hsl(0, 100%, 40%);">-int google_chromeec_hello(void)</span><br><span style="color: hsl(120, 100%, 40%);">+static int google_chromeec_hello(void)</span><br><span> {</span><br><span>   struct chromeec_command cec_cmd;</span><br><span>     struct ec_params_hello cmd_hello;</span><br><span>@@ -912,6 +911,113 @@</span><br><span>    return cec_cmd.cmd_code;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * Copy the EC's information about resets of the AP and its own uptime for</span><br><span style="color: hsl(120, 100%, 40%);">+ * debugging purposes.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+static void google_chromeec_log_uptimeinfo(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       /* See also ChromiumOS EC include/chipset.h for details. */</span><br><span style="color: hsl(120, 100%, 40%);">+   static const char * const reset_causes[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+          "(reset unknown)",</span><br><span style="color: hsl(120, 100%, 40%);">+          "reset: board custom",</span><br><span style="color: hsl(120, 100%, 40%);">+              "reset: ap hang detected",</span><br><span style="color: hsl(120, 100%, 40%);">+          "reset: console command",</span><br><span style="color: hsl(120, 100%, 40%);">+           "reset: keyboard sysreset",</span><br><span style="color: hsl(120, 100%, 40%);">+         "reset: keyboard warm reboot",</span><br><span style="color: hsl(120, 100%, 40%);">+              "reset: debug warm reboot",</span><br><span style="color: hsl(120, 100%, 40%);">+         "reset: at AP's request",</span><br><span style="color: hsl(120, 100%, 40%);">+               "reset: during EC initialization",</span><br><span style="color: hsl(120, 100%, 40%);">+          "shutdown: power failure",</span><br><span style="color: hsl(120, 100%, 40%);">+          "shutdown: during EC initialization",</span><br><span style="color: hsl(120, 100%, 40%);">+               "shutdown: board custom",</span><br><span style="color: hsl(120, 100%, 40%);">+           "shutdown: battery voltage startup inhibit",</span><br><span style="color: hsl(120, 100%, 40%);">+                "shutdown: power wait asserted",</span><br><span style="color: hsl(120, 100%, 40%);">+            "shutdown: by console command",</span><br><span style="color: hsl(120, 100%, 40%);">+             "shutdown: entering G3",</span><br><span style="color: hsl(120, 100%, 40%);">+            "shutdown: thermal",</span><br><span style="color: hsl(120, 100%, 40%);">+                "shutdown: power button",</span><br><span style="color: hsl(120, 100%, 40%);">+   };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* See also ChromiumOS EC include/system.h RESET_FLAG for details. */</span><br><span style="color: hsl(120, 100%, 40%);">+ static const char * const reset_flag_strings[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+            "other",</span><br><span style="color: hsl(120, 100%, 40%);">+            "reset-pin",</span><br><span style="color: hsl(120, 100%, 40%);">+                "brownout",</span><br><span style="color: hsl(120, 100%, 40%);">+         "power-on",</span><br><span style="color: hsl(120, 100%, 40%);">+         "watchdog",</span><br><span style="color: hsl(120, 100%, 40%);">+         "soft",</span><br><span style="color: hsl(120, 100%, 40%);">+             "hibernate",</span><br><span style="color: hsl(120, 100%, 40%);">+                "rtc-alarm",</span><br><span style="color: hsl(120, 100%, 40%);">+                "wake-pin",</span><br><span style="color: hsl(120, 100%, 40%);">+         "low-battery",</span><br><span style="color: hsl(120, 100%, 40%);">+              "sysjump",</span><br><span style="color: hsl(120, 100%, 40%);">+          "hard",</span><br><span style="color: hsl(120, 100%, 40%);">+             "ap-off",</span><br><span style="color: hsl(120, 100%, 40%);">+           "preserved",</span><br><span style="color: hsl(120, 100%, 40%);">+                "usb-resume",</span><br><span style="color: hsl(120, 100%, 40%);">+               "rdd",</span><br><span style="color: hsl(120, 100%, 40%);">+              "rbox",</span><br><span style="color: hsl(120, 100%, 40%);">+             "security"</span><br><span style="color: hsl(120, 100%, 40%);">+  };</span><br><span style="color: hsl(120, 100%, 40%);">+    struct ec_response_uptime_info cmd_resp;</span><br><span style="color: hsl(120, 100%, 40%);">+      int i, flag, flag_count;</span><br><span style="color: hsl(120, 100%, 40%);">+      uint32_t reset_cause;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       struct chromeec_command get_uptime_cmd = {</span><br><span style="color: hsl(120, 100%, 40%);">+            .cmd_code = EC_CMD_GET_UPTIME_INFO,</span><br><span style="color: hsl(120, 100%, 40%);">+           .cmd_version = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+             .cmd_data_in = NULL,</span><br><span style="color: hsl(120, 100%, 40%);">+          .cmd_size_in = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+             .cmd_data_out = &cmd_resp,</span><br><span style="color: hsl(120, 100%, 40%);">+                .cmd_size_out = sizeof(cmd_resp),</span><br><span style="color: hsl(120, 100%, 40%);">+             .cmd_dev_index = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+   };</span><br><span style="color: hsl(120, 100%, 40%);">+    google_chromeec_command(&get_uptime_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (get_uptime_cmd.cmd_code) {</span><br><span style="color: hsl(120, 100%, 40%);">+                /*</span><br><span style="color: hsl(120, 100%, 40%);">+             * Deliberately say nothing for EC's that don't support this</span><br><span style="color: hsl(120, 100%, 40%);">+           * command</span><br><span style="color: hsl(120, 100%, 40%);">+             */</span><br><span style="color: hsl(120, 100%, 40%);">+           return;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   printk(BIOS_DEBUG, "Google Chrome EC uptime: %d.%03d seconds\n",</span><br><span style="color: hsl(120, 100%, 40%);">+            cmd_resp.time_since_ec_boot_ms / 1000,</span><br><span style="color: hsl(120, 100%, 40%);">+                cmd_resp.time_since_ec_boot_ms % 1000);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     printk(BIOS_DEBUG, "Google Chrome AP resets since EC boot: %d\n",</span><br><span style="color: hsl(120, 100%, 40%);">+           cmd_resp.ap_resets_since_ec_boot);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  printk(BIOS_DEBUG, "Google Chrome Most recent AP reset causes:\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = 0; i != ARRAY_SIZE(cmd_resp.recent_ap_reset); ++i) {</span><br><span style="color: hsl(120, 100%, 40%);">+         if (cmd_resp.recent_ap_reset[i].reset_time_ms == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                   continue;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           /* Array access guard */</span><br><span style="color: hsl(120, 100%, 40%);">+              reset_cause = cmd_resp.recent_ap_reset[i].reset_cause;</span><br><span style="color: hsl(120, 100%, 40%);">+                if (reset_cause >= ARRAY_SIZE(reset_causes))</span><br><span style="color: hsl(120, 100%, 40%);">+                       reset_cause = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            printk(BIOS_DEBUG, "\t%d.%03d: %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                       cmd_resp.recent_ap_reset[i].reset_time_ms / 1000,</span><br><span style="color: hsl(120, 100%, 40%);">+                     cmd_resp.recent_ap_reset[i].reset_time_ms % 1000,</span><br><span style="color: hsl(120, 100%, 40%);">+                     reset_causes[reset_cause]);</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   printk(BIOS_DEBUG, "Google Chrome EC reset flags at last EC boot: ");</span><br><span style="color: hsl(120, 100%, 40%);">+       flag_count = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+       for (flag = 0; flag != ARRAY_SIZE(reset_flag_strings); ++flag) {</span><br><span style="color: hsl(120, 100%, 40%);">+              if ((cmd_resp.ec_reset_flags & (1 << flag)) != 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 if (flag_count)</span><br><span style="color: hsl(120, 100%, 40%);">+                               printk(BIOS_DEBUG, " | ");</span><br><span style="color: hsl(120, 100%, 40%);">+                  printk(BIOS_DEBUG, reset_flag_strings[flag]);</span><br><span style="color: hsl(120, 100%, 40%);">+                 flag_count++;</span><br><span style="color: hsl(120, 100%, 40%);">+         }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     printk(BIOS_DEBUG, "\n");</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static int ec_image_type; /* Cached EC image type (ro or rw). */</span><br><span> </span><br><span> void google_chromeec_init(void)</span><br><span>@@ -919,8 +1025,6 @@</span><br><span>   struct chromeec_command cec_cmd;</span><br><span>     struct ec_response_get_version cec_resp = {{0}};</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    printk(BIOS_DEBUG, "Google Chrome EC: Initializing keyboard.\n");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>  google_chromeec_hello();</span><br><span> </span><br><span>         cec_cmd.cmd_code = EC_CMD_GET_VERSION;</span><br><span>@@ -942,6 +1046,8 @@</span><br><span>                       cec_resp.current_image);</span><br><span>              ec_image_type = cec_resp.current_image;</span><br><span>      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   google_chromeec_log_uptimeinfo();</span><br><span> }</span><br><span> </span><br><span> int google_ec_running_ro(void)</span><br><span></span><br></pre><p>To view, visit <a href="https://review.coreboot.org/27621">change 27621</a>. To unsubscribe, or for help writing mail filters, 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/27621"/><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: Ie6abe645d5acefb570b9f6a3c4a4b60d5bcd63cd </div>
<div style="display:none"> Gerrit-Change-Number: 27621 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Jonathan Brandmeyer <jbrandmeyer@chromium.org> </div>