blob: 82269010ef1c1da2cc3788dbbc1ba9ba897ec36b [file] [log] [blame]
/* SPDX-License-Identifier: GPL-2.0-only */
// Scope (EC0)
Device (BATX)
{
Name (_HID, EISAID ("PNP0C0A"))
Name (_UID, 1)
Name (_PCL, Package () { \_SB })
//
// Indicator of BATX attach/detach
// Battery X Information
// Battery X Status
//
Name (BXST, Zero)
//
// Default Static Battery Information
//
Name (PBIF, Package()
{
0, // 0: Power Unit
0xFFFFFFFF, // 1: Design Capacity
0xFFFFFFFF, // 2: Last Full Charge Capacity
1, // 3: Battery Technology(Rechargeable)
10800, // 4: Design Voltage 10.8V
0, // 5: Design capacity of warning
0, // 6: Design capacity of low
1, // 7: Battery capacity granularity 1
1, // 8: Battery capacity granularity 2
"", // 9: Model Number
"", // 10: Serial Number
"", // 11: Battery Type
"" // 12: OEM Infomration
})
Name (PBST, Package ()
{
0x00000000, // Battery State
0xFFFFFFFF, // Battery Present Rate
0xFFFFFFFF, // Battery Remaining Capacity
0xFFFFFFFF, // Battery Present Voltage
})
// Workaround for full battery status, enabled by default
Name (BFWK, One)
// Method to enable full battery workaround
Method (BFWE)
{
BFWK = One
}
// Method to disable full battery workaround
Method (BFWD)
{
BFWK = Zero
}
// Method to wait for EC to be ready after changing the Battery Info ID
// Selector
Method (WAEC)
{
Local0 = 20 // Timeout 100 msec
While (HSID == 0)
{
// EC Is not ready
Sleep (5)
Local0--
If (Local0 == 0)
{
Break
}
}
}
// Battery Slot Status
Method (_STA, 0, Serialized)
{
BXST = MBTS
If (BXST)
{
// Battery is present
Return (0x1F)
}
Else
{
Return (0x0F)
}
}
Method (_BIF, 0, Serialized)
{
// Update fields from EC
//
// Information ID 1 -
//
HIID = One
WAEC ()
//
// Power Unit
// SMART battery : 1 - 10mWh : 0 - mAh
// ACPI spec : 0 - mWh : 1 - mAh
//
Local7 = SBCM
PBIF[0] = Local7 ^ One
//
// Information ID 0 -
//
HIID = Zero
WAEC ()
//
// Last Full Charge Capacity
//
If (Local7)
{
PBIF[2] = SBFC * 10
}
Else
{
PBIF[2] = SBFC
}
//
// Information ID 2 -
//
HIID = 2
WAEC ()
//
// Design capacity
//
If (Local7)
{
Local0 = SBDC * 10
}
Else
{
Local0 = SBDC
}
PBIF[1] = Local0
//
// Design capacity of High (5%)
// Design capacity of Low (1%)
//
PBIF[5] = Local0 / 20
PBIF[6] = Local0 / 100
//
// Design voltage
//
PBIF[4] = SBDV
//
// Serial Number
//
PBIF[10] = ToHexString (SBSN)
//
// Information ID 4 -
//
HIID = 4
WAEC ()
//
// Battery Type - Device Chemistry
//
PBIF[11] = ToString (Concatenate(SBCH, 0x00))
//
// Information ID 5 -
//
HIID = 5
WAEC ()
//
// OEM Information - Manufacturer Name
//
PBIF[12] = ToString (Concatenate(SBMN, 0x00))
//
// Information ID 6 -
//
HIID = 6
WAEC ()
//
// Model Number - Device Name
//
PBIF[9] = ToString (Concatenate(SBDN, 0x00))
Return (PBIF)
}
Method (_BST, 0, Serialized)
{
// Update Battery First Used Date, if requested
If (BFUD)
{
// TODO: Handle First Used Date Request
//\BFUD()
}
//
// 0: BATTERY STATE
//
// bit 0 = discharging
// bit 1 = charging
// bit 2 = critical level
//
// Get battery state from EC
If (And (HB0S, 0x20))
{
Local0 = 2
}
Else
{
if (And (HB0S, 0x40))
{
Local0 = One
}
Else
{
Local0 = Zero
}
}
// Set critical flag if battery is empty
If (And (HB0S, 0x0F) == 0)
{
Or (Local0, 4, Local0)
}
Local1 = Zero
// Check if AC is present
If (ACPW)
{
// Set only charging/discharging bits
And (Local0, 0x03, Local1)
}
Else
{
// Always discharging when on battery power
Local1 = One
}
// Flag if the battery level is critical
And (Local0, 0x04, Local4)
Or (Local1, Local4, Local1)
PBST[0] = Local1
//
// 1: BATTERY PRESENT RATE/CURRENT
//
Local1 = ECAC
If (Local1 >= 0x8000)
{
If (And (Local0, 1))
{
Local1 = 0x10000 - Local1
}
Else
{
// Error
Local1 = Zero
}
}
Else
{
If (!(AND (Local0, 2)))
{
// Battery is not charging
Local1 = Zero
}
}
Local6 = DerefOf (PBIF[0]) ^ One
If (Local6)
{
Local1 *= ECVO
Local1 /= 1000
}
PBST[1] = Local1
//
// 2: BATTERY REMAINING CAPACITY
//
// Get Power unit from the battery static information
// SMART battery : 1 - 10mWh : 0 - mAh
// ACPI spec : 0 - mWh : 1 - mAh
If (Local6)
{
Local1 = ECRC * 10
}
Else
{
Local1 = ECRC
}
If (BFWK && ACPW && !Local0)
{
// On AC power and battery is neither charging
// nor discharging. Linux expects a full battery
// to report same capacity as last full charge.
// https://bugzilla.kernel.org/show_bug.cgi?id=12632
// TODO: Is SBRS the "battery gas gauge"?
Local2 = SBRS
// See if within ~3% of full
Local3 = Local2 >> 5
If (Local1 > Local2 - Local3 && Local1 < Local2 + Local3)
{
Local1 = Local2
}
}
PBST[2] = Local1
//
// 3: BATTERY PRESENT VOLTAGE
//
PBST[3] = ECVO
Return (PBST)
}
}