<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>