hocclk: add mariko middle freq hack

This commit is contained in:
souldbminersmwc
2026-05-09 16:53:30 -04:00
parent 935dd24129
commit c4f7f0e713
7 changed files with 166 additions and 123 deletions

View File

@@ -40,6 +40,7 @@
#include "../file/errors.hpp"
#include "../soc/pllmb.hpp"
#include "../file/config.hpp"
#include "../soc/gm20b.hpp"
namespace board {
PcvModule GetPcvModule(HocClkModule hocclkModule) {
@@ -77,7 +78,6 @@ namespace board {
Result rc = 0;
bool usesGovenor = module > HocClkModule_MEM;
if (module == HocClkModule_Display) {
display::SetRate(hz);
return;
@@ -87,27 +87,35 @@ namespace board {
return;
}
bool useGm20b = (module == HocClkModule_GPU) && (GetSocType() == HocClkSocType_Mariko) && (hz % 38400000 == 0) && (hz % 76800000 != 0);
u32 pcvHz = useGm20b ? ((hz + 76800000 - 1) / 76800000) * 76800000 : hz;
if (HOSSVC_HAS_CLKRST) {
ClkrstSession session = {};
rc = clkrstOpenSession(&session, GetPcvModuleId(module), 3);
ASSERT_RESULT_OK(rc, "clkrstOpenSession");
ClkrstSetHz(session, hz);
ClkrstSetHz(session, pcvHz);
/* Voltage bug workaround. */
if (module == HocClkModule_CPU) {
svcSleepThread(300'000);
ClkrstSetHz(session, hz);
ClkrstSetHz(session, pcvHz);
}
clkrstCloseSession(&session);
} else {
PcvSetHz(GetPcvModule(module), hz);
PcvSetHz(GetPcvModule(module), pcvHz);
if (module == HocClkModule_CPU) {
svcSleepThread(300'000);
PcvSetHz(GetPcvModule(module), hz);
PcvSetHz(GetPcvModule(module), pcvHz);
}
}
if (useGm20b) {
gm20b::setClock(hz / 1000);
}
}
u32 GetDisplayRate(u32 hz) {