[SeaBIOS] [PATCH 3/3] smbios: Add type 41 structure (Onboard Devices Extended Information).
Ivan Mironov
mironov.ivan at gmail.com
Tue Nov 19 17:57:19 CET 2013
Signed-off-by: Ivan Mironov <mironov.ivan at gmail.com>
---
src/fw/smbios.c | 56 +++++++++++++++++++++++++++++++++++++++++++-------------
src/std/smbios.h | 11 +++++++++++
2 files changed, 54 insertions(+), 13 deletions(-)
diff --git a/src/fw/smbios.c b/src/fw/smbios.c
index a9137b8..d4dbc6d 100644
--- a/src/fw/smbios.c
+++ b/src/fw/smbios.c
@@ -17,6 +17,19 @@
struct smbios_entry_point *SMBiosAddr;
+static int
+get_fields_sets_cnt(int type)
+{
+ char name[128];
+ snprintf(name, sizeof(name), "smbios/fields-set-cnt-%d", type);
+ struct romfile_s *file = romfile_find(name);
+ if (!file)
+ return 0;
+ u16 cnt;
+ file->copy(file, &cnt, file->size);
+ return cnt;
+}
+
static void
smbios_entry_point_setup(u16 max_structure_size,
u16 structure_table_length,
@@ -63,19 +76,6 @@ smbios_entry_point_setup(u16 max_structure_size,
}
static int
-get_fields_sets_cnt(int type)
-{
- char name[128];
- snprintf(name, sizeof(name), "smbios/fields-set-cnt-%d", type);
- struct romfile_s *file = romfile_find(name);
- if (!file)
- return 0;
- u16 cnt;
- file->copy(file, &cnt, file->size);
- return cnt;
-}
-
-static int
get_field(int type, int offset, int index, void *dest)
{
char name[128];
@@ -502,6 +502,34 @@ smbios_init_type_32(void *start)
return start+2;
}
+/* Type 41 -- Onboard Devices Extended Information */
+static void *
+smbios_init_type_41(int instance, void *start)
+{
+ struct smbios_type_41 *p = (struct smbios_type_41 *)start;
+ char *end = (char *)start + sizeof(struct smbios_type_41);
+ size_t size;
+ int str_index = 0;
+
+ p->header.type = 41;
+ p->header.length = sizeof(struct smbios_type_41);
+ p->header.handle = 0x3000 + instance;
+
+ load_str_field_with_default(41, reference_designation_str, instance
+ , "No reference designation string specified");
+ set_field_with_default(41, device_type, instance
+ , (1 << 7) | 0x02) /* enabled unknown device */;
+ set_field_with_default(41, device_type_instance, instance, 0); /* invalid */
+ set_field_with_default(41, segment_group_number, instance, 0);
+ set_field_with_default(41, bus_number, instance, 0);
+ set_field_with_default(41, device_function_number, instance, 0);
+
+ *end = 0;
+ end++;
+
+ return end;
+}
+
/* Type 127 -- End of Table */
static void *
smbios_init_type_127(void *start)
@@ -602,6 +630,8 @@ smbios_setup(void)
}
add_struct(32, p);
+ add_structs(41, 1, p);
+
/* Add any remaining provided entries before the end marker */
for (i = 0; i < 256; i++)
get_external(i, &p, &nr_structs, &max_struct_size, end);
diff --git a/src/std/smbios.h b/src/std/smbios.h
index 0513716..02bc1c1 100644
--- a/src/std/smbios.h
+++ b/src/std/smbios.h
@@ -157,6 +157,17 @@ struct smbios_type_32 {
u8 boot_status;
} PACKED;
+/* SMBIOS type 41 - Onboard Devices Extended Information */
+struct smbios_type_41 {
+ struct smbios_structure_header header;
+ u8 reference_designation_str;
+ u8 device_type;
+ u8 device_type_instance;
+ u16 segment_group_number;
+ u8 bus_number;
+ u8 device_function_number;
+} PACKED;
+
/* SMBIOS type 127 -- End-of-table */
struct smbios_type_127 {
struct smbios_structure_header header;
--
1.8.4.1
More information about the SeaBIOS
mailing list