From 3b907d3ca0a7a9ea6dcfc053881864aca05c752a Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Sat, 21 Mar 2026 17:37:52 +0100 Subject: [PATCH] Add live tuning adjustment to rewrite --- .../sysmodule/src/board/board.cpp | 16 +--- .../sysmodule/src/board/board_volt.cpp | 91 +++++++++++++++++++ .../sysmodule/src/board/board_volt.hpp | 12 +++ 3 files changed, 106 insertions(+), 13 deletions(-) diff --git a/Source/rewrite-hoc-clk/sysmodule/src/board/board.cpp b/Source/rewrite-hoc-clk/sysmodule/src/board/board.cpp index 4cafe2d3..906a6bb8 100644 --- a/Source/rewrite-hoc-clk/sysmodule/src/board/board.cpp +++ b/Source/rewrite-hoc-clk/sysmodule/src/board/board.cpp @@ -33,7 +33,7 @@ #include "board.hpp" #include "board_fuse.hpp" #include "board_load.hpp" -#include "board_ram_oc_dvfs.hpp" +#include "board_volt.hpp" #include "board_misc.hpp" namespace board { @@ -114,7 +114,7 @@ namespace board { ASSERT_RESULT_OK(rc, "pmdmntInitialize"); StartGpuLoad(nvCheck, fd); - /* TODO: Add back fan. */ + StartMiscThread(pwmCheck) batteryInfoInitialize(); @@ -140,17 +140,7 @@ namespace board { DisplayRefresh_Initialize(&cfg); } - // rc = svcQueryMemoryMapping(&cldvfs, &cldvfs_temp, CLDVFS_REGION_BASE, CLDVFS_REGION_SIZE); - // ASSERT_RESULT_OK(rc, "svcQueryMemoryMapping (cldvfs)"); - - // if (socType == SysClkSocType_Erista) { - // cachedEristaUvLowTune0 = *(u32*) (cldvfs + CL_DVFS_TUNE0_0); - // cachedEristaUvLowTune1 = *(u32*) (cldvfs + CL_DVFS_TUNE1_0); - // } else { - // SetHz(SysClkModule_CPU, 1785000000); - // cachedMarikoUvHighTune0 = *(u32*) (cldvfs + CL_DVFS_TUNE0_0); - // ResetToStockCpu(); - // } + CacheDfllData(); } void Exit() { diff --git a/Source/rewrite-hoc-clk/sysmodule/src/board/board_volt.cpp b/Source/rewrite-hoc-clk/sysmodule/src/board/board_volt.cpp index 5533594e..4a97c6df 100644 --- a/Source/rewrite-hoc-clk/sysmodule/src/board/board_volt.cpp +++ b/Source/rewrite-hoc-clk/sysmodule/src/board/board_volt.cpp @@ -27,14 +27,105 @@ #include #include #include +#include #include #include "board.hpp" +#include "board_freq.hpp" #include "board_volt.hpp" #include "../file_utils.h" namespace board { GpuVoltData voltData = {}; + u64 cldvfs; + CpuDfllData cachedTune; + + void CacheDfllData() { + u64 temp; + rc = svcQueryMemoryMapping(&cldvfs, &temp, CLDVFS_REGION_BASE, CLDVFS_REGION_SIZE); + ASSERT_RESULT_OK(rc, "svcQueryMemoryMapping (cldvfs)"); + + if (GetSocType() == SysClkSocType_Erista) { + cachedTune.tune0Low = *static_cast(cldvfs + CL_DVFS_TUNE0_0); + cachedTune.tune1Low = *static_cast(cldvfs + CL_DVFS_TUNE1_0); + } else { + SetHz(SysClkModule_CPU, 1785000000); + cachedTune.tune0High = *static_cast(cldvfs + CL_DVFS_TUNE0_0); + ResetToStockCpu(); + } + } + + /* TODO: clean up this code. */ + void SetDfllTunings(u32 levelLow, u32 levelHigh, u32 tbreakPoint) { + u32* tune0_ptr = static_cast(cldvfs + CL_DVFS_TUNE0_0); + u32* tune1_ptr = static_cast(cldvfs + CL_DVFS_TUNE1_0); + if (GetSocType() == SysClkSocType_Mariko) { + if (GetHz(SysClkModule_CPU) < tbreakPoint && (levelLow || levelHigh)) { + if (levelLow) { + *tune0_ptr = marikoCpuUvLow[levelLow-1].tune0_low; + *tune1_ptr = marikoCpuUvLow[levelLow-1].tune1_low; + } + return; + } else { + if (levelLow) { + *tune0_ptr = marikoCpuUvLow[levelLow-1].tune0_low; + *tune1_ptr = marikoCpuUvLow[levelLow-1].tune1_low; + } + if (levelHigh) { + *tune0_ptr = marikoCpuUvHigh[levelHigh-1].tune0_high; + *tune1_ptr = marikoCpuUvHigh[levelHigh-1].tune1_high; + } + return; + } + if (GetHz(SysClkModule_CPU) < tbreakPoint || (!levelLow)) { // account for tbreak + *tune0_ptr = 0xCFFF; + *tune1_ptr = 0xFF072201; + return; + } else if (GetHz(SysClkModule_CPU) >= tbreakPoint || (!levelHigh)) { + *tune0_ptr = cachedTune.tune0High; // per console? + *tune1_ptr = 0xFFF7FF3F; + return; + } + } else { + if (GetHz(SysClkModule_CPU) < tbreakPoint || (!levelLow)) { // account for tbreak + *tune0_ptr = cachedTune.tune0Low; // I think each erista has a different tune0/tune1? + *tune1_ptr = cachedTune.tune1Low; + return; + } else { + if (levelLow) { + *tune0_ptr = eristaCpuUvTable[levelLow-1].tune0; + *tune1_ptr = eristaCpuUvTable[levelLow-1].tune1; + } else { + *tune0_ptr = 0x0; + *tune1_ptr = 0x0; + } + } + } + } + + /* + enum TableConfig: u32 { + DEFAULT_TABLE = 1, + TBREAK_1581 = 2, + TBREAK_1683 = 3, + EXTREME_TABLE = 4, + }; + */ + u32 CalculateTbreak(u32 table) { + if (GetSocType() == SysClkSocType_Erista) { + return 1581000000; + } else { + switch (table) { + case 1 ... 2: + case 4: + return 1581000000; + case 3: + return 1683000000; + default: + return 1581000000; + } + } + } /* * Switch Power domains (max77620): diff --git a/Source/rewrite-hoc-clk/sysmodule/src/board/board_volt.hpp b/Source/rewrite-hoc-clk/sysmodule/src/board/board_volt.hpp index 09c2da50..9bed0117 100644 --- a/Source/rewrite-hoc-clk/sysmodule/src/board/board_volt.hpp +++ b/Source/rewrite-hoc-clk/sysmodule/src/board/board_volt.hpp @@ -43,6 +43,18 @@ namespace board { u32 voltageMax; }; + struct CpuDfllData { + u32 tune0Low; + u32 tune0High; + u32 tune1Low; + u32 tune1High; + // u32 tune_high_min_millivolts; + // u32 tune_high_margin_millivolts; + // u64 dvco_calibration_max; + }; + + void CacheDfllData(); + u32 CalculateTbreak(); u32 GetVoltage(HocClkVoltage voltage); void CacheGpuVoltTable(); void PcvHijackGpuVolts(u32 vmin);