<p>Daisuke Nojiri has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/23801">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">chromeec: Make google_chromeec_wait_for_display wait for HPD<br><br>Some type-c monitors do not immediately assert HPD. If we continue<br>to boot without HPD asserted, Depthcharge fails to show pictures<br>on a monitor even if HPD is asserted later.<br><br>This patch makes google_chromeec_wait_for_display wait until<br>EC_CMD_GET_HPD returns EC_RES_SUCCESS.<br><br>BUG=b:72387533<br>BRANCH=none<br>TEST=Verify Depthcharge can show dev warning screen on a type-c<br>monitor.<br><br>Change-Id: I07aee3bcca3bca93db66578014500b578402a4de<br>Signed-off-by: Daisuke Nojiri <dnojiri@chromium.org><br>---<br>M src/ec/google/chromeec/ec.c<br>M src/ec/google/chromeec/ec_commands.h<br>2 files changed, 38 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/01/23801/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 c902c3f..1005266 100644</span><br><span>--- a/src/ec/google/chromeec/ec.c</span><br><span>+++ b/src/ec/google/chromeec/ec.c</span><br><span>@@ -986,7 +986,25 @@</span><br><span>        return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-const static long wait_for_display_timeout_ms = 2000;</span><br><span style="color: hsl(120, 100%, 40%);">+static int google_chromeec_get_hpd(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  struct chromeec_command cmd;</span><br><span style="color: hsl(120, 100%, 40%);">+  cmd.cmd_code = EC_CMD_GET_HPD;</span><br><span style="color: hsl(120, 100%, 40%);">+        cmd.cmd_version = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+  cmd.cmd_data_in = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+       cmd.cmd_size_in = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+  cmd.cmd_data_out = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+      cmd.cmd_size_out = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ cmd.cmd_dev_index = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+        return google_chromeec_command(&cmd) == EC_RES_SUCCESS ? 1 : 0;</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%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * TODO: If no monitor is plugged in or other monitor port (e.g. HDMI) is used,</span><br><span style="color: hsl(120, 100%, 40%);">+ * this timeout always needs to expire. Make EC detect type-c device presence</span><br><span style="color: hsl(120, 100%, 40%);">+ * and abort earlier when waiting does not make sense.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+const static long wait_for_display_timeout_ms = 3000;</span><br><span> </span><br><span> #define USB_SID_DISPLAYPORT 0xff01</span><br><span> </span><br><span>@@ -994,17 +1012,31 @@</span><br><span> {</span><br><span>         struct stopwatch sw;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        printk(BIOS_INFO, "Waiting for display\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ printk(BIOS_INFO, "Waiting for DisplayPort\n");</span><br><span>    stopwatch_init_msecs_expire(&sw, wait_for_display_timeout_ms);</span><br><span>   while (google_chromeec_pd_get_amode(USB_SID_DISPLAYPORT) != 1) {</span><br><span>             if (stopwatch_expired(&sw)) {</span><br><span>                    printk(BIOS_WARNING,</span><br><span style="color: hsl(0, 100%, 40%);">-                           "Display not ready after %ldms. Abort.\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                          "DisplayPort not ready after %ldms. Abort.\n",</span><br><span>                             wait_for_display_timeout_ms);</span><br><span>                         return;</span><br><span>              }</span><br><span>            mdelay(200);</span><br><span>         }</span><br><span style="color: hsl(0, 100%, 40%);">-       printk(BIOS_INFO, "Display ready after %lu ms\n",</span><br><span style="color: hsl(120, 100%, 40%);">+   printk(BIOS_INFO, "DisplayPort ready after %lu ms\n",</span><br><span style="color: hsl(120, 100%, 40%);">+              stopwatch_duration_msecs(&sw));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  printk(BIOS_INFO, "Waiting for HPD\n");</span><br><span style="color: hsl(120, 100%, 40%);">+     stopwatch_init_msecs_expire(&sw, wait_for_display_timeout_ms);</span><br><span style="color: hsl(120, 100%, 40%);">+    while (!google_chromeec_get_hpd()) {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (stopwatch_expired(&sw)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     printk(BIOS_WARNING,</span><br><span style="color: hsl(120, 100%, 40%);">+                         "HPD not ready after %ldms. Abort.\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                              wait_for_display_timeout_ms);</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%);">+             mdelay(200);</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+     printk(BIOS_INFO, "HPD ready after %lu ms\n",</span><br><span>             stopwatch_duration_msecs(&sw));</span><br><span> }</span><br><span>diff --git a/src/ec/google/chromeec/ec_commands.h b/src/ec/google/chromeec/ec_commands.h</span><br><span>index 4f46fab..a5a5623 100644</span><br><span>--- a/src/ec/google/chromeec/ec_commands.h</span><br><span>+++ b/src/ec/google/chromeec/ec_commands.h</span><br><span>@@ -4420,6 +4420,8 @@</span><br><span>         uint8_t data[];         /* For string and raw data */</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#define EC_CMD_GET_HPD 0x0121</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*****************************************************************************/</span><br><span> /* The command range 0x200-0x2FF is reserved for Rotor. */</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://review.coreboot.org/23801">change 23801</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/23801"/><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: I07aee3bcca3bca93db66578014500b578402a4de </div>
<div style="display:none"> Gerrit-Change-Number: 23801 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Daisuke Nojiri <dnojiri@chromium.org> </div>