sysclk: refactoring

This commit is contained in:
souldbminersmwc
2026-01-10 12:49:59 -05:00
parent c879ba985f
commit 00443343dc
10 changed files with 71 additions and 35 deletions

View File

@@ -41,10 +41,11 @@ typedef struct
int32_t power[SysClkPowerSensor_EnumMax]; int32_t power[SysClkPowerSensor_EnumMax];
uint32_t PartLoad[SysClkPartLoad_EnumMax]; uint32_t PartLoad[SysClkPartLoad_EnumMax];
uint32_t voltages[HocClkVoltage_EnumMax]; uint32_t voltages[HocClkVoltage_EnumMax];
u16 speedos[HorizonOCSpeedo_EnumMax];
uint32_t perfConfId; uint32_t perfConfId;
u8 maxDisplayFreq; u8 maxDisplayFreq;
u8 fps; u8 fps;
u16 speedos[HorizonOCSpeedo_EnumMax]; u8 dramID;
} SysClkContext; } SysClkContext;
typedef struct typedef struct

View File

@@ -38,7 +38,7 @@ include ${TOPDIR}/lib/libultrahand/ultrahand.mk
# version control constants # version control constants
#--------------------------------------------------------------------------------- #---------------------------------------------------------------------------------
#TARGET_VERSION := $(shell git describe --dirty --always --tags) #TARGET_VERSION := $(shell git describe --dirty --always --tags)
APP_VERSION := 0.25 APP_VERSION := 0.26
TARGET_VERSION := $(APP_VERSION) TARGET_VERSION := $(APP_VERSION)
#--------------------------------------------------------------------------------- #---------------------------------------------------------------------------------

View File

