ec/starlabs/merlin: Always use ECRD and ECWR when accessing EC memory

Ensure any reads or writes to the EC memory, are performed with ECRD
(Read) and ECWR (Write) as these methods use a mutex.

Also, use local variables to cache reads of the same variable within
a given ACPI method.

This solves:
    Initialized Arguments for Method [ECRD]:  (1 arguments defined for method invocation)
        Arg0:   00000000967261a4 [RefOf] <Node>          Name ECPS RegionField 000000007d4b8073

    ACPI Error: Aborting method \_SB.PCI0.LPCB.EC.ECRD due to previous error (AE_BAD_PARAMETER) (20230628/psparse-529)
    ACPI Error: Aborting method \_SB.PCI0.LPCB.EC.ADP1._PSR due to previous error (AE_BAD_PARAMETER) (20230628/psparse-529)

Change-Id: I0bbb538017cc004bff1989a8017ccfcd1ba9ab5c
Signed-off-by: Sean Rhodes <sean@starlabs.systems>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/84734
Reviewed-by: Matt DeVillier <matt.devillier@gmail.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
Sean Rhodes 2024-10-11 10:22:08 +01:00
commit c018af5e5b
9 changed files with 46 additions and 41 deletions

View file

@ -9,7 +9,7 @@ Device (BAT0)
// Battery Status
// 0x80 BIT1 0x01 = Present
// 0x80 BIT1 0x00 = Not Present
If (ECPS & 0x02)
If (ECRD (RefOf(ECPS)) & 0x02)
{
Return (0x1F)
}
@ -34,20 +34,22 @@ Device (BAT0)
CONFIG_EC_STARLABS_BATTERY_TYPE, // 11: Battery Type
CONFIG_EC_STARLABS_BATTERY_OEM // 12: OEM Information
})
Method (_BIF, 0, NotSerialized)
{
If (B1DC) {
SBIF [1] = B1DC
Local0 = ECRD(RefOf(B1DC))
If (Local0) {
SBIF [1] = Local0
If (B1FC != 0xffff) {
SBIF [2] = B1FC
SBIF [2] = ECRD(RefOf(B1FC))
} Else {
SBIF [2] = B1DC
SBIF [2] = Local0
}
SBIF [4] = B1DV
SBIF [5] = B1DC / 5 // 20%
SBIF [6] = B1DC / 20 // 5%
SBIF [7] = B1DC / 500 // 0.2%
SBIF [8] = B1DC / 500 // 0.2%
SBIF [4] = ECRD(RefOf(B1DV))
SBIF [5] = Local0 / 5 // 20%
SBIF [6] = Local0 / 20 // 5%
SBIF [7] = Local0 / 500 // 0.2%
SBIF [8] = Local0 / 500 // 0.2%
}
Return (SBIF)
}
@ -83,21 +85,22 @@ Device (BAT0)
})
Method (_BIX, 0, NotSerialized)
{
If (B1DC) {
XBIF [2] = B1DC
Local0 = ECRD(RefOf(B1DC))
If (Local0) {
XBIF [2] = Local0
If (B1FC != 0xffff) {
XBIF [3] = B1FC
XBIF [3] = ECRD(RefOf(B1FC))
} Else {
XBIF [3] = B1DC
XBIF [3] = Local0
}
XBIF [5] = B1DV
XBIF [6] = B1DC / 5 // 20%
XBIF [7] = B1DC / 20 // 5%
XBIF [5] = ECRD(RefOf(B1DV))
XBIF [6] = Local0 / 5 // 20%
XBIF [7] = Local0 / 20 // 5%
If (B1CC != 0xffff) {
XBIF [8] = B1CC
XBIF [8] = ECRD(RefOf(B1CC))
}
XBIF [14] = B1DC / 500 // 0.2%
XBIF [15] = B1DC / 500 // 0.2%
XBIF [14] = Local0 / 500 // 0.2%
XBIF [15] = Local0 / 500 // 0.2%
}
Return (XBIF)
}
@ -111,14 +114,16 @@ Device (BAT0)
})
Method (_BST, 0, NotSerialized)
{
PKG1[0] = (B1ST & 0x07)
PKG1[1] = B1PR
If (B1RC != 0xffff) {
PKG1[2] = B1RC
PKG1[0] = (ECRD(RefOf(B1ST)) & 0x07)
PKG1[1] = ECRD(RefOf(B1PR))
Local0 = ECRD(RefOf(B1RC))
If (Local0 != 0xffff) {
PKG1[2] = Local0
} Else {
PKG1[2] = (B1RP * B1DC) / 100
PKG1[2] = (ECRD(RefOf(B1RP)) * ECRD(RefOf(B1DC))) / 100
}
PKG1[3] = B1PV
PKG1[3] = ECRD(RefOf(B1PV))
Return (PKG1)
}
Method (_PCL, 0, NotSerialized)

View file

@ -147,10 +147,10 @@ Scope (\_SB.PCI0.LPCB)
ECAV = 0x01
// Initialise the Lid State
\LIDS = LSTE
\LIDS = ECRD(RefOf(LSTE))
// Initialise the OS State
OSFG = 0x01
ECWR(0x01, RefOf(OSFG))
// Initialise the Power State
PWRS = (ECRD (RefOf(ECPS)) & 0x01)

View file

@ -68,7 +68,7 @@ Method (RPTS, 1, Serialized)
* Disable ACPI support.
* This should always be the last action before entering S4 or S5.
*/
\_SB.PCI0.LPCB.EC.OSFG = 0x00
\_SB.PCI0.LPCB.EC.ECWR(0x00, RefOf(\_SB.PCI0.LPCB.EC.OSFG))
}
Method (RWAK, 1, Serialized)
@ -77,7 +77,7 @@ Method (RWAK, 1, Serialized)
* Enable ACPI support.
* This should always be the first action when exiting S4 or S5.
*/
\_SB.PCI0.LPCB.EC.OSFG = 0x01
\_SB.PCI0.LPCB.EC.ECWR(0x01, RefOf(\_SB.PCI0.LPCB.EC.OSFG))
/* Restore EC settings from CMOS */
Switch (ToInteger (\_SB.PCI0.LPCB.TPLC))

