From a36d861e492b935a7a77bb908ad3b5ac902d94bc Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Wed, 26 Aug 2026 11:59:52 -0400 Subject: [PATCH] actually fix gpu real hz --- Source/hoc-clk/bpmpfw/out/bpmpfw.bin | Bin 5008 -> 4568 bytes Source/hoc-clk/sysmodule/src/board/board.cpp | 5 +++- Source/hoc-clk/sysmodule/src/board/board.hpp | 2 +- .../sysmodule/src/board/board_freq.cpp | 23 ++++++++++++++++-- 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/Source/hoc-clk/bpmpfw/out/bpmpfw.bin b/Source/hoc-clk/bpmpfw/out/bpmpfw.bin index 4681bab6323048e8d6d6b4642ca5e57ede0e4405..cf996ae1c5f7f84edd3eefaf94286bafe89673c1 100644 GIT binary patch delta 782 zcmYjP!Alfj6n`^2t?nW@trle=v$oV0l2a@cVlavaD+@P4q=PKjrQ2S*ba7?V?U1p{ z*P?{_g?w>?$y}$ z2<9hKOmzT;G8di0N8<<&K z(w>QL`f@U3mzij?NqHG`G#>x{Ow?mcBGxRV1`#hKn|dxGdW{P=$NOOTvdB4W0a882 z<}uFv$MxS4GsdF_@GP8>!A6e^e(AJ-g-YDeTy7*?&JkXjClL_MyA9iEM8%zAdx2Mm z#UEo}t}L6+smi(X0*BpRGv`(LU;s@)BUDWkl|d4jzN$=xWscEwa1j}A5XFZO-H!=A z*n+<&18Y!ld-9FH7N7U^q-xp{$7~rG))H^xz49S@oh`4#0zQVd&U4D4qbvhgIRLkR zkija*^g9`>TuS;8a4EaQKQTd7R26=!gY&-Ps33zK*dv%wx=?EIODYbEBxkJ9k3wyy z#A|Ab_9AEO<?QS=DlygQp>40chElU>`rS`rpuj#wlS~ND*W(w@ek9xgc#*M2k x^5&R+>riZ)BWKkf`K?_d>{Bg%?yn}syHY8_NgaiAngTfYhRJCGe5QdzoPT49LAC$@ delta 1242 zcmZ`&QD_`h6umP$O|vn&lWYWC3%*TlyF#_o8gS8wyXy*#wHUh4TErSt68h27r3eOp zcDHM@3Kb`P4b`BX7YHc*66049+=xHI3ZY*SBFtpGA8mf}C6ZRh^EO)vQXf3tz3<+8 z?tS;&v$EUW7f)GqXFv8wGx3s{&Ci@lnPO??gT2PRnfWIwtG35Qs&h+toU!YC*tx<6 zCBu7B)T8C1bCF*qTK}Fr{?nj!A{Bn;cs$%Mc?fY=5ht3G9mv9wOr7{{q85voG|Elr1vzOQkcO44=(cPgP@#6CE)}E!yP=Ii+p|>Z)eXxCY&|^O?dGiPOG*u8!f9#7JlD~MU=9_8# zk9dUmgqIMj?OLCM?WtyiE%7DyDiz$+HV3iaszBSGzFtwm=c%+GgE8YYIGgq`l`8xO zj&m>8d~G9F1p@amQo(+=(YAlBf#_sFxsj@aLWgp=M}d|z%~?kmT?(^c#fH#$TP$f$ zxvfH9Pr2Qh^2!4!q-oRClMdRLeYJ47zuuFgbp%2dO6f)6nT{z(pe@D@s|0X@V zJ?XZb58vl4fi6Y)+m7c&R7swojS-WYG?ptQXp<l zkB`3cPQEl!6yp<<=PyjWd`R&=lAa9dlMJ7+~lWyd&KHrQN_>!SU=^#+RpkN Ha)k8{+I;rm 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()