From patchwork Wed Feb 1 06:32:04 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alex Hung X-Patchwork-Id: 138905 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from chlorine.canonical.com (chlorine.canonical.com [91.189.94.204]) by ozlabs.org (Postfix) with ESMTP id D43B5B6F98 for ; Wed, 1 Feb 2012 17:32:15 +1100 (EST) Received: from localhost ([127.0.0.1] helo=chlorine.canonical.com) by chlorine.canonical.com with esmtp (Exim 4.71) (envelope-from ) id 1RsTjp-00080V-26 for incoming@patchwork.ozlabs.org; Wed, 01 Feb 2012 06:32:13 +0000 Received: from youngberry.canonical.com ([91.189.89.112]) by chlorine.canonical.com with esmtp (Exim 4.71) (envelope-from ) id 1RsTjn-00080L-89 for fwts-devel@lists.ubuntu.com; Wed, 01 Feb 2012 06:32:11 +0000 Received: from [210.242.151.101] (helo=canonical.com) by youngberry.canonical.com with esmtpsa (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1RsTjm-0001if-9j; Wed, 01 Feb 2012 06:32:11 +0000 From: Alex Hung To: fwts-devel@lists.ubuntu.com Subject: [PATCH] dmi: dmi_decode: check type 3 chassis type with acpi preferred_pm_profile Date: Wed, 1 Feb 2012 14:32:04 +0800 Message-Id: <1328077924-14661-1-git-send-email-alex.hung@canonical.com> X-Mailer: git-send-email 1.7.5.4 X-BeenThere: fwts-devel@lists.ubuntu.com X-Mailman-Version: 2.1.13 Precedence: list List-Id: Firmware Test Suite Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: fwts-devel-bounces@lists.ubuntu.com Errors-To: fwts-devel-bounces@lists.ubuntu.com Signed-off-by: Alex Hung Acked-by: Colin King Acked-by: Keng-Yu Lin --- src/dmi/dmi_decode/dmi_decode.c | 88 +++++++++++++++++++++++++++++++++++++++ src/lib/include/fwts_acpi.h | 10 ++++ src/lib/include/fwts_smbios.h | 31 ++++++++++++++ 3 files changed, 129 insertions(+), 0 deletions(-) diff --git a/src/dmi/dmi_decode/dmi_decode.c b/src/dmi/dmi_decode/dmi_decode.c index c922ee4..ffb75b2 100644 --- a/src/dmi/dmi_decode/dmi_decode.c +++ b/src/dmi/dmi_decode/dmi_decode.c @@ -55,6 +55,12 @@ #define GET_UINT32(x) (uint32_t)(*(const uint32_t *)(x)) #define GET_UINT64(x) (uint64_t)(*(const uint64_t *)(x)) +#define CHASSIS_OTHER 0x00 +#define CHASSIS_DESKTOP 0x01 +#define CHASSIS_WORKSTATION 0x02 +#define CHASSIS_MOBILE 0x04 +#define CHASSIS_SERVER 0x08 + typedef struct { const char *label; const char *field; @@ -66,6 +72,11 @@ typedef struct { uint16_t new; } fwts_dmi_version; +typedef struct { + uint8_t original; + uint8_t mapped; +} fwts_chassis_type_map; + static const fwts_dmi_pattern dmi_patterns[] = { { "DMISerialNumber", "Serial Number", "0123456789" }, { "DMIAssetTag", "Asset Tag", "1234567890" }, @@ -78,6 +89,51 @@ static const char *uuid_patterns[] = { NULL, }; +static const fwts_chassis_type_map fwts_dmi_chassis_type[] = { + { FWTS_SMBIOS_CHASSIS_INVALID, CHASSIS_OTHER }, + { FWTS_SMBIOS_CHASSIS_OTHER, CHASSIS_OTHER }, + { FWTS_SMBIOS_CHASSIS_UNKNOWN, CHASSIS_OTHER }, + { FWTS_SMBIOS_CHASSIS_DESKTOP, CHASSIS_DESKTOP }, + { FWTS_SMBIOS_CHASSIS_LOW_PROFILE_DESKTOP, CHASSIS_DESKTOP }, + { FWTS_SMBIOS_CHASSIS_PIZZA_BOX, CHASSIS_DESKTOP }, + { FWTS_SMBIOS_CHASSIS_MINI_TOWER, CHASSIS_DESKTOP }, + { FWTS_SMBIOS_CHASSIS_TOWER, CHASSIS_DESKTOP }, + { FWTS_SMBIOS_CHASSIS_PORTABLE, CHASSIS_MOBILE }, + { FWTS_SMBIOS_CHASSIS_LAPTOP, CHASSIS_MOBILE }, + { FWTS_SMBIOS_CHASSIS_NOTEBOOK, CHASSIS_MOBILE }, + { FWTS_SMBIOS_CHASSIS_HANDHELD, CHASSIS_MOBILE }, + { FWTS_SMBIOS_CHASSIS_DOCKING_STATION, CHASSIS_DESKTOP }, + { FWTS_SMBIOS_CHASSIS_ALL_IN_ONE, CHASSIS_DESKTOP }, + { FWTS_SMBIOS_CHASSIS_SUB_NOTEBOOK, CHASSIS_MOBILE }, + { FWTS_SMBIOS_CHASSIS_SPACE_SAVING, CHASSIS_DESKTOP }, + { FWTS_SMBIOS_CHASSIS_LUNCH_BOX, CHASSIS_DESKTOP | CHASSIS_MOBILE}, + { FWTS_SMBIOS_CHASSIS_MAIN_SERVER_CHASSIS, CHASSIS_SERVER }, + { FWTS_SMBIOS_CHASSIS_EXPANISON_CHASSIS, CHASSIS_OTHER }, + { FWTS_SMBIOS_CHASSIS_SUB_CHASSIS, CHASSIS_OTHER }, + { FWTS_SMBIOS_CHASSIS_BUS_EXPANSION_CHASSIS, CHASSIS_OTHER }, + { FWTS_SMBIOS_CHASSIS_PERIPHERAL_CHASSIS, CHASSIS_OTHER }, + { FWTS_SMBIOS_CHASSIS_RAID_CHASSIS, CHASSIS_OTHER }, + { FWTS_SMBIOS_CHASSIS_RACK_MOUNT_CHASSIS, CHASSIS_OTHER }, + { FWTS_SMBIOS_CHASSIS_SEALED_CASE_PC, CHASSIS_DESKTOP }, + { FWTS_SMBIOS_CHASSIS_MULTI_SYSTEM_CHASSIS, CHASSIS_OTHER }, + { FWTS_SMBIOS_CHASSIS_COMPACT_PCI, CHASSIS_OTHER }, + { FWTS_SMBIOS_CHASSIS_ADVANCED_TCA, CHASSIS_OTHER }, + { FWTS_SMBIOS_CHASSIS_BLADE, CHASSIS_SERVER }, + { FWTS_SMBIOS_CHASSIS_BLASE_ENCLOSURE, CHASSIS_SERVER } +}; + +static const fwts_chassis_type_map fwts_acpi_pm_profile_type[] = { + { FWTS_FACP_UNSPECIFIED, CHASSIS_OTHER }, + { FWTS_FACP_DESKTOP, CHASSIS_DESKTOP }, + { FWTS_FACP_MOBILE, CHASSIS_MOBILE }, + { FWTS_FACP_WORKSTATION, CHASSIS_WORKSTATION }, + { FWTS_FACP_ENTERPRISE_SERVER, CHASSIS_SERVER }, + { FWTS_FACP_SOHO_SERVER, CHASSIS_SERVER | CHASSIS_DESKTOP }, + { FWTS_FACP_APPLIANCE_PC, CHASSIS_DESKTOP }, + { FWTS_FACP_PERFORMANCE_SERVER, CHASSIS_SERVER }, + { FWTS_FACP_TABLET, CHASSIS_MOBILE } +}; + /* Remapping table from buggy version numbers to correct values */ static const fwts_dmi_version dmi_versions[] = { { 0x021f, 0x0203 }, @@ -244,6 +300,8 @@ static void dmi_decode_entry(fwts_framework *fw, int failed_count = fw->minor_tests.failed; int battery_count; int ret; + fwts_acpi_table_info *acpi_table; + fwts_acpi_table_fadt *fadt; switch (hdr->type) { case 0: /* 7.1 */ @@ -296,6 +354,36 @@ static void dmi_decode_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 %x", + 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 %x ", + data[5]); + break; + } + if (!(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 %x " + "ACPI FACP reports %x", + data[5], + fadt->preferred_pm_profile); + } 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); diff --git a/src/lib/include/fwts_acpi.h b/src/lib/include/fwts_acpi.h index d9f74c4..5b85dc5 100644 --- a/src/lib/include/fwts_acpi.h +++ b/src/lib/include/fwts_acpi.h @@ -22,6 +22,16 @@ #define FWTS_ACPI_TABLES_PATH "/sys/firmware/acpi/tables" +#define FWTS_FACP_UNSPECIFIED (0x00) +#define FWTS_FACP_DESKTOP (0x01) +#define FWTS_FACP_MOBILE (0x02) +#define FWTS_FACP_WORKSTATION (0x03) +#define FWTS_FACP_ENTERPRISE_SERVER (0x04) +#define FWTS_FACP_SOHO_SERVER (0x05) +#define FWTS_FACP_APPLIANCE_PC (0x06) +#define FWTS_FACP_PERFORMANCE_SERVER (0x07) +#define FWTS_FACP_TABLET (0x08) + #define FWTS_FACP_IAPC_BOOT_ARCH_LEGACY_DEVICES (0x0001) #define FWTS_FACP_IAPC_BOOT_ARCH_8042 (0x0002) #define FWTS_FACP_IAPC_BOOT_ARCH_VGA_NOT_PRESENT (0x0004) diff --git a/src/lib/include/fwts_smbios.h b/src/lib/include/fwts_smbios.h index b63fe36..98479b5 100644 --- a/src/lib/include/fwts_smbios.h +++ b/src/lib/include/fwts_smbios.h @@ -27,6 +27,37 @@ #define FWTS_SMBIOS_REGION_END (0x000fffff) #define FWTS_SMBIOS_REGION_SIZE (FWTS_SMBIOS_REGION_END - FWTS_SMBIOS_REGION_START) +#define FWTS_SMBIOS_CHASSIS_INVALID (0x00) +#define FWTS_SMBIOS_CHASSIS_OTHER (0X01) +#define FWTS_SMBIOS_CHASSIS_UNKNOWN (0x02) +#define FWTS_SMBIOS_CHASSIS_DESKTOP (0x03) +#define FWTS_SMBIOS_CHASSIS_LOW_PROFILE_DESKTOP (0x04) +#define FWTS_SMBIOS_CHASSIS_PIZZA_BOX (0x05) +#define FWTS_SMBIOS_CHASSIS_MINI_TOWER (0x06) +#define FWTS_SMBIOS_CHASSIS_TOWER (0x07) +#define FWTS_SMBIOS_CHASSIS_PORTABLE (0x08) +#define FWTS_SMBIOS_CHASSIS_LAPTOP (0x09) +#define FWTS_SMBIOS_CHASSIS_NOTEBOOK (0x0A) +#define FWTS_SMBIOS_CHASSIS_HANDHELD (0x0B) +#define FWTS_SMBIOS_CHASSIS_DOCKING_STATION (0x0C) +#define FWTS_SMBIOS_CHASSIS_ALL_IN_ONE (0x0D) +#define FWTS_SMBIOS_CHASSIS_SUB_NOTEBOOK (0x0E) +#define FWTS_SMBIOS_CHASSIS_SPACE_SAVING (0x0F) +#define FWTS_SMBIOS_CHASSIS_LUNCH_BOX (0x10) +#define FWTS_SMBIOS_CHASSIS_MAIN_SERVER_CHASSIS (0x11) +#define FWTS_SMBIOS_CHASSIS_EXPANISON_CHASSIS (0x12) +#define FWTS_SMBIOS_CHASSIS_SUB_CHASSIS (0x13) +#define FWTS_SMBIOS_CHASSIS_BUS_EXPANSION_CHASSIS (0x14) +#define FWTS_SMBIOS_CHASSIS_PERIPHERAL_CHASSIS (0x15) +#define FWTS_SMBIOS_CHASSIS_RAID_CHASSIS (0x16) +#define FWTS_SMBIOS_CHASSIS_RACK_MOUNT_CHASSIS (0x17) +#define FWTS_SMBIOS_CHASSIS_SEALED_CASE_PC (0x18) +#define FWTS_SMBIOS_CHASSIS_MULTI_SYSTEM_CHASSIS (0x19) +#define FWTS_SMBIOS_CHASSIS_COMPACT_PCI (0x1A) +#define FWTS_SMBIOS_CHASSIS_ADVANCED_TCA (0x1B) +#define FWTS_SMBIOS_CHASSIS_BLADE (0x1C) +#define FWTS_SMBIOS_CHASSIS_BLASE_ENCLOSURE (0x1D) + typedef enum { FWTS_SMBIOS_UNKNOWN = -1, FWTS_SMBIOS_DMI_LEGACY = 0,