soc/amd/picasso/acpi: Add a wrapper method WAL1 for calling ALIB function 1

ALIB function 1 needs to be called every time there is a change in
AC/DC state of the system. This change adds a wrapper method that can
be called by PNOT (method to notify system power state change) to
report to ALIB that system power state has changed i.e. AC <-> DC.

Additionally, this change drops the call to ALIB from _INI method
since the PWRS object might not be initialized correctly at that
point. Instead EC makes a call to PNOT when PWRS is initialized.

This wrapper also fixes the value of power state being passed into
ALIB. ALIB expects 0 = AC and 1 = DC. On the other hand, PWRS reports
1 as AC and 0 as DC. WAL1() takes care of inverting the PWRS state
before passing into ALIB.

BUG=b:157752693
TEST=Verified that WAL1() gets called on AC connect/disconnect.

Steps followed:
$ echo 1 > /sys/module/acpi/parameters/aml_debug_output
$ dmesg -w | grep ACPI
[   76.306947] ACPI Debug:  "EC: AC DISCONNECTED"
[   76.307064] ACPI Debug:  "ALIB call: func 1 params 0x03 0x00 0x01"
[   82.264946] ACPI Debug:  "EC: GOT PD EVENT"
[   82.539833] ACPI Debug:  "EC: GOT PD EVENT"
[   82.753721] ACPI Debug:  "EC: GOT PD EVENT"
[   82.843676] ACPI Debug:  "EC: GOT PD EVENT"
[   82.970596] ACPI Debug:  "EC: AC CONNECTED"
[   82.970659] ACPI Debug:  "ALIB call: func 1 params 0x03 0x00 0x00"
[   83.047598] ACPI Debug:  "EC: GOT PD EVENT"
[   84.804733] ACPI Debug:  "EC: GOT PD EVENT"
[   86.317934] ACPI Debug:  "EC: GOT PD EVENT"
[   86.385920] ACPI Debug:  "EC: GOT PD EVENT"
[   86.515830] ACPI Debug:  "EC: AC DISCONNECTED"
[   86.515922] ACPI Debug:  "ALIB call: func 1 params 0x03 0x00 0x01"
[   90.089062] ACPI Debug:  "EC: GOT PD EVENT"
[   90.357914] ACPI Debug:  "EC: GOT PD EVENT"
[   90.573812] ACPI Debug:  "EC: GOT PD EVENT"
[   90.662744] ACPI Debug:  "EC: GOT PD EVENT"
[   90.788706] ACPI Debug:  "EC: AC CONNECTED"
[   90.788835] ACPI Debug:  "ALIB call: func 1 params 0x03 0x00 0x00"
[   90.865675] ACPI Debug:  "EC: GOT PD EVENT"
[   92.621793] ACPI Debug:  "EC: GOT PD EVENT"

Signed-off-by: Furquan Shaikh <furquan@google.com>
Change-Id: I1f2ade28ca35378ebf4647d8df3d2ea4d0b08096
Reviewed-on: https://review.coreboot.org/c/coreboot/+/42297
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Raul Rangel <rrangel@chromium.org>
This commit is contained in:
Furquan Shaikh 2020-06-11 13:46:09 -07:00
parent 80c555d7a8
commit ad78553f5d
2 changed files with 28 additions and 12 deletions

View File

@ -1,8 +1,35 @@
/* SPDX-License-Identifier: GPL-2.0-only */ /* SPDX-License-Identifier: GPL-2.0-only */
/* Required function by EC, Notify OS to re-read CPU tables */ /*
* Wrapper method that calls ALIB function 1 to report current AC/DC state.
*/
Method (WAL1)
{
/* Send ALIB Function 1 the AC/DC state */
Local0 = Buffer (0x03) {}
CreateWordField (Local0, 0, F1SZ)
CreateByteField (Local0, 2, F1DA)
/* First argument is size i.e. 3 bytes */
F1SZ = 3
/*
* Second argument is power state i.e. AC or DC.
* ALIB expects AC = 0, DC = 1.
* PWRS reports AC = 1, DC = 0.
*
* Hence, need to invert the state of PWRS.
*/
F1DA = \PWRS ^ 1
Printf ("ALIB call: func 1 params %o", Local0)
\_SB.ALIB (1, Local0)
}
Method (PNOT) Method (PNOT)
{ {
/* Report AC/DC state to ALIB using WAL1() */
\WAL1 ()
} }
/* /*

View File

@ -128,17 +128,6 @@ Method(_INI, 0, Serialized) {
/* Determine the OS we're running on */ /* Determine the OS we're running on */
OSFL() OSFL()
/* Send ALIB Function 1 the AC/DC state */
Name(F1BF, Buffer(0x03){})
CreateWordField(F1BF, 0, F1SZ)
CreateByteField(F1BF, 2, F1DA)
Store(3, F1SZ)
Store(\PWRS, F1DA)
\_SB.ALIB(1, F1BF)
} /* End Method(_SB._INI) */ } /* End Method(_SB._INI) */
Method(OSFL, 0){ Method(OSFL, 0){