Angel Pons | 210a008 | 2020-04-02 23:48:24 +0200 | [diff] [blame] | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
Stefan Reinauer | 7e56855 | 2013-03-13 17:03:04 -0700 | [diff] [blame] | 2 | |
| 3 | // Scope (EC0) |
| 4 | |
| 5 | Device (BATX) |
| 6 | { |
| 7 | Name (_HID, EISAID ("PNP0C0A")) |
| 8 | Name (_UID, 1) |
| 9 | Name (_PCL, Package () { \_SB }) |
| 10 | |
| 11 | // |
| 12 | // Indicator of BATX attach/detach |
| 13 | // Battery X Information |
| 14 | // Battery X Status |
| 15 | // |
| 16 | Name (BXST, Zero) |
| 17 | |
| 18 | // |
| 19 | // Default Static Battery Information |
| 20 | // |
| 21 | Name (PBIF, Package() |
| 22 | { |
| 23 | 0, // 0: Power Unit |
| 24 | 0xFFFFFFFF, // 1: Design Capacity |
| 25 | 0xFFFFFFFF, // 2: Last Full Charge Capacity |
Martin Roth | 0949e73 | 2021-10-01 14:28:22 -0600 | [diff] [blame] | 26 | 1, // 3: Battery Technology(Rechargeable) |
Stefan Reinauer | 7e56855 | 2013-03-13 17:03:04 -0700 | [diff] [blame] | 27 | 10800, // 4: Design Voltage 10.8V |
| 28 | 0, // 5: Design capacity of warning |
| 29 | 0, // 6: Design capacity of low |
| 30 | 1, // 7: Battery capacity granularity 1 |
| 31 | 1, // 8: Battery capacity granularity 2 |
| 32 | "", // 9: Model Number |
| 33 | "", // 10: Serial Number |
| 34 | "", // 11: Battery Type |
| 35 | "" // 12: OEM Infomration |
| 36 | }) |
| 37 | |
| 38 | Name (PBST, Package () |
| 39 | { |
| 40 | 0x00000000, // Battery State |
| 41 | 0xFFFFFFFF, // Battery Present Rate |
| 42 | 0xFFFFFFFF, // Battery Remaining Capacity |
| 43 | 0xFFFFFFFF, // Battery Present Voltage |
| 44 | }) |
| 45 | |
| 46 | // Workaround for full battery status, enabled by default |
| 47 | Name (BFWK, One) |
| 48 | |
| 49 | // Method to enable full battery workaround |
| 50 | Method (BFWE) |
| 51 | { |
Felix Singer | 612801d | 2022-12-12 04:56:53 +0100 | [diff] [blame] | 52 | BFWK = One |
Stefan Reinauer | 7e56855 | 2013-03-13 17:03:04 -0700 | [diff] [blame] | 53 | } |
| 54 | |
| 55 | // Method to disable full battery workaround |
| 56 | Method (BFWD) |
| 57 | { |
Felix Singer | 612801d | 2022-12-12 04:56:53 +0100 | [diff] [blame] | 58 | BFWK = Zero |
Stefan Reinauer | 7e56855 | 2013-03-13 17:03:04 -0700 | [diff] [blame] | 59 | } |
| 60 | |
| 61 | // Method to wait for EC to be ready after changing the Battery Info ID |
| 62 | // Selector |
| 63 | Method (WAEC) |
| 64 | { |
Felix Singer | 612801d | 2022-12-12 04:56:53 +0100 | [diff] [blame] | 65 | Local0 = 20 // Timeout 100 msec |
Felix Singer | 1e96554 | 2022-01-02 01:04:39 +0100 | [diff] [blame] | 66 | While (HSID == 0) |
Stefan Reinauer | 7e56855 | 2013-03-13 17:03:04 -0700 | [diff] [blame] | 67 | { |
| 68 | // EC Is not ready |
| 69 | Sleep (5) |
Felix Singer | d4a91aa | 2021-12-31 14:17:57 +0100 | [diff] [blame] | 70 | Local0-- |
Felix Singer | 1e96554 | 2022-01-02 01:04:39 +0100 | [diff] [blame] | 71 | If (Local0 == 0) |
Stefan Reinauer | 7e56855 | 2013-03-13 17:03:04 -0700 | [diff] [blame] | 72 | { |
| 73 | Break |
| 74 | } |
| 75 | } |
| 76 | } |
| 77 | |
| 78 | // Battery Slot Status |
| 79 | Method (_STA, 0, Serialized) |
| 80 | { |
Felix Singer | 612801d | 2022-12-12 04:56:53 +0100 | [diff] [blame] | 81 | BXST = MBTS |
Stefan Reinauer | 7e56855 | 2013-03-13 17:03:04 -0700 | [diff] [blame] | 82 | If (BXST) |
| 83 | { |
| 84 | // Battery is present |
| 85 | Return (0x1F) |
| 86 | } |
| 87 | Else |
| 88 | { |
| 89 | Return (0x0F) |
| 90 | } |
| 91 | } |
| 92 | |
| 93 | Method (_BIF, 0, Serialized) |
| 94 | { |
| 95 | // Update fields from EC |
| 96 | |
| 97 | // |
| 98 | // Information ID 1 - |
| 99 | // |
Felix Singer | 612801d | 2022-12-12 04:56:53 +0100 | [diff] [blame] | 100 | HIID = One |
Stefan Reinauer | 7e56855 | 2013-03-13 17:03:04 -0700 | [diff] [blame] | 101 | WAEC () |
| 102 | |
| 103 | // |
| 104 | // Power Unit |
| 105 | // SMART battery : 1 - 10mWh : 0 - mAh |
| 106 | // ACPI spec : 0 - mWh : 1 - mAh |
| 107 | // |
Felix Singer | 612801d | 2022-12-12 04:56:53 +0100 | [diff] [blame] | 108 | Local7 = SBCM |
Felix Singer | f3649f0 | 2022-12-16 04:07:23 +0100 | [diff] [blame] | 109 | PBIF[0] = Local7 ^ One |
Stefan Reinauer | 7e56855 | 2013-03-13 17:03:04 -0700 | [diff] [blame] | 110 | |
| 111 | // |
| 112 | // Information ID 0 - |
| 113 | // |
Felix Singer | 612801d | 2022-12-12 04:56:53 +0100 | [diff] [blame] | 114 | HIID = Zero |
Stefan Reinauer | 7e56855 | 2013-03-13 17:03:04 -0700 | [diff] [blame] | 115 | WAEC () |
| 116 | |
| 117 | // |
| 118 | // Last Full Charge Capacity |
| 119 | // |
| 120 | If (Local7) |
| 121 | { |
Felix Singer | f1f861e | 2022-01-01 23:41:10 +0100 | [diff] [blame] | 122 | PBIF[2] = SBFC * 10 |
Stefan Reinauer | 7e56855 | 2013-03-13 17:03:04 -0700 | [diff] [blame] | 123 | } |
| 124 | Else |
| 125 | { |
Felix Singer | 612801d | 2022-12-12 04:56:53 +0100 | [diff] [blame] | 126 | PBIF[2] = SBFC |
Stefan Reinauer | 7e56855 | 2013-03-13 17:03:04 -0700 | [diff] [blame] | 127 | } |
| 128 | |
| 129 | // |
| 130 | // Information ID 2 - |
| 131 | // |
Felix Singer | 612801d | 2022-12-12 04:56:53 +0100 | [diff] [blame] | 132 | HIID = 2 |
Stefan Reinauer | 7e56855 | 2013-03-13 17:03:04 -0700 | [diff] [blame] | 133 | WAEC () |
| 134 | |
| 135 | // |
| 136 | // Design capacity |
| 137 | // |
| 138 | If (Local7) |
| 139 | { |
Felix Singer | f1f861e | 2022-01-01 23:41:10 +0100 | [diff] [blame] | 140 | Local0 = SBDC * 10 |
Stefan Reinauer | 7e56855 | 2013-03-13 17:03:04 -0700 | [diff] [blame] | 141 | } |
| 142 | Else |
| 143 | { |
Felix Singer | 612801d | 2022-12-12 04:56:53 +0100 | [diff] [blame] | 144 | Local0 = SBDC |
Stefan Reinauer | 7e56855 | 2013-03-13 17:03:04 -0700 | [diff] [blame] | 145 | } |
Felix Singer | 612801d | 2022-12-12 04:56:53 +0100 | [diff] [blame] | 146 | PBIF[1] = Local0 |
Stefan Reinauer | 7e56855 | 2013-03-13 17:03:04 -0700 | [diff] [blame] | 147 | |
| 148 | // |
| 149 | // Design capacity of High (5%) |
| 150 | // Design capacity of Low (1%) |
| 151 | // |
Felix Singer | 3f53ee3 | 2022-01-02 00:02:13 +0100 | [diff] [blame] | 152 | PBIF[5] = Local0 / 20 |
| 153 | PBIF[6] = Local0 / 100 |
Stefan Reinauer | 7e56855 | 2013-03-13 17:03:04 -0700 | [diff] [blame] | 154 | |
| 155 | // |
| 156 | // Design voltage |
| 157 | // |
Felix Singer | 612801d | 2022-12-12 04:56:53 +0100 | [diff] [blame] | 158 | PBIF[4] = SBDV |
Stefan Reinauer | 7e56855 | 2013-03-13 17:03:04 -0700 | [diff] [blame] | 159 | |
| 160 | // |
| 161 | // Serial Number |
| 162 | // |
Felix Singer | 612801d | 2022-12-12 04:56:53 +0100 | [diff] [blame] | 163 | PBIF[10] = ToHexString (SBSN) |
Stefan Reinauer | 7e56855 | 2013-03-13 17:03:04 -0700 | [diff] [blame] | 164 | |
| 165 | // |
| 166 | // Information ID 4 - |
| 167 | // |
Felix Singer | 612801d | 2022-12-12 04:56:53 +0100 | [diff] [blame] | 168 | HIID = 4 |
Stefan Reinauer | 7e56855 | 2013-03-13 17:03:04 -0700 | [diff] [blame] | 169 | WAEC () |
| 170 | |
| 171 | // |
| 172 | // Battery Type - Device Chemistry |
| 173 | // |
Felix Singer | 612801d | 2022-12-12 04:56:53 +0100 | [diff] [blame] | 174 | PBIF[11] = ToString (Concatenate(SBCH, 0x00)) |
Stefan Reinauer | 7e56855 | 2013-03-13 17:03:04 -0700 | [diff] [blame] | 175 | |
| 176 | // |
| 177 | // Information ID 5 - |
| 178 | // |
Felix Singer | 612801d | 2022-12-12 04:56:53 +0100 | [diff] [blame] | 179 | HIID = 5 |
Stefan Reinauer | 7e56855 | 2013-03-13 17:03:04 -0700 | [diff] [blame] | 180 | WAEC () |
| 181 | |
| 182 | // |
| 183 | // OEM Information - Manufacturer Name |
| 184 | // |
Felix Singer | 612801d | 2022-12-12 04:56:53 +0100 | [diff] [blame] | 185 | PBIF[12] = ToString (Concatenate(SBMN, 0x00)) |
Stefan Reinauer | 7e56855 | 2013-03-13 17:03:04 -0700 | [diff] [blame] | 186 | |
| 187 | // |
| 188 | // Information ID 6 - |
| 189 | // |
Felix Singer | 612801d | 2022-12-12 04:56:53 +0100 | [diff] [blame] | 190 | HIID = 6 |
Stefan Reinauer | 7e56855 | 2013-03-13 17:03:04 -0700 | [diff] [blame] | 191 | WAEC () |
| 192 | |
| 193 | // |
| 194 | // Model Number - Device Name |
| 195 | // |
Felix Singer | 612801d | 2022-12-12 04:56:53 +0100 | [diff] [blame] | 196 | PBIF[9] = ToString (Concatenate(SBDN, 0x00)) |
Stefan Reinauer | 7e56855 | 2013-03-13 17:03:04 -0700 | [diff] [blame] | 197 | |
| 198 | Return (PBIF) |
| 199 | } |
| 200 | |
| 201 | Method (_BST, 0, Serialized) |
| 202 | { |
| 203 | // Update Battery First Used Date, if requested |
| 204 | If (BFUD) |
| 205 | { |
| 206 | // TODO: Handle First Used Date Request |
| 207 | //\BFUD() |
| 208 | } |
| 209 | |
| 210 | // |
| 211 | // 0: BATTERY STATE |
| 212 | // |
| 213 | // bit 0 = discharging |
| 214 | // bit 1 = charging |
| 215 | // bit 2 = critical level |
| 216 | // |
| 217 | |
| 218 | // Get battery state from EC |
| 219 | If (And (HB0S, 0x20)) |
| 220 | { |
Felix Singer | 612801d | 2022-12-12 04:56:53 +0100 | [diff] [blame] | 221 | Local0 = 2 |
Stefan Reinauer | 7e56855 | 2013-03-13 17:03:04 -0700 | [diff] [blame] | 222 | } |
| 223 | Else |
| 224 | { |
| 225 | if (And (HB0S, 0x40)) |
| 226 | { |
Felix Singer | 612801d | 2022-12-12 04:56:53 +0100 | [diff] [blame] | 227 | Local0 = One |
Stefan Reinauer | 7e56855 | 2013-03-13 17:03:04 -0700 | [diff] [blame] | 228 | } |
| 229 | Else |
| 230 | { |
Felix Singer | 612801d | 2022-12-12 04:56:53 +0100 | [diff] [blame] | 231 | Local0 = Zero |
Stefan Reinauer | 7e56855 | 2013-03-13 17:03:04 -0700 | [diff] [blame] | 232 | } |
| 233 | } |
| 234 | |
| 235 | // Set critical flag if battery is empty |
Felix Singer | 1e96554 | 2022-01-02 01:04:39 +0100 | [diff] [blame] | 236 | If (And (HB0S, 0x0F) == 0) |
Stefan Reinauer | 7e56855 | 2013-03-13 17:03:04 -0700 | [diff] [blame] | 237 | { |
Felix Singer | 86bc2e7 | 2022-12-16 04:40:39 +0100 | [diff] [blame^] | 238 | Local0 |= 4 |
Stefan Reinauer | 7e56855 | 2013-03-13 17:03:04 -0700 | [diff] [blame] | 239 | } |
| 240 | |
Felix Singer | 612801d | 2022-12-12 04:56:53 +0100 | [diff] [blame] | 241 | Local1 = Zero |
Stefan Reinauer | 7e56855 | 2013-03-13 17:03:04 -0700 | [diff] [blame] | 242 | |
| 243 | // Check if AC is present |
| 244 | If (ACPW) |
| 245 | { |
| 246 | // Set only charging/discharging bits |
| 247 | And (Local0, 0x03, Local1) |
| 248 | } |
| 249 | Else |
| 250 | { |
| 251 | // Always discharging when on battery power |
Felix Singer | 612801d | 2022-12-12 04:56:53 +0100 | [diff] [blame] | 252 | Local1 = One |
Stefan Reinauer | 7e56855 | 2013-03-13 17:03:04 -0700 | [diff] [blame] | 253 | } |
| 254 | |
| 255 | // Flag if the battery level is critical |
| 256 | And (Local0, 0x04, Local4) |
Felix Singer | 86bc2e7 | 2022-12-16 04:40:39 +0100 | [diff] [blame^] | 257 | Local1 |= Local4 |
Felix Singer | 612801d | 2022-12-12 04:56:53 +0100 | [diff] [blame] | 258 | PBST[0] = Local1 |
Stefan Reinauer | 7e56855 | 2013-03-13 17:03:04 -0700 | [diff] [blame] | 259 | |
| 260 | // |
| 261 | // 1: BATTERY PRESENT RATE/CURRENT |
| 262 | // |
Felix Singer | 612801d | 2022-12-12 04:56:53 +0100 | [diff] [blame] | 263 | Local1 = ECAC |
Felix Singer | d40d0b0 | 2022-01-02 02:20:50 +0100 | [diff] [blame] | 264 | If (Local1 >= 0x8000) |
Stefan Reinauer | 7e56855 | 2013-03-13 17:03:04 -0700 | [diff] [blame] | 265 | { |
| 266 | If (And (Local0, 1)) |
| 267 | { |
Felix Singer | f00caca | 2021-12-30 01:09:03 +0100 | [diff] [blame] | 268 | Local1 = 0x10000 - Local1 |
Stefan Reinauer | 7e56855 | 2013-03-13 17:03:04 -0700 | [diff] [blame] | 269 | } |
| 270 | Else |
| 271 | { |
| 272 | // Error |
Felix Singer | 612801d | 2022-12-12 04:56:53 +0100 | [diff] [blame] | 273 | Local1 = Zero |
Stefan Reinauer | 7e56855 | 2013-03-13 17:03:04 -0700 | [diff] [blame] | 274 | } |
| 275 | } |
| 276 | Else |
| 277 | { |
Felix Singer | ecc63d9 | 2021-12-31 14:34:36 +0100 | [diff] [blame] | 278 | If (!(AND (Local0, 2))) |
Stefan Reinauer | 7e56855 | 2013-03-13 17:03:04 -0700 | [diff] [blame] | 279 | { |
| 280 | // Battery is not charging |
Felix Singer | 612801d | 2022-12-12 04:56:53 +0100 | [diff] [blame] | 281 | Local1 = Zero |
Stefan Reinauer | 7e56855 | 2013-03-13 17:03:04 -0700 | [diff] [blame] | 282 | } |
| 283 | } |
| 284 | |
Felix Singer | f3649f0 | 2022-12-16 04:07:23 +0100 | [diff] [blame] | 285 | Local6 = DerefOf (PBIF[0]) ^ One |
Stefan Reinauer | 7e56855 | 2013-03-13 17:03:04 -0700 | [diff] [blame] | 286 | |
| 287 | If (Local6) |
| 288 | { |
Felix Singer | f1f861e | 2022-01-01 23:41:10 +0100 | [diff] [blame] | 289 | Local1 *= ECVO |
Felix Singer | 3f53ee3 | 2022-01-02 00:02:13 +0100 | [diff] [blame] | 290 | Local1 /= 1000 |
Stefan Reinauer | 7e56855 | 2013-03-13 17:03:04 -0700 | [diff] [blame] | 291 | } |
Felix Singer | 612801d | 2022-12-12 04:56:53 +0100 | [diff] [blame] | 292 | PBST[1] = Local1 |
Stefan Reinauer | 7e56855 | 2013-03-13 17:03:04 -0700 | [diff] [blame] | 293 | |
| 294 | // |
| 295 | // 2: BATTERY REMAINING CAPACITY |
| 296 | // |
| 297 | // Get Power unit from the battery static information |
| 298 | // SMART battery : 1 - 10mWh : 0 - mAh |
| 299 | // ACPI spec : 0 - mWh : 1 - mAh |
| 300 | If (Local6) |
| 301 | { |
Felix Singer | f1f861e | 2022-01-01 23:41:10 +0100 | [diff] [blame] | 302 | Local1 = ECRC * 10 |
Stefan Reinauer | 7e56855 | 2013-03-13 17:03:04 -0700 | [diff] [blame] | 303 | } |
| 304 | Else |
| 305 | { |
Felix Singer | 612801d | 2022-12-12 04:56:53 +0100 | [diff] [blame] | 306 | Local1 = ECRC |
Stefan Reinauer | 7e56855 | 2013-03-13 17:03:04 -0700 | [diff] [blame] | 307 | } |
| 308 | |
Felix Singer | ecc63d9 | 2021-12-31 14:34:36 +0100 | [diff] [blame] | 309 | If (BFWK && ACPW && !Local0) |
Stefan Reinauer | 7e56855 | 2013-03-13 17:03:04 -0700 | [diff] [blame] | 310 | { |
| 311 | // On AC power and battery is neither charging |
| 312 | // nor discharging. Linux expects a full battery |
| 313 | // to report same capacity as last full charge. |
| 314 | // https://bugzilla.kernel.org/show_bug.cgi?id=12632 |
| 315 | // TODO: Is SBRS the "battery gas gauge"? |
Felix Singer | 612801d | 2022-12-12 04:56:53 +0100 | [diff] [blame] | 316 | Local2 = SBRS |
Stefan Reinauer | 7e56855 | 2013-03-13 17:03:04 -0700 | [diff] [blame] | 317 | |
| 318 | // See if within ~3% of full |
Felix Singer | 034920c | 2022-12-16 02:25:30 +0100 | [diff] [blame] | 319 | Local3 = Local2 >> 5 |
Felix Singer | 0375b82 | 2022-01-02 01:58:55 +0100 | [diff] [blame] | 320 | If (Local1 > Local2 - Local3 && Local1 < Local2 + Local3) |
Stefan Reinauer | 7e56855 | 2013-03-13 17:03:04 -0700 | [diff] [blame] | 321 | { |
Felix Singer | 612801d | 2022-12-12 04:56:53 +0100 | [diff] [blame] | 322 | Local1 = Local2 |
Stefan Reinauer | 7e56855 | 2013-03-13 17:03:04 -0700 | [diff] [blame] | 323 | } |
| 324 | } |
Felix Singer | 612801d | 2022-12-12 04:56:53 +0100 | [diff] [blame] | 325 | PBST[2] = Local1 |
Stefan Reinauer | 7e56855 | 2013-03-13 17:03:04 -0700 | [diff] [blame] | 326 | |
| 327 | // |
| 328 | // 3: BATTERY PRESENT VOLTAGE |
| 329 | // |
Felix Singer | 612801d | 2022-12-12 04:56:53 +0100 | [diff] [blame] | 330 | PBST[3] = ECVO |
Stefan Reinauer | 7e56855 | 2013-03-13 17:03:04 -0700 | [diff] [blame] | 331 | |
| 332 | Return (PBST) |
| 333 | } |
| 334 | } |