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