1
0
mirror of https://review.coreboot.org/flashrom.git synced 2025-04-27 15:12:36 +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", "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 * (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 * http://www.dmtf.org/sites/default/files/standards/documents/DSP0134_2.7.0.pdf
* The types below are the most common ones. * The types below are the most common ones.
@ -64,14 +69,18 @@ static const struct {
unsigned char is_laptop; unsigned char is_laptop;
const char *name; const char *name;
} dmi_chassis_types[] = { } dmi_chassis_types[] = {
{0x01, 0, "Other"}, {0x01, 2, "Other"},
{0x02, 0, "Unknown"}, {0x02, 2, "Unknown"},
{0x03, 0, "Desktop",}, {0x03, 0, "Desktop",},
{0x06, 0, "Mini Tower"},
{0x07, 0, "Tower"},
{0x08, 1, "Portable"}, {0x08, 1, "Portable"},
{0x09, 1, "Laptop"}, {0x09, 1, "Laptop"},
{0x0a, 1, "Notebook"}, {0x0a, 1, "Notebook"},
{0x0b, 1, "Hand Held"}, {0x0b, 1, "Hand Held"},
{0x0e, 1, "Sub Notebook"}, {0x0e, 1, "Sub Notebook"},
{0x11, 0, "Main Server Chassis"},
{0x17, 0, "Rack Mount Chassis"},
}; };
#define DMI_COMMAND_LEN_MAX 260 #define DMI_COMMAND_LEN_MAX 260
@ -152,16 +161,25 @@ void dmi_init(void)
} }
chassis_type = get_dmi_string("chassis-type"); chassis_type = get_dmi_string("chassis-type");
if (chassis_type) { if (chassis_type == NULL)
for (i = 0; i < ARRAY_SIZE(dmi_chassis_types); i++) { return;
if (!strcasecmp(chassis_type,
dmi_chassis_types[i].name) && is_laptop = 2;
dmi_chassis_types[i].is_laptop) { for (i = 0; i < ARRAY_SIZE(dmi_chassis_types); i++) {
msg_pdbg("Laptop detected via DMI\n"); if (strcasecmp(chassis_type, dmi_chassis_types[i].name) == 0) {
is_laptop = 1; 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); free(chassis_type);
} }

View File

@ -230,11 +230,19 @@ int internal_init(void)
/* Warn if a non-whitelisted laptop is detected. */ /* Warn if a non-whitelisted laptop is detected. */
if (is_laptop && !laptop_ok) { if (is_laptop && !laptop_ok) {
msg_perr("========================================================================\n" msg_perr("========================================================================\n");
"WARNING! You seem to be running flashrom on an unsupported laptop.\n" if (is_laptop == 1) {
"Laptops, notebooks and netbooks are difficult to support and we recommend\n" msg_perr("WARNING! You seem to be running flashrom on an unsupported laptop.\n");
"to use the vendor flashing utility. The embedded controller (EC) in these\n" } else {
"machines often interacts badly with flashing.\n" msg_perr("WARNING! You may be running flashrom on an unsupported laptop. We could\n"
"not detect this for sure because your vendor has not setup the SMBIOS\n"
"tables correctly. You can enforce execution by adding\n"
"'-p internal:laptop=force_I_want_a_brick' to the command line, but\n"
"please read the following warning if you are not sure.\n\n");
}
msg_perr("Laptops, notebooks and netbooks are difficult to support and we\n"
"recommend to use the vendor flashing utility. The embedded controller\n"
"(EC) in these machines often interacts badly with flashing.\n"
"See http://www.flashrom.org/Laptops for details.\n\n" "See http://www.flashrom.org/Laptops for details.\n\n"
"If flash is shared with the EC, erase is guaranteed to brick your laptop\n" "If flash is shared with the EC, erase is guaranteed to brick your laptop\n"
"and write may brick your laptop.\n" "and write may brick your laptop.\n"
@ -242,6 +250,7 @@ int internal_init(void)
"failure and sudden poweroff.\n" "failure and sudden poweroff.\n"
"You have been warned.\n" "You have been warned.\n"
"========================================================================\n"); "========================================================================\n");
if (force_laptop) { if (force_laptop) {
msg_perr("Proceeding anyway because user specified " msg_perr("Proceeding anyway because user specified "
"laptop=force_I_want_a_brick\n"); "laptop=force_I_want_a_brick\n");