From 7b5e304c065a210ad50f4d5c0933b257795805a6 Mon Sep 17 00:00:00 2001 From: Tobias Diedrich Date: Sun, 12 Feb 2017 13:35:37 +0100 Subject: [PATCH] UPSTREAM: ec/lenovo/h8: Guard against EC bugs in the battery status logic. On my Thinkpad with an H8-compatible ENE KB9012 EC (GDHT92WW 1.52), when the battery is nearly full and we switch from battery to AC by plugging in the cable, the current rate will not drop to 0 immediately, but the discharging state is cleared immediately. This leads to the code trying to process an invalid rate value >0x8000, leading to a displayed rate of >1000W. This patch changes the logic to deal with these corner cases. BUG=none BRANCH=none TEST=none Change-Id: Ib0ec4d6bd5ecc128485e89449fca8021c58dd272 Signed-off-by: Patrick Georgi Original-Commit-Id: 9b798d7904f50b8ad83fe43442a5a3da85789bdd Original-Change-Id: Ideb588d00757f259792e5ae97729e371b63a096c Original-Signed-off-by: Tobias Diedrich Original-Reviewed-on: https://review.coreboot.org/18349 Original-Tested-by: build bot (Jenkins) Original-Reviewed-by: Paul Menzel Original-Reviewed-by: Martin Roth Reviewed-on: https://chromium-review.googlesource.com/446391 --- src/ec/lenovo/h8/acpi/battery.asl | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/src/ec/lenovo/h8/acpi/battery.asl b/src/ec/lenovo/h8/acpi/battery.asl index 0ebc9eea9d..fef994a1d6 100644 --- a/src/ec/lenovo/h8/acpi/battery.asl +++ b/src/ec/lenovo/h8/acpi/battery.asl @@ -97,21 +97,36 @@ Method(BSTA, 4, NotSerialized) Store(BAMA, Local1) Store(Arg0, PAGE) /* Battery dynamic information */ + /* + * Present rate is a 16bit signed int, positive while charging + * and negative while discharging. + */ Store(BAPR, Local2) - if (Arg2) // charging + If (Arg2) // Charging { Or(2, Local0, Local0) - - If (LGreaterEqual (Local2, 0x8000)) { + } + Else + { + If (Arg3) // Discharging + { + Or(1, Local0, Local0) + // Negate present rate + Subtract(0x10000, Local2, Local2) + } + Else // Full battery, force to 0 + { Store(0, Local2) } } - if (Arg3) // discharging - { - Or(1, Local0, Local0) - Subtract(0x10000, Local2, Local2) + /* + * The present rate value must be positive now, if it is not we have an + * EC bug or inconsistency and force the value to 0. + */ + If (LGreaterEqual (Local2, 0x8000)) { + Store(0, Local2) } Store(Local0, Index(Arg1, 0x00))