<p>Richard Spiegel has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/23644">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">soc/amd/common/block/pi/amd_init_late.c: Transfer memory info to cbmem<br><br>SMBIOS structure type 17 is not being generated because memory info is not<br>being stored to cbmem. This has to happen after AGESA AmdInitLate has run,<br>but before the structure is released. There's a need to convert format between<br>AGESA generated info, and what is required in cbmem.<br><br>BUG=b:65403853<br>TEST=build and run kahlee, verify if SMBIOS structure type 17 is being<br>generated, and if associated strings are what should be expected.<br><br>Change-Id: I151a8f1348c9bafceb38bab1f79d3002c5f6b31b<br>Signed-off-by: Richard Spiegel <richard.spiegel@silverbackltd.com><br>---<br>M src/soc/amd/common/block/pi/amd_late_init.c<br>1 file changed, 97 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/44/23644/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/soc/amd/common/block/pi/amd_late_init.c b/src/soc/amd/common/block/pi/amd_late_init.c</span><br><span>index 3eb3674..499931a 100644</span><br><span>--- a/src/soc/amd/common/block/pi/amd_late_init.c</span><br><span>+++ b/src/soc/amd/common/block/pi/amd_late_init.c</span><br><span>@@ -19,16 +19,113 @@</span><br><span> #include <device/device.h></span><br><span> #include <device/pci_def.h></span><br><span> #include <device/pci_ops.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <cbmem.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <memory_info.h></span><br><span> </span><br><span> #include <amdblocks/agesawrapper.h></span><br><span> #include <amdblocks/agesawrapper_call.h></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * Description      Copies a string from origin to destine. However, destine buffer</span><br><span style="color: hsl(120, 100%, 40%);">+ * can sometimes be smaller than the string in origin. This procedure makes</span><br><span style="color: hsl(120, 100%, 40%);">+ * sure that at least the last characters are copied.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * origin      pointer to origing of string.</span><br><span style="color: hsl(120, 100%, 40%);">+ * destin        pointer to final string.</span><br><span style="color: hsl(120, 100%, 40%);">+ * o_size     size of origin buffer.</span><br><span style="color: hsl(120, 100%, 40%);">+ * d_size       size of destin buffer.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+static void string_end(char *origin, char *destin, uint8_t o_size,</span><br><span style="color: hsl(120, 100%, 40%);">+                               uint8_t d_size)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    uint8_t size, i, j;</span><br><span style="color: hsl(120, 100%, 40%);">+   char *optr, *dptr;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  optr = origin;</span><br><span style="color: hsl(120, 100%, 40%);">+        dptr = destin;</span><br><span style="color: hsl(120, 100%, 40%);">+        if (o_size > d_size) {</span><br><span style="color: hsl(120, 100%, 40%);">+             /* Find the actual string size */</span><br><span style="color: hsl(120, 100%, 40%);">+             i = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                for (j = 0; j < o_size; j++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (*optr == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                               break;</span><br><span style="color: hsl(120, 100%, 40%);">+                        optr++;</span><br><span style="color: hsl(120, 100%, 40%);">+                       i++;</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+             i++; /* include terminator in string size */</span><br><span style="color: hsl(120, 100%, 40%);">+          if (i < d_size) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  /* actual string smaller than destin buffer */</span><br><span style="color: hsl(120, 100%, 40%);">+                        optr = origin;</span><br><span style="color: hsl(120, 100%, 40%);">+                        size = o_size;</span><br><span style="color: hsl(120, 100%, 40%);">+                } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      /* String equal or greater than destin buffer */</span><br><span style="color: hsl(120, 100%, 40%);">+                      for (j = 1; j < d_size; j++)</span><br><span style="color: hsl(120, 100%, 40%);">+                               optr--;</span><br><span style="color: hsl(120, 100%, 40%);">+                       size = d_size;</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+     } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              size = o_size;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+     for (i = 0; i < size; i++)</span><br><span style="color: hsl(120, 100%, 40%);">+         dptr[i] = optr[i];</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 transfer_memory_info(TYPE17_DMI_INFO *dmi17,</span><br><span style="color: hsl(120, 100%, 40%);">+                             struct dimm_info *dimm)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    dimm->dimm_size = dmi17->ExtSize;</span><br><span style="color: hsl(120, 100%, 40%);">+       dimm->ddr_type = dmi17->MemoryType;</span><br><span style="color: hsl(120, 100%, 40%);">+     dimm->ddr_frequency = dmi17->Speed;</span><br><span style="color: hsl(120, 100%, 40%);">+     dimm->rank_per_dimm = dmi17->Attributes;</span><br><span style="color: hsl(120, 100%, 40%);">+        dimm->mod_id = dmi17->DeviceLocator[5] & 0x0f;</span><br><span style="color: hsl(120, 100%, 40%);">+      dimm->mod_type = dmi17->MemoryType;</span><br><span style="color: hsl(120, 100%, 40%);">+     dimm->bus_width = dmi17->DataWidth;</span><br><span style="color: hsl(120, 100%, 40%);">+     dimm->bank_locator = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+    string_end(dmi17->SerialNumber, (char *)&dimm->serial, 9, 5);</span><br><span style="color: hsl(120, 100%, 40%);">+       dimm->module_part_number[0] = 0x4e;  /* NA */</span><br><span style="color: hsl(120, 100%, 40%);">+      dimm->module_part_number[1] = 0x41;</span><br><span style="color: hsl(120, 100%, 40%);">+        dimm->module_part_number[2] = 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%);">+static void prepare_dmi_17(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ DMI_INFO *DmiTable;</span><br><span style="color: hsl(120, 100%, 40%);">+   TYPE17_DMI_INFO *address;</span><br><span style="color: hsl(120, 100%, 40%);">+     struct memory_info *mem_info;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct dimm_info *dimm;</span><br><span style="color: hsl(120, 100%, 40%);">+       uint8_t i, j; /* i for channel, j for dimm */</span><br><span style="color: hsl(120, 100%, 40%);">+ int dimm_cnt = 0;</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(struct memory_info));</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!mem_info) {</span><br><span style="color: hsl(120, 100%, 40%);">+              printk(BIOS_DEBUG, "Failed to add memory info to CBMEM.\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(struct memory_info));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    DmiTable = agesawrapper_getlateinitptr(PICK_DMI);</span><br><span style="color: hsl(120, 100%, 40%);">+     for (i = 0; i < MAX_CHANNELS_PER_SOCKET; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+            for (j = 0; j < MAX_DIMMS_PER_CHANNEL; j++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      address = &DmiTable->T17[0][i][j];</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (address->Handle > 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                              dimm = &mem_info->dimm[dimm_cnt];</span><br><span style="color: hsl(120, 100%, 40%);">+                              dimm->channel_num = i;</span><br><span style="color: hsl(120, 100%, 40%);">+                             dimm->dimm_num = j;</span><br><span style="color: hsl(120, 100%, 40%);">+                                transfer_memory_info(address, dimm);</span><br><span style="color: hsl(120, 100%, 40%);">+                          dimm_cnt++;</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%);">+     mem_info->dimm_cnt = dimm_cnt;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static void agesawrapper_post_device(void *unused)</span><br><span> {</span><br><span>    if (acpi_is_wakeup_s3())</span><br><span>             return;</span><br><span> </span><br><span>  do_agesawrapper(agesawrapper_amdinitlate, "amdinitlate");</span><br><span style="color: hsl(120, 100%, 40%);">+   prepare_dmi_17();</span><br><span> </span><br><span>        if (!acpi_s3_resume_allowed())</span><br><span>               return;</span><br><span></span><br></pre><p>To view, visit <a href="https://review.coreboot.org/23644">change 23644</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/23644"/><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: I151a8f1348c9bafceb38bab1f79d3002c5f6b31b </div>
<div style="display:none"> Gerrit-Change-Number: 23644 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Richard Spiegel <richard.spiegel@silverbackltd.com> </div>