<p>Julien Viard de Galbert has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/23851">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">soc/intel/denverton_ns: Fill dimm info for SMBIOS table 17<br><br>Rework display_fsp_smbios_memory_info_hob (shared code).<br><br>Import code to convert memory HOB to dimm info for SMBIOS table 17<br>mostly copied from fsp1_1 mainboard_save_dimm_info.<br><br>Change-Id: Id5c4ceaf4e65359f72ec764f0914b5daa82f257e<br>Signed-off-by: Julien Viard de Galbert <jviarddegalbert@online.net><br>---<br>M src/soc/intel/denverton_ns/Makefile.inc<br>M src/soc/intel/denverton_ns/chip.c<br>A src/soc/intel/denverton_ns/hob_mem.c<br>A src/soc/intel/denverton_ns/include/soc/hob_mem.h<br>M src/soc/intel/denverton_ns/include/soc/ramstage.h<br>M src/soc/intel/denverton_ns/romstage.c<br>6 files changed, 271 insertions(+), 69 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://review.coreboot.org:29418/coreboot refs/changes/51/23851/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/soc/intel/denverton_ns/Makefile.inc b/src/soc/intel/denverton_ns/Makefile.inc</span><br><span>index 5feea13..f137fd1 100644</span><br><span>--- a/src/soc/intel/denverton_ns/Makefile.inc</span><br><span>+++ b/src/soc/intel/denverton_ns/Makefile.inc</span><br><span>@@ -45,6 +45,7 @@</span><br><span> romstage-y += fiamux.c</span><br><span> romstage-$(CONFIG_DRIVERS_UART_8250MEM) += uart_debug.c</span><br><span> romstage-$(CONFIG_DISPLAY_UPD_DATA) += upd_display.c</span><br><span style="color: hsl(120, 100%, 40%);">+romstage-$(CONFIG_DISPLAY_HOBS) += hob_mem.c</span><br><span> romstage-$(CONFIG_DISPLAY_HOBS) += hob_display.c</span><br><span> </span><br><span> ramstage-y += memmap.c</span><br><span>@@ -63,6 +64,7 @@</span><br><span> ramstage-y += tsc_freq.c</span><br><span> ramstage-y += spi.c</span><br><span> ramstage-y += fiamux.c</span><br><span style="color: hsl(120, 100%, 40%);">+ramstage-y += hob_mem.c</span><br><span> ramstage-$(CONFIG_DRIVERS_UART_8250MEM) += uart_debug.c</span><br><span> ramstage-$(CONFIG_HAVE_ACPI_TABLES) += acpi.c</span><br><span> ramstage-$(CONFIG_HAVE_SMI_HANDLER) += smm.c</span><br><span>diff --git a/src/soc/intel/denverton_ns/chip.c b/src/soc/intel/denverton_ns/chip.c</span><br><span>index a43504c..30b4d8c 100644</span><br><span>--- a/src/soc/intel/denverton_ns/chip.c</span><br><span>+++ b/src/soc/intel/denverton_ns/chip.c</span><br><span>@@ -32,6 +32,7 @@</span><br><span> #include <soc/ramstage.h></span><br><span> #include <soc/fiamux.h></span><br><span> #include <spi-generic.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <soc/hob_mem.h></span><br><span> </span><br><span> static void pci_domain_set_resources(device_t dev)</span><br><span> {</span><br><span>@@ -65,7 +66,11 @@</span><br><span> dev->ops = &cpu_bus_ops;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void soc_init(void *data) { fsp_silicon_init(false); }</span><br><span style="color: hsl(120, 100%, 40%);">+static void soc_init(void *data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ fsp_silicon_init(false);</span><br><span style="color: hsl(120, 100%, 40%);">+ soc_save_dimm_info();</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span> static void soc_final(void *data) {}</span><br><span> </span><br><span>diff --git a/src/soc/intel/denverton_ns/hob_mem.c b/src/soc/intel/denverton_ns/hob_mem.c</span><br><span>new file mode 100644</span><br><span>index 0000000..6a22965</span><br><span>--- /dev/null</span><br><span>+++ b/src/soc/intel/denverton_ns/hob_mem.c</span><br><span>@@ -0,0 +1,229 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * This file is part of the coreboot project.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Copyright (C) 2014 Google Inc.</span><br><span style="color: hsl(120, 100%, 40%);">+ * Copyright (C) 2015-2016 Intel Corporation.</span><br><span style="color: hsl(120, 100%, 40%);">+ * Copyright (C) 2017-2018 Online SAS.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; version 2 of the License.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU General Public License for more details.</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%);">+#include <cbmem.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <console/console.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <string.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <soc/hob_mem.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <smbios.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <memory_info.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#if !defined(__PRE_RAM__)</span><br><span style="color: hsl(120, 100%, 40%);">+#include <soc/ramstage.h></span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</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%);">+ 0x8c, 0x10, 0xa1, 0x01, 0xee, 0x9d, 0x84, 0x49, \</span><br><span style="color: hsl(120, 100%, 40%);">+ 0x88, 0xc3, 0xee, 0xe8, 0xc4, 0x9e, 0xfb, 0x89 \</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 const FSP_SMBIOS_MEMORY_INFO *soc_get_fsp_smbios_memory_info_hob(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ size_t hob_size;</span><br><span style="color: hsl(120, 100%, 40%);">+ const FSP_SMBIOS_MEMORY_INFO *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 */</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 || hob_size == 0) {</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 NULL;</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 memory_info_hob;</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%);">+#if IS_ENABLED(CONFIG_DISPLAY_HOBS)</span><br><span style="color: hsl(120, 100%, 40%);">+static void soc_display_fsp_smbios_memory_info_hob(</span><br><span style="color: hsl(120, 100%, 40%);">+ const FSP_SMBIOS_MEMORY_INFO *memory_info_hob)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ int channel, dimm;</span><br><span style="color: hsl(120, 100%, 40%);">+ const DIMM_INFO *dimm_info;</span><br><span style="color: hsl(120, 100%, 40%);">+ const CHANNEL_INFO *channel_info;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Display the data in the FSP_SMBIOS_MEMORY_INFO HOB */</span><br><span style="color: hsl(120, 100%, 40%);">+ printk(BIOS_DEBUG, "FSP_SMBIOS_MEMORY_INFO HOB\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ printk(BIOS_DEBUG, " 0x%02x: Revision\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ memory_info_hob->Revision);</span><br><span style="color: hsl(120, 100%, 40%);">+ printk(BIOS_DEBUG, " 0x%02x: MemoryType\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ memory_info_hob->MemoryType);</span><br><span style="color: hsl(120, 100%, 40%);">+ printk(BIOS_DEBUG, " %d: MemoryFrequencyInMHz\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ memory_info_hob->MemoryFrequencyInMHz);</span><br><span style="color: hsl(120, 100%, 40%);">+ printk(BIOS_DEBUG, " %d: DataWidth in bits\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ memory_info_hob->DataWidth);</span><br><span style="color: hsl(120, 100%, 40%);">+ printk(BIOS_DEBUG, " 0x%02x: ErrorCorrectionType\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ memory_info_hob->ErrorCorrectionType);</span><br><span style="color: hsl(120, 100%, 40%);">+ printk(BIOS_DEBUG, " 0x%02x: ChannelCount\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ memory_info_hob->ChannelCount);</span><br><span style="color: hsl(120, 100%, 40%);">+ for (channel = 0; channel < memory_info_hob->ChannelCount;</span><br><span style="color: hsl(120, 100%, 40%);">+ channel++) {</span><br><span style="color: hsl(120, 100%, 40%);">+ channel_info = &memory_info_hob->ChannelInfo[channel];</span><br><span style="color: hsl(120, 100%, 40%);">+ printk(BIOS_DEBUG, " Channel %d\n", channel);</span><br><span style="color: hsl(120, 100%, 40%);">+ printk(BIOS_DEBUG, " 0x%02x: ChannelId\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ channel_info->ChannelId);</span><br><span style="color: hsl(120, 100%, 40%);">+ printk(BIOS_DEBUG, " 0x%02x: DimmCount\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ channel_info->DimmCount);</span><br><span style="color: hsl(120, 100%, 40%);">+ for (dimm = 0; dimm < channel_info->DimmCount;</span><br><span style="color: hsl(120, 100%, 40%);">+ dimm++) {</span><br><span style="color: hsl(120, 100%, 40%);">+ dimm_info = &channel_info->DimmInfo[dimm];</span><br><span style="color: hsl(120, 100%, 40%);">+ printk(BIOS_DEBUG, " DIMM %d\n", dimm);</span><br><span style="color: hsl(120, 100%, 40%);">+ printk(BIOS_DEBUG, " 0x%02x: DimmId\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ dimm_info->DimmId);</span><br><span style="color: hsl(120, 100%, 40%);">+ printk(BIOS_DEBUG, " %d: SizeInMb\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ dimm_info->SizeInMb);</span><br><span style="color: hsl(120, 100%, 40%);">+ printk(BIOS_DEBUG, " 0x%04x: MfgId\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ dimm_info->MfgId);</span><br><span style="color: hsl(120, 100%, 40%);">+ printk(BIOS_DEBUG, "%*.*s: ModulePartNum\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ (int)sizeof(dimm_info->ModulePartNum),</span><br><span style="color: hsl(120, 100%, 40%);">+ (int)sizeof(dimm_info->ModulePartNum),</span><br><span style="color: hsl(120, 100%, 40%);">+ dimm_info->ModulePartNum);</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void display_fsp_smbios_memory_info_hob(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ const FSP_SMBIOS_MEMORY_INFO *memory_info_hob;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Get the memory info HOB */</span><br><span style="color: hsl(120, 100%, 40%);">+ memory_info_hob = soc_get_fsp_smbios_memory_info_hob();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (memory_info_hob == NULL)</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%);">+ soc_display_fsp_smbios_memory_info_hob(memory_info_hob);</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 style="color: hsl(120, 100%, 40%);">+#if !defined(__PRE_RAM__)</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%);">+void soc_save_dimm_info(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ int channel;</span><br><span style="color: hsl(120, 100%, 40%);">+ const CHANNEL_INFO *channel_info;</span><br><span style="color: hsl(120, 100%, 40%);">+ int dimm;</span><br><span style="color: hsl(120, 100%, 40%);">+ const DIMM_INFO *dimm_info;</span><br><span style="color: hsl(120, 100%, 40%);">+ int dimm_max;</span><br><span style="color: hsl(120, 100%, 40%);">+ int index;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct memory_info *mem_info;</span><br><span style="color: hsl(120, 100%, 40%);">+ const FSP_SMBIOS_MEMORY_INFO *memory_info_hob;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Get the memory info HOB */</span><br><span style="color: hsl(120, 100%, 40%);">+ memory_info_hob = soc_get_fsp_smbios_memory_info_hob();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (memory_info_hob == NULL)</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%);">+ /* Display the data in the FSP_SMBIOS_MEMORY_INFO HOB */</span><br><span style="color: hsl(120, 100%, 40%);">+#if IS_ENABLED(CONFIG_DISPLAY_HOBS)</span><br><span style="color: hsl(120, 100%, 40%);">+ soc_display_fsp_smbios_memory_info_hob(memory_info_hob);</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</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%);">+ printk(BIOS_DEBUG, "CBMEM entry for DIMM info: 0x%p\n", mem_info);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (mem_info == NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+ return;</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%);">+ for (channel = 0; channel < memory_info_hob->ChannelCount; channel++) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (index >= dimm_max)</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ channel_info = &memory_info_hob->ChannelInfo[channel];</span><br><span style="color: hsl(120, 100%, 40%);">+ for (dimm = 0; dimm < channel_info->DimmCount; dimm++) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (index >= dimm_max)</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ dimm_info = &channel_info->DimmInfo[dimm];</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%);">+ if (dimm_info->SizeInMb) {</span><br><span style="color: hsl(120, 100%, 40%);">+ mem_info->dimm[index].dimm_size =</span><br><span style="color: hsl(120, 100%, 40%);">+ dimm_info->SizeInMb;</span><br><span style="color: hsl(120, 100%, 40%);">+ mem_info->dimm[index].ddr_type =</span><br><span style="color: hsl(120, 100%, 40%);">+ memory_info_hob->MemoryType;</span><br><span style="color: hsl(120, 100%, 40%);">+ mem_info->dimm[index].ddr_frequency =</span><br><span style="color: hsl(120, 100%, 40%);">+ memory_info_hob->MemoryFrequencyInMHz;</span><br><span style="color: hsl(120, 100%, 40%);">+ mem_info->dimm[index].channel_num =</span><br><span style="color: hsl(120, 100%, 40%);">+ channel_info->ChannelId;</span><br><span style="color: hsl(120, 100%, 40%);">+ mem_info->dimm[index].dimm_num =</span><br><span style="color: hsl(120, 100%, 40%);">+ dimm_info->DimmId;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ strncpy(</span><br><span style="color: hsl(120, 100%, 40%);">+ (char *)mem_info->dimm[index].module_part_number,</span><br><span style="color: hsl(120, 100%, 40%);">+ (char *)dimm_info->ModulePartNum, 18);</span><br><span style="color: hsl(120, 100%, 40%);">+ mem_info->dimm[index].mod_id =</span><br><span style="color: hsl(120, 100%, 40%);">+ dimm_info->MfgId;</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (memory_info_hob->DataWidth) {</span><br><span style="color: hsl(120, 100%, 40%);">+ default:</span><br><span style="color: hsl(120, 100%, 40%);">+ case 8:</span><br><span style="color: hsl(120, 100%, 40%);">+ mem_info->dimm[index].bus_width =</span><br><span style="color: hsl(120, 100%, 40%);">+ MEMORY_BUS_WIDTH_8;</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%);">+ case 16:</span><br><span style="color: hsl(120, 100%, 40%);">+ mem_info->dimm[index].bus_width =</span><br><span style="color: hsl(120, 100%, 40%);">+ MEMORY_BUS_WIDTH_16;</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%);">+ case 32:</span><br><span style="color: hsl(120, 100%, 40%);">+ mem_info->dimm[index].bus_width =</span><br><span style="color: hsl(120, 100%, 40%);">+ MEMORY_BUS_WIDTH_32;</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%);">+ case 64:</span><br><span style="color: hsl(120, 100%, 40%);">+ mem_info->dimm[index].bus_width =</span><br><span style="color: hsl(120, 100%, 40%);">+ MEMORY_BUS_WIDTH_64;</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%);">+ case 128:</span><br><span style="color: hsl(120, 100%, 40%);">+ mem_info->dimm[index].bus_width =</span><br><span style="color: hsl(120, 100%, 40%);">+ MEMORY_BUS_WIDTH_128;</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%);">+ /* Add any mainboard specific information */</span><br><span style="color: hsl(120, 100%, 40%);">+ mainboard_add_dimm_info(mem_info,</span><br><span style="color: hsl(120, 100%, 40%);">+ channel, dimm, index);</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%);">+ }</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 style="color: hsl(120, 100%, 40%);">+/* Add any mainboard specific information */</span><br><span style="color: hsl(120, 100%, 40%);">+__attribute__((weak)) void mainboard_add_dimm_info(</span><br><span style="color: hsl(120, 100%, 40%);">+ struct memory_info *mem_info,</span><br><span style="color: hsl(120, 100%, 40%);">+ int channel, int dimm, int index)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ printk(BIOS_DEBUG, "WEAK: %s/%s called\n", __FILE__, __func__);</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>diff --git a/src/soc/intel/denverton_ns/include/soc/hob_mem.h b/src/soc/intel/denverton_ns/include/soc/hob_mem.h</span><br><span>new file mode 100644</span><br><span>index 0000000..79711d6</span><br><span>--- /dev/null</span><br><span>+++ b/src/soc/intel/denverton_ns/include/soc/hob_mem.h</span><br><span>@@ -0,0 +1,30 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * This file is part of the coreboot project.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Copyright (C) 2014 Google Inc.</span><br><span style="color: hsl(120, 100%, 40%);">+ * Copyright (C) 2015-2016 Intel Corporation.</span><br><span style="color: hsl(120, 100%, 40%);">+ * Copyright (C) 2017-2018 Online SAS.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; version 2 of the License.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU General Public License for more details.</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%);">+#ifndef _DENVERTON_NS_HOB_MEM_H</span><br><span style="color: hsl(120, 100%, 40%);">+#define _DENVERTON_NS_HOB_MEM_H</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <fsp/util.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#if IS_ENABLED(CONFIG_DISPLAY_HOBS)</span><br><span style="color: hsl(120, 100%, 40%);">+void display_fsp_smbios_memory_info_hob(void);</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void soc_save_dimm_info(void);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#endif // _DENVERTON_NS_HOB_MEM_H</span><br><span>diff --git a/src/soc/intel/denverton_ns/include/soc/ramstage.h b/src/soc/intel/denverton_ns/include/soc/ramstage.h</span><br><span>index 63ed432..d0b6d43 100644</span><br><span>--- a/src/soc/intel/denverton_ns/include/soc/ramstage.h</span><br><span>+++ b/src/soc/intel/denverton_ns/include/soc/ramstage.h</span><br><span>@@ -20,10 +20,13 @@</span><br><span> #include <fsp/api.h></span><br><span> #include <fsp/util.h></span><br><span> #include <soc/intel/common/opregion.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <memory_info.h></span><br><span> </span><br><span> void denverton_init_cpus(device_t dev);</span><br><span> void mainboard_silicon_init_params(FSPS_UPD *params);</span><br><span> void southcluster_enable_dev(device_t dev);</span><br><span style="color: hsl(120, 100%, 40%);">+void mainboard_add_dimm_info(struct memory_info *mem_info, int channel,</span><br><span style="color: hsl(120, 100%, 40%);">+ int dimm, int index);</span><br><span> </span><br><span> extern struct pci_operations soc_pci_ops;</span><br><span> </span><br><span>diff --git a/src/soc/intel/denverton_ns/romstage.c b/src/soc/intel/denverton_ns/romstage.c</span><br><span>index f675933..4c31110 100644</span><br><span>--- a/src/soc/intel/denverton_ns/romstage.c</span><br><span>+++ b/src/soc/intel/denverton_ns/romstage.c</span><br><span>@@ -27,77 +27,10 @@</span><br><span> #include <soc/smbus.h></span><br><span> #include <soc/smm.h></span><br><span> #include <soc/soc_util.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <soc/hob_mem.h></span><br><span> </span><br><span> void __attribute__((weak)) mainboard_config_gpios(void) {}</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#define FSP_SMBIOS_MEMORY_INFO_GUID \</span><br><span style="color: hsl(0, 100%, 40%);">-{ \</span><br><span style="color: hsl(0, 100%, 40%);">- 0x8c, 0x10, 0xa1, 0x01, 0xee, 0x9d, 0x84, 0x49, \</span><br><span style="color: hsl(0, 100%, 40%);">- 0x88, 0xc3, 0xee, 0xe8, 0xc4, 0x9e, 0xfb, 0x89 \</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%);">-#if IS_ENABLED(CONFIG_DISPLAY_HOBS)</span><br><span style="color: hsl(0, 100%, 40%);">-static void display_fsp_smbios_memory_info_hob(void)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- int channel, dimm;</span><br><span style="color: hsl(0, 100%, 40%);">- size_t hob_size;</span><br><span style="color: hsl(0, 100%, 40%);">- const DIMM_INFO *dimm_info;</span><br><span style="color: hsl(0, 100%, 40%);">- const CHANNEL_INFO *channel_info;</span><br><span style="color: hsl(0, 100%, 40%);">- const FSP_SMBIOS_MEMORY_INFO *memory_info_hob;</span><br><span style="color: hsl(0, 100%, 40%);">- const uint8_t smbios_memory_info_guid[16] =</span><br><span style="color: hsl(0, 100%, 40%);">- FSP_SMBIOS_MEMORY_INFO_GUID;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Locate the memory info HOB */</span><br><span style="color: hsl(0, 100%, 40%);">- memory_info_hob = fsp_find_extension_hob_by_guid(</span><br><span style="color: hsl(0, 100%, 40%);">- smbios_memory_info_guid,</span><br><span style="color: hsl(0, 100%, 40%);">- &hob_size);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (memory_info_hob == NULL || hob_size == 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- printk(BIOS_ERR, "SMBIOS MEMORY_INFO_DATA_HOB not found\n");</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%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Display the data in the FSP_SMBIOS_MEMORY_INFO HOB */</span><br><span style="color: hsl(0, 100%, 40%);">- printk(BIOS_DEBUG, "FSP_SMBIOS_MEMORY_INFO HOB\n");</span><br><span style="color: hsl(0, 100%, 40%);">- printk(BIOS_DEBUG, " 0x%02x: Revision\n",</span><br><span style="color: hsl(0, 100%, 40%);">- memory_info_hob->Revision);</span><br><span style="color: hsl(0, 100%, 40%);">- printk(BIOS_DEBUG, " 0x%02x: MemoryType\n",</span><br><span style="color: hsl(0, 100%, 40%);">- memory_info_hob->MemoryType);</span><br><span style="color: hsl(0, 100%, 40%);">- printk(BIOS_DEBUG, " %d: MemoryFrequencyInMHz\n",</span><br><span style="color: hsl(0, 100%, 40%);">- memory_info_hob->MemoryFrequencyInMHz);</span><br><span style="color: hsl(0, 100%, 40%);">- printk(BIOS_DEBUG, " %d: DataWidth in bits\n",</span><br><span style="color: hsl(0, 100%, 40%);">- memory_info_hob->DataWidth);</span><br><span style="color: hsl(0, 100%, 40%);">- printk(BIOS_DEBUG, " 0x%02x: ErrorCorrectionType\n",</span><br><span style="color: hsl(0, 100%, 40%);">- memory_info_hob->ErrorCorrectionType);</span><br><span style="color: hsl(0, 100%, 40%);">- printk(BIOS_DEBUG, " 0x%02x: ChannelCount\n",</span><br><span style="color: hsl(0, 100%, 40%);">- memory_info_hob->ChannelCount);</span><br><span style="color: hsl(0, 100%, 40%);">- for (channel = 0; channel < memory_info_hob->ChannelCount;</span><br><span style="color: hsl(0, 100%, 40%);">- channel++) {</span><br><span style="color: hsl(0, 100%, 40%);">- channel_info = &memory_info_hob->ChannelInfo[channel];</span><br><span style="color: hsl(0, 100%, 40%);">- printk(BIOS_DEBUG, " Channel %d\n", channel);</span><br><span style="color: hsl(0, 100%, 40%);">- printk(BIOS_DEBUG, " 0x%02x: ChannelId\n",</span><br><span style="color: hsl(0, 100%, 40%);">- channel_info->ChannelId);</span><br><span style="color: hsl(0, 100%, 40%);">- printk(BIOS_DEBUG, " 0x%02x: DimmCount\n",</span><br><span style="color: hsl(0, 100%, 40%);">- channel_info->DimmCount);</span><br><span style="color: hsl(0, 100%, 40%);">- for (dimm = 0; dimm < channel_info->DimmCount;</span><br><span style="color: hsl(0, 100%, 40%);">- dimm++) {</span><br><span style="color: hsl(0, 100%, 40%);">- dimm_info = &channel_info->DimmInfo[dimm];</span><br><span style="color: hsl(0, 100%, 40%);">- printk(BIOS_DEBUG, " DIMM %d\n", dimm);</span><br><span style="color: hsl(0, 100%, 40%);">- printk(BIOS_DEBUG, " 0x%02x: DimmId\n",</span><br><span style="color: hsl(0, 100%, 40%);">- dimm_info->DimmId);</span><br><span style="color: hsl(0, 100%, 40%);">- printk(BIOS_DEBUG, " %d: SizeInMb\n",</span><br><span style="color: hsl(0, 100%, 40%);">- dimm_info->SizeInMb);</span><br><span style="color: hsl(0, 100%, 40%);">- printk(BIOS_DEBUG, " 0x%04x: MfgId\n",</span><br><span style="color: hsl(0, 100%, 40%);">- dimm_info->MfgId);</span><br><span style="color: hsl(0, 100%, 40%);">- printk(BIOS_DEBUG, "%*.*s: ModulePartNum\n",</span><br><span style="color: hsl(0, 100%, 40%);">- (int)sizeof(dimm_info->ModulePartNum),</span><br><span style="color: hsl(0, 100%, 40%);">- (int)sizeof(dimm_info->ModulePartNum),</span><br><span style="color: hsl(0, 100%, 40%);">- dimm_info->ModulePartNum);</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%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> static void early_pmc_init(void)</span><br><span> {</span><br><span> /* PMC (B0:D31:F2). */</span><br><span></span><br></pre><p>To view, visit <a href="https://review.coreboot.org/23851">change 23851</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/23851"/><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: Id5c4ceaf4e65359f72ec764f0914b5daa82f257e </div>
<div style="display:none"> Gerrit-Change-Number: 23851 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Julien Viard de Galbert <jviarddegalbert@online.net> </div>