wip erista dvfs
This commit is contained in:
@@ -2302,7 +2302,6 @@ protected:
|
|||||||
false
|
false
|
||||||
);
|
);
|
||||||
|
|
||||||
if (IsMariko()) {
|
|
||||||
std::vector<NamedValue> dvfsOffset = {
|
std::vector<NamedValue> dvfsOffset = {
|
||||||
NamedValue("-80 mV", 0xFFFFFFB0),
|
NamedValue("-80 mV", 0xFFFFFFB0),
|
||||||
NamedValue("-75 mV", 0xFFFFFFB5),
|
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);
|
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");
|
tsl::elm::ListItem* customTableSubmenu = new tsl::elm::ListItem("GPU Voltage Table");
|
||||||
customTableSubmenu->setClickListener([](u64 keys) {
|
customTableSubmenu->setClickListener([](u64 keys) {
|
||||||
|
|||||||
@@ -76,7 +76,6 @@ namespace board {
|
|||||||
u32 hidrev = *(u32*)(apbVirtAddr + APB_MISC_GP_HIDREV);
|
u32 hidrev = *(u32*)(apbVirtAddr + APB_MISC_GP_HIDREV);
|
||||||
if (((hidrev >> 4) & 0xF) >= GP_HIDREV_MAJOR_T210B01) {
|
if (((hidrev >> 4) & 0xF) >= GP_HIDREV_MAJOR_T210B01) {
|
||||||
gSocType = HocClkSocType_Mariko;
|
gSocType = HocClkSocType_Mariko;
|
||||||
CacheGpuVoltTable();
|
|
||||||
} else {
|
} else {
|
||||||
gSocType = HocClkSocType_Erista;
|
gSocType = HocClkSocType_Erista;
|
||||||
}
|
}
|
||||||
@@ -194,6 +193,7 @@ namespace board {
|
|||||||
display::Initialize(&cfg);
|
display::Initialize(&cfg);
|
||||||
|
|
||||||
CacheDfllData();
|
CacheDfllData();
|
||||||
|
CacheGpuVoltTable();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Exit() {
|
void Exit() {
|
||||||
|
|||||||
@@ -19,27 +19,32 @@
|
|||||||
#include <fuse.h>
|
#include <fuse.h>
|
||||||
#include "board_fuse.hpp"
|
#include "board_fuse.hpp"
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
#include "board.hpp"
|
||||||
|
|
||||||
namespace board {
|
namespace board {
|
||||||
|
|
||||||
void SetGpuBracket(u16 speedo, u8 &gpuBracket) {
|
void SetGpuBracket(u16 speedo, u8 &gpuBracket) {
|
||||||
if (speedo <= 1624) {
|
if(GetSocType() == HocClkSocType_Mariko) {
|
||||||
gpuBracket = 0;
|
if (speedo <= 1624) {
|
||||||
return;
|
gpuBracket = 0;
|
||||||
}
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (speedo <= 1689) {
|
if (speedo <= 1689) {
|
||||||
gpuBracket = 1;
|
gpuBracket = 1;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (speedo <= 1753) {
|
if (speedo <= 1753) {
|
||||||
gpuBracket = 2;
|
gpuBracket = 2;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* >= 1754 */
|
/* >= 1754 */
|
||||||
gpuBracket = 3;
|
gpuBracket = 3;
|
||||||
|
} else {
|
||||||
|
gpuBracket = speedo > 2050 ? 1 : 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ReadFuses(FuseData &speedo, u64 fuseVa) {
|
void ReadFuses(FuseData &speedo, u64 fuseVa) {
|
||||||
|
|||||||
@@ -378,7 +378,7 @@ namespace board {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for(int i = 0; i < (int)std::size(voltData.voltTable); ++i) {
|
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;
|
return;
|
||||||
}
|
}
|
||||||
@@ -421,39 +421,60 @@ namespace board {
|
|||||||
}
|
}
|
||||||
|
|
||||||
u32 GetMinimumGpuVmin(u32 freqMhz, u32 bracket) {
|
u32 GetMinimumGpuVmin(u32 freqMhz, u32 bracket) {
|
||||||
static const u32 ramTable[][22] = {
|
u32 baseVolt = 800;
|
||||||
{ 2133, 2200, 2266, 2300, 2366, 2400, 2433, 2466, 2533, 2566, 2600, 2633, 2700, 2733, 2766, 2833, 2866, 2900, 2933, 3033, 3066, 3100, }, // Bracket 0
|
if(GetSocType() == HocClkSocType_Mariko) {
|
||||||
{ 2300, 2366, 2433, 2466, 2533, 2566, 2633, 2700, 2733, 2800, 2833, 2900, 2933, 2966, 3033, 3066, 3100, 3133, 3166, 3200, 3233, 3266, }, // Bracket 1
|
static const u32 ramTable[][22] = {
|
||||||
{ 2433, 2466, 2533, 2566, 2600, 2666, 2766, 2800, 2833, 2866, 2933, 2966, 3033, 3066, 3100, 3133, 3166, 3200, 3233, 3300, 3333, 3366, }, // Bracket 2
|
{ 2133, 2200, 2266, 2300, 2366, 2400, 2433, 2466, 2533, 2566, 2600, 2633, 2700, 2733, 2766, 2833, 2866, 2900, 2933, 3033, 3066, 3100, }, // Bracket 0
|
||||||
{ 2500, 2533, 2600, 2633, 2666, 2733, 2800, 2866, 2900, 2966, 3033, 3100, 3166, 3200, 3233, 3266, 3300, 3333, 3366, 3400, 3400, 3400, }, // Bracket 3
|
{ 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 (freqMhz <= 1600) return 0; // DVFS doesnt work below 1600MHz, it will just use vMin
|
||||||
if (bracket >= std::size(ramTable)) bracket = 0;
|
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 rampStartVolt = (bracket == 0) ? 535 : 525; // Do not touch!
|
||||||
u32 rampSpan = 590 - rampStartVolt;
|
u32 rampSpan = 590 - rampStartVolt;
|
||||||
|
|
||||||
|
|
||||||
if (freqMhz >= 1633 && freqMhz < bracketStart) {
|
if (freqMhz >= 1633 && freqMhz < bracketStart) {
|
||||||
u32 raw = rampStartVolt + ((freqMhz - 1633) * rampSpan) / (bracketStart - 1633);
|
u32 raw = rampStartVolt + ((freqMhz - 1633) * rampSpan) / (bracketStart - 1633);
|
||||||
u32 volt = ((raw + 2) / 5) * 5;
|
u32 volt = ((raw + 2) / 5) * 5;
|
||||||
if (volt < rampStartVolt) volt = rampStartVolt;
|
if (volt < rampStartVolt) volt = rampStartVolt;
|
||||||
if (volt > 590) volt = 590;
|
if (volt > 590) volt = 590;
|
||||||
return volt;
|
return volt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
u32 baseVolt = gpuVoltArray[std::size(gpuVoltArray) - 1];
|
baseVolt = gpuVoltArray[std::size(gpuVoltArray) - 1];
|
||||||
for (u32 i = 0; i < std::size(gpuVoltArray); ++i) {
|
for (u32 i = 0; i < std::size(gpuVoltArray); ++i) {
|
||||||
if (freqMhz <= ramTable[bracket][i]) {
|
if (freqMhz <= ramTable[bracket][i]) {
|
||||||
baseVolt = gpuVoltArray[i];
|
baseVolt = gpuVoltArray[i];
|
||||||
break;
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -368,7 +368,7 @@ namespace clockManager {
|
|||||||
|
|
||||||
void DVFSReset()
|
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
|
board::PcvHijackGpuVolts(0); // Reset to vMin
|
||||||
|
|
||||||
u32 targetHz = gContext.overrideFreqs[HocClkModule_GPU];
|
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
|
// 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);
|
ApplyGpuDvfs(targetHz);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -511,11 +511,11 @@ namespace clockManager {
|
|||||||
gContext.stable.freqs[module] = nearestHz;
|
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);
|
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;
|
didHijackPcv = false;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -549,7 +549,7 @@ namespace clockManager {
|
|||||||
// restore clocks to stock values on app or profile change
|
// restore clocks to stock values on app or profile change
|
||||||
if (hasChanged) {
|
if (hasChanged) {
|
||||||
board::ResetToStock();
|
board::ResetToStock();
|
||||||
if (board::GetSocType() == HocClkSocType_Mariko && config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) {
|
if (config::GetConfigValue(HocClkConfigValue_DVFSMode) == DVFSMode_Hijack) {
|
||||||
board::PcvHijackGpuVolts(0);
|
board::PcvHijackGpuVolts(0);
|
||||||
board::ResetToStockGpu();
|
board::ResetToStockGpu();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user