<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>