1/* SPDX-License-Identifier: GPL-2.0-only */ 2 3Mutex (BATM, 0) 4 5Method (ESTA, 1, Serialized) 6{ 7 /* Check battery presence */ 8 If (Arg0 == 1) { 9 Local0 = R (BTEX) 10 } ElseIf (Arg0 == 2) { 11 Local0 = R (P3B2) 12 } Else { 13 Local0 = 0 14 } 15 16 /* Indicate battery is present */ 17 If (Local0) { 18 Return (0x1f) 19 } Else { 20 Return (0xf) 21 } 22} 23 24Name (BSTM, 0x01) /* Battery Model String */ 25Name (BSTC, 0x02) /* Battery Chemistry String */ 26Name (BSTG, 0x03) /* Battery Manufacturer String */ 27 28/* 29 * Read a battery string from the EC 30 * Arg0 = Battery String ID 31 * BSTM = Model 32 * BSTC = Chemical 33 * BSTG = Manufacturer 34 */ 35Method (BSTR, 1, Serialized) 36{ 37 /* Max string length */ 38 Local0 = 32 39 40 /* Select battery string */ 41 W (SSEL, Arg0) 42 43 /* Fill buffer until NUL or max string length is read */ 44 Name (IBUF, Buffer (Local0 + 1) {}) 45 For (Local1 = 0, Local1 < Local0, Local1++) { 46 Local2 = R (BSBS) 47 If (!Local2) { 48 Break 49 } 50 IBUF[Local1] = Local2 51 } 52 53 /* Truncate and NUL terminate */ 54 Local1++ 55 Name (OBUF, Buffer (Local1) {}) 56 OBUF = Concatenate (IBUF, 0) 57 58 Return (OBUF) 59} 60 61/* 62 * Handle Battery Status 63 * Arg0 = Battery Number 64 * Arg1 = _BST package 65 */ 66Method (EBST, 2, Serialized) 67{ 68 If (Acquire (BATM, 1000)) { 69 Return (Arg1) 70 } 71 72 /* Select battery */ 73 W (BSEL, Arg0) 74 75 /* 0: Battery State */ 76 Arg1[0] = R (BCST) 77 78 /* 1: Battery Present Rate */ 79 Local0 = R (BCCL) 80 If (!Local0) { 81 Local0++ 82 } ElseIf (R (ACEX)) { 83 If (Local0 & 0x8000) { 84 Local0 = Ones 85 } 86 } Else { 87 If (Local0 & 0x8000) { 88 Local0 = 0 - Local0 89 Local0 &= 0xffff 90 } Else { 91 Local0 = Ones 92 } 93 } 94 Arg1[1] = Local0 95 96 /* 2: Battery Remaining Capacity */ 97 Arg1[2] = R (BCYL) 98 99 /* 3: Battery Present Voltage */ 100 Arg1[3] = R (BCVL) 101 102 Release (BATM) 103 Return (Arg1) 104} 105 106/* 107 * Handle Battery Info 108 * Arg0 = Battery Number 109 * Arg1 = _BIF package 110 */ 111Method (EBIF, 2, Serialized) 112{ 113 If (Acquire (BATM, 1000)) { 114 Return (Arg1) 115 } 116 117 /* Select battery */ 118 W (BSEL, Arg0) 119 120 /* Design Capacity */ 121 Local0 = R (BSCL) 122 Arg1[1] = Local0 123 124 /* Last Full Charge Capacity */ 125 Arg1[2] = R (BSFL) 126 127 /* Design Voltage */ 128 Arg1[4] = R (BSVL) 129 130 /* Design Warning Capacity */ 131 Arg1[5] = (Local0 * 10) / 100 132 133 /* Design Low Capacity */ 134 Arg1[6] = (Local0 * 33) / 100 135 136 /* Granularity */ 137 Arg1[7] = Local0 / 100 138 Arg1[8] = Local0 / 100 139 140 /* Battery Model Number */ 141 Arg1[9] = BSTR (BSTM) 142 143 /* Battery Serial Number */ 144 Arg1[10] = ToDecimalString (R (BSSL)) 145 146 /* Battery Type */ 147 Arg1[11] = BSTR (BSTC) 148 149 /* Battery Manufacturer Name */ 150 Arg1[12] = BSTR (BSTG) 151 152 Release (BATM) 153 Return (Arg1) 154} 155 156/* 157 * Handle Battery Info Extended 158 * Arg0 = Battery Number 159 * Arg1 = _BIX package 160 */ 161Method (EBIX, 2, Serialized) 162{ 163 If (Acquire (BATM, 1000)) { 164 Return (Arg1) 165 } 166 167 /* Select battery */ 168 W (BSEL, Arg0) 169 170 /* Design Capacity */ 171 Local0 = R (BSCL) 172 Arg1[2] = Local0 173 174 /* Last Full Charge Capacity */ 175 Arg1[3] = R (BSFL) 176 177 /* Design Voltage */ 178 Arg1[5] = R (BSVL) 179 180 /* Design Warning Capacity */ 181 Arg1[6] = (Local0 * 10) / 100 182 183 /* Design Low Capacity */ 184 Arg1[7] = (Local0 * 33) / 100 185 186 /* Cycle Count */ 187 Arg1[8] = R (BCCY) 188 189 /* Granularity */ 190 Arg1[14] = Local0 / 100 191 Arg1[15] = Local0 / 100 192 193 /* Battery Model Number */ 194 Arg1[16] = BSTR (BSTM) 195 196 /* Battery Serial Number */ 197 Arg1[17] = ToDecimalString (R (BSSL)) 198 199 /* Battery Type */ 200 Arg1[18] = BSTR (BSTC) 201 202 /* Battery Manufacturer Name */ 203 Arg1[19] = BSTR (BSTG) 204 205 Release (BATM) 206 Return (Arg1) 207} 208 209Device (BAT0) 210{ 211 Name (_HID, EisaId ("PNP0C0A")) 212 Name (_UID, 1) 213 Name (_PCL, Package () { \_SB }) 214 215 Name (PBIF, Package () { 216 0x00000001, /* 0x00: Power Unit: mAh */ 217 0xFFFFFFFF, /* 0x01: Design Capacity */ 218 0xFFFFFFFF, /* 0x02: Last Full Charge Capacity */ 219 0x00000001, /* 0x03: Battery Technology: Rechargeable */ 220 0xFFFFFFFF, /* 0x04: Design Voltage */ 221 0x00000003, /* 0x05: Design Capacity of Warning */ 222 0xFFFFFFFF, /* 0x06: Design Capacity of Low */ 223 0x00000001, /* 0x07: Capacity Granularity 1 */ 224 0x00000001, /* 0x08: Capacity Granularity 2 */ 225 "", /* 0x09: Model Number */ 226 "", /* 0x0a: Serial Number */ 227 "LION", /* 0x0b: Battery Type */ 228 "" /* 0x0c: OEM Information */ 229 }) 230 231 Name (PBIX, Package () { 232 0x00000000, /* 0x00: Revision */ 233 0x00000001, /* 0x01: Power Unit: mAh */ 234 0xFFFFFFFF, /* 0x02: Design Capacity */ 235 0xFFFFFFFF, /* 0x03: Last Full Charge Capacity */ 236 0x00000001, /* 0x04: Battery Technology: Rechargeable */ 237 0xFFFFFFFF, /* 0x05: Design Voltage */ 238 0x00000003, /* 0x06: Design Capacity of Warning */ 239 0xFFFFFFFF, /* 0x07: Design Capacity of Low */ 240 0x00000000, /* 0x08: Cycle Count */ 241 0x00018000, /* 0x09: Measurement Accuracy (98.3%?) */ 242 0x000001F4, /* 0x0a: Max Sampling Time (500ms) */ 243 0x0000000a, /* 0x0b: Min Sampling Time (10ms) */ 244 0xFFFFFFFF, /* 0x0c: Max Averaging Interval */ 245 0xFFFFFFFF, /* 0x0d: Min Averaging Interval */ 246 0x00000001, /* 0x0e: Capacity Granularity 1 */ 247 0x00000001, /* 0x0f: Capacity Granularity 2 */ 248 "", /* 0x10 Model Number */ 249 "", /* 0x11: Serial Number */ 250 "LION", /* 0x12: Battery Type */ 251 "" /* 0x13: OEM Information */ 252 }) 253 254 Name (PBST, Package () { 255 0x00000000, /* 0x00: Battery State */ 256 0xFFFFFFFF, /* 0x01: Battery Present Rate */ 257 0xFFFFFFFF, /* 0x02: Battery Remaining Capacity */ 258 0xFFFFFFFF, /* 0x03: Battery Present Voltage */ 259 }) 260 261 Method (_STA, 0, Serialized) 262 { 263 Return (ESTA (^_UID)) 264 } 265 266 Method (_BST, 0, Serialized) 267 { 268 Return (EBST (^_UID, PBST)) 269 } 270 271 Method (_BIF, 0, Serialized) 272 { 273 Return (EBIF (^_UID, PBIF)) 274 } 275 276 Method (_BIX, 0, Serialized) 277 { 278 Return (EBIX (^_UID, PBIX)) 279 } 280} 281 282Device (BAT1) 283{ 284 Name (_HID, EisaId ("PNP0C0A")) 285 Name (_UID, 2) 286 Name (_PCL, Package () { \_SB }) 287 288 Name (PBIF, Package () { 289 0x00000001, /* 0x00: Power Unit: mAh */ 290 0xFFFFFFFF, /* 0x01: Design Capacity */ 291 0xFFFFFFFF, /* 0x02: Last Full Charge Capacity */ 292 0x00000001, /* 0x03: Battery Technology: Rechargeable */ 293 0xFFFFFFFF, /* 0x04: Design Voltage */ 294 0x00000003, /* 0x05: Design Capacity of Warning */ 295 0xFFFFFFFF, /* 0x06: Design Capacity of Low */ 296 0x00000001, /* 0x07: Capacity Granularity 1 */ 297 0x00000001, /* 0x08: Capacity Granularity 2 */ 298 "", /* 0x09: Model Number */ 299 "", /* 0x0a: Serial Number */ 300 "LION", /* 0x0b: Battery Type */ 301 "" /* 0x0c: OEM Information */ 302 }) 303 304 Name (PBIX, Package () { 305 0x00000000, /* 0x00: Revision */ 306 0x00000001, /* 0x01: Power Unit: mAh */ 307 0xFFFFFFFF, /* 0x02: Design Capacity */ 308 0xFFFFFFFF, /* 0x03: Last Full Charge Capacity */ 309 0x00000001, /* 0x04: Battery Technology: Rechargeable */ 310 0xFFFFFFFF, /* 0x05: Design Voltage */ 311 0x00000003, /* 0x06: Design Capacity of Warning */ 312 0xFFFFFFFF, /* 0x07: Design Capacity of Low */ 313 0x00000000, /* 0x08: Cycle Count */ 314 0x00018000, /* 0x09: Measurement Accuracy (98.3%?) */ 315 0x000001F4, /* 0x0a: Max Sampling Time (500ms) */ 316 0x0000000a, /* 0x0b: Min Sampling Time (10ms) */ 317 0xFFFFFFFF, /* 0x0c: Max Averaging Interval */ 318 0xFFFFFFFF, /* 0x0d: Min Averaging Interval */ 319 0x00000001, /* 0x0e: Capacity Granularity 1 */ 320 0x00000001, /* 0x0f: Capacity Granularity 2 */ 321 "", /* 0x10 Model Number */ 322 "", /* 0x11: Serial Number */ 323 "LION", /* 0x12: Battery Type */ 324 "" /* 0x13: OEM Information */ 325 }) 326 327 Name (PBST, Package () { 328 0x00000000, /* 0x00: Battery State */ 329 0xFFFFFFFF, /* 0x01: Battery Present Rate */ 330 0xFFFFFFFF, /* 0x02: Battery Remaining Capacity */ 331 0xFFFFFFFF, /* 0x03: Battery Present Voltage */ 332 }) 333 334 Method (_STA, 0, Serialized) 335 { 336 Return (ESTA (^_UID)) 337 } 338 339 Method (_BST, 0, Serialized) 340 { 341 Return (EBST (^_UID, PBST)) 342 } 343 344 Method (_BIF, 0, Serialized) 345 { 346 Return (EBIF (^_UID, PBIF)) 347 } 348 349 Method (_BIX, 0, Serialized) 350 { 351 Return (EBIX (^_UID, PBIX)) 352 } 353} 354