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 <Tim.Chu@quantatw.com>
Change-Id: I61901c815f9d0daae102e5077a116c0de87240ef
Reviewed-on: https://review.coreboot.org/c/coreboot/+/49828
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Patrick Rudolph <siro@das-labor.org>
diff --git a/src/arch/x86/smbios.c b/src/arch/x86/smbios.c
index 87714c0..b3e1c13 100644
--- a/src/arch/x86/smbios.c
+++ b/src/arch/x86/smbios.c
@@ -1028,6 +1028,7 @@
 
 	int len;
 	int i;
+	uint64_t max_capacity;
 
 	struct memory_info *meminfo;
 	meminfo = cbmem_find(CBMEM_ID_MEMINFO);
@@ -1057,7 +1058,13 @@
 
 	/* 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 d8ac4ca..2f63aac 100644
--- a/src/include/smbios.h
+++ b/src/include/smbios.h
@@ -829,6 +829,8 @@
 	SMBIOS_EVENTLOG_STATUS_FULL  = 2, /* Bit 1 */
 };
 
+#define SMBIOS_USE_EXTENDED_MAX_CAPACITY	(1 << 31)
+
 struct smbios_type16 {
 	u8 type;
 	u8 length;