diff --git a/Source/sys-clk/common/include/sysclk/config.h b/Source/sys-clk/common/include/sysclk/config.h index 8859103f..549ab73a 100644 --- a/Source/sys-clk/common/include/sysclk/config.h +++ b/Source/sys-clk/common/include/sysclk/config.h @@ -59,6 +59,7 @@ typedef enum { HorizonOCConfigValue_EnableUnsafeDisplayFreqs, HorizonOCConfigValue_DVFSMode, + HorizonOCConfigValue_DVFSOffset, HocClkConfigValue_FixCpuVoltBug, @@ -232,6 +233,9 @@ static inline const char* sysclkFormatConfigValue(SysClkConfigValue val, bool pr case HorizonOCConfigValue_DVFSMode: return pretty ? "DVFS Mode" : "dvfs_mode"; + case HorizonOCConfigValue_DVFSOffset: + return pretty ? "DVFS Offset" : "dvfs_offset"; + // KIP config values case KipConfigValue_custRev: return pretty ? "Custom Revision" : "kip_cust_rev"; @@ -550,6 +554,7 @@ static inline uint64_t sysclkValidConfigValue(SysClkConfigValue val, uint64_t in case KipConfigValue_t7_tWTR_fine_tune: case KipCrc32: case HorizonOCConfigValue_DVFSMode: + case HorizonOCConfigValue_DVFSOffset: return true; case HorizonOCConfigValue_BatteryChargeCurrent: return ((input >= 1024) && (input <= 3072)) || !input; diff --git a/Source/sys-clk/overlay/src/ui/gui/misc_gui.cpp b/Source/sys-clk/overlay/src/ui/gui/misc_gui.cpp index a107b883..6b504bfb 100644 --- a/Source/sys-clk/overlay/src/ui/gui/misc_gui.cpp +++ b/Source/sys-clk/overlay/src/ui/gui/misc_gui.cpp @@ -298,6 +298,45 @@ void MiscGui::listUI() addFreqButton(HocClkConfigValue_EristaMaxCpuClock, nullptr, SysClkModule_CPU, cpu_freq_label_e); } + if (IsMariko()) { + std::vector dvfsValues = { + NamedValue("Disabled", DVFSMode_Disabled), + NamedValue("PCV Hijack", DVFSMode_Hijack), + // NamedValue("Official Service", DVFSMode_OfficialService), + // NamedValue("Hack", DVFSMode_Hack), + }; + + addConfigButton( + HorizonOCConfigValue_DVFSMode, + "GPU DVFS Mode", + ValueRange(0, 0, 1, "", 0), + "GPU DVFS Mode", + &thresholdsDisabled, + {}, + dvfsValues, + false + ); + + std::vector dvfsOffset = { + NamedValue("-50", 0xFFFFFFCE), + NamedValue("-45", 0xFFFFFFD3), + NamedValue("-40", 0xFFFFFFD8), + NamedValue("-30", 0xFFFFFFE2), + NamedValue("-25", 0xFFFFFFE7), + NamedValue("-20", 0xFFFFFFEC), + NamedValue("-10", 0xFFFFFFF6), + NamedValue(" -5", 0xFFFFFFFB), + NamedValue(" 0", 0), + NamedValue(" +5", 5), + NamedValue("+10", 10), + NamedValue("+15", 15), + NamedValue("+20", 20), + }; + + addConfigButton(HorizonOCConfigValue_DVFSOffset, "GPU DVFS Offset", ValueRange(0, 12, 1, "", 0), "GPU DVFS Offset", &thresholdsDisabled, {}, dvfsOffset, false); + + } + this->listElement->addItem(new tsl::elm::CategoryHeader("KIP")); tsl::elm::ListItem* saveBtn = new tsl::elm::ListItem("Save KIP Settings"); @@ -345,23 +384,6 @@ void MiscGui::listUI() this->listElement->addItem(gpuSubmenu); this->listElement->addItem(new tsl::elm::CategoryHeader("Experimental")); - std::vector dvfsValues = { - NamedValue("Disabled", DVFSMode_Disabled), - NamedValue("PCV Hijack", DVFSMode_Hijack), - // NamedValue("Official Service", DVFSMode_OfficialService), - // NamedValue("Hack", DVFSMode_Hack), - }; - - addConfigButton( - HorizonOCConfigValue_DVFSMode, - "GPU DVFS Mode", - ValueRange(0, 0, 1, "", 0), - "GPU DVFS Mode", - &thresholdsDisabled, - {}, - dvfsValues, - false - ); #if IS_MINIMAL == 0 std::vector chargerCurrents = { diff --git a/Source/sys-clk/sysmodule/src/clock_manager.cpp b/Source/sys-clk/sysmodule/src/clock_manager.cpp index f8e92e01..8ccb61b0 100644 --- a/Source/sys-clk/sysmodule/src/clock_manager.cpp +++ b/Source/sys-clk/sysmodule/src/clock_manager.cpp @@ -566,7 +566,10 @@ void ClockManager::Tick() ); if(module == SysClkModule_MEM && Board::GetSocType() == SysClkSocType_Mariko && targetHz > oldHz && this->config->GetConfigValue(HorizonOCConfigValue_DVFSMode) == DVFSMode_Hijack) { - u32 vmin = Board::GetMinimumGpuVoltage(targetHz / 1000000); + s32 dvfsOffset = this->config->GetConfigValue(HorizonOCConfigValue_DVFSOffset); + dvfsOffset = std::max(dvfsOffset, -50); + u32 vmin = Board::GetMinimumGpuVoltage(targetHz / 1000000) + dvfsOffset; + Board::PcvHijackDvfs(vmin); /* Update the voltage. */ @@ -586,7 +589,10 @@ 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)); + s32 dvfsOffset = this->config->GetConfigValue(HorizonOCConfigValue_DVFSOffset); + dvfsOffset = std::max(dvfsOffset, -50); + u32 vmin = Board::GetMinimumGpuVoltage(targetHz / 1000000) + dvfsOffset; + Board::PcvHijackDvfs(vmin); targetHz = this->context->overrideFreqs[SysClkModule_GPU]; if (!targetHz)