From d98da35604f5da8573b96d8321ab590978665686 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Tue, 6 Oct 2026 19:43:52 +0200 Subject: [PATCH] hoc-clk: properly adjust CL_DVFS_OUTPUT_CFG after lut write --- .../sysmodule/src/board/board_volt.cpp | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp index ffbff8f9..576ff298 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp @@ -619,6 +619,7 @@ namespace board { volatile u32 *lut = nullptr; u32 table[LutSize] = {}; u32 lastVmin = 0; + u32 outputCfg = 0; bool initialized = false; } cpuVoltData; } @@ -661,9 +662,27 @@ namespace board { board::SetHz(HocClkModule_CPU, hz); } + void AdjustMinLutIndex() { + constexpr u32 Shift = 8; + constexpr u32 Mask = 0x3F << Shift; + /* Index is always 0 for us. */ + constexpr u32 Value = 0; + + volatile u32 *reg = reinterpret_cast(cldvfs + CL_DVFS_OUTPUT_CFG_0); + + *reg = (*reg & ~Mask) | ((Value << Shift) & Mask); + + static_cast(*reg); + } + + void RestoreMinLutIndex() { + *reinterpret_cast(cldvfs + CL_DVFS_OUTPUT_CFG_0) = cpuVoltData.outputCfg; + } + void RestoreCpuLut() { cpuVoltData.lastVmin = 0; VolatileCopyDwords(cpuVoltData.lut, cpuVoltData.table, LutSize); + RestoreMinLutIndex(); UnstuckFreqWar(); } @@ -724,6 +743,7 @@ namespace board { void InitializeCpuLut() { InitializeLutPtr(); CacheCpuLut(); + cpuVoltData.outputCfg = *reinterpret_cast(cldvfs + CL_DVFS_OUTPUT_CFG_0); cpuVoltData.initialized = true; } @@ -802,6 +822,7 @@ namespace board { PadLutTail(tmpLut, valid); VolatileCopyDwords(cpuVoltData.lut, tmpLut, LutSize); + AdjustMinLutIndex(); UnstuckFreqWar();