diff options
-rw-r--r-- | src/include/smbios.h | 2 | ||||
-rw-r--r-- | src/lib/Kconfig | 4 | ||||
-rw-r--r-- | src/lib/smbios.c | 16 | ||||
-rw-r--r-- | src/soc/intel/xeon_sp/util.c | 5 |
4 files changed, 24 insertions, 3 deletions
diff --git a/src/include/smbios.h b/src/include/smbios.h index 8ef37d8c84..b5b9e7a83f 100644 --- a/src/include/smbios.h +++ b/src/include/smbios.h @@ -74,6 +74,8 @@ void smbios_cpu_get_core_counts(u16 *core_count, u16 *thread_count); unsigned int smbios_cpu_get_max_speed_mhz(void); unsigned int smbios_cpu_get_current_speed_mhz(void); unsigned int smbios_cpu_get_voltage(void); +unsigned int smbios_get_max_sockets(void); +unsigned int smbios_soc_get_max_sockets(void); const char *smbios_mainboard_manufacturer(void); const char *smbios_mainboard_product_name(void); diff --git a/src/lib/Kconfig b/src/lib/Kconfig index e896704e39..2c1a93cff1 100644 --- a/src/lib/Kconfig +++ b/src/lib/Kconfig @@ -49,6 +49,10 @@ config DIMM_MAX It is multiplication of number of channel to number of DIMMs per channel +config MAX_SOCKET + int + default 1 + config DIMM_SPD_SIZE int default 256 diff --git a/src/lib/smbios.c b/src/lib/smbios.c index ca71e3b053..58caf8c6d8 100644 --- a/src/lib/smbios.c +++ b/src/lib/smbios.c @@ -443,6 +443,14 @@ unsigned int __weak smbios_cpu_get_voltage(void) return 0; /* Unknown */ } +unsigned int smbios_get_max_sockets(void) +{ + if (CONFIG_MAX_SOCKET == 1) + return 1; + else + return smbios_soc_get_max_sockets(); +} + static int smbios_write_type1(unsigned long *current, int handle) { struct smbios_type1 *t = smbios_carve_table(*current, SMBIOS_SYSTEM_INFORMATION, @@ -1233,9 +1241,11 @@ unsigned long smbios_write_tables(unsigned long current) handle++; update_max(len, max_struct_size, smbios_write_type3(¤t, handle++)); - struct smbios_type4 *type4 = (struct smbios_type4 *)current; - update_max(len, max_struct_size, smbios_write_type4(¤t, handle++)); - len += smbios_write_type7_cache_parameters(¤t, &handle, &max_struct_size, type4); + for (unsigned int s = 0; s < smbios_get_max_sockets(); s++) { + struct smbios_type4 *type4 = (struct smbios_type4 *)current; + update_max(len, max_struct_size, smbios_write_type4(¤t, handle++)); + len += smbios_write_type7_cache_parameters(¤t, &handle, &max_struct_size, type4); + } update_max(len, max_struct_size, smbios_write_type11(¤t, &handle)); if (CONFIG(ELOG)) update_max(len, max_struct_size, diff --git a/src/soc/intel/xeon_sp/util.c b/src/soc/intel/xeon_sp/util.c index 4dbe7a4cd7..bf07ee74f3 100644 --- a/src/soc/intel/xeon_sp/util.c +++ b/src/soc/intel/xeon_sp/util.c @@ -90,6 +90,11 @@ unsigned int soc_get_num_cpus(void) return get_iio_uds()->SystemStatus.numCpus; } +unsigned int smbios_soc_get_max_sockets(void) +{ + return soc_get_num_cpus(); +} + union p2sb_bdf soc_get_hpet_bdf(void) { if (CONFIG(SOC_INTEL_COMMON_IBL_BASE)) { |