From 8f28daceefabcee877da66e912844fc851796d09 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Thu, 12 Feb 2026 16:12:36 +0100 Subject: [PATCH] DVFS: Add safety check --- .../sys-clk/sysmodule/src/clock_manager.cpp | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/Source/sys-clk/sysmodule/src/clock_manager.cpp b/Source/sys-clk/sysmodule/src/clock_manager.cpp index c682dca5..f8e92e01 100644 --- a/Source/sys-clk/sysmodule/src/clock_manager.cpp +++ b/Source/sys-clk/sysmodule/src/clock_manager.cpp @@ -566,14 +566,23 @@ void ClockManager::Tick() ); if(module == SysClkModule_MEM && Board::GetSocType() == SysClkSocType_Mariko && targetHz > oldHz && this->config->GetConfigValue(HorizonOCConfigValue_DVFSMode) == DVFSMode_Hijack) { - Board::PcvHijackDvfs(Board::GetMinimumGpuVoltage(targetHz / 1000000)); - I2c_BuckConverter_SetMvOut(&I2c_Mariko_GPU, Board::GetMinimumGpuVoltage(targetHz / 1000000)); - this->context->voltages[HocClkVoltage_GPU] = Board::GetMinimumGpuVoltage(targetHz / 1000000) * 1000; + u32 vmin = Board::GetMinimumGpuVoltage(targetHz / 1000000); + Board::PcvHijackDvfs(vmin); + + /* Update the voltage. */ + I2c_BuckConverter_SetMvOut(&I2c_Mariko_GPU, vmin); + + /* Wait until it's safe to update clock. */ + u32 gpuVolts; + while ((gpuVolts = I2c_BuckConverter_GetMvOut(&I2c_Mariko_GPU) != vmin)) { + svcSleepThread(50000); + } + + this->context->voltages[HocClkVoltage_GPU] = gpuVolts; } Board::SetHz((SysClkModule)module, nearestHz); this->context->freqs[module] = nearestHz; - } if(module == SysClkModule_MEM && Board::GetSocType() == SysClkSocType_Mariko && targetHz < oldHz && this->config->GetConfigValue(HorizonOCConfigValue_DVFSMode) == DVFSMode_Hijack) { @@ -599,12 +608,6 @@ void ClockManager::Tick() FixCpuBug(); } } - // else { - // if(module == SysClkModule_MEM && Board::GetSocType() == SysClkSocType_Mariko) { - // Board::PcvHijackDvfs(0); - // } - // } - } } }