- Add emulator mode (GPU-only freq capping) for handheld profile

- HOS 14.0.0+ removed ts:GetTemperatureMilliC · retronx-team/sys-clk@dcd0d5d
This commit is contained in:
KazushiM
2022-03-24 10:52:14 +08:00
parent d6e2ac2527
commit 406b2df944
6 changed files with 54 additions and 19 deletions

View File

@@ -69,7 +69,7 @@ This project will not be actively maintained or regularly updated along with Atm
- Unsafe: CPU/GPU @ 2397/1305 MHz
<details>
- Without chargers, CPU/GPU would be capped @ 1963/921 MHz.
- Without chargers, CPU/GPU would be capped @ 1963/921 MHz or -/460 MHz (Emulator mode).
- Without official chargers, GPU would be capped @ 1267 MHz.

View File

@@ -74,11 +74,11 @@ From Hekate Minerva module [sys_sdrammtc.c](https://github.com/CTCaer/hekate/blo
To protect the battery from excessive strain, clocks requested from config may be capped before applying, depending on your current profile:
| | Handheld | Charging (USB) | Charging (Official) | Docked |
|:-------:|:--------:|:--------------:|:-------------------:|:------:|
| **MEM** | - | - | - | - |
| **CPU** | 1963 | - | - | - |
| **GPU** | 921 | 1267 | - | - |
| | Handheld | Handheld (Emulator) | Charging (USB) | Charging (Official) | Docked |
|:-------:|:--------:|:-------------------:|:--------------:|:-------------------:|:------:|
| **MEM** | - | - | - | - | - |
| **CPU** | 1963 | - | - | - | - |
| **GPU** | 921 | 460 | 1267 | - | - |
## Installation

View File

@@ -67,6 +67,7 @@ typedef struct
{
bool systemCoreBoostCPU;
bool gotBoostCPUFreq;
bool handheldEmulatorMode;
ReverseNXMode reverseNXMode;
uint32_t maxMEMFreq;
uint32_t boostCPUFreq;
@@ -80,9 +81,10 @@ typedef struct
};
} SysClkTitleProfileList;
#define SYSCLK_CPU_HANDHELD_MAX_HZ 1963500000
#define SYSCLK_GPU_HANDHELD_MAX_HZ 921600000
#define SYSCLK_GPU_CHARGING_USB_MAX_HZ 1267200000
#define SYSCLK_CPU_HANDHELD_MAX_HZ 1963500000U
#define SYSCLK_GPU_HANDHELD_EMULATOR_HZ 460800000U
#define SYSCLK_GPU_HANDHELD_MAX_HZ 921600000U
#define SYSCLK_GPU_CHARGING_USB_MAX_HZ 1267200000U
extern uint32_t sysclk_g_freq_table_mem_hz[];
extern uint32_t sysclk_g_freq_table_cpu_hz[];

View File

@@ -60,6 +60,7 @@ ClockManager::ClockManager()
this->oc = new SysClkOcExtra;
this->oc->systemCoreBoostCPU = false;
this->oc->gotBoostCPUFreq = false;
this->oc->handheldEmulatorMode = false;
this->oc->reverseNXMode = ReverseNX_NotFound;
this->oc->maxMEMFreq = 0;
this->oc->boostCPUFreq = 1785'000'000;
@@ -162,8 +163,26 @@ uint32_t ClockManager::GetHz(SysClkModule module)
return this->oc->maxMEMFreq;
}
/* Handle Handheld Emulator-Mode limit */
if (this->context->realProfile == SysClkProfile_Handheld)
{
switch (module)
{
case SysClkModule_CPU:
this->oc->handheldEmulatorMode = (hz > SYSCLK_CPU_HANDHELD_MAX_HZ);
break;
case SysClkModule_GPU:
if (this->oc->handheldEmulatorMode)
hz = std::min(hz, SYSCLK_GPU_HANDHELD_EMULATOR_HZ);
break;
default:
break;
}
}
}
/* Handle CPU Auto Boost, no user-defined hz required */
if (module == SysClkModule_CPU)
{
if (this->oc->systemCoreBoostCPU && hz < this->oc->boostCPUFreq)

View File

@@ -298,10 +298,6 @@ std::uint32_t Clocks::GetNearestHz(SysClkModule module, SysClkProfile profile, s
std::uint32_t Clocks::GetMaxAllowedHz(SysClkModule module, SysClkProfile profile)
{
switch (module) {
case SysClkModule_CPU:
if (profile == SysClkProfile_Handheld)
return SYSCLK_CPU_HANDHELD_MAX_HZ;
break;
case SysClkModule_GPU:
if (profile == SysClkProfile_Handheld)
return SYSCLK_GPU_HANDHELD_MAX_HZ;
@@ -341,26 +337,43 @@ std::uint32_t Clocks::GetNearestHz(SysClkModule module, std::uint32_t inHz)
return inHz;
}
std::uint32_t Clocks::GetTemperatureMilli(SysClkThermalSensor sensor)
std::int32_t Clocks::GetTsTemperatureMilli(TsLocation location)
{
Result rc;
std::int32_t millis = 0;
if(hosversionAtLeast(14,0,0))
{
rc = tsGetTemperature(location, &millis);
ASSERT_RESULT_OK(rc, "tsGetTemperature(%u)", location);
millis *= 1000;
}
else
{
rc = tsGetTemperatureMilliC(location, &millis);
ASSERT_RESULT_OK(rc, "tsGetTemperatureMilliC(%u)", location);
}
return millis;
}
std::uint32_t Clocks::GetTemperatureMilli(SysClkThermalSensor sensor)
{
std::int32_t millis = 0;
if(sensor == SysClkThermalSensor_SOC)
{
rc = tsGetTemperatureMilliC(TsLocation_External, &millis);
ASSERT_RESULT_OK(rc, "tsGetTemperatureMilliC");
millis = GetTsTemperatureMilli(TsLocation_External);
}
else if(sensor == SysClkThermalSensor_PCB)
{
rc = tsGetTemperatureMilliC(TsLocation_Internal, &millis);
ASSERT_RESULT_OK(rc, "tsGetTemperatureMilliC");
millis = GetTsTemperatureMilli(TsLocation_Internal);
}
else if(sensor == SysClkThermalSensor_Skin)
{
if(hosversionAtLeast(5,0,0))
{
rc = tcGetSkinTemperatureMilliC(&millis);
Result rc = tcGetSkinTemperatureMilliC(&millis);
ASSERT_RESULT_OK(rc, "tcGetSkinTemperatureMilliC");
}
}

View File

@@ -31,6 +31,7 @@ class Clocks
static std::uint32_t GetTemperatureMilli(SysClkThermalSensor sensor);
protected:
static std::int32_t GetTsTemperatureMilli(TsLocation location);
static PcvModule GetPcvModule(SysClkModule sysclkModule);
static PcvModuleId GetPcvModuleId(SysClkModule sysclkModule);
static std::uint32_t GetNearestHz(SysClkModule module, std::uint32_t inHz);