View file

@ -2,13 +2,13 @@
Method (_Q0D, 0, NotSerialized) // Event: Lid Opened
{
\LIDS = LSTE
\LIDS = ECRD(RefOf(LSTE))
Notify (LID0, 0x80)
}
Method (_Q0C, 0, NotSerialized) // Event: Lid Closed
{
\LIDS = LSTE
\LIDS = ECRD(RefOf(LSTE))
Notify (LID0, 0x80)
}

View file

@ -74,13 +74,13 @@ Method (_Q0B, 0, NotSerialized) // Event: AC Power Disconnected
Method (_Q0C, 0, NotSerialized) // Event: Lid Closed
{
\LIDS = LSTE
\LIDS = ECRD(RefOf(LSTE))
Notify (LID0, 0x80)
}
Method (_Q0D, 0, NotSerialized) // Event: Lid Opened
{
\LIDS = LSTE
\LIDS = ECRD(RefOf(LSTE))
Notify (LID0, 0x80)
}

View file

@ -2,13 +2,13 @@
Method (_Q0D, 0, NotSerialized) // Event: Lid Opened
{
\LIDS = LSTE
\LIDS = ECRD(RefOf(LSTE))
Notify (LID0, 0x80)
}
Method (_Q0C, 0, NotSerialized) // Event: Lid Closed
{
\LIDS = LSTE
\LIDS = ECRD(RefOf(LSTE))
Notify (LID0, 0x80)
}

View file

@ -2,13 +2,13 @@
Method (_Q0D, 0, NotSerialized) // Event: Lid Opened
{
\LIDS = LSTE
\LIDS = ECRD(RefOf(LSTE))
Notify (LID0, 0x80)
}
Method (_Q0C, 0, NotSerialized) // Event: Lid Closed
{
\LIDS = LSTE
\LIDS = ECRD(RefOf(LSTE))
Notify (LID0, 0x80)
}

View file

@ -2,13 +2,13 @@
Method (_Q0D, 0, NotSerialized) // Event: Lid Opened
{
\LIDS = LSTE
\LIDS = ECRD(RefOf(LSTE))
Notify (LID0, 0x80)
}
Method (_Q0C, 0, NotSerialized) // Event: Lid Closed
{
\LIDS = LSTE
\LIDS = ECRD(RefOf(LSTE))
Notify (LID0, 0x80)
}

View file

@ -22,6 +22,6 @@ Method (_Q0B, 0, NotSerialized) // Event: Battery Information Update
Method (_Q0C, 0, NotSerialized) // Event: Lid Opened or Closed
{
\LIDS = LSTE
\LIDS = ECRD(RefOf(LSTE))
Notify (LID0, 0x80)
}