Message ID | 1328077924-14661-1-git-send-email-alex.hung@canonical.com |
---|---|
State | Accepted |
Headers | show |
On 01/02/12 06:32, Alex Hung wrote: > Signed-off-by: Alex Hung<alex.hung@canonical.com> > --- > 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, Acked-by: Colin King <colin.king@canonical.com>
On Wed, Feb 1, 2012 at 10:47 PM, Colin Ian King <colin.king@canonical.com> wrote: > On 01/02/12 06:32, Alex Hung wrote: >> >> Signed-off-by: Alex Hung<alex.hung@canonical.com> >> --- >> 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, > > > Acked-by: Colin King <colin.king@canonical.com> > > Acked-by: Keng-Yu Lin <kengyu@canonical.com>
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,
Signed-off-by: Alex Hung <alex.hung@canonical.com> --- 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(-)