@@ -57,6 +57,24 @@
"is_io": true "is_io": true
} }
}, },
{
"type": "map",
"value": {
"address": "0x700E2000",
"size": "0x1000",
"is_ro": false,
"is_io": true
}
},
{
"type": "map",
"value": {
"address": "0x7000F800",
"size": "0x400",
"is_ro": false,
"is_io": true
}
},
{ {
"type": "syscalls", "type": "syscalls",
"value": { "value": {
@@ -145,7 +163,7 @@
"svcUnmapTransferMemory": "0x52", "svcUnmapTransferMemory": "0x52",
"svcCreateInterruptEvent": "0x53", "svcCreateInterruptEvent": "0x53",
"svcQueryPhysicalAddress": "0x54", "svcQueryPhysicalAddress": "0x54",
"svcQueryIoMapping": "0x55", "svcQueryMemoryMapping": "0x55",
"svcCreateDeviceAddressSpace": "0x56", "svcCreateDeviceAddressSpace": "0x56",
"svcAttachDeviceAddressSpace": "0x57", "svcAttachDeviceAddressSpace": "0x57",
"svcDetachDeviceAddressSpace": "0x58", "svcDetachDeviceAddressSpace": "0x58",

View File

@@ -39,7 +39,7 @@
#include <display_refresh_rate.h> #include <display_refresh_rate.h>
#include <stdio.h> #include <stdio.h>
#include <cstring> #include <cstring>
#include "emc_mc_defs.h" #include <registers.h>
#include <notification.h> #include <notification.h>
#define MAX(A, B) std::max(A, B) #define MAX(A, B) std::max(A, B)
@@ -97,7 +97,7 @@ std::atomic<uint64_t> idletick3{systemtickfrequency};
u32 cpu0, cpu1, cpu2, cpu3, cpuAvg; u32 cpu0, cpu1, cpu2, cpu3, cpuAvg;
u16 cpuSpeedo0, cpuSpeedo2, socSpeedo0; // CPU, GPU, SOC u16 cpuSpeedo0, cpuSpeedo2, socSpeedo0; // CPU, GPU, SOC
u16 cpuIDDQ, gpuIDDQ, socIDDQ; u16 cpuIDDQ, gpuIDDQ, socIDDQ;
u8 g_dramID = 0;
const char* Board::GetModuleName(SysClkModule module, bool pretty) const char* Board::GetModuleName(SysClkModule module, bool pretty)
{ {
@@ -239,10 +239,10 @@ void Board::Initialize()
threadCreate(&gpuLThread, gpuLoadThread, NULL, NULL, 0x1000, 0x3F, -2); threadCreate(&gpuLThread, gpuLoadThread, NULL, NULL, 0x1000, 0x3F, -2);
threadStart(&gpuLThread); threadStart(&gpuLThread);
threadCreate(&cpuCore0Thread, CheckCore, &idletick0, NULL, 0x1000, 0x10, 0); threadCreate(&cpuCore0Thread, CheckCore, &idletick0, NULL, 0x500, 0x10, 0);
threadCreate(&cpuCore1Thread, CheckCore, &idletick1, NULL, 0x1000, 0x10, 1); threadCreate(&cpuCore1Thread, CheckCore, &idletick1, NULL, 0x500, 0x10, 1);
threadCreate(&cpuCore2Thread, CheckCore, &idletick2, NULL, 0x1000, 0x10, 2); threadCreate(&cpuCore2Thread, CheckCore, &idletick2, NULL, 0x500, 0x10, 2);
threadCreate(&cpuCore3Thread, CheckCore, &idletick3, NULL, 0x1000, 0x10, 3); threadCreate(&cpuCore3Thread, CheckCore, &idletick3, NULL, 0x500, 0x10, 3);
threadCreate(&miscThread, miscThreadFunc, NULL, NULL, 0x1000, 0x3F, 3); threadCreate(&miscThread, miscThreadFunc, NULL, NULL, 0x1000, 0x3F, 3);
threadStart(&cpuCore0Thread); threadStart(&cpuCore0Thread);
@@ -266,6 +266,7 @@ void Board::Initialize()
DisplayRefresh_Initialize(&cfg); DisplayRefresh_Initialize(&cfg);
} }
FetchHardwareInfos(); FetchHardwareInfos();
} }
@@ -767,16 +768,23 @@ HorizonOCConsoleType Board::GetConsoleType() {
return g_consoleType; return g_consoleType;
} }
u8 Board::GetDramID() {
return g_dramID;
}
void Board::FetchHardwareInfos() void Board::FetchHardwareInfos()
{ {
fuseReadSpeedos(); fuseReadSpeedos();
u64 sku = 0; u64 sku = 0, dramID = 0;
Result rc = splInitialize(); Result rc = splInitialize();
ASSERT_RESULT_OK(rc, "splInitialize"); ASSERT_RESULT_OK(rc, "splInitialize");
rc = splGetConfig(SplConfigItem_HardwareType, &sku); rc = splGetConfig(SplConfigItem_HardwareType, &sku);
ASSERT_RESULT_OK(rc, "splGetConfig"); ASSERT_RESULT_OK(rc, "splGetConfig");
rc = splGetConfig(SplConfigItem_DramId, &dramID);
ASSERT_RESULT_OK(rc, "splGetConfig");
splExit(); splExit();
switch(sku) switch(sku)
@@ -792,6 +800,8 @@ void Board::FetchHardwareInfos()
} }
g_consoleType = (HorizonOCConsoleType)sku; g_consoleType = (HorizonOCConsoleType)sku;
g_dramID = (u8)dramID;
} }
/* /*

View File

@@ -61,6 +61,7 @@ class Board
static HorizonOCConsoleType GetConsoleType(); static HorizonOCConsoleType GetConsoleType();
static std::uint32_t GetVoltage(HocClkVoltage voltage); static std::uint32_t GetVoltage(HocClkVoltage voltage);
static u8 GetFanRotationLevel(); static u8 GetFanRotationLevel();
static u8 GetDramID();
static void UpdateShadowRegs(u32 tRCD_i, u32 tRP_i, u32 tRAS_i, u32 tRRD_i, u32 tRFC_i, u32 tRTW_i, u32 tWTR_i, u32 tREFpb_i, u32 ramFreq, u32 rlAdd, u32 wlAdd, bool hpMode); static void UpdateShadowRegs(u32 tRCD_i, u32 tRP_i, u32 tRAS_i, u32 tRRD_i, u32 tRFC_i, u32 tRTW_i, u32 tWTR_i, u32 tREFpb_i, u32 ramFreq, u32 rlAdd, u32 wlAdd, bool hpMode);
protected: protected:
static void FetchHardwareInfos(); static void FetchHardwareInfos();

View File

@@ -107,13 +107,20 @@ ClockManager::ClockManager()
this->context->speedos[HorizonOCSpeedo_GPU] = Board::getGPUSpeedo(); this->context->speedos[HorizonOCSpeedo_GPU] = Board::getGPUSpeedo();
this->context->speedos[HorizonOCSpeedo_SOC] = Board::getSOCSpeedo(); this->context->speedos[HorizonOCSpeedo_SOC] = Board::getSOCSpeedo();
this->context->dramID = Board::GetDramID();
} }
void ClockManager::FixCpuBug() { void ClockManager::FixCpuBug() {
Board::SetHz(SysClkModule_CPU, 1785000000); // this will just set to the max when kip is unloaded so idgaf Board::SetHz(SysClkModule_CPU, 1785000000); // this will just set to the max when kip is unloaded so idgaf
Board::SetHz(SysClkModule_CPU, 1887000000);
Board::SetHz(SysClkModule_CPU, 1963000000); Board::SetHz(SysClkModule_CPU, 1963000000);
Board::SetHz(SysClkModule_CPU, 2091000000); Board::SetHz(SysClkModule_CPU, 2091000000);
Board::SetHz(SysClkModule_CPU, 2193000000);
Board::SetHz(SysClkModule_CPU, 2295000000);
Board::SetHz(SysClkModule_CPU, 2397000000); Board::SetHz(SysClkModule_CPU, 2397000000);
Board::SetHz(SysClkModule_CPU, 2499000000);
Board::SetHz(SysClkModule_CPU, 2601000000);
Board::SetHz(SysClkModule_CPU, 2703000000); // i am just replicating what the user would manually do to fix the bug. if 2703 is unstable it will reset to 1020 due to how fast this runs
Board::SetHz(SysClkModule_CPU, 1020000000); Board::SetHz(SysClkModule_CPU, 1020000000);
ResetToStockClocks(); ResetToStockClocks();
u32 targetHz = 0; u32 targetHz = 0;
@@ -414,10 +421,6 @@ void ClockManager::Tick()
Result rc = apmExtGetCurrentPerformanceConfiguration(&mode); Result rc = apmExtGetCurrentPerformanceConfiguration(&mode);
ASSERT_RESULT_OK(rc, "apmExtGetCurrentPerformanceConfiguration"); ASSERT_RESULT_OK(rc, "apmExtGetCurrentPerformanceConfiguration");
if(this->config->GetConfigValue(HorizonOCConfigValue_BatteryChargeCurrent)) {
I2c_Bq24193_SetFastChargeCurrentLimit(this->config->GetConfigValue(HorizonOCConfigValue_BatteryChargeCurrent));
}
if(this->config->GetConfigValue(HocClkConfigValue_HandheldTDP) && opMode == AppletOperationMode_Handheld) { if(this->config->GetConfigValue(HocClkConfigValue_HandheldTDP) && opMode == AppletOperationMode_Handheld) {
if(Board::GetConsoleType() == HorizonOCConsoleType_Hoag) { if(Board::GetConsoleType() == HorizonOCConsoleType_Hoag) {
if(Board::GetPowerMw(SysClkPowerSensor_Now) < -(int)this->config->GetConfigValue(HocClkConfigValue_LiteTDPLimit)) { if(Board::GetPowerMw(SysClkPowerSensor_Now) < -(int)this->config->GetConfigValue(HocClkConfigValue_LiteTDPLimit)) {
@@ -456,6 +459,9 @@ void ClockManager::Tick()
if (this->RefreshContext() || this->config->Refresh()) if (this->RefreshContext() || this->config->Refresh())
{ {
if(this->config->GetConfigValue(HorizonOCConfigValue_BatteryChargeCurrent)) {
I2c_Bq24193_SetFastChargeCurrentLimit(this->config->GetConfigValue(HorizonOCConfigValue_BatteryChargeCurrent));
}
std::uint32_t targetHz = 0; std::uint32_t targetHz = 0;
std::uint32_t maxHz = 0; std::uint32_t maxHz = 0;
std::uint32_t nearestHz = 0; std::uint32_t nearestHz = 0;
@@ -965,25 +971,25 @@ void ClockManager::UpdateRamTimings() {
return; return;
} }
if(this->config->GetConfigValue(KipConfigValue_marikoEmcMaxClock) != initialConfigValues[KipConfigValue_marikoEmcMaxClock] || // if(this->config->GetConfigValue(KipConfigValue_marikoEmcMaxClock) != initialConfigValues[KipConfigValue_marikoEmcMaxClock] ||
this->config->GetConfigValue(KipConfigValue_mem_burst_read_latency) != initialConfigValues[KipConfigValue_mem_burst_read_latency] || // this->config->GetConfigValue(KipConfigValue_mem_burst_read_latency) != initialConfigValues[KipConfigValue_mem_burst_read_latency] ||
this->config->GetConfigValue(KipConfigValue_mem_burst_write_latency) != initialConfigValues[KipConfigValue_mem_burst_write_latency] // this->config->GetConfigValue(KipConfigValue_mem_burst_write_latency) != initialConfigValues[KipConfigValue_mem_burst_write_latency]
) { // ) {
writeNotification("Horizon OC\nCritical values changed!\nUnable to write timings"); // writeNotification("Horizon OC\nCritical values changed!\nUnable to write timings");
return; // return;
} // }
u32 t1_tRCD = this->config->GetConfigValue(KipConfigValue_t1_tRCD); u32 t1_tRCD = initialConfigValues[KipConfigValue_t1_tRCD];
u32 t2_tRP = this->config->GetConfigValue(KipConfigValue_t2_tRP); u32 t2_tRP = initialConfigValues[KipConfigValue_t2_tRP];
u32 t3_tRAS = this->config->GetConfigValue(KipConfigValue_t3_tRAS); u32 t3_tRAS = initialConfigValues[KipConfigValue_t3_tRAS];
u32 t4_tRRD = this->config->GetConfigValue(KipConfigValue_t4_tRRD); u32 t4_tRRD = initialConfigValues[KipConfigValue_t4_tRRD];
u32 t5_tRFC = this->config->GetConfigValue(KipConfigValue_t5_tRFC); u32 t5_tRFC = initialConfigValues[KipConfigValue_t5_tRFC];
u32 t6_tRTW = this->config->GetConfigValue(KipConfigValue_t6_tRTW); u32 t6_tRTW = initialConfigValues[KipConfigValue_t6_tRTW];
u32 t7_tWTR = this->config->GetConfigValue(KipConfigValue_t7_tWTR); u32 t7_tWTR = initialConfigValues[KipConfigValue_t7_tWTR];
u32 t8_tREFI = this->config->GetConfigValue(KipConfigValue_t8_tREFI); u32 t8_tREFI = initialConfigValues[KipConfigValue_t8_tREFI];
u64 ramFreq = this->config->GetConfigValue(KipConfigValue_marikoEmcMaxClock); u64 ramFreq = initialConfigValues[KipConfigValue_marikoEmcMaxClock];
u32 rlAdd = this->config->GetConfigValue(KipConfigValue_mem_burst_read_latency); u32 rlAdd = initialConfigValues[KipConfigValue_mem_burst_read_latency];
u32 wlAdd = this->config->GetConfigValue(KipConfigValue_mem_burst_write_latency); u32 wlAdd = initialConfigValues[KipConfigValue_mem_burst_write_latency];
bool hpMode = (bool)this->config->GetConfigValue(KipConfigValue_hpMode); bool hpMode = (bool)initialConfigValues[KipConfigValue_hpMode];
Board::UpdateShadowRegs(t1_tRCD, t2_tRP, t3_tRAS, t4_tRRD, t5_tRFC, t6_tRTW, t7_tWTR, t8_tREFI, ramFreq, rlAdd, wlAdd, hpMode); Board::UpdateShadowRegs(t1_tRCD, t2_tRP, t3_tRAS, t4_tRRD, t5_tRFC, t6_tRTW, t7_tWTR, t8_tREFI, ramFreq, rlAdd, wlAdd, hpMode);
} }

View File

@@ -73,7 +73,7 @@ class ClockManager
void calculateGpuVmin(void); void calculateGpuVmin(void);
protected: protected:
bool IsAssignableHz(SysClkModule module, std::uint32_t hz); bool IsAssignableHz(SysClkModule module, std::uint32_t hz);
std::uint32_t GetMaxAllowedHz(SysClkModule module, SysClkProfile profile); inline std::uint32_t GetMaxAllowedHz(SysClkModule module, SysClkProfile profile);
std::uint32_t GetNearestHz(SysClkModule module, std::uint32_t inHz, std::uint32_t maxHz); std::uint32_t GetNearestHz(SysClkModule module, std::uint32_t inHz, std::uint32_t maxHz);
bool ConfigIntervalTimeout(SysClkConfigValue intervalMsConfigValue, std::uint64_t ns, std::uint64_t* lastLogNs); bool ConfigIntervalTimeout(SysClkConfigValue intervalMsConfigValue, std::uint64_t ns, std::uint64_t* lastLogNs);
void RefreshFreqTableRow(SysClkModule module); void RefreshFreqTableRow(SysClkModule module);

View File

@@ -35,7 +35,7 @@
#include <sysclk.h> #include <sysclk.h>
#define FILE_CONFIG_DIR "/config/" TARGET #define FILE_CONFIG_DIR "/config/" TARGET
#define FILE_FLAG_CHECK_INTERVAL_NS 5000000000ULL #define FILE_FLAG_CHECK_INTERVAL_NS (10000ULL * 1000000000ULL)
#define FILE_CONTEXT_CSV_PATH FILE_CONFIG_DIR "/context.csv" #define FILE_CONTEXT_CSV_PATH FILE_CONFIG_DIR "/context.csv"
#define FILE_LOG_FLAG_PATH FILE_CONFIG_DIR "/log.flag" #define FILE_LOG_FLAG_PATH FILE_CONFIG_DIR "/log.flag"
#define FILE_LOG_FILE_PATH FILE_CONFIG_DIR "/log.txt" #define FILE_LOG_FILE_PATH FILE_CONFIG_DIR "/log.txt"