diff --git a/Source/sys-clk/sysmodule/src/clock_manager.cpp b/Source/sys-clk/sysmodule/src/clock_manager.cpp index 3dc946a2..9e54ac84 100644 --- a/Source/sys-clk/sysmodule/src/clock_manager.cpp +++ b/Source/sys-clk/sysmodule/src/clock_manager.cpp @@ -114,38 +114,40 @@ ClockManager::ClockManager() void ClockManager::FixCpuBug() { - u32 targetHz = 0; - u32 maxHz = 0; - u32 nearestHz = 0; + if(this->config->Refresh() && this->RefreshContext()) { + u32 targetHz = 0; + u32 maxHz = 0; + u32 nearestHz = 0; - // ResetToStockClocks(); + // ResetToStockClocks(); - targetHz = this->context->overrideFreqs[SysClkModule_CPU]; - if (!targetHz) { - targetHz = this->config->GetAutoClockHz(this->context->applicationId, SysClkModule_CPU, this->context->profile, false); - if(!targetHz) - targetHz = this->config->GetAutoClockHz(GLOBAL_PROFILE_ID, SysClkModule_CPU, this->context->profile, false); - } - - if (targetHz) { - maxHz = this->GetMaxAllowedHz(SysClkModule_CPU, this->context->profile); - nearestHz = this->GetNearestHz(SysClkModule_CPU, targetHz, maxHz); - - while ((nearestHz = this->GetNearestHz(SysClkModule_CPU, targetHz, maxHz)) != targetHz) { - Board::SetHz(SysClkModule_CPU, 1020000000); - svcSleepThread(1'000'000); - Board::SetHz(SysClkModule_CPU, maxHz); - this->context->freqs[SysClkModule_CPU] = maxHz; + targetHz = this->context->overrideFreqs[SysClkModule_CPU]; + if (!targetHz) { + targetHz = this->config->GetAutoClockHz(this->context->applicationId, SysClkModule_CPU, this->context->profile, false); + if(!targetHz) + targetHz = this->config->GetAutoClockHz(GLOBAL_PROFILE_ID, SysClkModule_CPU, this->context->profile, false); + } + + if (targetHz) { + maxHz = this->GetMaxAllowedHz(SysClkModule_CPU, this->context->profile); + nearestHz = this->GetNearestHz(SysClkModule_CPU, targetHz, maxHz); + + while ((nearestHz = this->GetNearestHz(SysClkModule_CPU, targetHz, maxHz)) != targetHz) { + Board::SetHz(SysClkModule_CPU, 1020000000); + svcSleepThread(1'000'000); + Board::SetHz(SysClkModule_CPU, maxHz); + this->context->freqs[SysClkModule_CPU] = maxHz; + } + Board::SetHz(SysClkModule_CPU, targetHz); } - Board::SetHz(SysClkModule_CPU, targetHz); } } ClockManager::~ClockManager() { + threadClose(&governorTHREAD); delete this->config; delete this->context; - threadClose(&governorTHREAD); } SysClkContext ClockManager::GetCurrentContext() @@ -323,7 +325,6 @@ void ClockManager::GovernorThread(void* arg) continue; } - std::scoped_lock lock{mgr->contextMutex}; if (!isGovernorEnabled) { @@ -337,6 +338,8 @@ void ClockManager::GovernorThread(void* arg) svcSleepThread(50'000'000); continue; } + + std::scoped_lock lock{mgr->contextMutex}; u32 currentHz = Board::GetHz(SysClkModule_GPU);