Disabling the CPU retention idle state, as the vendor does, is worth about 0.02 mW and does not deepen idle
scope: soc:msm8998 · severity: finding · confidence: proven · subsystem: power
The question — the 2026-09-19 vendor teardown listed “retention idle
states enabled” as parity gap 8: init.taimen.rc:98-109 writes
idle_enabled N to every CPU ret level and to both clusters’ l2-dynret
and l2-ret, so the shipping phone goes WFI -> power collapse with nothing in
between. Ours has the middle rung on. It is one sysfs write per CPU and it was
called “directly vendor parity”. Is it worth anything?
The answer — about 0.02 mW, and it does not do what the gap assumed.
Our state1 is that rung (cpu-sleep-0-0 / cpu-sleep-1-0, psci param 0x2).
Disabling it on all eight CPUs moves idle time out of retention and into
WFI, not into power collapse:
| WFI | retention | power collapse | |
|---|---|---|---|
| enabled (stock), 2 rounds | 0.07 % / 0.09 % | 0.43 % / 0.48 % | 99.50 % / 99.43 % |
| disabled (vendor), 2 rounds | 0.59 % / 0.56 % | 0 | 99.42 % / 99.44 % |
The power-collapse share does not move. Against the vendor’s own ss-power
figures (msm8998-pm.dtsi: silver WFI 454 mW, retention 449 mW, PC 436 mW),
shifting 0.47 % of idle time from 449 mW to 454 mW is 0.024 mW. There is no
mechanism here, in either direction.
The useful fact from the same measurement: this phone already spends 99.4 % of idle CPU-time in power collapse. Per-CPU collapse is healthy and has been all along; what is missing is the system level, which is the RPM handshake – and that is a firmware wall, not a cpuidle one.
What this rules out —
- “The vendor disables retention because it deepens idle.” It does not. The governor spends the freed time in WFI.
- “Gap 8 is worth closing.” It is worth 0.02 mW. Shipping it would be parity
with no measurable effect, and it was dropped from
device-google-taimen’staimen-perf.conffor exactly that reason. - “msm8998 idle is not reaching power collapse.” 99.4 %.
How it was established — cpuidle/state*/time summed across all 8 CPUs,
two interleaved 60 s A/B rounds with a 3 s settle after each toggle, screen
blanked, full phosh session, kernel 7.2.2 #73. Both rounds agree to within a
tenth of a percent. Notably this needs NO current meter: the USBIN instrument
has a ~4.6 mA floor and could never have resolved this
(the-camera-hold-was-the-whole-244mw), whereas residency times the
vendor’s published per-state power answers it outright.
Overturned by: a workload with a very different idle-duration distribution – these shares are for an idle, blanked phone, and a busy one has shorter idles where the middle rung could matter more.
