Compare commits
16 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6e80c9a75f | ||
|
|
42bdfb55f2 | ||
|
|
e0967a9fd6 | ||
|
|
2406ce4f86 | ||
|
|
3b40a4a3e5 | ||
|
|
38c408dde6 | ||
|
|
5e62eb3f5d | ||
|
|
b4b5599ed2 | ||
|
|
b4917f3e1a | ||
|
|
e6b4cb6612 | ||
|
|
b1ca62ce61 | ||
|
|
243f614887 | ||
|
|
a8577378f6 | ||
|
|
564703b7c5 | ||
|
|
5ef56bed25 | ||
|
|
afddb963a9 |
@@ -463,7 +463,7 @@ volatile CustomizeTable C = {
|
|||||||
{ 921600, { }, { 970060,-10108, -614,-179, 1508, -13 } },
|
{ 921600, { }, { 970060,-10108, -614,-179, 1508, -13 } },
|
||||||
{ 998400, { }, { 1065665,-16075, -497,-179, 3213, 9 } },
|
{ 998400, { }, { 1065665,-16075, -497,-179, 3213, 9 } },
|
||||||
{ 1075200, { }, { 1132576,-16093, -648, 0, 1077, 40 } },
|
{ 1075200, { }, { 1132576,-16093, -648, 0, 1077, 40 } },
|
||||||
{ 1152000, { }, { 1180029,-14534, -830, 0, 1469, 110 } },
|
// { 1152000, { }, { 1180029,-14534, -830, 0, 1469, 110 } },
|
||||||
// { 1228800, { }, { 1248293,-16383, -859, 0, 3722, 313 } },
|
// { 1228800, { }, { 1248293,-16383, -859, 0, 3722, 313 } },
|
||||||
// { 1267200, { }, { 1286399,-17475, -867, 0, 3681, 559 } },
|
// { 1267200, { }, { 1286399,-17475, -867, 0, 3681, 559 } },
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -169,15 +169,4 @@ Result hocClkIpcGetKipData()
|
|||||||
{
|
{
|
||||||
u32 temp = 0;
|
u32 temp = 0;
|
||||||
return serviceDispatchIn(&g_sysclkSrv, HocClkIpcCmd_GetKipData, temp);
|
return serviceDispatchIn(&g_sysclkSrv, HocClkIpcCmd_GetKipData, temp);
|
||||||
}
|
|
||||||
|
|
||||||
Result hocClkIpcUpdateEmcRegs()
|
|
||||||
{
|
|
||||||
u32 temp = 0;
|
|
||||||
return serviceDispatchIn(&g_sysclkSrv, HocClkIpcCmd_UpdateEmcRegs, temp);
|
|
||||||
}
|
|
||||||
Result hocClkIpcCalculateGpuVmin()
|
|
||||||
{
|
|
||||||
u32 temp = 0;
|
|
||||||
return serviceDispatchIn(&g_sysclkSrv, HocClkIpcCmd_CalculateGpuVmin, temp);
|
|
||||||
}
|
}
|
||||||
@@ -51,8 +51,6 @@ typedef enum {
|
|||||||
|
|
||||||
HocClkConfigValue_LiteTDPLimit,
|
HocClkConfigValue_LiteTDPLimit,
|
||||||
|
|
||||||
HocClkConfigValue_EnforceBoardLimit,
|
|
||||||
|
|
||||||
HorizonOCConfigValue_BatteryChargeCurrent,
|
HorizonOCConfigValue_BatteryChargeCurrent,
|
||||||
|
|
||||||
HorizonOCConfigValue_OverwriteRefreshRate,
|
HorizonOCConfigValue_OverwriteRefreshRate,
|
||||||
@@ -61,8 +59,6 @@ typedef enum {
|
|||||||
HorizonOCConfigValue_DVFSMode,
|
HorizonOCConfigValue_DVFSMode,
|
||||||
HorizonOCConfigValue_DVFSOffset,
|
HorizonOCConfigValue_DVFSOffset,
|
||||||
|
|
||||||
HocClkConfigValue_FixCpuVoltBug,
|
|
||||||
|
|
||||||
KipConfigValue_custRev,
|
KipConfigValue_custRev,
|
||||||
// KipConfigValue_mtcConf,
|
// KipConfigValue_mtcConf,
|
||||||
KipConfigValue_hpMode,
|
KipConfigValue_hpMode,
|
||||||
@@ -215,18 +211,12 @@ static inline const char* sysclkFormatConfigValue(SysClkConfigValue val, bool pr
|
|||||||
case HocClkConfigValue_LiteTDPLimit:
|
case HocClkConfigValue_LiteTDPLimit:
|
||||||
return pretty ? "Handheld TDP Limit" : "tdp_limit_l";
|
return pretty ? "Handheld TDP Limit" : "tdp_limit_l";
|
||||||
|
|
||||||
case HocClkConfigValue_EnforceBoardLimit:
|
|
||||||
return pretty ? "Enforce Board Limit" : "enforce_board_limit";
|
|
||||||
|
|
||||||
case HorizonOCConfigValue_BatteryChargeCurrent:
|
case HorizonOCConfigValue_BatteryChargeCurrent:
|
||||||
return pretty ? "Battery Charge Current" : "bat_charge_current";
|
return pretty ? "Battery Charge Current" : "bat_charge_current";
|
||||||
|
|
||||||
case HorizonOCConfigValue_OverwriteRefreshRate:
|
case HorizonOCConfigValue_OverwriteRefreshRate:
|
||||||
return pretty ? "Display Refresh Rate Changing" : "drr_changing";
|
return pretty ? "Display Refresh Rate Changing" : "drr_changing";
|
||||||
|
|
||||||
case HocClkConfigValue_FixCpuVoltBug:
|
|
||||||
return pretty ? "Fix CPU Volt Bug" : "cpu_volt_bugfix";
|
|
||||||
|
|
||||||
case HorizonOCConfigValue_EnableUnsafeDisplayFreqs:
|
case HorizonOCConfigValue_EnableUnsafeDisplayFreqs:
|
||||||
return pretty ? "Enable Unsafe Display Frequencies" : "drr_unsafe";
|
return pretty ? "Enable Unsafe Display Frequencies" : "drr_unsafe";
|
||||||
|
|
||||||
@@ -418,8 +408,6 @@ static inline uint64_t sysclkDefaultConfigValue(SysClkConfigValue val)
|
|||||||
|
|
||||||
case HocClkConfigValue_ThermalThrottle:
|
case HocClkConfigValue_ThermalThrottle:
|
||||||
case HocClkConfigValue_HandheldTDP:
|
case HocClkConfigValue_HandheldTDP:
|
||||||
case HocClkConfigValue_EnforceBoardLimit:
|
|
||||||
case HocClkConfigValue_FixCpuVoltBug:
|
|
||||||
case HocClkConfigValue_IsFirstLoad:
|
case HocClkConfigValue_IsFirstLoad:
|
||||||
case HorizonOCConfigValue_DVFSMode:
|
case HorizonOCConfigValue_DVFSMode:
|
||||||
return 1ULL;
|
return 1ULL;
|
||||||
@@ -454,9 +442,7 @@ static inline uint64_t sysclkValidConfigValue(SysClkConfigValue val, uint64_t in
|
|||||||
case HocClkConfigValue_OverwriteBoostMode:
|
case HocClkConfigValue_OverwriteBoostMode:
|
||||||
case HocClkConfigValue_ThermalThrottle:
|
case HocClkConfigValue_ThermalThrottle:
|
||||||
case HocClkConfigValue_HandheldTDP:
|
case HocClkConfigValue_HandheldTDP:
|
||||||
case HocClkConfigValue_EnforceBoardLimit:
|
|
||||||
case HorizonOCConfigValue_OverwriteRefreshRate:
|
case HorizonOCConfigValue_OverwriteRefreshRate:
|
||||||
case HocClkConfigValue_FixCpuVoltBug:
|
|
||||||
case HorizonOCConfigValue_EnableUnsafeDisplayFreqs:
|
case HorizonOCConfigValue_EnableUnsafeDisplayFreqs:
|
||||||
case HocClkConfigValue_IsFirstLoad:
|
case HocClkConfigValue_IsFirstLoad:
|
||||||
return (input & 0x1) == input;
|
return (input & 0x1) == input;
|
||||||
|
|||||||
@@ -51,8 +51,6 @@ enum SysClkIpcCmd
|
|||||||
SysClkIpcCmd_SetReverseNXRTMode = 12,
|
SysClkIpcCmd_SetReverseNXRTMode = 12,
|
||||||
HocClkIpcCmd_SetKipData = 13,
|
HocClkIpcCmd_SetKipData = 13,
|
||||||
HocClkIpcCmd_GetKipData = 14,
|
HocClkIpcCmd_GetKipData = 14,
|
||||||
HocClkIpcCmd_UpdateEmcRegs = 15,
|
|
||||||
HocClkIpcCmd_CalculateGpuVmin = 16,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -169,15 +169,4 @@ Result hocClkIpcGetKipData()
|
|||||||
{
|
{
|
||||||
u32 temp = 0;
|
u32 temp = 0;
|
||||||
return serviceDispatchIn(&g_sysclkSrv, HocClkIpcCmd_GetKipData, temp);
|
return serviceDispatchIn(&g_sysclkSrv, HocClkIpcCmd_GetKipData, temp);
|
||||||
}
|
|
||||||
|
|
||||||
Result hocClkIpcUpdateEmcRegs()
|
|
||||||
{
|
|
||||||
u32 temp = 0;
|
|
||||||
return serviceDispatchIn(&g_sysclkSrv, HocClkIpcCmd_UpdateEmcRegs, temp);
|
|
||||||
}
|
|
||||||
Result hocClkIpcCalculateGpuVmin()
|
|
||||||
{
|
|
||||||
u32 temp = 0;
|
|
||||||
return serviceDispatchIn(&g_sysclkSrv, HocClkIpcCmd_CalculateGpuVmin, temp);
|
|
||||||
}
|
}
|
||||||
@@ -39,7 +39,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.37
|
APP_VERSION := 0.38
|
||||||
TARGET_VERSION := $(APP_VERSION)
|
TARGET_VERSION := $(APP_VERSION)
|
||||||
|
|
||||||
#---------------------------------------------------------------------------------
|
#---------------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -281,7 +281,7 @@ void AppProfileGui::addProfileUI(SysClkProfile profile)
|
|||||||
FatalGui::openWithResultCode("sysclkIpcGetConfigValues", rc);
|
FatalGui::openWithResultCode("sysclkIpcGetConfigValues", rc);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this->listElement->addItem(new tsl::elm::CategoryHeader(sysclkFormatProfile(profile, true) + std::string(" ") + ult::DIVIDER_SYMBOL + " Reset"));
|
this->listElement->addItem(new tsl::elm::CategoryHeader(sysclkFormatProfile(profile, true) + std::string(" ") + ult::DIVIDER_SYMBOL + " \ue0e3 Reset"));
|
||||||
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);
|
||||||
|
|||||||
@@ -285,7 +285,7 @@ void GlobalOverrideGui::listUI()
|
|||||||
}
|
}
|
||||||
|
|
||||||
this->listElement->addItem(new tsl::elm::CategoryHeader(
|
this->listElement->addItem(new tsl::elm::CategoryHeader(
|
||||||
"Temporary Overrides " + ult::DIVIDER_SYMBOL + " Reset"));
|
"Temporary Overrides " + ult::DIVIDER_SYMBOL + " \ue0e3 Reset"));
|
||||||
this->addModuleListItem(SysClkModule_CPU);
|
this->addModuleListItem(SysClkModule_CPU);
|
||||||
this->addModuleListItem(SysClkModule_GPU);
|
this->addModuleListItem(SysClkModule_GPU);
|
||||||
this->addModuleListItem(SysClkModule_MEM);
|
this->addModuleListItem(SysClkModule_MEM);
|
||||||
|
|||||||
@@ -248,12 +248,9 @@ void MiscGui::listUI()
|
|||||||
|
|
||||||
addConfigToggle(HocClkConfigValue_UncappedClocks, nullptr);
|
addConfigToggle(HocClkConfigValue_UncappedClocks, nullptr);
|
||||||
addConfigToggle(HocClkConfigValue_OverwriteBoostMode, nullptr);
|
addConfigToggle(HocClkConfigValue_OverwriteBoostMode, nullptr);
|
||||||
#if IS_MINIMAL == 0
|
|
||||||
addConfigToggle(HocClkConfigValue_FixCpuVoltBug, nullptr);
|
|
||||||
#endif
|
|
||||||
addConfigToggle(HocClkConfigValue_ThermalThrottle, nullptr);
|
addConfigToggle(HocClkConfigValue_ThermalThrottle, nullptr);
|
||||||
addConfigToggle(HocClkConfigValue_HandheldTDP, nullptr);
|
addConfigToggle(HocClkConfigValue_HandheldTDP, nullptr);
|
||||||
addConfigToggle(HocClkConfigValue_EnforceBoardLimit, nullptr);
|
// addConfigToggle(HocClkConfigValue_EnforceBoardLimit, nullptr);
|
||||||
|
|
||||||
#if IS_MINIMAL == 0
|
#if IS_MINIMAL == 0
|
||||||
std::map<uint32_t, std::string> labels_pwr_l = {
|
std::map<uint32_t, std::string> labels_pwr_l = {
|
||||||
@@ -318,19 +315,19 @@ void MiscGui::listUI()
|
|||||||
);
|
);
|
||||||
|
|
||||||
std::vector<NamedValue> dvfsOffset = {
|
std::vector<NamedValue> dvfsOffset = {
|
||||||
NamedValue("-50", 0xFFFFFFCE),
|
NamedValue("-50 mV", 0xFFFFFFCE),
|
||||||
NamedValue("-45", 0xFFFFFFD3),
|
NamedValue("-45 mV", 0xFFFFFFD3),
|
||||||
NamedValue("-40", 0xFFFFFFD8),
|
NamedValue("-40 mV", 0xFFFFFFD8),
|
||||||
NamedValue("-30", 0xFFFFFFE2),
|
NamedValue("-30 mV", 0xFFFFFFE2),
|
||||||
NamedValue("-25", 0xFFFFFFE7),
|
NamedValue("-25 mV", 0xFFFFFFE7),
|
||||||
NamedValue("-20", 0xFFFFFFEC),
|
NamedValue("-20 mV", 0xFFFFFFEC),
|
||||||
NamedValue("-10", 0xFFFFFFF6),
|
NamedValue("-10 mV", 0xFFFFFFF6),
|
||||||
NamedValue(" -5", 0xFFFFFFFB),
|
NamedValue(" -5 mV", 0xFFFFFFFB),
|
||||||
NamedValue(" 0", 0),
|
NamedValue("Disabled", 0),
|
||||||
NamedValue(" +5", 5),
|
NamedValue(" +5 mV", 5),
|
||||||
NamedValue("+10", 10),
|
NamedValue("+10 mV", 10),
|
||||||
NamedValue("+15", 15),
|
NamedValue("+15 mV", 15),
|
||||||
NamedValue("+20", 20),
|
NamedValue("+20 mV", 20),
|
||||||
};
|
};
|
||||||
|
|
||||||
addConfigButton(HorizonOCConfigValue_DVFSOffset, "GPU DVFS Offset", ValueRange(0, 12, 1, "", 0), "GPU DVFS Offset", &thresholdsDisabled, {}, dvfsOffset, false);
|
addConfigButton(HorizonOCConfigValue_DVFSOffset, "GPU DVFS Offset", ValueRange(0, 12, 1, "", 0), "GPU DVFS Offset", &thresholdsDisabled, {}, dvfsOffset, false);
|
||||||
@@ -383,47 +380,47 @@ void MiscGui::listUI()
|
|||||||
});
|
});
|
||||||
this->listElement->addItem(gpuSubmenu);
|
this->listElement->addItem(gpuSubmenu);
|
||||||
|
|
||||||
this->listElement->addItem(new tsl::elm::CategoryHeader("Experimental"));
|
|
||||||
|
|
||||||
#if IS_MINIMAL == 0
|
#if IS_MINIMAL == 0
|
||||||
std::vector<NamedValue> chargerCurrents = {
|
// std::vector<NamedValue> chargerCurrents = {
|
||||||
NamedValue("Disabled", 0),
|
// NamedValue("Disabled", 0),
|
||||||
NamedValue("1024mA", 1024),
|
// NamedValue("1024mA", 1024),
|
||||||
NamedValue("1280mA", 1280),
|
// NamedValue("1280mA", 1280),
|
||||||
NamedValue("1536mA", 1536),
|
// NamedValue("1536mA", 1536),
|
||||||
NamedValue("1792mA", 1792),
|
// NamedValue("1792mA", 1792),
|
||||||
NamedValue("2048mA", 2048),
|
// NamedValue("2048mA", 2048),
|
||||||
NamedValue("2304mA", 2304),
|
// NamedValue("2304mA", 2304),
|
||||||
NamedValue("2560mA", 2560),
|
// NamedValue("2560mA", 2560),
|
||||||
NamedValue("2816mA", 2816),
|
// NamedValue("2816mA", 2816),
|
||||||
NamedValue("3072mA", 3072),
|
// NamedValue("3072mA", 3072),
|
||||||
};
|
// };
|
||||||
if(!IsHoag()) {
|
if(!IsHoag()) {
|
||||||
std::vector<NamedValue> chargerCurrents = {
|
this->listElement->addItem(new tsl::elm::CategoryHeader("Experimental"));
|
||||||
NamedValue("Disabled", 0),
|
// std::vector<NamedValue> chargerCurrents = {
|
||||||
NamedValue("1024mA", 1024),
|
// NamedValue("Disabled", 0),
|
||||||
NamedValue("1280mA", 1280),
|
// NamedValue("1024mA", 1024),
|
||||||
NamedValue("1536mA", 1536),
|
// NamedValue("1280mA", 1280),
|
||||||
NamedValue("1792mA", 1792),
|
// NamedValue("1536mA", 1536),
|
||||||
NamedValue("2048mA", 2048),
|
// NamedValue("1792mA", 1792),
|
||||||
NamedValue("2304mA", 2304),
|
// NamedValue("2048mA", 2048),
|
||||||
NamedValue("2560mA", 2560),
|
// NamedValue("2304mA", 2304),
|
||||||
NamedValue("2816mA", 2816),
|
// NamedValue("2560mA", 2560),
|
||||||
NamedValue("3072mA", 3072),
|
// NamedValue("2816mA", 2816),
|
||||||
};
|
// NamedValue("3072mA", 3072),
|
||||||
|
// };
|
||||||
|
|
||||||
ValueThresholds chargerThresholds(2048, 2560);
|
// ValueThresholds chargerThresholds(2048, 2560);
|
||||||
|
|
||||||
addConfigButton(
|
// addConfigButton(
|
||||||
HorizonOCConfigValue_BatteryChargeCurrent,
|
// HorizonOCConfigValue_BatteryChargeCurrent,
|
||||||
"Charge Current Override",
|
// "Charge Current Override",
|
||||||
ValueRange(0, 0, 1, "", 0),
|
// ValueRange(0, 0, 1, "", 0),
|
||||||
"Charge Current Override",
|
// "Charge Current Override",
|
||||||
&chargerThresholds,
|
// &chargerThresholds,
|
||||||
{},
|
// {},
|
||||||
chargerCurrents,
|
// chargerCurrents,
|
||||||
false
|
// false
|
||||||
);
|
// );
|
||||||
addConfigToggle(HorizonOCConfigValue_OverwriteRefreshRate, nullptr);
|
addConfigToggle(HorizonOCConfigValue_OverwriteRefreshRate, nullptr);
|
||||||
tsl::elm::CustomDrawer* warningText = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *renderer, s32 x, s32 y, s32 w, s32 h) {
|
tsl::elm::CustomDrawer* warningText = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *renderer, s32 x, s32 y, s32 w, s32 h) {
|
||||||
renderer->drawString("\uE150 Enabling unsafe display", false, x + 20, y + 30, 18, tsl::style::color::ColorText);
|
renderer->drawString("\uE150 Enabling unsafe display", false, x + 20, y + 30, 18, tsl::style::color::ColorText);
|
||||||
@@ -434,32 +431,33 @@ void MiscGui::listUI()
|
|||||||
warningText->setBoundaries(0, 0, tsl::cfg::FramebufferWidth, 110);
|
warningText->setBoundaries(0, 0, tsl::cfg::FramebufferWidth, 110);
|
||||||
this->listElement->addItem(warningText);
|
this->listElement->addItem(warningText);
|
||||||
addConfigToggle(HorizonOCConfigValue_EnableUnsafeDisplayFreqs, nullptr);
|
addConfigToggle(HorizonOCConfigValue_EnableUnsafeDisplayFreqs, nullptr);
|
||||||
} else {
|
|
||||||
std::vector<NamedValue> chargerCurrents = {
|
|
||||||
NamedValue("Disabled", 0),
|
|
||||||
NamedValue("1024mA", 1024),
|
|
||||||
NamedValue("1280mA", 1280),
|
|
||||||
NamedValue("1536mA", 1536),
|
|
||||||
NamedValue("1792mA", 1792),
|
|
||||||
NamedValue("2048mA", 2048),
|
|
||||||
NamedValue("2304mA", 2304),
|
|
||||||
NamedValue("2560mA", 2560),
|
|
||||||
};
|
|
||||||
|
|
||||||
ValueThresholds chargerThresholds(1792, 2048);
|
|
||||||
|
|
||||||
addConfigButton(
|
|
||||||
HorizonOCConfigValue_BatteryChargeCurrent,
|
|
||||||
"Charge Current Override",
|
|
||||||
ValueRange(0, 0, 1, "", 0),
|
|
||||||
"Charge Current Override",
|
|
||||||
&chargerThresholds,
|
|
||||||
{},
|
|
||||||
chargerCurrents,
|
|
||||||
false
|
|
||||||
);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
// else {
|
||||||
|
// std::vector<NamedValue> chargerCurrents = {
|
||||||
|
// NamedValue("Disabled", 0),
|
||||||
|
// NamedValue("1024mA", 1024),
|
||||||
|
// NamedValue("1280mA", 1280),
|
||||||
|
// NamedValue("1536mA", 1536),
|
||||||
|
// NamedValue("1792mA", 1792),
|
||||||
|
// NamedValue("2048mA", 2048),
|
||||||
|
// NamedValue("2304mA", 2304),
|
||||||
|
// NamedValue("2560mA", 2560),
|
||||||
|
// };
|
||||||
|
|
||||||
|
// ValueThresholds chargerThresholds(1792, 2048);
|
||||||
|
|
||||||
|
// addConfigButton(
|
||||||
|
// HorizonOCConfigValue_BatteryChargeCurrent,
|
||||||
|
// "Charge Current Override",
|
||||||
|
// ValueRange(0, 0, 1, "", 0),
|
||||||
|
// "Charge Current Override",
|
||||||
|
// &chargerThresholds,
|
||||||
|
// {},
|
||||||
|
// chargerCurrents,
|
||||||
|
// false
|
||||||
|
// );
|
||||||
|
|
||||||
|
// }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -631,7 +629,7 @@ protected:
|
|||||||
addConfigButton(
|
addConfigButton(
|
||||||
KipConfigValue_marikoEmcVddqVolt,
|
KipConfigValue_marikoEmcVddqVolt,
|
||||||
"RAM VDDQ Voltage",
|
"RAM VDDQ Voltage",
|
||||||
ValueRange(550000, 700000, 5000, "mV", 1000),
|
ValueRange(400000, 700000, 5000, "mV", 1000),
|
||||||
"RAM VDDQ Voltage",
|
"RAM VDDQ Voltage",
|
||||||
&thresholdsDisabled,
|
&thresholdsDisabled,
|
||||||
{},
|
{},
|
||||||
@@ -713,37 +711,6 @@ protected:
|
|||||||
this->listElement->addItem(new tsl::elm::CategoryHeader("Advanced"));
|
this->listElement->addItem(new tsl::elm::CategoryHeader("Advanced"));
|
||||||
addConfigButton(KipConfigValue_t6_tRTW_fine_tune, "t6 tRTW Fine Tune", ValueRange(0, 4, 1, "", 0), "tRTW Fine Tune", &thresholdsDisabled, {}, t6_tRTW_fine_tune, false);
|
addConfigButton(KipConfigValue_t6_tRTW_fine_tune, "t6 tRTW Fine Tune", ValueRange(0, 4, 1, "", 0), "tRTW Fine Tune", &thresholdsDisabled, {}, t6_tRTW_fine_tune, false);
|
||||||
addConfigButton(KipConfigValue_t7_tWTR_fine_tune, "t7 tWTR Fine Tune", ValueRange(0, 6, 1, "", 0), "tWTR Fine Tune", &thresholdsDisabled, {}, t7_tWTR_fine_tune, false);
|
addConfigButton(KipConfigValue_t7_tWTR_fine_tune, "t7 tWTR Fine Tune", ValueRange(0, 6, 1, "", 0), "tWTR Fine Tune", &thresholdsDisabled, {}, t7_tWTR_fine_tune, false);
|
||||||
|
|
||||||
#if IS_MINIMAL == 0
|
|
||||||
if(IsMariko()) {
|
|
||||||
this->listElement->addItem(new tsl::elm::CategoryHeader("Experimental"));
|
|
||||||
|
|
||||||
tsl::elm::ListItem* emcUpdBtn = new tsl::elm::ListItem("Update RAM Timings");
|
|
||||||
emcUpdBtn->setClickListener([this](u64 keys) {
|
|
||||||
if (keys & HidNpadButton_A) {
|
|
||||||
if(this->context->freqs[SysClkModule_MEM] > 1600000000) {
|
|
||||||
Result rc = hocClkIpcUpdateEmcRegs();
|
|
||||||
if (R_FAILED(rc)) {
|
|
||||||
FatalGui::openWithResultCode("hocClkIpcUpdateEmcRegs", rc);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
writeNotification("Horizon OC\nSet your ram frequency to max\nbefore applying timings!");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
|
|
||||||
this->listElement->addItem(emcUpdBtn);
|
|
||||||
tsl::elm::CustomDrawer* warningText = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *renderer, s32 x, s32 y, s32 w, s32 h) {
|
|
||||||
renderer->drawString("\uE150 This feature is EXPERIMENTAL", false, x + 20, y + 30, 18, tsl::style::color::ColorText);
|
|
||||||
renderer->drawString("and should only be used for testing!", false, x + 20, y + 50, 18, tsl::style::color::ColorText);
|
|
||||||
});
|
|
||||||
warningText->setBoundaries(0, 0, tsl::cfg::FramebufferWidth, 70);
|
|
||||||
this->listElement->addItem(warningText);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ DEFINES := -DDISABLE_IPC -DTARGET="\"$(TARGET)\"" -DTARGET_VERSION="\"$(TARGET_V
|
|||||||
|
|
||||||
ARCH := -march=armv8-a+crc+crypto -mtune=cortex-a57 -mtp=soft -fPIE
|
ARCH := -march=armv8-a+crc+crypto -mtune=cortex-a57 -mtp=soft -fPIE
|
||||||
|
|
||||||
CFLAGS := -g -Wall -O2 -ffunction-sections \
|
CFLAGS := -g -Wall -Os -ffunction-sections \
|
||||||
$(ARCH) $(DEFINES)
|
$(ARCH) $(DEFINES)
|
||||||
|
|
||||||
CFLAGS += $(INCLUDE) -D__SWITCH__
|
CFLAGS += $(INCLUDE) -D__SWITCH__
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2020-2023 CTCaer
|
* Copyright (c) 2020-2023 CTCaer
|
||||||
* Copyright (c) 2023 p-sam
|
* Copyright (c) 2023 p-sam
|
||||||
|
* Copyright (c) 2026 Souldbminer
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
@@ -47,7 +48,7 @@
|
|||||||
|
|
||||||
#define PTO_CLK_CNT_BUSY BIT(31)
|
#define PTO_CLK_CNT_BUSY BIT(31)
|
||||||
#define PTO_CLK_CNT 0xFFFFFF
|
#define PTO_CLK_CNT 0xFFFFFF
|
||||||
#define CLK_PTO_CCLK_G 0x12
|
#define CLK_PTO_CCLK_G_DIV2 0x13
|
||||||
#define CLK_PTO_EMC 0x24
|
#define CLK_PTO_EMC 0x24
|
||||||
|
|
||||||
#define CLOCK(x) (*(volatile u32 *)(g_clk_base + (x)))
|
#define CLOCK(x) (*(volatile u32 *)(g_clk_base + (x)))
|
||||||
@@ -117,7 +118,7 @@ static u32 g_mem_freq = 0;
|
|||||||
static u32 g_emc_lall = 0;
|
static u32 g_emc_lall = 0;
|
||||||
static u32 g_emc_lcpu = 0;
|
static u32 g_emc_lcpu = 0;
|
||||||
|
|
||||||
static u32 _clock_get_dev_freq(u32 id)
|
static u32 _clock_get_dev_freq(u32 id, u32 multiplier)
|
||||||
{
|
{
|
||||||
const u32 pto_win = 16;
|
const u32 pto_win = 16;
|
||||||
const u32 pto_osc = 32768;
|
const u32 pto_osc = 32768;
|
||||||
@@ -148,7 +149,7 @@ static u32 _clock_get_dev_freq(u32 id)
|
|||||||
(void)CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_CNTL);
|
(void)CLOCK(CLK_RST_CONTROLLER_PTO_CLK_CNT_CNTL);
|
||||||
usleep(2);
|
usleep(2);
|
||||||
|
|
||||||
u32 freq_khz = (u64)cnt * pto_osc / pto_win / 1000;
|
u32 freq_khz = (u64)cnt * multiplier * pto_osc / pto_win;
|
||||||
|
|
||||||
return freq_khz;
|
return freq_khz;
|
||||||
}
|
}
|
||||||
@@ -203,8 +204,8 @@ static void _clock_update_freqs(void)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
g_mem_freq = _clock_get_dev_freq(CLK_PTO_EMC) * 1000;
|
g_mem_freq = _clock_get_dev_freq(CLK_PTO_EMC, 1);
|
||||||
g_cpu_freq = _clock_get_dev_freq(CLK_PTO_CCLK_G) * 1000;
|
g_cpu_freq = _clock_get_dev_freq(CLK_PTO_CCLK_G_DIV2, 2);
|
||||||
|
|
||||||
if (!g_gpu_base)
|
if (!g_gpu_base)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -451,13 +451,22 @@ void Board::SetHz(SysClkModule module, std::uint32_t hz)
|
|||||||
ASSERT_RESULT_OK(rc, "clkrstOpenSession");
|
ASSERT_RESULT_OK(rc, "clkrstOpenSession");
|
||||||
rc = clkrstSetClockRate(&session, hz);
|
rc = clkrstSetClockRate(&session, hz);
|
||||||
ASSERT_RESULT_OK(rc, "clkrstSetClockRate");
|
ASSERT_RESULT_OK(rc, "clkrstSetClockRate");
|
||||||
|
if (module == SysClkModule_CPU) {
|
||||||
|
svcSleepThread(300'000);
|
||||||
|
rc = clkrstSetClockRate(&session, hz);
|
||||||
|
ASSERT_RESULT_OK(rc, "clkrstSetClockRate");
|
||||||
|
}
|
||||||
clkrstCloseSession(&session);
|
clkrstCloseSession(&session);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
rc = pcvSetClockRate(Board::GetPcvModule(module), hz);
|
rc = pcvSetClockRate(Board::GetPcvModule(module), hz);
|
||||||
ASSERT_RESULT_OK(rc, "pcvSetClockRate");
|
ASSERT_RESULT_OK(rc, "pcvSetClockRate");
|
||||||
|
if (module == SysClkModule_CPU) {
|
||||||
|
svcSleepThread(300'000);
|
||||||
|
rc = pcvSetClockRate(Board::GetPcvModule(module), hz);
|
||||||
|
ASSERT_RESULT_OK(rc, "pcvSetClockRate");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1111,162 +1120,6 @@ void Board::PcvHijackDvfs(u32 vmin) {
|
|||||||
#define MC_REGISTER_BASE 0x70019000
|
#define MC_REGISTER_BASE 0x70019000
|
||||||
#define MC_REGISTER_REGION_SIZE 0x1000
|
#define MC_REGISTER_REGION_SIZE 0x1000
|
||||||
|
|
||||||
#define EMC_REGISTER_BASE 0x7001b000
|
|
||||||
#define EMC_REGISTER_REGION_SIZE 0x1000
|
|
||||||
|
|
||||||
#define GET_CYCLE_CEIL(PARAM) u32(CEIL(double(PARAM) / tCK_avg))
|
|
||||||
|
|
||||||
#define WRITE_REGISTER_EMC(TIMING_OFFSET, VALUE) \
|
|
||||||
do { \
|
|
||||||
args = {}; \
|
|
||||||
args.X[0] = 0xF0000002; \
|
|
||||||
args.X[1] = EMC_REGISTER_BASE + (TIMING_OFFSET); \
|
|
||||||
args.X[2] = 0xFFFFFFFF; \
|
|
||||||
args.X[3] = (VALUE); \
|
|
||||||
svcCallSecureMonitor(&args); \
|
|
||||||
} while (false)
|
|
||||||
|
|
||||||
#define WRITE_REGISTER_MC(TIMING_OFFSET, VALUE) \
|
|
||||||
do { \
|
|
||||||
args = {}; \
|
|
||||||
args.X[0] = 0xF0000002; \
|
|
||||||
args.X[1] = MC_REGISTER_BASE + (TIMING_OFFSET); \
|
|
||||||
args.X[2] = 0xFFFFFFFF; \
|
|
||||||
args.X[3] = (VALUE); \
|
|
||||||
svcCallSecureMonitor(&args); \
|
|
||||||
} while (false)
|
|
||||||
|
|
||||||
|
|
||||||
// NOTE: needs patch to exosphere to expose emc region to secmon. MC does NOT need this patch
|
|
||||||
|
|
||||||
u32 tRCD_values[] = { 18, 17, 16, 15, 14, 13, 12, 11 };
|
|
||||||
u32 tRP_values[] = { 18, 17, 16, 15, 14, 13, 12, 11 };
|
|
||||||
u32 tRAS_values[] = { 42, 36, 34, 32, 30, 28, 26, 24, 22, 20 };
|
|
||||||
double tRRD_values[] = { /*10.0,*/ 7.5, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0 }; /* 10.0 is used for <2133mhz; do we care? */
|
|
||||||
u32 tRFC_values[] = { 140, 130, 120, 110, 100, 90, 80, 70, 60, 50, 40 };
|
|
||||||
u32 tWTR_values[] = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
|
|
||||||
u32 tREFpb_values[] = { 3900, 5850, 7800, 11700, 15600, 99999 };
|
|
||||||
|
|
||||||
// Credit to Lightos for these timings!
|
|
||||||
|
|
||||||
|
|
||||||
void Board::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) {
|
|
||||||
// timing stuff
|
|
||||||
|
|
||||||
SecmonArgs args = {};
|
|
||||||
|
|
||||||
constexpr double MC_ARB_DIV = 4.0;
|
|
||||||
constexpr u32 MC_ARB_SFA = 2;
|
|
||||||
|
|
||||||
double tCK_avg = 1000'000.0 / ramFreq;
|
|
||||||
u32 BL = 16;
|
|
||||||
u32 RL = 28 + rlAdd;
|
|
||||||
u32 WL = 14 + wlAdd;
|
|
||||||
u32 RL_DBI = RL + 4;
|
|
||||||
|
|
||||||
u32 tRCD = tRCD_values[tRCD_i];
|
|
||||||
u32 tRPpb = tRP_values[tRP_i];
|
|
||||||
u32 tRAS = tRAS_values[tRAS_i];
|
|
||||||
double tRRD = tRRD_values[tRRD_i];
|
|
||||||
u32 tRFCpb = tRFC_values[tRFC_i];
|
|
||||||
u32 tWTR = 10 - tWTR_values[tWTR_i];
|
|
||||||
u32 tFAW = static_cast<u32>(tRRD * 4.0);
|
|
||||||
|
|
||||||
double tDQSCK_max = 3.5;
|
|
||||||
u32 tWPRE = 2;
|
|
||||||
|
|
||||||
double tRPST = 0.5;
|
|
||||||
|
|
||||||
u32 tR2W = CEIL(RL_DBI + (tDQSCK_max / tCK_avg) + (BL / 2) - WL + tWPRE + FLOOR(tRPST) + 9.0) - (tRTW_i * 3);
|
|
||||||
|
|
||||||
u32 tRC = tRAS + tRPpb;
|
|
||||||
u32 tRFCab = tRFCpb * 2;
|
|
||||||
u32 tRPab = tRPpb + 3;
|
|
||||||
|
|
||||||
u32 tW2R = CEIL(MAX(WL + (0.010322547033278747 * (ramFreq / 1000.0)), (WL * -0.2067922202979121) + FLOOR(((RL_DBI * -0.1331159971685554) + WL) * 3.654131957826108)) - (tWTR / tCK_avg));
|
|
||||||
|
|
||||||
double tMMRI = tRCD + (tCK_avg * 3);
|
|
||||||
double pdex2mrr = tMMRI + 10;
|
|
||||||
u32 emc_cfg = hpMode ? 0x13200000 : 0xF3200000;
|
|
||||||
|
|
||||||
u32 refresh_raw = 0xFFFF;
|
|
||||||
if (tREFpb_i != 6) {
|
|
||||||
refresh_raw = CEIL(tREFpb_values[tREFpb_i] / tCK_avg) - 0x40;
|
|
||||||
refresh_raw = MIN(refresh_raw, static_cast<u32>(0xFFFF));
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 trefbw = refresh_raw + 0x40;
|
|
||||||
trefbw = MIN(trefbw, static_cast<u32>(0x3FFF));
|
|
||||||
|
|
||||||
u32 tR2P = 12 + (rlAdd / 2);
|
|
||||||
u32 tW2P = (CEIL(WL * 1.7303) * 2) - 5;
|
|
||||||
|
|
||||||
double tXSR = (double) (tRFCab + 7.5);
|
|
||||||
|
|
||||||
args = {};
|
|
||||||
args.X[0] = 0xF0000002;
|
|
||||||
args.X[1] = EMC_REGISTER_BASE + EMC_INTSTATUS_0;
|
|
||||||
svcCallSecureMonitor(&args);
|
|
||||||
|
|
||||||
if(args.X[1] == (EMC_REGISTER_BASE + EMC_INTSTATUS_0)) { // if param 1 is identical read failed, exosphere needs patch!
|
|
||||||
writeNotification("Horizon OC\nExosphere not patched\nfor EMC r/w");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// actually write the timings
|
|
||||||
WRITE_REGISTER_EMC(EMC_CFG_0, emc_cfg);
|
|
||||||
WRITE_REGISTER_EMC(EMC_RD_RCD_0, GET_CYCLE_CEIL(tRCD));
|
|
||||||
WRITE_REGISTER_EMC(EMC_WR_RCD_0, GET_CYCLE_CEIL(tRCD));
|
|
||||||
WRITE_REGISTER_EMC(EMC_RC_0, MIN(GET_CYCLE_CEIL(tRC), static_cast<u32>(0xB8)));
|
|
||||||
WRITE_REGISTER_EMC(EMC_RAS_0, MIN(GET_CYCLE_CEIL(tRAS), static_cast<u32>(0x7F)));
|
|
||||||
WRITE_REGISTER_EMC(EMC_RRD_0, GET_CYCLE_CEIL(tRRD));
|
|
||||||
WRITE_REGISTER_EMC(EMC_RFCPB_0, GET_CYCLE_CEIL(tRFCpb));
|
|
||||||
WRITE_REGISTER_EMC(EMC_RFC_0, GET_CYCLE_CEIL(tRFCab));
|
|
||||||
WRITE_REGISTER_EMC(EMC_RP_0, GET_CYCLE_CEIL(tRPpb));
|
|
||||||
WRITE_REGISTER_EMC(EMC_TRPAB_0, MIN(GET_CYCLE_CEIL(tRPab), static_cast<u32>(0x3F)));
|
|
||||||
WRITE_REGISTER_EMC(EMC_R2W_0, tR2W);
|
|
||||||
WRITE_REGISTER_EMC(EMC_W2R_0, tW2R);
|
|
||||||
WRITE_REGISTER_EMC(EMC_REFRESH_0, refresh_raw);
|
|
||||||
WRITE_REGISTER_EMC(EMC_PRE_REFRESH_REQ_CNT_0, refresh_raw / 4);
|
|
||||||
WRITE_REGISTER_EMC(EMC_TREFBW_0, trefbw);
|
|
||||||
WRITE_REGISTER_EMC(EMC_PDEX2MRR_0, GET_CYCLE_CEIL(pdex2mrr));
|
|
||||||
WRITE_REGISTER_EMC(EMC_TXSR_0, MIN(GET_CYCLE_CEIL(tXSR), static_cast<u32>(0x3fe)));
|
|
||||||
WRITE_REGISTER_EMC(EMC_TXSRDLL_0, MIN(GET_CYCLE_CEIL(tXSR), static_cast<u32>(0x3fe)));
|
|
||||||
|
|
||||||
WRITE_REGISTER_MC(MC_EMEM_ARB_TIMING_RCD_0, CEIL(GET_CYCLE_CEIL(tRCD) / MC_ARB_DIV) - 2);
|
|
||||||
WRITE_REGISTER_MC(MC_EMEM_ARB_TIMING_RP_0, CEIL(GET_CYCLE_CEIL(tRPpb) / MC_ARB_DIV) - 1);
|
|
||||||
WRITE_REGISTER_MC(MC_EMEM_ARB_TIMING_RC_0, CEIL(GET_CYCLE_CEIL(tRC) / MC_ARB_DIV) - 1);
|
|
||||||
WRITE_REGISTER_MC(MC_EMEM_ARB_TIMING_RAS_0, CEIL(GET_CYCLE_CEIL(tRAS) / MC_ARB_DIV) - 2);
|
|
||||||
WRITE_REGISTER_MC(MC_EMEM_ARB_TIMING_FAW_0, CEIL(GET_CYCLE_CEIL(tFAW) / MC_ARB_DIV) - 1);
|
|
||||||
WRITE_REGISTER_MC(MC_EMEM_ARB_TIMING_RRD_0, CEIL(GET_CYCLE_CEIL(tRRD) / MC_ARB_DIV) - 1);
|
|
||||||
WRITE_REGISTER_MC(MC_EMEM_ARB_TIMING_RFCPB_0, CEIL(GET_CYCLE_CEIL(tRFCpb) / MC_ARB_DIV) - 1);
|
|
||||||
|
|
||||||
WRITE_REGISTER_MC(MC_EMEM_ARB_TIMING_R2W_0, CEIL(tR2W / MC_ARB_DIV) - 1 + MC_ARB_SFA);
|
|
||||||
WRITE_REGISTER_MC(MC_EMEM_ARB_TIMING_W2R_0, CEIL(tW2R / MC_ARB_DIV) - 1 + MC_ARB_SFA);
|
|
||||||
|
|
||||||
WRITE_REGISTER_MC(MC_EMEM_ARB_TIMING_RAP2PRE_0, CEIL(tR2P / MC_ARB_DIV));
|
|
||||||
WRITE_REGISTER_MC(MC_EMEM_ARB_TIMING_WAP2PRE_0, CEIL(tW2P / MC_ARB_DIV) + MC_ARB_SFA);
|
|
||||||
|
|
||||||
u32 da_turns = 0;
|
|
||||||
da_turns |= u8((CEIL(tR2W / MC_ARB_DIV) - 1 + MC_ARB_SFA) / 2) << 16;
|
|
||||||
da_turns |= u8((CEIL(tW2R / MC_ARB_DIV) - 1 + MC_ARB_SFA) / 2) << 24;
|
|
||||||
WRITE_REGISTER_MC(MC_EMEM_ARB_DA_TURNS_0, da_turns);
|
|
||||||
|
|
||||||
u32 da_covers = 0;
|
|
||||||
u8 r_cover = ((CEIL(tR2P / MC_ARB_DIV)) + (CEIL(GET_CYCLE_CEIL(tRPpb) / MC_ARB_DIV) - 1) + (CEIL(GET_CYCLE_CEIL(tRCD) / MC_ARB_DIV) - 2)) / 2;
|
|
||||||
u8 w_cover = ((CEIL(tW2P / MC_ARB_DIV) + MC_ARB_SFA) + (CEIL(GET_CYCLE_CEIL(tRPpb) / MC_ARB_DIV) - 1) + (CEIL(GET_CYCLE_CEIL(tRCD) / MC_ARB_DIV) - 2)) / 2;
|
|
||||||
da_covers |= ((u32)(CEIL(GET_CYCLE_CEIL(tRC) / (u32)MC_ARB_DIV) - 1) / 2);
|
|
||||||
da_covers |= (r_cover << 8);
|
|
||||||
da_covers |= (w_cover << 16);
|
|
||||||
|
|
||||||
WRITE_REGISTER_MC(MC_EMEM_ARB_DA_COVERS_0, da_covers);
|
|
||||||
// TODO: modify mc_emem_arb_misc0
|
|
||||||
|
|
||||||
WRITE_REGISTER_MC(MC_TIMING_CONTROL_0, 0x1); // update timing regs as they are shadowed
|
|
||||||
WRITE_REGISTER_EMC(EMC_TIMING_CONTROL_0, 0x1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool Board::IsDram8GB() {
|
bool Board::IsDram8GB() {
|
||||||
SecmonArgs args = {};
|
SecmonArgs args = {};
|
||||||
args.X[0] = 0xF0000002;
|
args.X[0] = 0xF0000002;
|
||||||
|
|||||||
@@ -63,7 +63,6 @@ class Board
|
|||||||
static std::uint32_t GetVoltage(HocClkVoltage voltage);
|
static std::uint32_t GetVoltage(HocClkVoltage voltage);
|
||||||
static u8 GetFanRotationLevel();
|
static u8 GetFanRotationLevel();
|
||||||
static u8 GetDramID();
|
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 bool IsDram8GB();
|
static bool IsDram8GB();
|
||||||
protected:
|
protected:
|
||||||
static void FetchHardwareInfos();
|
static void FetchHardwareInfos();
|
||||||
|
|||||||
@@ -114,37 +114,6 @@ ClockManager::ClockManager()
|
|||||||
previousRamHz = Board::GetHz(SysClkModule_MEM);
|
previousRamHz = Board::GetHz(SysClkModule_MEM);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void ClockManager::FixCpuBug() {
|
|
||||||
if(this->config->Refresh() && this->RefreshContext()) {
|
|
||||||
u32 targetHz = 0;
|
|
||||||
u32 maxHz = 0;
|
|
||||||
u32 nearestHz = 0;
|
|
||||||
|
|
||||||
// ResetToStockClocks();
|
|
||||||
|
|
||||||
targetHz = this->context->overrideFreqs[SysClkModule_CPU];
|
|
||||||
if (!targetHz) {
|
|
||||||
targetHz = this->config->GetAutoClockHz(this->context->applicationId, SysClkModule_CPU, this->context->profile, false);
|
|
||||||
if(!targetHz)
|
|
||||||
targetHz = this->config->GetAutoClockHz(GLOBAL_PROFILE_ID, SysClkModule_CPU, this->context->profile, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (targetHz) {
|
|
||||||
maxHz = this->GetMaxAllowedHz(SysClkModule_CPU, this->context->profile);
|
|
||||||
nearestHz = this->GetNearestHz(SysClkModule_CPU, targetHz, maxHz);
|
|
||||||
|
|
||||||
while ((nearestHz = this->GetNearestHz(SysClkModule_CPU, targetHz, maxHz)) != targetHz) {
|
|
||||||
Board::SetHz(SysClkModule_CPU, 1020000000);
|
|
||||||
svcSleepThread(1'000'000);
|
|
||||||
Board::SetHz(SysClkModule_CPU, maxHz);
|
|
||||||
this->context->freqs[SysClkModule_CPU] = maxHz;
|
|
||||||
}
|
|
||||||
Board::SetHz(SysClkModule_CPU, targetHz);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ClockManager::~ClockManager()
|
ClockManager::~ClockManager()
|
||||||
{
|
{
|
||||||
threadClose(&governorTHREAD);
|
threadClose(&governorTHREAD);
|
||||||
@@ -465,12 +434,12 @@ void ClockManager::Tick()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(this->config->GetConfigValue(HocClkConfigValue_EnforceBoardLimit) && opMode == AppletOperationMode_Console ) {
|
// if(this->config->GetConfigValue(HocClkConfigValue_EnforceBoardLimit) && opMode == AppletOperationMode_Console ) {
|
||||||
if(Board::GetPowerMw(SysClkPowerSensor_Now) < 0) {
|
// if(Board::GetPowerMw(SysClkPowerSensor_Now) < 0) {
|
||||||
ResetToStockClocks();
|
// ResetToStockClocks();
|
||||||
return;
|
// 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();
|
||||||
@@ -567,7 +536,6 @@ void ClockManager::Tick()
|
|||||||
|
|
||||||
if(module == SysClkModule_MEM && Board::GetSocType() == SysClkSocType_Mariko && targetHz > oldHz && this->config->GetConfigValue(HorizonOCConfigValue_DVFSMode) == DVFSMode_Hijack) {
|
if(module == SysClkModule_MEM && Board::GetSocType() == SysClkSocType_Mariko && targetHz > oldHz && this->config->GetConfigValue(HorizonOCConfigValue_DVFSMode) == DVFSMode_Hijack) {
|
||||||
s32 dvfsOffset = this->config->GetConfigValue(HorizonOCConfigValue_DVFSOffset);
|
s32 dvfsOffset = this->config->GetConfigValue(HorizonOCConfigValue_DVFSOffset);
|
||||||
dvfsOffset = std::max(dvfsOffset, -50);
|
|
||||||
u32 vmin = Board::GetMinimumGpuVoltage(targetHz / 1000000) + dvfsOffset;
|
u32 vmin = Board::GetMinimumGpuVoltage(targetHz / 1000000) + dvfsOffset;
|
||||||
|
|
||||||
Board::PcvHijackDvfs(vmin);
|
Board::PcvHijackDvfs(vmin);
|
||||||
@@ -577,7 +545,7 @@ void ClockManager::Tick()
|
|||||||
I2c_BuckConverter_SetMvOut(&I2c_Mariko_GPU, vmin);
|
I2c_BuckConverter_SetMvOut(&I2c_Mariko_GPU, vmin);
|
||||||
}
|
}
|
||||||
|
|
||||||
this->context->voltages[HocClkVoltage_GPU] = vmin;
|
this->context->voltages[HocClkVoltage_GPU] = vmin * 1000;
|
||||||
}
|
}
|
||||||
|
|
||||||
Board::SetHz((SysClkModule)module, nearestHz);
|
Board::SetHz((SysClkModule)module, nearestHz);
|
||||||
@@ -605,10 +573,6 @@ void ClockManager::Tick()
|
|||||||
Board::ResetToStockGpu();
|
Board::ResetToStockGpu();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(module == SysClkModule_CPU && this->config->GetConfigValue(HocClkConfigValue_FixCpuVoltBug)) {
|
|
||||||
FixCpuBug();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -657,6 +621,11 @@ bool ClockManager::RefreshContext()
|
|||||||
{
|
{
|
||||||
// this->rnxSync->ToggleSync(this->GetConfig()->GetConfigValue(HocClkConfigValue_SyncReverseNXMode));
|
// this->rnxSync->ToggleSync(this->GetConfig()->GetConfigValue(HocClkConfigValue_SyncReverseNXMode));
|
||||||
Board::ResetToStock();
|
Board::ResetToStock();
|
||||||
|
if (Board::GetSocType() == SysClkSocType_Mariko && this->config->GetConfigValue(HorizonOCConfigValue_DVFSMode) == DVFSMode_Hijack) {
|
||||||
|
Board::PcvHijackDvfs(0);
|
||||||
|
Board::SetHz(SysClkModule_GPU, ~0);
|
||||||
|
Board::ResetToStockGpu();
|
||||||
|
}
|
||||||
this->WaitForNextTick();
|
this->WaitForNextTick();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1072,22 +1041,3 @@ void ClockManager::GetKipData() {
|
|||||||
writeNotification("Horizon OC\nConfig refresh failed");
|
writeNotification("Horizon OC\nConfig refresh failed");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClockManager::UpdateRamTimings() {
|
|
||||||
u32 t1_tRCD = this->config->GetConfigValue(KipConfigValue_t1_tRCD);
|
|
||||||
u32 t2_tRP = this->config->GetConfigValue(KipConfigValue_t2_tRP);
|
|
||||||
u32 t3_tRAS = this->config->GetConfigValue(KipConfigValue_t3_tRAS);
|
|
||||||
u32 t4_tRRD = this->config->GetConfigValue(KipConfigValue_t4_tRRD);
|
|
||||||
u32 t5_tRFC = this->config->GetConfigValue(KipConfigValue_t5_tRFC);
|
|
||||||
u32 t6_tRTW = this->config->GetConfigValue(KipConfigValue_t6_tRTW);
|
|
||||||
u32 t7_tWTR = this->config->GetConfigValue(KipConfigValue_t7_tWTR);
|
|
||||||
u32 t8_tREFI = this->config->GetConfigValue(KipConfigValue_t8_tREFI);
|
|
||||||
bool hpMode = (bool)this->config->GetConfigValue(KipConfigValue_hpMode);
|
|
||||||
|
|
||||||
u64 ramFreq = initialConfigValues[KipConfigValue_marikoEmcMaxClock];
|
|
||||||
u32 rlAdd = initialConfigValues[KipConfigValue_mem_burst_read_latency];
|
|
||||||
u32 wlAdd = initialConfigValues[KipConfigValue_mem_burst_write_latency];
|
|
||||||
|
|
||||||
|
|
||||||
Board::UpdateShadowRegs(t1_tRCD, t2_tRP, t3_tRAS, t4_tRRD, t5_tRFC, t6_tRTW, t7_tWTR, t8_tREFI, ramFreq, rlAdd, wlAdd, hpMode);
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -49,7 +49,6 @@ class ClockManager
|
|||||||
|
|
||||||
ClockManager();
|
ClockManager();
|
||||||
virtual ~ClockManager();
|
virtual ~ClockManager();
|
||||||
void FixCpuBug();
|
|
||||||
|
|
||||||
SysClkContext GetCurrentContext();
|
SysClkContext GetCurrentContext();
|
||||||
Config* GetConfig();
|
Config* GetConfig();
|
||||||
@@ -63,7 +62,6 @@ class ClockManager
|
|||||||
void SetKipData();
|
void SetKipData();
|
||||||
void GetKipData();
|
void GetKipData();
|
||||||
static void GovernorThread(void* arg);
|
static void GovernorThread(void* arg);
|
||||||
void UpdateRamTimings();
|
|
||||||
struct {
|
struct {
|
||||||
std::uint32_t count;
|
std::uint32_t count;
|
||||||
std::uint32_t list[SYSCLK_FREQ_LIST_MAX];
|
std::uint32_t list[SYSCLK_FREQ_LIST_MAX];
|
||||||
|
|||||||
@@ -209,11 +209,6 @@ Result IpcService::ServiceHandlerFunc(void* arg, const IpcServerRequest* r, u8*
|
|||||||
return ipcSrv->SetKipData();
|
return ipcSrv->SetKipData();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case HocClkIpcCmd_UpdateEmcRegs:
|
|
||||||
if (r->data.size >= 0) {
|
|
||||||
return ipcSrv->UpdateEmcRegs();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return SYSCLK_ERROR(Generic);
|
return SYSCLK_ERROR(Generic);
|
||||||
@@ -380,10 +375,4 @@ Result IpcService::GetKipData() {
|
|||||||
this->clockMgr->GetKipData();
|
this->clockMgr->GetKipData();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
Result IpcService::UpdateEmcRegs() {
|
|
||||||
this->clockMgr->UpdateRamTimings();
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
@@ -57,8 +57,6 @@ class IpcService
|
|||||||
Result SetReverseNXRTMode(ReverseNXMode mode);
|
Result SetReverseNXRTMode(ReverseNXMode mode);
|
||||||
Result SetKipData();
|
Result SetKipData();
|
||||||
Result GetKipData();
|
Result GetKipData();
|
||||||
Result UpdateEmcRegs();
|
|
||||||
Result CalculateGPUVmin();
|
|
||||||
bool running;
|
bool running;
|
||||||
Thread thread;
|
Thread thread;
|
||||||
LockableMutex threadMutex;
|
LockableMutex threadMutex;
|
||||||
|
|||||||
18
build.sh
18
build.sh
@@ -21,20 +21,4 @@ cd ../../
|
|||||||
|
|
||||||
cd Source/Horizon-OC-Monitor/
|
cd Source/Horizon-OC-Monitor/
|
||||||
make -j"$(nproc)"
|
make -j"$(nproc)"
|
||||||
cp Horizon-OC-Monitor.ovl ../../dist/switch/.overlays/Horizon-OC-Monitor.ovl
|
cp Horizon-OC-Monitor.ovl ../../dist/switch/.overlays/Horizon-OC-Monitor.ovl
|
||||||
|
|
||||||
cd ../../
|
|
||||||
|
|
||||||
ROOT="build"
|
|
||||||
PATCHES="Source/Atmosphere-Patches"
|
|
||||||
|
|
||||||
cp "$PATCHES/secmon_memory_layout.hpp" "$ROOT/libraries/libexosphere/include/exosphere/secmon/"
|
|
||||||
cp "$PATCHES/secmon_emc_access_table_data.inc" "$ROOT/exosphere/program/source/smc/"
|
|
||||||
cp "$PATCHES/secmon_define_emc_access_table.inc" "$ROOT/exosphere/program/source/smc/"
|
|
||||||
cp "$PATCHES/secmon_smc_register_access.cpp" "$ROOT/exosphere/program/source/smc/"
|
|
||||||
cd build/exosphere
|
|
||||||
|
|
||||||
make -j"$(nproc)"
|
|
||||||
|
|
||||||
cd out/nintendo_nx_arm64_armv8a/release
|
|
||||||
cp "exosphere.bin" "../../../../../dist/"
|
|
||||||
BIN
dist/atmosphere/contents/00FF0000636C6BFF/exefs.nsp
vendored
BIN
dist/atmosphere/contents/00FF0000636C6BFF/exefs.nsp
vendored
Binary file not shown.
BIN
dist/atmosphere/kips/hoc.kip
vendored
BIN
dist/atmosphere/kips/hoc.kip
vendored
Binary file not shown.
BIN
dist/exosphere.bin
vendored
BIN
dist/exosphere.bin
vendored
Binary file not shown.
BIN
dist/switch/.overlays/Horizon-OC-Monitor.ovl
vendored
BIN
dist/switch/.overlays/Horizon-OC-Monitor.ovl
vendored
Binary file not shown.
BIN
dist/switch/.overlays/horizon-oc-overlay.ovl
vendored
BIN
dist/switch/.overlays/horizon-oc-overlay.ovl
vendored
Binary file not shown.
Reference in New Issue
Block a user