<p>Nicolas Boichat has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/23598">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">chromeec: Add support for reading second battery info<br><br>We share the same shared memory fields for both batteries. When<br>the host wants to switch battery to read out, it will:<br> - Set BTID (EC_ACPI_MEM_BATTERY_INDEX) to the required index<br> - Wait for BITX (EC_MEMMAP_BATT_INDEX) to have the required value<br> - Then fetch the data<br><br>BRANCH=none<br>BUG=b:65697620<br>TEST=Boot lux, both /sys/class/power_supply/BAT0 and BAT1 are<br> present, data is valid.<br><br>Change-Id: Ib06176e6ab4c45a899259f0917e6292121865ed6<br>Signed-off-by: Nicolas Boichat <drinkcat@chromium.org><br>---<br>M src/ec/google/chromeec/acpi/battery.asl<br>M src/ec/google/chromeec/acpi/ec.asl<br>M src/ec/google/chromeec/acpi/emem.asl<br>3 files changed, 328 insertions(+), 122 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://review.coreboot.org:29418/coreboot refs/changes/98/23598/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/ec/google/chromeec/acpi/battery.asl b/src/ec/google/chromeec/acpi/battery.asl</span><br><span>index 2ed4468..a472d24 100644</span><br><span>--- a/src/ec/google/chromeec/acpi/battery.asl</span><br><span>+++ b/src/ec/google/chromeec/acpi/battery.asl</span><br><span>@@ -16,6 +16,221 @@</span><br><span> </span><br><span> // Scope (EC0)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Mutex for EC battery index interface */</span><br><span style="color: hsl(120, 100%, 40%);">+Mutex (BATM, 1)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+// Wait for desired battery index to be presented in shared memory</span><br><span style="color: hsl(120, 100%, 40%);">+// Arg0 = battery index</span><br><span style="color: hsl(120, 100%, 40%);">+// Returns Zero on success, One or error.</span><br><span style="color: hsl(120, 100%, 40%);">+Method (BTSW, 1)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef EC_ENABLE_SECOND_BATTERY_DEVICE</span><br><span style="color: hsl(120, 100%, 40%);">+ If (LEqual (BTIX, Arg0)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ Return (Zero)</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ If (LGreaterEqual (Arg0, BTCN)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ Return (One)</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ Store (Arg0, \_SB.PCI0.LPCB.EC0.BTID)</span><br><span style="color: hsl(120, 100%, 40%);">+ Store (5, Local0) // Timeout 5 msec</span><br><span style="color: hsl(120, 100%, 40%);">+ While (LNotEqual (BTIX, Arg0))</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+ Sleep (1)</span><br><span style="color: hsl(120, 100%, 40%);">+ Decrement (Local0)</span><br><span style="color: hsl(120, 100%, 40%);">+ If (LEqual (Local0, Zero))</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+ Return (One)</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+ Return (Zero)</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+// _STA implementation.</span><br><span style="color: hsl(120, 100%, 40%);">+// Arg0 = battery index</span><br><span style="color: hsl(120, 100%, 40%);">+Method (BSTA, 1, Serialized)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ If (Acquire (^BATM, 1000)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ Return (Zero)</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ If (And(Not(BTSW (Arg0)), BTEX)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ Store (0x1F, Local0)</span><br><span style="color: hsl(120, 100%, 40%);">+ } Else {</span><br><span style="color: hsl(120, 100%, 40%);">+ Store (0x0F, Local0)</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ Release (^BATM)</span><br><span style="color: hsl(120, 100%, 40%);">+ Return (Local0)</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+// _BIF implementation.</span><br><span style="color: hsl(120, 100%, 40%);">+// Arg0 = battery index</span><br><span style="color: hsl(120, 100%, 40%);">+// Arg1 = PBIF</span><br><span style="color: hsl(120, 100%, 40%);">+Method (BBIF, 2, Serialized)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ If (Acquire (^BATM, 1000)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ Return (Arg1)</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ If (BTSW (Arg0)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ Release (^BATM)</span><br><span style="color: hsl(120, 100%, 40%);">+ Return (Arg1)</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ // Last Full Charge Capacity</span><br><span style="color: hsl(120, 100%, 40%);">+ Store (BTDF, Index (Arg1, 2))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ // Design Voltage</span><br><span style="color: hsl(120, 100%, 40%);">+ Store (BTDV, Index (Arg1, 4))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ // Design Capacity</span><br><span style="color: hsl(120, 100%, 40%);">+ Store (BTDA, Local0)</span><br><span style="color: hsl(120, 100%, 40%);">+ Store (Local0, Index (Arg1, 1))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ // Design Capacity of Warning</span><br><span style="color: hsl(120, 100%, 40%);">+ Divide (Multiply (Local0, DWRN), 100, , Local2)</span><br><span style="color: hsl(120, 100%, 40%);">+ Store (Local2, Index (Arg1, 5))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ // Design Capacity of Low</span><br><span style="color: hsl(120, 100%, 40%);">+ Divide (Multiply (Local0, DLOW), 100, , Local2)</span><br><span style="color: hsl(120, 100%, 40%);">+ Store (Local2, Index (Arg1, 6))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ // Get battery info from mainboard</span><br><span style="color: hsl(120, 100%, 40%);">+ Store (ToString(Concatenate(BMOD, 0x00)), Index (Arg1, 9))</span><br><span style="color: hsl(120, 100%, 40%);">+ Store (ToString(Concatenate(BSER, 0x00)), Index (Arg1, 10))</span><br><span style="color: hsl(120, 100%, 40%);">+ Store (ToString(Concatenate(BMFG, 0x00)), Index (Arg1, 12))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ Release (^BATM)</span><br><span style="color: hsl(120, 100%, 40%);">+ Return (Arg1)</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+// _BIX implementation.</span><br><span style="color: hsl(120, 100%, 40%);">+// Arg0 = battery index</span><br><span style="color: hsl(120, 100%, 40%);">+// Arg1 = PBIX</span><br><span style="color: hsl(120, 100%, 40%);">+Method (BBIX, 2, Serialized)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ If (Acquire (^BATM, 1000)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ Return (Arg1)</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ If (BTSW (Arg0)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ Release (^BATM)</span><br><span style="color: hsl(120, 100%, 40%);">+ Return (Arg1)</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ // Last Full Charge Capacity</span><br><span style="color: hsl(120, 100%, 40%);">+ Store (BTDF, Index (Arg1, 3))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ // Design Voltage</span><br><span style="color: hsl(120, 100%, 40%);">+ Store (BTDV, Index (Arg1, 5))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ // Design Capacity</span><br><span style="color: hsl(120, 100%, 40%);">+ Store (BTDA, Local0)</span><br><span style="color: hsl(120, 100%, 40%);">+ Store (Local0, Index (Arg1, 2))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ // Design Capacity of Warning</span><br><span style="color: hsl(120, 100%, 40%);">+ Divide (Multiply (Local0, DWRN), 100, , Local2)</span><br><span style="color: hsl(120, 100%, 40%);">+ Store (Local2, Index (Arg1, 6))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ // Design Capacity of Low</span><br><span style="color: hsl(120, 100%, 40%);">+ Divide (Multiply (Local0, DLOW), 100, , Local2)</span><br><span style="color: hsl(120, 100%, 40%);">+ Store (Local2, Index (Arg1, 7))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ // Cycle Count</span><br><span style="color: hsl(120, 100%, 40%);">+ Store (BTCC, Index (Arg1, 8))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ // Get battery info from mainboard</span><br><span style="color: hsl(120, 100%, 40%);">+ Store (ToString(Concatenate(BMOD, 0x00)), Index (Arg1, 16))</span><br><span style="color: hsl(120, 100%, 40%);">+ Store (ToString(Concatenate(BSER, 0x00)), Index (Arg1, 17))</span><br><span style="color: hsl(120, 100%, 40%);">+ Store (ToString(Concatenate(BMFG, 0x00)), Index (Arg1, 19))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ Release (^BATM)</span><br><span style="color: hsl(120, 100%, 40%);">+ Return (Arg1)</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+// _BST implementation.</span><br><span style="color: hsl(120, 100%, 40%);">+// Arg0 = battery index</span><br><span style="color: hsl(120, 100%, 40%);">+// Arg1 = PBST</span><br><span style="color: hsl(120, 100%, 40%);">+// Arg2 = BSTP</span><br><span style="color: hsl(120, 100%, 40%);">+// Arg3 = BFWK</span><br><span style="color: hsl(120, 100%, 40%);">+// Arg4 = BAT0/1 (battery structure itself)</span><br><span style="color: hsl(120, 100%, 40%);">+Method (BBST, 5, Serialized)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ If (Acquire (^BATM, 1000)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ Return (Arg1)</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ If (BTSW (Arg0)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ Release (^BATM)</span><br><span style="color: hsl(120, 100%, 40%);">+ Return (Arg1)</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ //</span><br><span style="color: hsl(120, 100%, 40%);">+ // 0: BATTERY STATE</span><br><span style="color: hsl(120, 100%, 40%);">+ //</span><br><span style="color: hsl(120, 100%, 40%);">+ // bit 0 = discharging</span><br><span style="color: hsl(120, 100%, 40%);">+ // bit 1 = charging</span><br><span style="color: hsl(120, 100%, 40%);">+ // bit 2 = critical level</span><br><span style="color: hsl(120, 100%, 40%);">+ //</span><br><span style="color: hsl(120, 100%, 40%);">+ Store (Zero, Local1)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ // Check if AC is present</span><br><span style="color: hsl(120, 100%, 40%);">+ If (ACEX) {</span><br><span style="color: hsl(120, 100%, 40%);">+ If (BFCG) {</span><br><span style="color: hsl(120, 100%, 40%);">+ Store (0x02, Local1)</span><br><span style="color: hsl(120, 100%, 40%);">+ } ElseIf (BFDC) {</span><br><span style="color: hsl(120, 100%, 40%);">+ Store (0x01, Local1)</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ } Else {</span><br><span style="color: hsl(120, 100%, 40%);">+ // Always discharging when on battery power</span><br><span style="color: hsl(120, 100%, 40%);">+ Store (0x01, Local1)</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ // Check for critical battery level</span><br><span style="color: hsl(120, 100%, 40%);">+ If (BFCR) {</span><br><span style="color: hsl(120, 100%, 40%);">+ Or (Local1, 0x04, Local1)</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ Store (Local1, Index (Arg1, 0))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ // Notify if battery state has changed since last time</span><br><span style="color: hsl(120, 100%, 40%);">+ If (LNotEqual (Local1, Arg2)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ Store (Local1, Arg2)</span><br><span style="color: hsl(120, 100%, 40%);">+ Notify (Arg4, 0x80)</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ //</span><br><span style="color: hsl(120, 100%, 40%);">+ // 1: BATTERY PRESENT RATE</span><br><span style="color: hsl(120, 100%, 40%);">+ //</span><br><span style="color: hsl(120, 100%, 40%);">+ Store (BTPR, Index (Arg1, 1))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ //</span><br><span style="color: hsl(120, 100%, 40%);">+ // 2: BATTERY REMAINING CAPACITY</span><br><span style="color: hsl(120, 100%, 40%);">+ //</span><br><span style="color: hsl(120, 100%, 40%);">+ Store (BTRA, Local1)</span><br><span style="color: hsl(120, 100%, 40%);">+ If (LAnd (Arg3, LAnd (ACEX, LNot (LAnd (BFDC, BFCG))))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ // On AC power and battery is neither charging</span><br><span style="color: hsl(120, 100%, 40%);">+ // nor discharging. Linux expects a full battery</span><br><span style="color: hsl(120, 100%, 40%);">+ // to report same capacity as last full charge.</span><br><span style="color: hsl(120, 100%, 40%);">+ // https://bugzilla.kernel.org/show_bug.cgi?id=12632</span><br><span style="color: hsl(120, 100%, 40%);">+ Store (BTDF, Local2)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ // See if within ~6% of full</span><br><span style="color: hsl(120, 100%, 40%);">+ ShiftRight (Local2, 4, Local3)</span><br><span style="color: hsl(120, 100%, 40%);">+ If (LAnd (LGreater (Local1, Subtract (Local2, Local3)),</span><br><span style="color: hsl(120, 100%, 40%);">+ LLess (Local1, Add (Local2, Local3))))</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+ Store (Local2, Local1)</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ Store (Local1, Index (Arg1, 2))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ //</span><br><span style="color: hsl(120, 100%, 40%);">+ // 3: BATTERY PRESENT VOLTAGE</span><br><span style="color: hsl(120, 100%, 40%);">+ //</span><br><span style="color: hsl(120, 100%, 40%);">+ Store (BTVO, Index (Arg1, 3))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ Release (^BATM)</span><br><span style="color: hsl(120, 100%, 40%);">+ Return (Arg1)</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> Device (BAT0)</span><br><span> {</span><br><span> Name (_HID, EISAID ("PNP0C0A"))</span><br><span>@@ -86,138 +301,112 @@</span><br><span> </span><br><span> Method (_STA, 0, Serialized)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- If (BTEX) {</span><br><span style="color: hsl(0, 100%, 40%);">- Return (0x1F)</span><br><span style="color: hsl(0, 100%, 40%);">- } Else {</span><br><span style="color: hsl(0, 100%, 40%);">- Return (0x0F)</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ Return (BSTA (0))</span><br><span> }</span><br><span> </span><br><span> Method (_BIF, 0, Serialized)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- // Last Full Charge Capacity</span><br><span style="color: hsl(0, 100%, 40%);">- Store (BTDF, Index (PBIF, 2))</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- // Design Voltage</span><br><span style="color: hsl(0, 100%, 40%);">- Store (BTDV, Index (PBIF, 4))</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- // Design Capacity</span><br><span style="color: hsl(0, 100%, 40%);">- Store (BTDA, Local0)</span><br><span style="color: hsl(0, 100%, 40%);">- Store (Local0, Index (PBIF, 1))</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- // Design Capacity of Warning</span><br><span style="color: hsl(0, 100%, 40%);">- Divide (Multiply (Local0, DWRN), 100, , Local2)</span><br><span style="color: hsl(0, 100%, 40%);">- Store (Local2, Index (PBIF, 5))</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- // Design Capacity of Low</span><br><span style="color: hsl(0, 100%, 40%);">- Divide (Multiply (Local0, DLOW), 100, , Local2)</span><br><span style="color: hsl(0, 100%, 40%);">- Store (Local2, Index (PBIF, 6))</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- // Get battery info from mainboard</span><br><span style="color: hsl(0, 100%, 40%);">- Store (ToString(Concatenate(BMOD, 0x00)), Index (PBIF, 9))</span><br><span style="color: hsl(0, 100%, 40%);">- Store (ToString(Concatenate(BSER, 0x00)), Index (PBIF, 10))</span><br><span style="color: hsl(0, 100%, 40%);">- Store (ToString(Concatenate(BMFG, 0x00)), Index (PBIF, 12))</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- Return (PBIF)</span><br><span style="color: hsl(120, 100%, 40%);">+ Return (BBIF (0, PBIF))</span><br><span> }</span><br><span> </span><br><span> Method (_BIX, 0, Serialized)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- // Last Full Charge Capacity</span><br><span style="color: hsl(0, 100%, 40%);">- Store (BTDF, Index (PBIX, 3))</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- // Design Voltage</span><br><span style="color: hsl(0, 100%, 40%);">- Store (BTDV, Index (PBIX, 5))</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- // Design Capacity</span><br><span style="color: hsl(0, 100%, 40%);">- Store (BTDA, Local0)</span><br><span style="color: hsl(0, 100%, 40%);">- Store (Local0, Index (PBIX, 2))</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- // Design Capacity of Warning</span><br><span style="color: hsl(0, 100%, 40%);">- Divide (Multiply (Local0, DWRN), 100, , Local2)</span><br><span style="color: hsl(0, 100%, 40%);">- Store (Local2, Index (PBIX, 6))</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- // Design Capacity of Low</span><br><span style="color: hsl(0, 100%, 40%);">- Divide (Multiply (Local0, DLOW), 100, , Local2)</span><br><span style="color: hsl(0, 100%, 40%);">- Store (Local2, Index (PBIX, 7))</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- // Cycle Count</span><br><span style="color: hsl(0, 100%, 40%);">- Store (BTCC, Index (PBIX, 8))</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- // Get battery info from mainboard</span><br><span style="color: hsl(0, 100%, 40%);">- Store (ToString(Concatenate(BMOD, 0x00)), Index (PBIX, 16))</span><br><span style="color: hsl(0, 100%, 40%);">- Store (ToString(Concatenate(BSER, 0x00)), Index (PBIX, 17))</span><br><span style="color: hsl(0, 100%, 40%);">- Store (ToString(Concatenate(BMFG, 0x00)), Index (PBIX, 19))</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- Return (PBIX)</span><br><span style="color: hsl(120, 100%, 40%);">+ Return (BBIX (0, PBIX))</span><br><span> }</span><br><span> </span><br><span> Method (_BST, 0, Serialized)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- //</span><br><span style="color: hsl(0, 100%, 40%);">- // 0: BATTERY STATE</span><br><span style="color: hsl(0, 100%, 40%);">- //</span><br><span style="color: hsl(0, 100%, 40%);">- // bit 0 = discharging</span><br><span style="color: hsl(0, 100%, 40%);">- // bit 1 = charging</span><br><span style="color: hsl(0, 100%, 40%);">- // bit 2 = critical level</span><br><span style="color: hsl(0, 100%, 40%);">- //</span><br><span style="color: hsl(0, 100%, 40%);">- Store (Zero, Local1)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- // Check if AC is present</span><br><span style="color: hsl(0, 100%, 40%);">- If (ACEX) {</span><br><span style="color: hsl(0, 100%, 40%);">- If (BFCG) {</span><br><span style="color: hsl(0, 100%, 40%);">- Store (0x02, Local1)</span><br><span style="color: hsl(0, 100%, 40%);">- } ElseIf (BFDC) {</span><br><span style="color: hsl(0, 100%, 40%);">- Store (0x01, Local1)</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- } Else {</span><br><span style="color: hsl(0, 100%, 40%);">- // Always discharging when on battery power</span><br><span style="color: hsl(0, 100%, 40%);">- Store (0x01, Local1)</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- // Check for critical battery level</span><br><span style="color: hsl(0, 100%, 40%);">- If (BFCR) {</span><br><span style="color: hsl(0, 100%, 40%);">- Or (Local1, 0x04, Local1)</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- Store (Local1, Index (PBST, 0))</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- // Notify if battery state has changed since last time</span><br><span style="color: hsl(0, 100%, 40%);">- If (LNotEqual (Local1, BSTP)) {</span><br><span style="color: hsl(0, 100%, 40%);">- Store (Local1, BSTP)</span><br><span style="color: hsl(0, 100%, 40%);">- Notify (BAT0, 0x80)</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- //</span><br><span style="color: hsl(0, 100%, 40%);">- // 1: BATTERY PRESENT RATE</span><br><span style="color: hsl(0, 100%, 40%);">- //</span><br><span style="color: hsl(0, 100%, 40%);">- Store (BTPR, Index (PBST, 1))</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- //</span><br><span style="color: hsl(0, 100%, 40%);">- // 2: BATTERY REMAINING CAPACITY</span><br><span style="color: hsl(0, 100%, 40%);">- //</span><br><span style="color: hsl(0, 100%, 40%);">- Store (BTRA, Local1)</span><br><span style="color: hsl(0, 100%, 40%);">- If (LAnd (BFWK, LAnd (ACEX, LNot (LAnd (BFDC, BFCG))))) {</span><br><span style="color: hsl(0, 100%, 40%);">- // On AC power and battery is neither charging</span><br><span style="color: hsl(0, 100%, 40%);">- // nor discharging. Linux expects a full battery</span><br><span style="color: hsl(0, 100%, 40%);">- // to report same capacity as last full charge.</span><br><span style="color: hsl(0, 100%, 40%);">- // https://bugzilla.kernel.org/show_bug.cgi?id=12632</span><br><span style="color: hsl(0, 100%, 40%);">- Store (BTDF, Local2)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- // See if within ~6% of full</span><br><span style="color: hsl(0, 100%, 40%);">- ShiftRight (Local2, 4, Local3)</span><br><span style="color: hsl(0, 100%, 40%);">- If (LAnd (LGreater (Local1, Subtract (Local2, Local3)),</span><br><span style="color: hsl(0, 100%, 40%);">- LLess (Local1, Add (Local2, Local3))))</span><br><span style="color: hsl(0, 100%, 40%);">- {</span><br><span style="color: hsl(0, 100%, 40%);">- Store (Local2, Local1)</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- Store (Local1, Index (PBST, 2))</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- //</span><br><span style="color: hsl(0, 100%, 40%);">- // 3: BATTERY PRESENT VOLTAGE</span><br><span style="color: hsl(0, 100%, 40%);">- //</span><br><span style="color: hsl(0, 100%, 40%);">- Store (BTVO, Index (PBST, 3))</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- Return (PBST)</span><br><span style="color: hsl(120, 100%, 40%);">+ Return (BBST (0, PBST, BSTP, BFWK, BAT0))</span><br><span> }</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef EC_ENABLE_SECOND_BATTERY_DEVICE</span><br><span style="color: hsl(120, 100%, 40%);">+Device (BAT1)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ Name (_HID, EISAID ("PNP0C0A"))</span><br><span style="color: hsl(120, 100%, 40%);">+ Name (_UID, 1)</span><br><span style="color: hsl(120, 100%, 40%);">+ Name (_PCL, Package () { \_SB })</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ Name (PBIF, Package () {</span><br><span style="color: hsl(120, 100%, 40%);">+ 0x00000001, // 0x00: Power Unit: mAh</span><br><span style="color: hsl(120, 100%, 40%);">+ 0xFFFFFFFF, // 0x01: Design Capacity</span><br><span style="color: hsl(120, 100%, 40%);">+ 0xFFFFFFFF, // 0x02: Last Full Charge Capacity</span><br><span style="color: hsl(120, 100%, 40%);">+ 0x00000001, // 0x03: Battery Technology: Rechargeable</span><br><span style="color: hsl(120, 100%, 40%);">+ 0xFFFFFFFF, // 0x04: Design Voltage</span><br><span style="color: hsl(120, 100%, 40%);">+ 0x00000003, // 0x05: Design Capacity of Warning</span><br><span style="color: hsl(120, 100%, 40%);">+ 0xFFFFFFFF, // 0x06: Design Capacity of Low</span><br><span style="color: hsl(120, 100%, 40%);">+ 0x00000001, // 0x07: Capacity Granularity 1</span><br><span style="color: hsl(120, 100%, 40%);">+ 0x00000001, // 0x08: Capacity Granularity 2</span><br><span style="color: hsl(120, 100%, 40%);">+ "", // 0x09: Model Number</span><br><span style="color: hsl(120, 100%, 40%);">+ "", // 0x0a: Serial Number</span><br><span style="color: hsl(120, 100%, 40%);">+ "LION", // 0x0b: Battery Type</span><br><span style="color: hsl(120, 100%, 40%);">+ "" // 0x0c: OEM Information</span><br><span style="color: hsl(120, 100%, 40%);">+ })</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ Name (PBIX, Package () {</span><br><span style="color: hsl(120, 100%, 40%);">+ 0x00000000, // 0x00: Revision</span><br><span style="color: hsl(120, 100%, 40%);">+ 0x00000001, // 0x01: Power Unit: mAh</span><br><span style="color: hsl(120, 100%, 40%);">+ 0xFFFFFFFF, // 0x02: Design Capacity</span><br><span style="color: hsl(120, 100%, 40%);">+ 0xFFFFFFFF, // 0x03: Last Full Charge Capacity</span><br><span style="color: hsl(120, 100%, 40%);">+ 0x00000001, // 0x04: Battery Technology: Rechargeable</span><br><span style="color: hsl(120, 100%, 40%);">+ 0xFFFFFFFF, // 0x05: Design Voltage</span><br><span style="color: hsl(120, 100%, 40%);">+ 0x00000003, // 0x06: Design Capacity of Warning</span><br><span style="color: hsl(120, 100%, 40%);">+ 0xFFFFFFFF, // 0x07: Design Capacity of Low</span><br><span style="color: hsl(120, 100%, 40%);">+ 0x00000000, // 0x08: Cycle Count</span><br><span style="color: hsl(120, 100%, 40%);">+ 0x00018000, // 0x09: Measurement Accuracy (98.3%?)</span><br><span style="color: hsl(120, 100%, 40%);">+ 0x000001F4, // 0x0a: Max Sampling Time (500ms)</span><br><span style="color: hsl(120, 100%, 40%);">+ 0x0000000a, // 0x0b: Min Sampling Time (10ms)</span><br><span style="color: hsl(120, 100%, 40%);">+ 0xFFFFFFFF, // 0x0c: Max Averaging Interval</span><br><span style="color: hsl(120, 100%, 40%);">+ 0xFFFFFFFF, // 0x0d: Min Averaging Interval</span><br><span style="color: hsl(120, 100%, 40%);">+ 0x00000001, // 0x0e: Capacity Granularity 1</span><br><span style="color: hsl(120, 100%, 40%);">+ 0x00000001, // 0x0f: Capacity Granularity 2</span><br><span style="color: hsl(120, 100%, 40%);">+ "", // 0x10 Model Number</span><br><span style="color: hsl(120, 100%, 40%);">+ "", // 0x11: Serial Number</span><br><span style="color: hsl(120, 100%, 40%);">+ "LION", // 0x12: Battery Type</span><br><span style="color: hsl(120, 100%, 40%);">+ "" // 0x13: OEM Information</span><br><span style="color: hsl(120, 100%, 40%);">+ })</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ Name (PBST, Package () {</span><br><span style="color: hsl(120, 100%, 40%);">+ 0x00000000, // 0x00: Battery State</span><br><span style="color: hsl(120, 100%, 40%);">+ 0xFFFFFFFF, // 0x01: Battery Present Rate</span><br><span style="color: hsl(120, 100%, 40%);">+ 0xFFFFFFFF, // 0x02: Battery Remaining Capacity</span><br><span style="color: hsl(120, 100%, 40%);">+ 0xFFFFFFFF, // 0x03: Battery Present Voltage</span><br><span style="color: hsl(120, 100%, 40%);">+ })</span><br><span style="color: hsl(120, 100%, 40%);">+ Name (BSTP, Zero)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ // Workaround for full battery status, enabled by default</span><br><span style="color: hsl(120, 100%, 40%);">+ Name (BFWK, One)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ // Method to enable full battery workaround</span><br><span style="color: hsl(120, 100%, 40%);">+ Method (BFWE)</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+ Store (One, BFWK)</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ // Method to disable full battery workaround</span><br><span style="color: hsl(120, 100%, 40%);">+ Method (BFWD)</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+ Store (Zero, BFWK)</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ Method (_STA, 0, Serialized)</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+ Return (BSTA (1))</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ Method (_BIF, 0, Serialized)</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+ Return (BBIF (1, PBIF))</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ Method (_BIX, 0, Serialized)</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+ Return (BBIX (1, PBIX))</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ Method (_BST, 0, Serialized)</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+ Return (BBST (1, PBST, BSTP, BFWK, BAT1))</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span>diff --git a/src/ec/google/chromeec/acpi/ec.asl b/src/ec/google/chromeec/acpi/ec.asl</span><br><span>index 618b00a..62f9acd 100644</span><br><span>--- a/src/ec/google/chromeec/acpi/ec.asl</span><br><span>+++ b/src/ec/google/chromeec/acpi/ec.asl</span><br><span>@@ -90,7 +90,9 @@</span><br><span> DEVE, 1, // EC supports device events</span><br><span> // make sure we're within our space envelope</span><br><span> Offset (0x0e),</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ Offset (0x12),</span><br><span style="color: hsl(120, 100%, 40%);">+ BTID, 8, // Battery index that host wants to read</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span> #if IS_ENABLED(CONFIG_EC_GOOGLE_CHROMEEC_ACPI_MEMMAP)</span><br><span> OperationRegion (EMEM, EmbeddedControl,</span><br><span>@@ -272,6 +274,11 @@</span><br><span> {</span><br><span> Store ("EC: BATTERY INFO", Debug)</span><br><span> Notify (BAT0, 0x81)</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef EC_ENABLE_SECOND_BATTERY_DEVICE</span><br><span style="color: hsl(120, 100%, 40%);">+ If (CondRefOf (BAT1)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ Notify (BAT1, 0x81)</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span> }</span><br><span> </span><br><span> // Thermal Overload Event</span><br><span>@@ -347,6 +354,11 @@</span><br><span> {</span><br><span> Store ("EC: BATTERY STATUS", Debug)</span><br><span> Notify (BAT0, 0x80)</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef EC_ENABLE_SECOND_BATTERY_DEVICE</span><br><span style="color: hsl(120, 100%, 40%);">+ If (CondRefOf (BAT1)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ Notify (BAT1, 0x80)</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span> }</span><br><span> </span><br><span> // MKBP interrupt.</span><br><span>diff --git a/src/ec/google/chromeec/acpi/emem.asl b/src/ec/google/chromeec/acpi/emem.asl</span><br><span>index ba98831..982ec5b 100644</span><br><span>--- a/src/ec/google/chromeec/acpi/emem.asl</span><br><span>+++ b/src/ec/google/chromeec/acpi/emem.asl</span><br><span>@@ -30,6 +30,8 @@</span><br><span> TIN9, 8, // Temperature 9</span><br><span> Offset (0x10),</span><br><span> FAN0, 16, // Fan Speed 0</span><br><span style="color: hsl(120, 100%, 40%);">+Offset (0x24),</span><br><span style="color: hsl(120, 100%, 40%);">+BTVR, 8, // Battery structure version</span><br><span> Offset (0x30),</span><br><span> LIDS, 1, // Lid Switch State</span><br><span> PBTN, 1, // Power Button Pressed</span><br><span>@@ -45,6 +47,9 @@</span><br><span> BFDC, 1, // Battery Discharging</span><br><span> BFCG, 1, // Battery Charging</span><br><span> BFCR, 1, // Battery Level Critical</span><br><span style="color: hsl(120, 100%, 40%);">+Offset (0x4d),</span><br><span style="color: hsl(120, 100%, 40%);">+BTCN, 8, // Battery Count</span><br><span style="color: hsl(120, 100%, 40%);">+BTIX, 8, // Battery index</span><br><span> Offset (0x50),</span><br><span> BTDA, 32, // Battery Design Capacity</span><br><span> BTDV, 32, // Battery Design Voltage</span><br><span></span><br></pre><p>To view, visit <a href="https://review.coreboot.org/23598">change 23598</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://review.coreboot.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://review.coreboot.org/23598"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: coreboot </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: Ib06176e6ab4c45a899259f0917e6292121865ed6 </div>
<div style="display:none"> Gerrit-Change-Number: 23598 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Nicolas Boichat <drinkcat@chromium.org> </div>