sysclk: fully fix lite bug and add minimal mode

This commit is contained in:
souldbminersmwc
2026-01-06 18:00:55 -05:00
parent 4ee57e3d01
commit 6d141465c6
9 changed files with 77 additions and 65 deletions

View File

@@ -40,13 +40,12 @@ typedef enum
typedef enum typedef enum
{ {
HorizonOCConsoleType_Unknown = 0, ///< Invalid Model HorizonOCConsoleType_Icosa = 0,
HorizonOCConsoleType_V1 = 1, ///< Erista Model HorizonOCConsoleType_Copper,
HorizonOCConsoleType_UnreleasedErista = 2, ///< Erista "Simulation" Model HorizonOCConsoleType_Hoag,
HorizonOCConsoleType_V2 = 3, ///< Mariko Model HorizonOCConsoleType_Iowa,
HorizonOCConsoleType_Lite = 4, ///< Mariko Lite Model HorizonOCConsoleType_Calcio,
HorizonOCConsoleType_UnreleasedMariko = 5, ///< Mariko "Simulation" Model HorizonOCConsoleType_Aula,
HorizonOCConsoleType_OLED = 6, ///< Mariko OLED Model
HorizonOCConsoleType_EnumMax, HorizonOCConsoleType_EnumMax,
} HorizonOCConsoleType; } HorizonOCConsoleType;

View File

@@ -44,7 +44,7 @@ TARGET_VERSION := $(APP_VERSION)
#--------------------------------------------------------------------------------- #---------------------------------------------------------------------------------
# options for code generation # options for code generation
#--------------------------------------------------------------------------------- #---------------------------------------------------------------------------------
DEFINES := -DDISABLE_IPC -DTARGET="\"$(TARGET)\"" -DTARGET_VERSION="\"$(TARGET_VERSION)\"" -DIS_MINIMAL="\"$(IS_MINIMAL)\"" DEFINES := -DDISABLE_IPC -DTARGET="\"$(TARGET)\"" -DTARGET_VERSION="\"$(TARGET_VERSION)\"" -DIS_MINIMAL=$(IS_MINIMAL)
ARCH := -march=armv8-a+crc+crypto -mtune=cortex-a57 -mtp=soft -fPIE ARCH := -march=armv8-a+crc+crypto -mtune=cortex-a57 -mtp=soft -fPIE

View File

