<p>Subrata Banik has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/23621">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">soc/intel/cannonlake: Save DIMM information for SMBIOS Table type 17<br><br>This patch ensures to have Type 17 SMBIOS table for CannonLake Platform.<br><br>TEST=Enable to get correct SMBIOS DIMM type information as per<br>SMBIOS spec 3.1<br><br>Change-Id: I611f9f3fc0e07f026610b7a61bc3599523e4f262<br>Signed-off-by: Subrata Banik <subrata.banik@intel.com><br>---<br>M src/soc/intel/cannonlake/romstage/romstage.c<br>1 file changed, 76 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/21/23621/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/soc/intel/cannonlake/romstage/romstage.c b/src/soc/intel/cannonlake/romstage/romstage.c</span><br><span>index 8b3794f..111b671 100644</span><br><span>--- a/src/soc/intel/cannonlake/romstage/romstage.c</span><br><span>+++ b/src/soc/intel/cannonlake/romstage/romstage.c</span><br><span>@@ -24,14 +24,88 @@</span><br><span> #include <intelblocks/cse.h></span><br><span> #include <intelblocks/pmclib.h></span><br><span> #include <memory_info.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <soc/intel/common/smbios.h></span><br><span> #include <soc/iomap.h></span><br><span> #include <soc/pci_devs.h></span><br><span> #include <soc/pm.h></span><br><span> #include <soc/romstage.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <string.h></span><br><span> #include <timestamp.h></span><br><span> </span><br><span> static struct chipset_power_state power_state CAR_GLOBAL;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#define FSP_SMBIOS_MEMORY_INFO_GUID  \</span><br><span style="color: hsl(120, 100%, 40%);">+{    \</span><br><span style="color: hsl(120, 100%, 40%);">+     0xd4, 0x71, 0x20, 0x9b, 0x54, 0xb0, 0x0c, 0x4e, \</span><br><span style="color: hsl(120, 100%, 40%);">+     0x8d, 0x09, 0x11, 0xcf, 0x8b, 0x9f, 0x03, 0x23  \</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%);">+/* Save the DIMM information for SMBIOS table 17 */</span><br><span style="color: hsl(120, 100%, 40%);">+static void save_dimm_info(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      int channel, dimm, dimm_max, index;</span><br><span style="color: hsl(120, 100%, 40%);">+   size_t hob_size;</span><br><span style="color: hsl(120, 100%, 40%);">+      const CONTROLLER_INFO *ctrlr_info;</span><br><span style="color: hsl(120, 100%, 40%);">+    const CHANNEL_INFO *channel_info;</span><br><span style="color: hsl(120, 100%, 40%);">+     const DIMM_INFO *src_dimm;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct dimm_info *dest_dimm;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct memory_info *mem_info;</span><br><span style="color: hsl(120, 100%, 40%);">+ const MEMORY_INFO_DATA_HOB *memory_info_hob;</span><br><span style="color: hsl(120, 100%, 40%);">+  const uint8_t smbios_memory_info_guid[16] =</span><br><span style="color: hsl(120, 100%, 40%);">+                   FSP_SMBIOS_MEMORY_INFO_GUID;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Locate the memory info HOB, presence validated by raminit */</span><br><span style="color: hsl(120, 100%, 40%);">+       memory_info_hob = fsp_find_extension_hob_by_guid(</span><br><span style="color: hsl(120, 100%, 40%);">+                                             smbios_memory_info_guid,</span><br><span style="color: hsl(120, 100%, 40%);">+                                              &hob_size);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (memory_info_hob == NULL) {</span><br><span style="color: hsl(120, 100%, 40%);">+                printk(BIOS_ERR, "SMBIOS MEMORY_INFO_DATA_HOB not found\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%);">+   /*</span><br><span style="color: hsl(120, 100%, 40%);">+     * Allocate CBMEM area for DIMM information used to populate SMBIOS</span><br><span style="color: hsl(120, 100%, 40%);">+    * table 17</span><br><span style="color: hsl(120, 100%, 40%);">+    */</span><br><span style="color: hsl(120, 100%, 40%);">+   mem_info = cbmem_add(CBMEM_ID_MEMINFO, sizeof(*mem_info));</span><br><span style="color: hsl(120, 100%, 40%);">+    if (mem_info == NULL) {</span><br><span style="color: hsl(120, 100%, 40%);">+               printk(BIOS_ERR, "CBMEM entry for DIMM info missing\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%);">+     memset(mem_info, 0, sizeof(*mem_info));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Describe the first N DIMMs in the system */</span><br><span style="color: hsl(120, 100%, 40%);">+        index = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+    dimm_max = ARRAY_SIZE(mem_info->dimm);</span><br><span style="color: hsl(120, 100%, 40%);">+     ctrlr_info = &memory_info_hob->Controller[0];</span><br><span style="color: hsl(120, 100%, 40%);">+  for (channel = 0; channel < MAX_CH && index < dimm_max; channel++) {</span><br><span style="color: hsl(120, 100%, 40%);">+            channel_info = &ctrlr_info->ChannelInfo[channel];</span><br><span style="color: hsl(120, 100%, 40%);">+              if (channel_info->Status != 2)</span><br><span style="color: hsl(120, 100%, 40%);">+                     continue;</span><br><span style="color: hsl(120, 100%, 40%);">+             for (dimm = 0; dimm < MAX_DIMM && index < dimm_max; dimm++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   src_dimm = &channel_info->DimmInfo[dimm];</span><br><span style="color: hsl(120, 100%, 40%);">+                      dest_dimm = &mem_info->dimm[index];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                  if (src_dimm->Status != DIMM_PRESENT)</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%);">+                   /* Populate the DIMM information */</span><br><span style="color: hsl(120, 100%, 40%);">+                   dimm_info_fill(dest_dimm,</span><br><span style="color: hsl(120, 100%, 40%);">+                             src_dimm->DimmCapacity,</span><br><span style="color: hsl(120, 100%, 40%);">+                            memory_info_hob->MemoryType,</span><br><span style="color: hsl(120, 100%, 40%);">+                               memory_info_hob->ConfiguredMemoryClockSpeed,</span><br><span style="color: hsl(120, 100%, 40%);">+                               channel_info->ChannelId,</span><br><span style="color: hsl(120, 100%, 40%);">+                           src_dimm->DimmId,</span><br><span style="color: hsl(120, 100%, 40%);">+                          (const char *)src_dimm->ModulePartNum,</span><br><span style="color: hsl(120, 100%, 40%);">+                             sizeof(src_dimm->ModulePartNum),</span><br><span style="color: hsl(120, 100%, 40%);">+                           memory_info_hob->DataWidth);</span><br><span style="color: hsl(120, 100%, 40%);">+                       index++;</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%);">+     mem_info->dimm_cnt = index;</span><br><span style="color: hsl(120, 100%, 40%);">+        printk(BIOS_DEBUG, "%d DIMMs found\n", mem_info->dimm_cnt);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> asmlinkage void car_stage_entry(void)</span><br><span> {</span><br><span>  bool s3wake;</span><br><span>@@ -49,6 +123,8 @@</span><br><span>    timestamp_add_now(TS_START_ROMSTAGE);</span><br><span>        s3wake = pmc_fill_power_state(ps) == ACPI_S3;</span><br><span>        fsp_memory_init(s3wake);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (!s3wake)</span><br><span style="color: hsl(120, 100%, 40%);">+          save_dimm_info();</span><br><span>    if (postcar_frame_init(&pcf, 1 * KiB))</span><br><span>           die("Unable to initialize postcar frame.\n");</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://review.coreboot.org/23621">change 23621</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/23621"/><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: I611f9f3fc0e07f026610b7a61bc3599523e4f262 </div>
<div style="display:none"> Gerrit-Change-Number: 23621 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Subrata Banik <subrata.banik@intel.com> </div>