diff --git a/Source/sys-clk/common/include/sysclk/config.h b/Source/sys-clk/common/include/sysclk/config.h index ccde8e5e..e3724e18 100644 --- a/Source/sys-clk/common/include/sysclk/config.h +++ b/Source/sys-clk/common/include/sysclk/config.h @@ -451,7 +451,7 @@ static inline uint64_t sysclkDefaultConfigValue(SysClkConfigValue val) case HocClkConfigValue_LiteTDPLimit: return 6400ULL; // 0.5C case HorizonOCConfigValue_CpuGovernorMinimumFreq: - return 612ULL; // 612MHz + return 612000000ULL; // 612MHz default: return 0ULL; } 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 64ff2ed5..ba2dc52b 100644 --- a/Source/sys-clk/overlay/src/ui/gui/misc_gui.cpp +++ b/Source/sys-clk/overlay/src/ui/gui/misc_gui.cpp @@ -590,7 +590,28 @@ public: protected: void listUI() override { this->listElement->addItem(new tsl::elm::CategoryHeader("Governor Settings")); - addFreqButton(HorizonOCConfigValue_CpuGovernorMinimumFreq, "CPU Governor Minimum Frequency", SysClkModule_CPU, BaseMenuGui::IsMariko() ? cpu_freq_label_m : cpu_freq_label_e); + ValueThresholds thresholdsDisabled(0, 0); + + std::vector GovernorMinHz = { + NamedValue("510 MHz", 510000000), + NamedValue("612 MHz", 612000000), + NamedValue("714 MHz", 714000000), + NamedValue("816 MHz", 816000000), + NamedValue("918 MHz", 918000000), + NamedValue("1020 MHz", 1020000000), + }; + + addConfigButton( + HorizonOCConfigValue_CpuGovernorMinimumFreq, + "CPU Governor Minimum Frequency", + ValueRange(0, 0, 1, "", 0), + "CPU Governor Minimum Frequency", + &thresholdsDisabled, + {}, + GovernorMinHz, + false + ); + } }; diff --git a/Source/sys-clk/sysmodule/src/clock_manager.cpp b/Source/sys-clk/sysmodule/src/clock_manager.cpp index 4983e994..d8180d10 100644 --- a/Source/sys-clk/sysmodule/src/clock_manager.cpp +++ b/Source/sys-clk/sysmodule/src/clock_manager.cpp @@ -61,6 +61,7 @@ u32 initialConfigValues[SysClkConfigValue_EnumMax]; // initial config. used for bool kipAvailable = false; bool isCpuGovernorInBoostMode = false; bool isVRREnabled = false; + ClockManager *ClockManager::GetInstance() { return instance; @@ -370,7 +371,8 @@ void ClockManager::CpuGovernorThread(void* arg) { u32 downHoldRemaining = 0; u32 lastHz = 0; - + u32 minHz = 612; + u32 tick = 0; for (;;) { if (!mgr->running || !isCpuGovernorEnabled) { downHoldRemaining = 0; @@ -424,6 +426,14 @@ void ClockManager::CpuGovernorThread(void* arg) { if (downHoldRemaining > 0) downHoldRemaining--; + if(++tick > 50) { + minHz = mgr->config->GetConfigValue(HorizonOCConfigValue_CpuGovernorMinimumFreq); + tick = 0; + } + + if(newHz < minHz) + newHz = minHz; + if ((!goingDown || (downHoldRemaining == 0)) && mgr->IsAssignableHz(SysClkModule_CPU, newHz)) { Board::SetHz(SysClkModule_CPU, newHz); mgr->context->freqs[SysClkModule_CPU] = newHz;