summaryrefslogtreecommitdiff
path: root/src/ec/quanta/it8518/acpi/battery.asl
diff options
context:
space:
mode:
authorStefan Reinauer <reinauer@chromium.org>2013-03-13 17:03:04 -0700
committerRonald G. Minnich <rminnich@gmail.com>2013-03-14 04:54:21 +0100
commit7e568559634199668859b7c662aea7f6b41f3920 (patch)
treee8ae87d34a8768fb19a8289b1fa9232efa54d077 /src/ec/quanta/it8518/acpi/battery.asl
parent5c0b7abe786d7b4370ed1dd7ef323a3091d9620c (diff)
downloadcoreboot-7e568559634199668859b7c662aea7f6b41f3920.tar.xz
Support ITE IT8518 embedded controller running Quanta's firmware
Change-Id: Ib406b9d5005243d79eea5d2c0c6c86b5aa949891 Signed-off-by: Stefan Reinauer <reinauer@google.com> Reviewed-on: http://review.coreboot.org/2721 Tested-by: build bot (Jenkins) Reviewed-by: Ronald G. Minnich <rminnich@gmail.com>
Diffstat (limited to 'src/ec/quanta/it8518/acpi/battery.asl')
-rw-r--r--src/ec/quanta/it8518/acpi/battery.asl353
1 files changed, 353 insertions, 0 deletions
diff --git a/src/ec/quanta/it8518/acpi/battery.asl b/src/ec/quanta/it8518/acpi/battery.asl
new file mode 100644
index 0000000000..1621b3694f
--- /dev/null
+++ b/src/ec/quanta/it8518/acpi/battery.asl
@@ -0,0 +1,353 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2013 Google Inc.
+ *
+ * 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 (EC0)
+
+Device (BATX)
+{
+ Name (_HID, EISAID ("PNP0C0A"))
+ Name (_UID, 1)
+ Name (_PCL, Package () { \_SB })
+
+ //
+ // Indicator of BATX attach/detach
+ // Battery X Information
+ // Battery X Status
+ //
+ Name (BXST, Zero)
+
+ //
+ // Default Static Battery Information
+ //
+ Name (PBIF, Package()
+ {
+ 0, // 0: Power Unit
+ 0xFFFFFFFF, // 1: Design Capacity
+ 0xFFFFFFFF, // 2: Last Full Charge Capacity
+ 1, // 3: Battery Technology(Rechargable)
+ 10800, // 4: Design Voltage 10.8V
+ 0, // 5: Design capacity of warning
+ 0, // 6: Design capacity of low
+ 1, // 7: Battery capacity granularity 1
+ 1, // 8: Battery capacity granularity 2
+ "", // 9: Model Number
+ "", // 10: Serial Number
+ "", // 11: Battery Type
+ "" // 12: OEM Infomration
+ })
+
+ Name (PBST, Package ()
+ {
+ 0x00000000, // Battery State
+ 0xFFFFFFFF, // Battery Present Rate
+ 0xFFFFFFFF, // Battery Remaining Capacity
+ 0xFFFFFFFF, // Battery Present Voltage
+ })
+
+ // Workaround for full battery status, enabled by default
+ Name (BFWK, One)
+
+ // Method to enable full battery workaround
+ Method (BFWE)
+ {
+ Store (One, BFWK)
+ }
+
+ // Method to disable full battery workaround
+ Method (BFWD)
+ {
+ Store (Zero, BFWK)
+ }
+
+ // Method to wait for EC to be ready after changing the Battery Info ID
+ // Selector
+ Method (WAEC)
+ {
+ Store (20, Local0) // Timeout 100 msec
+ While (LEqual (HSID, Zero))
+ {
+ // EC Is not ready
+ Sleep (5)
+ Decrement (Local0)
+ If (LEqual (Local0, Zero))
+ {
+ Break
+ }
+ }
+ }
+
+ // Battery Slot Status
+ Method (_STA, 0, Serialized)
+ {
+ Store (MBTS, BXST)
+ If (BXST)
+ {
+ // Battery is present
+ Return (0x1F)
+ }
+ Else
+ {
+ Return (0x0F)
+ }
+ }
+
+ Method (_BIF, 0, Serialized)
+ {
+ // Update fields from EC
+
+ //
+ // Information ID 1 -
+ //
+ Store (One, HIID)
+ WAEC ()
+
+ //
+ // Power Unit
+ // SMART battery : 1 - 10mWh : 0 - mAh
+ // ACPI spec : 0 - mWh : 1 - mAh
+ //
+ Store(SBCM, Local7)
+ XOr (Local7, One, Index (PBIF, 0))
+
+ //
+ // Information ID 0 -
+ //
+ Store (Zero, HIID)
+ WAEC ()
+
+ //
+ // Last Full Charge Capacity
+ //
+ If (Local7)
+ {
+ Multiply (SBFC, 10, Index (PBIF, 2))
+ }
+ Else
+ {
+ Store (SBFC, Index (PBIF, 2))
+ }
+
+ //
+ // Information ID 2 -
+ //
+ Store (2, HIID)
+ WAEC ()
+
+ //
+ // Design capacity
+ //
+ If (Local7)
+ {
+ Multiply (SBDC, 10, Local0)
+ }
+ Else
+ {
+ Store (SBDC, Local0)
+ }
+ Store (Local0, Index(PBIF, One))
+
+ //
+ // Design capacity of High (5%)
+ // Design capacity of Low (1%)
+ //
+ Divide (Local0, 20, Local1, Index (PBIF, 5))
+ Divide (Local0, 100, Local1, Index (PBIF, 6))
+
+ //
+ // Design voltage
+ //
+ Store (SBDV, Index (PBIF, 4))
+
+ //
+ // Serial Number
+ //
+ Store (ToHexString (SBSN), Index (PBIF, 10))
+
+ //
+ // Information ID 4 -
+ //
+ Store (4, HIID)
+ WAEC ()
+
+ //
+ // Battery Type - Device Chemistry
+ //
+ Store (ToString (SBCH), Index (PBIF, 11))
+
+ //
+ // Information ID 5 -
+ //
+ Store (5, HIID)
+ WAEC ()
+
+ //
+ // OEM Information - Manufacturer Name
+ //
+ Store (ToString (SBMN), Index (PBIF, 12))
+
+ //
+ // Information ID 6 -
+ //
+ Store (6, HIID)
+ WAEC ()
+
+ //
+ // Model Number - Device Name
+ //
+ Store (ToString (SBDN), Index (PBIF, 9))
+
+ Return (PBIF)
+ }
+
+ Method (_BST, 0, Serialized)
+ {
+ // Update Battery First Used Date, if requested
+ If (BFUD)
+ {
+ // TODO: Handle First Used Date Request
+ //\BFUD()
+ }
+
+ //
+ // 0: BATTERY STATE
+ //
+ // bit 0 = discharging
+ // bit 1 = charging
+ // bit 2 = critical level
+ //
+
+ // Get battery state from EC
+ If (And (HB0S, 0x20))
+ {
+ Store (2, Local0)
+ }
+ Else
+ {
+ if (And (HB0S, 0x40))
+ {
+ Store (One, Local0)
+ }
+ Else
+ {
+ Store (Zero, Local0)
+ }
+ }
+
+ // Set critical flag if battery is empty
+ If (LEqual (And (HB0S, 0x0F), 0))
+ {
+ Or (Local0, 4, Local0)
+ }
+
+ Store (Zero, Local1)
+
+ // Check if AC is present
+ If (ACPW)
+ {
+ // Set only charging/discharging bits
+ And (Local0, 0x03, Local1)
+ }
+ Else
+ {
+ // Always discharging when on battery power
+ Store (One, Local1)
+ }
+
+ // Flag if the battery level is critical
+ And (Local0, 0x04, Local4)
+ Or (Local1, Local4, Local1)
+ Store (Local1, Index (PBST, 0))
+
+ //
+ // 1: BATTERY PRESENT RATE/CURRENT
+ //
+ Store (ECAC, Local1)
+ If (LGreaterEqual (Local1, 0x8000))
+ {
+ If (And (Local0, 1))
+ {
+ Subtract (0x10000, Local1, Local1)
+ }
+ Else
+ {
+ // Error
+ Store (Zero, Local1)
+ }
+ }
+ Else
+ {
+ If (LNot (AND (Local0, 2)))
+ {
+ // Battery is not charging
+ Store (Zero, Local1)
+ }
+ }
+
+ XOr (DerefOf (Index (PBIF, Zero)), One, Local6)
+
+ If (Local6)
+ {
+ Multiply (ECVO, Local1, Local1)
+ Divide (Local1, 1000, Local7, Local1)
+ }
+ Store (Local1, Index (PBST, One))
+
+ //
+ // 2: BATTERY REMAINING CAPACITY
+ //
+ // Get Power unit from the battery static information
+ // SMART battery : 1 - 10mWh : 0 - mAh
+ // ACPI spec : 0 - mWh : 1 - mAh
+ If (Local6)
+ {
+ Multiply (ECRC, 10, Local1)
+ }
+ Else
+ {
+ Store (ECRC, Local1)
+ }
+
+ If (LAnd (BFWK, LAnd (ACPW, LNot (Local0))))
+ {
+ // On AC power and battery is neither charging
+ // nor discharging. Linux expects a full battery
+ // to report same capacity as last full charge.
+ // https://bugzilla.kernel.org/show_bug.cgi?id=12632
+ // TODO: Is SBRS the "battery gas gauge"?
+ Store (SBRS, Local2)
+
+ // See if within ~3% of full
+ ShiftRight (Local2, 5, Local3)
+ If (LAnd (LGreater (Local1, Subtract (Local2, Local3)),
+ LLess (Local1, Add (Local2, Local3))))
+ {
+ Store (Local2, Local1)
+ }
+ }
+ Store (Local1, Index (PBST, 2))
+
+ //
+ // 3: BATTERY PRESENT VOLTAGE
+ //
+ Store (ECVO, Index (PBST, 3))
+
+ Return (PBST)
+ }
+}