diff --git a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp index 37c3c722..3d5bc401 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp @@ -2302,7 +2302,6 @@ protected: false ); - if (IsMariko()) { std::vector dvfsOffset = { NamedValue("-80 mV", 0xFFFFFFB0), NamedValue("-75 mV", 0xFFFFFFB5), @@ -2345,7 +2344,6 @@ protected: ); addConfigButton(HocClkConfigValue_DVFSOffset, "GPU DVFS Offset", ValueRange(0, 12, 1, "", 0), "GPU DVFS Offset", &thresholdsDisabled, {}, dvfsOffset, false); - } tsl::elm::ListItem* customTableSubmenu = new tsl::elm::ListItem("GPU Voltage Table"); customTableSubmenu->setClickListener([](u64 keys) { diff --git a/Source/hoc-clk/sysmodule/src/board/board.cpp b/Source/hoc-clk/sysmodule/src/board/board.cpp index c08bea97..ee4d068a 100644 --- a/Source/hoc-clk/sysmodule/src/board/board.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board.cpp @@ -76,7 +76,6 @@ namespace board { u32 hidrev = *(u32*)(apbVirtAddr + APB_MISC_GP_HIDREV); if (((hidrev >> 4) & 0xF) >= GP_HIDREV_MAJOR_T210B01) { gSocType = HocClkSocType_Mariko; - CacheGpuVoltTable(); } else { gSocType = HocClkSocType_Erista; } @@ -194,6 +193,7 @@ namespace board { display::Initialize(&cfg); CacheDfllData(); + CacheGpuVoltTable(); } void Exit() { diff --git a/Source/hoc-clk/sysmodule/src/board/board_fuse.cpp b/Source/hoc-clk/sysmodule/src/board/board_fuse.cpp index d1e9c2bb..212e9a69 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_fuse.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_fuse.cpp @@ -19,27 +19,32 @@ #include #include "board_fuse.hpp" #include +#include "board.hpp" namespace board { void SetGpuBracket(u16 speedo, u8 &gpuBracket) { - if (speedo <= 1624) { - gpuBracket = 0; - return; - } + if(GetSocType() == HocClkSocType_Mariko) { + if (speedo <= 1624) { + gpuBracket = 0; + return; + } - if (speedo <= 1689) { - gpuBracket = 1; - return; - } + if (speedo <= 1689) { + gpuBracket = 1; + return; + } - if (speedo <= 1753) { - gpuBracket = 2; - return; - } + if (speedo <= 1753) { + gpuBracket = 2; + return; + } - /* >= 1754 */ - gpuBracket = 3; + /* >= 1754 */ + gpuBracket = 3; + } else { + gpuBracket = speedo > 2050 ? 1 : 0; + } } void ReadFuses(FuseData &speedo, u64 fuseVa) { diff --git a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp index e8e7d0ce..2f06b69c 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp @@ -359,7 +359,7 @@ namespace board { } /* Assuming mariko. */ - const u32 vmax = 800; + u32 vmax = GetSocType() == HocClkSocType_Mariko ? 800 : 950; constexpr u32 GpuVoltageTableOffset = 312; if (!std::memcmp(&buffer[index + GpuVoltageTableOffset], &vmax, sizeof(vmax))) { std::memcpy(voltData.voltTable, &buffer[index + GpuVoltageTableOffset], sizeof(voltData.voltTable)); @@ -378,7 +378,7 @@ namespace board { } for(int i = 0; i < (int)std::size(voltData.voltTable); ++i) { - fileUtils::LogLine("[dvfs] gpu volt %d: %u mV", i, voltData.voltTable[i]); + fileUtils::LogLine("[dvfs] gpu volt %d: %u mV", i, voltData.voltTable[0][i]); } return; } @@ -421,42 +421,63 @@ namespace board { } u32 GetMinimumGpuVmin(u32 freqMhz, u32 bracket) { - 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 - }; + u32 baseVolt = 800; + 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 + }; - 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 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; - return volt; - } + 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; + return volt; + } - u32 baseVolt = gpuVoltArray[std::size(gpuVoltArray) - 1]; - for (u32 i = 0; i < std::size(gpuVoltArray); ++i) { - if (freqMhz <= ramTable[bracket][i]) { - baseVolt = gpuVoltArray[i]; - break; + baseVolt = gpuVoltArray[std::size(gpuVoltArray) - 1]; + for (u32 i = 0; i < std::size(gpuVoltArray); ++i) { + if (freqMhz <= ramTable[bracket][i]) { + baseVolt = gpuVoltArray[i]; + break; + } + } + } else { + static const u32 ramTable[][17] = { + { 1733, 1800, 1866, 1920, 1958, 1996, 2035, 2073, 2112, 2131, 2150, 2169, 2188, 2227, 2265, 2304, 2342}, // Bracket 0 + { 1800, 1866, 1920, 1958, 1996, 2035, 2073, 2112, 2131, 2150, 2169, 2188, 2227, 2265, 2304, 2342, 2380}, // Bracket 1 + }; + + static const u32 gpuVoltArray[17] = { 725, 730, 735, 740, 755, 760, 765, 770, 785, 790, 795, 800, 805, 810, 815, 820, 825}; + + if (freqMhz <= 1600) return 0; // DVFS doesnt work below 1600MHz, it will just use vMin + if (bracket >= std::size(ramTable)) bracket = 0; + + baseVolt = gpuVoltArray[std::size(gpuVoltArray) - 1]; + for (u32 i = 0; i < std::size(gpuVoltArray); ++i) { + if (freqMhz <= ramTable[bracket][i]) { + baseVolt = gpuVoltArray[i]; + break; + } } } - + return baseVolt; } } \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp index 66f46b36..67462ebd 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp +++ b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp @@ -368,7 +368,7 @@ namespace clockManager { void DVFSReset() { - if (board::GetSocType() == HocClkSocType_Mariko && config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) { + if (config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) { board::PcvHijackGpuVolts(0); // Reset to vMin u32 targetHz = gContext.overrideFreqs[HocClkModule_GPU]; @@ -500,7 +500,7 @@ namespace clockManager { ); // The logic MUST be done in this order otherwise you WILL get crashes - if (module == HocClkModule_MEM && board::GetSocType() == HocClkSocType_Mariko && targetHz > oldHz && config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) { + if (module == HocClkModule_MEM && targetHz > oldHz && config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) { ApplyGpuDvfs(targetHz); } @@ -511,11 +511,11 @@ namespace clockManager { gContext.stable.freqs[module] = nearestHz; } - if (module == HocClkModule_MEM && board::GetSocType() == HocClkSocType_Mariko && targetHz < oldHz && config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) { + if (module == HocClkModule_MEM && targetHz < oldHz && config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) { ApplyGpuDvfs(targetHz); } - if(module == HocClkModule_MEM && board::GetSocType() == HocClkSocType_Mariko && config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) + if(module == HocClkModule_MEM && config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) didHijackPcv = false; } } else { @@ -549,7 +549,7 @@ namespace clockManager { // restore clocks to stock values on app or profile change if (hasChanged) { board::ResetToStock(); - if (board::GetSocType() == HocClkSocType_Mariko && config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) { + if (config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) { board::PcvHijackGpuVolts(0); board::ResetToStockGpu(); }