diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/customize.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/customize.cpp index e67f5a30..c4a7a549 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/customize.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/customize.cpp @@ -32,11 +32,11 @@ volatile CustomizeTable C = { .commonCpuBoostClock = 1785000, // Default boost clock -.commonEmcMemVolt = 1175000, // LPDDR4X JEDEC Specification +.commonEmcMemVolt = 1125000, // LPDDR4X JEDEC Specification .eristaCpuMaxVolt = 1235, -.eristaEmcMaxClock = 1600000, // Maximum HB-MGCH ram rating +.eristaEmcMaxClock = 1862400, // Maximum HB-MGCH ram rating .marikoCpuMaxVolt = 1120, @@ -137,7 +137,7 @@ volatile CustomizeTable C = { 0 /* 998 (Disabled by default) */, 0 /* 1036 (Disabled by default) */, 0 /* 1075 (Disabled by default) */, -}; +}, diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_erista.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_erista.cpp index 1166776b..cb861c3c 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_erista.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_erista.cpp @@ -201,7 +201,6 @@ void MemMtcTableAutoAdjust(EristaMtcTable *table) { } Result MemFreqMtcTable(u32 *ptr) { - if(C.eristaEmcMaxClock != EmcClkOSLimit) { u32 khz_list[] = {1600000, 1331200, 1065600, 800000, 665600, 408000, 204000, 102000, 68000, 40800}; u32 khz_list_size = sizeof(khz_list) / sizeof(u32); @@ -232,9 +231,6 @@ void MemMtcTableAutoAdjust(EristaMtcTable *table) { //} R_SUCCEED(); - } else { - R_SUCCEED(); // Skip changing table on default freq - } } Result MemFreqMax(u32 *ptr) { diff --git a/Source/sys-clk/common/include/sysclk/config.h b/Source/sys-clk/common/include/sysclk/config.h index b38dd62e..7060502a 100644 --- a/Source/sys-clk/common/include/sysclk/config.h +++ b/Source/sys-clk/common/include/sysclk/config.h @@ -47,6 +47,9 @@ typedef enum { HocClkConfigValue_MarikoMaxGpuClock, HocClkConfigValue_MarikoMaxMemClock, + HocClkConfigValue_MarikoCpuBoostClock, + HocClkConfigValue_EristaCpuBoostClock, + HocClkConfigValue_ThermalThrottle, HocClkConfigValue_ThermalThrottleThreshold, @@ -56,12 +59,13 @@ typedef enum { HocClkConfigValue_HandheldTDP, HocClkConfigValue_HandheldTDPLimit, HocClkConfigValue_LiteTDPLimit, - HocClkConfigValue_TDPCycleLimit, HocClkConfigValue_EnforceBoardLimit, + HocClkConfigValue_EMCDVFS, HocClkConfigValue_EMCVdd2VoltageUV, - + HocClkConfigValue_EMCVdd2VoltageUVStockErista, + HocClkConfigValue_EMCVdd2VoltageUVStockMariko, SysClkConfigValue_EnumMax, } SysClkConfigValue; @@ -102,6 +106,12 @@ static inline const char* sysclkFormatConfigValue(SysClkConfigValue val, bool pr case HocClkConfigValue_MarikoMaxMemClock: 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: return pretty ? "Thermal Throttle" : "thermal_throttle"; @@ -122,12 +132,16 @@ static inline const char* sysclkFormatConfigValue(SysClkConfigValue val, bool pr case HocClkConfigValue_LiteTDPLimit: return pretty ? "Lite TDP Limit" : "tdp_limit_l"; - case HocClkConfigValue_TDPCycleLimit: - return pretty ? "TDP Cycle Limit" : "tdp_limit_c"; case HocClkConfigValue_EnforceBoardLimit: return pretty ? "Enforce Board Limit" : "enforce_board_limit"; + case HocClkConfigValue_EMCDVFS: + return pretty ? "EMC DVFS" : "emc_dvfs"; 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: return pretty ? "Null" : "null"; } @@ -147,6 +161,7 @@ static inline uint64_t sysclkDefaultConfigValue(SysClkConfigValue val) case HocClkConfigValue_OverwriteBoostMode: return 0ULL; case HocClkConfigValue_EristaMaxCpuClock: + case HocClkConfigValue_EristaCpuBoostClock: return 1785ULL; case HocClkConfigValue_EristaMaxGpuClock: return 921ULL; @@ -154,9 +169,10 @@ static inline uint64_t sysclkDefaultConfigValue(SysClkConfigValue val) return 1600ULL; case HocClkConfigValue_MarikoMaxCpuClock: + case HocClkConfigValue_MarikoCpuBoostClock: return 1963ULL; case HocClkConfigValue_MarikoMaxGpuClock: - return 1075ULL; + return 1152ULL; case HocClkConfigValue_MarikoMaxMemClock: return 1862ULL; @@ -165,6 +181,7 @@ static inline uint64_t sysclkDefaultConfigValue(SysClkConfigValue val) case HocClkConfigValue_HandheldGovernor: case HocClkConfigValue_HandheldTDP: case HocClkConfigValue_EnforceBoardLimit: + case HocClkConfigValue_EMCDVFS: return 1ULL; case HocClkConfigValue_ThermalThrottleThreshold: return 70ULL; @@ -172,10 +189,12 @@ static inline uint64_t sysclkDefaultConfigValue(SysClkConfigValue val) return 8600ULL; case HocClkConfigValue_LiteTDPLimit: return 6400ULL; - case HocClkConfigValue_TDPCycleLimit: - return 10ULL; case HocClkConfigValue_EMCVdd2VoltageUV: return 1175000ULL; + case HocClkConfigValue_EMCVdd2VoltageUVStockErista: + return 1125000ULL; + case HocClkConfigValue_EMCVdd2VoltageUVStockMariko: + return 1100000ULL; default: return 0ULL; } @@ -191,6 +210,8 @@ static inline uint64_t sysclkValidConfigValue(SysClkConfigValue val, uint64_t in case HocClkConfigValue_MarikoMaxCpuClock: case HocClkConfigValue_MarikoMaxGpuClock: case HocClkConfigValue_MarikoMaxMemClock: + case HocClkConfigValue_EristaCpuBoostClock: + case HocClkConfigValue_MarikoCpuBoostClock: case HocClkConfigValue_ThermalThrottleThreshold: case HocClkConfigValue_HandheldTDPLimit: case HocClkConfigValue_LiteTDPLimit: @@ -200,8 +221,9 @@ static inline uint64_t sysclkValidConfigValue(SysClkConfigValue val, uint64_t in case SysClkConfigValue_FreqLogIntervalMs: case SysClkConfigValue_PowerLogIntervalMs: case SysClkConfigValue_CsvWriteIntervalMs: - case HocClkConfigValue_TDPCycleLimit: case HocClkConfigValue_EMCVdd2VoltageUV: + case HocClkConfigValue_EMCVdd2VoltageUVStockErista: + case HocClkConfigValue_EMCVdd2VoltageUVStockMariko: return input >= 0; case HocClkConfigValue_UncappedClocks: case HocClkConfigValue_OverwriteBoostMode: @@ -210,6 +232,7 @@ static inline uint64_t sysclkValidConfigValue(SysClkConfigValue val, uint64_t in case HocClkConfigValue_HandheldGovernor: case HocClkConfigValue_HandheldTDP: case HocClkConfigValue_EnforceBoardLimit: + case HocClkConfigValue_EMCDVFS: return (input & 0x1) == input; default: return false; diff --git a/Source/sys-clk/overlay/src/ui/gui/misc_gui.cpp b/Source/sys-clk/overlay/src/ui/gui/misc_gui.cpp index cd01d3ca..7ec20065 100644 --- a/Source/sys-clk/overlay/src/ui/gui/misc_gui.cpp +++ b/Source/sys-clk/overlay/src/ui/gui/misc_gui.cpp @@ -246,14 +246,34 @@ void MiscGui::listUI() addFreqButton(HocClkConfigValue_EristaMaxMemClock, nullptr, SysClkModule_MEM); } + addConfigToggle(HocClkConfigValue_EMCDVFS, nullptr); + ValueThresholds emcUvThresholds(1212500, 1250000); addConfigButton( HocClkConfigValue_EMCVdd2VoltageUV, "EMC VDD2 Voltage", - ValueRange(1100000, 1350000, 12500, "mV", 1000, 1), + ValueRange(1100000, 1237500, 12500, "mV", 1000, 1), "EMC VDD2 Voltage", &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"); applyBtn->setClickListener([](u64 keys) { diff --git a/Source/sys-clk/sysmodule/src/clock_manager.cpp b/Source/sys-clk/sysmodule/src/clock_manager.cpp index 9cebf807..b712f489 100644 --- a/Source/sys-clk/sysmodule/src/clock_manager.cpp +++ b/Source/sys-clk/sysmodule/src/clock_manager.cpp @@ -228,50 +228,69 @@ void ClockManager::RefreshFreqTableRow(SysClkModule module) 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}; if (this->RefreshContext() || this->config->Refresh()) { std::uint32_t targetHz = 0; std::uint32_t maxHz = 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)) { ResetToStockClocks(); 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) { } diff --git a/dist/README.md b/dist/README.md index 73219487..116ce457 100644 --- a/dist/README.md +++ b/dist/README.md @@ -84,12 +84,14 @@ It enables advanced CPU, GPU, and RAM tuning with user-friendly configuration to ``` 3. Move the cloned 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 ./build.sh ``` + + To build the Configurator: ```bash diff --git a/dist/atmosphere/contents/00FF0000636C6BFF/exefs.nsp b/dist/atmosphere/contents/00FF0000636C6BFF/exefs.nsp index 62687b0e..3d82cdae 100644 Binary files a/dist/atmosphere/contents/00FF0000636C6BFF/exefs.nsp and b/dist/atmosphere/contents/00FF0000636C6BFF/exefs.nsp differ diff --git a/dist/atmosphere/kips/hoc.kip b/dist/atmosphere/kips/hoc.kip index 3873ff0f..068a23e9 100644 Binary files a/dist/atmosphere/kips/hoc.kip and b/dist/atmosphere/kips/hoc.kip differ