hocclk: improve DVFS curve

This commit is contained in:
souldbminersmwc
2026-05-26 20:35:07 -04:00
parent 187d6d6422
commit 13550fbc20
2 changed files with 28 additions and 10 deletions

View File

@@ -459,20 +459,22 @@ namespace board {
}
}
} 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
struct DvfsEntry { u32 freq; u32 volt; };
static const DvfsEntry ramTable[][19] = {
{ {1733,725}, {1800,730}, {1866,735}, {1920,740}, {1958,745}, {1996,750}, {2035,755}, {2073,760}, {2112,765}, {2131,770}, {2150,775}, {2169,780}, {2188,785}, {2227,790}, {2265,795}, {2304,800}, {2342,805}, {2380,810}, {2400,815} }, // Bracket 0
{ {1733,715}, {1800,720}, {1866,725}, {1920,730}, {1958,735}, {1996,740}, {2035,745}, {2073,750}, {2112,755}, {2131,760}, {2150,765}, {2169,770}, {2188,775}, {2227,780}, {2265,785}, {2304,790}, {2342,795}, {2380,800}, {2400,805} }, // Bracket 1
{ {1733,705}, {1800,710}, {1866,715}, {1920,720}, {1958,725}, {1996,730}, {2035,735}, {2073,740}, {2112,745}, {2131,750}, {2150,755}, {2169,760}, {2188,765}, {2227,770}, {2265,775}, {2304,780}, {2342,785}, {2380,790}, {2400,795} }, // Bracket 2
{ {1733,695}, {1800,700}, {1866,705}, {1920,710}, {1958,715}, {1996,720}, {2035,725}, {2073,730}, {2112,735}, {2131,740}, {2150,745}, {2169,750}, {2188,755}, {2227,760}, {2265,765}, {2304,770}, {2342,775}, {2380,780}, {2400,785} }, // Bracket 3
};
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];
const auto& entries = ramTable[bracket];
baseVolt = entries[std::size(entries) - 1].volt;
for (const auto& entry : entries) {
if (freqMhz <= entry.freq) {
baseVolt = entry.volt;
break;
}
}