<p>Furquan Shaikh has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/23857">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">soc/intel/skylake: Add support to print ME version<br><br>This change adds a boot state callback to print ME version after<br>DEV_ENABLE is complete. Information is printed only if UART_DEBUG is<br>enabled because talking to ME to get the firmware version adds ~1<br>second to boot time.<br><br>Change-Id: I360d5d7420950d5aa255df08be6d7123621b87a8<br>Signed-off-by: Furquan Shaikh <furquan@google.com><br>---<br>M src/soc/intel/skylake/include/soc/me.h<br>M src/soc/intel/skylake/me.c<br>2 files changed, 78 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/57/23857/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/soc/intel/skylake/include/soc/me.h b/src/soc/intel/skylake/include/soc/me.h</span><br><span>index e4b6abf..590bfb7 100644</span><br><span>--- a/src/soc/intel/skylake/include/soc/me.h</span><br><span>+++ b/src/soc/intel/skylake/include/soc/me.h</span><br><span>@@ -202,9 +202,13 @@</span><br><span>   } __packed fields;</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#define MKHI_GEN_GROUP_ID 0xff</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Reset Request  */</span><br><span> #define MKHI_GLOBAL_RESET     0x0b</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#define MKHI_GET_FW_VERSION   0x02</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #define GR_ORIGIN_BIOS_MEM_INIT       0x01</span><br><span> #define GR_ORIGIN_BIOS_POST     0x02</span><br><span> #define GR_ORIGIN_MEBX  0x03</span><br><span>diff --git a/src/soc/intel/skylake/me.c b/src/soc/intel/skylake/me.c</span><br><span>index 2569bcf..c9a0dfa 100644</span><br><span>--- a/src/soc/intel/skylake/me.c</span><br><span>+++ b/src/soc/intel/skylake/me.c</span><br><span>@@ -14,6 +14,7 @@</span><br><span>  */</span><br><span> </span><br><span> #include <arch/io.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <bootstate.h></span><br><span> #include <commonlib/helpers.h></span><br><span> #include <compiler.h></span><br><span> #include <console/console.h></span><br><span>@@ -203,6 +204,79 @@</span><br><span>     "M0 kernel load",</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void print_me_version(void *unused)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  struct mkhi_hdr {</span><br><span style="color: hsl(120, 100%, 40%);">+             uint8_t group_id;</span><br><span style="color: hsl(120, 100%, 40%);">+             uint8_t command:7;</span><br><span style="color: hsl(120, 100%, 40%);">+            uint8_t is_resp:1;</span><br><span style="color: hsl(120, 100%, 40%);">+            uint8_t rsvd;</span><br><span style="color: hsl(120, 100%, 40%);">+         uint8_t result;</span><br><span style="color: hsl(120, 100%, 40%);">+       } __packed;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ struct version {</span><br><span style="color: hsl(120, 100%, 40%);">+              uint16_t minor;</span><br><span style="color: hsl(120, 100%, 40%);">+               uint16_t major;</span><br><span style="color: hsl(120, 100%, 40%);">+               uint16_t build;</span><br><span style="color: hsl(120, 100%, 40%);">+               uint16_t hotfix;</span><br><span style="color: hsl(120, 100%, 40%);">+      } __packed;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ struct fw_ver_resp {</span><br><span style="color: hsl(120, 100%, 40%);">+          struct mkhi_hdr hdr;</span><br><span style="color: hsl(120, 100%, 40%);">+          struct version code;</span><br><span style="color: hsl(120, 100%, 40%);">+          struct version rec;</span><br><span style="color: hsl(120, 100%, 40%);">+           struct version fitc;</span><br><span style="color: hsl(120, 100%, 40%);">+  } __packed;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ struct mkhi_hdr fw_ver_msg = {</span><br><span style="color: hsl(120, 100%, 40%);">+                .group_id = MKHI_GEN_GROUP_ID,</span><br><span style="color: hsl(120, 100%, 40%);">+                .command = MKHI_GET_FW_VERSION,</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%);">+  struct fw_ver_resp resp;</span><br><span style="color: hsl(120, 100%, 40%);">+      size_t resp_size = sizeof(resp);</span><br><span style="color: hsl(120, 100%, 40%);">+      union me_hfs hfs;</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%);">+     * Print ME version only if UART debugging is enabled. Else, it takes ~1</span><br><span style="color: hsl(120, 100%, 40%);">+       * second to talk to ME and get this information.</span><br><span style="color: hsl(120, 100%, 40%);">+      */</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!IS_ENABLED(CONFIG_UART_DEBUG))</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%);">+     hfs.data = me_read_config32(PCI_ME_HFSTS1);</span><br><span style="color: hsl(120, 100%, 40%);">+   /*</span><br><span style="color: hsl(120, 100%, 40%);">+     * This command can be run only if:</span><br><span style="color: hsl(120, 100%, 40%);">+    * Working state is normal and</span><br><span style="color: hsl(120, 100%, 40%);">+         * Operation mode is normal.</span><br><span style="color: hsl(120, 100%, 40%);">+   */</span><br><span style="color: hsl(120, 100%, 40%);">+   if ((hfs.fields.working_state != ME_HFS_CWS_NORMAL) ||</span><br><span style="color: hsl(120, 100%, 40%);">+            (hfs.fields.operation_mode != ME_HFS_MODE_NORMAL))</span><br><span style="color: hsl(120, 100%, 40%);">+                goto failed;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (!heci_send(&fw_ver_msg, sizeof(fw_ver_msg), BIOS_HOST_ADD,</span><br><span style="color: hsl(120, 100%, 40%);">+                   HECI_MKHI_ADD))</span><br><span style="color: hsl(120, 100%, 40%);">+                goto failed;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (!heci_receive(&resp, &resp_size))</span><br><span style="color: hsl(120, 100%, 40%);">+         goto failed;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (resp.hdr.result)</span><br><span style="color: hsl(120, 100%, 40%);">+          goto failed;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        printk(BIOS_DEBUG, "ME: Version : %d.%d.%d.%d\n", resp.code.major,</span><br><span style="color: hsl(120, 100%, 40%);">+         resp.code.minor, resp.code.hotfix, resp.code.build);</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%);">+failed:</span><br><span style="color: hsl(120, 100%, 40%);">+    printk(BIOS_DEBUG, "ME: Version : Unavailable\n");</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%);">+ * This can't be put in intel_me_status because by the time control</span><br><span style="color: hsl(120, 100%, 40%);">+ * reaches there, ME doesn't respond to GET_FW_VERSION command.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+BOOT_STATE_INIT_ENTRY(BS_DEV_ENABLE, BS_ON_EXIT, print_me_version, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> void intel_me_status(void)</span><br><span> {</span><br><span>       union me_hfs hfs;</span><br><span></span><br></pre><p>To view, visit <a href="https://review.coreboot.org/23857">change 23857</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/23857"/><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: I360d5d7420950d5aa255df08be6d7123621b87a8 </div>
<div style="display:none"> Gerrit-Change-Number: 23857 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Furquan Shaikh <furquan@google.com> </div>