From ce8ec3cc60da1a611ffe77457a7e85e52586e59c Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Thu, 9 Jul 2026 18:25:43 +0200 Subject: [PATCH] fix ram reset during game start up --- .../sysmodule/src/mgr/clock_manager.cpp | 59 ++++++++++++------- 1 file changed, 37 insertions(+), 22 deletions(-) diff --git a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp index f34951e3..1bf5dad2 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp +++ b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp @@ -337,10 +337,27 @@ namespace clockManager { return std::min(voltage, maxGpuVoltage); } - u32 GetCurrentNearestGpuFrequency() { - u32 gpuHz = board::GetHz(HocClkModule_GPU); - u32 maxHz = GetMaxAllowedHz(HocClkModule_GPU, gContext.profile); - return GetNearestHz(HocClkModule_GPU, gpuHz, maxHz); + u32 GetCurrentNearestFrequency(HocClkModule module) { + /* Target freq may not match actual frequency so don't even bother with that. */ + u32 gpuHz = board::GetHz(module); + u32 maxHz = GetMaxAllowedHz(module, gContext.profile); + return GetNearestHz(module, gpuHz, maxHz); + } + + u32 GetNearestOverrideHz(HocClkModule module) { + u32 targetHz = gContext.overrideFreqs[module]; + if (!targetHz) { + targetHz = config::GetAutoClockHz(gContext.applicationId, module, gContext.profile, false); + if (!targetHz) { + targetHz = config::GetAutoClockHz(HOCCLK_GLOBAL_PROFILE_TID, module, gContext.profile, false); + } + } + + if (targetHz) { + targetHz = GetNearestHz(module, targetHz, GetMaxAllowedHz(module, gContext.profile)); + } + + return targetHz; } void ApplyGpuFreqVoltRequest(u32 voltage, u32 hz) { @@ -352,7 +369,7 @@ namespace clockManager { } voltage = ClampGpuVoltage(voltage); - u32 currentFreq = GetCurrentNearestGpuFrequency(); + u32 currentFreq = GetCurrentNearestFrequency(HocClkModule_GPU); /* If not freq was provided, use the current freq. */ if (hz == 0) { hz = currentFreq; @@ -380,7 +397,7 @@ namespace clockManager { /* Update gpu frequency to actually use the voltage. */ if (targetHz) { - board::SetHz(HocClkModule_GPU, GetCurrentNearestGpuFrequency()); + board::SetHz(HocClkModule_GPU, GetCurrentNearestFrequency(HocClkModule_GPU)); } else { /* If the target frequency is zero, we reset the frequency to ensure it gets updated even without any frequency override. */ board::ResetToStockGpu(); @@ -392,14 +409,7 @@ namespace clockManager { board::PcvHijackGpuVolts(0); // Reset to vMin u32 targetHz = gContext.overrideFreqs[HocClkModule_GPU]; - if (!targetHz) { - targetHz = config::GetAutoClockHz(gContext.applicationId, HocClkModule_GPU, gContext.profile, false); - if (!targetHz) { - targetHz = config::GetAutoClockHz(HOCCLK_GLOBAL_PROFILE_TID, HocClkModule_GPU, gContext.profile, false); - } - } - u32 maxHz = GetMaxAllowedHz(HocClkModule_GPU, gContext.profile); - u32 nearestHz = GetNearestHz(HocClkModule_GPU, targetHz, maxHz); + u32 nearestHz = GetNearestOverrideHz(HocClkModule_GPU); board::ResetToStockGpu(); if (targetHz) @@ -441,6 +451,17 @@ namespace clockManager { } } + /* Memory frequency gets reset when starting a game during boost mode, this reapplies it. */ + void GameStartMemWar() { + u32 targetRamHz = GetNearestOverrideHz(HocClkModule_MEM); + u32 nearestFreq = GetCurrentNearestFrequency(HocClkModule_MEM); + + if (targetRamHz != nearestFreq) { + ApplyGpuDvfs(targetRamHz); + board::SetHz(HocClkModule_MEM, targetRamHz); + } + } + void SetClocks(bool isBoost) { std::uint32_t targetHz = 0; std::uint32_t maxHz = 0; @@ -452,6 +473,7 @@ namespace clockManager { if (skipCpuDueToBoost) { board::SetHz(HocClkModule_CPU, board::GetHz(HocClkModule_CPU)); prepareBoostExit = true; + GameStartMemWar(); return; // Return if we aren't overwriting boost mode } @@ -460,14 +482,7 @@ namespace clockManager { prepareBoostExit = false; } - u32 ramTargetHz = gContext.overrideFreqs[HocClkModule_MEM]; - if (!ramTargetHz) { - ramTargetHz = config::GetAutoClockHz(gContext.applicationId, HocClkModule_MEM, gContext.profile, false); - if (!ramTargetHz) - ramTargetHz = config::GetAutoClockHz(HOCCLK_GLOBAL_PROFILE_TID, HocClkModule_MEM, gContext.profile, false); - } - if (ramTargetHz) - ramTargetHz = GetNearestHz(HocClkModule_MEM, ramTargetHz, GetMaxAllowedHz(HocClkModule_MEM, gContext.profile)); + u32 ramTargetHz = GetNearestOverrideHz(HocClkModule_MEM); bool returnRaw = false; // Return a value scaled to MHz instead of raw value for (unsigned int module = 0; module < HocClkModule_EnumMax; module++) {