@@ -271,7 +271,7 @@ void AppProfileGui::addProfileUI(SysClkProfile profile)
this->addModuleListItem(profile, SysClkModule_CPU); this->addModuleListItem(profile, SysClkModule_CPU);
this->addModuleListItem(profile, SysClkModule_GPU); this->addModuleListItem(profile, SysClkModule_GPU);
this->addModuleListItem(profile, SysClkModule_MEM); this->addModuleListItem(profile, SysClkModule_MEM);
#ifndef IS_MINIMAL #if IS_MINIMAL == 0
if(!IsHoag()) { if(!IsHoag()) {
if(profile != SysClkProfile_Docked) if(profile != SysClkProfile_Docked)
this->addModuleListItemValue(profile, HorizonOCModule_Display, "Display", 40, 72, 1, " Hz", 1, 0); this->addModuleListItemValue(profile, HorizonOCModule_Display, "Display", 40, 72, 1, " Hz", 1, 0);

View File

@@ -255,7 +255,7 @@ void GlobalOverrideGui::listUI()
this->addModuleListItem(SysClkModule_CPU); this->addModuleListItem(SysClkModule_CPU);
this->addModuleListItem(SysClkModule_GPU); this->addModuleListItem(SysClkModule_GPU);
this->addModuleListItem(SysClkModule_MEM); this->addModuleListItem(SysClkModule_MEM);
#ifndef IS_MINIMAL #if IS_MINIMAL == 0
if(!IsHoag()) if(!IsHoag())
this->addModuleListItemValue(HorizonOCModule_Display, "Display", 40, 72, 1, " Hz", 1, 0); this->addModuleListItemValue(HorizonOCModule_Display, "Display", 40, 72, 1, " Hz", 1, 0);
#endif #endif

View File

@@ -97,7 +97,7 @@ void MainGui::listUI()
return false; return false;
}); });
this->listElement->addItem(miscItem); this->listElement->addItem(miscItem);
#ifndef IS_MINIMAL #if IS_MINIMAL == 0
tsl::elm::ListItem* infoItem = new tsl::elm::ListItem("Information"); tsl::elm::ListItem* infoItem = new tsl::elm::ListItem("Information");
infoItem->setClickListener([this](u64 keys) { infoItem->setClickListener([this](u64 keys) {
if((keys & HidNpadButton_A) == HidNpadButton_A && this->context) if((keys & HidNpadButton_A) == HidNpadButton_A && this->context)

View File

@@ -24,10 +24,9 @@
#include <cstring> #include <cstring>
#include <vector> #include <vector>
#include <notification.h> #include <notification.h>
#ifdef IS_MINIMAL #if IS_MINIMAL == 0
#warning "Minimal compilation" #pragma message("Compiling with full features")
#endif #endif
class RamSubmenuGui; class RamSubmenuGui;
class RamTimingsSubmenuGui; class RamTimingsSubmenuGui;
class RamLatenciesSubmenuGui; class RamLatenciesSubmenuGui;
@@ -267,47 +266,49 @@ void MiscGui::listUI()
addConfigToggle(HocClkConfigValue_UncappedClocks, nullptr); addConfigToggle(HocClkConfigValue_UncappedClocks, nullptr);
addConfigToggle(HocClkConfigValue_OverwriteBoostMode, nullptr); addConfigToggle(HocClkConfigValue_OverwriteBoostMode, nullptr);
#ifndef IS_MINIMAL #if IS_MINIMAL == 0
addConfigToggle(HocClkConfigValue_FixCpuVoltBug, nullptr); addConfigToggle(HocClkConfigValue_FixCpuVoltBug, nullptr);
#endif #endif
addConfigToggle(HocClkConfigValue_ThermalThrottle, nullptr); addConfigToggle(HocClkConfigValue_ThermalThrottle, nullptr);
addConfigToggle(HocClkConfigValue_HandheldTDP, nullptr); addConfigToggle(HocClkConfigValue_HandheldTDP, nullptr);
addConfigToggle(HocClkConfigValue_EnforceBoardLimit, nullptr);
std::map<uint32_t, std::string> labels_pwr_r = { #if IS_MINIMAL == 0
{8600, "Official Rating"} std::map<uint32_t, std::string> labels_pwr_r = {
}; {8600, "Official Rating"}
std::map<uint32_t, std::string> labels_pwr_l = { };
{6400, "Official Rating"} std::map<uint32_t, std::string> labels_pwr_l = {
}; {6400, "Official Rating"}
};
ValueThresholds tdpThresholds(8600, 9500);
addConfigButton(
HocClkConfigValue_HandheldTDPLimit,
"TDP Threshold",
ValueRange(5000, 10000, 100, "mW", 1),
"Power",
&tdpThresholds,
labels_pwr_r
);
ValueThresholds tdpThresholds(8600, 9500); ValueThresholds tdpThresholdsLite(6400, 7500);
addConfigButton( addConfigButton(
HocClkConfigValue_HandheldTDPLimit, HocClkConfigValue_LiteTDPLimit,
"TDP Threshold", "Lite TDP Threshold",
ValueRange(5000, 10000, 100, "mW", 1), ValueRange(4000, 8000, 100, "mW", 1),
"Power", "Power",
&tdpThresholds, &tdpThresholdsLite,
labels_pwr_r labels_pwr_l
); );
ValueThresholds tdpThresholdsLite(6400, 7500); ValueThresholds throttleThresholds(70, 80);
addConfigButton( addConfigButton(
HocClkConfigValue_LiteTDPLimit, HocClkConfigValue_ThermalThrottleThreshold,
"Lite TDP Threshold", "Thermal Throttle Limit",
ValueRange(4000, 8000, 100, "mW", 1), ValueRange(50, 85, 1, "°C", 1),
"Power", "Temp",
&tdpThresholdsLite, &throttleThresholds
labels_pwr_l );
); #endif
ValueThresholds throttleThresholds(70, 80);
addConfigButton(
HocClkConfigValue_ThermalThrottleThreshold,
"Thermal Throttle Limit",
ValueRange(50, 85, 1, "°C", 1),
"Temp",
&throttleThresholds
);
if(IsMariko()) { if(IsMariko()) {
addFreqButton(HocClkConfigValue_MarikoMaxCpuClock, nullptr, SysClkModule_CPU, cpu_freq_label_m); addFreqButton(HocClkConfigValue_MarikoMaxCpuClock, nullptr, SysClkModule_CPU, cpu_freq_label_m);
@@ -361,7 +362,7 @@ void MiscGui::listUI()
}); });
this->listElement->addItem(gpuSubmenu); this->listElement->addItem(gpuSubmenu);
#ifndef IS_MINIMAL #if IS_MINIMAL == 0
this->listElement->addItem(new tsl::elm::CategoryHeader("Experimental")); this->listElement->addItem(new tsl::elm::CategoryHeader("Experimental"));
std::vector<NamedValue> chargerCurrents = { std::vector<NamedValue> chargerCurrents = {
NamedValue("Disabled", 0), NamedValue("Disabled", 0),
@@ -607,7 +608,7 @@ protected:
addConfigButton(KipConfigValue_t6_tRTW, "t6 tRTW", ValueRange(0, 10, 1, "", 1), "tRTW", &thresholdsDisabled, {}, {}, false); addConfigButton(KipConfigValue_t6_tRTW, "t6 tRTW", ValueRange(0, 10, 1, "", 1), "tRTW", &thresholdsDisabled, {}, {}, false);
addConfigButton(KipConfigValue_t7_tWTR, "t7 tWTR", ValueRange(0, 10, 1, "", 1), "tWTR", &thresholdsDisabled, {}, {}, false); addConfigButton(KipConfigValue_t7_tWTR, "t7 tWTR", ValueRange(0, 10, 1, "", 1), "tWTR", &thresholdsDisabled, {}, {}, false);
addConfigButton(KipConfigValue_t8_tREFI, "t8 tREFI", ValueRange(0, 6, 1, "", 1), "tREFI", &thresholdsDisabled, {}, {}, false); addConfigButton(KipConfigValue_t8_tREFI, "t8 tREFI", ValueRange(0, 6, 1, "", 1), "tREFI", &thresholdsDisabled, {}, {}, false);
#if IS_MINIMAL == 0
this->listElement->addItem(new tsl::elm::CategoryHeader("Experimental")); this->listElement->addItem(new tsl::elm::CategoryHeader("Experimental"));
tsl::elm::ListItem* emcUpdBtn = new tsl::elm::ListItem("Update RAM Timings"); tsl::elm::ListItem* emcUpdBtn = new tsl::elm::ListItem("Update RAM Timings");
@@ -634,6 +635,7 @@ protected:
}); });
warningText->setBoundaries(0, 0, tsl::cfg::FramebufferWidth, 150); warningText->setBoundaries(0, 0, tsl::cfg::FramebufferWidth, 150);
this->listElement->addItem(warningText); this->listElement->addItem(warningText);
#endif
} }
}; };
@@ -771,7 +773,7 @@ protected:
); );
std::vector<NamedValue> maxClkOptions = { std::vector<NamedValue> maxClkOptions = {
NamedValue("1963MHz", 1963000), // NamedValue("1963MHz", 1963000),
NamedValue("2397MHz", 2397000), NamedValue("2397MHz", 2397000),
NamedValue("2499MHz", 2499000), NamedValue("2499MHz", 2499000),
NamedValue("2601MHz", 2601000), NamedValue("2601MHz", 2601000),

View File

@@ -88,7 +88,7 @@ uint32_t GPU_Load_u = 0, fd = 0;
BatteryChargeInfo info; BatteryChargeInfo info;
static SysClkSocType g_socType = SysClkSocType_Erista; static SysClkSocType g_socType = SysClkSocType_Erista;
static HorizonOCConsoleType g_consoleType = HorizonOCConsoleType_Unknown; static HorizonOCConsoleType g_consoleType = HorizonOCConsoleType_Iowa;
std::atomic<uint64_t> idletick0{systemtickfrequency}; std::atomic<uint64_t> idletick0{systemtickfrequency};
std::atomic<uint64_t> idletick1{systemtickfrequency}; std::atomic<uint64_t> idletick1{systemtickfrequency};
@@ -236,6 +236,9 @@ void Board::Initialize()
rc = pmdmntInitialize(); rc = pmdmntInitialize();
ASSERT_RESULT_OK(rc, "pmdmntInitialize"); ASSERT_RESULT_OK(rc, "pmdmntInitialize");
rc = setInitialize();
ASSERT_RESULT_OK(rc, "setInitialize");
threadCreate(&gpuLThread, gpuLoadThread, NULL, NULL, 0x1000, 0x3F, -2); threadCreate(&gpuLThread, gpuLoadThread, NULL, NULL, 0x1000, 0x3F, -2);
threadStart(&gpuLThread); threadStart(&gpuLThread);
@@ -255,7 +258,7 @@ void Board::Initialize()
if (hosversionAtLeast(6,0,0) && R_SUCCEEDED(pwmInitialize())) { if (hosversionAtLeast(6,0,0) && R_SUCCEEDED(pwmInitialize())) {
pwmCheck = pwmOpenSession2(&g_ICon, 0x3D000001); pwmCheck = pwmOpenSession2(&g_ICon, 0x3D000001);
} }
if(Board::GetConsoleType() != HorizonOCConsoleType_Lite) { if(Board::GetConsoleType() != HorizonOCConsoleType_Hoag) {
u64 clkVirtAddr, dsiVirtAddr, outsize; u64 clkVirtAddr, dsiVirtAddr, outsize;
rc = svcQueryMemoryMapping(&clkVirtAddr, &outsize, 0x60006000, 0x1000); rc = svcQueryMemoryMapping(&clkVirtAddr, &outsize, 0x60006000, 0x1000);
ASSERT_RESULT_OK(rc, "svcQueryMemoryMapping (clk)"); ASSERT_RESULT_OK(rc, "svcQueryMemoryMapping (clk)");
@@ -368,7 +371,7 @@ void Board::Exit()
rgltrExit(); rgltrExit();
batteryInfoExit(); batteryInfoExit();
pmdmntExit(); pmdmntExit();
if(Board::GetConsoleType() != HorizonOCConsoleType_Lite) if(Board::GetConsoleType() != HorizonOCConsoleType_Hoag)
DisplayRefresh_Shutdown(); DisplayRefresh_Shutdown();
} }
@@ -404,7 +407,7 @@ void Board::SetHz(SysClkModule module, std::uint32_t hz)
{ {
Result rc = 0; Result rc = 0;
if(module == HorizonOCModule_Display && Board::GetConsoleType() != HorizonOCConsoleType_Lite) { if(module == HorizonOCModule_Display && Board::GetConsoleType() != HorizonOCConsoleType_Hoag) {
DisplayRefresh_SetRate(hz); DisplayRefresh_SetRate(hz);
return; return;
} }
@@ -434,7 +437,7 @@ std::uint32_t Board::GetHz(SysClkModule module)
std::uint32_t hz = 0; std::uint32_t hz = 0;
if(module == HorizonOCModule_Display) { if(module == HorizonOCModule_Display) {
if(Board::GetConsoleType() != HorizonOCConsoleType_Lite) if(Board::GetConsoleType() != HorizonOCConsoleType_Hoag)
DisplayRefresh_GetRate(&hz, false); DisplayRefresh_GetRate(&hz, false);
else else
hz = 60; hz = 60;
@@ -474,7 +477,7 @@ std::uint32_t Board::GetRealHz(SysClkModule module)
case SysClkModule_MEM: case SysClkModule_MEM:
return t210ClkMemFreq(); return t210ClkMemFreq();
case HorizonOCModule_Display: case HorizonOCModule_Display:
if(Board::GetConsoleType() != HorizonOCConsoleType_Lite) if(Board::GetConsoleType() != HorizonOCConsoleType_Hoag)
DisplayRefresh_GetRate(&hz, false); DisplayRefresh_GetRate(&hz, false);
else else
hz = 60; hz = 60;
@@ -672,12 +675,12 @@ void Board::ResetToStockGpu()
} }
void Board::ResetToStockDisplay() { void Board::ResetToStockDisplay() {
if(Board::GetConsoleType() != HorizonOCConsoleType_Lite) if(Board::GetConsoleType() != HorizonOCConsoleType_Hoag)
DisplayRefresh_SetRate(60); DisplayRefresh_SetRate(60);
} }
u8 Board::GetHighestDockedDisplayRate() { u8 Board::GetHighestDockedDisplayRate() {
if(Board::GetConsoleType() != HorizonOCConsoleType_Lite) if(Board::GetConsoleType() != HorizonOCConsoleType_Hoag)
return DisplayRefresh_GetDockedHighestAllowed(); return DisplayRefresh_GetDockedHighestAllowed();
else else
return 60; return 60;
@@ -791,6 +794,8 @@ void Board::FetchHardwareInfos()
g_socType = SysClkSocType_Erista; g_socType = SysClkSocType_Erista;
} }
rc = splGetConfig(SplConfigItem_HardwareType, &sku);
ASSERT_RESULT_OK(rc, "splGetConfig");
g_consoleType = (HorizonOCConsoleType)sku; g_consoleType = (HorizonOCConsoleType)sku;
} }

View File

@@ -420,19 +420,26 @@ void ClockManager::Tick()
} }
if(this->config->GetConfigValue(HocClkConfigValue_HandheldTDP) && opMode == AppletOperationMode_Handheld) { if(this->config->GetConfigValue(HocClkConfigValue_HandheldTDP) && opMode == AppletOperationMode_Handheld) {
if(Board::GetConsoleType() == HorizonOCConsoleType_Lite) { if(Board::GetConsoleType() == HorizonOCConsoleType_Hoag) {
if(Board::GetPowerMw(SysClkPowerSensor_Avg) < -(int)this->config->GetConfigValue(HocClkConfigValue_LiteTDPLimit)) { if(Board::GetPowerMw(SysClkPowerSensor_Now) < -(int)this->config->GetConfigValue(HocClkConfigValue_LiteTDPLimit)) {
ResetToStockClocks(); ResetToStockClocks();
return; return;
} }
} else { } else {
if(Board::GetPowerMw(SysClkPowerSensor_Avg) < -(int)this->config->GetConfigValue(HocClkConfigValue_HandheldTDPLimit)) { if(Board::GetPowerMw(SysClkPowerSensor_Now) < -(int)this->config->GetConfigValue(HocClkConfigValue_HandheldTDPLimit)) {
ResetToStockClocks(); ResetToStockClocks();
return; return;
} }
} }
} }
if(this->config->GetConfigValue(HocClkConfigValue_EnforceBoardLimit) && opMode == AppletOperationMode_Console ) {
if(Board::GetPowerMw(SysClkPowerSensor_Now) < 0) {
ResetToStockClocks();
return;
}
}
if(((tmp451TempSoc() / 1000) > (int)this->config->GetConfigValue(HocClkConfigValue_ThermalThrottleThreshold)) && this->config->GetConfigValue(HocClkConfigValue_ThermalThrottle)) { if(((tmp451TempSoc() / 1000) > (int)this->config->GetConfigValue(HocClkConfigValue_ThermalThrottleThreshold)) && this->config->GetConfigValue(HocClkConfigValue_ThermalThrottle)) {
ResetToStockClocks(); ResetToStockClocks();
return; return;
@@ -486,7 +493,7 @@ void ClockManager::Tick()
isGovernorEnabled = newGovernorState; isGovernorEnabled = newGovernorState;
} }
if(module == HorizonOCModule_Display && this->config->GetConfigValue(HorizonOCConfigValue_OverwriteRefreshRate) && Board::GetConsoleType() != HorizonOCConsoleType_Lite) { if(module == HorizonOCModule_Display && this->config->GetConfigValue(HorizonOCConfigValue_OverwriteRefreshRate) && Board::GetConsoleType() != HorizonOCConsoleType_Hoag) {
if(targetHz) if(targetHz)
Board::SetHz(HorizonOCModule_Display, targetHz); Board::SetHz(HorizonOCModule_Display, targetHz);
else else
@@ -672,7 +679,7 @@ bool ClockManager::RefreshContext()
FileUtils::WriteContextToCsv(this->context); FileUtils::WriteContextToCsv(this->context);
} }
if(this->context->profile == SysClkProfile_Docked && Board::GetConsoleType() != HorizonOCConsoleType_Lite) if(this->context->profile == SysClkProfile_Docked && Board::GetConsoleType() != HorizonOCConsoleType_Hoag)
this->context->maxDisplayFreq = Board::GetHighestDockedDisplayRate(); this->context->maxDisplayFreq = Board::GetHighestDockedDisplayRate();
else else
this->context->maxDisplayFreq = 60; this->context->maxDisplayFreq = 60;

View File

@@ -71,7 +71,6 @@ class ClockManager
int GetSpeedoBracket (int speedo); int GetSpeedoBracket (int speedo);
unsigned int GetGpuVoltage (unsigned int freq, int speedo); unsigned int GetGpuVoltage (unsigned int freq, int speedo);
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); std::uint32_t GetMaxAllowedHz(SysClkModule module, SysClkProfile profile);