diff options
author | Patrick Rudolph <patrick.rudolph@9elements.com> | 2019-03-30 17:51:06 +0100 |
---|---|---|
committer | Patrick Georgi <pgeorgi@google.com> | 2019-04-09 17:22:41 +0000 |
commit | 15589b4e56081b5d15e8c8f3c0e5185d62573299 (patch) | |
tree | 9da3cb3f86d3d97660ad36c2ca97a9d0bc99d23b | |
parent | fc5b80943b849ae3f949c8647aca5bb91872e4a7 (diff) |
arch/x86/smbios: Reference type 7
Fill in the handle to cache entries of type 7 in the type 4 structure.
Tested on Intel Sandy Bridge (Lenovo T520).
All 3 caches are referenced.
Change-Id: Idf876b0c21c65f72a945d26c5898074b140763f8
Signed-off-by: Patrick Rudolph <patrick.rudolph@9elements.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/32132
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Richard Spiegel <richard.spiegel@silverbackltd.com>
-rw-r--r-- | src/arch/x86/smbios.c | 30 |
1 files changed, 25 insertions, 5 deletions
diff --git a/src/arch/x86/smbios.c b/src/arch/x86/smbios.c index 0f9b4588af..44ff578e35 100644 --- a/src/arch/x86/smbios.c +++ b/src/arch/x86/smbios.c @@ -730,10 +730,12 @@ smbios_cache_associativity(const u8 num) * @param current Pointer to memory address to write the tables to * @param handle Pointer to handle for the tables * @param max_struct_size Pointer to maximum struct size + * @param type4 Pointer to SMBIOS type 4 structure */ static int smbios_write_type7_cache_parameters(unsigned long *current, int *handle, - int *max_struct_size) + int *max_struct_size, + struct smbios_type4 *type4) { struct cpuid_result res; unsigned int cnt = 0; @@ -802,9 +804,25 @@ static int smbios_write_type7_cache_parameters(unsigned long *current, else associativity = smbios_cache_associativity(assoc); - update_max(len, *max_struct_size, smbios_write_type7(current, - *handle++, level, SMBIOS_CACHE_SRAM_TYPE_UNKNOWN, - associativity, type, cache_size, cache_size)); + const int h = (*handle)++; + + update_max(len, *max_struct_size, smbios_write_type7(current, h, + level, SMBIOS_CACHE_SRAM_TYPE_UNKNOWN, associativity, + type, cache_size, cache_size)); + + if (type4) { + switch (level) { + case 1: + type4->l1_cache_handle = h; + break; + case 2: + type4->l2_cache_handle = h; + break; + case 3: + type4->l3_cache_handle = h; + break; + } + } }; return len; @@ -981,10 +999,12 @@ 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); + &max_struct_size, type4); update_max(len, max_struct_size, smbios_write_type11(¤t, &handle)); if (CONFIG(ELOG)) |