1
0
mirror of https://review.coreboot.org/flashrom.git synced 2025-07-02 14:33:18 +02:00

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>
This commit is contained in:
Stefan Tauner
2011-07-26 00:54:42 +00:00
parent 46fa068fa2
commit a34d719037
2 changed files with 43 additions and 16 deletions

40
dmi.c
View File

@ -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);
}