Add cpu load, thanks masa for the help!

This commit is contained in:
Lightos1
2026-02-14 21:47:25 +01:00
parent 26cf028f2d
commit d57fccc463
5 changed files with 90 additions and 81 deletions

View File

@@ -102,7 +102,7 @@ typedef enum
SysClkPartLoad_EMC = 0, SysClkPartLoad_EMC = 0,
SysClkPartLoad_EMCCpu, SysClkPartLoad_EMCCpu,
HocClkPartLoad_GPU, HocClkPartLoad_GPU,
HocClkPartLoad_CPUAvg, HocClkPartLoad_CPUMax,
HocClkPartLoad_BAT, HocClkPartLoad_BAT,
HocClkPartLoad_FAN, HocClkPartLoad_FAN,
SysClkPartLoad_EnumMax SysClkPartLoad_EnumMax

View File

@@ -107,7 +107,7 @@ void BaseMenuGui::preDraw(tsl::gfx::Renderer* renderer) {
y = 149; // Direct assignment (129 + 20) y = 149; // Direct assignment (129 + 20)
// renderer->drawString(displayStrings[19], false, positions[2], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // CPU Usage renderer->drawString(displayStrings[19], false, positions[2], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // CPU Usage
renderer->drawString(displayStrings[17], false, positions[3], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // GPU Usage renderer->drawString(displayStrings[17], false, positions[3], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // GPU Usage
renderer->drawString(displayStrings[18], false, positions[4], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // RAM Usage renderer->drawString(displayStrings[18], false, positions[4], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // RAM Usage
@@ -264,10 +264,9 @@ void BaseMenuGui::refresh()
sprintf(displayStrings[15], "%d mW", context->power[0]); // Now sprintf(displayStrings[15], "%d mW", context->power[0]); // Now
sprintf(displayStrings[16], "%d mW", context->power[1]); // Avg sprintf(displayStrings[16], "%d mW", context->power[1]); // Avg
sprintf(displayStrings[17], "%u%%", context->partLoad[HocClkPartLoad_GPU] / 10); sprintf(displayStrings[17], "%u%%", context->partLoad[HocClkPartLoad_GPU] / 10);
sprintf(displayStrings[18], "%u%%", context->partLoad[SysClkPartLoad_EMC] / 10); sprintf(displayStrings[18], "%u%%", context->partLoad[SysClkPartLoad_EMC] / 10);
// sprintf(displayStrings[19], "%u", context->partLoad[HocClkPartLoad_CPUAvg]); sprintf(displayStrings[19], "%u%%", context->partLoad[HocClkPartLoad_CPUMax] / 10);
millis = context->temps[HorizonOCThermalSensor_Battery]; // Battery millis = context->temps[HorizonOCThermalSensor_Battery]; // Battery
sprintf(displayStrings[20], "%u.%u °C", millis / 1000U, (millis % 1000U) / 100U); sprintf(displayStrings[20], "%u.%u °C", millis / 1000U, (millis % 1000U) / 100U);

View File

@@ -4,7 +4,7 @@
"title_id_range_min": "0x00FF0000636C6BFF", "title_id_range_min": "0x00FF0000636C6BFF",
"title_id_range_max": "0x00FF0000636C6BFF", "title_id_range_max": "0x00FF0000636C6BFF",
"main_thread_stack_size": "0x00008000", "main_thread_stack_size": "0x00008000",
"main_thread_priority": 63, "main_thread_priority": 16,
"default_cpu_id": 3, "default_cpu_id": 3,
"process_category": 0, "process_category": 0,
"is_retail": true, "is_retail": true,
@@ -25,7 +25,7 @@
"type": "kernel_flags", "type": "kernel_flags",
"value": { "value": {
"highest_thread_priority": 63, "highest_thread_priority": 63,
"lowest_thread_priority": 41, "lowest_thread_priority": 16,
"lowest_cpu_id": 0, "lowest_cpu_id": 0,
"highest_cpu_id": 3 "highest_cpu_id": 3
} }

View File

@@ -66,11 +66,12 @@
#define HOSSVC_HAS_TC (hosversionAtLeast(5,0,0)) #define HOSSVC_HAS_TC (hosversionAtLeast(5,0,0))
#define NVGPU_GPU_IOCTL_PMU_GET_GPU_LOAD 0x80044715 #define NVGPU_GPU_IOCTL_PMU_GET_GPU_LOAD 0x80044715
#define systemtickfrequency 19200000 constexpr u64 CpuTimeOutNs = 500'000'000;
#define systemtickfrequencyF 19200000.0f constexpr double Systemtickfrequency = 19200000.0 * (static_cast<double>(CpuTimeOutNs) / 1'000'000'000.0);
#define CPU_TICK_WAIT (1'000'000'000 / 60)
Result nvCheck = 1; Result nvCheck = 1;
LEvent threadexit;
Thread gpuLThread; Thread gpuLThread;
Thread cpuCore0Thread; Thread cpuCore0Thread;
Thread cpuCore1Thread; Thread cpuCore1Thread;
@@ -91,10 +92,11 @@ BatteryChargeInfo info;
static SysClkSocType g_socType = SysClkSocType_Erista; static SysClkSocType g_socType = SysClkSocType_Erista;
static HorizonOCConsoleType g_consoleType = HorizonOCConsoleType_Iowa; static HorizonOCConsoleType g_consoleType = HorizonOCConsoleType_Iowa;
std::atomic<uint64_t> idletick0{systemtickfrequency}; u64 idletick0 = 0;
std::atomic<uint64_t> idletick1{systemtickfrequency}; u64 idletick1 = 0;
std::atomic<uint64_t> idletick2{systemtickfrequency}; u64 idletick2 = 0;
std::atomic<uint64_t> idletick3{systemtickfrequency}; // u64 idletick3 = 0;
u32 cpu0, cpu1, cpu2, cpu3, cpuAvg; u32 cpu0, cpu1, cpu2, cpu3, cpuAvg;
u16 cpuSpeedo0, cpuSpeedo2, socSpeedo0; // CPU, GPU, SOC u16 cpuSpeedo0, cpuSpeedo2, socSpeedo0; // CPU, GPU, SOC
u32 speedoBracket; u32 speedoBracket;
@@ -164,16 +166,16 @@ PcvModuleId Board::GetPcvModuleId(SysClkModule sysclkModule)
return pcvModuleId; return pcvModuleId;
} }
void CheckCore(void* idletick_ptr) { void CheckCore(void *idletickPtr) {
std::atomic<uint64_t>* idletick = (std::atomic<uint64_t>*)idletick_ptr; u64* idletick = static_cast<u64 *>(idletickPtr);
while (true) { while(true) {
uint64_t idletick_a; u64 idletickA;
uint64_t idletick_b; u64 idletickB;
svcGetInfo(&idletick_b, InfoType_IdleTickCount, INVALID_HANDLE, -1); svcGetInfo(&idletickB, InfoType_IdleTickCount, INVALID_HANDLE, -1);
svcSleepThread(CPU_TICK_WAIT); svcWaitForAddress(&threadexit, ArbitrationType_WaitIfEqual, 0, CpuTimeOutNs);
svcGetInfo(&idletick_a, InfoType_IdleTickCount, INVALID_HANDLE, -1); svcGetInfo(&idletickA, InfoType_IdleTickCount, INVALID_HANDLE, -1);
idletick->store(idletick_a - idletick_b, std::memory_order_release); *idletick = idletickA - idletickB;
} }
} }
void gpuLoadThread(void*) { void gpuLoadThread(void*) {
@@ -205,7 +207,6 @@ void miscThreadFunc(void*) {
} }
} }
void Board::Initialize() void Board::Initialize()
{ {
Result rc = 0; Result rc = 0;
@@ -253,17 +254,17 @@ void Board::Initialize()
threadCreate(&gpuLThread, gpuLoadThread, NULL, NULL, 0x1000, 0x3F, -2); threadCreate(&gpuLThread, gpuLoadThread, NULL, NULL, 0x1000, 0x3F, -2);
threadStart(&gpuLThread); threadStart(&gpuLThread);
leventClear(&threadexit);
threadCreate(&cpuCore0Thread, CheckCore, &idletick0, NULL, 0x500, 0x10, 0); threadCreate(&cpuCore0Thread, CheckCore, &idletick0, NULL, 0x1000, 0x10, 0);
threadCreate(&cpuCore1Thread, CheckCore, &idletick1, NULL, 0x500, 0x10, 1); threadCreate(&cpuCore1Thread, CheckCore, &idletick1, NULL, 0x1000, 0x10, 1);
threadCreate(&cpuCore2Thread, CheckCore, &idletick2, NULL, 0x500, 0x10, 2); threadCreate(&cpuCore2Thread, CheckCore, &idletick2, NULL, 0x1000, 0x10, 2);
threadCreate(&cpuCore3Thread, CheckCore, &idletick3, NULL, 0x500, 0x10, 3); // threadCreate(&cpuCore3Thread, CheckCore, &idletick3, NULL, 0x1000, 0x10, 3);
threadCreate(&miscThread, miscThreadFunc, NULL, NULL, 0x1000, 0x3F, 3); threadCreate(&miscThread, miscThreadFunc, NULL, NULL, 0x1000, 0x10, 3);
threadStart(&cpuCore0Thread); threadStart(&cpuCore0Thread);
threadStart(&cpuCore1Thread); threadStart(&cpuCore1Thread);
threadStart(&cpuCore2Thread); threadStart(&cpuCore2Thread);
threadStart(&cpuCore3Thread); // threadStart(&cpuCore3Thread);
threadStart(&miscThread); threadStart(&miscThread);
batteryInfoInitialize(); batteryInfoInitialize();
@@ -393,7 +394,7 @@ void Board::Exit()
threadClose(&cpuCore0Thread); threadClose(&cpuCore0Thread);
threadClose(&cpuCore1Thread); threadClose(&cpuCore1Thread);
threadClose(&cpuCore2Thread); threadClose(&cpuCore2Thread);
threadClose(&cpuCore3Thread); // threadClose(&cpuCore3Thread);
threadClose(&miscThread); threadClose(&miscThread);
pwmChannelSessionClose(&g_ICon); pwmChannelSessionClose(&g_ICon);
@@ -776,6 +777,15 @@ std::int32_t Board::GetPowerMw(SysClkPowerSensor sensor)
return 0; return 0;
} }
u32 GetMaxCpuLoad() {
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);
// float cpuUsage3 = std::clamp(((Systemtickfrequency - idletick3) / static_cast<double>(Systemtickfrequency)) * 1000.0, 0.0, 1000.0);
return std::round(std::max({cpuUsage0, cpuUsage1, cpuUsage2}));
}
std::uint32_t Board::GetPartLoad(SysClkPartLoad loadSource) std::uint32_t Board::GetPartLoad(SysClkPartLoad loadSource)
{ {
switch(loadSource) switch(loadSource)
@@ -786,8 +796,8 @@ std::uint32_t Board::GetPartLoad(SysClkPartLoad loadSource)
return t210EmcLoadCpu(); return t210EmcLoadCpu();
case HocClkPartLoad_GPU: case HocClkPartLoad_GPU:
return GPU_Load_u; return GPU_Load_u;
case HocClkPartLoad_CPUAvg: case HocClkPartLoad_CPUMax:
return idletick0; return GetMaxCpuLoad();
case HocClkPartLoad_BAT: case HocClkPartLoad_BAT:
batteryInfoGetChargeInfo(&info); batteryInfoGetChargeInfo(&info);
return info.RawBatteryCharge; return info.RawBatteryCharge;

View File

@@ -36,7 +36,7 @@
#include "process_management.h" #include "process_management.h"
#include "clock_manager.h" #include "clock_manager.h"
#include "ipc_service.h" #include "ipc_service.h"
#define INNER_HEAP_SIZE 0x30000 #define INNER_HEAP_SIZE 0x34000
extern "C" extern "C"
{ {