aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/arch/x86/smbios.c32
-rw-r--r--src/include/smbios.h27
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(&current,
handle++));
update_max(len, max_struct_size, smbios_write_type2(&current,
- handle++));
+ handle, handle + 1)); /* The chassis handle is the next one */
+ handle++;
update_max(len, max_struct_size, smbios_write_type3(&current,
handle++));
update_max(len, max_struct_size, smbios_write_type4(&current,
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