aboutsummaryrefslogtreecommitdiff
path: root/src/mainboard/getac/p470/acpi/ec.asl
diff options
context:
space:
mode:
Diffstat (limited to 'src/mainboard/getac/p470/acpi/ec.asl')
-rw-r--r--src/mainboard/getac/p470/acpi/ec.asl675
1 files changed, 675 insertions, 0 deletions
diff --git a/src/mainboard/getac/p470/acpi/ec.asl b/src/mainboard/getac/p470/acpi/ec.asl
new file mode 100644
index 0000000000..30e78fad2a
--- /dev/null
+++ b/src/mainboard/getac/p470/acpi/ec.asl
@@ -0,0 +1,675 @@
+/*
+ * 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
+ */
+
+Device(EC0)
+{
+ Name (_HID, EISAID("PNP0C09"))
+ Name (_UID, 1)
+
+ Name (_GPE, 23) // GPI07 / GPE23 -> Runtime SCI
+
+ OperationRegion(ERAM, EmbeddedControl, 0x00, 0x37)
+ Field (ERAM, ByteAcc, NoLock, Preserve)
+ {
+ MODE, 1, // Thermal Policy (Quiet/Perform)
+ FAN, 1, // Fan Power (On/Off)
+ LIDS, 1, // LID Status (0=Open/1=Close)
+ LSW0, 1, // LCD Power Switch
+
+ BTYP, 1, // Battery Type (0=LiIon/1=NiMh)
+ MWKE, 1, // Enable Wakeup from RI
+ ADP, 1, // AC Adapter (0=Offline/1=Online)
+ BAT, 1, // Battery (0=Not Present/1=Present)
+ SLPT, 3, // Set Sleep Type on SLP enter (1=S1...4=S4)
+ CHRG, 1, // 0=Battery not charging/1=Battery charging
+ RI_W, 1, // Wake-up event source is RI
+ KB_W, 1, // Wake-up event source is keyboard
+ BATW, 1, // Wake-up event source is Battery Low
+ PMEW, 1, // Wake-up event source is PME
+
+ // Battery 0 Registers
+ // Battery Life = BRC0/BPR0
+ // Battery percentage = BRC0/BFC0 * 100
+ BDC0, 16, // Designed Capacity
+ BFC0, 16, // Last Full Charge Capacity
+ BDV0, 16, // Design Voltage
+ BPR0, 16, // Battery Present Rate
+ BRC0, 16, // Battery Remaining Capacity
+ BPV0, 16, // Battery Present Voltage
+
+ Offset(0x11),
+ CTMP, 8, // CPU Temperature
+ Offset(0x15),
+ CTRO, 8, // EC throttling on trip point
+ CRTT, 8, // Critical Shut-down Temperature
+ Offset(0x17),
+ BKLL, 8, // Backlight Level
+
+ // Battery 2 Registers
+ Offset(0x20),
+ , 4,
+ BTY2, 1, // Battery Type (0=LiIon/1=NiMh)
+ , 2,
+ BAT2, 1, // Battery (0=Not Present/1=Present)
+ , 3,
+ CRG2, 1, // 0=Battery not charging/1=Battery charging
+ Offset(0x22),
+ BDC2, 16, // Designed Capacity
+ BFC2, 16, // Last Full Charge Capacity
+ BDV2, 16, // Design Voltage
+ BPR2, 16, // Battery Present Rate
+ BRC2, 16, // Battery Remaining Capacity
+ BPV2, 16, // Battery Present Voltage
+ BTP2, 16, // Trip Point
+
+ PBMO, 2, // PBMO power control method
+ ECO, 1, // ECO on/off status
+ SUN, 1, // Sunlight Readable
+ RF, 1, // RF Enable/Disable status
+ DOCK, 1, // Dock In/Out status
+ CBAT, 1, // Car Battery status
+ APPS, 1, // OSD utility status
+ Offset(0x33),
+ ODDS, 1
+ }
+
+ Method (_CRS, 0)
+ {
+ Name (ECMD, ResourceTemplate()
+ {
+ IO (Decode16, 0x62, 0x62, 1, 1)
+ IO (Decode16, 0x66, 0x66, 1, 1)
+ })
+
+ Return (ECMD)
+ }
+
+ // EC Query methods, called upon SCI interrupts.
+ Method (_Q01, 0)
+ {
+ Notify (\_PR.CPU0, 0x80)
+ If(ADP) {
+ Store(1, \_SB.AC.ACST)
+ TRAP(0xe3)
+ Store(1, PWRS)
+ TRAP(0x2b)
+ } Else {
+ Store(0, \_SB.AC.ACST)
+ Notify(\_SB.AC, 0x80)
+ Notify(\_SB.BAT0, 0x80)
+ Store(0, PWRS)
+ TRAP(0x2b)
+ }
+
+ PNOT()
+ }
+
+ Method (_Q02, 0)
+ {
+ If(BAT) {
+ Notify(\_SB.BAT0, 0x00)
+ Notify(\_SB.AC, 0x80)
+ } Else {
+ Notify(\_SB.AC, 0x80)
+ Notify(\_SB.BAT0, 0x01)
+ }
+
+ PNOT()
+ }
+
+ Method (_Q05, 0)
+ {
+ Notify(SLPB, 0x80)
+ PNOT()
+ }
+
+ Method (_Q07, 0)
+ {
+ TRAP(0xe0)
+
+ If (LEqual(RTCF, 0x00)) {
+ Notify(LID0, 0x80)
+ } else {
+ TRAP(0xc1)
+ }
+ }
+
+ Method (_Q09, 0)
+ {
+ Notify(BAT0, 0x80)
+ Notify(BAT1, 0x80)
+ }
+
+ Method (_Q0A, 0)
+ {
+ Notify(\_TZ.THRM, 0x80)
+ }
+
+ Method (_Q20, 0)
+ {
+ Notify(\_SB.ECO, 0x81)
+ }
+
+ Method (_Q21, 0)
+ {
+ Notify(\_SB.ECO, 0x82)
+ }
+
+ Method (_Q22, 0)
+ {
+ Notify(\_SB.ECO, 0x83)
+ }
+
+ Method (_Q23, 0)
+ {
+ Notify(\_SB.ECO, 0x84)
+ }
+
+ Method (_Q24, 0)
+ {
+ Store(0x3f, HOTK)
+ If(IGDS) {
+ HKDS(10)
+ } Else {
+ TRAP(0xE1)
+ }
+ Notify (\_SB.ECO, 0x85)
+ }
+
+ Method (_Q25, 0)
+ {
+ Store(0x40, HOTK)
+ TRAP(0xe1)
+ Notify(\_SB.ECO, 0x86)
+ }
+
+ Method (_Q26, 0)
+ {
+ Store(0x41, HOTK)
+ TRAP(0xe1)
+ Notify(\_SB.ECO, 0x87)
+ }
+
+ Method (_Q27, 0)
+ {
+ Notify(\_SB.ECO, 0x88)
+ }
+
+ Method (_Q28, 0)
+ {
+ Notify(\_SB.ECO, 0x89)
+ }
+
+ Method (_Q29, 0)
+ {
+ Notify(\_SB.ECO, 0x8a)
+ }
+
+ Method (_Q2A, 0)
+ {
+ Store(0x57, HOTK)
+ TRAP(0xe1)
+ Notify(\_SB.ECO, 0x8b)
+ }
+
+ Method (_Q2B, 0)
+ {
+ Notify(SLPB, 0x80)
+ Notify(\_SB.ECO, 0x8c)
+ }
+
+ Method (_Q2C, 0)
+ {
+ Store(0x59, HOTK)
+ TRAP(0xe1)
+ }
+
+ Method (_Q38, 0)
+ {
+ // IDE TODO
+ }
+
+ Method (_Q39, 0)
+ {
+ // SATA TODO
+ }
+
+ Method (_Q3A, 0)
+ {
+ Store(1, BRTL)
+ Notify(\_SB.ECO, 0x93)
+ }
+
+ Method (_Q3B, 0)
+ {
+ Store(0, BRTL)
+ Notify(\_SB.ECO, 0x93)
+ }
+
+ Method (_Q3C, 0)
+ {
+ Store(1, SUN)
+ Notify(\_SB.ECO, 0x92)
+ }
+
+ Method (_Q3D, 0)
+ {
+ Store(0, SUN)
+ Notify(\_SB.ECO, 0x92)
+ }
+
+ /* Enable RF device */
+ Method (_Q3E, 0)
+ {
+ TRAP(0xdf)
+ }
+
+ /* Disable RF device */
+ Method (_Q3F, 0)
+ {
+ TRAP(0xc0)
+ }
+
+ /* ACBS LAN Power On */
+ Method (_Q40, 0)
+ {
+ TRAP(0xd0)
+ Sleep(500)
+ Notify(RP04, 0)
+ }
+
+ /* ACBS LAN Power Off */
+ Method (_Q41, 0)
+ {
+ TRAP(0xd1)
+ }
+
+ Method (_Q42, 0)
+ {
+ TRAP(0xf3)
+ }
+
+ Method (_Q43, 0)
+ {
+ TRAP(0xf4)
+ }
+
+ Method (_Q48, 0)
+ {
+ TRAP(0xd2) // Check AC Status
+ Store (1, ODDS)
+ Notify(\_SB.ECO, 0x90)
+ }
+
+ Method (_Q49, 0)
+ {
+ TRAP(0xd2) // Check AC Status
+ Store (0, ODDS)
+ Notify(\_SB.ECO, 0x90)
+ }
+
+
+ Method (_Q4C, 0)
+ {
+ Notify(\_SB.ECO, 0x94)
+ }
+
+ Method (_Q4D, 0)
+ {
+ Notify(\_SB.ECO, 0x95)
+ }
+
+ Method (_Q4E, 0)
+ {
+ // PATA TODO
+ }
+
+ Method (_Q4F, 0)
+ {
+ TRAP(0xf9)
+ Notify(\_SB.ECO, 0x95)
+ }
+
+ Method (_Q5C, 0)
+ {
+ // Store(2, IGPS)
+ Notify(\_SB.ECO, 0x94)
+ }
+
+ Method (_Q70, 0)
+ {
+ Notify(\_SB.ECO, 0x96)
+ }
+
+ Method (_Q71, 0)
+ {
+ Notify(\_SB.ECO, 0x97)
+ }
+
+ // TODO Scope _SB devices for AC power, LID, Power button
+}
+
+Scope(\_SB)
+{
+ /* This device is used by the GETAC P470 Windows drivers. */
+
+ Device (ECO)
+ {
+ Name(_HID, "MTC0303") // MTC0303 BIOS Service Provider
+ Method (GDPD, 0, Serialized)
+ {
+ // Set flag byte to zero
+ Store (0, Local0)
+
+ If (And(BRTL, 0x01)) {
+ Or(Local0, 0x01, Local0)
+ }
+
+ If (And(BRTL, 0x02)) {
+ Or(Local0, 0x04, Local0)
+ }
+
+ If (And(BRTL, 0x04)) {
+ Or(Local0, 0x02, Local0)
+ }
+
+ If (And(BRTL, 0x30)) {
+ Or(Local0, 0x10, Local0)
+ }
+
+ If (And(BRTL, 0x40)) {
+ Or(Local0, 0x40, Local0)
+ }
+
+ Return (Local0)
+ }
+
+ Method (GDPC, 0, Serialized)
+ {
+ Store (0, Local0)
+
+ If (And(BRTL, 0x10)) {
+ Or(Local0, 0x04, Local0)
+ }
+
+ If (And( BRTL, 0x20)) {
+ Or(Local0, 0x01, Local0)
+ }
+
+ If (And(BRTL, 0x40)) {
+ Or(Local0, 0x02, Local0)
+ }
+
+ Return (Local0)
+ }
+
+ /* Set Brightness Level */
+ Method(SBLL, 1, Serialized)
+ {
+ Store (Arg0, BRTL)
+ TRAP(0xd5) // See mainboard_smi.c
+ Return (0)
+ }
+
+ /* Get Brightness Level */
+ Method(GBLL, 0, Serialized)
+ {
+ TRAP(0xd6) // See mainboard_smi.c
+ Return (BRTL)
+ }
+
+ /* Get Brightness Level Medium? */
+ Method(GBLM, 0, Serialized)
+ {
+ Store(0x3f, BRTL)
+ // XXX don't we have to set the brightness?
+ Return(BRTL)
+ }
+
+ /* ??? */
+ Method(SUTE, 1, Serialized)
+ {
+ If (And(Arg0, 0x01)) {
+ TRAP(0xf5)
+ } Else {
+ TRAP(0xf6)
+ }
+ Return (0)
+ }
+
+ /* ??? */
+ Method(GECO, 0, Serialized)
+ {
+ TRAP(0xd7)
+ Return (ODDS)
+ }
+
+ /* ??? */
+ Method(GBSL, 0, Serialized)
+ {
+ TRAP(0xd8)
+ Return (BRTL)
+ }
+
+ /* ??? Get LED/Device Enable Status */
+ Method(GRFD, 0, Serialized)
+ {
+ /* Let coreboot update the flags */
+ TRAP(0xe5)
+
+ Store (0, Local0)
+ If(And(RFDV, 0x01)) {
+ Or(Local0, 0x01, Local0)
+ }
+ If(And(RFDV, 0x02)) {
+ Or(Local0, 0x02, Local0)
+ }
+ If(And(RFDV, 0x02)) {
+ Or(Local0, 0x02, Local0)
+ }
+ If(And(RFDV, 0x04)) {
+ Or(Local0, 0x04, Local0)
+ }
+ If(And(RFDV, 0x08)) {
+ Or(Local0, 0x08, Local0)
+ }
+ If(And(GP16, 0x01)) { // GDIS
+ Or(Local0, 0x10, Local0)
+ }
+ If(And(GP13, 0x01)) { // WIFI Led (WLED)
+ Or(Local0, 0x20, Local0)
+ }
+ If(And(BTEN, 0x01)) { // BlueTooth Enable
+ Or(Local0, 0x40, Local0)
+ }
+ If(And(GP11, 0x01)) { // GPS Enable
+ Or(Local0, 0x80, Local0)
+ }
+
+ Return (Local0)
+ }
+
+ /* Set RFD */
+ Method(SRFD, 1, Serialized)
+ {
+ If (And(Arg0, 0x01)) {
+ Store (1, GP15) // GLED
+ Store (1, GP16) // GDIS
+ } Else {
+ Store (0, GP15)
+ Store (0, GP16)
+ }
+
+ /* WIFI */
+ If (And(Arg0, 0x02)) {
+ Store (1, GP13) // WLED
+ Store (1, GP26) // WLAN
+ } Else {
+ Store (0, GP13)
+ Store (0, GP26)
+ }
+
+ /* Bluetooth */
+ If (And(Arg0, 0x04)) {
+ Store (1, GP14) // BLED
+ Store (1, BTEN)
+ } Else {
+ Store (0, GP14) // BLED
+ Store (0, BTEN)
+ }
+ Return (0)
+ }
+
+ /* Get DKD */
+ Method(GDKD, 0, Serialized)
+ {
+ TRAP(0xd9)
+ Return (BRTL)
+ }
+
+ /* Set DKD */
+ Method(SDKD, 1, Serialized)
+ {
+ TRAP(0xda)
+ Return (0)
+ }
+
+ /* Set IGD (Graphics) */
+ Method(SIGD, 1, Serialized)
+ {
+ If (And(Arg0, 0x01)) {
+ TRAP(0xf7)
+ } Else {
+ TRAP(0xf8)
+ }
+ Return (0)
+ }
+
+ /* SMI-C? Set Mic? */
+ Method (SMIC, 1, Serialized)
+ {
+ If (And(Arg0, 0x01)) {
+ TRAP(0xeb)
+ } Else {
+ TRAP(0xec)
+ }
+ Return (0)
+ }
+
+ /* ??? */
+ Method(GTSD, 0, Serialized)
+ {
+ Return (GP20) // TSDT
+ }
+
+ /* Not even decent function names anymore? */
+ Method(S024, 1, Serialized)
+ {
+ If (And(Arg0, 0x01)) {
+ TRAP(0xf1)
+ } Else {
+ TRAP(0xf2)
+ }
+ Return (0)
+ }
+
+ /* Get CVD */
+ Method(GCVD, 0, Serialized)
+ {
+ TRAP(0xf9)
+ Return (BRTL)
+ }
+
+ /* ??? Something with PATA */
+ Method(S025, 1, Serialized)
+ {
+ If(And(Arg0, 0x01)) {
+ TRAP(0xfc)
+
+ Store (1, GP33) // CREN
+ Sleep(1500)
+
+ Store (1, GP34) // CRRS
+ Sleep(500)
+
+ Notify(^^PCI0.PATA, 0)
+ Notify(^^PCI0.PATA.PRID, 0)
+ } Else {
+ TRAP(0xfb)
+ Sleep(1500)
+ Store(0, GP33) // CREN
+ Sleep(1500)
+ Notify(^^PCI0.PATA, 0)
+ Notify(^^PCI0.PATA.PRID, 0)
+ Notify(^^PCI0.PATA.PRID.DSK1, 1)
+ Notify(^^PCI0.PATA.PRID.DSK0, 1)
+ }
+ Return (0)
+ }
+
+ /* ??? */
+ Method(G021, 0, Serialized)
+ {
+ TRAP(0xfe)
+ If (LEqual(ACIN, 0)) {
+ TRAP(0xfa)
+ TRAP(0xfd)
+ If (LEqual(ODDS, 1)) {
+ TRAP(0xfb)
+ Notify(^^PCI0.PATA, 0)
+ Notify(^^PCI0.PATA.PRID.DSK1, 1)
+ Notify(^^PCI0.PATA.PRID.DSK0, 1)
+ Sleep (1500)
+ Store (0, GP33) // CREN
+ Sleep (1500)
+ Notify(^^PCI0.PATA, 0)
+ Notify(^^PCI0.PATA.PRID.DSK1, 1)
+ Notify(^^PCI0.PATA.PRID.DSK0, 1)
+ Return (0)
+ }
+ }
+ /* All Else Cases */
+ Notify(ECO, 0xb1)
+ Return (1)
+ }
+
+ /* Get RFS */
+ Method(GRFS, 0, Serialized)
+ {
+ TRAP(0xff)
+ Return(BRTL)
+ }
+
+ /* ??? */
+ Method(S00B, 1, Serialized)
+ {
+ If (And(Arg0, 1)) {
+ TRAP(0xdc)
+ } Else {
+ TRAP(0xdd)
+ }
+ Return (0)
+ }
+
+
+
+ }
+}