hocclk: format code
use clang format file provided for optimal formatting
This commit is contained in:
1 parent
c6a8884c14
commit
88bfa9a4ec
118 files changed
+7111
-9615
No files matched your search
@@ -24,31 +24,32 @@
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#include "../hos/apm_ext.h"
|
||||
#include <i2c.h>
|
||||
#include <t210.h>
|
||||
#include <max17050.h>
|
||||
#include <tmp451.h>
|
||||
#include <ipc_server.h>
|
||||
#include <lockable_mutex.h>
|
||||
#include <battery.h>
|
||||
#include <hocclk.h>
|
||||
#include <switch.h>
|
||||
#include <i2c.h>
|
||||
#include <max17050.h>
|
||||
#include <notification.h>
|
||||
#include <pwm.h>
|
||||
#include <registers.h>
|
||||
#include <battery.h>
|
||||
#include "../display/display_refresh_rate.hpp"
|
||||
#include <notification.h>
|
||||
#include <switch.h>
|
||||
#include <t210.h>
|
||||
#include <tmp451.h>
|
||||
|
||||
#include "../display/display_refresh_rate.hpp"
|
||||
#include "../file/file_utils.hpp"
|
||||
#include "../hos/apm_ext.h"
|
||||
#include "../hos/integrations.hpp"
|
||||
#include "../hos/rgltr.h"
|
||||
#include "../tsensor/aotag.hpp"
|
||||
#include "../tsensor/soctherm.hpp"
|
||||
#include "board.hpp"
|
||||
#include "board_fuse.hpp"
|
||||
#include "board_load.hpp"
|
||||
#include "board_volt.hpp"
|
||||
#include "board_misc.hpp"
|
||||
#include "../tsensor/soctherm.hpp"
|
||||
#include "../tsensor/aotag.hpp"
|
||||
#include "../hos/integrations.hpp"
|
||||
#include "../file/file_utils.hpp"
|
||||
#include "../hos/rgltr.h"
|
||||
#include "board_volt.hpp"
|
||||
#include <ipc_server.h>
|
||||
#include <lockable_mutex.h>
|
||||
|
||||
namespace board {
|
||||
|
||||
u64 clkVirtAddr, dsiVirtAddr, apbVirtAddr, fuseVirtAddr;
|
||||
@@ -62,25 +63,25 @@ namespace board {
|
||||
|
||||
u32 fd = 0, fd2 = 0;
|
||||
|
||||
#define PMC_BASE 0x7000E400
|
||||
#define APB_MISC_GP_HIDREV 0x804
|
||||
#define GP_HIDREV_MAJOR_T210 0x1
|
||||
#define GP_HIDREV_MAJOR_T210B01 0x2
|
||||
#define APB_BASE 0x70000000
|
||||
#define FUSE_RESERVED_ODMX(x) (0x1C8 + 4 * (x))
|
||||
#define FUSE_OFFSET 0x800
|
||||
#define PMC_BASE 0x7000E400
|
||||
#define APB_MISC_GP_HIDREV 0x804
|
||||
#define GP_HIDREV_MAJOR_T210 0x1
|
||||
#define GP_HIDREV_MAJOR_T210B01 0x2
|
||||
#define APB_BASE 0x70000000
|
||||
#define FUSE_RESERVED_ODMX(x) (0x1C8 + 4 * (x))
|
||||
#define FUSE_OFFSET 0x800
|
||||
void FetchHardwareInfos() {
|
||||
ReadFuses(fuseData, fuseVirtAddr);
|
||||
SetGpuBracket(fuseData.gpuSpeedo, speedoBracket);
|
||||
|
||||
u32 hidrev = *(u32*)(apbVirtAddr + APB_MISC_GP_HIDREV);
|
||||
u32 hidrev = *(u32 *)(apbVirtAddr + APB_MISC_GP_HIDREV);
|
||||
if (((hidrev >> 4) & 0xF) >= GP_HIDREV_MAJOR_T210B01) {
|
||||
gSocType = HocClkSocType_Mariko;
|
||||
} else {
|
||||
gSocType = HocClkSocType_Erista;
|
||||
}
|
||||
|
||||
u32 odm4 = *(u32*)(fuseVirtAddr + FUSE_OFFSET + FUSE_RESERVED_ODMX(4));
|
||||
u32 odm4 = *(u32 *)(fuseVirtAddr + FUSE_OFFSET + FUSE_RESERVED_ODMX(4));
|
||||
|
||||
if (gSocType == HocClkSocType_Mariko) {
|
||||
switch ((odm4 & 0xF0000) >> 16) {
|
||||
@@ -123,7 +124,7 @@ namespace board {
|
||||
rc = psmInitialize();
|
||||
ASSERT_RESULT_OK(rc, "psmInitialize");
|
||||
|
||||
if(HOSSVC_HAS_TC) {
|
||||
if (HOSSVC_HAS_TC) {
|
||||
rc = tcInitialize();
|
||||
ASSERT_RESULT_OK(rc, "tcInitialize");
|
||||
}
|
||||
@@ -170,7 +171,7 @@ namespace board {
|
||||
|
||||
batteryInfoInitialize();
|
||||
|
||||
tsensor::InitializeSoctherm(); // SOCTHERM must be init before AOTAG
|
||||
tsensor::InitializeSoctherm(); // SOCTHERM must be init before AOTAG
|
||||
|
||||
// PMC exosphere check
|
||||
SecmonArgs args = {};
|
||||
@@ -178,18 +179,21 @@ namespace board {
|
||||
args.X[1] = PMC_BASE;
|
||||
svcCallSecureMonitor(&args);
|
||||
|
||||
if (args.X[1] != PMC_BASE) { // if param 1 is identical read failed
|
||||
if (args.X[1] != PMC_BASE) { // if param 1 is identical read failed
|
||||
tsensor::InitializeAotag(GetSocType() == HocClkSocType_Mariko);
|
||||
}
|
||||
|
||||
Result pwmCheck = 1;
|
||||
if (hosversionAtLeast(6,0,0) && R_SUCCEEDED(pwmInitialize())) {
|
||||
if (hosversionAtLeast(6, 0, 0) && R_SUCCEEDED(pwmInitialize())) {
|
||||
pwmCheck = pwmOpenSession2(&iCon, 0x3D000001);
|
||||
}
|
||||
|
||||
StartMiscThread(pwmCheck, &iCon);
|
||||
|
||||
display::DisplayRefreshConfig cfg = {.clkVirtAddr = clkVirtAddr, .dsiVirtAddr = dsiVirtAddr, .isLite = (GetConsoleType() == HocClkConsoleType_Hoag), .isRetroSUPER = integrations::GetRETROSuperStatus()};
|
||||
display::DisplayRefreshConfig cfg = { .clkVirtAddr = clkVirtAddr,
|
||||
.dsiVirtAddr = dsiVirtAddr,
|
||||
.isLite = (GetConsoleType() == HocClkConsoleType_Hoag),
|
||||
.isRetroSUPER = integrations::GetRETROSuperStatus() };
|
||||
display::Initialize(&cfg);
|
||||
|
||||
CacheDfllData();
|
||||
@@ -243,7 +247,7 @@ namespace board {
|
||||
args.X[1] = MC_REGISTER_BASE + MC_EMEM_CFG_0;
|
||||
svcCallSecureMonitor(&args);
|
||||
|
||||
if (args.X[1] == (MC_REGISTER_BASE + MC_EMEM_CFG_0)) { // if param 1 is identical read failed
|
||||
if (args.X[1] == (MC_REGISTER_BASE + MC_EMEM_CFG_0)) { // if param 1 is identical read failed
|
||||
notification::writeNotification("Horizon OC\nSecmon read failed!\n This may be a hardware issue!");
|
||||
return false;
|
||||
}
|
||||
@@ -270,4 +274,4 @@ namespace board {
|
||||
return false; /* stub for now. */
|
||||
}
|
||||
|
||||
}
|
||||
} // namespace board
|
||||
@@ -26,18 +26,20 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <switch.h>
|
||||
#include <hocclk.h>
|
||||
#include <switch.h>
|
||||
|
||||
#include "../mapping/mem_map.hpp"
|
||||
#include "board_freq.hpp"
|
||||
#include "board_fuse.hpp"
|
||||
#include "board_load.hpp"
|
||||
#include "board_name.hpp"
|
||||
#include "board_freq.hpp"
|
||||
#include "board_profile.hpp"
|
||||
#include "board_sensor.hpp"
|
||||
#include "board_volt.hpp"
|
||||
#include "board_profile.hpp"
|
||||
#include "../mapping/mem_map.hpp"
|
||||
#define HOSSVC_HAS_CLKRST (hosversionAtLeast(8,0,0))
|
||||
#define HOSSVC_HAS_TC (hosversionAtLeast(5,0,0))
|
||||
|
||||
#define HOSSVC_HAS_CLKRST (hosversionAtLeast(8, 0, 0))
|
||||
#define HOSSVC_HAS_TC (hosversionAtLeast(5, 0, 0))
|
||||
|
||||
namespace board {
|
||||
extern u64 clkVirtAddr, dsiVirtAddr, apbVirtAddr, fuseVirtAddr;
|
||||
@@ -46,7 +48,7 @@ namespace board {
|
||||
extern HocClkConsoleType gConsoleType;
|
||||
extern FuseData fuseData;
|
||||
extern u8 speedoBracket;
|
||||
|
||||
|
||||
void Initialize();
|
||||
void Exit();
|
||||
HocClkSocType GetSocType();
|
||||
@@ -58,4 +60,4 @@ namespace board {
|
||||
FuseData *GetFuseData();
|
||||
bool IsUsingRetroSuperDisplay();
|
||||
|
||||
}
|
||||
} // namespace board
|
||||
@@ -24,24 +24,25 @@
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#include <switch.h>
|
||||
#include <hocclk.h>
|
||||
#include "../hos/apm_ext.h"
|
||||
#include <i2c.h>
|
||||
#include "../i2c/i2cDrv.h"
|
||||
#include <t210.h>
|
||||
#include <max17050.h>
|
||||
#include <switch.h>
|
||||
#include <t210.h>
|
||||
#include <tmp451.h>
|
||||
#include <ipc_server.h>
|
||||
#include <lockable_mutex.h>
|
||||
|
||||
#include "../display/display_refresh_rate.hpp"
|
||||
#include "../file/config.hpp"
|
||||
#include "../file/errors.hpp"
|
||||
#include "../hos/apm_ext.h"
|
||||
#include "../i2c/i2cDrv.h"
|
||||
#include "../soc/gm20b.hpp"
|
||||
#include "../soc/pllmb.hpp"
|
||||
#include "board.hpp"
|
||||
#include "board_name.hpp"
|
||||
#include "../file/errors.hpp"
|
||||
#include "../soc/pllmb.hpp"
|
||||
#include "../file/config.hpp"
|
||||
#include "../soc/gm20b.hpp"
|
||||
#include "../file/config.hpp"
|
||||
#include <ipc_server.h>
|
||||
#include <lockable_mutex.h>
|
||||
|
||||
namespace board {
|
||||
static u32 currentInjectedHz = 0;
|
||||
static u32 gMarikoGm20bCutoff = 1228800000;
|
||||
@@ -80,12 +81,12 @@ namespace board {
|
||||
ASSERT_RESULT_OK(pcvSetClockRate(moduleID, hz), "pcvSetClockRate");
|
||||
}
|
||||
|
||||
void HandleCpuUv()
|
||||
{
|
||||
void HandleCpuUv() {
|
||||
if (board::GetSocType() == HocClkSocType_Erista)
|
||||
board::SetDfllTunings(config::GetConfigValue(KipConfigValue_eristaCpuUV), 0, 1581000000); // Erista tbreak is always 1581MHz
|
||||
board::SetDfllTunings(config::GetConfigValue(KipConfigValue_eristaCpuUV), 0, 1581000000); // Erista tbreak is always 1581MHz
|
||||
else
|
||||
board::SetDfllTunings(config::GetConfigValue(KipConfigValue_marikoCpuUVLow), config::GetConfigValue(KipConfigValue_marikoCpuUVHigh), board::CalculateTbreak(config::GetConfigValue(KipConfigValue_tableConf)));
|
||||
board::SetDfllTunings(config::GetConfigValue(KipConfigValue_marikoCpuUVLow), config::GetConfigValue(KipConfigValue_marikoCpuUVHigh),
|
||||
board::CalculateTbreak(config::GetConfigValue(KipConfigValue_tableConf)));
|
||||
}
|
||||
|
||||
void SetHz(HocClkModule module, u32 hz) {
|
||||
@@ -101,7 +102,8 @@ namespace board {
|
||||
return;
|
||||
}
|
||||
|
||||
bool useGm20b = (module == HocClkModule_GPU) && (GetSocType() == HocClkSocType_Mariko) && (hz % 38400000 == 0) && (hz % 76800000 != 0) && hz < gMarikoGm20bCutoff;
|
||||
bool useGm20b = (module == HocClkModule_GPU) && (GetSocType() == HocClkSocType_Mariko) && (hz % 38400000 == 0) && (hz % 76800000 != 0) &&
|
||||
hz < gMarikoGm20bCutoff;
|
||||
|
||||
u32 pcvHz = useGm20b ? ((hz + 76800000 - 1) / 76800000) * 76800000 : hz;
|
||||
|
||||
@@ -129,7 +131,7 @@ namespace board {
|
||||
PcvSetHz(GetPcvModule(module), pcvHz);
|
||||
}
|
||||
}
|
||||
if(config::GetConfigValue(HocClkConfigValue_LiveCpuUv) && module == HocClkModule_CPU) {
|
||||
if (config::GetConfigValue(HocClkConfigValue_LiveCpuUv) && module == HocClkModule_CPU) {
|
||||
HandleCpuUv();
|
||||
}
|
||||
if (useGm20b) {
|
||||
@@ -181,7 +183,9 @@ namespace board {
|
||||
case HocClkModule_GPU:
|
||||
return t210ClkGpuFreq();
|
||||
case HocClkModule_MEM:
|
||||
return config::GetConfigValue(HocClkConfigValue_MemoryFrequencyMeasurementMode) == MemoryFrequencyMeasurementMode_PLL ? pllmb::getRamClockRatePLLMB() : t210ClkMemFreq();
|
||||
return config::GetConfigValue(HocClkConfigValue_MemoryFrequencyMeasurementMode) == MemoryFrequencyMeasurementMode_PLL
|
||||
? pllmb::getRamClockRatePLLMB()
|
||||
: t210ClkMemFreq();
|
||||
case HocClkModule_Display:
|
||||
return GetDisplayRate(hz);
|
||||
default:
|
||||
@@ -197,7 +201,6 @@ namespace board {
|
||||
s32 tmpInMaxCount = maxCount;
|
||||
s32 tmpOutCount = 0;
|
||||
|
||||
|
||||
if (HOSSVC_HAS_CLKRST) {
|
||||
ClkrstSession session = {};
|
||||
|
||||
@@ -230,20 +233,20 @@ namespace board {
|
||||
|
||||
void ResetToStock() {
|
||||
Result rc;
|
||||
if (hosversionAtLeast(9,0,0)) {
|
||||
if (hosversionAtLeast(9, 0, 0)) {
|
||||
std::uint32_t confId = 0;
|
||||
rc = apmExtGetCurrentPerformanceConfiguration(&confId);
|
||||
ASSERT_RESULT_OK(rc, "apmExtGetCurrentPerformanceConfiguration");
|
||||
|
||||
HocClkApmConfiguration* apmConfiguration = nullptr;
|
||||
HocClkApmConfiguration *apmConfiguration = nullptr;
|
||||
for (size_t i = 0; hocclk_g_apm_configurations[i].id; ++i) {
|
||||
if(hocclk_g_apm_configurations[i].id == confId) {
|
||||
if (hocclk_g_apm_configurations[i].id == confId) {
|
||||
apmConfiguration = &hocclk_g_apm_configurations[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(!apmConfiguration) {
|
||||
if (!apmConfiguration) {
|
||||
ERROR_THROW("Unknown apm configuration: %x", confId);
|
||||
}
|
||||
|
||||
@@ -263,4 +266,4 @@ namespace board {
|
||||
void ResetToStockDisplay() {
|
||||
display::SetRate(60);
|
||||
}
|
||||
}
|
||||
} // namespace board
|
||||
@@ -25,16 +25,18 @@
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#include <switch.h>
|
||||
#include <hocclk.h>
|
||||
#include "../hos/apm_ext.h"
|
||||
#include <i2c.h>
|
||||
#include <t210.h>
|
||||
#include <max17050.h>
|
||||
#include <switch.h>
|
||||
#include <t210.h>
|
||||
#include <tmp451.h>
|
||||
|
||||
#include "../file/errors.hpp"
|
||||
#include "../hos/apm_ext.h"
|
||||
#include <ipc_server.h>
|
||||
#include <lockable_mutex.h>
|
||||
#include "../file/errors.hpp"
|
||||
|
||||
|
||||
namespace board {
|
||||
|
||||
@@ -46,12 +48,11 @@ namespace board {
|
||||
void GetFreqList(HocClkModule module, u32 *outList, u32 maxCount, u32 *outCount);
|
||||
u32 GetHighestDockedDisplayRate();
|
||||
void HandleCpuUv();
|
||||
|
||||
|
||||
void ResetToStock();
|
||||
void ResetToStockDisplay();
|
||||
|
||||
template <typename Getter>
|
||||
void ResetToStockModule(Getter getHzFunc, HocClkModule module) {
|
||||
template <typename Getter> void ResetToStockModule(Getter getHzFunc, HocClkModule module) {
|
||||
Result rc = 0;
|
||||
|
||||
if (hosversionAtLeast(9, 0, 0)) {
|
||||
@@ -59,7 +60,7 @@ namespace board {
|
||||
rc = apmExtGetCurrentPerformanceConfiguration(&confId);
|
||||
ASSERT_RESULT_OK(rc, "apmExtGetCurrentPerformanceConfiguration");
|
||||
|
||||
HocClkApmConfiguration* apmConfiguration = nullptr;
|
||||
HocClkApmConfiguration *apmConfiguration = nullptr;
|
||||
for (size_t i = 0; hocclk_g_apm_configurations[i].id; ++i) {
|
||||
|
||||
if (hocclk_g_apm_configurations[i].id == confId) {
|
||||
@@ -84,15 +85,15 @@ namespace board {
|
||||
}
|
||||
|
||||
inline void ResetToStockCpu() {
|
||||
ResetToStockModule([](const HocClkApmConfiguration& cfg) {return cfg.cpu_hz; }, HocClkModule_CPU);
|
||||
ResetToStockModule([](const HocClkApmConfiguration &cfg) { return cfg.cpu_hz; }, HocClkModule_CPU);
|
||||
}
|
||||
|
||||
inline void ResetToStockGpu() {
|
||||
ResetToStockModule([](const HocClkApmConfiguration& cfg){ return cfg.gpu_hz; }, HocClkModule_GPU);
|
||||
ResetToStockModule([](const HocClkApmConfiguration &cfg) { return cfg.gpu_hz; }, HocClkModule_GPU);
|
||||
}
|
||||
|
||||
inline void ResetToStockMem() {
|
||||
ResetToStockModule([](const HocClkApmConfiguration& cfg){ return cfg.mem_hz; }, HocClkModule_MEM);
|
||||
ResetToStockModule([](const HocClkApmConfiguration &cfg) { return cfg.mem_hz; }, HocClkModule_MEM);
|
||||
}
|
||||
|
||||
}
|
||||
} // namespace board
|
||||
@@ -15,16 +15,18 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include <switch.h>
|
||||
#include <fuse.h>
|
||||
#include "board_fuse.hpp"
|
||||
#include <cstring>
|
||||
#include <fuse.h>
|
||||
#include <switch.h>
|
||||
|
||||
#include "board.hpp"
|
||||
#include "board_fuse.hpp"
|
||||
|
||||
|
||||
namespace board {
|
||||
|
||||
void SetGpuBracket(u16 speedo, u8 &gpuBracket) {
|
||||
if(GetSocType() == HocClkSocType_Mariko) {
|
||||
if (GetSocType() == HocClkSocType_Mariko) {
|
||||
if (speedo <= 1624) {
|
||||
gpuBracket = 0;
|
||||
return;
|
||||
@@ -43,7 +45,7 @@ namespace board {
|
||||
/* >= 1754 */
|
||||
gpuBracket = 3;
|
||||
} else {
|
||||
switch(speedo) {
|
||||
switch (speedo) {
|
||||
case 1850 ... 1925:
|
||||
gpuBracket = 0;
|
||||
break;
|
||||
@@ -70,12 +72,12 @@ namespace board {
|
||||
speedo.cpuSpeedo = *reinterpret_cast<u16 *>(fusePtr + FUSE_CPU_SPEEDO_0_CALIB);
|
||||
speedo.gpuSpeedo = *reinterpret_cast<u16 *>(fusePtr + FUSE_CPU_SPEEDO_2_CALIB);
|
||||
speedo.socSpeedo = *reinterpret_cast<u16 *>(fusePtr + FUSE_SOC_SPEEDO_0_CALIB);
|
||||
speedo.cpuIDDQ = *reinterpret_cast<u16 *>(fusePtr + FUSE_CPU_IDDQ_CALIB) * 4;
|
||||
speedo.gpuIDDQ = *reinterpret_cast<u16 *>(fusePtr + FUSE_GPU_IDDQ_CALIB) * 5;
|
||||
speedo.socIDDQ = *reinterpret_cast<u16 *>(fusePtr + FUSE_SOC_IDDQ_CALIB) * 4;
|
||||
speedo.waferX = *reinterpret_cast<s16 *>(fusePtr + FUSE_OPT_X_COORDINATE);
|
||||
speedo.waferY = *reinterpret_cast<s16 *>(fusePtr + FUSE_OPT_Y_COORDINATE);
|
||||
speedo.waferX = (speedo.waferX & BIT(8)) ? (speedo.waferX - 512) : speedo.waferX;
|
||||
speedo.cpuIDDQ = *reinterpret_cast<u16 *>(fusePtr + FUSE_CPU_IDDQ_CALIB) * 4;
|
||||
speedo.gpuIDDQ = *reinterpret_cast<u16 *>(fusePtr + FUSE_GPU_IDDQ_CALIB) * 5;
|
||||
speedo.socIDDQ = *reinterpret_cast<u16 *>(fusePtr + FUSE_SOC_IDDQ_CALIB) * 4;
|
||||
speedo.waferX = *reinterpret_cast<s16 *>(fusePtr + FUSE_OPT_X_COORDINATE);
|
||||
speedo.waferY = *reinterpret_cast<s16 *>(fusePtr + FUSE_OPT_Y_COORDINATE);
|
||||
speedo.waferX = (speedo.waferX & BIT(8)) ? (speedo.waferX - 512) : speedo.waferX;
|
||||
}
|
||||
|
||||
}
|
||||
} // namespace board
|
||||
@@ -37,4 +37,4 @@ namespace board {
|
||||
void ReadFuses(FuseData &speedo, u64 fuseVa);
|
||||
void SetGpuBracket(u16 gpuSpeedo, u8 &gpuBracket);
|
||||
|
||||
}
|
||||
} // namespace board
|
||||
@@ -24,22 +24,24 @@
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#include <switch.h>
|
||||
#include <algorithm>
|
||||
#include <battery.h>
|
||||
#include <hocclk.h>
|
||||
#include "../hos/apm_ext.h"
|
||||
#include <i2c.h>
|
||||
#include <t210.h>
|
||||
#include <math.h>
|
||||
#include <max17050.h>
|
||||
#include <minIni.h>
|
||||
#include <numeric>
|
||||
#include <switch.h>
|
||||
#include <t210.h>
|
||||
#include <tmp451.h>
|
||||
|
||||
#include "../hos/apm_ext.h"
|
||||
#include "board.hpp"
|
||||
#include "board_misc.hpp"
|
||||
#include <ipc_server.h>
|
||||
#include <lockable_mutex.h>
|
||||
#include <algorithm>
|
||||
#include <math.h>
|
||||
#include <numeric>
|
||||
#include <minIni.h>
|
||||
#include <battery.h>
|
||||
#include "board_misc.hpp"
|
||||
#include "board.hpp"
|
||||
|
||||
|
||||
namespace board {
|
||||
|
||||
@@ -61,23 +63,24 @@ namespace board {
|
||||
constexpr double Systemtickfrequency = 19200000.0 * (static_cast<double>(CpuTimeOutNs) / 1'000'000'000.0);
|
||||
|
||||
void GpuLoadThread(void *ptr) {
|
||||
#define gpu_samples_average 8
|
||||
#define NVGPU_GPU_IOCTL_PMU_GET_GPU_LOAD 0x80044715
|
||||
uint32_t gpu_load_array[gpu_samples_average] = {0};
|
||||
#define gpu_samples_average 8
|
||||
#define NVGPU_GPU_IOCTL_PMU_GET_GPU_LOAD 0x80044715
|
||||
uint32_t gpu_load_array[gpu_samples_average] = { 0 };
|
||||
size_t i = 0;
|
||||
if (R_SUCCEEDED(nvCheck_load)) do {
|
||||
u32 temp;
|
||||
if (R_SUCCEEDED(nvIoctl(_fd, NVGPU_GPU_IOCTL_PMU_GET_GPU_LOAD, &temp))) {
|
||||
gpu_load_array[i++ % gpu_samples_average] = temp;
|
||||
gpuLoad = std::accumulate(&gpu_load_array[0], &gpu_load_array[gpu_samples_average], 0) / gpu_samples_average;
|
||||
}
|
||||
svcSleepThread(16'666'000); // wait a bit (this is the perfect amount of time to keep the reading accurate)
|
||||
} while(true);
|
||||
if (R_SUCCEEDED(nvCheck_load))
|
||||
do {
|
||||
u32 temp;
|
||||
if (R_SUCCEEDED(nvIoctl(_fd, NVGPU_GPU_IOCTL_PMU_GET_GPU_LOAD, &temp))) {
|
||||
gpu_load_array[i++ % gpu_samples_average] = temp;
|
||||
gpuLoad = std::accumulate(&gpu_load_array[0], &gpu_load_array[gpu_samples_average], 0) / gpu_samples_average;
|
||||
}
|
||||
svcSleepThread(16'666'000); // wait a bit (this is the perfect amount of time to keep the reading accurate)
|
||||
} while (true);
|
||||
}
|
||||
|
||||
void CheckCore(void *idletickPtr) {
|
||||
u64* idletick = static_cast<u64 *>(idletickPtr);
|
||||
while(true) {
|
||||
u64 *idletick = static_cast<u64 *>(idletickPtr);
|
||||
while (true) {
|
||||
u64 idletickA;
|
||||
u64 idletickB;
|
||||
svcGetInfo(&idletickB, InfoType_IdleTickCount, INVALID_HANDLE, -1);
|
||||
@@ -107,11 +110,11 @@ namespace board {
|
||||
float cpuUsage0 = std::clamp(((Systemtickfrequency - idletick0) / static_cast<double>(Systemtickfrequency)) * 1000.0, 0.0, 1000.0);
|
||||
float cpuUsage1 = std::clamp(((Systemtickfrequency - idletick1) / static_cast<double>(Systemtickfrequency)) * 1000.0, 0.0, 1000.0);
|
||||
float cpuUsage2 = std::clamp(((Systemtickfrequency - idletick2) / static_cast<double>(Systemtickfrequency)) * 1000.0, 0.0, 1000.0);
|
||||
return std::round(std::max({cpuUsage0, cpuUsage1, cpuUsage2}));
|
||||
return std::round(std::max({ cpuUsage0, cpuUsage1, cpuUsage2 }));
|
||||
}
|
||||
|
||||
u32 GetPartLoad(HocClkPartLoad loadSource) {
|
||||
switch(loadSource) {
|
||||
switch (loadSource) {
|
||||
case HocClkPartLoad_EMC:
|
||||
return t210EmcLoadAll();
|
||||
case HocClkPartLoad_EMCCpu:
|
||||
@@ -148,9 +151,9 @@ namespace board {
|
||||
}
|
||||
|
||||
namespace {
|
||||
constexpr u32 NVschedCtrlEnable = 0x00000601;
|
||||
constexpr u32 NVschedCtrlEnable = 0x00000601;
|
||||
constexpr u32 NVschedCtrlDisable = 0x00000602;
|
||||
}
|
||||
} // namespace
|
||||
|
||||
void SetGpuSchedulingMode(GpuSchedulingMode mode, GpuSchedulingOverrideMethod method) {
|
||||
if (R_FAILED(nvCheckSched) && method == GpuSchedulingOverrideMethod_NvService) {
|
||||
@@ -160,7 +163,8 @@ namespace board {
|
||||
u32 temp;
|
||||
bool enabled = false;
|
||||
switch (mode) {
|
||||
case GpuSchedulingMode_DoNotOverride: break;
|
||||
case GpuSchedulingMode_DoNotOverride:
|
||||
break;
|
||||
case GpuSchedulingMode_Disabled:
|
||||
if (method == GpuSchedulingOverrideMethod_NvService) {
|
||||
nvIoctl(_fd2, NVschedCtrlDisable, &temp);
|
||||
@@ -198,4 +202,4 @@ namespace board {
|
||||
nvCheckSched = nvSched;
|
||||
}
|
||||
|
||||
}
|
||||
} // namespace board
|
||||
@@ -25,8 +25,9 @@
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#include <switch.h>
|
||||
#include <hocclk.h>
|
||||
#include <switch.h>
|
||||
|
||||
|
||||
namespace board {
|
||||
|
||||
@@ -37,4 +38,4 @@ namespace board {
|
||||
void SchedSetFD2(u32 fd2);
|
||||
void NvSchedSucceed(Result nvSched);
|
||||
|
||||
}
|
||||
} // namespace board
|
||||
@@ -24,9 +24,9 @@
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#include <switch.h>
|
||||
#include <pwm.h>
|
||||
#include <cmath>
|
||||
#include <pwm.h>
|
||||
#include <switch.h>
|
||||
|
||||
namespace board {
|
||||
|
||||
@@ -68,4 +68,4 @@ namespace board {
|
||||
threadClose(&miscThread);
|
||||
}
|
||||
|
||||
}
|
||||
} // namespace board
|
||||
@@ -26,9 +26,9 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <switch.h>
|
||||
#include <hocclk.h>
|
||||
#include <pwm.h>
|
||||
#include <switch.h>
|
||||
|
||||
namespace board {
|
||||
|
||||
@@ -36,4 +36,4 @@ namespace board {
|
||||
void ExitMiscThread();
|
||||
u8 GetFanLevel();
|
||||
|
||||
}
|
||||
} // namespace board
|
||||
@@ -24,8 +24,9 @@
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#include <switch.h>
|
||||
#include <hocclk.h>
|
||||
#include <switch.h>
|
||||
|
||||
#include "board.hpp"
|
||||
|
||||
namespace board {
|
||||
@@ -50,4 +51,4 @@ namespace board {
|
||||
return hocclkFormatPowerSensor(sensor, pretty);
|
||||
}
|
||||
|
||||
}
|
||||
} // namespace board
|
||||
@@ -25,8 +25,8 @@
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#include <switch.h>
|
||||
#include <hocclk.h>
|
||||
#include <switch.h>
|
||||
|
||||
namespace board {
|
||||
|
||||
@@ -35,4 +35,4 @@ namespace board {
|
||||
const char *GetThermalSensorName(HocClkThermalSensor sensor, bool pretty);
|
||||
const char *GetPowerSensorName(HocClkPowerSensor sensor, bool pretty);
|
||||
|
||||
}
|
||||
} // namespace board
|
||||
@@ -24,16 +24,17 @@
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#include <switch.h>
|
||||
#include <hocclk.h>
|
||||
#include "../hos/apm_ext.h"
|
||||
#include <i2c.h>
|
||||
#include <t210.h>
|
||||
#include <max17050.h>
|
||||
#include <switch.h>
|
||||
#include <t210.h>
|
||||
#include <tmp451.h>
|
||||
|
||||
#include "../hos/apm_ext.h"
|
||||
#include "board.hpp"
|
||||
#include <ipc_server.h>
|
||||
#include <lockable_mutex.h>
|
||||
#include "board.hpp"
|
||||
|
||||
namespace board {
|
||||
|
||||
@@ -60,4 +61,4 @@ namespace board {
|
||||
return HocClkProfile_Handheld;
|
||||
}
|
||||
|
||||
}
|
||||
} // namespace board
|
||||
@@ -28,7 +28,5 @@
|
||||
#include <hocclk.h>
|
||||
|
||||
namespace board {
|
||||
|
||||
HocClkProfile GetProfile();
|
||||
|
||||
}
|
||||
@@ -24,24 +24,26 @@
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#include <hocclk.h>
|
||||
#include <switch.h>
|
||||
#include "../hos/apm_ext.h"
|
||||
#include <i2c.h>
|
||||
#include "../i2c/i2cDrv.h"
|
||||
#include <t210.h>
|
||||
#include <max17050.h>
|
||||
#include <tmp451.h>
|
||||
#include <ipc_server.h>
|
||||
#include <lockable_mutex.h>
|
||||
#include <cmath>
|
||||
#include <battery.h>
|
||||
#include <cmath>
|
||||
#include <hocclk.h>
|
||||
#include <i2c.h>
|
||||
#include <max17050.h>
|
||||
#include <pwm.h>
|
||||
#include "board.hpp"
|
||||
#include "../tsensor/soctherm.hpp"
|
||||
#include <switch.h>
|
||||
#include <t210.h>
|
||||
#include <tmp451.h>
|
||||
|
||||
#include "../file/config.hpp"
|
||||
#include "../hos/apm_ext.h"
|
||||
#include "../i2c/i2cDrv.h"
|
||||
#include "../tsensor/aotag.hpp"
|
||||
#include "../tsensor/bq24193.hpp"
|
||||
#include "../file/config.hpp"
|
||||
#include "../tsensor/soctherm.hpp"
|
||||
#include "board.hpp"
|
||||
#include <ipc_server.h>
|
||||
#include <lockable_mutex.h>
|
||||
|
||||
|
||||
namespace board {
|
||||
|
||||
@@ -52,7 +54,7 @@ namespace board {
|
||||
tsensor::TSensorTemps temps = {};
|
||||
tsensor::ReadTSensors(temps);
|
||||
|
||||
switch(sensor) {
|
||||
switch (sensor) {
|
||||
case HocClkThermalSensor_SOC: {
|
||||
millis = tmp451TempSoc();
|
||||
break;
|
||||
@@ -127,4 +129,4 @@ namespace board {
|
||||
return 0;
|
||||
}
|
||||
|
||||
}
|
||||
} // namespace board
|
||||
@@ -33,4 +33,4 @@ namespace board {
|
||||
s32 GetTemperatureMilli(HocClkThermalSensor sensor);
|
||||
s32 GetPowerMw(HocClkPowerSensor sensor);
|
||||
|
||||
}
|
||||
} // namespace board
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* Copyright (c) Souldbminer, Lightos_ and Horizon OC Contributors
|
||||
*
|
||||
*
|
||||
* Copyright (c) B3711
|
||||
*
|
||||
*
|
||||
* 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.
|
||||
@@ -17,22 +17,24 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include <switch.h>
|
||||
#include <battery.h>
|
||||
#include <cstring>
|
||||
#include <hocclk.h>
|
||||
#include <memmem.h>
|
||||
#include <registers.h>
|
||||
#include <cstring>
|
||||
#include <battery.h>
|
||||
#include <switch.h>
|
||||
|
||||
#include "../file/file_utils.hpp"
|
||||
#include "../hos/rgltr.h"
|
||||
#include "../i2c/i2cDrv.h"
|
||||
#include "board.hpp"
|
||||
#include "board_freq.hpp"
|
||||
#include "board_volt.hpp"
|
||||
#include "../file/file_utils.hpp"
|
||||
#include "../i2c/i2cDrv.h"
|
||||
#include "../hos/rgltr.h"
|
||||
|
||||
namespace board {
|
||||
|
||||
GpuVoltData voltData = {};
|
||||
u32 cpuVoltTable[32] = {}; // 32LUT
|
||||
u32 cpuVoltTable[32] = {}; // 32LUT
|
||||
u64 cldvfs;
|
||||
CpuDfllData cachedTune;
|
||||
|
||||
@@ -50,54 +52,30 @@ namespace board {
|
||||
u32 tune1_high;
|
||||
};
|
||||
|
||||
EristaCpuUvEntry eristaCpuUvTableLowBracket[6] = { // <2118 CPU speedo
|
||||
{0xFFEAD0FF, 0x25501d0},
|
||||
{0xffff, 0x27007ff},
|
||||
{0xefff, 0x27407ff},
|
||||
{0xdfff, 0x27807ff},
|
||||
{0xdfdf, 0x27a07ff},
|
||||
{0xcfdf, 0x37007ff},
|
||||
EristaCpuUvEntry eristaCpuUvTableLowBracket[6] = {
|
||||
// <2118 CPU speedo
|
||||
{ 0xFFEAD0FF, 0x25501d0 }, { 0xffff, 0x27007ff }, { 0xefff, 0x27407ff },
|
||||
{ 0xdfff, 0x27807ff }, { 0xdfdf, 0x27a07ff }, { 0xcfdf, 0x37007ff },
|
||||
};
|
||||
|
||||
EristaCpuUvEntry eristaCpuUvTableHighBracket[6] = {
|
||||
{0xFFEAD0FF, 0x20091d9},
|
||||
{0xffff, 0x27007ff},
|
||||
{0xefff, 0x27407ff},
|
||||
{0xdfff, 0x27807ff},
|
||||
{0xdfdf, 0x27a07ff},
|
||||
{0xcfdf, 0x37007ff},
|
||||
{ 0xFFEAD0FF, 0x20091d9 }, { 0xffff, 0x27007ff }, { 0xefff, 0x27407ff },
|
||||
{ 0xdfff, 0x27807ff }, { 0xdfdf, 0x27a07ff }, { 0xcfdf, 0x37007ff },
|
||||
};
|
||||
|
||||
MarikoCpuUvEntry marikoCpuUvLow[12] = {
|
||||
{0xffa0, 0xffff, 0x21107ff, 0},
|
||||
{0x0, 0xffdf, 0x21107ff, 0x27207ff},
|
||||
{0xffdf, 0xffdf, 0x21107ff, 0x27307ff},
|
||||
{0xffff, 0xffdf, 0x21107ff, 0x27407ff},
|
||||
{0x0, 0xffdf, 0x21607ff, 0x27707ff},
|
||||
{0x0, 0xffdf, 0x21607ff, 0x27807ff},
|
||||
{0x0, 0xdfff, 0x21607ff, 0x27b07ff},
|
||||
{0xdfff, 0xdfff, 0x21707ff, 0x27b07ff},
|
||||
{0xdfff, 0xdfff, 0x21707ff, 0x27c07ff},
|
||||
{0xdfff, 0xdfff, 0x21707ff, 0x27d07ff},
|
||||
{0xdfff, 0xdfff, 0x21707ff, 0x27e07ff},
|
||||
{0xdfff, 0xdfff, 0x21707ff, 0x27f07ff},
|
||||
{ 0xffa0, 0xffff, 0x21107ff, 0 }, { 0x0, 0xffdf, 0x21107ff, 0x27207ff }, { 0xffdf, 0xffdf, 0x21107ff, 0x27307ff },
|
||||
{ 0xffff, 0xffdf, 0x21107ff, 0x27407ff }, { 0x0, 0xffdf, 0x21607ff, 0x27707ff }, { 0x0, 0xffdf, 0x21607ff, 0x27807ff },
|
||||
{ 0x0, 0xdfff, 0x21607ff, 0x27b07ff }, { 0xdfff, 0xdfff, 0x21707ff, 0x27b07ff }, { 0xdfff, 0xdfff, 0x21707ff, 0x27c07ff },
|
||||
{ 0xdfff, 0xdfff, 0x21707ff, 0x27d07ff }, { 0xdfff, 0xdfff, 0x21707ff, 0x27e07ff }, { 0xdfff, 0xdfff, 0x21707ff, 0x27f07ff },
|
||||
};
|
||||
|
||||
MarikoCpuUvEntry marikoCpuUvHigh[12] = {
|
||||
{0x0, 0xffff, 0, 0},
|
||||
{0x0, 0xffdf, 0, 0x27207ff},
|
||||
{0x0, 0xffdf, 0, 0x27307ff},
|
||||
{0x0, 0xffdf, 0, 0x27407ff},
|
||||
{0x0, 0xffdf, 0, 0x27707ff},
|
||||
{0x0, 0xffdf, 0, 0x27807ff},
|
||||
{0x0, 0xdfff, 0, 0x27b07ff},
|
||||
{0x0, 0xdfff, 0, 0x27c07ff},
|
||||
{0x0, 0xdfff, 0, 0x27d07ff},
|
||||
{0x0, 0xdfff, 0, 0x27e07ff},
|
||||
{0x0, 0xdfff, 0, 0x27f07ff},
|
||||
{0x0, 0xdfff, 0, 0x27f07ff},
|
||||
{ 0x0, 0xffff, 0, 0 }, { 0x0, 0xffdf, 0, 0x27207ff }, { 0x0, 0xffdf, 0, 0x27307ff }, { 0x0, 0xffdf, 0, 0x27407ff },
|
||||
{ 0x0, 0xffdf, 0, 0x27707ff }, { 0x0, 0xffdf, 0, 0x27807ff }, { 0x0, 0xdfff, 0, 0x27b07ff }, { 0x0, 0xdfff, 0, 0x27c07ff },
|
||||
{ 0x0, 0xdfff, 0, 0x27d07ff }, { 0x0, 0xdfff, 0, 0x27e07ff }, { 0x0, 0xdfff, 0, 0x27f07ff }, { 0x0, 0xdfff, 0, 0x27f07ff },
|
||||
};
|
||||
}
|
||||
} // namespace
|
||||
|
||||
void CacheDfllData() {
|
||||
Result rc = QueryMemoryMapping(&cldvfs, CLDVFS_REGION_BASE, CLDVFS_REGION_SIZE);
|
||||
@@ -111,33 +89,33 @@ namespace board {
|
||||
|
||||
/* TODO: clean up this code. */
|
||||
void SetDfllTunings(u32 levelLow, u32 levelHigh, u32 tbreakPoint) {
|
||||
u32* tune0_ptr = reinterpret_cast<u32 *>(cldvfs + CL_DVFS_TUNE0_0);
|
||||
u32* tune1_ptr = reinterpret_cast<u32 *>(cldvfs + CL_DVFS_TUNE1_0);
|
||||
|
||||
u32 *tune0_ptr = reinterpret_cast<u32 *>(cldvfs + CL_DVFS_TUNE0_0);
|
||||
u32 *tune1_ptr = reinterpret_cast<u32 *>(cldvfs + CL_DVFS_TUNE1_0);
|
||||
|
||||
if (GetSocType() == HocClkSocType_Mariko) {
|
||||
if (GetHz(HocClkModule_CPU) < tbreakPoint && (levelLow || levelHigh)) {
|
||||
if (levelLow) {
|
||||
*tune0_ptr = marikoCpuUvLow[levelLow-1].tune0_low;
|
||||
*tune1_ptr = marikoCpuUvLow[levelLow-1].tune1_low;
|
||||
*tune0_ptr = marikoCpuUvLow[levelLow - 1].tune0_low;
|
||||
*tune1_ptr = marikoCpuUvLow[levelLow - 1].tune1_low;
|
||||
}
|
||||
return;
|
||||
} else {
|
||||
if (levelLow) {
|
||||
*tune0_ptr = marikoCpuUvLow[levelLow-1].tune0_low;
|
||||
*tune1_ptr = marikoCpuUvLow[levelLow-1].tune1_low;
|
||||
*tune0_ptr = marikoCpuUvLow[levelLow - 1].tune0_low;
|
||||
*tune1_ptr = marikoCpuUvLow[levelLow - 1].tune1_low;
|
||||
}
|
||||
if (levelHigh) {
|
||||
*tune0_ptr = marikoCpuUvHigh[levelHigh-1].tune0_high;
|
||||
*tune1_ptr = marikoCpuUvHigh[levelHigh-1].tune1_high;
|
||||
*tune0_ptr = marikoCpuUvHigh[levelHigh - 1].tune0_high;
|
||||
*tune1_ptr = marikoCpuUvHigh[levelHigh - 1].tune1_high;
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (GetHz(HocClkModule_CPU) < tbreakPoint || (!levelLow)) { // account for tbreak
|
||||
if (GetHz(HocClkModule_CPU) < tbreakPoint || (!levelLow)) { // account for tbreak
|
||||
*tune0_ptr = 0xCFFF;
|
||||
*tune1_ptr = 0xFF072201;
|
||||
return;
|
||||
} else if (GetHz(HocClkModule_CPU) >= tbreakPoint || (!levelHigh)) {
|
||||
*tune0_ptr = cachedTune.tune0High; // per console?
|
||||
*tune0_ptr = cachedTune.tune0High; // per console?
|
||||
*tune1_ptr = 0xFFF7FF3F;
|
||||
return;
|
||||
}
|
||||
@@ -210,9 +188,9 @@ namespace board {
|
||||
PcvPowerDomainId_Max77812_Dram = 0x3A000005, // vddq
|
||||
} PowerDomainId;
|
||||
*/
|
||||
/*
|
||||
Note: I think Nintendo's I2C driver (or my driver, but it looks correct to me)
|
||||
*/
|
||||
/*
|
||||
Note: I think Nintendo's I2C driver (or my driver, but it looks correct to me)
|
||||
*/
|
||||
u32 GetVoltage(HocClkVoltage voltage) {
|
||||
u32 out = 0;
|
||||
BatteryChargeInfo info;
|
||||
@@ -225,7 +203,7 @@ namespace board {
|
||||
out = I2c_BuckConverter_GetUvOut(&I2c_VDD2);
|
||||
break;
|
||||
case HocClkVoltage_CPU:
|
||||
if(GetSocType() == HocClkSocType_Mariko) {
|
||||
if (GetSocType() == HocClkSocType_Mariko) {
|
||||
out = I2c_BuckConverter_GetUvOut(&I2c_Mariko_CPU);
|
||||
} else {
|
||||
rgltrOpenSession(&s, PcvPowerDomainId_Max77621_Cpu);
|
||||
@@ -234,16 +212,16 @@ namespace board {
|
||||
}
|
||||
break;
|
||||
case HocClkVoltage_GPU:
|
||||
if(GetSocType() == HocClkSocType_Mariko) {
|
||||
if (GetSocType() == HocClkSocType_Mariko) {
|
||||
out = I2c_BuckConverter_GetUvOut(&I2c_Mariko_GPU);
|
||||
} else {
|
||||
rgltrOpenSession(&s, PcvPowerDomainId_Max77621_Gpu);
|
||||
rgltrGetVoltage(&s, &out);
|
||||
rgltrCloseSession(&s);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case HocClkVoltage_EMCVDDQ:
|
||||
if(GetSocType() == HocClkSocType_Mariko) {
|
||||
if (GetSocType() == HocClkSocType_Mariko) {
|
||||
out = I2c_BuckConverter_GetUvOut(&I2c_Mariko_DRAM_VDDQ);
|
||||
} else {
|
||||
out = I2c_BuckConverter_GetUvOut(&I2c_VDD2);
|
||||
@@ -266,8 +244,8 @@ namespace board {
|
||||
Handle GetPcvHandle() {
|
||||
constexpr u64 PcvID = 0x10000000000001a;
|
||||
u64 processIDList[80]{};
|
||||
s32 processCount = 0;
|
||||
Handle handle = INVALID_HANDLE;
|
||||
s32 processCount = 0;
|
||||
Handle handle = INVALID_HANDLE;
|
||||
|
||||
DebugEventInfo debugEvent{};
|
||||
|
||||
@@ -306,9 +284,9 @@ namespace board {
|
||||
void CacheGpuVoltTable() {
|
||||
// Likely CPU regulator?
|
||||
UnkRegulator reg = {
|
||||
.voltageMin = 600000,
|
||||
.voltageMin = 600000,
|
||||
.voltageStep = 12500,
|
||||
.voltageMax = 1400000,
|
||||
.voltageMax = 1400000,
|
||||
};
|
||||
|
||||
Handle handle = GetPcvHandle();
|
||||
@@ -365,17 +343,17 @@ namespace board {
|
||||
}
|
||||
|
||||
constexpr u32 CpuVoltageTableOffset = 0xB8;
|
||||
std::memcpy(cpuVoltTable, &buffer[index + CpuVoltageTableOffset], sizeof(cpuVoltTable)); // TODO: verify the CPU table
|
||||
std::memcpy(cpuVoltTable, &buffer[index + CpuVoltageTableOffset], sizeof(cpuVoltTable)); // TODO: verify the CPU table
|
||||
|
||||
svcCloseHandle(handle);
|
||||
handle = INVALID_HANDLE;
|
||||
|
||||
// Print info AFTER we exit the handle to avoid hangs
|
||||
for(int i = 0; i < (int)std::size(cpuVoltTable); ++i) {
|
||||
for (int i = 0; i < (int)std::size(cpuVoltTable); ++i) {
|
||||
fileUtils::LogLine("[dvfs] cpu volt %d: %u mV", i, cpuVoltTable[i]);
|
||||
}
|
||||
|
||||
for(int i = 0; i < (int)std::size(voltData.voltTable); ++i) {
|
||||
for (int i = 0; i < (int)std::size(voltData.voltTable); ++i) {
|
||||
fileUtils::LogLine("[dvfs] gpu volt %d: %u mV", i, voltData.voltTable[0][i]);
|
||||
}
|
||||
return;
|
||||
@@ -420,35 +398,50 @@ namespace board {
|
||||
|
||||
u32 GetMinimumGpuVmin(u32 freqMhz, u32 bracket) {
|
||||
u32 baseVolt = 800;
|
||||
if(GetSocType() == HocClkSocType_Mariko) {
|
||||
if (GetSocType() == HocClkSocType_Mariko) {
|
||||
static const u32 ramTable[][22] = {
|
||||
{ 2133, 2200, 2266, 2300, 2366, 2400, 2433, 2466, 2533, 2566, 2600, 2633, 2700, 2733, 2766, 2833, 2866, 2900, 2933, 3033, 3066, 3100, }, // Bracket 0
|
||||
{ 2300, 2366, 2433, 2466, 2533, 2566, 2633, 2700, 2733, 2800, 2833, 2900, 2933, 2966, 3033, 3066, 3100, 3133, 3166, 3200, 3233, 3266, }, // Bracket 1
|
||||
{ 2433, 2466, 2533, 2566, 2600, 2666, 2766, 2800, 2833, 2866, 2933, 2966, 3033, 3066, 3100, 3133, 3166, 3200, 3233, 3300, 3333, 3366, }, // Bracket 2
|
||||
{ 2500, 2533, 2600, 2633, 2666, 2733, 2800, 2866, 2900, 2966, 3033, 3100, 3166, 3200, 3233, 3266, 3300, 3333, 3366, 3400, 3400, 3400, }, // Bracket 3
|
||||
{
|
||||
2133, 2200, 2266, 2300, 2366, 2400, 2433, 2466, 2533, 2566, 2600,
|
||||
2633, 2700, 2733, 2766, 2833, 2866, 2900, 2933, 3033, 3066, 3100,
|
||||
}, // Bracket 0
|
||||
{
|
||||
2300, 2366, 2433, 2466, 2533, 2566, 2633, 2700, 2733, 2800, 2833,
|
||||
2900, 2933, 2966, 3033, 3066, 3100, 3133, 3166, 3200, 3233, 3266,
|
||||
}, // Bracket 1
|
||||
{
|
||||
2433, 2466, 2533, 2566, 2600, 2666, 2766, 2800, 2833, 2866, 2933,
|
||||
2966, 3033, 3066, 3100, 3133, 3166, 3200, 3233, 3300, 3333, 3366,
|
||||
}, // Bracket 2
|
||||
{
|
||||
2500, 2533, 2600, 2633, 2666, 2733, 2800, 2866, 2900, 2966, 3033,
|
||||
3100, 3166, 3200, 3233, 3266, 3300, 3333, 3366, 3400, 3400, 3400,
|
||||
}, // Bracket 3
|
||||
};
|
||||
|
||||
static const u32 gpuVoltArray[] = { 590, 600, 610, 620, 630, 640, 650, 660, 670, 680, 690, 700, 710, 720, 730, 740, 750, 760, 770, 780, 790, 800, };
|
||||
static const u32 gpuVoltArray[] = {
|
||||
590, 600, 610, 620, 630, 640, 650, 660, 670, 680, 690, 700, 710, 720, 730, 740, 750, 760, 770, 780, 790, 800,
|
||||
};
|
||||
|
||||
if (freqMhz <= 1600) return 0; // DVFS doesnt work below 1600MHz, it will just use vMin
|
||||
if (bracket >= std::size(ramTable)) bracket = 0;
|
||||
if (freqMhz <= 1600)
|
||||
return 0; // DVFS doesnt work below 1600MHz, it will just use vMin
|
||||
if (bracket >= std::size(ramTable))
|
||||
bracket = 0;
|
||||
|
||||
u32 bracketStart = ramTable[bracket][0];
|
||||
|
||||
|
||||
u32 rampStartVolt = (bracket == 0) ? 535 : 525; // Do not touch!
|
||||
u32 rampSpan = 590 - rampStartVolt;
|
||||
|
||||
u32 rampStartVolt = (bracket == 0) ? 535 : 525; // Do not touch!
|
||||
u32 rampSpan = 590 - rampStartVolt;
|
||||
|
||||
if (freqMhz >= 1633 && freqMhz < bracketStart) {
|
||||
u32 raw = rampStartVolt + ((freqMhz - 1633) * rampSpan) / (bracketStart - 1633);
|
||||
u32 volt = ((raw + 2) / 5) * 5;
|
||||
if (volt < rampStartVolt) volt = rampStartVolt;
|
||||
if (volt > 590) volt = 590;
|
||||
if (volt < rampStartVolt)
|
||||
volt = rampStartVolt;
|
||||
if (volt > 590)
|
||||
volt = 590;
|
||||
return volt;
|
||||
}
|
||||
|
||||
|
||||
baseVolt = gpuVoltArray[std::size(gpuVoltArray) - 1];
|
||||
for (u32 i = 0; i < std::size(gpuVoltArray); ++i) {
|
||||
if (freqMhz <= ramTable[bracket][i]) {
|
||||
@@ -457,27 +450,104 @@ namespace board {
|
||||
}
|
||||
}
|
||||
} else {
|
||||
struct DvfsEntry { u32 freq; u32 volt; };
|
||||
struct DvfsEntry {
|
||||
u32 freq;
|
||||
u32 volt;
|
||||
};
|
||||
static const DvfsEntry ramTable[][19] = {
|
||||
{ {1733,725}, {1800,730}, {1866,735}, {1920,740}, {1958,745}, {1996,750}, {2035,755}, {2073,760}, {2112,765}, {2131,770}, {2150,775}, {2169,780}, {2188,785}, {2227,790}, {2265,795}, {2304,800}, {2342,805}, {2380,810}, {2400,815} }, // Bracket 0
|
||||
{ {1733,715}, {1800,720}, {1866,725}, {1920,730}, {1958,735}, {1996,740}, {2035,745}, {2073,750}, {2112,755}, {2131,760}, {2150,765}, {2169,770}, {2188,775}, {2227,780}, {2265,785}, {2304,790}, {2342,795}, {2380,800}, {2400,805} }, // Bracket 1
|
||||
{ {1733,705}, {1800,710}, {1866,715}, {1920,720}, {1958,725}, {1996,730}, {2035,735}, {2073,740}, {2112,745}, {2131,750}, {2150,755}, {2169,760}, {2188,765}, {2227,770}, {2265,775}, {2304,780}, {2342,785}, {2380,790}, {2400,795} }, // Bracket 2
|
||||
{ {1733,695}, {1800,700}, {1866,705}, {1920,710}, {1958,715}, {1996,720}, {2035,725}, {2073,730}, {2112,735}, {2131,740}, {2150,745}, {2169,750}, {2188,755}, {2227,760}, {2265,765}, {2304,770}, {2342,775}, {2380,780}, {2400,785} }, // Bracket 3
|
||||
{ { 1733, 725 },
|
||||
{ 1800, 730 },
|
||||
{ 1866, 735 },
|
||||
{ 1920, 740 },
|
||||
{ 1958, 745 },
|
||||
{ 1996, 750 },
|
||||
{ 2035, 755 },
|
||||
{ 2073, 760 },
|
||||
{ 2112, 765 },
|
||||
{ 2131, 770 },
|
||||
{ 2150, 775 },
|
||||
{ 2169, 780 },
|
||||
{ 2188, 785 },
|
||||
{ 2227, 790 },
|
||||
{ 2265, 795 },
|
||||
{ 2304, 800 },
|
||||
{ 2342, 805 },
|
||||
{ 2380, 810 },
|
||||
{ 2400, 815 } }, // Bracket 0
|
||||
{ { 1733, 715 },
|
||||
{ 1800, 720 },
|
||||
{ 1866, 725 },
|
||||
{ 1920, 730 },
|
||||
{ 1958, 735 },
|
||||
{ 1996, 740 },
|
||||
{ 2035, 745 },
|
||||
{ 2073, 750 },
|
||||
{ 2112, 755 },
|
||||
{ 2131, 760 },
|
||||
{ 2150, 765 },
|
||||
{ 2169, 770 },
|
||||
{ 2188, 775 },
|
||||
{ 2227, 780 },
|
||||
{ 2265, 785 },
|
||||
{ 2304, 790 },
|
||||
{ 2342, 795 },
|
||||
{ 2380, 800 },
|
||||
{ 2400, 805 } }, // Bracket 1
|
||||
{ { 1733, 705 },
|
||||
{ 1800, 710 },
|
||||
{ 1866, 715 },
|
||||
{ 1920, 720 },
|
||||
{ 1958, 725 },
|
||||
{ 1996, 730 },
|
||||
{ 2035, 735 },
|
||||
{ 2073, 740 },
|
||||
{ 2112, 745 },
|
||||
{ 2131, 750 },
|
||||
{ 2150, 755 },
|
||||
{ 2169, 760 },
|
||||
{ 2188, 765 },
|
||||
{ 2227, 770 },
|
||||
{ 2265, 775 },
|
||||
{ 2304, 780 },
|
||||
{ 2342, 785 },
|
||||
{ 2380, 790 },
|
||||
{ 2400, 795 } }, // Bracket 2
|
||||
{ { 1733, 695 },
|
||||
{ 1800, 700 },
|
||||
{ 1866, 705 },
|
||||
{ 1920, 710 },
|
||||
{ 1958, 715 },
|
||||
{ 1996, 720 },
|
||||
{ 2035, 725 },
|
||||
{ 2073, 730 },
|
||||
{ 2112, 735 },
|
||||
{ 2131, 740 },
|
||||
{ 2150, 745 },
|
||||
{ 2169, 750 },
|
||||
{ 2188, 755 },
|
||||
{ 2227, 760 },
|
||||
{ 2265, 765 },
|
||||
{ 2304, 770 },
|
||||
{ 2342, 775 },
|
||||
{ 2380, 780 },
|
||||
{ 2400, 785 } }, // Bracket 3
|
||||
};
|
||||
|
||||
if (freqMhz <= 1600) return 0; // DVFS doesnt work below 1600MHz, it will just use vMin
|
||||
if (bracket >= std::size(ramTable)) bracket = 0;
|
||||
if (freqMhz <= 1600)
|
||||
return 0; // DVFS doesnt work below 1600MHz, it will just use vMin
|
||||
if (bracket >= std::size(ramTable))
|
||||
bracket = 0;
|
||||
|
||||
const auto& entries = ramTable[bracket];
|
||||
const auto &entries = ramTable[bracket];
|
||||
baseVolt = entries[std::size(entries) - 1].volt;
|
||||
for (const auto& entry : entries) {
|
||||
for (const auto &entry : entries) {
|
||||
if (freqMhz <= entry.freq) {
|
||||
baseVolt = entry.volt;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return baseVolt;
|
||||
}
|
||||
}
|
||||
} // namespace board
|
||||
@@ -16,8 +16,9 @@
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#include <switch.h>
|
||||
#include <hocclk.h>
|
||||
#include <switch.h>
|
||||
|
||||
|
||||
namespace board {
|
||||
|
||||
@@ -37,9 +38,9 @@ namespace board {
|
||||
u32 tune0High;
|
||||
u32 tune1Low;
|
||||
u32 tune1High;
|
||||
// u32 tune_high_min_millivolts;
|
||||
// u32 tune_high_margin_millivolts;
|
||||
// u64 dvco_calibration_max;
|
||||
// u32 tune_high_min_millivolts;
|
||||
// u32 tune_high_margin_millivolts;
|
||||
// u64 dvco_calibration_max;
|
||||
};
|
||||
|
||||
void SetDfllTunings(u32 levelLow, u32 levelHigh, u32 tbreakPoint);
|
||||
@@ -50,4 +51,4 @@ namespace board {
|
||||
void PcvHijackGpuVolts(u32 vmin);
|
||||
u32 GetMinimumGpuVmin(u32 freqMhz, u32 bracket);
|
||||
|
||||
}
|
||||
} // namespace board
|
||||
Reference in new issue
Block a user