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.

Change-Id: Ideb588d00757f259792e5ae97729e371b63a096c
Signed-off-by: Tobias Diedrich <ranma+coreboot@tdiedrich.de>
Reviewed-on: https://review.coreboot.org/18349
Tested-by: build bot (Jenkins)
Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net>
Reviewed-by: Martin Roth <martinroth@google.com>
This commit is contained in:
Tobias Diedrich 2017-02-12 13:35:37 +01:00 committed by Martin Roth
parent 80c314d64a
commit 9b798d7904
1 changed files with 22 additions and 7 deletions

View File

@ -97,21 +97,36 @@ Method(BSTA, 4, NotSerialized)
Store(BAMA, Local1) Store(BAMA, Local1)
Store(Arg0, PAGE) /* Battery dynamic information */ Store(Arg0, PAGE) /* Battery dynamic information */
/*
* Present rate is a 16bit signed int, positive while charging
* and negative while discharging.
*/
Store(BAPR, Local2) Store(BAPR, Local2)
if (Arg2) // charging If (Arg2) // Charging
{ {
Or(2, Local0, Local0) 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) Store(0, Local2)
} }
} }
if (Arg3) // discharging /*
{ * The present rate value must be positive now, if it is not we have an
Or(1, Local0, Local0) * EC bug or inconsistency and force the value to 0.
Subtract(0x10000, Local2, Local2) */
If (LGreaterEqual (Local2, 0x8000)) {
Store(0, Local2)
} }
Store(Local0, Index(Arg1, 0x00)) Store(Local0, Index(Arg1, 0x00))