diff mbox series

[V2] acpi: fadt: Fix FACS checking

Message ID 1517427808-8678-1-git-send-email-jhugo@codeaurora.org
State Accepted
Headers show
Series [V2] acpi: fadt: Fix FACS checking | expand

Commit Message

Jeffrey Hugo Jan. 31, 2018, 7:43 p.m. UTC
In case of HW reduced platforms, FIRMWARE_CTRL and X_FIRMWARE_CTRL are
allowed to be 0 in the FADT as a FACS may not be provided.  The FACS
validation which checks these fields does register a success for HW reduced
platforms when the fields are both 0, or registers a failure for non-HW
reduced platforms as FACS is required in that case.  However, the FACS
validation continues with other checks, which can override the previous
success with a failure, causing an invalid test result and confusing output
messages.

We can do better by reorganizing the checks to follow in logical succession,
only applying pass/fail results appropiate to the specific scenario (both
fields zero, both fields non-zero, one field zero with the other non-zero).

Signed-off-by: Jeffrey Hugo <jhugo@codeaurora.org>
---
 src/acpi/fadt/fadt.c | 27 +++++----------------------
 1 file changed, 5 insertions(+), 22 deletions(-)

Comments

Colin Ian King Feb. 1, 2018, 2:12 p.m. UTC | #1
On 31/01/18 19:43, Jeffrey Hugo wrote:
> In case of HW reduced platforms, FIRMWARE_CTRL and X_FIRMWARE_CTRL are
> allowed to be 0 in the FADT as a FACS may not be provided.  The FACS
> validation which checks these fields does register a success for HW reduced
> platforms when the fields are both 0, or registers a failure for non-HW
> reduced platforms as FACS is required in that case.  However, the FACS
> validation continues with other checks, which can override the previous
> success with a failure, causing an invalid test result and confusing output
> messages.
> 
> We can do better by reorganizing the checks to follow in logical succession,
> only applying pass/fail results appropiate to the specific scenario (both
> fields zero, both fields non-zero, one field zero with the other non-zero).
> 
> Signed-off-by: Jeffrey Hugo <jhugo@codeaurora.org>
> ---
>  src/acpi/fadt/fadt.c | 27 +++++----------------------
>  1 file changed, 5 insertions(+), 22 deletions(-)
> 
> diff --git a/src/acpi/fadt/fadt.c b/src/acpi/fadt/fadt.c
> index 9863566..93a5862 100644
> --- a/src/acpi/fadt/fadt.c
> +++ b/src/acpi/fadt/fadt.c
> @@ -271,28 +271,7 @@ static void acpi_table_check_fadt_firmware_ctrl(fwts_framework *fw)
>  				    "reduced mode is not set. ");
>  		}
>  
> -	}
> -
> -	if ((fadt->firmware_control != 0 && fadt->x_firmware_ctrl == 0) ||
> -	    (fadt->firmware_control == 0 && fadt->x_firmware_ctrl != 0)) {
> -		fwts_passed(fw,
> -			    "Only one of FIRMWARE_CTRL and X_FIRMWARE_CTRL "
> -			    "is non-zero.");
> -	} else {
> -		fwts_failed(fw, LOG_LEVEL_MEDIUM,
> -			    "FADTFACSBothSet",
> -			    "Both 32-bit FIRMWARE_CTRL and 64-bit "
> -			    "X_FIRMWARE_CTRL pointers to the FACS are "
> -			    "set but only one is allowed.");
> -		fwts_advice(fw,
> -			    "Having both FACS pointers set is ambiguous; "
> -			    "there is no way to determine which one is "
> -			    "the correct address.  The kernel workaround "
> -			    "is to always use the 64-bit X_FIRMWARE_CTRL.");
> -	}
> -
> -
> -	if (fadt->firmware_control != 0 && fadt->x_firmware_ctrl != 0) {
> +	} else 	if (fadt->firmware_control != 0 && fadt->x_firmware_ctrl != 0) {
>  		if ((uint64_t)fadt->firmware_control == fadt->x_firmware_ctrl) {
>  			fwts_passed(fw,
>  				    "Both FIRMWARE_CTRL and X_FIRMWARE_CTRL "
> @@ -326,6 +305,10 @@ static void acpi_table_check_fadt_firmware_ctrl(fwts_framework *fw)
>  				    "64-bit X_FIRMWARE_CTRL pointer to the "
>  				    "FACS. ");
>  		}
> +	} else { /* only one of firmware_control/x_firmware_ctrl is 0 */
> +		fwts_passed(fw,
> +			    "Only one of FIRMWARE_CTRL and X_FIRMWARE_CTRL "
> +			    "is non-zero.");
>  	}
>  }
>  
> 
Looks good to me, thanks Jeffrey.

