summaryrefslogtreecommitdiff
path: root/src/mainboard/lenovo/s230u/acpi
diff options
context:
space:
mode:
authorTobias Diedrich <ranma+openocd@tdiedrich.de>2017-02-12 14:09:06 +0100
committerMartin Roth <martinroth@google.com>2017-02-20 18:21:56 +0100
commitcee930a39b183260ea83ac72fc9ca59d61353d8d (patch)
treeb3fd18b7a202b837fc512e2b71a599956fdbbdee /src/mainboard/lenovo/s230u/acpi
parent97535558f1a1c123a60d73244d835ff5d8d31213 (diff)
lenovo/s230u: Add Thinkpad Twist (S230U)
Created using autoport plus some manual work and copying from G505S to account for the non-H8 EC. This model uses the same ENE KB9012 EC as the G505S. Tested: - Mainboard variant with 8GB Elpida DDR3 - SeaBIOS payload - Booting into Linux 4.9.6 with Debian/unstable installed on the internal HDD/SDD slot - Native raminit - Both native VGA init and option rom VGA init - Basic TPM functionality (auto-detection and RNG) - Battery status readout - Basic ACPI functions (power button event; power-off; reboot) - thinkpad-acpi hotkey functions - thinkpad-acpi LED control (red thinkpad LED) - Suspend to RAM and resume works - Mini displayport output works Known issues: - Patches needed for EC battery support https://review.coreboot.org/#/c/18348/ https://review.coreboot.org/#/c/18349/ - No thermal zone since temperature sensing is not H8-compatible and needs to be reverse engineered. Not tested: - msata/wwan (probably works) Signed-off-by: Tobias Diedrich <ranma+coreboot@tdiedrich.de> Change-Id: I52bc4515277e5c18afbb14a80a9ac788049f485c Reviewed-on: https://review.coreboot.org/18351 Tested-by: build bot (Jenkins) Reviewed-by: Patrick Rudolph <siro@das-labor.org>
Diffstat (limited to 'src/mainboard/lenovo/s230u/acpi')
-rw-r--r--src/mainboard/lenovo/s230u/acpi/ec.asl364
-rw-r--r--src/mainboard/lenovo/s230u/acpi/gpe.asl57
-rw-r--r--src/mainboard/lenovo/s230u/acpi/platform.asl50
-rw-r--r--src/mainboard/lenovo/s230u/acpi/superio.asl1
4 files changed, 472 insertions, 0 deletions
diff --git a/src/mainboard/lenovo/s230u/acpi/ec.asl b/src/mainboard/lenovo/s230u/acpi/ec.asl
new file mode 100644
index 0000000000..b59c269ebf
--- /dev/null
+++ b/src/mainboard/lenovo/s230u/acpi/ec.asl
@@ -0,0 +1,364 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (c) 2011 Sven Schnelle <svens@stackframe.org>
+ * Copyright (c) 2013 Vladimir Serbinenko <phcoder@gmail.com>
+ * Copyright (c) 2017 Tobias Diedrich <ranma+coreboot@tdiedrich.de>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; version 2 of
+ * the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+Device (EC0)
+{
+ Name (_HID, EISAID ("PNP0C09"))
+ Name (_UID, 0)
+
+ Name (_GPE, THINKPAD_EC_GPE)
+ Mutex (ECLK, 0x07)
+
+ /* EmbeddedControl should work as well, but memory mapped is faster. */
+ OperationRegion (ERAM, SystemMemory, (CONFIG_EC_BASE_ADDRESS + 0x100), 0x100)
+ Field (ERAM, ByteAcc, Lock, Preserve)
+ {
+ Offset(0x00),
+ , 1,
+ , 1,
+ HKFA, 1, // FN lock (Hotkey / FN row toggle)
+ , 1,
+ , 1,
+ , 1,
+ , 1,
+
+ Offset(0x0c),
+ HLCL, 8, // LED control
+
+ Offset(0x46),
+ , 4,
+ ONAC, 1,
+ , 3,
+
+ Offset(0x81),
+ PAGE, 8,
+ }
+
+ /* Battery info page 0 */
+ Field (ERAM, ByteAcc, NoLock, Preserve)
+ {
+ Offset(0xA0),
+ SBRC, 16, /* Remaining capacity */
+ SBFC, 16, /* Full-charge capacity */
+ SBAE, 16,
+ SBRS, 16,
+ SBAC, 16, /* Present rate */
+ SBVO, 16, /* Present voltage */
+ SBAF, 16,
+ SBBS, 16,
+ }
+
+ /* Battery info page 1 */
+ Field (ERAM, ByteAcc, NoLock, Preserve)
+ {
+ Offset (0xA0),
+ , 15,
+ SBCM, 1, /* Power unit (0 == mA/mAh, 1 == mW/mWh) */
+ SBMD, 16,
+ SBCC, 16,
+ }
+
+ /* Battery info page 2 */
+ Field (ERAM, ByteAcc, NoLock, Preserve)
+ {
+ Offset (0xA0),
+ SBDC, 16, /* Design Capacity */
+ SBDV, 16, /* Design Voltage */
+ SBOM, 16,
+ SBSI, 16,
+ SBDT, 16,
+ SBSN, 16, /* Serial number */
+ }
+
+ /* Battery info page 4 */
+ Field (ERAM, ByteAcc, NoLock, Preserve)
+ {
+ Offset (0xA0),
+ SBCH, 32, /* Type (LiON) */
+ }
+
+ /* Battery info page 5 */
+ Field (ERAM, ByteAcc, NoLock, Preserve)
+ {
+ Offset (0xA0),
+ SBMN, 128, /* Manufacturer */
+ }
+
+ /* Battery info page 6 */
+ Field (ERAM, ByteAcc, NoLock, Preserve)
+ {
+ Offset (0xA0),
+ SBDN, 128, /* Model */
+ }
+
+ Method (_CRS, 0, Serialized)
+ {
+ Name (ECMD, ResourceTemplate()
+ {
+ IO (Decode16, 0x62, 0x62, 0, 1)
+ IO (Decode16, 0x66, 0x66, 0, 1)
+ IO (Decode16, 0x700, 0x700, 0, 8)
+ Memory32Fixed(ReadOnly, CONFIG_EC_BASE_ADDRESS, 0x1000, FF00)
+ })
+ Return (ECMD)
+ }
+
+ /* Increase brightness hotkey */
+ Method (_Q14, 0, NotSerialized) {
+ BRIGHTNESS_UP()
+ ^HKEY.MHKQ (0x1010)
+ }
+
+ /* Decrease brightness hotkey */
+ Method (_Q15, 0, NotSerialized) {
+ BRIGHTNESS_DOWN()
+ ^HKEY.MHKQ (0x1011)
+ }
+
+ /* Video output switch hotkey */
+ Method (_Q16, 0, NotSerialized) {
+ Notify (ACPI_VIDEO_DEVICE, 0x82)
+ ^HKEY.MHKQ (0x1007)
+ }
+
+ Method (_Q19, 0, NotSerialized)
+ {
+ ^HKEY.MHKQ (0x1018)
+ }
+
+ /* Switched to AC power */
+ Method (_Q26, 0, NotSerialized)
+ {
+ Store (One, PWRS)
+ Notify (^AC, 0x80)
+ Notify (^BAT0, 0x80)
+ \PNOT ()
+ ^HKEY.MHKQ (0x6040)
+ }
+
+ /* Switched to battery power */
+ Method (_Q27, 0, NotSerialized)
+ {
+ Store (Zero, PWRS)
+ Notify (^AC, 0x80)
+ Notify (^BAT0, 0x80)
+ \PNOT ()
+ ^HKEY.MHKQ (0x6040)
+ }
+
+ /* Lid openend */
+ Method (_Q2A, 0, NotSerialized)
+ {
+ Store (One, LIDS)
+ Notify(^LID, 0x80)
+ ^HKEY.MHKQ (0x5002)
+ }
+
+ /* Lid closed */
+ Method (_Q2B, 0, NotSerialized)
+ {
+ Store (Zero, LIDS)
+ Notify(^LID, 0x80)
+ ^HKEY.MHKQ (0x5001)
+ }
+
+ /* Tablet swivel down */
+ Method (_Q35, 0, NotSerialized)
+ {
+ ^HKEY.MHKQ (0x60c0)
+ ^HKEY.MHKQ (0x500a)
+ }
+
+ /* Tablet swivel up */
+ Method (_Q36, 0, NotSerialized)
+ {
+ ^HKEY.MHKQ (0x60c0)
+ ^HKEY.MHKQ (0x5009)
+ }
+
+ /* Tablet rotate lock button */
+ Method (_Q37, 0, NotSerialized)
+ {
+ ^HKEY.MHKQ (0x6020)
+ }
+
+ /* Numlock pressed */
+ Method (_Q3F, 0, NotSerialized)
+ {
+ ^HKEY.MHKQ (0x6000)
+ }
+
+ /* RFKill status changed */
+ Method (_Q41, 0, NotSerialized) {
+ ^HKEY.MHKQ (0x7000)
+ }
+
+ /* Mute hotkey */
+ Method (_Q43, 0, NotSerialized) {
+ ^HKEY.MHKQ (0x1017)
+ }
+
+ /* Settings hotkey */
+ Method (_Q5A, 0, NotSerialized)
+ {
+ ^HKEY.MHKQ (0x101D)
+ }
+
+ /* Search hotkey */
+ Method (_Q5B, 0, NotSerialized)
+ {
+ ^HKEY.MHKQ (0x101E)
+ }
+
+ /* Scale hotkey */
+ Method (_Q5C, 0, NotSerialized)
+ {
+ ^HKEY.MHKQ (0x101F)
+ }
+
+ /* File hotkey */
+ Method (_Q5D, 0, NotSerialized)
+ {
+ ^HKEY.MHKQ (0x1020)
+ }
+
+ /* RFkill hotkey */
+ Method (_Q64, 0, NotSerialized) {
+ ^HKEY.MHKQ (0x1005)
+ }
+
+ /* Mic mute hotkey */
+ Method (_Q6A, 0, NotSerialized)
+ {
+ ^HKEY.MHKQ (0x101B)
+ }
+
+ /* FN key pressed */
+ Method (_Q70, 0, NotSerialized) { }
+
+ /* FN+Esc pressed / FN row mode switch */
+ Method (_Q74, 0, NotSerialized) {
+ XOr(One, HKFA, HKFA)
+ ^HKEY.MHKQ (0x6060)
+ }
+
+ /* Implements enough of the Lenovo hotkey device for
+ * thinkpad-acpi to work, no real support for hotkey masking */
+ Device (HKEY)
+ {
+ Name (_HID, EisaId ("LEN0068"))
+
+ Name (DHKC, Zero)
+ Name (DHKV, Zero)
+ Name (DHKN, 0xFC018070) // Hotkey mask
+ Mutex (XDHK, 0x07)
+
+ Method (_STA, 0, NotSerialized)
+ {
+ Return (0x0F)
+ }
+
+ Method (MHKV, 0, NotSerialized)
+ {
+ Return (0x0100) // Interface version 1.0
+ }
+
+ Method (MHKA, 0, NotSerialized) // Hotkey all mask
+ {
+ Return (0xFFFFFFFF)
+ }
+
+ Method (MHKM, 2, NotSerialized) // Set hotkey mask
+ {
+ Acquire (XDHK, 0xFFFF)
+
+ ShiftLeft (One, Decrement (Arg0), Local0)
+ If (Arg1) {
+ Or (Local0, DHKN, DHKN)
+ } Else {
+ And (Not(Local0), DHKN, DHKN)
+ }
+
+ Release (XDHK)
+ }
+
+ Method (MHKC, 1, NotSerialized) // Hotkey disable?
+ {
+ Acquire (XDHK, 0xFFFF)
+
+ Store (Arg0, DHKC)
+
+ Release (XDHK)
+ }
+
+ Method (MHKP, 0, NotSerialized) // Hotkey poll
+ {
+ Acquire (XDHK, 0xFFFF)
+
+ Store (Zero, Local0)
+
+ if (DHKV) {
+ Store (DHKV, Local0)
+ Store (Zero, DHKV)
+ }
+
+ Release (XDHK)
+
+ Return (Local0)
+ }
+
+ Method (MHKQ, 1, NotSerialized) // Send hotkey event
+ {
+ Acquire (XDHK, 0xFFFF)
+
+ Store (Arg0, DHKV)
+
+ Release (XDHK)
+
+ Notify (HKEY, 0x80) // Status Change
+ }
+ }
+
+ /* LED support for thinkpad-acpi */
+ Method (LED, 2, NotSerialized)
+ {
+ Or (Arg0, Arg1, HLCL)
+ }
+
+ Device (AC)
+ {
+ Name (_HID, "ACPI0003")
+ Name (_PCL, Package (1) { \_SB })
+
+ Method (_PSR, 0, NotSerialized)
+ {
+ Return (ONAC)
+ }
+ Method (_STA, 0, NotSerialized)
+ {
+ Return (0x0F)
+ }
+ }
+
+ /* Battery is H8 compatible, but requires an explicit delay */
+ #define BATTERY_PAGE_DELAY_MS 20
+ #include <ec/lenovo/h8/acpi/battery.asl>
+
+ /* LID is H8 compatible */
+ #include <ec/lenovo/h8/acpi/lid.asl>
+}
diff --git a/src/mainboard/lenovo/s230u/acpi/gpe.asl b/src/mainboard/lenovo/s230u/acpi/gpe.asl
new file mode 100644
index 0000000000..a69f5629b1
--- /dev/null
+++ b/src/mainboard/lenovo/s230u/acpi/gpe.asl
@@ -0,0 +1,57 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (c) 2017 Tobias Diedrich <ranma+coreboot@tdiedrich.de>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; version 2 of
+ * the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+Scope (_GPE)
+{
+ Field(GPIO, ByteAcc, NoLock, Preserve)
+ {
+ Offset(0x2c), // GPIO Invert
+ , 2,
+ GV02, 1,
+ , 1,
+ GV04, 1,
+ }
+
+ Name (PDET, Zero)
+ Method (PNOT, 2, Serialized) {
+ ShiftLeft (Arg0, Arg1, Local0)
+ Not( ShiftLeft (One, Arg1), Local1)
+ Or (Local0, And (Local1, PDET), PDET)
+ If (LEqual (PDET, Zero)) {
+ // Palm removed
+ \_SB.PCI0.LPCB.EC0.HKEY.MHKQ (0x60B1)
+ } Else {
+ // Palm detected
+ \_SB.PCI0.LPCB.EC0.HKEY.MHKQ (0x60B0)
+ }
+ }
+
+ /* Palm detect sensor 1 */
+ Method (_L12, 0, NotSerialized) {
+ // Invert trigger
+ Store(GP02, GV02)
+
+ PNOT (GP02, 0)
+ }
+
+ /* Palm detect sensor 2 */
+ Method (_L14, 0, NotSerialized) {
+ // Invert trigger
+ Store(GP04, GV04)
+
+ PNOT (GP04, 1)
+ }
+}
diff --git a/src/mainboard/lenovo/s230u/acpi/platform.asl b/src/mainboard/lenovo/s230u/acpi/platform.asl
new file mode 100644
index 0000000000..d90715ab51
--- /dev/null
+++ b/src/mainboard/lenovo/s230u/acpi/platform.asl
@@ -0,0 +1,50 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (c) 2017 Tobias Diedrich <ranma+coreboot@tdiedrich.de>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; version 2 of
+ * the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+Method(_WAK,1)
+{
+ /* Turn on radios */
+ Store (One, GP33) /* WLBT_OFF_5# (To pin 5 of WiFi mPCIe) */
+ Store (One, GP36) /* WLBT_OFF_51# (To pin 51 of WiFi mPCIe) */
+ /* There also is RF_OFF# on pin 20, controlled by the EC */
+
+ Return(Package(){0,0})
+}
+
+Method(_PTS,1)
+{
+ /* Turn off radios */
+ Store (Zero, GP33) /* WLBT_OFF_5# (To pin 5 of WiFi mPCIe) */
+ Store (Zero, GP36) /* WLBT_OFF_51# (To pin 51 of WiFi mPCIe) */
+ /* There also is RF_OFF# on pin 20, controlled by the EC */
+}
+
+Scope(\_SI)
+{
+ Method(_SST, 1, NotSerialized)
+ {
+ If (LLess(Arg0, 2))
+ {
+ /* Thinkpad LED on */
+ \_SB.PCI0.LPCB.EC0.LED (Zero, 0x80)
+ }
+ Else
+ {
+ /* Thinkpad LED blinking */
+ \_SB.PCI0.LPCB.EC0.LED (Zero, 0xC0)
+ }
+ }
+}
diff --git a/src/mainboard/lenovo/s230u/acpi/superio.asl b/src/mainboard/lenovo/s230u/acpi/superio.asl
new file mode 100644
index 0000000000..f2b35ba9c1
--- /dev/null
+++ b/src/mainboard/lenovo/s230u/acpi/superio.asl
@@ -0,0 +1 @@
+#include <drivers/pc80/pc/ps2_controller.asl>