governor configuration options + gm20b driver fixes

This commit is contained in:
souldbminersmwc committed 2026-09-06 15:20:55 -04:00
1 parent 01d85ca9ff
commit 9c892ee365
5 files changed
+87 -12

No files matched your search

@@ -62,6 +62,9 @@ typedef enum {
HocClkConfigValue_RAMVoltDisplayMode,
HocClkConfigValue_CpuGovernorMinimumFreq,
HocClkConfigValue_GovernorPollRateMs,
HocClkConfigValue_GovernorDownHoldTicks,
HocClkConfigValue_GovernorStepUtil,
HocClkConfigValue_DisplayVoltage,
HocClkConfigValue_MemoryFrequencyMeasurementMode,
@@ -305,6 +308,12 @@ static inline const char* hocclkFormatConfigValue(HocClkConfigValue val, bool pr
return pretty ? "RAM Voltage / Usage Display Mode" : "ram_volt_usage_display_mode";
case HocClkConfigValue_CpuGovernorMinimumFreq:
return pretty ? "CPU Governor Minimum Frequency" : "cpu_gov_min_freq";
case HocClkConfigValue_GovernorPollRateMs:
return pretty ? "Governor Poll Rate" : "gov_poll_rate_ms";
case HocClkConfigValue_GovernorDownHoldTicks:
return pretty ? "Governor Down Hold" : "gov_down_hold_ticks";
case HocClkConfigValue_GovernorStepUtil:
return pretty ? "Governor Step Divisor" : "gov_step_util";
case HocClkConfigValue_DisplayVoltage:
return pretty ? "Display Voltage" : "display_voltage";
@@ -603,6 +612,12 @@ static inline uint64_t hocclkDefaultConfigValue(HocClkConfigValue val)
return 70ULL;
case HocClkConfigValue_CpuGovernorMinimumFreq:
return 612000000ULL; // 612MHz
case HocClkConfigValue_GovernorPollRateMs:
return 5ULL; // 5ms
case HocClkConfigValue_GovernorDownHoldTicks:
return 10ULL; // 10 ticks (50ms at 5ms poll)
case HocClkConfigValue_GovernorStepUtil:
return 900ULL; // max freq at 90% load
case HocClkConfigValue_MaxDisplayClockH:
return 60ULL;
case HocClkConfigValue_DisplayVoltage:
@@ -795,6 +810,15 @@ static inline uint64_t hocclkValidConfigValue(HocClkConfigValue val, uint64_t in
case HocClkConfigValue_BatteryChargeCurrent:
return ((input >= 1024) && (input <= 3072)) || !input;
case HocClkConfigValue_GovernorPollRateMs:
return ((input >= 1) && (input <= 50));
case HocClkConfigValue_GovernorDownHoldTicks:
return (input <= 100);
case HocClkConfigValue_GovernorStepUtil:
return ((input >= 100) && (input <= 1500));
case HocClkConfigValue_InputCurrentLimit:
return ((input >= 100) && (input <= 3000)) || !input;
@@ -107,6 +107,26 @@ std::vector<std::string> ConfigInfoStrings(HocClkConfigValue val, bool isMariko,
"Default: 612MHz"
};
case HocClkConfigValue_GovernorPollRateMs:
return {
"How often the CPU/GPU governor runs its loop.",
"Default: 5ms"
};
case HocClkConfigValue_GovernorDownHoldTicks:
return {
"How many governor ticks to hold the current frequency",
"before ramping down. 0 disables holding",
"Default: 10 ticks"
};
case HocClkConfigValue_GovernorStepUtil:
return {
"Load divisor mapping utilization to frequency.",
"Lower ramps up faster, above 1000 caps the top end",
"Default: 900"
};
case HocClkConfigValue_OverwriteRefreshRate:
return {
"Controls the availability of display refresh rate features.",
@@ -1007,6 +1007,13 @@ class GovernorSettingsSubMenuGui : public MiscGui {
addConfigButton(HocClkConfigValue_CpuGovernorMinimumFreq, "CPU Governor Minimum Frequency", ValueRange(0, 0, 1, "", 0),
"CPU Governor Minimum Frequency", &thresholdsDisabled, {}, GovernorMinHz, false);
addConfigButton(HocClkConfigValue_GovernorPollRateMs, "Governor Poll Rate", ValueRange(1, 50, 1, " ms", 1),
"Governor Poll Rate", &thresholdsDisabled, {}, {}, false);
addConfigButton(HocClkConfigValue_GovernorDownHoldTicks, "Governor Down Hold", ValueRange(0, 100, 1, " ticks", 1),
"Governor Down Hold", &thresholdsDisabled, {}, {}, false);
addConfigButton(HocClkConfigValue_GovernorStepUtil, "Governor Step Divisor", ValueRange(100, 1500, 25, "", 1),
"Governor Step Divisor", &thresholdsDisabled, {}, {}, false);
}
};
@@ -1471,7 +1478,7 @@ class RamTimingsSubmenuGui : public MiscGui {
addConfigTrackbar(KipConfigValue_t1_tRCD, "t1 tRCD", ValueRange(0, 7, 1));
addConfigTrackbar(KipConfigValue_t2_tRP, "t2 tRP", ValueRange(0, 7, 1));
addConfigTrackbar(KipConfigValue_t3_tRAS, "t3 tRAS", ValueRange(0, 9, 1));
addConfigTrackbar(KipConfigValue_t4_tRRD, "t4 tRRD", ValueRange(0, 6, 1));
addConfigTrackbar(KipConfigValue_t4_tRRD, "t4 tRRD", ValueRange(0, IsErista() ? 7u : 6u , 1));
addConfigTrackbar(KipConfigValue_t5_tRFC, "t5 tRFC", ValueRange(0, IsErista() ? 5u : 10u, 1));
addConfigTrackbar(KipConfigValue_t6_tRTW, "t6 tRTW", ValueRange(0, 9, 1));
addConfigTrackbar(KipConfigValue_t7_tWTR, "t7 tWTR", ValueRange(0, 9, 1));
@@ -134,8 +134,9 @@ namespace board {
HandleCpuUv();
}
if (useGm20b) {
gm20b::setClock(hz / 1000);
currentInjectedHz = hz;
if (gm20b::setClock(hz / 1000)) {
currentInjectedHz = hz;
}
}
}
@@ -153,7 +154,11 @@ namespace board {
}
if (module == HocClkModule_GPU && currentInjectedHz != 0) {
return currentInjectedHz;
if (GetRealHz(HocClkModule_GPU) != currentInjectedHz) {
currentInjectedHz = 0;
} else {
return currentInjectedHz;
}
}
if (HOSSVC_HAS_CLKRST) {
+27 -8
View File
@@ -21,9 +21,27 @@
namespace governor {
#define POLL_NS 5'000'000 // 5 ms – governor poll rate
#define DOWN_HOLD_TICKS 10 // 50 ms – how long to in POLL_NS to hold while ramping down
#define STEP_UTIL 900 // multiplier for step calculations
#define DOWN_HOLD_TICKS_DEFAULT 10 // 50 ms at 5ms poll – how long to hold while ramping down
#define STEP_UTIL_DEFAULT 900 // multiplier for step calculations (max freq at 90% load)
u64 GovernorPollNs() {
u64 ms = config::GetConfigValue(HocClkConfigValue_GovernorPollRateMs);
if (ms < 1 || ms > 50)
ms = 5;
return ms * 1'000'000ULL;
}
u32 GovernorDownHoldTicks() {
u64 ticks = config::GetConfigValue(HocClkConfigValue_GovernorDownHoldTicks);
return (ticks <= 100) ? (u32)ticks : DOWN_HOLD_TICKS_DEFAULT;
}
u32 GovernorStepUtil() {
u64 step = config::GetConfigValue(HocClkConfigValue_GovernorStepUtil);
if (step < 100 || step > 1500)
step = STEP_UTIL_DEFAULT;
return (u32)step;
}
bool isGpuGovernorEnabled = false;
bool isCpuGovernorEnabled = false;
@@ -82,7 +100,7 @@ namespace governor {
}
u32 SchedutilTargetHz(u32 util, u32 tableMaxHz) {
u64 hz = (u64)tableMaxHz * util / STEP_UTIL;
u64 hz = (u64)tableMaxHz * util / GovernorStepUtil();
return (u32)(std::min(hz, static_cast<u64>(tableMaxHz)));
}
@@ -115,13 +133,14 @@ namespace governor {
u8 vrrFocusTick = 0;
for (;;) {
const u64 pollNs = GovernorPollNs();
if (!clockManager::gRunning) {
cpuDownHoldRemaining = 0;
cpuLastHz = 0;
gpuDownHoldRemaining = 0;
gpuLastHz = 0;
svcSleepThread(POLL_NS);
svcSleepThread(pollNs);
continue;
}
@@ -156,7 +175,7 @@ namespace governor {
if (!goingDown)
cpuDownHoldRemaining = 0;
else if (cpuDownHoldRemaining == 0)
cpuDownHoldRemaining = DOWN_HOLD_TICKS;
cpuDownHoldRemaining = GovernorDownHoldTicks();
if (cpuDownHoldRemaining > 0)
cpuDownHoldRemaining--;
@@ -212,7 +231,7 @@ namespace governor {
if (!goingDown)
gpuDownHoldRemaining = 0;
else if (gpuDownHoldRemaining == 0)
gpuDownHoldRemaining = DOWN_HOLD_TICKS;
gpuDownHoldRemaining = GovernorDownHoldTicks();
if (gpuDownHoldRemaining > 0)
gpuDownHoldRemaining--;
@@ -290,7 +309,7 @@ namespace governor {
}
}
svcSleepThread(POLL_NS);
svcSleepThread(pollNs);
}
}