diff options
author | Stefan Tauner <stefan.tauner@alumni.tuwien.ac.at> | 2011-07-26 00:54:42 +0000 |
---|---|---|
committer | Stefan Tauner <stefan.tauner@alumni.tuwien.ac.at> | 2011-07-26 00:54:42 +0000 |
commit | fe04b399d684028e68efcf5a4d29d8be53edddc2 (patch) | |
tree | cb91d6d51031de7b195f4586549603e3a0e82080 /dmi.c | |
parent | b9ec59b62d47910d39fb9ddb095b341fb5bdea86 (diff) | |
download | flashrom-fe04b399d684028e68efcf5a4d29d8be53edddc2.zip flashrom-fe04b399d684028e68efcf5a4d29d8be53edddc2.tar.gz |
Be more refined regarding DMI chassis types
We had broken laptops in the past that were not detected as such because
their DMI chassis-type was either undefined/out-of-spec, or set to
'other' or 'unknown'.
this patch tries to mitigate this problem as follows:
- if the DMI chassis-type clearly identifies the system as
laptop/notebook/mobile platform then nothing changes: the user gets
the laptop warning without a hint to the force switch.
- if the DMI chassis-type is not specific enough, we warn the user
similarly, but tell them the switch.
to reduce the number of false positives i have added a few new
chassis types that we have encountered in the last months to the list.
Corresponding to flashrom svn r1390.
Signed-off-by: Stefan Tauner <stefan.tauner@alumni.tuwien.ac.at>
Acked-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>
Diffstat (limited to 'dmi.c')
-rw-r--r-- | dmi.c | 40 |
1 files changed, 29 insertions, 11 deletions
@@ -54,7 +54,12 @@ static const char *dmidecode_names[] = { "baseboard-version", }; -/* A full list of chassis types can be found in the System Management BIOS +/* This list is used to identify supposed laptops. The is_laptop field has the + * following meaning: + * - 0: in all likelihood not a laptop + * - 1: in all likelihood a laptop + * - 2: chassis-type is not specific enough + * A full list of chassis types can be found in the System Management BIOS * (SMBIOS) Reference Specification 2.7.0 section 7.4.1 "Chassis Types" at * http://www.dmtf.org/sites/default/files/standards/documents/DSP0134_2.7.0.pdf * The types below are the most common ones. @@ -64,14 +69,18 @@ static const struct { unsigned char is_laptop; const char *name; } dmi_chassis_types[] = { - {0x01, 0, "Other"}, - {0x02, 0, "Unknown"}, + {0x01, 2, "Other"}, + {0x02, 2, "Unknown"}, {0x03, 0, "Desktop",}, + {0x06, 0, "Mini Tower"}, + {0x07, 0, "Tower"}, {0x08, 1, "Portable"}, {0x09, 1, "Laptop"}, {0x0a, 1, "Notebook"}, {0x0b, 1, "Hand Held"}, {0x0e, 1, "Sub Notebook"}, + {0x11, 0, "Main Server Chassis"}, + {0x17, 0, "Rack Mount Chassis"}, }; #define DMI_COMMAND_LEN_MAX 260 @@ -152,16 +161,25 @@ void dmi_init(void) } chassis_type = get_dmi_string("chassis-type"); - if (chassis_type) { - for (i = 0; i < ARRAY_SIZE(dmi_chassis_types); i++) { - if (!strcasecmp(chassis_type, - dmi_chassis_types[i].name) && - dmi_chassis_types[i].is_laptop) { - msg_pdbg("Laptop detected via DMI\n"); - is_laptop = 1; - } + if (chassis_type == NULL) + return; + + is_laptop = 2; + for (i = 0; i < ARRAY_SIZE(dmi_chassis_types); i++) { + if (strcasecmp(chassis_type, dmi_chassis_types[i].name) == 0) { + is_laptop = dmi_chassis_types[i].is_laptop; + break; } } + + switch (is_laptop) { + case 1: + msg_pdbg("Laptop detected via DMI.\n"); + break; + case 2: + msg_pdbg("DMI chassis-type is not specific enough.\n"); + break; + } free(chassis_type); } |