feat: add kernel ACPI support for querying battery percentage, add battery indicator to desktop, move log state to 0:/state directory
This commit is contained in:
1 parent
0a18b2cf2d
commit
e641500b40
34 files changed
+2461
-100
No files matched your search
+52
-1
@@ -82,6 +82,40 @@ IA32_PM_ENABLE, HWP requests, and MSR_POWER_CTL do not survive suspend.
|
||||
BSP setup, and bumps the policy epoch so every AP re-applies its HWP
|
||||
request (and re-checks C1E) on its next tick.
|
||||
|
||||
### Battery (`ACPI/Battery.cpp`, `ACPI/EmbeddedController.cpp`)
|
||||
|
||||
Battery state comes from the ACPI Control Method Battery
|
||||
(`_HID PNP0C0A`) and, for the AC adapter, `ACPI0003`:
|
||||
|
||||
- `_STA` bit 4 says whether a pack is installed. A laptop with the pack
|
||||
removed still has the device, which is why "has a battery device" and
|
||||
"has a battery" are separate answers.
|
||||
- `_BIX` (or `_BIF` on older firmware) gives the power unit (mWh vs mAh),
|
||||
the design capacity, and the last full charge capacity.
|
||||
- `_BST` gives the charge/discharge state, the present rate, the remaining
|
||||
capacity and the present voltage.
|
||||
- `_PSR` on the adapter says whether it is plugged in.
|
||||
|
||||
Percentage is remaining / last-full, clamped to 100 and falling back to the
|
||||
design capacity when firmware reports last-full as zero. Results are cached
|
||||
for two seconds so that a panel repaint does not turn into EC traffic.
|
||||
|
||||
Almost all of this reaches the CPU through the **embedded controller**.
|
||||
`Hal::EmbeddedController` finds the EC's command/data port pair from the
|
||||
ECDT table when one exists, and otherwise from `_CRS` on the `PNP0C09`
|
||||
device, then drives the polled read/write protocol (`0x80`/`0x81` with
|
||||
OBF/IBF handshaking). It is wired into the AML interpreter as the
|
||||
`EmbeddedControl` region space, so any `OperationRegion` in the DSDT that
|
||||
targets the EC now works -- battery methods being the first user.
|
||||
|
||||
Supporting `_BST` also needed real package element storage in the AML
|
||||
interpreter. Firmware overwhelmingly builds its result package with
|
||||
`Store(x, Index(BST0, n))`, which requires `Index()` to name a writable
|
||||
element rather than yield a value. `AML::PackageStore` provides that: a
|
||||
persistent region for packages declared with `Name()`, and a transient ring
|
||||
rewound at each top-level evaluation for packages built inside a method, so
|
||||
polling `_BST` cannot exhaust it.
|
||||
|
||||
## Diagnostics
|
||||
|
||||
`SYS_POWERINFO` (149) fills a `PowerInfo` struct: package temperature,
|
||||
@@ -90,7 +124,15 @@ CPUID base/turbo frequency, the measured average active frequency
|
||||
(APERF/MPERF over the 500 ms governor window), and the AP idle MWAIT hint.
|
||||
Returns -1 when the CPU exposes no power features (e.g. under QEMU).
|
||||
|
||||
The `power` program (`programs/src/power`) prints it:
|
||||
`SYS_BATTERYINFO` (188) fills a `BatteryInfo` struct: percentage, charge
|
||||
state, AC presence, capacities, present rate, voltage and an estimated time
|
||||
remaining. It returns -1 on a machine with no battery device at all, which
|
||||
is how the desktop panel decides not to draw an indicator. Like
|
||||
`SYS_POWERINFO` it is ungated read-only telemetry: the panel indicator has
|
||||
to work in an unprivileged session, which holds no device capability to
|
||||
spend on it.
|
||||
|
||||
The `power` program (`programs/src/power`) prints both:
|
||||
|
||||
```
|
||||
power one-shot snapshot
|
||||
@@ -104,8 +146,17 @@ Boot log lines to look for (Kernel Log app):
|
||||
[CpuPower] HWP enabled: perf range 4-54, EPP=0x80
|
||||
[CpuPower] Thermal governor armed: TjMax=100C, passive=85C, hot=94C, ...
|
||||
[CpuIdle] AP deep idle: MWAIT hint 0x20
|
||||
[EC] Embedded Controller at cmd=66 data=62
|
||||
[Battery] ACPI battery at \_SB.PCI0.LPCB.EC0.BAT0 (AC adapter present)
|
||||
```
|
||||
|
||||
The desktop panel shows a battery icon left of the Wi-Fi and network icons,
|
||||
using the icon pack's `battery-level-N[-charging]-symbolic` glyphs (one per
|
||||
10% step, reloaded only when the step changes). Clicking it opens a popout
|
||||
with the percentage in numbers, the charge state, time remaining and raw
|
||||
capacity. The icon is absent entirely when `SYS_BATTERYINFO` fails, so a
|
||||
desktop machine shows nothing there.
|
||||
|
||||
## Tuning
|
||||
|
||||
The governor constants live at the top of `Hal/CpuPower.cpp`
|
||||
|
||||
Reference in new issue
Block a user