<p>Subrata Banik has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/23386">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">drivers/intel/fsp2_0: Add support to display FSP version info Hob<br><br>This patch locates FSP FVI hob in order to extract all firmware<br>ingredient version information.<br><br>So far this feature is only supported for CannonLake SoC onwards.<br><br>Change-Id: Ib749e49a9f263d85947b60d4c445faf8c37f5931<br>Signed-off-by: Subrata Banik <subrata.banik@intel.com><br>---<br>M src/drivers/intel/fsp2_0/Kconfig<br>M src/drivers/intel/fsp2_0/hand_off_block.c<br>M src/drivers/intel/fsp2_0/include/fsp/soc_binding.h<br>M src/drivers/intel/fsp2_0/include/fsp/util.h<br>4 files changed, 119 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/86/23386/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/drivers/intel/fsp2_0/Kconfig b/src/drivers/intel/fsp2_0/Kconfig</span><br><span>index 864b3a1..e2c784d 100644</span><br><span>--- a/src/drivers/intel/fsp2_0/Kconfig</span><br><span>+++ b/src/drivers/intel/fsp2_0/Kconfig</span><br><span>@@ -112,6 +112,11 @@</span><br><span>    bool "Reset the system on S3 wake when ramstage cache invalid."</span><br><span>    default n</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+config DISPLAY_FSP_VERSION_INFO</span><br><span style="color: hsl(120, 100%, 40%);">+        bool "Display Firmware Ingredient Version Information"</span><br><span style="color: hsl(120, 100%, 40%);">+      help</span><br><span style="color: hsl(120, 100%, 40%);">+    Select this option to display Firmware version information.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> config FSP2_0_USES_TPM_MRC_HASH</span><br><span>   bool</span><br><span>         default y if HAS_RECOVERY_MRC_CACHE</span><br><span>diff --git a/src/drivers/intel/fsp2_0/hand_off_block.c b/src/drivers/intel/fsp2_0/hand_off_block.c</span><br><span>index 2d7e209..a4453e2 100644</span><br><span>--- a/src/drivers/intel/fsp2_0/hand_off_block.c</span><br><span>+++ b/src/drivers/intel/fsp2_0/hand_off_block.c</span><br><span>@@ -15,12 +15,14 @@</span><br><span> #include <cbmem.h></span><br><span> #include <commonlib/helpers.h></span><br><span> #include <console/console.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <fsp/api.h></span><br><span> #include <fsp/util.h></span><br><span> #include <inttypes.h></span><br><span> #include <lib.h></span><br><span> #include <string.h></span><br><span> </span><br><span> #define HOB_HEADER_LEN             8</span><br><span style="color: hsl(120, 100%, 40%);">+#define SMBUS_HEADER_LEN     4</span><br><span> </span><br><span> /* GUIDs in little-endian, so they can be used with memcmp() */</span><br><span> const uint8_t fsp_bootloader_tolum_guid[16] = {</span><br><span>@@ -43,6 +45,11 @@</span><br><span>     0x88, 0xc3, 0xee, 0xe8, 0xc4, 0x9e, 0xfb, 0x89</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+const uint8_t uuid_fv_info[16] = {</span><br><span style="color: hsl(120, 100%, 40%);">+  0x2e, 0x72, 0x8e, 0x79, 0xb2, 0x15, 0x13, 0x4e,</span><br><span style="color: hsl(120, 100%, 40%);">+       0x8a, 0xe9, 0x6b, 0xa3, 0x0f, 0xf7, 0xf1, 0x67</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*</span><br><span>  * Utilities for walking HOBs</span><br><span>  */</span><br><span>@@ -217,6 +224,109 @@</span><br><span>   return NULL;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#if IS_ENABLED(CONFIG_DISPLAY_FSP_VERSION_INFO)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int get_fw_ingredient_info(char *comp_name)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       int count = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      while(comp_name[count] != '\0')</span><br><span style="color: hsl(120, 100%, 40%);">+               count++;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    return 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%);">+static char *get_next_ingredient(char *comp_name, int size)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    comp_name = (char *)((uint32_t)comp_name + size +</span><br><span style="color: hsl(120, 100%, 40%);">+                     sizeof(uint8_t));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return comp_name;</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%);">+static void display_fsp_version_info_hob(const FIRMWARE_VERSION_INFO_HOB *fvih,</span><br><span style="color: hsl(120, 100%, 40%);">+               size_t size)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       FIRMWARE_VERSION_INFO *fvi;</span><br><span style="color: hsl(120, 100%, 40%);">+   int index, cnt;</span><br><span style="color: hsl(120, 100%, 40%);">+       char *str_ptr;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct firmware_version_string{</span><br><span style="color: hsl(120, 100%, 40%);">+               char *component_name;</span><br><span style="color: hsl(120, 100%, 40%);">+         char *version_string;</span><br><span style="color: hsl(120, 100%, 40%);">+ } __attribute__((packed));</span><br><span style="color: hsl(120, 100%, 40%);">+    struct firmware_version_string *fvi_ver_str;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        fvi = (FIRMWARE_VERSION_INFO *)(&(fvih->Count) +1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  str_ptr = (char *)((uint32_t)fvi +</span><br><span style="color: hsl(120, 100%, 40%);">+                     (fvih->Count * sizeof (FIRMWARE_VERSION_INFO)));</span><br><span style="color: hsl(120, 100%, 40%);">+  fvi_ver_str = malloc(size - sizeof(fvih->Count) - (fvih->Count *</span><br><span style="color: hsl(120, 100%, 40%);">+                                sizeof (FIRMWARE_VERSION_INFO)));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   for (index = 0; index < fvih->Count; index++) {</span><br><span style="color: hsl(120, 100%, 40%);">+         cnt = get_fw_ingredient_info(str_ptr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              /*  Don't show ingredient name and version if its all 0xFF */</span><br><span style="color: hsl(120, 100%, 40%);">+             if (fvi[index].Version.MajorVersion == 0xFF &&</span><br><span style="color: hsl(120, 100%, 40%);">+                        fvi[index].Version.MajorVersion == 0xFF &&</span><br><span style="color: hsl(120, 100%, 40%);">+                    fvi[index].Version.MajorVersion == 0xFF &&</span><br><span style="color: hsl(120, 100%, 40%);">+                    fvi[index].Version.MajorVersion == 0xFF &&</span><br><span style="color: hsl(120, 100%, 40%);">+                    fvi[index].VersionStringIndex == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 str_ptr = get_next_ingredient(str_ptr, cnt);</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           memcpy((char *)(&(fvi_ver_str)[index].component_name),</span><br><span style="color: hsl(120, 100%, 40%);">+                            str_ptr, cnt+1);</span><br><span style="color: hsl(120, 100%, 40%);">+              printk(BIOS_DEBUG, "%s = ",</span><br><span style="color: hsl(120, 100%, 40%);">+                         (char *)(&(fvi_ver_str)[index].component_name));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                if (!fvi[index].VersionStringIndex)</span><br><span style="color: hsl(120, 100%, 40%);">+                   printk(BIOS_DEBUG, "%x.%x.%x.%x\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                                 fvi[index].Version.MajorVersion,</span><br><span style="color: hsl(120, 100%, 40%);">+                                      fvi[index].Version.MinorVersion,</span><br><span style="color: hsl(120, 100%, 40%);">+                                      fvi[index].Version.Revision,</span><br><span style="color: hsl(120, 100%, 40%);">+                                  fvi[index].Version.BuildNumber);</span><br><span style="color: hsl(120, 100%, 40%);">+              else {</span><br><span style="color: hsl(120, 100%, 40%);">+                        str_ptr = get_next_ingredient(str_ptr, cnt);</span><br><span style="color: hsl(120, 100%, 40%);">+                  cnt = get_fw_ingredient_info(str_ptr);</span><br><span style="color: hsl(120, 100%, 40%);">+                        memcpy((char *)(&(fvi_ver_str)[index].version_string),</span><br><span style="color: hsl(120, 100%, 40%);">+                            str_ptr, cnt+1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                    printk(BIOS_DEBUG, "%s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                          (char *)(&(fvi_ver_str)[index].version_string));</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+             str_ptr = get_next_ingredient(str_ptr, cnt);</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+     free(fvi_ver_str);</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%);">+void fsp_find_fvi_version_hob(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       const uint8_t *hob_uuid;</span><br><span style="color: hsl(120, 100%, 40%);">+      const struct hob_header *hob = fsp_get_hob_list();</span><br><span style="color: hsl(120, 100%, 40%);">+    size_t size;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (!hob)</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%);">+     for ( ; hob->type != HOB_TYPE_END_OF_HOB_LIST;</span><br><span style="color: hsl(120, 100%, 40%);">+                     hob = fsp_next_hob(hob)) {</span><br><span style="color: hsl(120, 100%, 40%);">+            if (hob->type != HOB_TYPE_GUID_EXTENSION)</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%);">+           hob_uuid = hob_header_to_struct(hob);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               if (fsp_guid_compare(hob_uuid, uuid_fv_info)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       size = hob->length - (HOB_HEADER_LEN + 16 +</span><br><span style="color: hsl(120, 100%, 40%);">+                                        SMBUS_HEADER_LEN);</span><br><span style="color: hsl(120, 100%, 40%);">+                    display_fsp_version_info_hob(</span><br><span style="color: hsl(120, 100%, 40%);">+                         (FIRMWARE_VERSION_INFO_HOB *)hob, size);</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%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> const void *fsp_find_nv_storage_data(size_t *size)</span><br><span> {</span><br><span>    return fsp_find_extension_hob_by_guid(fsp_nv_storage_guid, size);</span><br><span>diff --git a/src/drivers/intel/fsp2_0/include/fsp/soc_binding.h b/src/drivers/intel/fsp2_0/include/fsp/soc_binding.h</span><br><span>index 5c8b441..94abe78 100644</span><br><span>--- a/src/drivers/intel/fsp2_0/include/fsp/soc_binding.h</span><br><span>+++ b/src/drivers/intel/fsp2_0/include/fsp/soc_binding.h</span><br><span>@@ -26,6 +26,9 @@</span><br><span> #include <Base.h></span><br><span> #include <FspmUpd.h></span><br><span> #include <FspsUpd.h></span><br><span style="color: hsl(120, 100%, 40%);">+#if IS_ENABLED(CONFIG_DISPLAY_FSP_VERSION_INFO)</span><br><span style="color: hsl(120, 100%, 40%);">+#include <FirmwareVersionInfoHob.h></span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span> </span><br><span> #pragma pack(pop)</span><br><span> </span><br><span>diff --git a/src/drivers/intel/fsp2_0/include/fsp/util.h b/src/drivers/intel/fsp2_0/include/fsp/util.h</span><br><span>index 43e3569..34466b8 100644</span><br><span>--- a/src/drivers/intel/fsp2_0/include/fsp/util.h</span><br><span>+++ b/src/drivers/intel/fsp2_0/include/fsp/util.h</span><br><span>@@ -77,6 +77,7 @@</span><br><span> const void *fsp_find_smbios_memory_info(size_t *size);</span><br><span> enum cb_err fsp_fill_lb_framebuffer(struct lb_framebuffer *framebuffer);</span><br><span> int fsp_find_range_hob(struct range_entry *re, const uint8_t guid[16]);</span><br><span style="color: hsl(120, 100%, 40%);">+void fsp_find_fvi_version_hob(void);</span><br><span> int fsp_find_reserved_memory(struct range_entry *re);</span><br><span> const struct hob_resource *fsp_hob_header_to_resource(</span><br><span>    const struct hob_header *hob);</span><br><span></span><br></pre><p>To view, visit <a href="https://review.coreboot.org/23386">change 23386</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/23386"/><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: Ib749e49a9f263d85947b60d4c445faf8c37f5931 </div>
<div style="display:none"> Gerrit-Change-Number: 23386 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Subrata Banik <subrata.banik@intel.com> </div>