diff options
author | Vladimir Serbinenko <phcoder@gmail.com> | 2014-03-02 19:14:44 +0100 |
---|---|---|
committer | Vladimir Serbinenko <phcoder@gmail.com> | 2014-03-09 21:21:46 +0100 |
commit | 47089f29f0cf368e7c951158af61d5c040c7c8b9 (patch) | |
tree | b0b07c4ba164330bd681028df2ed6015a9f2191b /src | |
parent | 7d48f04bb4ba13e583a6fbc172eed9c8b5455dad (diff) | |
download | coreboot-47089f29f0cf368e7c951158af61d5c040c7c8b9.tar.xz |
smbios: Supply tag type 2 (base board information)
Information really contained in it is mostly the same as in type 1 tag.
However Linux uses type 2 to match hardware. Duplicate the info.
Change-Id: I75e13d764464053ecab4a833fbb83836cedf26e6
Signed-off-by: Vladimir Serbinenko <phcoder@gmail.com>
Reviewed-on: http://review.coreboot.org/5322
Tested-by: build bot (Jenkins)
Reviewed-by: Kyösti Mälkki <kyosti.malkki@gmail.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/arch/x86/boot/smbios.c | 19 | ||||
-rw-r--r-- | src/include/smbios.h | 12 |
2 files changed, 31 insertions, 0 deletions
diff --git a/src/arch/x86/boot/smbios.c b/src/arch/x86/boot/smbios.c index 65bf538cee..0e84acc737 100644 --- a/src/arch/x86/boot/smbios.c +++ b/src/arch/x86/boot/smbios.c @@ -217,6 +217,24 @@ static int smbios_write_type1(unsigned long *current, int handle) return len; } +static int smbios_write_type2(unsigned long *current, int handle) +{ + struct smbios_type2 *t = (struct smbios_type2 *)*current; + int len = sizeof(struct smbios_type2); + + memset(t, 0, sizeof(struct smbios_type2)); + t->type = SMBIOS_BOARD_INFORMATION; + t->handle = handle; + t->length = len - 2; + t->manufacturer = smbios_add_string(t->eos, smbios_mainboard_manufacturer()); + t->product_name = smbios_add_string(t->eos, smbios_mainboard_product_name()); + t->serial_number = smbios_add_string(t->eos, smbios_mainboard_serial_number()); + t->version = smbios_add_string(t->eos, smbios_mainboard_version()); + len = t->length + smbios_string_table_len(t->eos); + *current += len; + return len; +} + static int smbios_write_type3(unsigned long *current, int handle) { struct smbios_type3 *t = (struct smbios_type3 *)*current; @@ -372,6 +390,7 @@ unsigned long smbios_write_tables(unsigned long current) tables = current; len = smbios_write_type0(¤t, handle++); len += smbios_write_type1(¤t, handle++); + len += smbios_write_type2(¤t, handle++); len += smbios_write_type3(¤t, handle++); len += smbios_write_type4(¤t, handle++); #if CONFIG_ELOG diff --git a/src/include/smbios.h b/src/include/smbios.h index 42c5d2da94..0ab074df07 100644 --- a/src/include/smbios.h +++ b/src/include/smbios.h @@ -37,6 +37,7 @@ void smbios_mainboard_set_uuid(u8 *uuid); typedef enum { SMBIOS_BIOS_INFORMATION=0, SMBIOS_SYSTEM_INFORMATION=1, + SMBIOS_BOARD_INFORMATION=2, SMBIOS_SYSTEM_ENCLOSURE=3, SMBIOS_PROCESSOR_INFORMATION=4, SMBIOS_CACHE_INFORMATION=7, @@ -102,6 +103,17 @@ struct smbios_type1 { char eos[2]; } __attribute__((packed)); +struct smbios_type2 { + u8 type; + u8 length; + u16 handle; + u8 manufacturer; + u8 product_name; + u8 version; + u8 serial_number; + char eos[2]; +} __attribute__((packed)); + struct smbios_type3 { u8 type; u8 length; |