Move the EC support code from the X60 mainboard to a generic
driver, as this EC is used in many thinkpads. Also move the
ACPI code to this directory for this reason.
This patch also adds a chip config, so that the initial setting
for basic register can be specified in devicetree.cb
Signed-off-by: Sven Schnelle <svens(a)stackframe.org>
---
src/ec/lenovo/Kconfig | 1 +
src/ec/lenovo/Makefile.inc | 1 +
src/ec/lenovo/h8/Kconfig | 3 +
src/ec/lenovo/h8/Makefile.inc | 1 +
src/ec/lenovo/h8/acpi/ac.asl | 44 +++
src/ec/lenovo/h8/acpi/battery.asl | 296 +++++++++++++++++++
src/ec/lenovo/h8/acpi/beep.asl | 32 ++
src/ec/lenovo/h8/acpi/ec.asl | 122 ++++++++
src/ec/lenovo/h8/acpi/lid.asl | 54 ++++
src/ec/lenovo/h8/acpi/sleepbutton.asl | 49 ++++
src/ec/lenovo/h8/acpi/systemstatus.asl | 63 ++++
src/ec/lenovo/h8/acpi/thermal.asl | 41 +++
src/ec/lenovo/h8/chip.h | 36 +++
src/ec/lenovo/h8/h8.c | 129 +++++++++
src/ec/lenovo/h8/h8.h | 111 +++++++
src/ec/lenovo/pmh7/pmh7.c | 9 +
src/ec/lenovo/pmh7/pmh7.h | 1 +
src/mainboard/emulation/qemu | 368 ++++++++++++++++++++++++
src/mainboard/emulation/qemu-x86/dmi.h | 29 ++
src/mainboard/lenovo/x60/Kconfig | 2 +-
src/mainboard/lenovo/x60/acpi/ac.asl | 44 ---
src/mainboard/lenovo/x60/acpi/battery.asl | 296 -------------------
src/mainboard/lenovo/x60/acpi/beep.asl | 32 --
src/mainboard/lenovo/x60/acpi/dock.asl | 56 +++--
src/mainboard/lenovo/x60/acpi/ec.asl | 129 +--------
src/mainboard/lenovo/x60/acpi/gpe.asl | 4 +-
src/mainboard/lenovo/x60/acpi/lid.asl | 54 ----
src/mainboard/lenovo/x60/acpi/sleepbutton.asl | 49 ----
src/mainboard/lenovo/x60/acpi/systemstatus.asl | 66 -----
src/mainboard/lenovo/x60/acpi/thermal.asl | 41 ---
src/mainboard/lenovo/x60/devicetree.cb | 18 ++-
src/mainboard/lenovo/x60/dsdt.asl | 7 +-
src/mainboard/lenovo/x60/mainboard.c | 62 +----
33 files changed, 1451 insertions(+), 799 deletions(-)
create mode 100644 src/ec/lenovo/h8/Kconfig
create mode 100644 src/ec/lenovo/h8/Makefile.inc
create mode 100644 src/ec/lenovo/h8/acpi/ac.asl
create mode 100644 src/ec/lenovo/h8/acpi/battery.asl
create mode 100644 src/ec/lenovo/h8/acpi/beep.asl
create mode 100644 src/ec/lenovo/h8/acpi/ec.asl
create mode 100644 src/ec/lenovo/h8/acpi/lid.asl
create mode 100644 src/ec/lenovo/h8/acpi/sleepbutton.asl
create mode 100644 src/ec/lenovo/h8/acpi/systemstatus.asl
create mode 100644 src/ec/lenovo/h8/acpi/thermal.asl
create mode 100644 src/ec/lenovo/h8/chip.h
create mode 100644 src/ec/lenovo/h8/h8.c
create mode 100644 src/ec/lenovo/h8/h8.h
create mode 100644 src/mainboard/emulation/qemu
create mode 100644 src/mainboard/emulation/qemu-x86/dmi.h
delete mode 100644 src/mainboard/lenovo/x60/acpi/ac.asl
delete mode 100644 src/mainboard/lenovo/x60/acpi/battery.asl
delete mode 100644 src/mainboard/lenovo/x60/acpi/beep.asl
delete mode 100644 src/mainboard/lenovo/x60/acpi/lid.asl
delete mode 100644 src/mainboard/lenovo/x60/acpi/sleepbutton.asl
delete mode 100644 src/mainboard/lenovo/x60/acpi/systemstatus.asl
delete mode 100644 src/mainboard/lenovo/x60/acpi/thermal.asl
diff --git a/src/ec/lenovo/Kconfig b/src/ec/lenovo/Kconfig
index b564b62..73f11ca 100644
--- a/src/ec/lenovo/Kconfig
+++ b/src/ec/lenovo/Kconfig
@@ -1 +1,2 @@
+source src/ec/lenovo/h8/Kconfig
source src/ec/lenovo/pmh7/Kconfig
diff --git a/src/ec/lenovo/Makefile.inc b/src/ec/lenovo/Makefile.inc
index f9a3feb..8865030 100644
--- a/src/ec/lenovo/Makefile.inc
+++ b/src/ec/lenovo/Makefile.inc
@@ -1 +1,2 @@
+subdirs-$(CONFIG_EC_LENOVO_H8) += h8
subdirs-$(CONFIG_EC_LENOVO_PMH7) += pmh7
diff --git a/src/ec/lenovo/h8/Kconfig b/src/ec/lenovo/h8/Kconfig
new file mode 100644
index 0000000..07bdb11
--- /dev/null
+++ b/src/ec/lenovo/h8/Kconfig
@@ -0,0 +1,3 @@
+config EC_LENOVO_H8
+ select EC_ACPI
+ bool
diff --git a/src/ec/lenovo/h8/Makefile.inc b/src/ec/lenovo/h8/Makefile.inc
new file mode 100644
index 0000000..86bc663
--- /dev/null
+++ b/src/ec/lenovo/h8/Makefile.inc
@@ -0,0 +1 @@
+driver-y += h8.c
diff --git a/src/ec/lenovo/h8/acpi/ac.asl b/src/ec/lenovo/h8/acpi/ac.asl
new file mode 100644
index 0000000..cbc84b2
--- /dev/null
+++ b/src/ec/lenovo/h8/acpi/ac.asl
@@ -0,0 +1,44 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (c) 2011 Sven Schnelle <svens(a)stackframe.org>
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+
+Field(ERAM, ByteAcc, NoLock, Preserve)
+{
+ Offset (0x46),
+ , 4,
+ HPAC, 1
+}
+
+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/lenovo/h8/acpi/battery.asl b/src/ec/lenovo/h8/acpi/battery.asl
new file mode 100644
index 0000000..7168581
--- /dev/null
+++ b/src/ec/lenovo/h8/acpi/battery.asl
@@ -0,0 +1,296 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (c) 2011 Sven Schnelle <svens(a)stackframe.org>
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+
+Field(ERAM, ByteAcc, NoLock, Preserve)
+{
+ Offset (0x38),
+ B0ST, 4, /* Battery 0 state */
+ , 1,
+ B0CH, 1, /* Battery 0 charging */
+ B0DI, 1, /* Battery 0 discharging */
+ B0PR, 1, /* Battery 0 present */
+ Offset (0x39),
+ B1ST, 4, /* Battery 1 state */
+ , 1,
+ B1CH, 1, /* Battery 1 charging, */
+ B1DI, 1, /* Battery 1 discharging,*/
+ B1PR, 1 /* Battery 1 present */
+}
+
+/* EC Registers */
+/* PAGE == 0x00 */
+Field (ERAM, ByteAcc, NoLock, Preserve)
+{
+ Offset(0xa0),
+ BARC, 16, /* Battery remaining capacity */
+ BAFC, 16, /* Battery full charge capacity */
+ Offset(0xa8),
+ BAPR, 16, /* Battery present rate */
+ BAVO, 16, /* Battery Voltage */
+}
+
+/* PAGE == 0x01 */
+Field (ERAM, ByteAcc, NoLock, Preserve)
+{
+ Offset(0xa0),
+ , 15,
+ BAMA, 1,
+}
+
+/* PAGE == 0x02 */
+Field (ERAM, ByteAcc, NoLock, Preserve)
+{
+ Offset(0xa0),
+ BADC, 16, /* Design Capacity */
+ BADV, 16, /* Design voltage */
+ , 16,
+ , 16,
+ , 16,
+ BASN, 16,
+}
+
+/* PAGE == 0x04: Battery type */
+Field (ERAM, ByteAcc, NoLock, Preserve)
+{
+ Offset(0xa0),
+ BATY, 32
+}
+
+
+/* PAGE == 0x05: Battery OEM information */
+Field (ERAM, ByteAcc, NoLock, Preserve)
+{
+ Offset(0xa0),
+ BAOE, 128
+}
+
+/* PAGE == 0x06: Battery name */
+Field (ERAM, ByteAcc, NoLock, Preserve)
+{
+ Offset(0xa0),
+ BANA, 128
+}
+
+/* Arg0: Battery
+ * Arg1: Battery Status Package
+ * Arg2: charging
+ * Arg3: discharging
+ */
+Method(BSTA, 4, NotSerialized)
+{
+ Acquire(ECLK, 0xffff)
+ Store(0, Local0)
+ Or(1, Arg0, PAGE)
+ Store(BAMA, Local1)
+ Store(Arg0, PAGE) /* Battery dynamic information */
+
+ Store(BAPR, Local2)
+
+ if (Arg2) // charging
+ {
+ Or(2, Local0, Local0)
+
+ If (LGreaterEqual (Local2, 0x8000)) {
+ Store(0, Local2)
+ }
+ }
+
+ if (Arg3) // discharging
+ {
+ Or(1, Local0, Local0)
+ Subtract(0x10000, Local2, Local2)
+ }
+
+ Store(Local0, Index(Arg1, 0x00))
+
+ if (Local1) {
+ Multiply (BARC, 10, Index(Arg1, 2))
+ Multiply (Local2, BAVO, Local2)
+ Divide (Local2, 1000, Local3, Index(Arg1, 1))
+ } else {
+ Store(BARC, Index(Arg1, 2))
+ Store(Local2, Index(Arg1, 1))
+ }
+ Store(BAVO, Index(Arg1, 3))
+ Release(ECLK)
+ Return (Arg1)
+}
+
+Method(BINF, 2, NotSerialized)
+{
+ Acquire(ECLK, 0xffff)
+ Or(1, Arg1, PAGE) /* Battery 0 static information */
+ Xor(BAMA, 1, Index(Arg0, 0))
+ Store(BAMA, Local0)
+ Store(Arg1, PAGE)
+ Store(BAFC, Local2)
+ Or(2, Arg1, PAGE)
+ Store(BADC, Local1)
+
+ if (Local0)
+ {
+ Multiply (Local1, 10, Local1)
+ Multiply (Local2, 10, Local2)
+ }
+
+ Store(Local1, Index(Arg0, 1)) // Design Capacity
+ Store(Local2, Index(Arg0, 2)) // Last full charge capacity
+ Store(BADV, Index(Arg0, 4)) // Design Voltage
+ Divide (Local2, 20, Local0, Index(Arg0, 5)) // Warning capacity
+
+ Store (BASN, Local0)
+ Name (SERN, Buffer (0x06) { " " })
+ Store (4, Local1)
+ While (Local0)
+ {
+ Divide (Local0, 0x0A, Local2, Local0)
+ Add (Local2, 48, Index (SERN, Local1))
+ Decrement (Local1)
+ }
+ Store (SERN, Index (Arg0, 10)) // Serial Number
+
+ Or(4, Arg1, PAGE)
+ Name (TYPE, Buffer() { 0, 0, 0, 0, 0 })
+ Store(BATY, TYPE)
+ Store(TYPE, Index (Arg0, 11)) // Battery type
+ Or(5, Arg1, PAGE)
+ Store(BAOE, Index (Arg0, 12)) // OEM information
+ Or(6, Arg1, PAGE)
+ Store(BANA, Index (Arg0, 9)) // Model number
+ Release(ECLK)
+ Return (Arg0)
+}
+
+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
+ 1, // 7: granularity1
+ 1, // 8: granularity2
+ "", // 9: Model number
+ "", // A: Serial number
+ "", // B: Battery Type
+ "" // C: OEM information
+ })
+
+ Method (_BIF, 0, NotSerialized)
+ {
+ Return (BINF(BATS, 0))
+ }
+
+ 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 (_BST, 0, NotSerialized)
+ {
+ if (B0PR) {
+ Return (BSTA(0, BATI, B0CH, B0DI))
+ } else {
+ Return (BATS)
+ }
+ }
+
+ Method (_STA, 0, NotSerialized)
+ {
+ if (B0PR) {
+ Return (0x1f)
+ } else {
+ Return (0x0f)
+ }
+ }
+}
+
+Device (BAT1)
+{
+ 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
+ 1, // 7: granularity1
+ 1, // 8: granularity2
+ "", // 9: Model number
+ "", // A: Serial number
+ "", // B: Battery Type
+ "" // C: OEM information
+ })
+
+ Method (_BIF, 0, NotSerialized)
+ {
+ Return (BINF(BATS, 0x10))
+ }
+
+ 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 (_BST, 0, NotSerialized)
+ {
+ if (B1PR) {
+ Return (BSTA(0x10, BATI, B1CH, B1DI))
+ } else {
+ Return (BATS)
+ }
+ }
+
+ Method (_STA, 0, NotSerialized)
+ {
+ if (B1PR) {
+ Return (0x1f)
+ } else {
+ Return (0x0f)
+ }
+ }
+}
diff --git a/src/ec/lenovo/h8/acpi/beep.asl b/src/ec/lenovo/h8/acpi/beep.asl
new file mode 100644
index 0000000..718f41b
--- /dev/null
+++ b/src/ec/lenovo/h8/acpi/beep.asl
@@ -0,0 +1,32 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (c) 2011 Sven Schnelle <svens(a)stackframe.org>
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+
+Field(ERAM, ByteAcc, NoLock, Preserve)
+{
+ Offset (0x06),
+ SNDS, 8 /* Write to this register to generate sound */
+
+}
+
+Method(BEEP, 1, NotSerialized)
+{
+ Store (Arg0, SNDS)
+}
diff --git a/src/ec/lenovo/h8/acpi/ec.asl b/src/ec/lenovo/h8/acpi/ec.asl
new file mode 100644
index 0000000..98abfc1
--- /dev/null
+++ b/src/ec/lenovo/h8/acpi/ec.asl
@@ -0,0 +1,122 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (c) 2011 Sven Schnelle <svens(a)stackframe.org>
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+
+#include "smi.h"
+Device(EC)
+{
+ Name (_HID, EISAID("PNP0C09"))
+ Name (_UID, 0)
+
+ Name (_GPE, 28)
+ Mutex (ECLK, 0)
+
+ OperationRegion(ERAM, EmbeddedControl, 0x00, 0x100)
+ Field (ERAM, ByteAcc, NoLock, Preserve)
+ {
+ Offset (0x05),
+ HSPA, 1,
+ Offset (0x0C),
+ LEDS, 8, /* LED state */
+ Offset (0x3a),
+ AMUT, 1, /* Audio Mute */
+ Offset (0x3B),
+ , 1,
+ KBLT, 1, /* Keyboard Light */
+ Offset (0x4e),
+ WAKE, 16,
+ Offset (0x78),
+ TMP0, 8, /* Thermal Zone 0 temperature */
+ TMP1, 8, /* Thermal Zone 1 temperature */
+ Offset (0x81),
+ PAGE, 8 /* Information Page Selector */
+ }
+
+ Method (_CRS, 0)
+ {
+ Name (ECMD, ResourceTemplate()
+ {
+ IO (Decode16, 0x62, 0x62, 1, 1)
+ IO (Decode16, 0x66, 0x66, 1, 1)
+ })
+ Return (ECMD)
+ }
+
+ Method (LED, 1, NotSerialized)
+ {
+ Store(Arg0, LEDS)
+ }
+
+ Method (_INI, 0, NotSerialized)
+ {
+ }
+
+ Method (MUTE, 1, NotSerialized)
+ {
+ Store(Arg0, AMUT)
+ }
+
+ /* Sleep Button pressed */
+ Method(_Q13, 0, NotSerialized)
+ {
+ Notify(\_SB.PCI0.LPCB.EC.SLPB, 0x80)
+ }
+
+ /* Brightness up GPE */
+ Method(_Q14, 0, NotSerialized)
+ {
+ \DSPC.BRTU ()
+ }
+
+ /* Brightness down GPE */
+ Method(_Q15, 0, NotSerialized)
+ {
+ \DSPC.BRTD()
+ }
+
+ /* AC status change: present */
+ Method(_Q26, 0, NotSerialized)
+ {
+ Notify (AC, 0x80)
+ }
+
+ /* AC status change: not present */
+ Method(_Q27, 0, NotSerialized)
+ {
+ Notify (AC, 0x80)
+ }
+
+ Method(_Q2A, 0, NotSerialized)
+ {
+ Notify(\_SB.PCI0.LPCB.EC.LID, 0x80)
+ }
+
+ Method(_Q2B, 0, NotSerialized)
+ {
+ Notify(\_SB.PCI0.LPCB.EC.LID, 0x80)
+ }
+
+
+#include "ac.asl"
+#include "battery.asl"
+#include "sleepbutton.asl"
+#include "lid.asl"
+#include "beep.asl"
+}
diff --git a/src/ec/lenovo/h8/acpi/lid.asl b/src/ec/lenovo/h8/acpi/lid.asl
new file mode 100644
index 0000000..2dfa8d1
--- /dev/null
+++ b/src/ec/lenovo/h8/acpi/lid.asl
@@ -0,0 +1,54 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (c) 2011 Sven Schnelle <svens(a)stackframe.org>
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+
+Field(ERAM, ByteAcc, NoLock, Preserve)
+{
+ Offset (0x32),
+ , 2,
+ WKLD, 1,
+ Offset (0x46),
+ , 2,
+ LIDS, 1
+}
+
+Device(LID)
+{
+ Name(_HID, "PNP0C0D")
+
+ Method(_LId, 0, NotSerialized)
+ {
+ return (LIDS)
+ }
+
+ Method(_PRW, 0, NotSerialized)
+ {
+ Return (Package() { 0x18, 0x03 })
+ }
+
+ Method(_PSW, 1, NotSerialized)
+ {
+ if (Arg0) {
+ Store(1, WKLD)
+ } else {
+ Store(0, WKLD)
+ }
+ }
+}
diff --git a/src/ec/lenovo/h8/acpi/sleepbutton.asl b/src/ec/lenovo/h8/acpi/sleepbutton.asl
new file mode 100644
index 0000000..09e88aa
--- /dev/null
+++ b/src/ec/lenovo/h8/acpi/sleepbutton.asl
@@ -0,0 +1,49 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (c) 2011 Sven Schnelle <svens(a)stackframe.org>
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+
+Field(ERAM, ByteAcc, NoLock, Preserve)
+{
+ Offset (0x32),
+ , 4,
+ WKFN, 1,
+ Offset(0x83),
+ FNKY, 8
+}
+
+Device(SLPB)
+{
+ Name (_HID, EisaId ("PNP0C0E"))
+ Method(_PRW, 0, NotSerialized)
+ {
+ Return (Package() { 0x18, 0x03 })
+ }
+
+ Method(_PSW, 1, NotSerialized)
+ {
+ if (Arg0) {
+ Store(6, FNKY) /* Fn key acts as wake button */
+ Store(1, WKFN)
+ } else {
+ Store(0, FNKY) /* Fn key normal operation */
+ Store(0, WKFN)
+ }
+ }
+}
diff --git a/src/ec/lenovo/h8/acpi/systemstatus.asl b/src/ec/lenovo/h8/acpi/systemstatus.asl
new file mode 100644
index 0000000..17e8ba7
--- /dev/null
+++ b/src/ec/lenovo/h8/acpi/systemstatus.asl
@@ -0,0 +1,63 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (c) 2011 Sven Schnelle <svens(a)stackframe.org>
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+
+
+Scope (\_SI)
+{
+ Method(_SST, 1, NotSerialized)
+ {
+ If (LEqual (Arg0, 0)) {
+ /* Indicator off */
+
+ /* power LED off */
+ \_SB.PCI0.LPCB.EC.LED(0x00)
+ /* suspend LED off */
+ \_SB.PCI0.LPCB.EC.LED(0x07)
+ }
+
+ If (LEqual (Arg0, 1)) {
+ /* working state */
+
+ /* power LED on */
+ \_SB.PCI0.LPCB.EC.LED(0x80)
+ /* suspend LED off */
+ \_SB.PCI0.LPCB.EC.LED(0x07)
+ }
+
+ If (LEqual (Arg0, 2)) {
+ /* waking state */
+
+ /* power LED om */
+ \_SB.PCI0.LPCB.EC.LED(0x80)
+ /* suspend LED blinking */
+ \_SB.PCI0.LPCB.EC.LED(0xc7)
+ }
+
+ If (LEqual (Arg0, 3)) {
+ /* sleep state */
+
+ /* power LED off */
+ \_SB.PCI0.LPCB.EC.LED(0x00)
+ /* suspend LED on */
+ \_SB.PCI0.LPCB.EC.LED(0x87)
+ }
+ }
+}
diff --git a/src/ec/lenovo/h8/acpi/thermal.asl b/src/ec/lenovo/h8/acpi/thermal.asl
new file mode 100644
index 0000000..35b6f14
--- /dev/null
+++ b/src/ec/lenovo/h8/acpi/thermal.asl
@@ -0,0 +1,41 @@
+Scope(\_TZ)
+{
+ Method(C2K, 1, NotSerialized)
+ {
+ Multiply(Arg0, 10, Local0)
+ Add (Local0, 2732, Local0)
+ if (LLessEqual(Local0, 2732)) {
+ Return (3000)
+ }
+
+ if (LGreater(Local0, 4012)) {
+ Return (3000)
+ }
+ Return (Local0)
+ }
+
+ ThermalZone(THM0)
+ {
+ Method(_CRT, 0, NotSerialized) {
+ Return (C2K(127))
+ }
+ Method(_TMP) {
+ Return (C2K(\_SB.PCI0.LPCB.EC.TMP0))
+ }
+ }
+
+ ThermalZone(THM1)
+ {
+ Method(_CRT, 0, NotSerialized) {
+ Return (C2K(99))
+ }
+
+ Method(_PSV, 0, NotSerialized) {
+ Return (C2K(94))
+ }
+
+ Method(_TMP) {
+ Return (C2K(\_SB.PCI0.LPCB.EC.TMP1))
+ }
+ }
+}
diff --git a/src/ec/lenovo/h8/chip.h b/src/ec/lenovo/h8/chip.h
new file mode 100644
index 0000000..d504654
--- /dev/null
+++ b/src/ec/lenovo/h8/chip.h
@@ -0,0 +1,36 @@
+#ifndef EC_LENOVO_H8EC_CHIP_H
+#define EC_LENOVO_H8EC_CHIP_H
+
+extern struct chip_operations ec_lenovo_h8_ops;
+struct ec_lenovo_h8_config {
+
+ u8 config0;
+ u8 config1;
+ u8 config2;
+ u8 config3;
+
+ u8 beepmask0;
+ u8 beepmask1;
+
+ u8 event0_enable;
+ u8 event1_enable;
+ u8 event2_enable;
+ u8 event3_enable;
+ u8 event4_enable;
+ u8 event5_enable;
+ u8 event6_enable;
+ u8 event7_enable;
+ u8 event8_enable;
+ u8 event9_enable;
+ u8 eventa_enable;
+ u8 eventb_enable;
+ u8 eventc_enable;
+ u8 eventd_enable;
+ u8 evente_enable;
+ u8 eventf_enable;
+
+ u8 trackpoint_enable;
+ u8 wlan_enable;
+ u8 wwan_enable;
+};
+#endif
diff --git a/src/ec/lenovo/h8/h8.c b/src/ec/lenovo/h8/h8.c
new file mode 100644
index 0000000..bc0ddde
--- /dev/null
+++ b/src/ec/lenovo/h8/h8.c
@@ -0,0 +1,129 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2011 Sven Schnelle <svens(a)stackframe.org>
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <arch/io.h>
+#include <console/console.h>
+#include <device/device.h>
+#include <ec/acpi/ec.h>
+#include <device/pnp.h>
+#include <stdlib.h>
+#include "h8.h"
+#include "chip.h"
+
+void h8_trackpoint_enable(int on)
+{
+ ec_write(H8_TRACKPOINT_CTRL,
+ on ? H8_TRACKPOINT_ON : H8_TRACKPOINT_OFF);
+
+}
+
+void h8_wlan_enable(int on)
+{
+ if (on)
+ ec_set_bit(0x3a, 5);
+ else
+ ec_clr_bit(0x3a, 5);
+}
+
+static void h8_log_ec_version(void)
+{
+ unsigned char ecfw[9], c;
+ u16 fwvh, fwvl;
+ int i;
+
+ for(i = 0; i < 8; i++) {
+ c = ec_read(0xf0 + i);
+ if (c < 0x20 || c > 0x7f)
+ break;
+ ecfw[i] = c;
+ }
+ ecfw[i] = '\0';
+
+ fwvh = ec_read(0xe9);
+ fwvl = ec_read(0xe8);
+
+ printk(BIOS_INFO, "EC Firmware ID %s, Version %d.%d%d%c\n", ecfw,
+ fwvh >> 4, fwvh & 0x0f, fwvl >> 4, 0x41 + (fwvl & 0xf));
+}
+
+void h8_set_audio_mute(int on)
+{
+ if (on)
+ ec_clr_bit(0x3a, 0);
+ else
+ ec_set_bit(0x3a, 1);
+}
+
+void h8_enable_event(int event)
+{
+ if (event < 0 || event > 127)
+ return;
+
+ ec_set_bit(0x10 + (event >> 3), event & 7);
+}
+
+void h8_disable_event(int event)
+{
+ if (event < 0 || event > 127)
+ return;
+
+ ec_clr_bit(0x10 + (event >> 3), event & 7);
+
+}
+
+static void h8_enable(device_t dev)
+{
+ struct ec_lenovo_h8_config *conf = dev->chip_info;
+ h8_log_ec_version();
+
+ ec_write(H8_CONFIG0, conf->config0);
+ ec_write(H8_CONFIG1, conf->config1);
+ ec_write(H8_CONFIG2, conf->config2);
+ ec_write(H8_CONFIG3, conf->config3);
+
+ ec_write(H8_SOUND_ENABLE0, conf->beepmask0);
+ ec_write(H8_SOUND_ENABLE1, conf->beepmask1);
+ ec_write(H8_SOUND_REPEAT, 0x00);
+
+ ec_write(0x10, conf->event0_enable);
+ ec_write(0x11, conf->event1_enable);
+ ec_write(0x12, conf->event2_enable);
+ ec_write(0x13, conf->event3_enable);
+ ec_write(0x14, conf->event4_enable);
+ ec_write(0x15, conf->event5_enable);
+ ec_write(0x16, conf->event6_enable);
+ ec_write(0x17, conf->event7_enable);
+ ec_write(0x18, conf->event8_enable);
+ ec_write(0x19, conf->event9_enable);
+ ec_write(0x1a, conf->eventa_enable);
+ ec_write(0x1b, conf->eventb_enable);
+ ec_write(0x1c, conf->eventc_enable);
+ ec_write(0x1d, conf->eventd_enable);
+ ec_write(0x1e, conf->evente_enable);
+ ec_write(0x1f, conf->eventf_enable);
+
+ h8_wlan_enable(conf->wlan_enable);
+ h8_trackpoint_enable(conf->trackpoint_enable);
+
+}
+
+struct chip_operations ec_lenovo_h8_ops = {
+ CHIP_NAME("Lenovo H8 EC")
+ .enable_dev = h8_enable
+};
diff --git a/src/ec/lenovo/h8/h8.h b/src/ec/lenovo/h8/h8.h
new file mode 100644
index 0000000..cdb22ca
--- /dev/null
+++ b/src/ec/lenovo/h8/h8.h
@@ -0,0 +1,111 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2011 Sven Schnelle <svens(a)stackframe.org>
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef EC_LENOVO_H8_H
+#define EC_LENOVO_H8_H
+
+void h8_trackpoint_enable(int on);
+void h8_wlan_enable(int on);
+void h8_set_audio_mute(int on);
+void h8_enable_event(int event);
+void h8_disable_event(int event);
+
+/* EC registers */
+#define H8_CONFIG0 0x00
+#define H8_CONFIG0_EVENTS_ENABLE 0x02
+#define H8_CONFIG0_HOTKEY_ENABLE 0x04
+#define H8_CONFIG0_SMM_H8_ENABLE 0x20
+#define H8_CONFIG0_TC_ENABLE 0x80
+
+#define H8_CONFIG1 0x01
+#define H8_CONFIG1_BKLT_LID 0x01
+#define H8_CONFIG1_UBAY_PWR 0x20
+
+#define H8_CONFIG2 0x02
+#define H8_CONFIG2_USB_DOCK 0x01
+#define H8_CONFIG2_DOCK_SPEAKER_MUTE 0x02
+#define H8_CONFIG2_DOCK_SPEAKER_MUTE_POL 0x04
+
+#define H8_CONFIG3 0x03
+
+#define H8_SOUND_ENABLE0 0x04
+#define H8_SOUND_ENABLE1 0x05
+#define H8_SOUND_REG 0x06
+#define H8_SOUND_REPEAT 0x07
+
+#define H8_TRACKPOINT_CTRL 0x0B
+#define H8_TRACKPOINT_AUTO 0x01
+#define H8_TRACKPOINT_OFF 0x02
+#define H8_TRACKPOINT_ON 0x03
+
+#define H8_LED_CONTROL 0x0c
+#define H8_LED_CONTROL_OFF 0x00
+#define H8_LED_CONTROL_ON 0x80
+#define H8_LED_CONTROL_BLINK 0xc0
+
+#define H8_LED_CONTROL_POWER_LED 0x00
+#define H8_LED_CONTROL_BAT0_LED 0x01
+#define H8_LED_CONTROL_BAT1_LED 0x02
+#define H8_LED_CONTROL_UBAY_LED 0x04
+#define H8_LED_CONTROL_SUSPEND_LED 0x07
+#define H8_LED_CONTROL_DOCK_LED1 0x08
+#define H8_LED_CONTROL_DOCK_LED2 0x09
+
+/* Embedded controller events */
+#define H8_EVENT_FN_F1 0x10
+#define H8_EVENT_FN_F2 0x11
+#define H8_EVENT_FN_F3 0x12
+#define H8_EVENT_FN_F4 0x13
+#define H8_EVENT_FN_HOME 0x14
+#define H8_EVENT_FN_END 0x15
+#define H8_EVENT_FN_F7 0x16
+#define H8_EVENT_FN_F8 0x17
+#define H8_EVENT_FN_F9 0x18
+#define H8_EVENT_FN_THINKVANTAGE 0x19
+#define H8_EVENT_FN_F11 0x1a
+#define H8_EVENT_FN_F12 0x1b
+#define H8_EVENT_FN_1 0x1c
+#define H8_EVENT_FN_2 0x1d
+#define H8_EVENT_FN_PGUP 0x1f
+
+#define H8_EVENT_AC_ON 0x26
+#define H8_EVENT_AC_OFF 0x27
+
+#define H8_EVENT_PWRSW_PRESS 0x28
+#define H8_EVENT_PWRSW_RELEASE 0x29
+
+#define H8_EVENT_LIDSW_CLOSE 0x2a
+#define H8_EVENT_LIDSW_PUSH 0x2b
+
+#define H8_EVENT_UBAY_UNLOCK 0x2c
+#define H8_EVENT_UBAY_LOCK 0x2d
+
+#define H8_EVENT_KEYPRESS 0x33
+
+#define H8_EVENT_FN_PRESS 0x39
+
+#define H8_EVENT_BAT0 0x4a
+#define H8_EVENT_BAT0_STATE 0x4b
+
+#define H8_EVENT_BAT1 0x4c
+#define H8_EVENT_BAT1_STATE 0x4d
+
+#define H8_EVENT_FN_F5 0x64
+#define H8_EVENT_FN_F6 0x65
+#endif
diff --git a/src/ec/lenovo/pmh7/pmh7.c b/src/ec/lenovo/pmh7/pmh7.c
index a46e179..47573a9 100644
--- a/src/ec/lenovo/pmh7/pmh7.c
+++ b/src/ec/lenovo/pmh7/pmh7.c
@@ -56,6 +56,15 @@ void pmh7_register_write(int reg, int val)
outb(val, EC_LENOVO_PMH7_DATA);
}
+void pmh7_backlight_enable(int on)
+{
+ if (on)
+ pmh7_register_set_bit(0x50, 5);
+ else
+ pmh7_register_clear_bit(0x50, 5);
+
+}
+
static void enable_dev(device_t dev)
{
struct resource *resource;
diff --git a/src/ec/lenovo/pmh7/pmh7.h b/src/ec/lenovo/pmh7/pmh7.h
index a4a61cc..8f4f5ab 100644
--- a/src/ec/lenovo/pmh7/pmh7.h
+++ b/src/ec/lenovo/pmh7/pmh7.h
@@ -31,4 +31,5 @@ void pmh7_register_clear_bit(int reg, int bit);
char pmh7_register_read(int reg);
void pmh7_register_write(int reg, int val);
+void pmh7_backlight_enable(int on);
#endif
diff --git a/src/mainboard/emulation/qemu b/src/mainboard/emulation/qemu
new file mode 100644
index 0000000..d9275b5
--- /dev/null
+++ b/src/mainboard/emulation/qemu
@@ -0,0 +1,368 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2007-2009 coresystems GmbH
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+
+#include <string.h>
+#include <console/console.h>
+#include <arch/io.h>
+#include <arch/ioapic.h>
+#include <arch/acpi.h>
+#include <arch/acpigen.h>
+#include <arch/smp/mpspec.h>
+#include <device/device.h>
+#include <device/pci.h>
+#include <device/pci_ids.h>
+#include "dmi.h"
+
+extern const unsigned char AmlCode[];
+#if CONFIG_HAVE_ACPI_SLIC
+unsigned long acpi_create_slic(unsigned long current);
+#endif
+
+#define OLD_ACPI 0
+#if OLD_ACPI
+static void acpi_create_gnvs(global_nvs_t *gnvs)
+{
+ memset (gnvs, 0, sizeof(global_nvs_t));
+
+ gnvs->LIDS = 1;
+ gnvs->PWRS = 1;
+
+ gnvs->ACTT = 0x37;
+ gnvs->PSVT = 0x4f;
+
+ gnvs->TC1V = 0x00;
+ gnvs->TC2V = 0x0a;
+ gnvs->TSPV = 0x02;
+
+ gnvs->CRTT = 0x77;
+
+ gnvs->B0SC = 0x54;
+ gnvs->APIC = 0x01;
+ gnvs->MPEN = 0x01;
+
+ gnvs->PPCM = 0x02;
+ gnvs->PCP0 = 0xbf;
+ gnvs->PCP1 = 0xbf;
+
+ gnvs->CMAP = 0x01;
+ gnvs->CMBP = 0x01;
+ gnvs->LT0 = 0x01;
+ gnvs->FDCP = 0x01;
+ gnvs->CMCP = 0x01;
+ gnvs->CMDP = 0x01;
+ gnvs->P2M = 0x02;
+
+ gnvs->IGDS = 0x01;
+
+ gnvs->CADL = 0x09;
+ gnvs->PADL = 0x09;
+
+ gnvs->NDID = 3;
+ gnvs->DID1 = 0x80000100;
+ gnvs->DID2 = 0x80000240;
+ gnvs->DID3 = 0x80000410;
+ gnvs->DID4 = 0x80000410;
+ gnvs->DID5 = 0x00000005;
+
+ gnvs->ALAF = 0x64;
+ gnvs->LLOW = 0x2c;
+ gnvs->LHIH = 0x01;
+
+ // tolud = pci_read_config32(dev_find_slot(0, PCI_DEVFN(2, 0)), 0x5c);
+ // oemb->topm = tolud;
+}
+#endif
+
+#include "southbridge/intel/i82801gx/nvs.h"
+static void acpi_create_gnvs(global_nvs_t *gnvs)
+{
+ memset((void *)gnvs, 0, sizeof(*gnvs));
+ gnvs->apic = 1;
+ gnvs->mpen = 1; /* Enable Multi Processing */
+
+ /* Enable both COM ports */
+ gnvs->cmap = 0x01;
+ gnvs->cmbp = 0x01;
+
+ /* IGD Displays */
+ gnvs->ndid = 3;
+ gnvs->did[0] = 0x80000100;
+ gnvs->did[1] = 0x80000240;
+ gnvs->did[2] = 0x80000410;
+ gnvs->did[3] = 0x80000410;
+ gnvs->did[4] = 0x00000005;
+}
+
+static void acpi_create_intel_hpet(acpi_hpet_t * hpet)
+{
+#define HPET_ADDR 0xfed00000ULL
+ acpi_header_t *header = &(hpet->header);
+ acpi_addr_t *addr = &(hpet->addr);
+
+ memset((void *) hpet, 0, sizeof(acpi_hpet_t));
+
+ /* fill out header fields */
+ memcpy(header->signature, "HPET", 4);
+ memcpy(header->oem_id, OEM_ID, 6);
+ memcpy(header->oem_table_id, "COREBOOT", 8);
+ memcpy(header->asl_compiler_id, ASLC, 4);
+
+ header->length = sizeof(acpi_hpet_t);
+ header->revision = 1;
+
+ /* fill out HPET address */
+ addr->space_id = 0; /* Memory */
+ addr->bit_width = 64;
+ addr->bit_offset = 0;
+ addr->addrl = HPET_ADDR & 0xffffffff;
+ addr->addrh = HPET_ADDR >> 32;
+
+ hpet->id = 0x8086a201; /* Intel */
+ hpet->number = 0x00;
+ hpet->min_tick = 0x0080;
+
+ header->checksum =
+ acpi_checksum((void *) hpet, sizeof(acpi_hpet_t));
+}
+
+unsigned long acpi_fill_madt(unsigned long current)
+{
+ /* Local APICs */
+ current = acpi_create_madt_lapics(current);
+
+ /* IOAPIC */
+ current += acpi_create_madt_ioapic((acpi_madt_ioapic_t *) current,
+ 2, IO_APIC_ADDR, 0);
+
+ /* LAPIC_NMI */
+ current += acpi_create_madt_lapic_nmi((acpi_madt_lapic_nmi_t *)
+ current, 0,
+ MP_IRQ_POLARITY_HIGH |
+ MP_IRQ_TRIGGER_EDGE, 0x01);
+ current += acpi_create_madt_lapic_nmi((acpi_madt_lapic_nmi_t *)
+ current, 1, MP_IRQ_POLARITY_HIGH |
+ MP_IRQ_TRIGGER_EDGE, 0x01);
+
+ /* INT_SRC_OVR */
+ current += acpi_create_madt_irqoverride((acpi_madt_irqoverride_t *)
+ current, 0, 0, 2, MP_IRQ_POLARITY_HIGH | MP_IRQ_TRIGGER_EDGE);
+ current += acpi_create_madt_irqoverride((acpi_madt_irqoverride_t *)
+ current, 0, 9, 9, MP_IRQ_POLARITY_HIGH | MP_IRQ_TRIGGER_LEVEL);
+
+
+ return current;
+}
+
+unsigned long acpi_fill_ssdt_generator(unsigned long current, const char *oem_table_id)
+{
+ generate_cpu_entries();
+ return (unsigned long) (acpigen_get_current());
+}
+
+unsigned long acpi_fill_slit(unsigned long current)
+{
+ // Not implemented
+ return current;
+}
+
+unsigned long acpi_fill_srat(unsigned long current)
+{
+ /* No NUMA, no SRAT */
+ return current;
+}
+
+void smm_setup_structures(void *gnvs, void *tcg, void *smi1);
+
+#define ALIGN_CURRENT current = ((current + 0x0f) & -0x10)
+unsigned long write_acpi_tables(unsigned long start)
+{
+ unsigned long current;
+ int i;
+ acpi_rsdp_t *rsdp;
+ acpi_rsdt_t *rsdt;
+ acpi_xsdt_t *xsdt;
+ acpi_hpet_t *hpet;
+ acpi_madt_t *madt;
+ acpi_mcfg_t *mcfg;
+ acpi_fadt_t *fadt;
+ acpi_facs_t *facs;
+#if CONFIG_HAVE_ACPI_SLIC
+ acpi_header_t *slic;
+#endif
+ acpi_header_t *ssdt;
+ acpi_header_t *dsdt;
+ void *gnvs;
+
+ current = start;
+
+ /* Align ACPI tables to 16byte */
+ ALIGN_CURRENT;
+
+ printk(BIOS_INFO, "ACPI: Writing ACPI tables at %lx.\n", start);
+
+ /* We need at least an RSDP and an RSDT Table */
+ rsdp = (acpi_rsdp_t *) current;
+ current += sizeof(acpi_rsdp_t);
+ ALIGN_CURRENT;
+ rsdt = (acpi_rsdt_t *) current;
+ current += sizeof(acpi_rsdt_t);
+ ALIGN_CURRENT;
+ xsdt = (acpi_xsdt_t *) current;
+ current += sizeof(acpi_xsdt_t);
+ ALIGN_CURRENT;
+
+ /* clear all table memory */
+ memset((void *) start, 0, current - start);
+
+ acpi_write_rsdp(rsdp, rsdt, xsdt);
+ acpi_write_rsdt(rsdt);
+ acpi_write_xsdt(xsdt);
+
+ /*
+ * We explicitly add these tables later on:
+ */
+ printk(BIOS_DEBUG, "ACPI: * HPET\n");
+
+ hpet = (acpi_hpet_t *) current;
+ current += sizeof(acpi_hpet_t);
+ ALIGN_CURRENT;
+ acpi_create_intel_hpet(hpet);
+ acpi_add_table(rsdp, hpet);
+
+ /* If we want to use HPET Timers Linux wants an MADT */
+ printk(BIOS_DEBUG, "ACPI: * MADT\n");
+
+ madt = (acpi_madt_t *) current;
+ acpi_create_madt(madt);
+ current += madt->header.length;
+ ALIGN_CURRENT;
+ acpi_add_table(rsdp, madt);
+
+ printk(BIOS_DEBUG, "ACPI: * MCFG\n");
+ mcfg = (acpi_mcfg_t *) current;
+ acpi_create_mcfg(mcfg);
+ current += mcfg->header.length;
+ ALIGN_CURRENT;
+ acpi_add_table(rsdp, mcfg);
+
+ printk(BIOS_DEBUG, "ACPI: * FACS\n");
+ facs = (acpi_facs_t *) current;
+ current += sizeof(acpi_facs_t);
+ ALIGN_CURRENT;
+ acpi_create_facs(facs);
+
+ dsdt = (acpi_header_t *) current;
+ memcpy(dsdt, &AmlCode, sizeof(acpi_header_t));
+ current += dsdt->length;
+ memcpy(dsdt, &AmlCode, dsdt->length);
+
+ /* Fix up global NVS region for SMI handler. The GNVS region lives
+ * in the (high) table area. The low memory map looks like this:
+ *
+ * 0x00000000 - 0x000003ff Real Mode IVT
+ * 0x00000020 - 0x0000019c Low MP Table (XXX conflict?)
+ * 0x00000400 - 0x000004ff BDA (somewhat unused)
+ * 0x00000500 - 0x0000052f Moved GDT
+ * 0x00000530 - 0x00000b64 coreboot table
+ * 0x0007c000 - 0x0007dfff OS boot sector (unused?)
+ * 0x0007e000 - 0x0007ffff free to use (so no good for acpi+smi)
+ * 0x00080000 - 0x0009fbff usable ram
+ * 0x0009fc00 - 0x0009ffff EBDA (unused?)
+ * 0x000a0000 - 0x000bffff VGA memory
+ * 0x000c0000 - 0x000cffff VGA option rom
+ * 0x000d0000 - 0x000dffff free for other option roms?
+ * 0x000e0000 - 0x000fffff SeaBIOS? (conflict with low tables:)
+ * 0x000f0000 - 0x000f03ff PIRQ table
+ * 0x000f0400 - 0x000f66?? ACPI tables
+ * 0x000f66?? - 0x000f???? DMI tables
+ */
+
+ ALIGN_CURRENT;
+
+ /* Pack GNVS into the ACPI table area */
+ for (i=0; i < dsdt->length; i++) {
+ if (*(u32*)(((u32)dsdt) + i) == 0xC0DEBABE) {
+ printk(BIOS_DEBUG, "ACPI: Patching up global NVS in DSDT at offset 0x%04x -> 0x%08x\n", i, (u32)current);
+ *(u32*)(((u32)dsdt) + i) = current; // 0x92 bytes
+ break;
+ }
+ }
+
+ /* And fill it */
+ acpi_create_gnvs((global_nvs_t *)current);
+
+ /* Keep pointer around */
+ gnvs = (void *)current;
+
+ current += 0x100;
+ ALIGN_CURRENT;
+
+ /* And tell SMI about it */
+ smm_setup_structures(gnvs, NULL, NULL);
+
+ /* We patched up the DSDT, so we need to recalculate the checksum */
+ dsdt->checksum = 0;
+ dsdt->checksum = acpi_checksum((void *)dsdt, dsdt->length);
+
+ printk(BIOS_DEBUG, "ACPI: * DSDT @ %p Length %x\n", dsdt,
+ dsdt->length);
+
+#if CONFIG_HAVE_ACPI_SLIC
+ printk(BIOS_DEBUG, "ACPI: * SLIC\n");
+ slic = (acpi_header_t *)current;
+ current += acpi_create_slic(current);
+ ALIGN_CURRENT;
+ acpi_add_table(rsdp, slic);
+#endif
+
+ printk(BIOS_DEBUG, "ACPI: * FADT\n");
+ fadt = (acpi_fadt_t *) current;
+ current += sizeof(acpi_fadt_t);
+ ALIGN_CURRENT;
+
+ acpi_create_fadt(fadt, facs, dsdt);
+ acpi_add_table(rsdp, fadt);
+
+ printk(BIOS_DEBUG, "ACPI: * SSDT\n");
+ ssdt = (acpi_header_t *)current;
+ acpi_create_ssdt_generator(ssdt, "COREBOOT");
+ current += ssdt->length;
+ acpi_add_table(rsdp, ssdt);
+ ALIGN_CURRENT;
+
+ printk(BIOS_DEBUG, "current = %lx\n", current);
+
+ printk(BIOS_DEBUG, "ACPI: * DMI (Linux workaround)\n");
+ memcpy((void *)0xfff80, dmi_table, DMI_TABLE_SIZE);
+#if CONFIG_WRITE_HIGH_TABLES == 1
+ memcpy((void *)current, dmi_table, DMI_TABLE_SIZE);
+ current += DMI_TABLE_SIZE;
+ ALIGN_CURRENT;
+#endif
+
+ printk(BIOS_INFO, "ACPI: done.\n");
+
+ /* Enable Dummy DCC ON# for DVI */
+ printk(BIOS_DEBUG, "Laptop handling...\n");
+ outb(inb(0x60f) & ~(1 << 5), 0x60f);
+
+ return current;
+}
diff --git a/src/mainboard/emulation/qemu-x86/dmi.h b/src/mainboard/emulation/qemu-x86/dmi.h
new file mode 100644
index 0000000..96b5873
--- /dev/null
+++ b/src/mainboard/emulation/qemu-x86/dmi.h
@@ -0,0 +1,29 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2007-2009 coresystems GmbH
+ *
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#define DMI_TABLE_SIZE 0x55
+
+static u8 dmi_table[DMI_TABLE_SIZE] = {
+ 0x5f, 0x53, 0x4d, 0x5f, 0x29, 0x1f, 0x02, 0x03, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x5f, 0x44, 0x4d, 0x49, 0x5f, 0x61, 0x35, 0x00, 0xa0, 0xff, 0x0f, 0x00, 0x01, 0x00, 0x23, 0x00,
+ 0x00, 0x14, 0x00, 0x00, 0x01, 0x02, 0x00, 0xe0, 0x03, 0x07, 0x90, 0xde, 0xcb, 0x7f, 0x00, 0x00,
+ 0x00, 0x00, 0x37, 0x01, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20,
+ 0x47, 0x6d, 0x62, 0x48, 0x00, 0x32, 0x2e, 0x30, 0x00, 0x30, 0x33, 0x2f, 0x31, 0x33, 0x2f, 0x32,
+ 0x30, 0x30, 0x38, 0x00, 0x00
+};
diff --git a/src/mainboard/lenovo/x60/Kconfig b/src/mainboard/lenovo/x60/Kconfig
index ebd2c1c..c4b2f63 100644
--- a/src/mainboard/lenovo/x60/Kconfig
+++ b/src/mainboard/lenovo/x60/Kconfig
@@ -11,7 +11,7 @@ config BOARD_SPECIFIC_OPTIONS # dummy
select SUPERIO_NSC_PC87382
select SUPERIO_NSC_PC87392
select EC_LENOVO_PMH7
- select EC_ACPI
+ select EC_LENOVO_H8
select BOARD_HAS_FADT
select HAVE_OPTION_TABLE
select HAVE_PIRQ_TABLE
diff --git a/src/mainboard/lenovo/x60/acpi/ac.asl b/src/mainboard/lenovo/x60/acpi/ac.asl
deleted file mode 100644
index cbc84b2..0000000
--- a/src/mainboard/lenovo/x60/acpi/ac.asl
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * This file is part of the coreboot project.
- *
- * Copyright (c) 2011 Sven Schnelle <svens(a)stackframe.org>
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
- * MA 02110-1301 USA
- */
-
-Field(ERAM, ByteAcc, NoLock, Preserve)
-{
- Offset (0x46),
- , 4,
- HPAC, 1
-}
-
-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/mainboard/lenovo/x60/acpi/battery.asl b/src/mainboard/lenovo/x60/acpi/battery.asl
deleted file mode 100644
index 7168581..0000000
--- a/src/mainboard/lenovo/x60/acpi/battery.asl
+++ /dev/null
@@ -1,296 +0,0 @@
-/*
- * This file is part of the coreboot project.
- *
- * Copyright (c) 2011 Sven Schnelle <svens(a)stackframe.org>
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
- * MA 02110-1301 USA
- */
-
-Field(ERAM, ByteAcc, NoLock, Preserve)
-{
- Offset (0x38),
- B0ST, 4, /* Battery 0 state */
- , 1,
- B0CH, 1, /* Battery 0 charging */
- B0DI, 1, /* Battery 0 discharging */
- B0PR, 1, /* Battery 0 present */
- Offset (0x39),
- B1ST, 4, /* Battery 1 state */
- , 1,
- B1CH, 1, /* Battery 1 charging, */
- B1DI, 1, /* Battery 1 discharging,*/
- B1PR, 1 /* Battery 1 present */
-}
-
-/* EC Registers */
-/* PAGE == 0x00 */
-Field (ERAM, ByteAcc, NoLock, Preserve)
-{
- Offset(0xa0),
- BARC, 16, /* Battery remaining capacity */
- BAFC, 16, /* Battery full charge capacity */
- Offset(0xa8),
- BAPR, 16, /* Battery present rate */
- BAVO, 16, /* Battery Voltage */
-}
-
-/* PAGE == 0x01 */
-Field (ERAM, ByteAcc, NoLock, Preserve)
-{
- Offset(0xa0),
- , 15,
- BAMA, 1,
-}
-
-/* PAGE == 0x02 */
-Field (ERAM, ByteAcc, NoLock, Preserve)
-{
- Offset(0xa0),
- BADC, 16, /* Design Capacity */
- BADV, 16, /* Design voltage */
- , 16,
- , 16,
- , 16,
- BASN, 16,
-}
-
-/* PAGE == 0x04: Battery type */
-Field (ERAM, ByteAcc, NoLock, Preserve)
-{
- Offset(0xa0),
- BATY, 32
-}
-
-
-/* PAGE == 0x05: Battery OEM information */
-Field (ERAM, ByteAcc, NoLock, Preserve)
-{
- Offset(0xa0),
- BAOE, 128
-}
-
-/* PAGE == 0x06: Battery name */
-Field (ERAM, ByteAcc, NoLock, Preserve)
-{
- Offset(0xa0),
- BANA, 128
-}
-
-/* Arg0: Battery
- * Arg1: Battery Status Package
- * Arg2: charging
- * Arg3: discharging
- */
-Method(BSTA, 4, NotSerialized)
-{
- Acquire(ECLK, 0xffff)
- Store(0, Local0)
- Or(1, Arg0, PAGE)
- Store(BAMA, Local1)
- Store(Arg0, PAGE) /* Battery dynamic information */
-
- Store(BAPR, Local2)
-
- if (Arg2) // charging
- {
- Or(2, Local0, Local0)
-
- If (LGreaterEqual (Local2, 0x8000)) {
- Store(0, Local2)
- }
- }
-
- if (Arg3) // discharging
- {
- Or(1, Local0, Local0)
- Subtract(0x10000, Local2, Local2)
- }
-
- Store(Local0, Index(Arg1, 0x00))
-
- if (Local1) {
- Multiply (BARC, 10, Index(Arg1, 2))
- Multiply (Local2, BAVO, Local2)
- Divide (Local2, 1000, Local3, Index(Arg1, 1))
- } else {
- Store(BARC, Index(Arg1, 2))
- Store(Local2, Index(Arg1, 1))
- }
- Store(BAVO, Index(Arg1, 3))
- Release(ECLK)
- Return (Arg1)
-}
-
-Method(BINF, 2, NotSerialized)
-{
- Acquire(ECLK, 0xffff)
- Or(1, Arg1, PAGE) /* Battery 0 static information */
- Xor(BAMA, 1, Index(Arg0, 0))
- Store(BAMA, Local0)
- Store(Arg1, PAGE)
- Store(BAFC, Local2)
- Or(2, Arg1, PAGE)
- Store(BADC, Local1)
-
- if (Local0)
- {
- Multiply (Local1, 10, Local1)
- Multiply (Local2, 10, Local2)
- }
-
- Store(Local1, Index(Arg0, 1)) // Design Capacity
- Store(Local2, Index(Arg0, 2)) // Last full charge capacity
- Store(BADV, Index(Arg0, 4)) // Design Voltage
- Divide (Local2, 20, Local0, Index(Arg0, 5)) // Warning capacity
-
- Store (BASN, Local0)
- Name (SERN, Buffer (0x06) { " " })
- Store (4, Local1)
- While (Local0)
- {
- Divide (Local0, 0x0A, Local2, Local0)
- Add (Local2, 48, Index (SERN, Local1))
- Decrement (Local1)
- }
- Store (SERN, Index (Arg0, 10)) // Serial Number
-
- Or(4, Arg1, PAGE)
- Name (TYPE, Buffer() { 0, 0, 0, 0, 0 })
- Store(BATY, TYPE)
- Store(TYPE, Index (Arg0, 11)) // Battery type
- Or(5, Arg1, PAGE)
- Store(BAOE, Index (Arg0, 12)) // OEM information
- Or(6, Arg1, PAGE)
- Store(BANA, Index (Arg0, 9)) // Model number
- Release(ECLK)
- Return (Arg0)
-}
-
-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
- 1, // 7: granularity1
- 1, // 8: granularity2
- "", // 9: Model number
- "", // A: Serial number
- "", // B: Battery Type
- "" // C: OEM information
- })
-
- Method (_BIF, 0, NotSerialized)
- {
- Return (BINF(BATS, 0))
- }
-
- 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 (_BST, 0, NotSerialized)
- {
- if (B0PR) {
- Return (BSTA(0, BATI, B0CH, B0DI))
- } else {
- Return (BATS)
- }
- }
-
- Method (_STA, 0, NotSerialized)
- {
- if (B0PR) {
- Return (0x1f)
- } else {
- Return (0x0f)
- }
- }
-}
-
-Device (BAT1)
-{
- 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
- 1, // 7: granularity1
- 1, // 8: granularity2
- "", // 9: Model number
- "", // A: Serial number
- "", // B: Battery Type
- "" // C: OEM information
- })
-
- Method (_BIF, 0, NotSerialized)
- {
- Return (BINF(BATS, 0x10))
- }
-
- 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 (_BST, 0, NotSerialized)
- {
- if (B1PR) {
- Return (BSTA(0x10, BATI, B1CH, B1DI))
- } else {
- Return (BATS)
- }
- }
-
- Method (_STA, 0, NotSerialized)
- {
- if (B1PR) {
- Return (0x1f)
- } else {
- Return (0x0f)
- }
- }
-}
diff --git a/src/mainboard/lenovo/x60/acpi/beep.asl b/src/mainboard/lenovo/x60/acpi/beep.asl
deleted file mode 100644
index 718f41b..0000000
--- a/src/mainboard/lenovo/x60/acpi/beep.asl
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * This file is part of the coreboot project.
- *
- * Copyright (c) 2011 Sven Schnelle <svens(a)stackframe.org>
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
- * MA 02110-1301 USA
- */
-
-Field(ERAM, ByteAcc, NoLock, Preserve)
-{
- Offset (0x06),
- SNDS, 8 /* Write to this register to generate sound */
-
-}
-
-Method(BEEP, 1, NotSerialized)
-{
- Store (Arg0, SNDS)
-}
diff --git a/src/mainboard/lenovo/x60/acpi/dock.asl b/src/mainboard/lenovo/x60/acpi/dock.asl
index db61e05..d393f44 100644
--- a/src/mainboard/lenovo/x60/acpi/dock.asl
+++ b/src/mainboard/lenovo/x60/acpi/dock.asl
@@ -21,35 +21,47 @@
#include "smi.h"
-OperationRegion (DLPC, SystemIO, 0x164c, 1)
-Field(DLPC, ByteAcc, NoLock, Preserve)
+Scope (\_SB)
{
- , 3,
- DSTA, 1,
-}
-Device(DOCK)
-{
- Name(_HID, "ACPI0003")
- Name(_UID, 0x00)
- Name(_PCL, Package() { \_SB } )
+ OperationRegion (DLPC, SystemIO, 0x164c, 1)
+ Field(DLPC, ByteAcc, NoLock, Preserve)
+ {
+ , 3,
+ DSTA, 1,
+ }
- Method(_DCK, 1, NotSerialized)
+ Device(DOCK)
{
- if (Arg0) {
- Sleep(250)
- /* connect dock */
- TRAP(SMI_DOCK_CONNECT)
- } else {
- /* disconnect dock */
- TRAP(SMI_DOCK_DISCONNECT)
+ Name(_HID, "ACPI0003")
+ Name(_UID, 0x00)
+ Name(_PCL, Package() { \_SB } )
+
+ Method(_DCK, 1, NotSerialized)
+ {
+ if (Arg0) {
+ Sleep(250)
+ /* connect dock */
+ TRAP(SMI_DOCK_CONNECT)
+ } else {
+ /* disconnect dock */
+ TRAP(SMI_DOCK_DISCONNECT)
+ }
+
+ Xor(Arg0, DSTA, Local0)
+ Return (Local0)
}
- Xor(Arg0, DSTA, Local0)
- Return (Local0)
+ Method(_STA, 0, NotSerialized)
+ {
+ Return (DSTA)
+ }
}
+}
- Method(_STA, 0, NotSerialized)
+Scope(\_SB.PCI0.LPCB.EC)
+{
+ Method(_Q18, 0, NotSerialized)
{
- Return (DSTA)
+ Notify(\_SB.DOCK, 3)
}
}
diff --git a/src/mainboard/lenovo/x60/acpi/ec.asl b/src/mainboard/lenovo/x60/acpi/ec.asl
index 85ea491..c3569e8 100644
--- a/src/mainboard/lenovo/x60/acpi/ec.asl
+++ b/src/mainboard/lenovo/x60/acpi/ec.asl
@@ -1,128 +1 @@
-/*
- * This file is part of the coreboot project.
- *
- * Copyright (c) 2011 Sven Schnelle <svens(a)stackframe.org>
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
- * MA 02110-1301 USA
- */
-
-#include "smi.h"
-Device(EC)
-{
- Name (_HID, EISAID("PNP0C09"))
- Name (_UID, 0)
-
- Name (_GPE, 28)
- Mutex (ECLK, 0)
-
- OperationRegion(ERAM, EmbeddedControl, 0x00, 0x100)
- Field (ERAM, ByteAcc, NoLock, Preserve)
- {
- Offset (0x05),
- HSPA, 1,
- Offset (0x0C),
- LEDS, 8, /* LED state */
- Offset (0x3a),
- AMUT, 1, /* Audio Mute */
- Offset (0x3B),
- , 1,
- KBLT, 1, /* Keyboard Light */
- Offset (0x4e),
- WAKE, 16,
- Offset (0x78),
- TMP0, 8, /* Thermal Zone 0 temperature */
- TMP1, 8, /* Thermal Zone 1 temperature */
- Offset (0x81),
- PAGE, 8 /* Information Page Selector */
- }
-
- Method (_CRS, 0)
- {
- Name (ECMD, ResourceTemplate()
- {
- IO (Decode16, 0x62, 0x62, 1, 1)
- IO (Decode16, 0x66, 0x66, 1, 1)
- })
- Return (ECMD)
- }
-
- Method (LED, 1, NotSerialized)
- {
- Store(Arg0, LEDS)
- }
-
- Method (_INI, 0, NotSerialized)
- {
- }
-
- Method (MUTE, 1, NotSerialized)
- {
- Store(Arg0, AMUT)
- }
-
- /* Sleep Button pressed */
- Method(_Q13, 0, NotSerialized)
- {
- Notify(\_SB.PCI0.LPCB.EC.SLPB, 0x80)
- }
-
- /* Brightness up GPE */
- Method(_Q14, 0, NotSerialized)
- {
- \DSPC.BRTU ()
- }
-
- /* Brightness down GPE */
- Method(_Q15, 0, NotSerialized)
- {
- \DSPC.BRTD()
- }
-
- Method(_Q18, 0, NotSerialized)
- {
- Notify(\_SB.PCI0.LPCB.EC.DOCK, 3)
- }
-
- /* AC status change: present */
- Method(_Q26, 0, NotSerialized)
- {
- Notify (AC, 0x80)
- }
-
- /* AC status change: not present */
- Method(_Q27, 0, NotSerialized)
- {
- Notify (AC, 0x80)
- }
-
- Method(_Q2A, 0, NotSerialized)
- {
- Notify(\_SB.PCI0.LPCB.EC.LID, 0x80)
- }
-
- Method(_Q2B, 0, NotSerialized)
- {
- Notify(\_SB.PCI0.LPCB.EC.LID, 0x80)
- }
-
-
-#include "ac.asl"
-#include "battery.asl"
-#include "sleepbutton.asl"
-#include "lid.asl"
-#include "beep.asl"
-#include "dock.asl"
-}
+#include <ec/lenovo/h8/acpi/ec.asl>
diff --git a/src/mainboard/lenovo/x60/acpi/gpe.asl b/src/mainboard/lenovo/x60/acpi/gpe.asl
index 64e8e31..3aa9615 100644
--- a/src/mainboard/lenovo/x60/acpi/gpe.asl
+++ b/src/mainboard/lenovo/x60/acpi/gpe.asl
@@ -12,10 +12,10 @@ Scope (\_GPE)
{
if (GP13) {
Or(GIV1, 0x20, GIV1)
- Notify(\_SB.PCI0.LPCB.EC.DOCK, 3)
+ Notify(\_SB.DOCK, 3)
} else {
And(GIV1, 0xdf, GIV1)
- Notify(\_SB.PCI0.LPCB.EC.DOCK, 0)
+ Notify(\_SB.DOCK, 0)
}
}
}
diff --git a/src/mainboard/lenovo/x60/acpi/lid.asl b/src/mainboard/lenovo/x60/acpi/lid.asl
deleted file mode 100644
index 2dfa8d1..0000000
--- a/src/mainboard/lenovo/x60/acpi/lid.asl
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * This file is part of the coreboot project.
- *
- * Copyright (c) 2011 Sven Schnelle <svens(a)stackframe.org>
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
- * MA 02110-1301 USA
- */
-
-Field(ERAM, ByteAcc, NoLock, Preserve)
-{
- Offset (0x32),
- , 2,
- WKLD, 1,
- Offset (0x46),
- , 2,
- LIDS, 1
-}
-
-Device(LID)
-{
- Name(_HID, "PNP0C0D")
-
- Method(_LId, 0, NotSerialized)
- {
- return (LIDS)
- }
-
- Method(_PRW, 0, NotSerialized)
- {
- Return (Package() { 0x18, 0x03 })
- }
-
- Method(_PSW, 1, NotSerialized)
- {
- if (Arg0) {
- Store(1, WKLD)
- } else {
- Store(0, WKLD)
- }
- }
-}
diff --git a/src/mainboard/lenovo/x60/acpi/sleepbutton.asl b/src/mainboard/lenovo/x60/acpi/sleepbutton.asl
deleted file mode 100644
index 09e88aa..0000000
--- a/src/mainboard/lenovo/x60/acpi/sleepbutton.asl
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * This file is part of the coreboot project.
- *
- * Copyright (c) 2011 Sven Schnelle <svens(a)stackframe.org>
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
- * MA 02110-1301 USA
- */
-
-Field(ERAM, ByteAcc, NoLock, Preserve)
-{
- Offset (0x32),
- , 4,
- WKFN, 1,
- Offset(0x83),
- FNKY, 8
-}
-
-Device(SLPB)
-{
- Name (_HID, EisaId ("PNP0C0E"))
- Method(_PRW, 0, NotSerialized)
- {
- Return (Package() { 0x18, 0x03 })
- }
-
- Method(_PSW, 1, NotSerialized)
- {
- if (Arg0) {
- Store(6, FNKY) /* Fn key acts as wake button */
- Store(1, WKFN)
- } else {
- Store(0, FNKY) /* Fn key normal operation */
- Store(0, WKFN)
- }
- }
-}
diff --git a/src/mainboard/lenovo/x60/acpi/systemstatus.asl b/src/mainboard/lenovo/x60/acpi/systemstatus.asl
deleted file mode 100644
index 161be08..0000000
--- a/src/mainboard/lenovo/x60/acpi/systemstatus.asl
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * This file is part of the coreboot project.
- *
- * Copyright (c) 2011 Sven Schnelle <svens(a)stackframe.org>
- *
- * 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
- * MA 02110-1301 USA
- */
-
-
-Scope (\_SI)
-{
- Method(_SST, 1, NotSerialized)
- {
- If (LEqual (Arg0, 0)) {
- /* Indicator off */
-
- /* power LED off */
- \_SB.PCI0.LPCB.EC.LED(0x00)
- /* suspend LED off */
- \_SB.PCI0.LPCB.EC.LED(0x07)
- }
-
- If (LEqual (Arg0, 1)) {
- /* working state */
-
- /* power LED on */
- \_SB.PCI0.LPCB.EC.LED(0x80)
- /* suspend LED off */
- \_SB.PCI0.LPCB.EC.LED(0x07)
- }
-
- If (LEqual (Arg0, 2)) {
- /* waking state */
-
- /* power LED om */
- \_SB.PCI0.LPCB.EC.LED(0x80)
- /* suspend LED blinking */
- \_SB.PCI0.LPCB.EC.LED(0xc7)
- }
-
- If (LEqual (Arg0, 3)) {
- /* sleep state */
-
- /* power LED off */
- \_SB.PCI0.LPCB.EC.LED(0x00)
- /* suspend LED on */
- \_SB.PCI0.LPCB.EC.LED(0x87)
- }
-
-
-
- }
-}
diff --git a/src/mainboard/lenovo/x60/acpi/thermal.asl b/src/mainboard/lenovo/x60/acpi/thermal.asl
deleted file mode 100644
index 35b6f14..0000000
--- a/src/mainboard/lenovo/x60/acpi/thermal.asl
+++ /dev/null
@@ -1,41 +0,0 @@
-Scope(\_TZ)
-{
- Method(C2K, 1, NotSerialized)
- {
- Multiply(Arg0, 10, Local0)
- Add (Local0, 2732, Local0)
- if (LLessEqual(Local0, 2732)) {
- Return (3000)
- }
-
- if (LGreater(Local0, 4012)) {
- Return (3000)
- }
- Return (Local0)
- }
-
- ThermalZone(THM0)
- {
- Method(_CRT, 0, NotSerialized) {
- Return (C2K(127))
- }
- Method(_TMP) {
- Return (C2K(\_SB.PCI0.LPCB.EC.TMP0))
- }
- }
-
- ThermalZone(THM1)
- {
- Method(_CRT, 0, NotSerialized) {
- Return (C2K(99))
- }
-
- Method(_PSV, 0, NotSerialized) {
- Return (C2K(94))
- }
-
- Method(_TMP) {
- Return (C2K(\_SB.PCI0.LPCB.EC.TMP1))
- }
- }
-}
diff --git a/src/mainboard/lenovo/x60/devicetree.cb b/src/mainboard/lenovo/x60/devicetree.cb
index 2817255..f47fdae 100644
--- a/src/mainboard/lenovo/x60/devicetree.cb
+++ b/src/mainboard/lenovo/x60/devicetree.cb
@@ -86,13 +86,29 @@ chip northbridge/intel/i945
device pnp ff.1 on # dummy
end
end
- chip ec/acpi
+ chip ec/lenovo/h8
device pnp ff.2 on # dummy
io 0x60 = 0x62
io 0x62 = 0x66
io 0x64 = 0x1600
io 0x66 = 0x1604
end
+
+ register "config0" = "0xa6"
+ register "config1" = "0x05"
+ register "config2" = "0xa0"
+ register "config3" = "0x05"
+
+ register "beepmask0" = "0xfe"
+ register "beepmask1" = "0x96"
+
+ register "event2_enable" = "0xff"
+ register "event3_enable" = "0xff"
+ register "event4_enable" = "0xf4"
+ register "event5_enable" = "0x3c"
+
+ register "wlan_enable" = "0x01"
+ register "trackpoint_enable" = "0x03"
end
chip superio/nsc/pc87382
device pnp 164e.2 on # IR
diff --git a/src/mainboard/lenovo/x60/dsdt.asl b/src/mainboard/lenovo/x60/dsdt.asl
index 3467a8b..905c94a 100644
--- a/src/mainboard/lenovo/x60/dsdt.asl
+++ b/src/mainboard/lenovo/x60/dsdt.asl
@@ -40,10 +40,6 @@ DefinitionBlock(
// mainboard specific devices
#include "acpi/mainboard.asl"
- // Thermal Zone
- #include "acpi/thermal.asl"
- // System status indicators
- #include "acpi/systemstatus.asl"
Scope (\_SB) {
Device (PCI0)
{
@@ -54,4 +50,7 @@ DefinitionBlock(
/* Chipset specific sleep states */
#include "../../../southbridge/intel/i82801gx/acpi/sleepstates.asl"
+
+ // Dock support code
+ #include "acpi/dock.asl"
}
diff --git a/src/mainboard/lenovo/x60/mainboard.c b/src/mainboard/lenovo/x60/mainboard.c
index c2aaaa9..15ed808 100644
--- a/src/mainboard/lenovo/x60/mainboard.c
+++ b/src/mainboard/lenovo/x60/mainboard.c
@@ -32,78 +32,22 @@
#include <arch/io.h>
#include <ec/lenovo/pmh7/pmh7.h>
#include <ec/acpi/ec.h>
+#include <ec/lenovo/h8/h8.h>
#include <northbridge/intel/i945/i945.h>
static void backlight_enable(void)
{
- pmh7_register_set_bit(0x50, 5);
-}
-
-static void trackpoint_enable(void)
-{
- ec_write(0x0b, 0x03);
-}
-
-static void wlan_enable(void)
-{
- ec_write(0x3a, 0x20);
-}
-
-static void log_ec_version(void)
-{
- unsigned char ecfw[9], c;
- u16 fwvh, fwvl;
- int i;
-
- for(i = 0; i < 8; i++) {
- c = ec_read(0xf0 + i);
- if (c < 0x20 || c > 0x7f)
- break;
- ecfw[i] = c;
- }
- ecfw[i] = '\0';
-
- fwvh = ec_read(0xe9);
- fwvl = ec_read(0xe8);
-
- printk(BIOS_INFO, "EC Firmware ID %s, Version %d.%d%d%c\n", ecfw,
- fwvh >> 4, fwvh & 0x0f, fwvl >> 4, 0x41 + (fwvl & 0xf));
+ pmh7_register_set_bit(0x50, 5);
}
static void mainboard_enable(device_t dev)
{
device_t dev0;
- log_ec_version();
-
backlight_enable();
- trackpoint_enable();
-
- /* FIXME: this should be ACPI's task
- * but for now, enable it here */
- wlan_enable();
-
- /* enable ACPI events */
- ec_write(0x00, 0xa6);
- ec_write(0x01, 0x05);
-
- ec_write(0x02, 0xa0);
- ec_write(0x03, 0x05);
-
- /* set mask of enabled beeps */
- ec_write(0x04, 0xfe);
- ec_write(0x05, 0x96);
-
- /* Unknown, but required for hotkeys
- Maybe a mask for enabled keys? */
-
- ec_write(0x12, 0xff);
- ec_write(0x13, 0xff);
- ec_write(0x14, 0xf4);
- ec_write(0x15, 0x3c);
/* enable Audio */
- ec_clr_bit(0x3a, 0);
+ h8_set_audio_mute(0);
/* If we're resuming from suspend, blink suspend LED */
dev0 = dev_find_slot(0, PCI_DEVFN(0,0));
--
1.7.4.1