[PATCH 15/21] FADT: add compliance tests for S4BIOS_REQ and PSTATE_CNT fields
Colin Ian King
colin.king at canonical.com
Tue Feb 9 12:24:06 UTC 2016
On 09/02/16 01:32, Al Stone wrote:
> These are the last two field that are related to the SMI_CMD field
> and whether or not it is defined. Additionally, this is the first
> set of tests that require information from the FACS, also, so add
> in that table to the initialization step.
>
> Signed-off-by: Al Stone <al.stone at linaro.org>
> ---
> src/acpi/fadt/fadt.c | 117 +++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 117 insertions(+)
>
> diff --git a/src/acpi/fadt/fadt.c b/src/acpi/fadt/fadt.c
> index a2535e8..3c4cdda 100644
> --- a/src/acpi/fadt/fadt.c
> +++ b/src/acpi/fadt/fadt.c
> @@ -41,6 +41,8 @@ static inline int ioperm(int a, ...)
> static const fwts_acpi_table_fadt *fadt;
> static int fadt_size;
>
> +static const fwts_acpi_table_facs *facs;
> +
> static int fadt_init(fwts_framework *fw)
> {
> fwts_acpi_table_info *table;
> @@ -69,6 +71,23 @@ static int fadt_init(fwts_framework *fw)
> }
> }
>
> + /*
> + * Some tests require data from the FACS, also, which is
> + * required (5.2.10) is we are not in reduced hardware
> + * mode
> + */
> + if (!fwts_acpi_is_reduced_hardware(fadt)) {
> + if (fwts_acpi_find_table(fw, "FACS", 0, &table) != FWTS_OK) {
> + fwts_log_error(fw, "Cannot read ACPI table FACS.");
> + return FWTS_ERROR;
> + }
> + if (table == NULL) {
> + fwts_log_error(fw, "ACPI table FACS does not exist!");
> + return FWTS_ERROR;
> + }
> + facs = (const fwts_acpi_table_facs *)table->data;
> + }
> +
> return FWTS_OK;
> }
>
> @@ -769,6 +788,102 @@ static void acpi_table_check_fadt_acpi_disable(fwts_framework *fw)
> return;
> }
>
> +static void acpi_table_check_fadt_s4bios_req(fwts_framework *fw)
> +{
> + if (facs && facs->length >= 24)
> + fwts_passed(fw,
> + "FADT indicates we are not in reduced hardware "
> + "mode, and required FACS is present.");
> + else
> + fwts_failed(fw, LOG_LEVEL_MEDIUM,
> + "FACSMustBePresent",
> + "FADT indicates we are not in reduced hardware "
> + "mode, which requires an FACS be present, but "
> + "none has been found.");
> +
> + if (facs && (facs->flags & FWTS_FACS_FLAG_S4BIOS_F)) {
> + if (fadt->s4bios_req == 0) {
> + if (fadt->smi_cmd == 0) {
> + fwts_passed(fw,
> + "FADT indicates System Management "
> + "Mode is not supported, which "
> + "allows a zero S4BIOS_REQ value.");
> + fwts_advice(fw,
> + "There is an inconsistency between "
> + "the FADT and FACS. The FADT "
> + "indicates no SMM support, and "
> + "no S4BIOS_REQ command, but the "
> + "FACS indicates S4BIOS_REQ is "
> + "supported. One of these may "
> + "be incorrect.");
> + } else {
> + fwts_failed(fw, LOG_LEVEL_MEDIUM,
> + "SMMHasNoS4BIOSReqCmd",
> + "FADT SMI S4BIOS_REQ command is "
> + "zero, but this is not allowed "
> + "when SMM is supported, and the "
> + "S4BIOS_F flag is set in the "
> + "FACS.");
> + }
> + } else {
> + if (fadt->smi_cmd == 0) {
> + fwts_passed(fw,
> + "FADT indicates System Management "
> + "Mode is not supported, but a "
> + "S4BIOS_REQ command is defined.");
> + fwts_advice(fw,
> + "There is an inconsistency between "
> + "the FADT and FACS. The FADT "
> + "indicates no SMM support, but it "
> + "defines an S4BIOS_REQ command, "
> + "and the FACS indicates "
> + "S4BIOS_REQ is supported. One "
> + "of these may be incorrect.");
> + } else {
> + fwts_passed(fw,
> + "FADT S4BIOS_REQ command is "
> + "non-zero, SMM is supported so "
> + "the command can be used, and "
> + "the FACS indicates S4BIOS_REQ "
> + "is supported.");
> + }
> + }
> + } else {
> + if (fadt->s4bios_req == 0)
> + fwts_passed(fw, "FADT S4BIOS_REQ command is not set "
> + "and FACS indicates it is not supported.");
> + else
> + fwts_failed(fw, LOG_LEVEL_MEDIUM,
> + "SMMS4BIOSCmdDefined",
> + "FADT S4BIOS_REQ command is defined "
> + "but FACS indicates it is not supported.");
> + }
> +
> + return;
> +}
> +
> +static void acpi_table_check_fadt_pstate_cnt(fwts_framework *fw)
> +{
> + if (fadt->pstate_cnt == 0) {
> + if (fadt->smi_cmd == 0)
> + fwts_passed(fw,
> + "FADT SMI PSTATE_CNT command is zero, "
> + "which is allowed since SMM is not "
> + "supported.");
> + } else {
> + if (fadt->smi_cmd == 0)
> + fwts_failed(fw, LOG_LEVEL_MEDIUM,
> + "SMMHasExtraPstateCntCmd",
> + "FADT SMI PSTATE_CNT command is "
> + "non-zero, but SMM is not supported.");
> + else
> + fwts_passed(fw, "FADT SMI PSTATE_CNT command is "
> + "non-zero, and SMM is supported.");
> + }
> +
> + return;
> +}
> +
> static void acpi_table_check_fadt_pm_tmr(
> fwts_framework *fw,
> const fwts_acpi_table_fadt *fadt,
> @@ -914,6 +1029,8 @@ static int fadt_test1(fwts_framework *fw)
> acpi_table_check_fadt_smi_cmd(fw);
> acpi_table_check_fadt_acpi_enable(fw);
> acpi_table_check_fadt_acpi_disable(fw);
> + acpi_table_check_fadt_s4bios_req(fw);
> + acpi_table_check_fadt_pstate_cnt(fw);
> acpi_table_check_fadt_pm_tmr(fw, fadt, &passed);
> acpi_table_check_fadt_gpe(fw, fadt, &passed);
> acpi_table_check_fadt_pm_addr(fw, fadt, &passed);
>
Yep, these are good extra sanity checks.
Acked-by: Colin Ian King <colin.king at canonical.com>
More information about the fwts-devel
mailing list