hoc-sys: fix tdp and add emc dvfs

This commit is contained in:
souldbminersmwc
2025-11-20 21:06:13 -05:00
parent d5c861827b
commit 39ae532108
8 changed files with 110 additions and 50 deletions

View File

@@ -32,11 +32,11 @@ volatile CustomizeTable C = {
.commonCpuBoostClock = 1785000, // Default boost clock .commonCpuBoostClock = 1785000, // Default boost clock
.commonEmcMemVolt = 1175000, // LPDDR4X JEDEC Specification .commonEmcMemVolt = 1125000, // LPDDR4X JEDEC Specification
.eristaCpuMaxVolt = 1235, .eristaCpuMaxVolt = 1235,
.eristaEmcMaxClock = 1600000, // Maximum HB-MGCH ram rating .eristaEmcMaxClock = 1862400, // Maximum HB-MGCH ram rating
.marikoCpuMaxVolt = 1120, .marikoCpuMaxVolt = 1120,
@@ -137,7 +137,7 @@ volatile CustomizeTable C = {
0 /* 998 (Disabled by default) */, 0 /* 998 (Disabled by default) */,
0 /* 1036 (Disabled by default) */, 0 /* 1036 (Disabled by default) */,
0 /* 1075 (Disabled by default) */, 0 /* 1075 (Disabled by default) */,
}; },

View File

