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>
This commit is contained in:
Furquan Shaikh 2019-03-11 20:11:55 -07:00
parent 8296fdd979
commit 5c19009ec7
2 changed files with 20 additions and 2 deletions

View File

@ -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 */

View File

@ -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++;
}