diff options
author | Angel Pons <th3fanbus@gmail.com> | 2022-05-03 18:37:32 +0200 |
---|---|---|
committer | Martin L Roth <gaumless@gmail.com> | 2022-12-09 03:44:41 +0000 |
commit | 3cc20202de705baf45e58dfecf5937044d0b5c10 (patch) | |
tree | e8132ae727c5c83da9649acb9538820d85fdb229 /src | |
parent | d41f69ccce98808cac536d7d707efecca1706e50 (diff) |
soc/intel/xeon_sp/cpx: Allow creating meminfo for empty DIMM slots
Introduce the mainboard-defined `mainboard_dimm_slot_exists()` function
to allow creating SMBIOS type 17 entries for unpopulated DIMM slots.
Change-Id: I1d9c41dd7d981842ca6f0294d9e6b0fedc0c98e4
Signed-off-by: Angel Pons <th3fanbus@gmail.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/64036
Reviewed-by: Jonathan Zhang <jonzhang@fb.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Diffstat (limited to 'src')
-rw-r--r-- | src/soc/intel/xeon_sp/cpx/ddr.c | 5 | ||||
-rw-r--r-- | src/soc/intel/xeon_sp/cpx/include/soc/ddr.h | 4 | ||||
-rw-r--r-- | src/soc/intel/xeon_sp/cpx/romstage.c | 18 |
3 files changed, 23 insertions, 4 deletions
diff --git a/src/soc/intel/xeon_sp/cpx/ddr.c b/src/soc/intel/xeon_sp/cpx/ddr.c index 0fa36ab6c9..990711f090 100644 --- a/src/soc/intel/xeon_sp/cpx/ddr.c +++ b/src/soc/intel/xeon_sp/cpx/ddr.c @@ -82,3 +82,8 @@ uint16_t get_max_memory_speed(uint32_t commonTck) else return 800; } + +__weak bool mainboard_dimm_slot_exists(uint8_t socket, uint8_t channel, uint8_t slot) +{ + return false; +} diff --git a/src/soc/intel/xeon_sp/cpx/include/soc/ddr.h b/src/soc/intel/xeon_sp/cpx/include/soc/ddr.h index 61a5ebe338..0ef6ded124 100644 --- a/src/soc/intel/xeon_sp/cpx/include/soc/ddr.h +++ b/src/soc/intel/xeon_sp/cpx/include/soc/ddr.h @@ -3,7 +3,7 @@ #ifndef _CPX_DDR_H_ #define _CPX_DDR_H_ -#include <stdint.h> +#include <types.h> /* DDR_*_TCK_MIN are in picoseconds */ #define DDR_800_TCK_MIN 2500 @@ -48,4 +48,6 @@ uint16_t get_max_memory_speed(uint32_t commonTck); uint32_t get_ddr_voltage(uint8_t DdrVoltage); +bool mainboard_dimm_slot_exists(uint8_t socket, uint8_t channel, uint8_t slot); + #endif /* _CPX_DDR_H_ */ diff --git a/src/soc/intel/xeon_sp/cpx/romstage.c b/src/soc/intel/xeon_sp/cpx/romstage.c index c0ecd65301..43a74e20a9 100644 --- a/src/soc/intel/xeon_sp/cpx/romstage.c +++ b/src/soc/intel/xeon_sp/cpx/romstage.c @@ -81,7 +81,7 @@ void save_dimm_info(void) struct memory_info *mem_info; const struct SystemMemoryMapHob *hob; MEMMAP_DIMM_DEVICE_INFO_STRUCT src_dimm; - int dimm_max, index = 0; + int dimm_max, index = 0, num_dimms = 0; uint32_t vdd_voltage; hob = get_system_memory_map(); @@ -134,13 +134,25 @@ void save_dimm_info(void) src_dimm.actKeyByte2, 0); index++; + num_dimms++; + } else if (mainboard_dimm_slot_exists(0, ch, dimm)) { + if (index >= dimm_max) { + printk(BIOS_WARNING, "Too many DIMMs info for %s.\n", + __func__); + return; + } + dest_dimm = &mem_info->dimm[index]; + dest_dimm->dimm_size = 0; + dest_dimm->channel_num = ch; + dest_dimm->dimm_num = dimm; + index++; } } } - /* Save available DIMM information */ + /* Save available DIMM slot information */ mem_info->dimm_cnt = index; - printk(BIOS_DEBUG, "%d DIMMs found\n", mem_info->dimm_cnt); + printk(BIOS_DEBUG, "%d out of %d DIMMs found\n", num_dimms, mem_info->dimm_cnt); } static void set_cmos_mrc_cold_boot_flag(bool cold_boot_required) |