[PATCH][RFC] dmi: dmicheck: remove chassis check with acpi pm_profile

Alex Hung alex.hung at canonical.com
Tue Jun 14 04:17:20 UTC 2016


According to SMBIOS Spec 3.0, Type 3 can include chassis for
peripheral devices such as docking stations.  As a result,
checking with facp may not be appropriate

Signed-off-by: Alex Hung <alex.hung at canonical.com>
---
 src/dmi/dmicheck/dmicheck.c | 140 +++++++++++---------------------------------
 1 file changed, 33 insertions(+), 107 deletions(-)

diff --git a/src/dmi/dmicheck/dmicheck.c b/src/dmi/dmicheck/dmicheck.c
index bd0485a..65b50b0 100644
--- a/src/dmi/dmicheck/dmicheck.c
+++ b/src/dmi/dmicheck/dmicheck.c
@@ -78,7 +78,6 @@ typedef struct {
 typedef struct {
 	const char *name;
 	uint8_t   original;
-	uint8_t   mapped;
 } fwts_chassis_type_map;
 
 typedef struct {
@@ -212,51 +211,39 @@ static const char *uuid_patterns[] = {
 };
 
 static const fwts_chassis_type_map fwts_dmi_chassis_type[] = {
-	{ "Invalid",		FWTS_SMBIOS_CHASSIS_INVALID,			CHASSIS_OTHER },
-	{ "Other",		FWTS_SMBIOS_CHASSIS_OTHER,			CHASSIS_OTHER },
-	{ "Unknown",		FWTS_SMBIOS_CHASSIS_UNKNOWN,			CHASSIS_OTHER },
-	{ "Desktop",		FWTS_SMBIOS_CHASSIS_DESKTOP,			CHASSIS_DESKTOP },
-	{ "Low Profile Desktop",FWTS_SMBIOS_CHASSIS_LOW_PROFILE_DESKTOP,	CHASSIS_DESKTOP },
-	{ "Pizza Box",		FWTS_SMBIOS_CHASSIS_PIZZA_BOX,			CHASSIS_DESKTOP },
-	{ "Mini Tower",		FWTS_SMBIOS_CHASSIS_MINI_TOWER,			CHASSIS_DESKTOP },
-	{ "Chassis Tower",	FWTS_SMBIOS_CHASSIS_TOWER,			CHASSIS_DESKTOP },
-	{ "Portable",		FWTS_SMBIOS_CHASSIS_PORTABLE,			CHASSIS_MOBILE },
-	{ "Laptop",		FWTS_SMBIOS_CHASSIS_LAPTOP,			CHASSIS_MOBILE },
-	{ "Notebook",		FWTS_SMBIOS_CHASSIS_NOTEBOOK,			CHASSIS_MOBILE },
-	{ "Handheld",		FWTS_SMBIOS_CHASSIS_HANDHELD,			CHASSIS_MOBILE },
-	{ "Docking Station",	FWTS_SMBIOS_CHASSIS_DOCKING_STATION,		CHASSIS_DESKTOP },
-	{ "All In One",		FWTS_SMBIOS_CHASSIS_ALL_IN_ONE,			CHASSIS_DESKTOP },
-	{ "Sub Notebook",	FWTS_SMBIOS_CHASSIS_SUB_NOTEBOOK,		CHASSIS_MOBILE },
-	{ "Space Saving",	FWTS_SMBIOS_CHASSIS_SPACE_SAVING,		CHASSIS_DESKTOP },
-	{ "Lunch Box",		FWTS_SMBIOS_CHASSIS_LUNCH_BOX,			CHASSIS_DESKTOP | CHASSIS_MOBILE},
-	{ "Server Chassis",	FWTS_SMBIOS_CHASSIS_MAIN_SERVER_CHASSIS,	CHASSIS_SERVER },
-	{ "Expansion Chassis",	FWTS_SMBIOS_CHASSIS_EXPANISON_CHASSIS,		CHASSIS_OTHER },
-	{ "Sub Chassis",	FWTS_SMBIOS_CHASSIS_SUB_CHASSIS,		CHASSIS_OTHER },
-	{ "Bus Expansion Chassis", FWTS_SMBIOS_CHASSIS_BUS_EXPANSION_CHASSIS,	CHASSIS_OTHER },
-	{ "Peripheral Chassis",	FWTS_SMBIOS_CHASSIS_PERIPHERAL_CHASSIS,		CHASSIS_OTHER },
-	{ "Raid Chassis",	FWTS_SMBIOS_CHASSIS_RAID_CHASSIS,		CHASSIS_OTHER },
-	{ "Rack Mount Chassis",	FWTS_SMBIOS_CHASSIS_RACK_MOUNT_CHASSIS,		CHASSIS_OTHER },
-	{ "Sealed Case PC",	FWTS_SMBIOS_CHASSIS_SEALED_CASE_PC,		CHASSIS_DESKTOP },
-	{ "Multi System Chassis",FWTS_SMBIOS_CHASSIS_MULTI_SYSTEM_CHASSIS,	CHASSIS_OTHER },
-	{ "Compact PCI",	FWTS_SMBIOS_CHASSIS_COMPACT_PCI,		CHASSIS_OTHER },
-	{ "Advanced TCA",	FWTS_SMBIOS_CHASSIS_ADVANCED_TCA,		CHASSIS_OTHER },
-	{ "Blade",		FWTS_SMBIOS_CHASSIS_BLADE,			CHASSIS_SERVER },
-	{ "Enclosure",		FWTS_SMBIOS_CHASSIS_BLADE_ENCLOSURE,		CHASSIS_SERVER },
-	{ "Tablet",		FWTS_SMBIOS_CHASSIS_TABLET,			CHASSIS_MOBILE },
-	{ "Convertible",	FWTS_SMBIOS_CHASSIS_CONVERTIBLE,		CHASSIS_MOBILE },
-	{ "Detachable",		FWTS_SMBIOS_CHASSIS_DETACHABLE,			CHASSIS_MOBILE },
-};
-
-static const fwts_chassis_type_map fwts_acpi_pm_profile_type[] = {
-	{ "Unspecified",	FWTS_FACP_UNSPECIFIED,		CHASSIS_OTHER },
-	{ "Desktop",		FWTS_FACP_DESKTOP,		CHASSIS_DESKTOP },
-	{ "Mobile",		FWTS_FACP_MOBILE,		CHASSIS_MOBILE },
-	{ "Workstation",	FWTS_FACP_WORKSTATION,		CHASSIS_WORKSTATION },
-	{ "Enterprise Server",	FWTS_FACP_ENTERPRISE_SERVER,	CHASSIS_SERVER },
-	{ "SOHO Server",	FWTS_FACP_SOHO_SERVER,		CHASSIS_SERVER | CHASSIS_DESKTOP },
-	{ "Appliance PC",	FWTS_FACP_APPLIANCE_PC,		CHASSIS_DESKTOP },
-	{ "Performance Server",	FWTS_FACP_PERFORMANCE_SERVER,	CHASSIS_SERVER },
-	{ "Tablet",		FWTS_FACP_TABLET,		CHASSIS_MOBILE }
+	{ "Invalid",		FWTS_SMBIOS_CHASSIS_INVALID },
+	{ "Other",		FWTS_SMBIOS_CHASSIS_OTHER },
+	{ "Unknown",		FWTS_SMBIOS_CHASSIS_UNKNOWN },
+	{ "Desktop",		FWTS_SMBIOS_CHASSIS_DESKTOP },
+	{ "Low Profile Desktop",FWTS_SMBIOS_CHASSIS_LOW_PROFILE_DESKTOP },
+	{ "Pizza Box",		FWTS_SMBIOS_CHASSIS_PIZZA_BOX },
+	{ "Mini Tower",		FWTS_SMBIOS_CHASSIS_MINI_TOWER },
+	{ "Chassis Tower",	FWTS_SMBIOS_CHASSIS_TOWER },
+	{ "Portable",		FWTS_SMBIOS_CHASSIS_PORTABLE },
+	{ "Laptop",		FWTS_SMBIOS_CHASSIS_LAPTOP },
+	{ "Notebook",		FWTS_SMBIOS_CHASSIS_NOTEBOOK },
+	{ "Handheld",		FWTS_SMBIOS_CHASSIS_HANDHELD },
+	{ "Docking Station",	FWTS_SMBIOS_CHASSIS_DOCKING_STATION },
+	{ "All In One",		FWTS_SMBIOS_CHASSIS_ALL_IN_ONE },
+	{ "Sub Notebook",	FWTS_SMBIOS_CHASSIS_SUB_NOTEBOOK },
+	{ "Space Saving",	FWTS_SMBIOS_CHASSIS_SPACE_SAVING },
+	{ "Lunch Box",		FWTS_SMBIOS_CHASSIS_LUNCH_BOX},
+	{ "Server Chassis",	FWTS_SMBIOS_CHASSIS_MAIN_SERVER_CHASSIS },
+	{ "Expansion Chassis",	FWTS_SMBIOS_CHASSIS_EXPANISON_CHASSIS },
+	{ "Sub Chassis",	FWTS_SMBIOS_CHASSIS_SUB_CHASSIS },
+	{ "Bus Expansion Chassis", FWTS_SMBIOS_CHASSIS_BUS_EXPANSION_CHASSIS },
+	{ "Peripheral Chassis",	FWTS_SMBIOS_CHASSIS_PERIPHERAL_CHASSIS },
+	{ "Raid Chassis",	FWTS_SMBIOS_CHASSIS_RAID_CHASSIS },
+	{ "Rack Mount Chassis",	FWTS_SMBIOS_CHASSIS_RACK_MOUNT_CHASSIS },
+	{ "Sealed Case PC",	FWTS_SMBIOS_CHASSIS_SEALED_CASE_PC },
+	{ "Multi System Chassis",FWTS_SMBIOS_CHASSIS_MULTI_SYSTEM_CHASSIS },
+	{ "Compact PCI",	FWTS_SMBIOS_CHASSIS_COMPACT_PCI },
+	{ "Advanced TCA",	FWTS_SMBIOS_CHASSIS_ADVANCED_TCA },
+	{ "Blade",		FWTS_SMBIOS_CHASSIS_BLADE },
+	{ "Enclosure",		FWTS_SMBIOS_CHASSIS_BLADE_ENCLOSURE },
+	{ "Tablet",		FWTS_SMBIOS_CHASSIS_TABLET },
+	{ "Convertible",	FWTS_SMBIOS_CHASSIS_CONVERTIBLE },
+	{ "Detachable",		FWTS_SMBIOS_CHASSIS_DETACHABLE },
 };
 
 /* Remapping table from buggy version numbers to correct values */
@@ -1002,9 +989,6 @@ static void dmicheck_entry(fwts_framework *fw,
 	uint32_t failed_count = fw->minor_tests.failed;
 	int	battery_count;
 	int	ret;
-	int	both_ok;
-	fwts_acpi_table_info *acpi_table;
-	fwts_acpi_table_fadt *fadt;
 	bool	advice_given = false;
 
 	switch (hdr->type) {
@@ -1058,74 +1042,16 @@ static void dmicheck_entry(fwts_framework *fw,
 				break;
 			dmi_str_check(fw, table, addr, "Manufacturer", hdr, 0x4);
 			dmi_min_max_mask_uint8_check(fw, table, addr, "Chassis Type", hdr, 0x5, 0x1, 0x1d, 0x0, 0x7f);
-			if (fwts_acpi_find_table(fw, "FACP", 0, &acpi_table) != FWTS_OK)
-				break;
-			if (acpi_table == NULL)
-				break;
-			fadt = (fwts_acpi_table_fadt *)acpi_table->data;
 
-			if (fadt->preferred_pm_profile >=
-				(sizeof(fwts_acpi_pm_profile_type) / sizeof(fwts_chassis_type_map))) {
-				fwts_failed(fw, LOG_LEVEL_HIGH, DMI_INVALID_HARDWARE_ENTRY,
-					"Incorrect Chassis Type "
-					"ACPI FACP reports 0x%" PRIx8,
-					fadt->preferred_pm_profile);
-				break;
-			}
 			if (data[5] >=
 				(sizeof(fwts_dmi_chassis_type) / sizeof(fwts_chassis_type_map))) {
 				fwts_failed(fw, LOG_LEVEL_HIGH, DMI_INVALID_HARDWARE_ENTRY,
 					"Incorrect Chassis Type "
 					"SMBIOS Type 3 reports 0x%" PRIx8,
 					data[5]);
-				fwts_advice(fw,
-					"The Chassis Type in the ACPI FADT is out of range "
-					"and hence we cannot identify the preferred power "
-					"management profile for this machine.");
 				break;
 			}
 
-			/*
-			 * LP: #1021674
-			 * We should only check profile and chassis types when we know for sure
-			 * that we can compare valid types togther.  So it is only valid to do
-			 * a check if both aren't CHASSIS_OTHER types
-			 */
-			both_ok = (fwts_acpi_pm_profile_type[fadt->preferred_pm_profile].mapped != CHASSIS_OTHER) &
-				  (fwts_dmi_chassis_type[data[5]].mapped != CHASSIS_OTHER);
-
-			if (both_ok &&
-			     !(fwts_acpi_pm_profile_type[fadt->preferred_pm_profile].mapped &
-			       fwts_dmi_chassis_type[data[5]].mapped)) {
-				fwts_failed(fw, LOG_LEVEL_HIGH, DMI_INVALID_HARDWARE_ENTRY,
-					"Unmatched Chassis Type: "
-					"SMBIOS Type 3 reports 0x%" PRIx8 " '%s' "
-					"ACPI FACP reports 0x%" PRIx8 " '%s'",
-					data[5],
-					fwts_dmi_chassis_type[data[5]].name,
-					fadt->preferred_pm_profile,
-					fwts_acpi_pm_profile_type[fadt->preferred_pm_profile].name);
-				/*
-				 * Make it a bit more wordy to explain the ramifications
-				 */
-				fwts_advice(fw,
-					"The SMBIOS System Enclosure/Chassis type is defined as "
-					"0x%" PRIx8 " '%s' where as the ACPI FACP reports the preferred "
-					"power management profile is 0x%" PRIx8 " '%s' so we possibly "
-					"have conflicting definitions of the machine's PM profile "
-					"for the type of machine. "
-					"See Table 16 of section 4.5.1 of the SMBIOS specification "
-					"and Table 5-34 of section 5.2.9 of the ACPI specification "
-					"for more details. "
-					"This kind of mismatch may lead to incorrect power "
-					"management handling for the type of workload expected "
-					"for this hardware.",
-					data[5],
-					fwts_dmi_chassis_type[data[5]].name,
-					fadt->preferred_pm_profile,
-					fwts_acpi_pm_profile_type[fadt->preferred_pm_profile].name);
-				advice_given = true;
-			}
 			dmi_min_max_mask_uint8_check(fw, table, addr, "Chassis Lock", hdr, 0x5, 0x0, 0x1, 0x7, 0x1);
 			dmi_str_check(fw, table, addr, "Version", hdr, 0x6);
 			dmi_str_check(fw, table, addr, "Serial Number", hdr, 0x7);
-- 
2.7.4




More information about the fwts-devel mailing list