<p>Furquan Shaikh has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/c/coreboot/+/29989">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">soc/intel/apollolake: Add support to print ME version<br><br>This change adds support to print ME version if UART_DEBUG is<br>enabled. Check for UART_DEBUG is necessary because talking to ME to<br>get the firmware version adds ~0.6 seconds to boot time.<br><br>TEST=Verified on octopus that ME version printed is correct.<br><br>Change-Id: I41217371558da1af694a2705e005429155d62838<br>Signed-off-by: Furquan Shaikh <furquan@google.com><br>---<br>M src/soc/intel/apollolake/cse.c<br>1 file changed, 73 insertions(+), 11 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://review.coreboot.org:29418/coreboot refs/changes/89/29989/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/soc/intel/apollolake/cse.c b/src/soc/intel/apollolake/cse.c</span><br><span>index cfb3b8a..26249bc 100644</span><br><span>--- a/src/soc/intel/apollolake/cse.c</span><br><span>+++ b/src/soc/intel/apollolake/cse.c</span><br><span>@@ -42,6 +42,9 @@</span><br><span> #define   READ_FILE_FLAG_EMULATED             (1 << 2)</span><br><span> #define   READ_FILE_FLAG_HW                   (1 << 3)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#define MKHI_GROUP_ID_GEN                   0xff</span><br><span style="color: hsl(120, 100%, 40%);">+#define GET_FW_VERSION                            0x02</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #define MCA_MAX_FILE_PATH_SIZE                        64</span><br><span> </span><br><span> #define FUSE_LOCK_FILE                                "/fpf/intel/SocCfgLock"</span><br><span>@@ -55,6 +58,17 @@</span><br><span> </span><br><span> #define FPF_STATUS_FMAP                           "FPF_STATUS"</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+union mkhi_header {</span><br><span style="color: hsl(120, 100%, 40%);">+       uint32_t data;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct {</span><br><span style="color: hsl(120, 100%, 40%);">+              uint32_t group_id: 8;</span><br><span style="color: hsl(120, 100%, 40%);">+         uint32_t command: 7;</span><br><span style="color: hsl(120, 100%, 40%);">+          uint32_t is_response: 1;</span><br><span style="color: hsl(120, 100%, 40%);">+              uint32_t reserved: 8;</span><br><span style="color: hsl(120, 100%, 40%);">+         uint32_t result: 8;</span><br><span style="color: hsl(120, 100%, 40%);">+   } __packed fields;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*</span><br><span>  * Read file from CSE internal filesystem.</span><br><span>  * size is maximum length of provided buffer buff, which is updated with actual</span><br><span>@@ -67,17 +81,6 @@</span><br><span>         int res;</span><br><span>     size_t reply_size;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  union mkhi_header {</span><br><span style="color: hsl(0, 100%, 40%);">-             uint32_t data;</span><br><span style="color: hsl(0, 100%, 40%);">-          struct {</span><br><span style="color: hsl(0, 100%, 40%);">-                        uint32_t group_id: 8;</span><br><span style="color: hsl(0, 100%, 40%);">-                   uint32_t command: 7;</span><br><span style="color: hsl(0, 100%, 40%);">-                    uint32_t is_response: 1;</span><br><span style="color: hsl(0, 100%, 40%);">-                        uint32_t reserved: 8;</span><br><span style="color: hsl(0, 100%, 40%);">-                   uint32_t result: 8;</span><br><span style="color: hsl(0, 100%, 40%);">-             } __packed fields;</span><br><span style="color: hsl(0, 100%, 40%);">-      };</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>   struct mca_command {</span><br><span>                 union mkhi_header mkhi_hdr;</span><br><span>          char file_name[MCA_MAX_FILE_PATH_SIZE];</span><br><span>@@ -192,6 +195,63 @@</span><br><span>       return reg;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void dump_cse_version(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   int res;</span><br><span style="color: hsl(120, 100%, 40%);">+      size_t reply_size;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  struct fw_version_cmd {</span><br><span style="color: hsl(120, 100%, 40%);">+               union mkhi_header mkhi_hdr;</span><br><span style="color: hsl(120, 100%, 40%);">+   } __packed msg;</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_version_response {</span><br><span style="color: hsl(120, 100%, 40%);">+          union mkhi_header mkhi_hdr;</span><br><span style="color: hsl(120, 100%, 40%);">+           struct version code;</span><br><span style="color: hsl(120, 100%, 40%);">+          struct version nftp;</span><br><span style="color: hsl(120, 100%, 40%);">+          struct version fitc;</span><br><span style="color: hsl(120, 100%, 40%);">+  } __packed rsp;</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</span><br><span style="color: hsl(120, 100%, 40%);">+  * ~0.6 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%);">+     msg.mkhi_hdr.fields.group_id = MKHI_GROUP_ID_GEN;</span><br><span style="color: hsl(120, 100%, 40%);">+     msg.mkhi_hdr.fields.command = GET_FW_VERSION;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       res = heci_send(&msg, sizeof(msg), BIOS_HOST_ADDR, HECI_MKHI_ADDR);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!res) {</span><br><span style="color: hsl(120, 100%, 40%);">+           printk(BIOS_ERR, "Failed to send HECI message.\n");</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%);">+   reply_size = sizeof(rsp);</span><br><span style="color: hsl(120, 100%, 40%);">+     res = heci_receive(&rsp, &reply_size);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      if (!res) {</span><br><span style="color: hsl(120, 100%, 40%);">+           printk(BIOS_ERR, "Failed to receive HECI reply.\n");</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%);">+   if (rsp.mkhi_hdr.fields.result != 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                printk(BIOS_ERR, "Failed to get ME version.\n");</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, "ME: Version: %d.%d.%d.%d\n", rsp.code.major,</span><br><span style="color: hsl(120, 100%, 40%);">+           rsp.code.minor, rsp.code.hotfix, rsp.code.build);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static void dump_cse_state(void)</span><br><span> {</span><br><span>       uint32_t fwsts1;</span><br><span>@@ -222,6 +282,8 @@</span><br><span>               printk(BIOS_DEBUG, "unknown");</span><br><span>     }</span><br><span>    printk(BIOS_DEBUG, "\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ dump_cse_version();</span><br><span> }</span><br><span> </span><br><span> #define PCR_PSFX_T0_SHDW_PCIEN          0x1C</span><br><span></span><br></pre><p>To view, visit <a href="https://review.coreboot.org/c/coreboot/+/29989">change 29989</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/c/coreboot/+/29989"/><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-Change-Id: I41217371558da1af694a2705e005429155d62838 </div>
<div style="display:none"> Gerrit-Change-Number: 29989 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Furquan Shaikh <furquan@google.com> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>