[PATCH 1/7] acpi: method: refine _PSS and _TSS method tests

Alex Hung alex.hung at canonical.com
Sat Jan 23 02:12:25 UTC 2021


Signed-off-by: Alex Hung <alex.hung at canonical.com>
---
 src/acpi/method/method.c | 98 ++++++++++++----------------------------
 1 file changed, 30 insertions(+), 68 deletions(-)

diff --git a/src/acpi/method/method.c b/src/acpi/method/method.c
index 9372623f..8ee03b1e 100644
--- a/src/acpi/method/method.c
+++ b/src/acpi/method/method.c
@@ -2144,6 +2144,15 @@ static void method_test_PSS_return(
 	bool dump_elements = false;
 	bool *element_ok;
 
+	static const fwts_package_element elements[] = {
+		{ ACPI_TYPE_INTEGER,	"CoreFrequency" },
+		{ ACPI_TYPE_INTEGER,	"Power" },
+		{ ACPI_TYPE_INTEGER,	"Latency" },
+		{ ACPI_TYPE_INTEGER,	"BusMasterLatency" },
+		{ ACPI_TYPE_INTEGER,	"Control" },
+		{ ACPI_TYPE_INTEGER,	"Status" },
+	};
+
 	FWTS_UNUSED(private);
 
 	if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_PACKAGE) != FWTS_OK)
@@ -2159,49 +2168,21 @@ static void method_test_PSS_return(
 		return;
 	}
 
+	if (fwts_method_package_elements_all_type(fw, name, obj, ACPI_TYPE_PACKAGE) != FWTS_OK)
+		return;
+
 	for (i = 0; i < obj->Package.Count; i++) {
 		ACPI_OBJECT *pstate;
 
-		if (obj->Package.Elements[i].Type != ACPI_TYPE_PACKAGE) {
-			fwts_failed(fw, LOG_LEVEL_MEDIUM,
-				"Method_PSSElementType",
-				"%s package element %" PRIu32
-				" was not a package.", name, i);
-			failed = true;
-			continue;	/* Skip processing sub-package */
-		}
-
+		element_ok[i] = true;
 		pstate = &obj->Package.Elements[i];
-		if (pstate->Package.Count != 6) {
-			fwts_failed(fw, LOG_LEVEL_MEDIUM,
-				"Method_PSSSubPackageElementCount",
-				"%s P-State sub-package %" PRIu32
-				" was expected to "
-				"have 6 elements, got %" PRIu32 " elements instead.",
-				name, i, obj->Package.Count);
-			failed = true;
-			continue;	/* Skip processing sub-package */
-		}
-
-		/* Elements need to be all ACPI integer types */
-		if ((pstate->Package.Elements[0].Type != ACPI_TYPE_INTEGER) ||
-		    (pstate->Package.Elements[1].Type != ACPI_TYPE_INTEGER) ||
-		    (pstate->Package.Elements[2].Type != ACPI_TYPE_INTEGER) ||
-		    (pstate->Package.Elements[3].Type != ACPI_TYPE_INTEGER) ||
-		    (pstate->Package.Elements[4].Type != ACPI_TYPE_INTEGER) ||
-		    (pstate->Package.Elements[5].Type != ACPI_TYPE_INTEGER)) {
-			fwts_failed(fw, LOG_LEVEL_MEDIUM,
-				"Method_PSSSubPackageElementType",
-				"%s P-State sub-package %" PRIu32 " was expected to "
-				"have 6 Integer elements but didn't", name, i);
+		if (fwts_method_package_elements_type(fw, name, pstate, elements) != FWTS_OK) {
+			element_ok[i] = false;
 			failed = true;
 			continue;
 		}
 
-		/*
-	 	 *  Parses OK, so this element can be dumped out
-		 */
-		element_ok[i] = true;
+		/* At least one element is OK, so the element can be dumped out */
 		dump_elements = true;
 
 		/*
@@ -2407,6 +2388,14 @@ static void method_test_TSS_return(
 	bool *tss_elements_ok;
 	bool an_element_ok = false;
 
+	static const fwts_package_element elements[] = {
+		{ ACPI_TYPE_INTEGER,	"Percent" },
+		{ ACPI_TYPE_INTEGER,	"Power" },
+		{ ACPI_TYPE_INTEGER,	"Latency" },
+		{ ACPI_TYPE_INTEGER,	"CoordType" },
+		{ ACPI_TYPE_INTEGER,	"Status" },
+	};
+
 	FWTS_UNUSED(private);
 
 	if (fwts_method_check_type(fw, name, buf, ACPI_TYPE_PACKAGE) != FWTS_OK)
@@ -2422,56 +2411,29 @@ static void method_test_TSS_return(
 		return;
 	}
 
+	if (fwts_method_package_elements_all_type(fw, name, obj, ACPI_TYPE_PACKAGE) != FWTS_OK)
+		return;
+
 	/* Could be one or more packages */
 	for (i = 0; i < obj->Package.Count; i++) {
 		ACPI_OBJECT *pkg;
-		uint32_t j;
 
 		tss_elements_ok[i] = true;
-
-		if (obj->Package.Elements[i].Type != ACPI_TYPE_PACKAGE) {
-			fwts_failed(fw, LOG_LEVEL_MEDIUM,
-				"Method_TSSElementType",
-				"%s package element %" PRIu32
-				" was not a package.", name, i);
-			tss_elements_ok[i] = false;
-			failed = true;
-			continue;	/* Skip processing sub-package */
-		}
-
 		pkg = &obj->Package.Elements[i];
-		/*
-		 *  We expect a package of 5 integers.
-		 */
-		if (fwts_method_subpackage_count_equal(fw, name, pkg, i, 5) != FWTS_OK) {
+		if (fwts_method_package_elements_type(fw, name, pkg, elements) != FWTS_OK) {
 			tss_elements_ok[i] = false;
-			failed = true;
-			continue;	/* Skip processing sub-package */
-		}
-
-		for (j = 0; j < 5; j++) {
-			if (pkg->Package.Elements[j].Type != ACPI_TYPE_INTEGER) {
-				fwts_failed(fw, LOG_LEVEL_MEDIUM,
-					"Method_TSSSubPackageElementCount",
-					"%s sub-package %" PRIu32
-					" element %" PRIu32 " is not "
-					"an integer.", name, i, j);
-				tss_elements_ok[i] = false;
-			}
-		}
-		if (!tss_elements_ok[i]) {
 			failed = true;
 			continue;
 		}
 
-		/* At least one element is OK, so remember that */
+		/* At least one element is OK, so the element can be dumped out */
 		an_element_ok = true;
 
 		/* Element 0 must be 1..100 */
 		if ((pkg->Package.Elements[0].Integer.Value < 1) ||
 		    (pkg->Package.Elements[0].Integer.Value > 100)) {
 			fwts_failed(fw, LOG_LEVEL_MEDIUM,
-				"Method_TSDSubPackageElement0",
+				"Method_TSDSubPackageElement",
 				"%s sub-package %" PRIu32 " element 0 "
 				"was expected to have value 1..100, instead "
 				"was %" PRIu64 ".",
-- 
2.25.1




More information about the fwts-devel mailing list