Acked-by: Colin Ian King <colin.king@canonical.com>
Alex Hung Feb. 2, 2018, 2:49 a.m. UTC | #2
On 2018-01-31 11:43 AM, Jeffrey Hugo wrote:
> In case of HW reduced platforms, FIRMWARE_CTRL and X_FIRMWARE_CTRL are
> allowed to be 0 in the FADT as a FACS may not be provided.  The FACS
> validation which checks these fields does register a success for HW reduced
> platforms when the fields are both 0, or registers a failure for non-HW
> reduced platforms as FACS is required in that case.  However, the FACS
> validation continues with other checks, which can override the previous
> success with a failure, causing an invalid test result and confusing output
> messages.
> 
> We can do better by reorganizing the checks to follow in logical succession,
> only applying pass/fail results appropiate to the specific scenario (both
> fields zero, both fields non-zero, one field zero with the other non-zero).
> 
> Signed-off-by: Jeffrey Hugo <jhugo@codeaurora.org>
> ---
>   src/acpi/fadt/fadt.c | 27 +++++----------------------
>   1 file changed, 5 insertions(+), 22 deletions(-)
> 
> diff --git a/src/acpi/fadt/fadt.c b/src/acpi/fadt/fadt.c
> index 9863566..93a5862 100644
> --- a/src/acpi/fadt/fadt.c
> +++ b/src/acpi/fadt/fadt.c
> @@ -271,28 +271,7 @@ static void acpi_table_check_fadt_firmware_ctrl(fwts_framework *fw)
>   				    "reduced mode is not set. ");
>   		}
>   
> -	}
> -
> -	if ((fadt->firmware_control != 0 && fadt->x_firmware_ctrl == 0) ||
> -	    (fadt->firmware_control == 0 && fadt->x_firmware_ctrl != 0)) {
> -		fwts_passed(fw,
> -			    "Only one of FIRMWARE_CTRL and X_FIRMWARE_CTRL "
> -			    "is non-zero.");
> -	} else {
> -		fwts_failed(fw, LOG_LEVEL_MEDIUM,
> -			    "FADTFACSBothSet",
> -			    "Both 32-bit FIRMWARE_CTRL and 64-bit "
> -			    "X_FIRMWARE_CTRL pointers to the FACS are "
> -			    "set but only one is allowed.");
> -		fwts_advice(fw,
> -			    "Having both FACS pointers set is ambiguous; "
> -			    "there is no way to determine which one is "
> -			    "the correct address.  The kernel workaround "
> -			    "is to always use the 64-bit X_FIRMWARE_CTRL.");
> -	}
> -
> -
> -	if (fadt->firmware_control != 0 && fadt->x_firmware_ctrl != 0) {
> +	} else 	if (fadt->firmware_control != 0 && fadt->x_firmware_ctrl != 0) {
>   		if ((uint64_t)fadt->firmware_control == fadt->x_firmware_ctrl) {
>   			fwts_passed(fw,
>   				    "Both FIRMWARE_CTRL and X_FIRMWARE_CTRL "
> @@ -326,6 +305,10 @@ static void acpi_table_check_fadt_firmware_ctrl(fwts_framework *fw)
>   				    "64-bit X_FIRMWARE_CTRL pointer to the "
>   				    "FACS. ");
>   		}
> +	} else { /* only one of firmware_control/x_firmware_ctrl is 0 */
> +		fwts_passed(fw,
> +			    "Only one of FIRMWARE_CTRL and X_FIRMWARE_CTRL "
> +			    "is non-zero.");
>   	}
>   }
>   
> 


Acked-by: Alex Hung <alex.hung@canonical.com>
diff mbox series

Patch

diff --git a/src/acpi/fadt/fadt.c b/src/acpi/fadt/fadt.c
index 9863566..93a5862 100644
--- a/src/acpi/fadt/fadt.c
+++ b/src/acpi/fadt/fadt.c
@@ -271,28 +271,7 @@  static void acpi_table_check_fadt_firmware_ctrl(fwts_framework *fw)
 				    "reduced mode is not set. ");
 		}
 
-	}
-
-	if ((fadt->firmware_control != 0 && fadt->x_firmware_ctrl == 0) ||
-	    (fadt->firmware_control == 0 && fadt->x_firmware_ctrl != 0)) {
-		fwts_passed(fw,
-			    "Only one of FIRMWARE_CTRL and X_FIRMWARE_CTRL "
-			    "is non-zero.");
-	} else {
-		fwts_failed(fw, LOG_LEVEL_MEDIUM,
-			    "FADTFACSBothSet",
-			    "Both 32-bit FIRMWARE_CTRL and 64-bit "
-			    "X_FIRMWARE_CTRL pointers to the FACS are "
-			    "set but only one is allowed.");
-		fwts_advice(fw,
-			    "Having both FACS pointers set is ambiguous; "
-			    "there is no way to determine which one is "
-			    "the correct address.  The kernel workaround "
-			    "is to always use the 64-bit X_FIRMWARE_CTRL.");
-	}
-
-
-	if (fadt->firmware_control != 0 && fadt->x_firmware_ctrl != 0) {
+	} else 	if (fadt->firmware_control != 0 && fadt->x_firmware_ctrl != 0) {
 		if ((uint64_t)fadt->firmware_control == fadt->x_firmware_ctrl) {
 			fwts_passed(fw,
 				    "Both FIRMWARE_CTRL and X_FIRMWARE_CTRL "
@@ -326,6 +305,10 @@  static void acpi_table_check_fadt_firmware_ctrl(fwts_framework *fw)
 				    "64-bit X_FIRMWARE_CTRL pointer to the "
 				    "FACS. ");
 		}
+	} else { /* only one of firmware_control/x_firmware_ctrl is 0 */
+		fwts_passed(fw,
+			    "Only one of FIRMWARE_CTRL and X_FIRMWARE_CTRL "
+			    "is non-zero.");
 	}
 }