[PATCH] acpi/method: check full and battery power if acpi_video0 exists

Alex Hung alex.hung at canonical.com
Fri Apr 19 05:57:43 UTC 2019


8b9e5e4c07f4 added checks for full and battery power in _BCL list,
but ACPI spec does not necessary ask them to be included (please
see examples in ACPI spec B.5.2). However, Linux kernel relies on this
behaviours.

Let's only check full and battery power only if acpi_video0 interface is
used.

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

diff --git a/src/acpi/method/method.c b/src/acpi/method/method.c
index 635c4813..5a4de7b3 100644
--- a/src/acpi/method/method.c
+++ b/src/acpi/method/method.c
@@ -5741,6 +5741,7 @@ static void method_test_BCL_return(
 	bool ascending_levels = false;
 	bool matching_levels;
 	char *str = NULL;
+	DIR *acpi_video_dir;
 
 	FWTS_UNUSED(private);
 
@@ -5791,40 +5792,45 @@ static void method_test_BCL_return(
 		failed = true;
 	}
 
-	matching_levels = false;
-	for (i = 2; i < obj->Package.Count; i++) {
-		if (obj->Package.Elements[0].Integer.Value ==
-		    obj->Package.Elements[i].Integer.Value) {
-			matching_levels = true;
-			break;
+	acpi_video_dir = opendir("/sys/class/backlight/acpi_video0");
+	if (acpi_video_dir) {
+		matching_levels = false;
+		for (i = 2; i < obj->Package.Count; i++) {
+			if (obj->Package.Elements[0].Integer.Value ==
+			    obj->Package.Elements[i].Integer.Value) {
+				matching_levels = true;
+				break;
+			}
 		}
-	}
 
-	if (!matching_levels) {
-		failed = true;
-		fwts_failed(fw, LOG_LEVEL_CRITICAL,
-			"Method_BCLFullNotInList",
-			"brightness level on full power (%" PRIu64
-			") is not in brightness levels.",
-			obj->Package.Elements[0].Integer.Value);
-	}
+		if (!matching_levels) {
+			failed = true;
+			fwts_failed(fw, LOG_LEVEL_CRITICAL,
+				"Method_BCLFullNotInList",
+				"brightness level on full power (%" PRIu64
+				") is not in brightness levels.",
+				obj->Package.Elements[0].Integer.Value);
+		}
 
-	matching_levels = false;
-	for (i = 2; i < obj->Package.Count; i++) {
-		if (obj->Package.Elements[1].Integer.Value ==
-		    obj->Package.Elements[i].Integer.Value) {
-			matching_levels = true;
-			break;
+		matching_levels = false;
+		for (i = 2; i < obj->Package.Count; i++) {
+			if (obj->Package.Elements[1].Integer.Value ==
+			    obj->Package.Elements[i].Integer.Value) {
+				matching_levels = true;
+				break;
+			}
 		}
-	}
 
-	if (!matching_levels) {
-		failed = true;
-		fwts_failed(fw, LOG_LEVEL_CRITICAL,
-			"Method_BCLBatteryNotInList",
-			"brightness level on battery (%" PRIu64
-			") is not in brightness levels.",
-			obj->Package.Elements[1].Integer.Value);
+		if (!matching_levels) {
+			failed = true;
+			fwts_failed(fw, LOG_LEVEL_CRITICAL,
+				"Method_BCLBatteryNotInList",
+				"brightness level on battery (%" PRIu64
+				") is not in brightness levels.",
+				obj->Package.Elements[1].Integer.Value);
+		}
+
+		closedir(acpi_video_dir);
 	}
 
 	fwts_log_info(fw, "Brightness levels for %s:" ,name);
-- 
2.17.1




More information about the fwts-devel mailing list