Patrick Rudolph has uploaded this change for review. ( https://review.coreboot.org/c/coreboot/+/43672 )
Change subject: smbios: Add Type19 ......................................................................
smbios: Add Type19
Implement type 19 by accumulating the DRAM dimm size found in cbmem's CBMEM_ID_MEMINFO structure. This seems common on x86 where the address space always starts at 0.
At least EDK2 uses this table in the UI and shows 0 MB DRAM if not present.
Change-Id: Idee8b8cd0b155e14d62d4c12893ff01878ef3f1c Signed-off-by: Patrick Rudolph patrick.rudolph@9elements.com --- M src/arch/x86/smbios.c M src/include/smbios.h 2 files changed, 52 insertions(+), 0 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/72/43672/1
diff --git a/src/arch/x86/smbios.c b/src/arch/x86/smbios.c index 3c5799b..aa73aa7 100644 --- a/src/arch/x86/smbios.c +++ b/src/arch/x86/smbios.c @@ -1079,6 +1079,43 @@ return totallen; }
+static int smbios_write_type19(unsigned long *current, int *handle) +{ + struct smbios_type19 *t = (struct smbios_type19 *)*current; + int len = sizeof(struct smbios_type19); + int i; + + struct memory_info *meminfo; + meminfo = cbmem_find(CBMEM_ID_MEMINFO); + if (meminfo == NULL) + return 0; /* can't find mem info in cbmem */ + + memset(t, 0, sizeof(struct smbios_type19)); + + t->type = SMBIOS_MEMORY_ARRAY_MAPPED_ADDRESS; + t->length = len - 2; + t->handle = *handle; + + /* + * FIXME: This is SoC specific, but SMBIOS tables are only exported on x86 where + * it's always 0. + */ + + t->extended_starting_address = 0; + for (i = 0; i < meminfo->dimm_cnt && i < ARRAY_SIZE(meminfo->dimm); i++) { + if (meminfo->dimm[i].dimm_size > 0) { + t->extended_ending_address += meminfo->dimm[i].dimm_size * MiB; + t->partition_width++; + } + } + + + len = t->length + smbios_string_table_len(t->eos); + *current += len; + *handle += 1; + return len; +} + static int smbios_write_type32(unsigned long *current, int handle) { struct smbios_type32 *t = (struct smbios_type32 *)*current; @@ -1296,6 +1333,8 @@ elog_smbios_write_type15(¤t,handle++)); update_max(len, max_struct_size, smbios_write_type17(¤t, &handle)); + update_max(len, max_struct_size, smbios_write_type19(¤t, + &handle)); update_max(len, max_struct_size, smbios_write_type32(¤t, handle++));
diff --git a/src/include/smbios.h b/src/include/smbios.h index ed09d64..8cdd58a 100644 --- a/src/include/smbios.h +++ b/src/include/smbios.h @@ -828,6 +828,19 @@ u8 eos[2]; } __packed;
+struct smbios_type19 { + u8 type; + u8 length; + u16 handle; + u32 starting_address; + u32 ending_address; + u16 memory_array_handle; + u8 partition_width; + u64 extended_starting_address; + u64 extended_ending_address; + u8 eos[2]; +} __packed; + struct smbios_type32 { u8 type; u8 length;