diff --git a/Source/hoc-clk/bpmpfw/out/bpmpfw.bin b/Source/hoc-clk/bpmpfw/out/bpmpfw.bin index 4681bab6..cf996ae1 100644 Binary files a/Source/hoc-clk/bpmpfw/out/bpmpfw.bin and b/Source/hoc-clk/bpmpfw/out/bpmpfw.bin differ diff --git a/Source/hoc-clk/sysmodule/src/board/board.cpp b/Source/hoc-clk/sysmodule/src/board/board.cpp index 049ec75a..692d83c5 100644 --- a/Source/hoc-clk/sysmodule/src/board/board.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board.cpp @@ -52,7 +52,7 @@ namespace board { - u64 clkVirtAddr, dsiVirtAddr, apbVirtAddr, fuseVirtAddr, sysVirtAddr, actmonVirtAddr; + u64 clkVirtAddr, dsiVirtAddr, apbVirtAddr, fuseVirtAddr, sysVirtAddr, actmonVirtAddr, gpuVirtAddr; HocClkSocType gSocType; u8 gDramID; @@ -157,6 +157,9 @@ namespace board { ASSERT_RESULT_OK(rc, "QueryMemoryMapping (sys)"); actmonVirtAddr = sysVirtAddr + 0x800; + rc = QueryMemoryMapping(&gpuVirtAddr, 0x57000000, 0x1000000); + ASSERT_RESULT_OK(rc, "QueryMemoryMapping (gpu)"); + FetchHardwareInfos(); Result nvCheck = 1; diff --git a/Source/hoc-clk/sysmodule/src/board/board.hpp b/Source/hoc-clk/sysmodule/src/board/board.hpp index 313400af..e1d57ea5 100644 --- a/Source/hoc-clk/sysmodule/src/board/board.hpp +++ b/Source/hoc-clk/sysmodule/src/board/board.hpp @@ -42,7 +42,7 @@ #define HOSSVC_HAS_TC (hosversionAtLeast(5, 0, 0)) namespace board { - extern u64 clkVirtAddr, dsiVirtAddr, apbVirtAddr, fuseVirtAddr, sysVirtAddr, actmonVirtAddr; + extern u64 clkVirtAddr, dsiVirtAddr, apbVirtAddr, fuseVirtAddr, sysVirtAddr, actmonVirtAddr, gpuVirtAddr; extern HocClkSocType gSocType; extern u8 gDramID; extern HocClkConsoleType gConsoleType; diff --git a/Source/hoc-clk/sysmodule/src/board/board_freq.cpp b/Source/hoc-clk/sysmodule/src/board/board_freq.cpp index 81128498..16e0f98c 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_freq.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_freq.cpp @@ -180,8 +180,27 @@ namespace board { switch (module) { case HocClkModule_CPU: return bpmp::GetSharedInfo()->freqCpu * 1000; - case HocClkModule_GPU: - return bpmp::GetSharedInfo()->freqGpu * 1000; + case HocClkModule_GPU: { + constexpr u32 ClkOutEnbX = 0x280; + constexpr u32 RstDevicesX = 0x28C; + constexpr u32 GpuBit = (1u << 24); + + const bool gpuEnabled = (*reinterpret_cast(clkVirtAddr + ClkOutEnbX) & GpuBit) && + !(*reinterpret_cast(clkVirtAddr + RstDevicesX) & GpuBit); + if (!gpuEnabled) { + return 0; + } + + const u32 coeff = *reinterpret_cast(gpuVirtAddr + 0x137004); + const u32 divm = coeff & 0xFF; + const u32 divn = (coeff >> 8) & 0xFF; + const u32 divp = (coeff >> 16) & 0x3F; + if (divm == 0 || divp == 0) { + return 0; + } + + return static_cast((static_cast(38400000) * divn) / (divm * divp) / 2); + } case HocClkModule_MEM: return config::GetConfigValue(HocClkConfigValue_MemoryFrequencyMeasurementMode) == MemoryFrequencyMeasurementMode_PLL ? pllmb::getRamClockRatePLLMB()