Skip to content

Every browser arm runs at 75-78 C with the big cores capped to 1.0-1.5 GHz, and a phone on a PC's USB port discharges under that load until it browns out

scope: device:google-taimen · severity: trap · confidence: proven · subsystem: power

The trap – a browser measurement on this phone is a measurement of a thermally capped, discharging device, and nothing in the numbers says so.

Within ~40 s of a YouTube page loading the hottest zone is at 75-78 C, the DT’s passive trip (cpu*-thermal trip_point_0 = 75000) engages, and cpufreq-cpu4 sits at cooling state ~18/29: scaling_max_freq 1.0-1.5 GHz of 2.36 on the big cluster, 300-600 MHz of 1.9 on the little one. It stays there for as long as the page plays. Compare arms only against each other at the same temperature; print the hottest zone and the cap next to every number (ph-webarm.sh does not yet; thermal-arm style loops do).

Meanwhile the charger reports Charging but the PC port is an SDP: pmi8998-charger usb_type = Unknown [SDP] DCP CDP, input 470 mA at 4.98 V. The load (panel + throttled CPU + GPU at 710 MHz + wifi) draws more, so the battery nets -290 to -360 mA (bms current_now): 28% at 16:50 became 6% and 3.52 V at 17:47, followed by a reboot with nothing in pstore or the journal – a brown-out under a load spike, not a crash.

The port was never the problem. The PMIC reports TYPE_C_STATUS_1 = 0x20 (UFP_TYPEC_RD3P0: the host advertises 3 A on CC) next to APSD_RESULT = SDP; mainline qcom_smbx sets the input limit from BC1.2 alone and never reads the Rp bits it defines. Writing the advertised current by hand – echo 3000000 > /sys/class/power_supply/pmi8998-charger/current_max – took USBIN from 470 mA to 1.35 A and the battery from -300 to +915 mA on the same PC port, no reboot. Kernel patch 0208 (power: supply: qcom_smbx: honour the Type-C current advertisement) makes it permanent from r28 on; before that kernel, the sysfs write is the fix and it does not survive a reboot.

Do – on a kernel before r28, write current_max after every boot; reach the phone over wifi if the port is needed for a charger (HOST=<wlan ip>; every tool takes it from the environment), keep the session’s arms short, and read cat /sys/class/power_supply/bms/capacity before a long unattended loop. Do not infer “fps does not track the CPU clock, so the CPU is not the limit” from arms taken at different temperatures: the cap moves between arms. It was checked properly once (fps 27-30 at 1.13 and at 1.88 GHz, same page, same minute); see epiphanys-frame-is-20ms-of-compositor-cpu-plus-a-10ms-gpu-tail-not-a5xx-batches.