<p>Patrick Rudolph has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/28213">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">nb/intel/sandybridge/raminit: Move fill_smbios17 to ddr3.c<br><br>There's nothing Sandy Bridge specific in this code.<br>Make it available on all platforms to reduce code duplication.<br><br>Tested on Lenovo T430: SMBIOS entry 17 is still valid.<br><br>Change-Id: I051c3e07a999d8dad082c24f65b43dce180349fd<br>Signed-off-by: Patrick Rudolph <siro@das-labor.org><br>---<br>M src/device/dram/ddr3.c<br>M src/include/device/dram/ddr3.h<br>M src/northbridge/intel/sandybridge/raminit.c<br>3 files changed, 89 insertions(+), 62 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://review.coreboot.org:29418/coreboot refs/changes/13/28213/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/device/dram/ddr3.c b/src/device/dram/ddr3.c</span><br><span>index 7655b32..563ff8b 100644</span><br><span>--- a/src/device/dram/ddr3.c</span><br><span>+++ b/src/device/dram/ddr3.c</span><br><span>@@ -24,6 +24,9 @@</span><br><span> #include <device/device.h></span><br><span> #include <device/dram/ddr3.h></span><br><span> #include <string.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <memory_info.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <cbmem.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <smbios.h></span><br><span> </span><br><span> /*==============================================================================</span><br><span>  * = DDR3 SPD decoding helpers</span><br><span>@@ -522,6 +525,83 @@</span><br><span>        return ret;</span><br><span> }</span><br><span> </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%);">+ * Fill cbmem with information for SMBIOS type 17.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * @param channel Corresponding channel of provided @info</span><br><span style="color: hsl(120, 100%, 40%);">+ * @param slot Corresponding slot of provided @info</span><br><span style="color: hsl(120, 100%, 40%);">+ * @param selected_freq The actual frequency the DRAM is running on</span><br><span style="color: hsl(120, 100%, 40%);">+ * @param info DIMM parameters read from SPD</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * @return CB_SUCCESS if DIMM info was written</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+enum cb_err spd_add_smbios17(const u8 channel, const u8 slot,</span><br><span style="color: hsl(120, 100%, 40%);">+                             const u16 selected_freq,</span><br><span style="color: hsl(120, 100%, 40%);">+                      const dimm_attr *info)</span><br><span style="color: hsl(120, 100%, 40%);">+{</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%);">+</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_find(CBMEM_ID_MEMINFO);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (!mem_info) {</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          printk(BIOS_DEBUG, "CBMEM entry for DIMM info: 0x%p\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                             mem_info);</span><br><span style="color: hsl(120, 100%, 40%);">+            if (!mem_info)</span><br><span style="color: hsl(120, 100%, 40%);">+                        return CB_ERR;</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   dimm = &mem_info->dimm[mem_info->dimm_cnt];</span><br><span style="color: hsl(120, 100%, 40%);">+ if (info->size_mb) {</span><br><span style="color: hsl(120, 100%, 40%);">+               dimm->ddr_type = MEMORY_TYPE_DDR3;</span><br><span style="color: hsl(120, 100%, 40%);">+         dimm->ddr_frequency = selected_freq;</span><br><span style="color: hsl(120, 100%, 40%);">+               dimm->dimm_size = info->size_mb;</span><br><span style="color: hsl(120, 100%, 40%);">+                dimm->channel_num = channel;</span><br><span style="color: hsl(120, 100%, 40%);">+               dimm->rank_per_dimm = info->ranks;</span><br><span style="color: hsl(120, 100%, 40%);">+              dimm->dimm_num = slot;</span><br><span style="color: hsl(120, 100%, 40%);">+             memcpy(dimm->module_part_number, info->part_number, 16);</span><br><span style="color: hsl(120, 100%, 40%);">+                dimm->mod_id = info->manufacturer_id;</span><br><span style="color: hsl(120, 100%, 40%);">+           dimm->mod_type = info->dimm_type;</span><br><span style="color: hsl(120, 100%, 40%);">+               dimm->bus_width = MEMORY_BUS_WIDTH_64; // non-ECC only</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           switch (info->dimm_type) {</span><br><span style="color: hsl(120, 100%, 40%);">+         case SPD_DIMM_TYPE_SO_DIMM:</span><br><span style="color: hsl(120, 100%, 40%);">+                   dimm->mod_type = SPD_SODIMM;</span><br><span style="color: hsl(120, 100%, 40%);">+                       break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case SPD_DIMM_TYPE_72B_SO_CDIMM:</span><br><span style="color: hsl(120, 100%, 40%);">+                      dimm->mod_type = SPD_72B_SO_CDIMM;</span><br><span style="color: hsl(120, 100%, 40%);">+                 break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case SPD_DIMM_TYPE_72B_SO_RDIMM:</span><br><span style="color: hsl(120, 100%, 40%);">+                      dimm->mod_type = SPD_72B_SO_RDIMM;</span><br><span style="color: hsl(120, 100%, 40%);">+                 break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case SPD_DIMM_TYPE_UDIMM:</span><br><span style="color: hsl(120, 100%, 40%);">+                     dimm->mod_type = SPD_UDIMM;</span><br><span style="color: hsl(120, 100%, 40%);">+                        break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case SPD_DIMM_TYPE_RDIMM:</span><br><span style="color: hsl(120, 100%, 40%);">+                     dimm->mod_type = SPD_RDIMM;</span><br><span style="color: hsl(120, 100%, 40%);">+                        break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case SPD_DIMM_TYPE_UNDEFINED:</span><br><span style="color: hsl(120, 100%, 40%);">+         default:</span><br><span style="color: hsl(120, 100%, 40%);">+                      dimm->mod_type = SPD_UNDEFINED;</span><br><span style="color: hsl(120, 100%, 40%);">+                    break;</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(dimm->serial, info->serial,</span><br><span style="color: hsl(120, 100%, 40%);">+                     MIN(sizeof(dimm->serial), sizeof(info->serial)));</span><br><span style="color: hsl(120, 100%, 40%);">+                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 style="color: hsl(120, 100%, 40%);">+   return CB_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*</span><br><span>  * The information printed below has a more informational character, and is not</span><br><span>  * necessarily tied in to RAM init debugging. Hence, we stop using printram(),</span><br><span>diff --git a/src/include/device/dram/ddr3.h b/src/include/device/dram/ddr3.h</span><br><span>index 563be10..5643787 100644</span><br><span>--- a/src/include/device/dram/ddr3.h</span><br><span>+++ b/src/include/device/dram/ddr3.h</span><br><span>@@ -32,6 +32,7 @@</span><br><span> #include <stdint.h></span><br><span> #include <spd.h></span><br><span> #include <device/dram/common.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <types.h></span><br><span> </span><br><span> </span><br><span> /**</span><br><span>@@ -193,7 +194,9 @@</span><br><span> int spd_xmp_decode_ddr3(dimm_attr *dimm,</span><br><span>                       spd_raw_data spd,</span><br><span>                    enum ddr3_xmp_profile profile);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+enum cb_err spd_add_smbios17(const u8 channel, const u8 slot,</span><br><span style="color: hsl(120, 100%, 40%);">+                             const u16 selected_freq,</span><br><span style="color: hsl(120, 100%, 40%);">+                      const dimm_attr *info);</span><br><span> /**</span><br><span>  * \brief Read double word from specified address</span><br><span>  *</span><br><span>diff --git a/src/northbridge/intel/sandybridge/raminit.c b/src/northbridge/intel/sandybridge/raminit.c</span><br><span>index 4d02a64..0f72d88 100644</span><br><span>--- a/src/northbridge/intel/sandybridge/raminit.c</span><br><span>+++ b/src/northbridge/intel/sandybridge/raminit.c</span><br><span>@@ -16,7 +16,6 @@</span><br><span>  */</span><br><span> </span><br><span> #include <console/console.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <console/usb.h></span><br><span> #include <commonlib/region.h></span><br><span> #include <bootmode.h></span><br><span> #include <string.h></span><br><span>@@ -29,8 +28,6 @@</span><br><span> #include <southbridge/intel/common/smbus.h></span><br><span> #include <cpu/x86/msr.h></span><br><span> #include <delay.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <smbios.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <memory_info.h></span><br><span> #include <lib.h></span><br><span> #include "raminit_native.h"</span><br><span> #include "raminit_common.h"</span><br><span>@@ -81,67 +78,14 @@</span><br><span>  */</span><br><span> static void fill_smbios17(ramctr_timing *ctrl)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     struct memory_info *mem_info;</span><br><span>        int channel, slot;</span><br><span style="color: hsl(0, 100%, 40%);">-      struct dimm_info *dimm;</span><br><span style="color: hsl(0, 100%, 40%);">- uint16_t ddr_freq;</span><br><span style="color: hsl(0, 100%, 40%);">-      dimm_info *info = &ctrl->info;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   ddr_freq = (1000 << 8) / ctrl->tCK;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    /*</span><br><span style="color: hsl(0, 100%, 40%);">-       * Allocate CBMEM area for DIMM information used to populate SMBIOS</span><br><span style="color: hsl(0, 100%, 40%);">-      * table 17</span><br><span style="color: hsl(0, 100%, 40%);">-      */</span><br><span style="color: hsl(0, 100%, 40%);">-     mem_info = cbmem_add(CBMEM_ID_MEMINFO, sizeof(*mem_info));</span><br><span style="color: hsl(0, 100%, 40%);">-      printk(BIOS_DEBUG, "CBMEM entry for DIMM info: 0x%p\n", mem_info);</span><br><span style="color: hsl(0, 100%, 40%);">-    if (!mem_info)</span><br><span style="color: hsl(0, 100%, 40%);">-          return;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- memset(mem_info, 0, sizeof(*mem_info));</span><br><span style="color: hsl(120, 100%, 40%);">+       const u16 ddr_freq = (1000 << 8) / ctrl->tCK;</span><br><span> </span><br><span>   FOR_ALL_CHANNELS for (slot = 0; slot < NUM_SLOTS; slot++) {</span><br><span style="color: hsl(0, 100%, 40%);">-          dimm = &mem_info->dimm[mem_info->dimm_cnt];</span><br><span style="color: hsl(0, 100%, 40%);">-           if (info->dimm[channel][slot].size_mb) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     dimm->ddr_type = MEMORY_TYPE_DDR3;</span><br><span style="color: hsl(0, 100%, 40%);">-                   dimm->ddr_frequency = ddr_freq;</span><br><span style="color: hsl(0, 100%, 40%);">-                      dimm->dimm_size = info->dimm[channel][slot].size_mb;</span><br><span style="color: hsl(0, 100%, 40%);">-                      dimm->channel_num = channel;</span><br><span style="color: hsl(0, 100%, 40%);">-                 dimm->rank_per_dimm = info->dimm[channel][slot].ranks;</span><br><span style="color: hsl(0, 100%, 40%);">-                    dimm->dimm_num = slot;</span><br><span style="color: hsl(0, 100%, 40%);">-                       memcpy(dimm->module_part_number,</span><br><span style="color: hsl(0, 100%, 40%);">-                                info->dimm[channel][slot].part_number, 16);</span><br><span style="color: hsl(0, 100%, 40%);">-                       dimm->mod_id = info->dimm[channel][slot].manufacturer_id;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                 switch (info->dimm[channel][slot].dimm_type) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       case SPD_DIMM_TYPE_SO_DIMM:</span><br><span style="color: hsl(0, 100%, 40%);">-                             dimm->mod_type = SPD_SODIMM;</span><br><span style="color: hsl(0, 100%, 40%);">-                         break;</span><br><span style="color: hsl(0, 100%, 40%);">-                  case SPD_DIMM_TYPE_72B_SO_CDIMM:</span><br><span style="color: hsl(0, 100%, 40%);">-                                dimm->mod_type = SPD_72B_SO_CDIMM;</span><br><span style="color: hsl(0, 100%, 40%);">-                           break;</span><br><span style="color: hsl(0, 100%, 40%);">-                  case SPD_DIMM_TYPE_72B_SO_RDIMM:</span><br><span style="color: hsl(0, 100%, 40%);">-                                dimm->mod_type = SPD_72B_SO_RDIMM;</span><br><span style="color: hsl(0, 100%, 40%);">-                           break;</span><br><span style="color: hsl(0, 100%, 40%);">-                  case SPD_DIMM_TYPE_UDIMM:</span><br><span style="color: hsl(0, 100%, 40%);">-                               dimm->mod_type = SPD_UDIMM;</span><br><span style="color: hsl(0, 100%, 40%);">-                          break;</span><br><span style="color: hsl(0, 100%, 40%);">-                  case SPD_DIMM_TYPE_RDIMM:</span><br><span style="color: hsl(0, 100%, 40%);">-                               dimm->mod_type = SPD_RDIMM;</span><br><span style="color: hsl(0, 100%, 40%);">-                          break;</span><br><span style="color: hsl(0, 100%, 40%);">-                  case SPD_DIMM_TYPE_UNDEFINED:</span><br><span style="color: hsl(0, 100%, 40%);">-                   default:</span><br><span style="color: hsl(0, 100%, 40%);">-                                dimm->mod_type = SPD_UNDEFINED;</span><br><span style="color: hsl(0, 100%, 40%);">-                              break;</span><br><span style="color: hsl(0, 100%, 40%);">-                  }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                       dimm->bus_width = MEMORY_BUS_WIDTH_64; // non-ECC only</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                       memcpy(dimm->serial, info->dimm[channel][slot].serial,</span><br><span style="color: hsl(0, 100%, 40%);">-                           MIN(sizeof(dimm->serial),</span><br><span style="color: hsl(0, 100%, 40%);">-                                sizeof(info->dimm[channel][slot].serial)));</span><br><span style="color: hsl(0, 100%, 40%);">-                       mem_info->dimm_cnt++;</span><br><span style="color: hsl(0, 100%, 40%);">-                }</span><br><span style="color: hsl(120, 100%, 40%);">+             enum cb_err ret = spd_add_smbios17(channel, slot, ddr_freq,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   &ctrl->info.dimm[channel][slot]);</span><br><span style="color: hsl(120, 100%, 40%);">+              if (ret != CB_SUCCESS)</span><br><span style="color: hsl(120, 100%, 40%);">+                        printk(BIOS_ERR, "RAMINIT: Failed to add SMBIOS17\n");</span><br><span>     }</span><br><span> }</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://review.coreboot.org/28213">change 28213</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/28213"/><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: I051c3e07a999d8dad082c24f65b43dce180349fd </div>
<div style="display:none"> Gerrit-Change-Number: 28213 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Patrick Rudolph <siro@das-labor.org> </div>