jerpelea opened a new pull request, #20304:
URL: https://github.com/apache/nuttx/pull/20304
## Summary
up_idlepm() (esp32s3_idle.c/esp32_idle.c/esp32s2_idle.c and the shared
risc-v esp_idle.c for esp32c3/esp32c6) has a recovery branch that forces the
domain back to PM_NORMAL when oldstate is not PM_NORMAL and nothing is
currently staying at it:
pm_stay(PM_IDLE_DOMAIN, PM_NORMAL);
pm_changestate(PM_IDLE_DOMAIN, PM_NORMAL);
newstate = PM_NORMAL;
pm_stay() here has no matching pm_relax() anywhere in any of the four files.
The first time this branch runs, the stay count for PM_NORMAL never returns to
0, and pm_checkstate() (called unconditionally right after this block) can
never recommend anything deeper than PM_NORMAL again for the rest of uptime --
the idle loop keeps running, but the governor is permanently pinned at full
power, with no further light or deep sleep.
Confirmed on real ESP32-S3 hardware (XIAO ESP32-S3, CONFIG_ESPRESSIF_WIFI +
CONFIG_PM + CONFIG_SCHED_TICKLESS): reading g_pmdomains[0] live via JTAG/GDB
showed a "system" wakelock stuck at state=PM_NORMAL, count=1, acquired a few
seconds after boot (right when Wi-Fi coming up briefly moves the domain off
PM_NORMAL and this branch then forces it back). Reproduced 4/4 times before
this fix (never a single PM_STANDBY transition or light-sleep-return log line
across a 40+ minute run), 0/4 after.
The trigger is timing-dependent (whether anything else already holds
PM_NORMAL at the moment this branch runs), which is likely why it does not
reproduce on every single boot.
Fix: release the stay right after the one pm_changestate() call it exists to
force, matching the comment already there ("Keep working in normal stage") -- a
one-shot nudge, not a standing hold.
Touching the switch statement right below the fix in all four files exposed
a pre-existing nxstyle violation (case labels indented level with the switch's
opening brace instead of one level in from it, per NuttX style); reindented
alongside since checkpatch lints the whole file. esp32s3_idle.c also had two
unrelated stray-indented lines ("Perform IDLE mode power management" /
up_idlepm()) in up_idle(); fixed those too, same reason.
## Impact
RELEASE
## Testing
CI
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]