Skip to contentSkip to conversation

disable _BQC/_BCQ if it returns invalid values

PATCH In review Hector Martin 2 participants 3 messages Jul 8, 2009 – Jul 9, 2009 ACPI

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 disable _BQC/_BCQ if it returns invalid values

Validate the result of the _BQC or _BCQ method when querying the current backlight level. If the value is out of range, the support for this method is disabled. This does not break functionality as long as the hardware doesn't touch the backlight level on it own, since the driver will just use the last cached value.

Acer Aspire 8930G with BIOS v1.10 (latest) has this issue.

drivers/acpi/video.c +17 -3
@@ -602,15 +605,29 @@ acpi_video_device_lcd_get_level_current(
 						NULL, level);
 		if (ACPI_SUCCESS(status)) {
 			if (device->brightness->flags._BQC_use_index) {
+				if (*level >= (device->brightness->count - 2)) {
+					ACPI_WARNING((AE_INFO,
+						"%s is broken (returned %llu)",
+						buf, *level));
+					device->cap._BQC = device->cap._BCQ = 0;
+					*level = device->brightness->curr;
+					return 0;
+				}
 				if (device->brightness->flags._BCL_reversed)
 					*level = device->brightness->count
 								 - 3 - (*level);
 				*level = device->brightness->levels[*level + 2];
 
 			}
-			*level += bqc_offset_aml_bug_workaround;
-			device->brightness->curr = *level;
-			return 0;
+			if (*level > 100) {
+				ACPI_WARNING((AE_INFO, "%s is broken "
+					"(returned %llu)", buf, *level));
+				device->cap._BQC = device->cap._BCQ = 0;
+			} else {
+				*level += bqc_offset_aml_bug_workaround;
+				device->brightness->curr = *level;
+				return 0;
+			}
 		} else {
 			/* Fixme:
 			 * should we return an error or ignore this failure?
Signature · 2 lines
Hector Martin ([email protected])
Public Key: http://www.marcansoft.com/marcan.asc
#1 lore raw
Quoted 25 lines · Hector Martin

Validate the result of the _BQC or _BCQ method when querying the current backlight level. If the value is out of range, the support for this method is disabled. This does not break functionality as long as the hardware doesn't touch the backlight level on it own, since the driver will just use the last cached value.

Acer Aspire 8930G with BIOS v1.10 (latest) has this issue.

drivers/acpi/video.c +8 -0
@@ -602,15 +605,29 @@ acpi_video_device_lcd_get_level_current(
 						NULL, level);
 		if (ACPI_SUCCESS(status)) {
 			if (device->brightness->flags._BQC_use_index) {
+				if (*level >= (device->brightness->count - 2)) {
+					ACPI_WARNING((AE_INFO,
+						"%s is broken (returned %llu)",
+						buf, *level));
+					device->cap._BQC = device->cap._BCQ = 0;
+					*level = device->brightness->curr;
+					return 0;
+				}
 				if (device->brightness->flags._BCL_reversed)
 					*level = device->brightness->count

drivers/acpi/video.c acpi_video_device_lcd_get_level_current( · line 624

Quoted 10 lines
drivers/acpi/video.c +3 -3
 								 - 3 - (*level);
 				*level = device->brightness->levels[*level + 2];
 
 			}
-			*level += bqc_offset_aml_bug_workaround;
-			device->brightness->curr = *level;
-			return 0;
+			if (*level > 100) {
+				ACPI_WARNING((AE_INFO, "%s is broken "
+					"(returned %llu)", buf, *level));

_BQC returns a value larger than 100?
is this true on your laptop?

thanks,
rui

Quoted 11 lines
drivers/acpi/video.c +6 -0
+				device->cap._BQC = device->cap._BCQ = 0;
+			} else {
+				*level += bqc_offset_aml_bug_workaround;
+				device->brightness->curr = *level;
+				return 0;
+			}
 		} else {
 			/* Fixme:
 			 * should we return an error or ignore this failure?
#2 lore raw
Quoted 2 lines · Zhang Rui

_BQC returns a value larger than 100?
is this true on your laptop?

Yes, it returns random garbage. It is completely broken. There's an if() in the ASL that disables the entire method (including no valid return value) when a certain EC SRAM register is 0. The backlight code also constantly clears this register. I suppose the EC should theoretically set it at some point, but it doesn't (at least not reliably). In any case, _BQC isn't needed here since the hardware doesn't change the screen brightness autonomously, and disabling the method as soon as it misbehaves works just fine.

Signature · 2 lines
Hector Martin ([email protected])
Public Key: http://www.marcansoft.com/marcan.asc