diff --git a/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp b/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp index 5ca299f5..f5171082 100644 --- a/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp +++ b/Source/hoc-clk/sysmodule/src/bpmp/bpmp.cpp @@ -15,6 +15,7 @@ * */ +#include #include #include @@ -79,6 +80,8 @@ namespace bpmp { Thread s_pscThread; bool s_pscExit = false; + std::atomic_bool s_isAwake = true; + void PscThreadFunc(void *) { while (!s_pscExit) { Result rc = eventWait(&s_pscModule.event, 1'000'000'000ULL); @@ -95,6 +98,10 @@ namespace bpmp { if (R_FAILED(wrc)) { fileUtils::LogLine("[bpmp] restart after wake failed: 0x%x", wrc); } + + s_isAwake = true; + } else if (state == PscPmState_ReadySleep) { + s_isAwake = false; } pscPmModuleAcknowledge(&s_pscModule, state); @@ -221,4 +228,8 @@ namespace bpmp { return &s_sharedInfo; } + bool IsAwake() { + return s_isAwake; + } + } // namespace bpmp diff --git a/Source/hoc-clk/sysmodule/src/bpmp/bpmp.hpp b/Source/hoc-clk/sysmodule/src/bpmp/bpmp.hpp index 43d8bb32..f89810bb 100644 --- a/Source/hoc-clk/sysmodule/src/bpmp/bpmp.hpp +++ b/Source/hoc-clk/sysmodule/src/bpmp/bpmp.hpp @@ -27,4 +27,7 @@ namespace bpmp { void StopSleepMonitorThread(); const HocClkBpmpSharedInfo *GetSharedInfo(); + + // Always true on stock exosphere + bool IsAwake(); } diff --git a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp index 770dc65a..79fd11f6 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp +++ b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp @@ -879,6 +879,11 @@ namespace clockManager { } void WaitForNextTick() { + if (!bpmp::IsAwake()) { + svcSleepThread(250 * 1000000ULL); // 250ms + return; + } + if (board::GetHz(HocClkModule_MEM) > 665000000) svcSleepThread(config::GetConfigValue(HocClkConfigValue_PollingIntervalMs) * 1000000ULL); else