arch/x86/smbios: Bump to version 3.0

Fill in the new fields introduced with version 3.0 and install the new
entry point structure identified by _SM3_.

Tested on Linux 5.6 using tianocore as payload:
Still able to decode the tables without errors.

Change-Id: Iba7a54e9de0b315f8072e6fd2880582355132a81
Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/43719
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Angel Pons <th3fanbus@gmail.com>
This commit is contained in:
Patrick Rudolph 2020-07-22 16:00:53 +02:00 committed by Patrick Georgi
parent 73030c8c54
commit 7a83582e77
2 changed files with 43 additions and 3 deletions

View File

@ -724,12 +724,17 @@ static int smbios_write_type4(unsigned long *current, int handle)
if (leaf_b_threads == 0) {
leaf_b_threads = 1;
}
t->core_count = leaf_b_cores / leaf_b_threads;
t->core_count2 = leaf_b_cores / leaf_b_threads;
t->core_count = t->core_count2 > 0xff ? 0xff : t->core_count2;
t->thread_count2 = leaf_b_threads;
} else {
t->core_count = (res.ebx >> 16) & 0xff;
t->core_count2 = t->core_count;
t->thread_count2 = t->core_count2;
}
/* Assume we enable all the cores always, capped only by MAX_CPUS */
t->core_enabled = MIN(t->core_count, CONFIG_MAX_CPUS);
t->core_enabled2 = MIN(t->core_count2, CONFIG_MAX_CPUS);
t->l1_cache_handle = 0xffff;
t->l2_cache_handle = 0xffff;
t->l3_cache_handle = 0xffff;
@ -1313,6 +1318,7 @@ static int smbios_walk_device_tree(struct device *tree, int *handle,
unsigned long smbios_write_tables(unsigned long current)
{
struct smbios_entry *se;
struct smbios_entry30 *se3;
unsigned long tables;
int len = 0;
int max_struct_size = 0;
@ -1325,6 +1331,10 @@ unsigned long smbios_write_tables(unsigned long current)
current += sizeof(struct smbios_entry);
current = ALIGN_UP(current, 16);
se3 = (struct smbios_entry30 *)current;
current += sizeof(struct smbios_entry30);
current = ALIGN_UP(current, 16);
tables = current;
update_max(len, max_struct_size, smbios_write_type0(&current,
handle++));
@ -1359,11 +1369,12 @@ unsigned long smbios_write_tables(unsigned long current)
update_max(len, max_struct_size, smbios_write_type127(&current,
handle++));
/* Install SMBIOS 2.1 entry point */
memset(se, 0, sizeof(struct smbios_entry));
memcpy(se->anchor, "_SM_", 4);
se->length = sizeof(struct smbios_entry);
se->major_version = 2;
se->minor_version = 8;
se->major_version = 3;
se->minor_version = 0;
se->max_struct_size = max_struct_size;
se->struct_count = handle;
memcpy(se->intermediate_anchor_string, "_DMI_", 5);
@ -1375,5 +1386,18 @@ unsigned long smbios_write_tables(unsigned long current)
sizeof(struct smbios_entry)
- 0x10);
se->checksum = smbios_checksum((u8 *)se, sizeof(struct smbios_entry));
/* Install SMBIOS 3.0 entry point */
memset(se3, 0, sizeof(struct smbios_entry30));
memcpy(se3->anchor, "_SM3_", 5);
se3->length = sizeof(struct smbios_entry30);
se3->major_version = 3;
se3->minor_version = 0;
se3->struct_table_address = (u64)tables;
se3->struct_table_length = len;
se3->checksum = smbios_checksum((u8 *)se3, sizeof(struct smbios_entry30));
return current;
}

View File

@ -247,6 +247,19 @@ struct smbios_entry {
u8 smbios_bcd_revision;
} __packed;
struct smbios_entry30 {
u8 anchor[5];
u8 checksum;
u8 length;
u8 major_version;
u8 minor_version;
u8 smbios_doc_rev;
u8 entry_point_rev;
u8 reserved;
u32 struct_table_length;
u64 struct_table_address;
} __packed;
struct smbios_type0 {
u8 type;
u8 length;
@ -402,6 +415,9 @@ struct smbios_type4 {
u8 thread_count;
u16 processor_characteristics;
u16 processor_family2;
u16 core_count2;
u16 core_enabled2;
u16 thread_count2;
u8 eos[2];
} __packed;