244 mW of taimen's screen-off idle is three blocks nothing is using
scope: device:taimen · severity: finding · confidence: proven · subsystem: power
The question — the phone drains with the screen off. Everyone reaches for
the RPM handshake (vmin Count: 0), which is real but is BP-13/BP-14-sized work.
Is there anything above that floor, and how big is it?
The answer — yes: 48.3 mA at ~5.06 V, about 244 mW, from three hardware blocks that nothing on the device is using. Interleaved A/B, two rounds, 90 s blocks, screen off:
| arm | median USBIN |
|---|---|
| BASE round 1 | 257 851 uA |
| PARK round 1 | 207 202 uA |
| BASE round 2 | 253 247 uA |
| PARK round 2 | 207 202 uA |
Baseline-to-baseline spread is 4.6 mA, so the 48.3 mA delta is ten times the noise floor, and the two PARK medians are bit-identical.
The three blocks:
- Both camera sensors are pinned runtime-active from probe to unbind.
imx362(rear) andimx179(front) readcontrol=auto,runtime_status=active,runtime_active_time= the whole uptime,runtime_suspended_time=0. Cause is an unreleasedpm_runtime_get_noresume()at the end of probe, and the code says so:imx179.c:1116-1125— “Deliberately NO pm_runtime_idle() here yet …clk_prepare_enable()on MCLK1 returns -EBUSY once CAMSS_TOP has collapsed … it costs idle power and must not survive past bring-up.” This also pinsca0c000.cciand thecamss_topGDSC: unbinding the two sensors moved CCI tosuspendedin the same step. The blocker is the MCLK1 -EBUSY resume bug, not the hold. - Venus is powered from probe to unbind, by design — patch
0198(pm_runtime_forbid()onIS_V3), because msm8998 venus firmware survives no power collapse. Its own ponytail comment names this ceiling. The trade is correct; the number was just never measured. Now it is. - Easel (Intel Monette Hill) is powered at
bcm15602probe and never drops.bcm15602 4-0008: Easel powered (rails up, soc_pwr_good)at t=1.79 s, theneasel-mipiconfigures two D-PHY transmitters (RX0->TX0 at 1368 Mbps/lane,RX1->TX1 at 648 Mbps/lane) that stay configured for the life of the boot. The vendor does the opposite:mnh-smpowers Easel down and brings it up on demand, and thermal-engine throttles it from 48 C skin.
APPORTIONED 2026-09-20 — it was block 1, all of it. Dropping the camera
sensors’ pm_runtime_get_noresume() reaches the PARK median exactly, with
venus and Easel still powered: the-camera-hold-was-the-whole-244mw. The
Easel and venus items below are real descriptions of the hardware state and
are NOT worth idle-power work.
What this rules out —
- “The idle drain is all the missing RPM handshake.” The floor after parking is still ~207 mA and that part IS the handshake — but a fifth of screen-off idle sits above it and is ordinary driver lifecycle work.
- “The camera costs nothing while no camera app is running.” It costs the largest share of the 244 mW, every second of every boot.
- “
0198’s idle cost is theoretical.” It is measurable and it is now measured. Leave0198alone anyway — the alternative is a decoder that does not work (venus-decode-works-and-what-it-took) — but revisit it if the vendor PC contract is ever cracked.
How it was established — tools/ph-device.sh --need-booted for the mutex,
a detached systemd-run sampler so ssh was not in the loop during a block, and
the interleave discipline from one-arm-cannot-resolve-a-browser-change-here.
Instrument caveat that bounds every number here: this is USBIN current, not
battery drain — BP-00 §M7 stands, an absolute standby figure cannot be taken
over the cable, and the fuel gauge read a constant 8789 uA across every arm.
Deltas are sound; the absolute 1.28 W is a proxy. Overturned by: the same
interleave, unplugged, over WiFi.
