mb/ocp/deltalake: Fill ECC type in romstage
Fill the ECC type in `struct memory_info` in romstage, and in SoC code. The SMBIOS override is unnecessary, and this is not mainboard-specific. Change-Id: I8370b3ee7d75914b895946b53923598adf87b522 Signed-off-by: Angel Pons <th3fanbus@gmail.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/50179 Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net> Reviewed-by: Johnny Lin <Johnny_Lin@wiwynn.com> Reviewed-by: Patrick Rudolph <patrick.rudolph@9elements.com> Reviewed-by: Jonathan Zhang <jonzhang@fb.com> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
committed by
Patrick Georgi
parent
6724ba4f04
commit
6e82ebff73
@@ -443,11 +443,6 @@ static int get_socket_type(void)
|
|||||||
return 0x02; /* Unknown */
|
return 0x02; /* Unknown */
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int __weak smbios_memory_error_correction_type(struct memory_info *meminfo)
|
|
||||||
{
|
|
||||||
return meminfo->ecc_type;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int __weak smbios_processor_external_clock(void)
|
unsigned int __weak smbios_processor_external_clock(void)
|
||||||
{
|
{
|
||||||
return 0; /* Unknown */
|
return 0; /* Unknown */
|
||||||
@@ -1023,7 +1018,7 @@ static int smbios_write_type16(unsigned long *current, int *handle)
|
|||||||
|
|
||||||
t->location = MEMORY_ARRAY_LOCATION_SYSTEM_BOARD;
|
t->location = MEMORY_ARRAY_LOCATION_SYSTEM_BOARD;
|
||||||
t->use = MEMORY_ARRAY_USE_SYSTEM;
|
t->use = MEMORY_ARRAY_USE_SYSTEM;
|
||||||
t->memory_error_correction = smbios_memory_error_correction_type(meminfo);
|
t->memory_error_correction = meminfo->ecc_type;
|
||||||
|
|
||||||
/* no error information handle available */
|
/* no error information handle available */
|
||||||
t->memory_error_information_handle = 0xFFFE;
|
t->memory_error_information_handle = 0xFFFE;
|
||||||
|
@@ -61,7 +61,6 @@ void smbios_type0_bios_version(uintptr_t address);
|
|||||||
|
|
||||||
void smbios_ec_revision(uint8_t *ec_major_revision, uint8_t *ec_minor_revision);
|
void smbios_ec_revision(uint8_t *ec_major_revision, uint8_t *ec_minor_revision);
|
||||||
|
|
||||||
unsigned int smbios_memory_error_correction_type(struct memory_info *meminfo);
|
|
||||||
unsigned int smbios_processor_external_clock(void);
|
unsigned int smbios_processor_external_clock(void);
|
||||||
unsigned int smbios_processor_characteristics(void);
|
unsigned int smbios_processor_characteristics(void);
|
||||||
struct cpuid_result;
|
struct cpuid_result;
|
||||||
|
@@ -23,31 +23,6 @@
|
|||||||
extern struct fru_info_str fru_strings;
|
extern struct fru_info_str fru_strings;
|
||||||
static char slot_id_str[SLOT_ID_LEN];
|
static char slot_id_str[SLOT_ID_LEN];
|
||||||
|
|
||||||
/* Override SMBIOS type 16 error correction type. */
|
|
||||||
unsigned int smbios_memory_error_correction_type(struct memory_info *meminfo)
|
|
||||||
{
|
|
||||||
const struct SystemMemoryMapHob *hob;
|
|
||||||
|
|
||||||
hob = get_system_memory_map();
|
|
||||||
assert(hob != NULL);
|
|
||||||
|
|
||||||
switch (hob->RasModesEnabled) {
|
|
||||||
case CH_INDEPENDENT:
|
|
||||||
return MEMORY_ARRAY_ECC_SINGLE_BIT;
|
|
||||||
case FULL_MIRROR_1LM:
|
|
||||||
case PARTIAL_MIRROR_1LM:
|
|
||||||
case FULL_MIRROR_2LM:
|
|
||||||
case PARTIAL_MIRROR_2LM:
|
|
||||||
return MEMORY_ARRAY_ECC_MULTI_BIT;
|
|
||||||
case RK_SPARE:
|
|
||||||
return MEMORY_ARRAY_ECC_SINGLE_BIT;
|
|
||||||
case CH_LOCKSTEP:
|
|
||||||
return MEMORY_ARRAY_ECC_SINGLE_BIT;
|
|
||||||
default:
|
|
||||||
return MEMORY_ARRAY_ECC_MULTI_BIT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Update SMBIOS type 0 ec version.
|
* Update SMBIOS type 0 ec version.
|
||||||
* In deltalake, BMC version is used to represent ec version.
|
* In deltalake, BMC version is used to represent ec version.
|
||||||
|
@@ -37,6 +37,25 @@ static const struct SystemMemoryMapHob *get_system_memory_map(void)
|
|||||||
return *memmap_addr;
|
return *memmap_addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static uint8_t get_error_correction_type(const uint8_t RasModesEnabled)
|
||||||
|
{
|
||||||
|
switch (RasModesEnabled) {
|
||||||
|
case CH_INDEPENDENT:
|
||||||
|
return MEMORY_ARRAY_ECC_SINGLE_BIT;
|
||||||
|
case FULL_MIRROR_1LM:
|
||||||
|
case PARTIAL_MIRROR_1LM:
|
||||||
|
case FULL_MIRROR_2LM:
|
||||||
|
case PARTIAL_MIRROR_2LM:
|
||||||
|
return MEMORY_ARRAY_ECC_MULTI_BIT;
|
||||||
|
case RK_SPARE:
|
||||||
|
return MEMORY_ARRAY_ECC_SINGLE_BIT;
|
||||||
|
case CH_LOCKSTEP:
|
||||||
|
return MEMORY_ARRAY_ECC_SINGLE_BIT;
|
||||||
|
default:
|
||||||
|
return MEMORY_ARRAY_ECC_MULTI_BIT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Save the DIMM information for SMBIOS table 17 */
|
/* Save the DIMM information for SMBIOS table 17 */
|
||||||
void save_dimm_info(void)
|
void save_dimm_info(void)
|
||||||
{
|
{
|
||||||
@@ -63,6 +82,7 @@ void save_dimm_info(void)
|
|||||||
/* According to Dear Customer Letter it's 1.12 TB per processor. */
|
/* According to Dear Customer Letter it's 1.12 TB per processor. */
|
||||||
mem_info->max_capacity_mib = 1.12 * MiB * CONFIG_MAX_SOCKET;
|
mem_info->max_capacity_mib = 1.12 * MiB * CONFIG_MAX_SOCKET;
|
||||||
mem_info->number_of_devices = CONFIG_DIMM_MAX;
|
mem_info->number_of_devices = CONFIG_DIMM_MAX;
|
||||||
|
mem_info->ecc_type = get_error_correction_type(hob->RasModesEnabled);
|
||||||
dimm_max = ARRAY_SIZE(mem_info->dimm);
|
dimm_max = ARRAY_SIZE(mem_info->dimm);
|
||||||
vdd_voltage = get_ddr_voltage(hob->DdrVoltage);
|
vdd_voltage = get_ddr_voltage(hob->DdrVoltage);
|
||||||
/* For now only implement for one socket and hard-coded for DDR4 */
|
/* For now only implement for one socket and hard-coded for DDR4 */
|
||||||
|
Reference in New Issue
Block a user