diff options
-rw-r--r-- | src/arch/x86/smbios.c | 32 | ||||
-rw-r--r-- | src/include/smbios.h | 27 |
2 files changed, 57 insertions, 2 deletions
diff --git a/src/arch/x86/smbios.c b/src/arch/x86/smbios.c index 9df997320b..85851c60cb 100644 --- a/src/arch/x86/smbios.c +++ b/src/arch/x86/smbios.c @@ -381,6 +381,26 @@ void __attribute__((weak)) smbios_mainboard_set_uuid(u8 *uuid) } #endif +const char *__attribute__((weak)) smbios_mainboard_asset_tag(void) +{ + return ""; +} + +u8 __attribute__((weak)) smbios_mainboard_feature_flags(void) +{ + return 0; +} + +const char *__attribute__((weak)) smbios_mainboard_location_in_chassis(void) +{ + return ""; +} + +smbios_board_type __attribute__((weak)) smbios_mainboard_board_type(void) +{ + return SMBIOS_BOARD_TYPE_UNKNOWN; +} + const char *__attribute__((weak)) smbios_mainboard_sku(void) { return ""; @@ -419,7 +439,8 @@ static int smbios_write_type1(unsigned long *current, int handle) return len; } -static int smbios_write_type2(unsigned long *current, int handle) +static int smbios_write_type2(unsigned long *current, int handle, + const int chassis_handle) { struct smbios_type2 *t = (struct smbios_type2 *)*current; int len = sizeof(struct smbios_type2); @@ -435,6 +456,12 @@ static int smbios_write_type2(unsigned long *current, int handle) t->serial_number = smbios_add_string(t->eos, smbios_mainboard_serial_number()); t->version = smbios_add_string(t->eos, smbios_mainboard_version()); + t->asset_tag = smbios_add_string(t->eos, smbios_mainboard_asset_tag()); + t->feature_flags = smbios_mainboard_feature_flags(); + t->location_in_chassis = smbios_add_string(t->eos, + smbios_mainboard_location_in_chassis()); + t->board_type = smbios_mainboard_board_type(); + t->chassis_handle = chassis_handle; len = t->length + smbios_string_table_len(t->eos); *current += len; return len; @@ -642,7 +669,8 @@ unsigned long smbios_write_tables(unsigned long current) update_max(len, max_struct_size, smbios_write_type1(¤t, handle++)); update_max(len, max_struct_size, smbios_write_type2(¤t, - handle++)); + handle, handle + 1)); /* The chassis handle is the next one */ + handle++; update_max(len, max_struct_size, smbios_write_type3(¤t, handle++)); update_max(len, max_struct_size, smbios_write_type4(¤t, diff --git a/src/include/smbios.h b/src/include/smbios.h index fddcce8203..8fe507ea53 100644 --- a/src/include/smbios.h +++ b/src/include/smbios.h @@ -37,6 +37,10 @@ const char *smbios_mainboard_serial_number(void); const char *smbios_mainboard_version(void); void smbios_mainboard_set_uuid(u8 *uuid); const char *smbios_mainboard_bios_version(void); +const char *smbios_mainboard_asset_tag(void); +u8 smbios_mainboard_feature_flags(void); +const char *smbios_mainboard_location_in_chassis(void); + const char *smbios_mainboard_sku(void); u8 smbios_mainboard_enclosure_type(void); #ifdef CONFIG_MAINBOARD_FAMILY @@ -267,6 +271,22 @@ struct smbios_type1 { u8 eos[2]; } __packed; +typedef enum { + SMBIOS_BOARD_TYPE_UNKNOWN = 0x01, + SMBIOS_BOARD_TYPE_OTHER = 0x02, + SMBIOS_BOARD_TYPE_SERVER_BLADE = 0x03, + SMBIOS_BOARD_TYPE_CONNECTIVITY_SWITCH = 0x04, + SMBIOS_BOARD_TYPE_SYSTEM_MANAGEMENT_MODULE = 0x05, + SMBIOS_BOARD_TYPE_PROCESSOR_MODULE = 0x06, + SMBIOS_BOARD_TYPE_IO_MODULE = 0x07, + SMBIOS_BOARD_TYPE_MEMORY_MODULE = 0x08, + SMBIOS_BOARD_TYPE_DAUGHTER_BOARD = 0x09, + SMBIOS_BOARD_TYPE_MOTHERBOARD = 0x0a, + SMBIOS_BOARD_TYPE_PROCESSOR_MEMORY_MODULE = 0x0b, + SMBIOS_BOARD_TYPE_PROCESSOR_IO_MODULE = 0x0c, + SMBIOS_BOARD_TYPE_INTERCONNECT_BOARD = 0x0d, +} smbios_board_type; + struct smbios_type2 { u8 type; u8 length; @@ -275,6 +295,11 @@ struct smbios_type2 { u8 product_name; u8 version; u8 serial_number; + u8 asset_tag; + u8 feature_flags; + u8 location_in_chassis; + u16 chassis_handle; + u8 board_type; u8 eos[2]; } __packed; @@ -510,4 +535,6 @@ struct smbios_type127 { void smbios_fill_dimm_manufacturer_from_id(uint16_t mod_id, struct smbios_type17 *t); +smbios_board_type smbios_mainboard_board_type(void); + #endif |