fix using wrong mariko CPU/GPU dvfs table to patch limints
This commit is contained in:
@@ -77,10 +77,13 @@ Result Test_PcvDvfsTable() {
|
|||||||
|
|
||||||
// Customized table default
|
// Customized table default
|
||||||
assert(GetDvfsTableEntryCount((cvb_entry_t *)(&ams::ldr::oc::C.eristaCpuDvfsTable)) == 19);
|
assert(GetDvfsTableEntryCount((cvb_entry_t *)(&ams::ldr::oc::C.eristaCpuDvfsTable)) == 19);
|
||||||
assert(GetDvfsTableEntryCount((cvb_entry_t *)(&ams::ldr::oc::C.marikoCpuDvfsTable)) == 22);
|
assert(GetDvfsTableEntryCount((cvb_entry_t *)(&ams::ldr::oc::C.marikoCpuDvfsTable)) == 21);
|
||||||
|
assert(GetDvfsTableEntryCount((cvb_entry_t *)(&ams::ldr::oc::C.marikoCpuDvfsTableSLT)) == 22);
|
||||||
|
|
||||||
assert(GetDvfsTableEntryCount((cvb_entry_t *)(&ams::ldr::oc::C.eristaGpuDvfsTable)) == 12);
|
assert(GetDvfsTableEntryCount((cvb_entry_t *)(&ams::ldr::oc::C.eristaGpuDvfsTable)) == 12);
|
||||||
assert(GetDvfsTableEntryCount((cvb_entry_t *)(&ams::ldr::oc::C.marikoGpuDvfsTable)) == 18);
|
assert(GetDvfsTableEntryCount((cvb_entry_t *)(&ams::ldr::oc::C.marikoGpuDvfsTable)) == 17);
|
||||||
|
assert(GetDvfsTableEntryCount((cvb_entry_t *)(&ams::ldr::oc::C.marikoGpuDvfsTableSLT)) == 17);
|
||||||
|
assert(GetDvfsTableEntryCount((cvb_entry_t *)(&ams::ldr::oc::C.marikoGpuDvfsTableHiOPT)) == 17);
|
||||||
|
|
||||||
constexpr size_t limit = ams::ldr::oc::pcv::DvfsTableEntryLimit;
|
constexpr size_t limit = ams::ldr::oc::pcv::DvfsTableEntryLimit;
|
||||||
cvb_entry_t customized_table[limit] = {};
|
cvb_entry_t customized_table[limit] = {};
|
||||||
|
|||||||
@@ -92,9 +92,22 @@ void SafetyCheck() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
u32 eristaCpuDvfsMaxFreq = static_cast<u32>(GetDvfsTableLastEntry(C.eristaCpuDvfsTable)->freq);
|
u32 eristaCpuDvfsMaxFreq = static_cast<u32>(GetDvfsTableLastEntry(C.eristaCpuDvfsTable)->freq);
|
||||||
u32 marikoCpuDvfsMaxFreq = static_cast<u32>(GetDvfsTableLastEntry(C.marikoCpuDvfsTable)->freq);
|
u32 marikoCpuDvfsMaxFreq = static_cast<u32>(C.marikoCpuUV ? GetDvfsTableLastEntry(C.marikoCpuDvfsTableSLT)->freq : GetDvfsTableLastEntry(C.marikoCpuDvfsTable)->freq);
|
||||||
u32 eristaGpuDvfsMaxFreq = static_cast<u32>(GetDvfsTableLastEntry(C.eristaGpuDvfsTable)->freq);
|
u32 eristaGpuDvfsMaxFreq = static_cast<u32>(GetDvfsTableLastEntry(C.eristaGpuDvfsTable)->freq);
|
||||||
u32 marikoGpuDvfsMaxFreq = static_cast<u32>(GetDvfsTableLastEntry(C.marikoGpuDvfsTable)->freq);
|
u32 marikoGpuDvfsMaxFreq;
|
||||||
|
switch (C.marikoGpuUV) {
|
||||||
|
case 0:
|
||||||
|
marikoGpuDvfsMaxFreq = static_cast<u32>(GetDvfsTableLastEntry(C.marikoGpuDvfsTable)->freq);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
marikoGpuDvfsMaxFreq = static_cast<u32>(GetDvfsTableLastEntry(C.marikoGpuDvfsTableSLT)->freq);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
marikoGpuDvfsMaxFreq = static_cast<u32>(GetDvfsTableLastEntry(C.marikoGpuDvfsTableHiOPT)->freq);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
marikoGpuDvfsMaxFreq = static_cast<u32>(GetDvfsTableLastEntry(C.marikoGpuDvfsTable)->freq);
|
||||||
|
}
|
||||||
|
|
||||||
sValidator validators[] = {
|
sValidator validators[] = {
|
||||||
{ C.commonCpuBoostClock, 1020'000, 3000'000, true },
|
{ C.commonCpuBoostClock, 1020'000, 3000'000, true },
|
||||||
|
|||||||
@@ -175,7 +175,7 @@ namespace erista {
|
|||||||
template<bool isMariko>
|
template<bool isMariko>
|
||||||
Result CpuFreqCvbTable(u32* ptr) {
|
Result CpuFreqCvbTable(u32* ptr) {
|
||||||
cvb_entry_t* default_table = isMariko ? (cvb_entry_t *)(&mariko::CpuCvbTableDefault) : (cvb_entry_t *)(&erista::CpuCvbTableDefault);
|
cvb_entry_t* default_table = isMariko ? (cvb_entry_t *)(&mariko::CpuCvbTableDefault) : (cvb_entry_t *)(&erista::CpuCvbTableDefault);
|
||||||
cvb_entry_t* customize_table = const_cast<cvb_entry_t *>(isMariko ? C.marikoCpuDvfsTable : C.eristaCpuDvfsTable);
|
cvb_entry_t* customize_table = const_cast<cvb_entry_t *>(isMariko ? (C.marikoCpuUV ? C.marikoCpuDvfsTableSLT : C.marikoCpuDvfsTable) : C.eristaCpuDvfsTable);
|
||||||
|
|
||||||
u32 cpu_max_volt = isMariko ? C.marikoCpuMaxVolt : C.eristaCpuMaxVolt;
|
u32 cpu_max_volt = isMariko ? C.marikoCpuMaxVolt : C.eristaCpuMaxVolt;
|
||||||
u32 cpu_freq_threshold = isMariko ? (C.marikoCpuUV ? 2193'000 : 2091'000) : 1887'000;
|
u32 cpu_freq_threshold = isMariko ? (C.marikoCpuUV ? 2193'000 : 2091'000) : 1887'000;
|
||||||
|
|||||||
@@ -27,7 +27,11 @@ Result CpuFreqVdd(u32* ptr) {
|
|||||||
R_UNLESS(entry->step_mv == 5000, ldr::ResultInvalidCpuFreqVddEntry());
|
R_UNLESS(entry->step_mv == 5000, ldr::ResultInvalidCpuFreqVddEntry());
|
||||||
R_UNLESS(entry->max_mv == 1525'000, ldr::ResultInvalidCpuFreqVddEntry());
|
R_UNLESS(entry->max_mv == 1525'000, ldr::ResultInvalidCpuFreqVddEntry());
|
||||||
|
|
||||||
PATCH_OFFSET(ptr, GetDvfsTableLastEntry(C.marikoCpuDvfsTable)->freq);
|
if (C.marikoCpuUV) {
|
||||||
|
PATCH_OFFSET(ptr, GetDvfsTableLastEntry(C.marikoCpuDvfsTableSLT)->freq);
|
||||||
|
} else {
|
||||||
|
PATCH_OFFSET(ptr, GetDvfsTableLastEntry(C.marikoCpuDvfsTable)->freq);
|
||||||
|
}
|
||||||
|
|
||||||
R_SUCCEED();
|
R_SUCCEED();
|
||||||
}
|
}
|
||||||
@@ -58,7 +62,19 @@ Result GpuFreqMaxAsm(u32* ptr32) {
|
|||||||
if (rd != asm_get_rd(ins2))
|
if (rd != asm_get_rd(ins2))
|
||||||
R_THROW(ldr::ResultInvalidGpuFreqMaxPattern());
|
R_THROW(ldr::ResultInvalidGpuFreqMaxPattern());
|
||||||
|
|
||||||
u32 max_clock = GetDvfsTableLastEntry(C.marikoGpuDvfsTable)->freq;
|
u32 max_clock;
|
||||||
|
switch(C.marikoGpuUV) {
|
||||||
|
case 0:
|
||||||
|
max_clock = GetDvfsTableLastEntry(C.marikoGpuDvfsTable)->freq;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
max_clock = GetDvfsTableLastEntry(C.marikoGpuDvfsTableSLT)->freq;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
max_clock = GetDvfsTableLastEntry(C.marikoGpuDvfsTableHiOPT)->freq;
|
||||||
|
break;
|
||||||
|
default: max_clock = GetDvfsTableLastEntry(C.marikoGpuDvfsTable)->freq;
|
||||||
|
}
|
||||||
u32 asm_patch[2] = {
|
u32 asm_patch[2] = {
|
||||||
asm_set_rd(asm_set_imm16(asm_pattern[0], max_clock), rd),
|
asm_set_rd(asm_set_imm16(asm_pattern[0], max_clock), rd),
|
||||||
asm_set_rd(asm_set_imm16(asm_pattern[1], max_clock >> 16), rd)
|
asm_set_rd(asm_set_imm16(asm_pattern[1], max_clock >> 16), rd)
|
||||||
|
|||||||
Reference in New Issue
Block a user