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]

Reply via email to