[flashrom] [PATCH] be more refined regarding DMI chassis types

Stefan Tauner stefan.tauner at student.tuwien.ac.at
Tue Jul 26 01:22:01 CEST 2011


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.

Signed-off-by: Stefan Tauner <stefan.tauner at student.tuwien.ac.at>
---
 dmi.c      |   41 ++++++++++++++++++++++++++++++-----------
 internal.c |   19 ++++++++++++++-----
 2 files changed, 44 insertions(+), 16 deletions(-)

diff --git a/dmi.c b/dmi.c
index 836b38b..5cb6238 100644
--- a/dmi.c
+++ b/dmi.c
@@ -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,26 @@ 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;
 		}
 	}
+
+	msg_pdbg("DMI chassis-type is not specific enough.\n");
+	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);
 }
 
diff --git a/internal.c b/internal.c
index c59209e..3938428 100644
--- a/internal.c
+++ b/internal.c
@@ -230,11 +230,19 @@ int internal_init(void)
 
 	/* Warn if a non-whitelisted laptop is detected. */
 	if (is_laptop && !laptop_ok) {
-		msg_perr("========================================================================\n"
-			 "WARNING! You seem to be running flashrom on an unsupported laptop.\n"
-			 "Laptops, notebooks and netbooks are difficult to support and we recommend\n"
-			 "to use the vendor flashing utility. The embedded controller (EC) in these\n"
-			 "machines often interacts badly with flashing.\n"
+		msg_perr("========================================================================\n");
+		if (is_laptop == 1) {
+			msg_perr("WARNING! You seem to be running flashrom on an unsupported laptop.\n");
+		} else {
+			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"
 			 "If flash is shared with the EC, erase is guaranteed to brick your laptop\n"
 			 "and write may brick your laptop.\n"
@@ -242,6 +250,7 @@ int internal_init(void)
 			 "failure and sudden poweroff.\n"
 			 "You have been warned.\n"
 			 "========================================================================\n");
+
 		if (force_laptop) {
 			msg_perr("Proceeding anyway because user specified "
 				 "laptop=force_I_want_a_brick\n");
-- 
1.7.1





More information about the flashrom mailing list