From 6a1ac297333214f7ea460a3adacfcc0bed733f52 Mon Sep 17 00:00:00 2001 From: KazushiM <85604869+KazushiMe@users.noreply.github.com> Date: Mon, 31 Oct 2022 12:55:27 +0800 Subject: [PATCH] AutoCPUBoost for governor --- .../sysmodule/src/clock_manager.cpp | 8 ++-- Source/sys-clk-OC/sysmodule/src/clocks.h | 1 + Source/sys-clk-OC/sysmodule/src/oc_extra.cpp | 37 +++++++++++-------- Source/sys-clk-OC/sysmodule/src/oc_extra.h | 4 +- 4 files changed, 30 insertions(+), 20 deletions(-) diff --git a/Source/sys-clk-OC/sysmodule/src/clock_manager.cpp b/Source/sys-clk-OC/sysmodule/src/clock_manager.cpp index 3dfdc412..b2d41c8c 100644 --- a/Source/sys-clk-OC/sysmodule/src/clock_manager.cpp +++ b/Source/sys-clk-OC/sysmodule/src/clock_manager.cpp @@ -189,7 +189,6 @@ void ClockManager::WaitForNextTick() if (boostOK) { uint32_t core3Util = CpuCoreUtil(3, tickWaitTimeMs * 1000'000ULL).Get(); bool lastBoost = this->oc->systemCoreBoostCPU; - constexpr uint32_t BOOST_THRESHOLD = 95'0; this->oc->systemCoreBoostCPU = (core3Util >= BOOST_THRESHOLD); if (lastBoost && !this->oc->systemCoreBoostCPU) @@ -217,8 +216,11 @@ bool ClockManager::RefreshContext() bool hasChanged = this->config->Refresh(); if (hasChanged) { this->rnxSync->ToggleSync(this->GetConfig()->GetConfigValue(SysClkConfigValue_SyncReverseNXMode)); - bool allowUnsafe = this->GetConfig()->GetConfigValue(SysClkConfigValue_AllowUnsafeFrequencies); - Clocks::SetAllowUnsafe(allowUnsafe); + if (Clocks::GetIsMariko()) { + bool allowUnsafe = this->GetConfig()->GetConfigValue(SysClkConfigValue_AllowUnsafeFrequencies); + Clocks::SetAllowUnsafe(allowUnsafe); + this->governor->SetAutoCPUBoost(this->GetConfig()->GetConfigValue(SysClkConfigValue_AutoCPUBoost)); + } } bool enabled = this->GetConfig()->Enabled(); diff --git a/Source/sys-clk-OC/sysmodule/src/clocks.h b/Source/sys-clk-OC/sysmodule/src/clocks.h index b4c90158..6779bf54 100644 --- a/Source/sys-clk-OC/sysmodule/src/clocks.h +++ b/Source/sys-clk-OC/sysmodule/src/clocks.h @@ -14,6 +14,7 @@ #include #define MAX_MEM_CLOCK 1862'400'000 +#define BOOST_THRESHOLD 95'0 class Clocks { diff --git a/Source/sys-clk-OC/sysmodule/src/oc_extra.cpp b/Source/sys-clk-OC/sysmodule/src/oc_extra.cpp index 87bbf9c5..6bb801d1 100644 --- a/Source/sys-clk-OC/sysmodule/src/oc_extra.cpp +++ b/Source/sys-clk-OC/sysmodule/src/oc_extra.cpp @@ -272,32 +272,33 @@ void Governor::s_FreqContext::SetBoostHz() { void Governor::CpuUtilWorker(void* args) { s_CoreContext* s = static_cast(args); int coreid = s->id; - constexpr int SYS_CORE_ID = (CORE_NUMS - 1); Governor* self = s->self; while (self->m_running) { + uint64_t timestamp = armTicksToNs(armGetSystemTick()); + s->timestamp = timestamp; + + s->util = self->m_cpu_freq.GetNormalizedUtil(CpuCoreUtil(coreid, TICK_TIME_NS).Get()); + bool CPUBoosted = apmExtIsCPUBoosted(self->m_perf_conf_id); if (CPUBoosted) { svcSleepThread(TICK_TIME_NS); continue; } - uint64_t timestamp = armTicksToNs(armGetSystemTick()); - s->timestamp = timestamp; for (int id = 0; id < CORE_NUMS; id++) { if (abs(self->m_cpu_core_ctx[id].timestamp - timestamp) < TICK_TIME_NS * 10) continue; - if (id == SYS_CORE_ID) { + if (id == SYS_CORE_ID && self->m_syscore_autoboost) { self->m_cpu_freq.SetBoostHz(); - } else { - self->m_cpu_freq.target_hz = self->m_cpu_freq.max_hz; - self->m_cpu_freq.SetHz(); + break; } + + self->m_cpu_freq.target_hz = self->m_cpu_freq.max_hz; + self->m_cpu_freq.SetHz(); break; } - - s->util = self->m_cpu_freq.GetNormalizedUtil(CpuCoreUtil(coreid, TICK_TIME_NS).Get()); } } @@ -308,20 +309,24 @@ void Governor::Main(void* args) { uint32_t nvgpu_field = self->m_nvgpu_field; s_Util cpu_util, gpu_util; - auto GetAdjCpuUtil = [self, cpu_util]() mutable { - uint64_t util = self->m_cpu_core_ctx[0].util; + auto SetCpuFreq = [self, cpu_ctx, cpu_util]() mutable { + uint32_t util = self->m_cpu_core_ctx[0].util; for (size_t i = 1; i < CORE_NUMS; i++) { if (util < self->m_cpu_core_ctx[i].util) util = self->m_cpu_core_ctx[i].util; } cpu_util.Update(util); - return cpu_util.Get(); + if (self->m_cpu_core_ctx[SYS_CORE_ID].util > 95'0 && self->m_syscore_autoboost) + cpu_ctx->SetBoostHz(); + else + cpu_ctx->SetNextFreq(cpu_util.Get()); }; - auto GetAdjGpuUtil = [gpu_ctx, nvgpu_field, gpu_util]() mutable { + auto SetGpuFreq = [gpu_ctx, nvgpu_field, gpu_util]() mutable { uint32_t util = gpu_ctx->GetNormalizedUtil(GpuCoreUtil(nvgpu_field).Get()); gpu_util.Update(util); - return gpu_util.Get(); + util = gpu_util.Get(); + gpu_ctx->SetNextFreq(util); }; constexpr uint64_t UPDATE_CONTEXT_RATE = SAMPLE_RATE / 2; @@ -360,9 +365,9 @@ void Governor::Main(void* args) { } if (!GPUThrottled) - gpu_ctx->SetNextFreq(GetAdjGpuUtil()); + SetGpuFreq(); if (!CPUBoosted) - cpu_ctx->SetNextFreq(GetAdjCpuUtil()); + SetCpuFreq(); svcSleepThread(TICK_TIME_NS); } diff --git a/Source/sys-clk-OC/sysmodule/src/oc_extra.h b/Source/sys-clk-OC/sysmodule/src/oc_extra.h index a7d6e72b..52fa90e5 100644 --- a/Source/sys-clk-OC/sysmodule/src/oc_extra.h +++ b/Source/sys-clk-OC/sysmodule/src/oc_extra.h @@ -70,7 +70,7 @@ public: void Start(); void Stop(); void SetMaxHz(uint32_t max_hz, SysClkModule module); - void SetCPUBoostHz(uint32_t hz) { m_cpu_freq.boost_hz = hz; }; + void SetAutoCPUBoost(bool enabled) { m_syscore_autoboost = enabled; }; void SetPerfConf(uint32_t id); protected: @@ -79,8 +79,10 @@ protected: static constexpr uint64_t TICK_TIME_NS = 1000'000'000 / SAMPLE_RATE; static constexpr int CORE_NUMS = 4; + static constexpr int SYS_CORE_ID = (CORE_NUMS - 1); bool m_running = false; + bool m_syscore_autoboost = false; Thread m_t_cpuworker[CORE_NUMS], m_t_main; uint32_t m_nvgpu_field;