[PATCH 1/3] acpi: method: add _PMC test

Alex Hung alex.hung at canonical.com
Wed Jan 13 14:33:02 UTC 2016


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

diff --git a/src/acpi/method/method.c b/src/acpi/method/method.c
index 7ca53ca..de49eefd 100644
--- a/src/acpi/method/method.c
+++ b/src/acpi/method/method.c
@@ -149,7 +149,7 @@
  * _PIC  5.8.1		Y
  * _PIF  10.3.3		Y
  * _PLD  6.1.8		Y
- * _PMC  10.4.1		N
+ * _PMC  10.4.1		Y
  * _PMD  10.4.8		Y
  * _PMM  10.4.3		Y
  * _PPC  8.4.4.3	Y
@@ -5225,6 +5225,106 @@ static int method_test_GHL(fwts_framework *fw)
 		"_GHL", NULL, 0, method_test_integer_return, NULL);
 }
 
+static void method_test_PMC_return(
+	fwts_framework *fw,
+	char *name,
+	ACPI_BUFFER *buf,
+	ACPI_OBJECT *obj,
+	void *private)
+{
+	uint32_t i;
+	bool failed = false;
+	ACPI_OBJECT *element;
+
+	FWTS_UNUSED(private);
+
+	if (method_check_type(fw, name, buf, ACPI_TYPE_PACKAGE) != FWTS_OK)
+		return;
+
+	if (method_package_count_equal(fw, name, "_PMC", obj, 14) != FWTS_OK)
+		return;
+
+	/* check element types */
+	for (i = 0; i < 14; i++) {
+		element = &obj->Package.Elements[i];
+		if (i > 10) {
+			if (element->Type != ACPI_TYPE_STRING) {
+				fwts_failed(fw, LOG_LEVEL_MEDIUM,
+					"Method_PMCBadElementType",
+					"%s element %" PRIu32 " is not a string.", name, i);
+				failed = true;
+			}
+		} else {
+				if (element->Type != ACPI_TYPE_INTEGER) {
+					fwts_failed(fw, LOG_LEVEL_MEDIUM,
+						"Method_PMCBadElementType",
+						"%s element %" PRIu32 " is not an integer.", name, i);
+					failed = true;
+				}
+		}
+	}
+
+	/* check element's constraints */
+	element = &obj->Package.Elements[0];
+	if (element->Integer.Value & 0xFFFFFEF0) {
+		fwts_failed(fw, LOG_LEVEL_MEDIUM,
+			"Method_PMCBadElement",
+			"%s element 0 has reserved bits that are non-zero, got "
+			"0x%" PRIx32 " and expected 0 for these field. ", name,
+			(uint32_t) element->Integer.Value);
+		failed = true;
+	}
+
+	element = &obj->Package.Elements[1];
+	if (element->Integer.Value != 0) {
+		fwts_failed(fw, LOG_LEVEL_MEDIUM,
+			"Method_PMCBadElement",
+			"%s element 1 is expected to be 0, got 0x%" PRIx32 ".",
+			name, (uint32_t) element->Integer.Value);
+		failed = true;
+	}
+
+	element = &obj->Package.Elements[2];
+	if (element->Integer.Value != 0 && element->Integer.Value != 1) {
+		fwts_failed(fw, LOG_LEVEL_MEDIUM,
+			"Method_PMCBadElement",
+			"%s element 2 is expected to be 0 or 1, got 0x%" PRIx32 ".",
+			name, (uint32_t) element->Integer.Value);
+		failed = true;
+	}
+
+	element = &obj->Package.Elements[3];
+	if (element->Integer.Value > 100000) {
+		fwts_failed(fw, LOG_LEVEL_MEDIUM,
+			"Method_PMCBadElement",
+			"%s element 3 exceeds 100000 (100 percent) = 0x%" PRIx32 ".",
+			name, (uint32_t) element->Integer.Value);
+		failed = true;
+	}
+
+	/* nothing to check for elements 4~7 */
+
+	element = &obj->Package.Elements[8];
+	if (element->Integer.Value != 0 && element->Integer.Value != 0xFFFFFFFF) {
+		fwts_failed(fw, LOG_LEVEL_MEDIUM,
+			"Method_PMCBadElement",
+			"%s element 8 is expected to be 0 or 1, got 0x%" PRIx32 ".",
+			name, (uint32_t) element->Integer.Value);
+		failed = true;
+	}
+
+	/* nothing to check for elements 9~13 */
+
+	if (!failed)
+		method_passed_sane(fw, name, "package");
+}
+
+static int method_test_PMC(fwts_framework *fw)
+{
+	return method_evaluate_method(fw, METHOD_OPTIONAL,
+		"_PMC", NULL, 0, method_test_PMC_return, NULL);
+}
+
 static void method_test_PMD_return(
 	fwts_framework *fw,
 	char *name,
@@ -6733,7 +6833,7 @@ static fwts_framework_minor_test method_tests[] = {
 	{ method_test_GAI, "Test _GAI (Get Averaging Level)." },
 	{ method_test_GHL, "Test _GHL (Get Harware Limit)." },
 	/* { method_test_PAI, "Test _PAI (Power Averaging Interval)." }, */
-	/* { method_test_PMC, "Test _PMC (Power Meter Capabilities)." }, */
+	{ method_test_PMC, "Test _PMC (Power Meter Capabilities)." },
 	{ method_test_PMD, "Test _PMD (Power Meter Devices)." },
 	{ method_test_PMM, "Test _PMM (Power Meter Measurement)." },
 	/* { method_test_PTP, "Test _PTP (Power Trip Points)." }, */
-- 
2.5.0




More information about the fwts-devel mailing list