From 1ee8ddc484bf87b99d4ba80f6d4fb99ee043780e Mon Sep 17 00:00:00 2001 From: Tim Chu Date: Fri, 22 Jan 2021 01:10:45 -0800 Subject: arch/x86/smbios: Update SMBIOS type 16 Extended Maximum Capacity Update Extended Maximum Capacity field in SMBIOS type 16 so that maximum dimm size can be over 2TB. Tested=Execute "dmidecode -t 16" to check maximum capacity is over 2TB. Signed-off-by: Tim Chu Change-Id: I61901c815f9d0daae102e5077a116c0de87240ef Reviewed-on: https://review.coreboot.org/c/coreboot/+/49828 Tested-by: build bot (Jenkins) Reviewed-by: Patrick Rudolph --- src/arch/x86/smbios.c | 9 ++++++++- src/include/smbios.h | 2 ++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/arch/x86/smbios.c b/src/arch/x86/smbios.c index 87714c0abe..b3e1c138f8 100644 --- a/src/arch/x86/smbios.c +++ b/src/arch/x86/smbios.c @@ -1028,6 +1028,7 @@ static int smbios_write_type16(unsigned long *current, int *handle) int len; int i; + uint64_t max_capacity; struct memory_info *meminfo; meminfo = cbmem_find(CBMEM_ID_MEMINFO); @@ -1057,7 +1058,13 @@ static int smbios_write_type16(unsigned long *current, int *handle) /* no error information handle available */ t->memory_error_information_handle = 0xFFFE; - t->maximum_capacity = meminfo->max_capacity_mib * (MiB / KiB); + max_capacity = meminfo->max_capacity_mib; + if (max_capacity * (MiB / KiB) < SMBIOS_USE_EXTENDED_MAX_CAPACITY) + t->maximum_capacity = max_capacity * (MiB / KiB); + else { + t->maximum_capacity = SMBIOS_USE_EXTENDED_MAX_CAPACITY; + t->extended_maximum_capacity = max_capacity * MiB; + } t->number_of_memory_devices = meminfo->number_of_devices; len += smbios_string_table_len(t->eos); diff --git a/src/include/smbios.h b/src/include/smbios.h index d8ac4caff2..2f63aac6ab 100644 --- a/src/include/smbios.h +++ b/src/include/smbios.h @@ -829,6 +829,8 @@ enum { SMBIOS_EVENTLOG_STATUS_FULL = 2, /* Bit 1 */ }; +#define SMBIOS_USE_EXTENDED_MAX_CAPACITY (1 << 31) + struct smbios_type16 { u8 type; u8 length; -- cgit v1.2.3