ec/apple: Add ACPI code for Apple MacBooks
- Move ACPI code for Apple MacBooks to a separate directory to avoid
its duplication in mainboards
- Add AC and lid implementations for newer generations
- Rewrite old code using the new ASL syntax
Tested on MBA 5,2, MBP 8,1 and MBP 10,1.
Change-Id: I3d4585aac8e3ebbfed6ce4d4e39fbc33ac983069
Signed-off-by: Evgeny Zinoviev <me@ch1p.io>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/33102
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Angel Pons <th3fanbus@gmail.com>
diff --git a/src/ec/apple/acpi/ac.asl b/src/ec/apple/acpi/ac.asl
new file mode 100644
index 0000000..0103229
--- /dev/null
+++ b/src/ec/apple/acpi/ac.asl
@@ -0,0 +1,28 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+Scope(\_SB.PCI0.LPCB.EC)
+{
+ Field(ERAM, ByteAcc, NoLock, Preserve)
+ {
+ Offset(HPAC_OFFSET),
+ , 1,
+ HPAC, 1, /* AC status */
+ }
+
+ Device(AC)
+ {
+ Name(_HID, "ACPI0003")
+ Name(_UID, 0x00)
+ Name(_PCL, Package() { \_SB } )
+
+ Method(_PSR, 0, NotSerialized)
+ {
+ Return(HPAC)
+ }
+
+ Method(_STA, 0, NotSerialized)
+ {
+ Return(0x0f)
+ }
+ }
+}
diff --git a/src/ec/apple/acpi/battery.asl b/src/ec/apple/acpi/battery.asl
new file mode 100644
index 0000000..291451f
--- /dev/null
+++ b/src/ec/apple/acpi/battery.asl
@@ -0,0 +1,153 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+Field(ERAM, ByteAcc, NoLock, Preserve)
+{
+ Offset(0x20),
+ SPTR, 8,
+ SSTS, 8,
+ SADR, 8,
+ SCMD, 8,
+ SBFR, 256,
+}
+
+Field(ERAM, ByteAcc, Lock, Preserve)
+{
+ Offset(0x24),
+ SBDW, 16,
+}
+
+Method(SBPC, 0, NotSerialized)
+{
+ Local0 = 1000
+ While (Local0)
+ {
+ If (SPTR == 0x00)
+ {
+ Return()
+ }
+
+ Sleep(1)
+ Local0--
+ }
+}
+
+Method(SBRW, 2, NotSerialized)
+{
+ Acquire(ECLK, 0xFFFF)
+ SADR = ShiftLeft(Arg0, 0x01)
+ SCMD = Arg1
+ SPTR = 0x09
+ SBPC()
+ Local0 = SBDW
+ Release(ECLK)
+ Return(Local0)
+}
+
+Method(SBRB, 2, NotSerialized)
+{
+ Acquire(ECLK, 0xFFFF)
+ SADR = ShiftLeft(Arg0, 0x01)
+ SCMD = Arg1
+ SPTR = 0x0B
+ SBPC()
+ Local0 = SBFR
+ Release(ECLK)
+ Return(Local0)
+}
+
+Device(BAT0)
+{
+ Name(_HID, EisaId("PNP0C0A"))
+ Name(_UID, 0x00)
+ Name(_PCL, Package() { \_SB })
+
+ Name(BATS, Package()
+ {
+ 0x00, // 0: PowerUnit: Report in mWh
+ 0xFFFFFFFF, // 1: Design cap
+ 0xFFFFFFFF, // 2: Last full charge cap
+ 0x01, // 3: Battery Technology
+ 10800, // 4: Design Voltage(mV)
+ 0x00, // 5: Warning design capacity
+ 200, // 6: Low design capacity
+ 10, // 7: granularity1
+ 10, // 8: granularity2
+ "", // 9: Model number
+ "", // A: Serial number
+ "", // B: Battery Type
+ "" // C: OEM information
+ })
+
+ Name(BATI, Package()
+ {
+ 0, // Battery State
+ // Bit 0 - discharge
+ // Bit 1 - charge
+ // Bit 2 - critical state
+ 0, // Battery present Rate
+ 0, // Battery remaining capacity
+ 0 // Battery present voltage
+ })
+
+ Method(_BIF, 0, NotSerialized)
+ {
+ Index(BATS, 0x01) = ^^SBRW(0x0B, 0x18) * 10
+ Index(BATS, 0x02) = ^^SBRW(0x0B, 0x10) * 10
+
+ Index(BATS, 0x04) = ^^SBRW(0x0B, 0x19)
+ Index(BATS, 0x09) = ^^SBRB(0x0B, 0x21)
+ Index(BATS, 0x0B) = ^^SBRB(0x0B, 0x22)
+ Index(BATS, 0x0C) = ^^SBRB(0x0B, 0x20)
+
+ Return(BATS)
+ }
+
+ Method(_STA, 0, NotSerialized)
+ {
+ If (^^SBRW(0x0A, 0x01) & 0x01) {
+ Return(0x1f)
+ } else {
+ Return(0x0f)
+ }
+ }
+
+ Method(_BST, 0, NotSerialized)
+ {
+ /* Check for battery presence. */
+ If (!(^^SBRW(0x0A, 0x01) & 0x01)) {
+ Return(Package(4) {
+ 0,
+ 0xFFFFFFFF,
+ 0xFFFFFFFF,
+ 0xFFFFFFFF
+ })
+ }
+
+ Local1 = ^^SBRW(0x0B, 0x09)
+ Index(BATI, 0x03) = Local1
+ Local0 = ^^SBRW(0x0B, 0x0A)
+
+ /* Sign-extend Local0. */
+ If (Local0 & 0x8000)
+ {
+ Local0 = ~Local0
+ Local0++
+ Local0 &= 0xFFFF
+ }
+
+ Local0 *= Local1
+ Index(BATI, 1) = Local0 / 1000
+ Index(BATI, 2) = ^^SBRW(0x0B, 0x0F) * 10
+ If (HPAC) {
+ If (!(^^SBRW(0x0B, 0x16) & 0x40)) {
+ Index(BATI, 0) = 2
+ } Else {
+ Index(BATI, 0) = 0
+ }
+ } Else {
+ Index(BATI, 0) = 1
+ }
+
+ Return(BATI)
+ }
+}
diff --git a/src/ec/apple/acpi/ec.asl b/src/ec/apple/acpi/ec.asl
new file mode 100644
index 0000000..3adb7f6
--- /dev/null
+++ b/src/ec/apple/acpi/ec.asl
@@ -0,0 +1,45 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+Device(EC)
+{
+ Name(_HID, EISAID("PNP0C09"))
+ Name(_UID, 0)
+
+ Name(_GPE, 0x17)
+ Mutex(ECLK, 0)
+
+ OperationRegion(ERAM, EmbeddedControl, 0x00, 0x100)
+
+ /* LID status change. */
+ Method(_Q20, 0, NotSerialized)
+ {
+ Notify(LID, 0x80)
+ }
+
+ /* AC status change. */
+ Method(_Q21, 0, NotSerialized)
+ {
+ Notify(AC, 0x80)
+ }
+
+ Method(_CRS, 0)
+ {
+ Name(ECMD, ResourceTemplate()
+ {
+ IO(Decode16, 0x62, 0x62, 1, 1)
+ IO(Decode16, 0x66, 0x66, 1, 1)
+ })
+ Return(ECMD)
+ }
+
+ Method(_PRW, 0, NotSerialized)
+ {
+ Return(Package () { 0x23, 0x04 })
+ }
+
+ Method(_INI, 0, NotSerialized)
+ {
+ }
+
+#include "battery.asl"
+}
diff --git a/src/ec/apple/acpi/lid.asl b/src/ec/apple/acpi/lid.asl
new file mode 100644
index 0000000..ec91d8f
--- /dev/null
+++ b/src/ec/apple/acpi/lid.asl
@@ -0,0 +1,41 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+Scope(\_SB.PCI0.LPCB.EC)
+{
+ Field(ERAM, ByteAcc, NoLock, Preserve)
+ {
+ Offset(LIDS_OFFSET),
+ LIDS, 1, /* Lid status */
+
+ Offset(WKLD_OFFSET),
+ WKLD, 1, /* Lid wake */
+ }
+
+ Device(LID)
+ {
+ Name(_HID, "PNP0C0D")
+
+ Method(_LID, 0, NotSerialized)
+ {
+ Return(LIDS)
+ }
+
+ Method(_PRW, 0, NotSerialized)
+ {
+#if LIDS_OFFSET == 0x01
+ Return(Package() { 0x1d, 0x03 })
+#else
+ Return(Package() { 0x23, 0x04 })
+#endif
+ }
+
+ Method(_PSW, 1, NotSerialized)
+ {
+ if (Arg0) {
+ WKLD = 1
+ } else {
+ WKLD = 0
+ }
+ }
+ }
+}