From 5c19009ec710387a00df5760468b882079701432 Mon Sep 17 00:00:00 2001 From: Furquan Shaikh Date: Mon, 11 Mar 2019 20:11:55 -0700 Subject: 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 Reviewed-on: https://review.coreboot.org/c/coreboot/+/31850 Reviewed-by: Aaron Durbin Tested-by: build bot (Jenkins) --- src/soc/intel/cannonlake/include/soc/romstage.h | 3 +++ src/soc/intel/cannonlake/romstage/romstage.c | 19 +++++++++++++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) (limited to 'src/soc') 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 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++; } -- cgit v1.2.3