Files
Horizon-OC-pro/Source/sys-clk/overlay/src/ui/gui/misc_gui.cpp
2025-12-17 18:49:40 -05:00

1638 lines
46 KiB
C++

/*
* Copyright (C) Switch-OC-Suite
*
* Copyright (c) 2023 hanai3Bi
*
* Copyright (c) Souldbminer and Horizon OC Contributors
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#include "misc_gui.h"
#include "fatal_gui.h"
#include "../format.h"
#include <cstdio>
#include <cstring>
#include <vector>
MiscGui::MiscGui()
{
this->configList = new SysClkConfigValueList {};
}
MiscGui::~MiscGui()
{
delete this->configList;
this->configToggles.clear();
this->configTrackbars.clear();
this->configButtons.clear();
this->configRanges.clear();
}
void MiscGui::addConfigToggle(SysClkConfigValue configVal, const char* altName) {
const char* configName = altName ? altName : sysclkFormatConfigValue(configVal, true);
tsl::elm::ToggleListItem* toggle = new tsl::elm::ToggleListItem(configName, this->configList->values[configVal]);
toggle->setStateChangedListener([this, configVal](bool state) {
this->configList->values[configVal] = uint64_t(state);
Result rc = sysclkIpcSetConfigValues(this->configList);
if (R_FAILED(rc))
FatalGui::openWithResultCode("sysclkIpcSetConfigValues", rc);
this->lastContextUpdate = armGetSystemTick();
});
this->listElement->addItem(toggle);
this->configToggles[configVal] = toggle;
}
void MiscGui::addConfigButton(SysClkConfigValue configVal,
const char* altName,
const ValueRange& range,
const std::string& categoryName,
const ValueThresholds* thresholds,
const std::map<uint32_t, std::string>& labels,
const std::vector<NamedValue>& namedValues,
bool showDefaultValue)
{
const char* configName = altName ? altName : sysclkFormatConfigValue(configVal, true);
tsl::elm::ListItem* listItem = new tsl::elm::ListItem(configName);
uint64_t currentValue = this->configList->values[configVal];
char valueText[32];
if (currentValue == 0) {
snprintf(valueText, sizeof(valueText), "%s", VALUE_DEFAULT_TEXT);
} else {
uint64_t displayValue = currentValue / range.divisor;
if (!range.suffix.empty()) {
snprintf(valueText, sizeof(valueText), "%lu %s", displayValue, range.suffix.c_str());
} else {
snprintf(valueText, sizeof(valueText), "%lu", displayValue);
}
}
listItem->setValue(valueText);
ValueThresholds thresholdsCopy = (thresholds ? *thresholds : ValueThresholds{});
listItem->setClickListener(
[this, configVal, range, categoryName, thresholdsCopy, labels, namedValues, showDefaultValue](u64 keys)
{
if ((keys & HidNpadButton_A) == 0)
return false;
std::uint32_t currentValue = this->configList->values[configVal];
if (thresholdsCopy.warning != 0 || thresholdsCopy.danger != 0) {
tsl::changeTo<ValueChoiceGui>(
currentValue,
range,
categoryName,
[this, configVal](std::uint32_t value) {
this->configList->values[configVal] = value;
Result rc = sysclkIpcSetConfigValues(this->configList);
if (R_FAILED(rc)) {
FatalGui::openWithResultCode("sysclkIpcSetConfigValues", rc);
return false;
}
this->lastContextUpdate = armGetSystemTick();
return true;
},
thresholdsCopy,
true,
labels,
namedValues,
showDefaultValue
);
} else {
tsl::changeTo<ValueChoiceGui>(
currentValue,
range,
categoryName,
[this, configVal](std::uint32_t value) {
this->configList->values[configVal] = value;
Result rc = sysclkIpcSetConfigValues(this->configList);
if (R_FAILED(rc)) {
FatalGui::openWithResultCode("sysclkIpcSetConfigValues", rc);
return false;
}
this->lastContextUpdate = armGetSystemTick();
return true;
},
ValueThresholds(),
false,
labels,
namedValues,
showDefaultValue
);
}
return true;
});
this->listElement->addItem(listItem);
this->configButtons[configVal] = listItem;
this->configRanges[configVal] = range;
this->configNamedValues[configVal] = namedValues;
}
void MiscGui::updateConfigToggles() {
for (const auto& [value, toggle] : this->configToggles) {
if (toggle != nullptr)
toggle->setState(this->configList->values[value]);
}
}
void MiscGui::addFreqButton(SysClkConfigValue configVal,
const char* altName,
SysClkModule module,
const std::map<uint32_t, std::string>& labels)
{
const char* configName = altName ? altName : sysclkFormatConfigValue(configVal, true);
tsl::elm::ListItem* listItem = new tsl::elm::ListItem(configName);
uint64_t currentMHz = this->configList->values[configVal];
char valueText[32];
snprintf(valueText, sizeof(valueText), "%lu MHz", currentMHz);
listItem->setValue(valueText);
listItem->setClickListener(
[this, configVal, module, labels](u64 keys)
{
if ((keys & HidNpadButton_A) == 0)
return false;
std::uint32_t hzList[SYSCLK_FREQ_LIST_MAX];
std::uint32_t hzCount;
Result rc = sysclkIpcGetFreqList(module, hzList, SYSCLK_FREQ_LIST_MAX, &hzCount);
if (R_FAILED(rc)) {
FatalGui::openWithResultCode("sysclkIpcGetFreqList", rc);
return false;
}
std::uint32_t currentHz = this->configList->values[configVal] * 1'000'000;
tsl::changeTo<FreqChoiceGui>(
currentHz,
hzList,
hzCount,
module,
[this, configVal](std::uint32_t hz)
{
uint64_t mhz = hz / 1'000'000;
this->configList->values[configVal] = mhz;
Result rc = sysclkIpcSetConfigValues(this->configList);
if (R_FAILED(rc)) {
FatalGui::openWithResultCode("sysclkIpcSetConfigValues", rc);
return false;
}
this->lastContextUpdate = armGetSystemTick();
return true;
},
false,
labels
);
return true;
});
this->listElement->addItem(listItem);
this->configButtons[configVal] = listItem;
this->configRanges[configVal] = ValueRange(0, 0, 0, "MHz", 1);
}
void MiscGui::listUI()
{
ValueThresholds thresholdsDisabled(0, 0);
std::vector<NamedValue> noNamedValues = {};
this->listElement->addItem(new tsl::elm::CategoryHeader("Settings"));
addConfigToggle(HocClkConfigValue_UncappedClocks, nullptr);
addConfigToggle(HocClkConfigValue_OverwriteBoostMode, nullptr);
addConfigToggle(HocClkConfigValue_HandheldGovernor, nullptr);
this->listElement->addItem(new tsl::elm::CategoryHeader("Experimental"));
addConfigToggle(HocClkConfigValue_ThermalThrottle, nullptr);
addConfigToggle(HocClkConfigValue_HandheldTDP, nullptr);
std::map<uint32_t, std::string> labels_pwr_r = {
{8600, "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 tdpThresholdsLite(6400, 7500);
addConfigButton(
HocClkConfigValue_LiteTDPLimit,
"Lite TDP Threshold",
ValueRange(4000, 8000, 100, "mW", 1),
"Power",
&tdpThresholdsLite,
labels_pwr_r
);
ValueThresholds throttleThresholds(70, 80);
addConfigButton(
HocClkConfigValue_ThermalThrottleThreshold,
"Thermal Throttle Limit",
ValueRange(50, 85, 1, "°C", 1),
"Temp",
&throttleThresholds
);
std::map<uint32_t, std::string> cpu_freq_label_m = {
{612000000, "Sleep Mode"},
{1020000000, "Stock"},
{1224000000, "Dev OC"},
{1785000000, "Boost Mode"},
{1963000000, "Safe Max"},
{2397000000, "Unsafe Max"},
{2805000000, "Absolute Max"},
};
std::map<uint32_t, std::string> cpu_freq_label_e = {
{612000000, "Sleep Mode"},
{1020000000, "Stock"},
{1224000000, "Dev OC"},
{1785000000, "Boost Mode & Safe Max"},
{2091000000, "Unsafe Max"},
{2295000000, "Absolute Max"},
};
std::map<uint32_t, std::string> gpu_freq_label_e = {
{76800000, "Boost Mode"},
{307200000, "Handheld"},
{384000000, "Handheld"},
{460800000, "Handheld Safe Max"},
{768000000, "Docked"},
{844000000, "Safe Max"},
{998400000, "Unsafe Max"},
{1075200000, "Absolute Max"},
};
std::map<uint32_t, std::string> gpu_freq_label_m = {
{76800000, "Boost Mode"},
{307200000, "Handheld"},
{384000000, "Handheld"},
{460800000, "Handheld"},
{614400000, "Handheld Safe Max"},
{768000000, "Docked"},
{1075200000, "Safe Max"},
{1305600000, "Unsafe Max"},
{1536000000, "Absolute Max"},
};
std::map<uint32_t, std::string> emc_freq_label_e = {
{133120000, "Handheld"},
{160000000, "Docked & Safe Max"},
{213100000, "JEDEC Max"},
{236000000, "Absolute Max"},
};
std::map<uint32_t, std::string> emc_freq_label_m = {
{133120000, "Handheld"},
{160000000, "Docked"},
{186600000, "Safe Max (3733MT/s)"},
{213300000, "Safe Max (4266MT/s)"},
{320000000, "Unsafe Max"},
{350000000, "Absolute Max"},
};
if(IsMariko()) {
addFreqButton(HocClkConfigValue_MarikoMaxCpuClock, nullptr, SysClkModule_CPU, cpu_freq_label_m);
addFreqButton(HocClkConfigValue_MarikoMaxGpuClock, nullptr, SysClkModule_GPU, gpu_freq_label_m);
// addFreqButton(HocClkConfigValue_MarikoMaxMemClock, nullptr, SysClkModule_MEM, emc_freq_label_m);
} else {
addFreqButton(HocClkConfigValue_EristaMaxCpuClock, nullptr, SysClkModule_CPU, cpu_freq_label_e);
addFreqButton(HocClkConfigValue_EristaMaxGpuClock, nullptr, SysClkModule_GPU, gpu_freq_label_e);
// addFreqButton(HocClkConfigValue_EristaMaxMemClock, nullptr, SysClkModule_MEM, emc_freq_label_e);
}
this->listElement->addItem(new tsl::elm::CategoryHeader("KIP Editing"));
addConfigToggle(HocClkConfigValue_KipEditing, nullptr);
std::vector<NamedValue> kipNameLabels = {
NamedValue("hoc.kip", 0),
NamedValue("loader.kip", 1)
};
addConfigButton(
HocClkConfigValue_KipFileName,
"KIP File Name",
ValueRange(0, 6, 1, "", 0),
"KIP File Name",
&thresholdsDisabled,
{},
kipNameLabels,
false
);
this->listElement->addItem(new tsl::elm::CategoryHeader("KIP Settings"));
if(IsMariko())
addFreqButton(KipConfigValue_marikoCpuBoostClock, nullptr, SysClkModule_CPU, cpu_freq_label_m);
else
addFreqButton(KipConfigValue_eristaCpuBoostClock, nullptr, SysClkModule_CPU, cpu_freq_label_e);
std::vector<NamedValue> autoAdjOptions = {
NamedValue("AUTO_ADJ", 0),
NamedValue("AUTO_ADJ_BL", 1)
};
addConfigButton(
KipConfigValue_mtcConf,
"MTC Configuration",
ValueRange(0, 1, 1, "", 1),
"MTC Configuration",
&thresholdsDisabled,
{},
autoAdjOptions,
false
);
addConfigToggle(KipConfigValue_hpMode, "HP Mode");
std::map<uint32_t, std::string> emc_voltage_label = {
{1100000, "Default (Mariko)"},
{1125000, "Default (Erista)"},
{1175000, "Rating"},
{1212500, "Safe Max (Mariko)"},
{1237500, "Safe Max (Erista)"},
{1250000, "Unsafe Max"},
};
ValueThresholds vdd2Thresholds(1212500, 1250000);
addConfigButton(
KipConfigValue_commonEmcMemVolt,
"EMC VDD2 Voltage",
ValueRange(912500, 1350000, 12500, "mV", 1000, 1),
"Voltage",
&vdd2Thresholds,
emc_voltage_label,
noNamedValues,
false
);
std::vector<NamedValue> marikoMaxEmcClock = {
NamedValue("1600MHz", 1600000),
NamedValue("1633MHz", 1633000),
NamedValue("1666MHz", 1666000),
NamedValue("1700MHz", 1700000),
NamedValue("1733MHz", 1733000),
NamedValue("1766MHz", 1766000),
NamedValue("1800MHz", 1800000),
NamedValue("1833MHz", 1833000),
NamedValue("1866MHz", 1866000),
NamedValue("1900MHz", 1900000),
NamedValue("1933MHz", 1933000),
NamedValue("1966MHz", 1966000),
NamedValue("2000MHz", 2000000),
NamedValue("2033MHz", 2033000),
NamedValue("2066MHz", 2066000),
NamedValue("2100MHz", 2100000),
NamedValue("2133MHz", 2133000),
NamedValue("2166MHz", 2166000),
NamedValue("2200MHz", 2200000),
NamedValue("2233MHz", 2233000),
NamedValue("2266MHz", 2266000),
NamedValue("2300MHz", 2300000),
NamedValue("2333MHz", 2333000),
NamedValue("2366MHz", 2366000),
NamedValue("2400MHz", 2400000),
NamedValue("2433MHz", 2433000),
NamedValue("2466MHz", 2466000),
NamedValue("2500MHz", 2500000),
NamedValue("2533MHz", 2533000),
NamedValue("2566MHz", 2566000),
NamedValue("2600MHz", 2600000),
NamedValue("2633MHz", 2633000),
NamedValue("2666MHz", 2666000),
NamedValue("2700MHz", 2700000),
NamedValue("2733MHz", 2733000),
NamedValue("2766MHz", 2766000),
NamedValue("2800MHz", 2800000),
NamedValue("2833MHz", 2833000),
NamedValue("2866MHz", 2866000),
NamedValue("2900MHz", 2900000),
NamedValue("2933MHz", 2933000),
NamedValue("2966MHz", 2966000),
NamedValue("3000MHz", 3000000),
NamedValue("3033MHz", 3033000),
NamedValue("3066MHz", 3066000),
NamedValue("3100MHz", 3100000),
NamedValue("3133MHz", 3133000),
NamedValue("3166MHz", 3166000),
NamedValue("3200MHz", 3200000),
NamedValue("3233MHz (Needs high Speedo/PLL)", 3233000),
NamedValue("3266MHz (Needs high Speedo/PLL)", 3266000),
NamedValue("3300MHz (Needs high Speedo/PLL)", 3300000),
NamedValue("3333MHz (Needs extreme Speedo/PLL)", 3333000),
NamedValue("3366MHz (Needs extreme Speedo/PLL)", 3366000),
NamedValue("3400MHz (Needs extreme Speedo/PLL)", 3400000),
NamedValue("3433MHz (Needs ridiculous Speedo/PLL)", 3433000),
NamedValue("3466MHz (Needs ridiculous Speedo/PLL)", 3466000),
NamedValue("3500MHz (Needs ridiculous Speedo/PLL)", 3500000),
};
std::vector<NamedValue> eristaMaxEmcClock = {
NamedValue("1600MHz", 1600000),
NamedValue("1633MHz", 1633000),
NamedValue("1666MHz", 1666000),
NamedValue("1700MHz", 1700000),
NamedValue("1733MHz", 1733000),
NamedValue("1766MHz", 1766000),
NamedValue("1800MHz", 1800000),
NamedValue("1833MHz", 1833000),
NamedValue("1866MHz", 1866000),
NamedValue("1900MHz", 1900000),
NamedValue("1933MHz", 1933000),
NamedValue("1966MHz", 1966000),
NamedValue("2000MHz", 2000000),
NamedValue("2033MHz", 2033000),
NamedValue("2066MHz", 2066000),
NamedValue("2100MHz", 2100000),
NamedValue("2133MHz", 2133000),
NamedValue("2166MHz", 2166000),
NamedValue("2200MHz (high power draw!)", 2200000),
NamedValue("2233MHz (high power draw!)", 2233000),
NamedValue("2266MHz (high power draw!)", 2266000),
NamedValue("2300MHz (high power draw!)", 2300000),
NamedValue("2333MHz (high power draw!)", 2333000),
NamedValue("2366MHz (high power draw!)", 2366000),
NamedValue("2400MHz (high power draw!)", 2400000),
};
if(IsErista()) {
addConfigButton(
KipConfigValue_eristaEmcMaxClock,
"EMC Max Clock",
ValueRange(0, 1, 1, "", 1),
"EMC Max Clock",
&thresholdsDisabled,
{},
eristaMaxEmcClock,
false
);
} else {
addConfigButton(
KipConfigValue_marikoEmcMaxClock,
"EMC Max Clock",
ValueRange(0, 1, 1, "", 1),
"EMC Max Clock",
&thresholdsDisabled,
{},
marikoMaxEmcClock,
false
);
addConfigButton(
KipConfigValue_marikoEmcVddqVolt,
"EMC VDDQ Voltage",
ValueRange(550000, 700000, 5000, "mV", 1000),
"EMC VDDQ Voltage",
&thresholdsDisabled,
{},
{},
false
);
}
addConfigButton(
KipConfigValue_t1_tRCD,
"t1 tRCD",
ValueRange(0, 8, 1, "", 1),
"tRCD",
&thresholdsDisabled,
{},
{},
false
);
addConfigButton(
KipConfigValue_t2_tRP,
"t2 tRP",
ValueRange(0, 8, 1, "", 1),
"tRP",
&thresholdsDisabled,
{},
{},
false
);
addConfigButton(
KipConfigValue_t3_tRAS,
"t3 tRAS",
ValueRange(0, 10, 1, "", 1),
"tRAS",
&thresholdsDisabled,
{},
{},
false
);
addConfigButton(
KipConfigValue_t4_tRRD,
"t4 tRRD",
ValueRange(0, 7, 1, "", 1),
"tRRD",
&thresholdsDisabled,
{},
{},
false
);
addConfigButton(
KipConfigValue_t5_tRFC,
"t5 tRFC",
ValueRange(0, 11, 1, "", 1),
"tRFC",
&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_t8_tREFI,
"t8 tREFI",
ValueRange(0, 6, 1, "", 1),
"tREFI",
&thresholdsDisabled,
{},
{},
false
);
std::vector<NamedValue> rlLabels = {
NamedValue("1600BL", 0),
NamedValue("1866BL", 4),
NamedValue("2133BL", 8)
};
std::vector<NamedValue> wlLabels = {
NamedValue("1600BL", 0),
NamedValue("1866BL", 2),
NamedValue("2133BL", 4)
};
addConfigButton(
KipConfigValue_mem_burst_read_latency,
"Read Latency",
ValueRange(0, 6, 1, "", 0),
"Read Latency",
&thresholdsDisabled,
{},
rlLabels,
false
);
addConfigButton(
KipConfigValue_mem_burst_write_latency,
"Write Latency",
ValueRange(0, 6, 1, "", 0),
"Write Latency",
&thresholdsDisabled,
{},
wlLabels,
false
);
std::vector<NamedValue> marikoTableConf = {
NamedValue("Auto", 0),
NamedValue("Default", 1),
NamedValue("1581MHz Tbreak", 2),
NamedValue("1683MHz Tbreak", 3),
NamedValue("Extreme UV Table", 4)
};
std::vector<NamedValue> gpuUvConf = {
NamedValue("No UV", 0),
NamedValue("SLT Table", 1),
NamedValue("HiOPT Table", 2),
};
ValueThresholds mCpuVoltThresholds(1160, 1180);
ValueThresholds MgpuVmaxThresholds(800, 850);
ValueThresholds EgpuVmaxThresholds(950, 975);
if(IsErista()) {
addConfigButton(
KipConfigValue_eristaCpuUV,
"CPU UV",
ValueRange(0, 5, 1, "", 1),
"CPU UV",
&thresholdsDisabled,
{},
{},
true
);
addConfigButton(
KipConfigValue_eristaCpuMaxVolt,
"CPU Max Voltage",
ValueRange(1120, 1235, 5, "mV", 1),
"CPU Max Voltage",
&thresholdsDisabled,
{},
{},
false
);
addConfigButton(
KipConfigValue_eristaGpuUV,
"GPU Undervolt Table",
ValueRange(0, 1, 1, "", 1),
"GPU Undervolt Table",
&thresholdsDisabled,
{},
gpuUvConf,
false
);
addConfigButton(
KipConfigValue_eristaGpuVmin,
"GPU VMIN",
ValueRange(700, 875, 5, "mV", 1),
"GPU VMIN",
&thresholdsDisabled,
{},
{},
false
);
} else {
addConfigButton(
KipConfigValue_tableConf,
"CPU UV Table",
ValueRange(0, 12, 1, "", 0),
"CPU UV Table",
&thresholdsDisabled,
{},
marikoTableConf,
false
);
addConfigButton(
KipConfigValue_marikoCpuUVLow,
"CPU Low UV",
ValueRange(0, 8, 1, "", 1),
"CPU Low UV",
&thresholdsDisabled,
{},
{},
false
);
addConfigButton(
KipConfigValue_marikoCpuUVHigh,
"CPU High UV",
ValueRange(0, 12, 1, "", 1),
"CPU High UV",
&thresholdsDisabled,
{},
{},
false
);
addConfigButton(
KipConfigValue_marikoCpuMaxVolt,
"CPU Max Voltage",
ValueRange(1000, 1235, 5, "mV", 1),
"CPU Max Voltage",
&mCpuVoltThresholds,
{},
{},
false
);
std::vector<NamedValue> maxClkOptions = {
NamedValue("1963MHz", 1963000),
NamedValue("2397MHz", 2397000),
NamedValue("2499MHz", 2499000),
NamedValue("2601MHz", 2601000),
NamedValue("2703MHz", 2703000),
};
addConfigButton(
KipConfigValue_marikoCpuMaxClock,
"CPU Max Clock",
ValueRange(0, 0, 1, "", 1),
"CPU Max Voltage",
&thresholdsDisabled,
{},
maxClkOptions,
false
);
addConfigButton(
KipConfigValue_marikoGpuUV,
"GPU Undervolt Table",
ValueRange(0, 1, 1, "", 1),
"GPU Undervolt Table",
&thresholdsDisabled,
{},
gpuUvConf,
false
);
addConfigButton(
KipConfigValue_marikoGpuVmin,
"GPU VMIN",
ValueRange(480, 825, 5, "mV", 1),
"GPU VMIN",
&thresholdsDisabled,
{},
{},
false
);
addConfigButton(
KipConfigValue_marikoGpuVmax,
"GPU VMAX",
ValueRange(750, 960, 5, "mV", 1),
"GPU VMAX",
&MgpuVmaxThresholds,
{},
{},
false
);
}
addConfigButton(
KipConfigValue_commonGpuVoltOffset,
"GPU Volt Offset",
ValueRange(0, 50, 5, "mV", 1),
"GPU Volt Offset",
&thresholdsDisabled,
{},
{},
false
);
if(IsMariko())
addConfigToggle(KipConfigValue_marikoGpuFullUnlock, "GPU Full Unlock");
this->listElement->addItem(new tsl::elm::CategoryHeader("GPU Custom Table"));
std::vector<NamedValue> mGpuVolts = {
NamedValue("Disabled", 2000),
NamedValue("Auto", 0),
NamedValue("480mV", 480),
NamedValue("485mV", 485),
NamedValue("490mV", 490),
NamedValue("495mV", 495),
NamedValue("500mV", 500),
NamedValue("505mV", 505),
NamedValue("510mV", 510),
NamedValue("515mV", 515),
NamedValue("520mV", 520),
NamedValue("525mV", 525),
NamedValue("530mV", 530),
NamedValue("535mV", 535),
NamedValue("540mV", 540),
NamedValue("545mV", 545),
NamedValue("550mV", 550),
NamedValue("555mV", 555),
NamedValue("560mV", 560),
NamedValue("565mV", 565),
NamedValue("570mV", 570),
NamedValue("575mV", 575),
NamedValue("580mV", 580),
NamedValue("585mV", 585),
NamedValue("590mV", 590),
NamedValue("595mV", 595),
NamedValue("600mV", 600),
NamedValue("605mV", 605),
NamedValue("610mV", 610),
NamedValue("615mV", 615),
NamedValue("620mV", 620),
NamedValue("625mV", 625),
NamedValue("630mV", 630),
NamedValue("635mV", 635),
NamedValue("640mV", 640),
NamedValue("645mV", 645),
NamedValue("650mV", 650),
NamedValue("655mV", 655),
NamedValue("660mV", 660),
NamedValue("665mV", 665),
NamedValue("670mV", 670),
NamedValue("675mV", 675),
NamedValue("680mV", 680),
NamedValue("685mV", 685),
NamedValue("690mV", 690),
NamedValue("695mV", 695),
NamedValue("700mV", 700),
NamedValue("705mV", 705),
NamedValue("710mV", 710),
NamedValue("715mV", 715),
NamedValue("720mV", 720),
NamedValue("725mV", 725),
NamedValue("730mV", 730),
NamedValue("735mV", 735),
NamedValue("740mV", 740),
NamedValue("745mV", 745),
NamedValue("750mV", 750),
NamedValue("755mV", 755),
NamedValue("760mV", 760),
NamedValue("765mV", 765),
NamedValue("770mV", 770),
NamedValue("775mV", 775),
NamedValue("780mV", 780),
NamedValue("785mV", 785),
NamedValue("790mV", 790),
NamedValue("795mV", 795),
NamedValue("800mV", 800),
NamedValue("805mV", 805),
NamedValue("810mV", 810),
NamedValue("815mV", 815),
NamedValue("820mV", 820),
NamedValue("825mV", 825),
NamedValue("830mV", 830),
NamedValue("835mV", 835),
NamedValue("840mV", 840),
NamedValue("845mV", 845),
NamedValue("850mV", 850),
NamedValue("855mV", 855),
NamedValue("860mV", 860),
NamedValue("865mV", 865),
NamedValue("870mV", 870),
NamedValue("875mV", 875),
NamedValue("880mV", 880),
NamedValue("885mV", 885),
NamedValue("890mV", 890),
NamedValue("895mV", 895),
NamedValue("900mV", 900),
NamedValue("905mV", 905),
NamedValue("910mV", 910),
NamedValue("915mV", 915),
NamedValue("920mV", 920),
NamedValue("925mV", 925),
NamedValue("930mV", 930),
NamedValue("935mV", 935),
NamedValue("940mV", 940),
NamedValue("945mV", 945),
NamedValue("950mV", 950),
NamedValue("955mV", 955),
NamedValue("960mV", 960),
};
std::vector<NamedValue> eGpuVolts = {
NamedValue("Disabled", 2000),
NamedValue("Auto", 0),
NamedValue("700mV", 700),
NamedValue("705mV", 705),
NamedValue("710mV", 710),
NamedValue("715mV", 715),
NamedValue("720mV", 720),
NamedValue("725mV", 725),
NamedValue("730mV", 730),
NamedValue("735mV", 735),
NamedValue("740mV", 740),
NamedValue("745mV", 745),
NamedValue("750mV", 750),
NamedValue("755mV", 755),
NamedValue("760mV", 760),
NamedValue("765mV", 765),
NamedValue("770mV", 770),
NamedValue("775mV", 775),
NamedValue("780mV", 780),
NamedValue("785mV", 785),
NamedValue("790mV", 790),
NamedValue("795mV", 795),
NamedValue("800mV", 800),
NamedValue("805mV", 805),
NamedValue("810mV", 810),
NamedValue("815mV", 815),
NamedValue("820mV", 820),
NamedValue("825mV", 825),
NamedValue("830mV", 830),
NamedValue("835mV", 835),
NamedValue("840mV", 840),
NamedValue("845mV", 845),
NamedValue("850mV", 850),
NamedValue("855mV", 855),
NamedValue("860mV", 860),
NamedValue("865mV", 865),
NamedValue("870mV", 870),
NamedValue("875mV", 875),
NamedValue("880mV", 880),
NamedValue("885mV", 885),
NamedValue("890mV", 890),
NamedValue("895mV", 895),
NamedValue("900mV", 900),
NamedValue("905mV", 905),
NamedValue("910mV", 910),
NamedValue("915mV", 915),
NamedValue("920mV", 920),
NamedValue("925mV", 925),
NamedValue("930mV", 930),
NamedValue("935mV", 935),
NamedValue("940mV", 940),
NamedValue("945mV", 945),
NamedValue("950mV", 950),
NamedValue("955mV", 955),
NamedValue("960mV", 960),
NamedValue("965mV", 965),
NamedValue("970mV", 970),
NamedValue("975mV", 975),
NamedValue("980mV", 980),
NamedValue("985mV", 985),
NamedValue("990mV", 990),
NamedValue("995mV", 995),
};
if (IsMariko()) {
addConfigButton(
KipConfigValue_g_volt_76800,
"GPU Voltage (76.8MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&MgpuVmaxThresholds,
{},
mGpuVolts,
false
);
addConfigButton(
KipConfigValue_g_volt_153600,
"GPU Voltage (153.6MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&MgpuVmaxThresholds,
{},
mGpuVolts,
false
);
addConfigButton(
KipConfigValue_g_volt_230400,
"GPU Voltage (230.4MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&MgpuVmaxThresholds,
{},
mGpuVolts,
false
);
addConfigButton(
KipConfigValue_g_volt_307200,
"GPU Voltage (307.2MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&MgpuVmaxThresholds,
{},
mGpuVolts,
false
);
addConfigButton(
KipConfigValue_g_volt_384000,
"GPU Voltage (384.0MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&MgpuVmaxThresholds,
{},
mGpuVolts,
false
);
addConfigButton(
KipConfigValue_g_volt_460800,
"GPU Voltage (460.8MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&MgpuVmaxThresholds,
{},
mGpuVolts,
false
);
addConfigButton(
KipConfigValue_g_volt_537600,
"GPU Voltage (537.6MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&MgpuVmaxThresholds,
{},
mGpuVolts,
false
);
addConfigButton(
KipConfigValue_g_volt_614400,
"GPU Voltage (614.4MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&MgpuVmaxThresholds,
{},
mGpuVolts,
false
);
addConfigButton(
KipConfigValue_g_volt_691200,
"GPU Voltage (691.2MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&MgpuVmaxThresholds,
{},
mGpuVolts,
false
);
addConfigButton(
KipConfigValue_g_volt_768000,
"GPU Voltage (768.0MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&MgpuVmaxThresholds,
{},
mGpuVolts,
false
);
addConfigButton(
KipConfigValue_g_volt_844800,
"GPU Voltage (844.8MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&MgpuVmaxThresholds,
{},
mGpuVolts,
false
);
addConfigButton(
KipConfigValue_g_volt_921600,
"GPU Voltage (921.6MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&MgpuVmaxThresholds,
{},
mGpuVolts,
false
);
addConfigButton(
KipConfigValue_g_volt_998400,
"GPU Voltage (998.4MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&MgpuVmaxThresholds,
{},
mGpuVolts,
false
);
addConfigButton(
KipConfigValue_g_volt_1075200,
"GPU Voltage (1075.2MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&MgpuVmaxThresholds,
{},
mGpuVolts,
false
);
addConfigButton(
KipConfigValue_g_volt_1152000,
"GPU Voltage (1152.0MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&MgpuVmaxThresholds,
{},
mGpuVolts,
false
);
addConfigButton(
KipConfigValue_g_volt_1228800,
"GPU Voltage (1228.8MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&MgpuVmaxThresholds,
{},
mGpuVolts,
false
);
addConfigButton(
KipConfigValue_g_volt_1267200,
"GPU Voltage (1267.2MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&MgpuVmaxThresholds,
{},
mGpuVolts,
false
);
addConfigButton(
KipConfigValue_g_volt_1305600,
"GPU Voltage (1305.6MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&MgpuVmaxThresholds,
{},
mGpuVolts,
false
);
addConfigButton(
KipConfigValue_g_volt_1344000,
"GPU Voltage (1344.0MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&MgpuVmaxThresholds,
{},
mGpuVolts,
false
);
addConfigButton(
KipConfigValue_g_volt_1382400,
"GPU Voltage (1382.4MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&MgpuVmaxThresholds,
{},
mGpuVolts,
false
);
addConfigButton(
KipConfigValue_g_volt_1420800,
"GPU Voltage (1420.8MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&MgpuVmaxThresholds,
{},
mGpuVolts,
false
);
addConfigButton(
KipConfigValue_g_volt_1459200,
"GPU Voltage (1459.2MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&MgpuVmaxThresholds,
{},
mGpuVolts,
false
);
addConfigButton(
KipConfigValue_g_volt_1497600,
"GPU Voltage (1497.6MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&MgpuVmaxThresholds,
{},
mGpuVolts,
false
);
addConfigButton(
KipConfigValue_g_volt_1536000,
"GPU Voltage (1536.0MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&MgpuVmaxThresholds,
{},
mGpuVolts,
false
);
} else {
addConfigButton(
KipConfigValue_g_volt_e_76800,
"GPU Voltage (76.8MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&EgpuVmaxThresholds,
{},
eGpuVolts,
false
);
addConfigButton(
KipConfigValue_g_volt_e_115200,
"GPU Voltage (115.2MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&EgpuVmaxThresholds,
{},
eGpuVolts,
false
);
addConfigButton(
KipConfigValue_g_volt_e_153600,
"GPU Voltage (153.6MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&EgpuVmaxThresholds,
{},
eGpuVolts,
false
);
addConfigButton(
KipConfigValue_g_volt_e_192000,
"GPU Voltage (192.0MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&EgpuVmaxThresholds,
{},
eGpuVolts,
false
);
addConfigButton(
KipConfigValue_g_volt_e_230400,
"GPU Voltage (230.4MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&EgpuVmaxThresholds,
{},
eGpuVolts,
false
);
addConfigButton(
KipConfigValue_g_volt_e_268800,
"GPU Voltage (268.8MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&EgpuVmaxThresholds,
{},
eGpuVolts,
false
);
addConfigButton(
KipConfigValue_g_volt_e_307200,
"GPU Voltage (307.2MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&EgpuVmaxThresholds,
{},
eGpuVolts,
false
);
addConfigButton(
KipConfigValue_g_volt_e_345600,
"GPU Voltage (345.6MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&EgpuVmaxThresholds,
{},
eGpuVolts,
false
);
addConfigButton(
KipConfigValue_g_volt_e_384000,
"GPU Voltage (384.0MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&EgpuVmaxThresholds,
{},
eGpuVolts,
false
);
addConfigButton(
KipConfigValue_g_volt_e_422400,
"GPU Voltage (422.4MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&EgpuVmaxThresholds,
{},
eGpuVolts,
false
);
addConfigButton(
KipConfigValue_g_volt_e_460800,
"GPU Voltage (460.8MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&EgpuVmaxThresholds,
{},
eGpuVolts,
false
);
addConfigButton(
KipConfigValue_g_volt_e_499200,
"GPU Voltage (499.2MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&EgpuVmaxThresholds,
{},
eGpuVolts,
false
);
addConfigButton(
KipConfigValue_g_volt_e_537600,
"GPU Voltage (537.6MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&EgpuVmaxThresholds,
{},
eGpuVolts,
false
);
addConfigButton(
KipConfigValue_g_volt_e_576000,
"GPU Voltage (576.0MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&EgpuVmaxThresholds,
{},
eGpuVolts,
false
);
addConfigButton(
KipConfigValue_g_volt_e_614400,
"GPU Voltage (614.4MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&EgpuVmaxThresholds,
{},
eGpuVolts,
false
);
addConfigButton(
KipConfigValue_g_volt_e_652800,
"GPU Voltage (652.8MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&EgpuVmaxThresholds,
{},
eGpuVolts,
false
);
addConfigButton(
KipConfigValue_g_volt_e_691200,
"GPU Voltage (691.2MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&EgpuVmaxThresholds,
{},
eGpuVolts,
false
);
addConfigButton(
KipConfigValue_g_volt_e_729600,
"GPU Voltage (729.6MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&EgpuVmaxThresholds,
{},
eGpuVolts,
false
);
addConfigButton(
KipConfigValue_g_volt_e_768000,
"GPU Voltage (768.0MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&EgpuVmaxThresholds,
{},
eGpuVolts,
false
);
addConfigButton(
KipConfigValue_g_volt_e_806400,
"GPU Voltage (806.4MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&EgpuVmaxThresholds,
{},
eGpuVolts,
false
);
addConfigButton(
KipConfigValue_g_volt_e_844800,
"GPU Voltage (844.8MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&EgpuVmaxThresholds,
{},
eGpuVolts,
false
);
addConfigButton(
KipConfigValue_g_volt_e_883200,
"GPU Voltage (883.2MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&EgpuVmaxThresholds,
{},
eGpuVolts,
false
);
addConfigButton(
KipConfigValue_g_volt_e_921600,
"GPU Voltage (921.6MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&EgpuVmaxThresholds,
{},
eGpuVolts,
false
);
addConfigButton(
KipConfigValue_g_volt_e_960000,
"GPU Voltage (960.0MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&EgpuVmaxThresholds,
{},
eGpuVolts,
false
);
addConfigButton(
KipConfigValue_g_volt_e_998400,
"GPU Voltage (998.4MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&EgpuVmaxThresholds,
{},
eGpuVolts,
false
);
addConfigButton(
KipConfigValue_g_volt_e_1036800,
"GPU Voltage (1036.8MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&EgpuVmaxThresholds,
{},
eGpuVolts,
false
);
addConfigButton(
KipConfigValue_g_volt_e_1075200,
"GPU Voltage (1075.2MHz)",
ValueRange(0, 0, 0, "0", 1),
"Voltage",
&EgpuVmaxThresholds,
{},
eGpuVolts,
false
);
}
tsl::elm::ListItem* saveBtn = new tsl::elm::ListItem("Save KIP Settings");
saveBtn->setClickListener([](u64 keys) {
if (keys & HidNpadButton_A) {
Result rc = hocClkIpcSetKipData();
if (R_FAILED(rc)) {
FatalGui::openWithResultCode("hocClkIpcSetKipData", rc);
return false;
}
return true;
}
return false;
});
this->listElement->addItem(saveBtn);
}
static std::string getValueDisplayText(uint64_t currentValue,
const ValueRange& range,
const std::vector<NamedValue>& namedValues)
{
char valueText[32];
for (const auto& namedValue : namedValues) {
if (currentValue == namedValue.value) {
return namedValue.name;
}
}
if (currentValue == 0) {
snprintf(valueText, sizeof(valueText), "%s", VALUE_DEFAULT_TEXT);
} else {
uint64_t displayValue = currentValue / range.divisor;
if (!range.suffix.empty()) {
snprintf(valueText, sizeof(valueText), "%lu %s", displayValue, range.suffix.c_str());
} else {
snprintf(valueText, sizeof(valueText), "%lu", displayValue);
}
}
return std::string(valueText);
}
void MiscGui::refresh() {
BaseMenuGui::refresh();
if (this->context && ++frameCounter >= 60) {
frameCounter = 0;
sysclkIpcGetConfigValues(this->configList);
updateConfigToggles();
for (const auto& [configVal, button] : this->configButtons) {
uint64_t currentValue = this->configList->values[configVal];
const ValueRange& range = this->configRanges[configVal];
auto namedValuesIt = this->configNamedValues.find(configVal);
const std::vector<NamedValue>& namedValues = (namedValuesIt != this->configNamedValues.end())
? namedValuesIt->second
: std::vector<NamedValue>();
char valueText[32];
bool foundNamedValue = false;
for (const auto& namedValue : namedValues) {
if (currentValue == namedValue.value) {
snprintf(valueText, sizeof(valueText), "%s", namedValue.name.c_str());
foundNamedValue = true;
break;
}
}
if (!foundNamedValue) {
uint64_t displayValue = currentValue / range.divisor;
if (!range.suffix.empty()) {
snprintf(valueText, sizeof(valueText), "%lu %s", displayValue, range.suffix.c_str());
} else {
snprintf(valueText, sizeof(valueText), "%lu", displayValue);
}
}
button->setValue(valueText);
}
}
}