diff mbox series

[V3] acpi: method: check one element in _TSD only for acpi 6.2+

Message ID 1519170548-7495-1-git-send-email-alex.hung@canonical.com
State Accepted
Headers show
Series [V3] acpi: method: check one element in _TSD only for acpi 6.2+ | expand

Commit Message

Alex Hung Feb. 20, 2018, 11:49 p.m. UTC
ACPI 6.1 and before allow more element in _TSD method

Signed-off-by: Alex Hung <alex.hung@canonical.com>
---
 src/acpi/method/method.c           |  6 ++++--
 src/lib/include/fwts_acpi.h        | 11 +++++++++++
 src/lib/include/fwts_acpi_tables.h |  2 ++
 src/lib/src/fwts_acpi_tables.c     | 34 ++++++++++++++++++++++++++++++++++
 4 files changed, 51 insertions(+), 2 deletions(-)

Comments

Ivan Hu Feb. 21, 2018, 8:20 a.m. UTC | #1
On 02/21/2018 07:49 AM, Alex Hung wrote:
> ACPI 6.1 and before allow more element in _TSD method
> 
> Signed-off-by: Alex Hung <alex.hung@canonical.com>
> ---
>   src/acpi/method/method.c           |  6 ++++--
>   src/lib/include/fwts_acpi.h        | 11 +++++++++++
>   src/lib/include/fwts_acpi_tables.h |  2 ++
>   src/lib/src/fwts_acpi_tables.c     | 34 ++++++++++++++++++++++++++++++++++
>   4 files changed, 51 insertions(+), 2 deletions(-)
> 
> diff --git a/src/acpi/method/method.c b/src/acpi/method/method.c
> index 6839c3f..0df3526 100644
> --- a/src/acpi/method/method.c
> +++ b/src/acpi/method/method.c
> @@ -2896,8 +2896,10 @@ static void method_test_TSD_return(
>   	if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_PACKAGE) != FWTS_OK)
>   		return;
>   
> -	if (fwts_method_package_count_equal(fw, name, "_TSD", obj, 1) != FWTS_OK)
> -		return;
> +	if (fwts_get_acpi_version(fw) >= FWTS_ACPI_VERSION_62) {
> +		if (fwts_method_package_count_equal(fw, name, "_TSD", obj, 1) != FWTS_OK)
> +			return;
> +	}
>   
>   	/* Could be one or more packages */
>   	for (i = 0; i < obj->Package.Count; i++) {
> diff --git a/src/lib/include/fwts_acpi.h b/src/lib/include/fwts_acpi.h
> index 3151b90..e550cd7 100644
> --- a/src/lib/include/fwts_acpi.h
> +++ b/src/lib/include/fwts_acpi.h
> @@ -84,6 +84,17 @@
>   #define FWTS_GAS_ADDR_SPACE_ID_PCC		(0x0a)
>   #define FWTS_GAS_ADDR_SPACE_ID_FFH		(0x7f)
>   
> +#define FWTS_ACPI_VERSION_NEXT	(0x700)
> +#define FWTS_ACPI_VERSION_62 	(0x620)
> +#define FWTS_ACPI_VERSION_61	(0x610)
> +#define FWTS_ACPI_VERSION_60	(0x600)
> +#define FWTS_ACPI_VERSION_51	(0x510)
> +#define FWTS_ACPI_VERSION_50	(0x500)
> +#define FWTS_ACPI_VERSION_40	(0x400)
> +#define FWTS_ACPI_VERSION_30	(0x300)
> +#define FWTS_ACPI_VERSION_20	(0x200)
> +#define FWTS_ACPI_VERSION_10	(0x100)
> +
>   #include "fwts_types.h"
>   #include "fwts_framework.h"
>   #include "fwts_log.h"
> diff --git a/src/lib/include/fwts_acpi_tables.h b/src/lib/include/fwts_acpi_tables.h
> index 11b870c..d307af8 100644
> --- a/src/lib/include/fwts_acpi_tables.h
> +++ b/src/lib/include/fwts_acpi_tables.h
> @@ -58,6 +58,8 @@ void fwts_acpi_reserved_bits_check(fwts_framework *fw, const char *table, const
>   void fwts_acpi_reserved_type_check(fwts_framework *fw, const char *table, uint8_t value, uint8_t min, uint8_t reserved, bool *passed);
>   bool fwts_acpi_subtable_length_check(fwts_framework *fw, const char *table, uint8_t subtable_type, uint32_t subtable_length, uint32_t size);
>   
> +uint32_t fwts_get_acpi_version(fwts_framework *fw);
> +
>   #endif
>   
>   #endif
> diff --git a/src/lib/src/fwts_acpi_tables.c b/src/lib/src/fwts_acpi_tables.c
> index 2aa30f8..c7ba59b 100644
> --- a/src/lib/src/fwts_acpi_tables.c
> +++ b/src/lib/src/fwts_acpi_tables.c
> @@ -1532,4 +1532,38 @@ bool fwts_acpi_subtable_length_check(
>   	return true;
>   }
>   
> +static uint32_t acpi_version;
> +/*
> + *  fwts_get_acpi_version()
> + * 	get acpi version from facp
> + */
> +uint32_t fwts_get_acpi_version(fwts_framework *fw)
> +{
> +	fwts_acpi_table_fadt *fadt;
> +	fwts_acpi_table_info *table;
> +
> +	if (acpi_version != 0)
> +		return acpi_version;
> +
> +	if (fwts_acpi_find_table(fw, "FACP", 0, &table) != FWTS_OK) {
> +		fwts_log_error(fw, "Cannot read ACPI table FACP.");
> +		return 0;
> +	}
> +
> +	if (table == NULL) {
> +		fwts_log_error(fw, "ACPI table FACP does not exist!");
> +		return 0;
> +	}
> +
> +	fadt = (fwts_acpi_table_fadt *) table->data;
> +	acpi_version = (fadt->header.revision << 8) + fadt->minor_version;
> +
> +	/* check FACP returns an invalid value */
> +	if (acpi_version > FWTS_ACPI_VERSION_NEXT ||
> +	    acpi_version < FWTS_ACPI_VERSION_10)
> +		return 0;
> +
> +	return acpi_version;
> +}
> +
>   #endif
> 

Acked-by: Ivan Hu <ivan.hu@canonical.com>
Colin Ian King Feb. 21, 2018, 9:19 a.m. UTC | #2
On 20/02/18 23:49, Alex Hung wrote:
> ACPI 6.1 and before allow more element in _TSD method
> 
> Signed-off-by: Alex Hung <alex.hung@canonical.com>
> ---
>  src/acpi/method/method.c           |  6 ++++--
>  src/lib/include/fwts_acpi.h        | 11 +++++++++++
>  src/lib/include/fwts_acpi_tables.h |  2 ++
>  src/lib/src/fwts_acpi_tables.c     | 34 ++++++++++++++++++++++++++++++++++
>  4 files changed, 51 insertions(+), 2 deletions(-)
> 
> diff --git a/src/acpi/method/method.c b/src/acpi/method/method.c
> index 6839c3f..0df3526 100644
> --- a/src/acpi/method/method.c
> +++ b/src/acpi/method/method.c
> @@ -2896,8 +2896,10 @@ static void method_test_TSD_return(
>  	if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_PACKAGE) != FWTS_OK)
>  		return;
>  
> -	if (fwts_method_package_count_equal(fw, name, "_TSD", obj, 1) != FWTS_OK)
> -		return;
> +	if (fwts_get_acpi_version(fw) >= FWTS_ACPI_VERSION_62) {
> +		if (fwts_method_package_count_equal(fw, name, "_TSD", obj, 1) != FWTS_OK)
> +			return;
> +	}
>  
>  	/* Could be one or more packages */
>  	for (i = 0; i < obj->Package.Count; i++) {
> diff --git a/src/lib/include/fwts_acpi.h b/src/lib/include/fwts_acpi.h
> index 3151b90..e550cd7 100644
> --- a/src/lib/include/fwts_acpi.h
> +++ b/src/lib/include/fwts_acpi.h
> @@ -84,6 +84,17 @@
>  #define FWTS_GAS_ADDR_SPACE_ID_PCC		(0x0a)
>  #define FWTS_GAS_ADDR_SPACE_ID_FFH		(0x7f)
>  
> +#define FWTS_ACPI_VERSION_NEXT	(0x700)
> +#define FWTS_ACPI_VERSION_62 	(0x620)
> +#define FWTS_ACPI_VERSION_61	(0x610)
> +#define FWTS_ACPI_VERSION_60	(0x600)
> +#define FWTS_ACPI_VERSION_51	(0x510)
> +#define FWTS_ACPI_VERSION_50	(0x500)
> +#define FWTS_ACPI_VERSION_40	(0x400)
> +#define FWTS_ACPI_VERSION_30	(0x300)
> +#define FWTS_ACPI_VERSION_20	(0x200)
> +#define FWTS_ACPI_VERSION_10	(0x100)
> +
>  #include "fwts_types.h"
>  #include "fwts_framework.h"
>  #include "fwts_log.h"
> diff --git a/src/lib/include/fwts_acpi_tables.h b/src/lib/include/fwts_acpi_tables.h
> index 11b870c..d307af8 100644
> --- a/src/lib/include/fwts_acpi_tables.h
> +++ b/src/lib/include/fwts_acpi_tables.h
> @@ -58,6 +58,8 @@ void fwts_acpi_reserved_bits_check(fwts_framework *fw, const char *table, const
>  void fwts_acpi_reserved_type_check(fwts_framework *fw, const char *table, uint8_t value, uint8_t min, uint8_t reserved, bool *passed);
>  bool fwts_acpi_subtable_length_check(fwts_framework *fw, const char *table, uint8_t subtable_type, uint32_t subtable_length, uint32_t size);
>  
> +uint32_t fwts_get_acpi_version(fwts_framework *fw);
> +
>  #endif
>  
>  #endif
> diff --git a/src/lib/src/fwts_acpi_tables.c b/src/lib/src/fwts_acpi_tables.c
> index 2aa30f8..c7ba59b 100644
> --- a/src/lib/src/fwts_acpi_tables.c
> +++ b/src/lib/src/fwts_acpi_tables.c
> @@ -1532,4 +1532,38 @@ bool fwts_acpi_subtable_length_check(
>  	return true;
>  }
>  
> +static uint32_t acpi_version;
> +/*
> + *  fwts_get_acpi_version()
> + * 	get acpi version from facp
> + */
> +uint32_t fwts_get_acpi_version(fwts_framework *fw)
> +{
> +	fwts_acpi_table_fadt *fadt;
> +	fwts_acpi_table_info *table;
> +
> +	if (acpi_version != 0)
> +		return acpi_version;
> +
> +	if (fwts_acpi_find_table(fw, "FACP", 0, &table) != FWTS_OK) {
> +		fwts_log_error(fw, "Cannot read ACPI table FACP.");
> +		return 0;
> +	}
> +
> +	if (table == NULL) {
> +		fwts_log_error(fw, "ACPI table FACP does not exist!");
> +		return 0;
> +	}
> +
> +	fadt = (fwts_acpi_table_fadt *) table->data;
> +	acpi_version = (fadt->header.revision << 8) + fadt->minor_version;
> +
> +	/* check FACP returns an invalid value */
> +	if (acpi_version > FWTS_ACPI_VERSION_NEXT ||
> +	    acpi_version < FWTS_ACPI_VERSION_10)
> +		return 0;
> +
> +	return acpi_version;
> +}
> +
>  #endif
> 
Thanks Alex,

Acked-by: Colin Ian King <colin.king@canonical.com>
diff mbox series

Patch

diff --git a/src/acpi/method/method.c b/src/acpi/method/method.c
index 6839c3f..0df3526 100644
--- a/src/acpi/method/method.c
+++ b/src/acpi/method/method.c
@@ -2896,8 +2896,10 @@  static void method_test_TSD_return(
 	if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_PACKAGE) != FWTS_OK)
 		return;
 
-	if (fwts_method_package_count_equal(fw, name, "_TSD", obj, 1) != FWTS_OK)
-		return;
+	if (fwts_get_acpi_version(fw) >= FWTS_ACPI_VERSION_62) {
+		if (fwts_method_package_count_equal(fw, name, "_TSD", obj, 1) != FWTS_OK)
+			return;
+	}
 
 	/* Could be one or more packages */
 	for (i = 0; i < obj->Package.Count; i++) {
diff --git a/src/lib/include/fwts_acpi.h b/src/lib/include/fwts_acpi.h
index 3151b90..e550cd7 100644
--- a/src/lib/include/fwts_acpi.h
+++ b/src/lib/include/fwts_acpi.h
@@ -84,6 +84,17 @@ 
 #define FWTS_GAS_ADDR_SPACE_ID_PCC		(0x0a)
 #define FWTS_GAS_ADDR_SPACE_ID_FFH		(0x7f)
 
+#define FWTS_ACPI_VERSION_NEXT	(0x700)
+#define FWTS_ACPI_VERSION_62 	(0x620)
+#define FWTS_ACPI_VERSION_61	(0x610)
+#define FWTS_ACPI_VERSION_60	(0x600)
+#define FWTS_ACPI_VERSION_51	(0x510)
+#define FWTS_ACPI_VERSION_50	(0x500)
+#define FWTS_ACPI_VERSION_40	(0x400)
+#define FWTS_ACPI_VERSION_30	(0x300)
+#define FWTS_ACPI_VERSION_20	(0x200)
+#define FWTS_ACPI_VERSION_10	(0x100)
+
 #include "fwts_types.h"
 #include "fwts_framework.h"
 #include "fwts_log.h"
diff --git a/src/lib/include/fwts_acpi_tables.h b/src/lib/include/fwts_acpi_tables.h
index 11b870c..d307af8 100644
--- a/src/lib/include/fwts_acpi_tables.h
+++ b/src/lib/include/fwts_acpi_tables.h
@@ -58,6 +58,8 @@  void fwts_acpi_reserved_bits_check(fwts_framework *fw, const char *table, const
 void fwts_acpi_reserved_type_check(fwts_framework *fw, const char *table, uint8_t value, uint8_t min, uint8_t reserved, bool *passed);
 bool fwts_acpi_subtable_length_check(fwts_framework *fw, const char *table, uint8_t subtable_type, uint32_t subtable_length, uint32_t size);
 
+uint32_t fwts_get_acpi_version(fwts_framework *fw);
+
 #endif
 
 #endif
diff --git a/src/lib/src/fwts_acpi_tables.c b/src/lib/src/fwts_acpi_tables.c
index 2aa30f8..c7ba59b 100644
--- a/src/lib/src/fwts_acpi_tables.c
+++ b/src/lib/src/fwts_acpi_tables.c
@@ -1532,4 +1532,38 @@  bool fwts_acpi_subtable_length_check(
 	return true;
 }
 
+static uint32_t acpi_version;
+/*
+ *  fwts_get_acpi_version()
+ * 	get acpi version from facp
+ */
+uint32_t fwts_get_acpi_version(fwts_framework *fw)
+{
+	fwts_acpi_table_fadt *fadt;
+	fwts_acpi_table_info *table;
+
+	if (acpi_version != 0)
+		return acpi_version;
+
+	if (fwts_acpi_find_table(fw, "FACP", 0, &table) != FWTS_OK) {
+		fwts_log_error(fw, "Cannot read ACPI table FACP.");
+		return 0;
+	}
+
+	if (table == NULL) {
+		fwts_log_error(fw, "ACPI table FACP does not exist!");
+		return 0;
+	}
+
+	fadt = (fwts_acpi_table_fadt *) table->data;
+	acpi_version = (fadt->header.revision << 8) + fadt->minor_version;
+
+	/* check FACP returns an invalid value */
+	if (acpi_version > FWTS_ACPI_VERSION_NEXT ||
+	    acpi_version < FWTS_ACPI_VERSION_10)
+		return 0;
+
+	return acpi_version;
+}
+
 #endif