summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFurquan Shaikh <furquan@google.com>2019-03-11 20:11:55 -0700
committerFurquan Shaikh <furquan@google.com>2019-03-13 15:49:05 +0000
commit5c19009ec710387a00df5760468b882079701432 (patch)
tree0b1616abce2b17b3f3c56b985a3cfed1b607cc50
parent8296fdd979023236a95c577a90f993250e0dcbb4 (diff)
downloadcoreboot-5c19009ec710387a00df5760468b882079701432.tar.xz
soc/intel/cannonlake: Allow mainboard to override DRAM part number
In order to support mainboards that do not store DRAM part number in the traditional way i.e. within the CBFS SPD for soldered memory, this change provides a runtime callback to allow mainboards to provide DRAM part number from a custom location e.g. external EEPROM on hatch. For other boards it should be a NOP since the weak implementation of mainboard_get_dram_part_num does nothing. BUG=b:127609572 Change-Id: I9b2d4c33fc378b9a24b111971ec2bfdb5f8d57d0 Signed-off-by: Furquan Shaikh <furquan@google.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/31850 Reviewed-by: Aaron Durbin <adurbin@chromium.org> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
-rw-r--r--src/soc/intel/cannonlake/include/soc/romstage.h3
-rw-r--r--src/soc/intel/cannonlake/romstage/romstage.c19
2 files changed, 20 insertions, 2 deletions
diff --git a/src/soc/intel/cannonlake/include/soc/romstage.h b/src/soc/intel/cannonlake/include/soc/romstage.h
index a58ace59a5..643105a0a2 100644
--- a/src/soc/intel/cannonlake/include/soc/romstage.h
+++ b/src/soc/intel/cannonlake/include/soc/romstage.h
@@ -20,6 +20,9 @@
#include <fsp/api.h>
void mainboard_memory_init_params(FSPM_UPD *mupd);
+
+/* Provide a callback to allow mainboard to override the DRAM part number. */
+void mainboard_get_dram_part_num(const char **part_num, size_t *len);
void systemagent_early_init(void);
/* Board type */
diff --git a/src/soc/intel/cannonlake/romstage/romstage.c b/src/soc/intel/cannonlake/romstage/romstage.c
index 6abeb3d88c..893f37d421 100644
--- a/src/soc/intel/cannonlake/romstage/romstage.c
+++ b/src/soc/intel/cannonlake/romstage/romstage.c
@@ -37,6 +37,11 @@
0x8d, 0x09, 0x11, 0xcf, 0x8b, 0x9f, 0x03, 0x23 \
}
+void __weak mainboard_get_dram_part_num(const char **part_num, size_t *len)
+{
+ /* Default weak implementation, no need to override part number. */
+}
+
/* Save the DIMM information for SMBIOS table 17 */
static void save_dimm_info(void)
{
@@ -50,6 +55,8 @@ static void save_dimm_info(void)
const MEMORY_INFO_DATA_HOB *memory_info_hob;
const uint8_t smbios_memory_info_guid[16] =
FSP_SMBIOS_MEMORY_INFO_GUID;
+ const char *dram_part_num;
+ size_t dram_part_num_len;
/* Locate the memory info HOB, presence validated by raminit */
memory_info_hob = fsp_find_extension_hob_by_guid(
@@ -86,6 +93,14 @@ static void save_dimm_info(void)
if (src_dimm->Status != DIMM_PRESENT)
continue;
+ dram_part_num_len = sizeof(src_dimm->ModulePartNum);
+ dram_part_num = (const char *)
+ &src_dimm->ModulePartNum[0];
+
+ /* Allow mainboard to override DRAM part number. */
+ mainboard_get_dram_part_num(&dram_part_num,
+ &dram_part_num_len);
+
/* Populate the DIMM information */
dimm_info_fill(dest_dimm,
src_dimm->DimmCapacity,
@@ -94,8 +109,8 @@ static void save_dimm_info(void)
src_dimm->RankInDimm,
channel_info->ChannelId,
src_dimm->DimmId,
- (const char *)src_dimm->ModulePartNum,
- sizeof(src_dimm->ModulePartNum),
+ dram_part_num,
+ dram_part_num_len,
memory_info_hob->DataWidth);
index++;
}