@@ -201,7 +201,6 @@ void MemMtcTableAutoAdjust(EristaMtcTable *table) {
} }
Result MemFreqMtcTable(u32 *ptr) { Result MemFreqMtcTable(u32 *ptr) {
if(C.eristaEmcMaxClock != EmcClkOSLimit) {
u32 khz_list[] = {1600000, 1331200, 1065600, 800000, 665600, 408000, 204000, 102000, 68000, 40800}; u32 khz_list[] = {1600000, 1331200, 1065600, 800000, 665600, 408000, 204000, 102000, 68000, 40800};
u32 khz_list_size = sizeof(khz_list) / sizeof(u32); u32 khz_list_size = sizeof(khz_list) / sizeof(u32);
@@ -232,9 +231,6 @@ void MemMtcTableAutoAdjust(EristaMtcTable *table) {
//} //}
R_SUCCEED(); R_SUCCEED();
} else {
R_SUCCEED(); // Skip changing table on default freq
}
} }
Result MemFreqMax(u32 *ptr) { Result MemFreqMax(u32 *ptr) {

View File

@@ -47,6 +47,9 @@ typedef enum {
HocClkConfigValue_MarikoMaxGpuClock, HocClkConfigValue_MarikoMaxGpuClock,
HocClkConfigValue_MarikoMaxMemClock, HocClkConfigValue_MarikoMaxMemClock,
HocClkConfigValue_MarikoCpuBoostClock,
HocClkConfigValue_EristaCpuBoostClock,
HocClkConfigValue_ThermalThrottle, HocClkConfigValue_ThermalThrottle,
HocClkConfigValue_ThermalThrottleThreshold, HocClkConfigValue_ThermalThrottleThreshold,
@@ -56,12 +59,13 @@ typedef enum {
HocClkConfigValue_HandheldTDP, HocClkConfigValue_HandheldTDP,
HocClkConfigValue_HandheldTDPLimit, HocClkConfigValue_HandheldTDPLimit,
HocClkConfigValue_LiteTDPLimit, HocClkConfigValue_LiteTDPLimit,
HocClkConfigValue_TDPCycleLimit,
HocClkConfigValue_EnforceBoardLimit, HocClkConfigValue_EnforceBoardLimit,
HocClkConfigValue_EMCDVFS,
HocClkConfigValue_EMCVdd2VoltageUV, HocClkConfigValue_EMCVdd2VoltageUV,
HocClkConfigValue_EMCVdd2VoltageUVStockErista,
HocClkConfigValue_EMCVdd2VoltageUVStockMariko,
SysClkConfigValue_EnumMax, SysClkConfigValue_EnumMax,
} SysClkConfigValue; } SysClkConfigValue;
@@ -102,6 +106,12 @@ static inline const char* sysclkFormatConfigValue(SysClkConfigValue val, bool pr
case HocClkConfigValue_MarikoMaxMemClock: case HocClkConfigValue_MarikoMaxMemClock:
return pretty ? "Max MEM Clock" : "mem_max_m"; return pretty ? "Max MEM Clock" : "mem_max_m";
case HocClkConfigValue_MarikoCpuBoostClock:
return pretty ? "CPU Boost Clock" : "cpu_boost_m";
case HocClkConfigValue_EristaCpuBoostClock:
return pretty ? "CPU Boost Clock" : "cpu_boost_e";
case HocClkConfigValue_ThermalThrottle: case HocClkConfigValue_ThermalThrottle:
return pretty ? "Thermal Throttle" : "thermal_throttle"; return pretty ? "Thermal Throttle" : "thermal_throttle";
@@ -122,12 +132,16 @@ static inline const char* sysclkFormatConfigValue(SysClkConfigValue val, bool pr
case HocClkConfigValue_LiteTDPLimit: case HocClkConfigValue_LiteTDPLimit:
return pretty ? "Lite TDP Limit" : "tdp_limit_l"; return pretty ? "Lite TDP Limit" : "tdp_limit_l";
case HocClkConfigValue_TDPCycleLimit:
return pretty ? "TDP Cycle Limit" : "tdp_limit_c";
case HocClkConfigValue_EnforceBoardLimit: case HocClkConfigValue_EnforceBoardLimit:
return pretty ? "Enforce Board Limit" : "enforce_board_limit"; return pretty ? "Enforce Board Limit" : "enforce_board_limit";
case HocClkConfigValue_EMCDVFS:
return pretty ? "EMC DVFS" : "emc_dvfs";
case HocClkConfigValue_EMCVdd2VoltageUV: case HocClkConfigValue_EMCVdd2VoltageUV:
return pretty ? "EMC Vdd2 Voltage" : "emc_vdd2_voltage_uv"; return pretty ? "Overclocked EMC Vdd2 Voltage" : "emc_vdd2_voltage_uv";
case HocClkConfigValue_EMCVdd2VoltageUVStockErista:
return pretty ? "Stock EMC Vdd2 Voltage" : "emc_vdd2_voltage_uv_s_e";
case HocClkConfigValue_EMCVdd2VoltageUVStockMariko:
return pretty ? "Stock EMC Vdd2 Voltage" : "emc_vdd2_voltage_uv_s_m";
default: default:
return pretty ? "Null" : "null"; return pretty ? "Null" : "null";
} }
@@ -147,6 +161,7 @@ static inline uint64_t sysclkDefaultConfigValue(SysClkConfigValue val)
case HocClkConfigValue_OverwriteBoostMode: case HocClkConfigValue_OverwriteBoostMode:
return 0ULL; return 0ULL;
case HocClkConfigValue_EristaMaxCpuClock: case HocClkConfigValue_EristaMaxCpuClock:
case HocClkConfigValue_EristaCpuBoostClock:
return 1785ULL; return 1785ULL;
case HocClkConfigValue_EristaMaxGpuClock: case HocClkConfigValue_EristaMaxGpuClock:
return 921ULL; return 921ULL;
@@ -154,9 +169,10 @@ static inline uint64_t sysclkDefaultConfigValue(SysClkConfigValue val)
return 1600ULL; return 1600ULL;
case HocClkConfigValue_MarikoMaxCpuClock: case HocClkConfigValue_MarikoMaxCpuClock:
case HocClkConfigValue_MarikoCpuBoostClock:
return 1963ULL; return 1963ULL;
case HocClkConfigValue_MarikoMaxGpuClock: case HocClkConfigValue_MarikoMaxGpuClock:
return 1075ULL; return 1152ULL;
case HocClkConfigValue_MarikoMaxMemClock: case HocClkConfigValue_MarikoMaxMemClock:
return 1862ULL; return 1862ULL;
@@ -165,6 +181,7 @@ static inline uint64_t sysclkDefaultConfigValue(SysClkConfigValue val)
case HocClkConfigValue_HandheldGovernor: case HocClkConfigValue_HandheldGovernor:
case HocClkConfigValue_HandheldTDP: case HocClkConfigValue_HandheldTDP:
case HocClkConfigValue_EnforceBoardLimit: case HocClkConfigValue_EnforceBoardLimit:
case HocClkConfigValue_EMCDVFS:
return 1ULL; return 1ULL;
case HocClkConfigValue_ThermalThrottleThreshold: case HocClkConfigValue_ThermalThrottleThreshold:
return 70ULL; return 70ULL;
@@ -172,10 +189,12 @@ static inline uint64_t sysclkDefaultConfigValue(SysClkConfigValue val)
return 8600ULL; return 8600ULL;
case HocClkConfigValue_LiteTDPLimit: case HocClkConfigValue_LiteTDPLimit:
return 6400ULL; return 6400ULL;
case HocClkConfigValue_TDPCycleLimit:
return 10ULL;
case HocClkConfigValue_EMCVdd2VoltageUV: case HocClkConfigValue_EMCVdd2VoltageUV:
return 1175000ULL; return 1175000ULL;
case HocClkConfigValue_EMCVdd2VoltageUVStockErista:
return 1125000ULL;
case HocClkConfigValue_EMCVdd2VoltageUVStockMariko:
return 1100000ULL;
default: default:
return 0ULL; return 0ULL;
} }
@@ -191,6 +210,8 @@ static inline uint64_t sysclkValidConfigValue(SysClkConfigValue val, uint64_t in
case HocClkConfigValue_MarikoMaxCpuClock: case HocClkConfigValue_MarikoMaxCpuClock:
case HocClkConfigValue_MarikoMaxGpuClock: case HocClkConfigValue_MarikoMaxGpuClock:
case HocClkConfigValue_MarikoMaxMemClock: case HocClkConfigValue_MarikoMaxMemClock:
case HocClkConfigValue_EristaCpuBoostClock:
case HocClkConfigValue_MarikoCpuBoostClock:
case HocClkConfigValue_ThermalThrottleThreshold: case HocClkConfigValue_ThermalThrottleThreshold:
case HocClkConfigValue_HandheldTDPLimit: case HocClkConfigValue_HandheldTDPLimit:
case HocClkConfigValue_LiteTDPLimit: case HocClkConfigValue_LiteTDPLimit:
@@ -200,8 +221,9 @@ static inline uint64_t sysclkValidConfigValue(SysClkConfigValue val, uint64_t in
case SysClkConfigValue_FreqLogIntervalMs: case SysClkConfigValue_FreqLogIntervalMs:
case SysClkConfigValue_PowerLogIntervalMs: case SysClkConfigValue_PowerLogIntervalMs:
case SysClkConfigValue_CsvWriteIntervalMs: case SysClkConfigValue_CsvWriteIntervalMs:
case HocClkConfigValue_TDPCycleLimit:
case HocClkConfigValue_EMCVdd2VoltageUV: case HocClkConfigValue_EMCVdd2VoltageUV:
case HocClkConfigValue_EMCVdd2VoltageUVStockErista:
case HocClkConfigValue_EMCVdd2VoltageUVStockMariko:
return input >= 0; return input >= 0;
case HocClkConfigValue_UncappedClocks: case HocClkConfigValue_UncappedClocks:
case HocClkConfigValue_OverwriteBoostMode: case HocClkConfigValue_OverwriteBoostMode:
@@ -210,6 +232,7 @@ static inline uint64_t sysclkValidConfigValue(SysClkConfigValue val, uint64_t in
case HocClkConfigValue_HandheldGovernor: case HocClkConfigValue_HandheldGovernor:
case HocClkConfigValue_HandheldTDP: case HocClkConfigValue_HandheldTDP:
case HocClkConfigValue_EnforceBoardLimit: case HocClkConfigValue_EnforceBoardLimit:
case HocClkConfigValue_EMCDVFS:
return (input & 0x1) == input; return (input & 0x1) == input;
default: default:
return false; return false;

View File

@@ -246,14 +246,34 @@ void MiscGui::listUI()
addFreqButton(HocClkConfigValue_EristaMaxMemClock, nullptr, SysClkModule_MEM); addFreqButton(HocClkConfigValue_EristaMaxMemClock, nullptr, SysClkModule_MEM);
} }
addConfigToggle(HocClkConfigValue_EMCDVFS, nullptr);
ValueThresholds emcUvThresholds(1212500, 1250000); ValueThresholds emcUvThresholds(1212500, 1250000);
addConfigButton( addConfigButton(
HocClkConfigValue_EMCVdd2VoltageUV, HocClkConfigValue_EMCVdd2VoltageUV,
"EMC VDD2 Voltage", "EMC VDD2 Voltage",
ValueRange(1100000, 1350000, 12500, "mV", 1000, 1), ValueRange(1100000, 1237500, 12500, "mV", 1000, 1),
"EMC VDD2 Voltage", "EMC VDD2 Voltage",
&emcUvThresholds &emcUvThresholds
); );
// if(IsMariko()) {
// addConfigButton(
// HocClkConfigValue_EMCVdd2VoltageUVStockMariko,
// "EMC Stock VDD2 Voltage",
// ValueRange(912500, 1175000, 12500, "mV", 1000, 1),
// "EMC Stock VDD2 Voltage",
// &emcUvThresholds
// );
// } else {
addConfigButton(
HocClkConfigValue_EMCVdd2VoltageUVStockErista,
"EMC Stock VDD2 Voltage",
ValueRange(1000000, 1175000, 12500, "mV", 1000, 1),
"EMC Stock VDD2 Voltage",
&emcUvThresholds
);
// }
tsl::elm::ListItem* applyBtn = new tsl::elm::ListItem("Apply EMC Regs"); tsl::elm::ListItem* applyBtn = new tsl::elm::ListItem("Apply EMC Regs");
applyBtn->setClickListener([](u64 keys) { applyBtn->setClickListener([](u64 keys) {

View File

@@ -228,50 +228,69 @@ void ClockManager::RefreshFreqTableRow(SysClkModule module)
void ClockManager::Tick() void ClockManager::Tick()
{ {
std::uint32_t mode = 0;
AppletOperationMode opMode = appletGetOperationMode();
Result rc = apmExtGetCurrentPerformanceConfiguration(&mode);
ASSERT_RESULT_OK(rc, "apmExtGetCurrentPerformanceConfiguration");
if(this->config->GetConfigValue(HocClkConfigValue_EMCDVFS)) {
#define DEFAULT_FREQ_MHZ 1600
#define DEFAULT_FREQ_MHZ_M 1862
int ram_mhz = Board::GetHz((SysClkModule)SysClkModule_MEM) / 1000000;
if (Board::GetSocType() == SysClkSocType_Mariko) {
if(ram_mhz > DEFAULT_FREQ_MHZ_M)
set_sd1_voltage(this->config->GetConfigValue(HocClkConfigValue_EMCVdd2VoltageUV));
else
set_sd1_voltage(this->config->GetConfigValue(HocClkConfigValue_EMCVdd2VoltageUVStockMariko));
} else {
if(ram_mhz > DEFAULT_FREQ_MHZ)
set_sd1_voltage(this->config->GetConfigValue(HocClkConfigValue_EMCVdd2VoltageUV));
else
set_sd1_voltage(this->config->GetConfigValue(HocClkConfigValue_EMCVdd2VoltageUVStockErista));
}
}
if(this->config->GetConfigValue(HocClkConfigValue_HandheldTDP) && opMode == AppletOperationMode_Handheld) {
if(Board::GetSocType() == SysClkSocType_MarikoLite) {
if(Board::GetPowerMw(SysClkPowerSensor_Avg) < -(int)this->config->GetConfigValue(HocClkConfigValue_LiteTDPLimit)) {
ResetToStockClocks();
return;
}
} else {
if(Board::GetPowerMw(SysClkPowerSensor_Avg) < -(int)this->config->GetConfigValue(HocClkConfigValue_HandheldTDPLimit)) {
ResetToStockClocks();
return;
}
}
} else if(opMode == AppletOperationMode_Console && this->config->GetConfigValue(HocClkConfigValue_EnforceBoardLimit)) {
if(Board::GetPowerMw(SysClkPowerSensor_Avg) < 0) {
ResetToStockClocks();
return;
}
}
if(((tmp451TempSoc() / 1000) > (int)this->config->GetConfigValue(HocClkConfigValue_ThermalThrottleThreshold)) && this->config->GetConfigValue(HocClkConfigValue_ThermalThrottle)) {
ResetToStockClocks();
return;
}
std::scoped_lock lock{this->contextMutex}; std::scoped_lock lock{this->contextMutex};
if (this->RefreshContext() || this->config->Refresh()) if (this->RefreshContext() || this->config->Refresh())
{ {
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;
std::uint32_t mode = 0;
if(this->config->GetConfigValue(HocClkConfigValue_EMCVdd2VoltageUV) < 1400000) { // Safety Check
set_sd1_voltage((u32)this->config->GetConfigValue(HocClkConfigValue_EMCVdd2VoltageUV));
}
AppletOperationMode opMode = appletGetOperationMode();
Result rc = apmExtGetCurrentPerformanceConfiguration(&mode);
ASSERT_RESULT_OK(rc, "apmExtGetCurrentPerformanceConfiguration");
if(this->config->GetConfigValue(HocClkConfigValue_HandheldTDP) && opMode == AppletOperationMode_Handheld) {
if(Board::GetSocType() == SysClkSocType_MarikoLite) {
if(Board::GetPowerMw(SysClkPowerSensor_Avg) < -(int)this->config->GetConfigValue(HocClkConfigValue_LiteTDPLimit)) {
ResetToStockClocks();
return;
}
} else {
if(Board::GetPowerMw(SysClkPowerSensor_Avg) < -(int)this->config->GetConfigValue(HocClkConfigValue_HandheldTDPLimit)) {
ResetToStockClocks();
return;
}
}
} else if(opMode == AppletOperationMode_Console && this->config->GetConfigValue(HocClkConfigValue_EnforceBoardLimit)) {
if(Board::GetPowerMw(SysClkPowerSensor_Avg) < 0) {
ResetToStockClocks();
return;
}
}
if(apmExtIsBoostMode(mode) && !this->config->GetConfigValue(HocClkConfigValue_OverwriteBoostMode)) { if(apmExtIsBoostMode(mode) && !this->config->GetConfigValue(HocClkConfigValue_OverwriteBoostMode)) {
ResetToStockClocks(); ResetToStockClocks();
return; return;
} }
if(((tmp451TempSoc() / 1000) > (int)this->config->GetConfigValue(HocClkConfigValue_ThermalThrottleThreshold)) && this->config->GetConfigValue(HocClkConfigValue_ThermalThrottle)) {
ResetToStockClocks();
return;
}
if(this->config->GetConfigValue(HocClkConfigValue_HandheldGovernor) && opMode == AppletOperationMode_Handheld) { if(this->config->GetConfigValue(HocClkConfigValue_HandheldGovernor) && opMode == AppletOperationMode_Handheld) {
} }

4
dist/README.md vendored
View File

@@ -84,12 +84,14 @@ It enables advanced CPU, GPU, and RAM tuning with user-friendly configuration to
``` ```
3. Move the cloned folder into `build/`. 3. Move the cloned folder into `build/`.
4. Insert your `Source/stratosphere` folder into `build/`. 4. Insert your `Source/stratosphere` folder into `build/`.
5. Run: 5. Run: (On Windows you need to use "make -j %NUMBER_OF_PROCESSORS%")
```bash ```bash
./build.sh ./build.sh
``` ```
To build the Configurator: To build the Configurator:
```bash ```bash

Binary file not shown.