From c5e3a27bbb0530a3dfb22bd629bc43d43fc918c9 Mon Sep 17 00:00:00 2001 From: Lightos1 <124387232+Lightos1@users.noreply.github.com> Date: Fri, 2 Jan 2026 19:29:10 +0100 Subject: [PATCH] cpu fixes, deprecate auto --- .../loader/source/oc/customize.hpp | 2 +- .../stratosphere/loader/source/oc/pcv/pcv.cpp | 2 +- .../stratosphere/loader/source/oc/pcv/pcv.hpp | 14 +--- .../loader/source/oc/pcv/pcv_mariko.cpp | 74 ++++++++++--------- 4 files changed, 42 insertions(+), 50 deletions(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/customize.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/customize.hpp index 757474f2..6ab64f0e 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/customize.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/customize.hpp @@ -35,7 +35,7 @@ enum MtcConfig: u32 { }; enum TableConfig: u32 { - AUTO_DEPRECATED = 0, + AUTO_DEPRECATED = 0, /* Auto is not supported yet. */ DEFAULT_TABLE = 1, TBREAK_1581 = 2, TBREAK_1683 = 3, diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv.cpp index e57ef3bf..f4df800e 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv.cpp @@ -168,7 +168,7 @@ void Patch(uintptr_t mapped_nso, size_t nso_size) { if (isMariko) mariko::Patch(mapped_nso, nso_size); else - erista::Patch(mapped_nso, nso_size); + mariko::Patch(mapped_nso, nso_size); #endif } diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv.hpp index 319d1850..a12cc9ce 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv.hpp @@ -5,8 +5,6 @@ * * Copyright (c) Souldbminer and Horizon OC Contributors * - * Copyright (c) 2025 Lightos_ - * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. @@ -58,9 +56,7 @@ namespace ams::ldr::oc::pcv { static const s32 cpuVoltagePatchOffsets[] = { -2, -1, 5, 6, 7, 8, 9 }; static_assert(sizeof(cpuVoltagePatchValues) == sizeof(cpuVoltagePatchOffsets), "Invalid cpuVoltagePatch size"); - static const u32 cpuVoltageSecondaryPatchValues[] = { 800, 1120, 0, 800, 1120, 0, 620, 1120, 20000, 620, 1120, 70000, 950, 1132, 0, 950 }; - static const s32 cpuVoltageSecondaryPatchOffsets[] = { -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; - static_assert(sizeof(cpuVoltageSecondaryPatchValues) == sizeof(cpuVoltageSecondaryPatchOffsets), "Invalid secondary cpuVoltagePatch size"); + static const u32 cpuVoltThermalData[] = { 620, 1120, 20000, 620, 1120, 70000, 950, 1132, 0, 950, 1227, 0 }; static const u32 allowedCpuMaxFrequencies[] = { 2'397'000, 2'499'000, 2'601'000, 2'703'000, }; @@ -336,13 +332,7 @@ namespace ams::ldr::oc::pcv { } u32 cpu_max_volt = isMariko ? C.marikoCpuMaxVolt : C.eristaCpuMaxVolt; - u32 cpu_freq_threshold = 1020'000; - - if (isMariko) { - cpu_freq_threshold = 2193'000; - } else { - cpu_freq_threshold = 2091'000; - } + u32 cpu_freq_threshold = 2091'000; size_t default_entry_count = GetDvfsTableEntryCount(default_table); size_t default_table_size = default_entry_count * sizeof(cvb_entry_t); diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_mariko.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_mariko.cpp index 86ebf2af..bffbd631 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_mariko.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/pcv_mariko.cpp @@ -147,7 +147,6 @@ namespace ams::ldr::oc::pcv::mariko { } Result CpuVoltDVFS(u32 *ptr) { - /* Check first pattern. */ if (MatchesPattern(ptr, cpuVoltagePatchOffsets, cpuVoltagePatchValues)) { if (C.marikoCpuLowVmin) { PATCH_OFFSET(ptr, C.marikoCpuLowVmin); @@ -164,25 +163,27 @@ namespace ams::ldr::oc::pcv::mariko { R_SUCCEED(); } - /* Check alternative pattern. */ - if (MatchesPattern(ptr, cpuVoltageSecondaryPatchOffsets, cpuVoltageSecondaryPatchValues)) { - if (C.marikoCpuLowVmin) { - PATCH_OFFSET(ptr, C.marikoCpuLowVmin); - PATCH_OFFSET(ptr + 3, C.marikoCpuLowVmin); - } + R_THROW(ldr::ResultInvalidCpuMinVolt()); + } - if (C.marikoCpuMaxVolt) { - PATCH_OFFSET(ptr - 2, C.marikoCpuMaxVolt); - PATCH_OFFSET(ptr + 1, C.marikoCpuMaxVolt); - PATCH_OFFSET(ptr + 4, C.marikoCpuMaxVolt); - PATCH_OFFSET(ptr - 5, C.marikoCpuMaxVolt); - } - - R_SUCCEED(); + Result CpuVoltThermals(u32 *ptr) { + if (std::memcmp(ptr, cpuVoltThermalData, sizeof(cpuVoltThermalData))) { + R_THROW(ldr::ResultInvalidCpuMinVolt()); } - /* Both patterns fail. */ - R_THROW(ldr::ResultInvalidCpuMinVolt()); + if (C.marikoCpuLowVmin) { + PATCH_OFFSET(ptr, C.marikoCpuLowVmin); + PATCH_OFFSET(ptr + 3, C.marikoCpuLowVmin); + } + + if (C.marikoCpuMaxVolt) { + PATCH_OFFSET(ptr - 2, C.marikoCpuMaxVolt); + PATCH_OFFSET(ptr - 5, C.marikoCpuMaxVolt); + PATCH_OFFSET(ptr + 1, C.marikoCpuMaxVolt); + PATCH_OFFSET(ptr + 4, C.marikoCpuMaxVolt); + } + + R_SUCCEED(); } Result CpuVoltDfll(u32 *ptr) { @@ -562,25 +563,25 @@ namespace ams::ldr::oc::pcv::mariko { const u32 allowance4 = static_cast(0x9600 / (C.marikoEmcMaxClock / 0x3E8)) & 0xFF; const u32 allowance5 = static_cast(0x8980 / (C.marikoEmcMaxClock / 0x3E8)) & 0xFF; - table->la_scale_regs.mc_latency_allowance_xusb_0 = (table->la_scale_regs.mc_latency_allowance_xusb_0 & MaskHigh) | (allowance1 << 16); - table->la_scale_regs.mc_latency_allowance_xusb_1 = (table->la_scale_regs.mc_latency_allowance_xusb_1 & MaskHigh) | (allowance1 << 16); - table->la_scale_regs.mc_latency_allowance_tsec_0 = (table->la_scale_regs.mc_latency_allowance_tsec_0 & MaskHigh) | (allowance1 << 16); + table->la_scale_regs.mc_latency_allowance_xusb_0 = (table->la_scale_regs.mc_latency_allowance_xusb_0 & MaskHigh) | (allowance1 << 16); + table->la_scale_regs.mc_latency_allowance_xusb_1 = (table->la_scale_regs.mc_latency_allowance_xusb_1 & MaskHigh) | (allowance1 << 16); + table->la_scale_regs.mc_latency_allowance_tsec_0 = (table->la_scale_regs.mc_latency_allowance_tsec_0 & MaskHigh) | (allowance1 << 16); table->la_scale_regs.mc_latency_allowance_sdmmcaa_0 = (table->la_scale_regs.mc_latency_allowance_sdmmcaa_0 & MaskHigh) | (allowance1 << 16); table->la_scale_regs.mc_latency_allowance_sdmmcab_0 = (table->la_scale_regs.mc_latency_allowance_sdmmcab_0 & MaskHigh) | (allowance1 << 16); - table->la_scale_regs.mc_latency_allowance_sdmmc_0 = (table->la_scale_regs.mc_latency_allowance_sdmmc_0 & MaskHigh) | (allowance1 << 16); - table->la_scale_regs.mc_latency_allowance_sdmmca_0 = (table->la_scale_regs.mc_latency_allowance_sdmmca_0 & MaskHigh) | (allowance1 << 16); - table->la_scale_regs.mc_latency_allowance_ppcs_1 = (table->la_scale_regs.mc_latency_allowance_ppcs_1 & MaskHigh) | (allowance1 << 16); - table->la_scale_regs.mc_latency_allowance_nvdec_0 = (table->la_scale_regs.mc_latency_allowance_nvdec_0 & MaskHigh) | (allowance1 << 16); - table->la_scale_regs.mc_latency_allowance_mpcore_0 = (table->la_scale_regs.mc_latency_allowance_mpcore_0 & MaskHigh) | (allowance1 << 16); - table->la_scale_regs.mc_latency_allowance_avpc_0 = (table->la_scale_regs.mc_latency_allowance_avpc_0 & MaskHigh) | (allowance1 << 16); - table->la_scale_regs.mc_latency_allowance_vic_0 = allowance3 | (table->la_scale_regs.mc_latency_allowance_vic_0 & Mask3) | (allowance1 << 16); - table->la_scale_regs.mc_latency_allowance_isp2_1 = (table->la_scale_regs.mc_latency_allowance_isp2_1 & Mask3) | (allowance1 << 16) | allowance1; - table->la_scale_regs.mc_latency_allowance_nvenc_0 = allowance4 | (table->la_scale_regs.mc_latency_allowance_nvenc_0 & Mask3) | (allowance1 << 16); - table->la_scale_regs.mc_latency_allowance_hc_0 = (table->la_scale_regs.mc_latency_allowance_hc_0 & Mask2) | allowance5; - table->la_scale_regs.mc_latency_allowance_gpu_0 = allowance2 | (table->la_scale_regs.mc_latency_allowance_gpu_0 & Mask3) | (allowance1 << 16); - table->la_scale_regs.mc_latency_allowance_gpu2_0 = allowance2 | (table->la_scale_regs.mc_latency_allowance_gpu2_0 & Mask3) | (allowance1 << 16); - table->la_scale_regs.mc_latency_allowance_hc_1 = (table->la_scale_regs.mc_latency_allowance_hc_1 & Mask2) | allowance1; - table->la_scale_regs.mc_latency_allowance_vi2_0 = (table->la_scale_regs.mc_latency_allowance_vi2_0 & Mask2) | allowance1; + table->la_scale_regs.mc_latency_allowance_sdmmc_0 = (table->la_scale_regs.mc_latency_allowance_sdmmc_0 & MaskHigh) | (allowance1 << 16); + table->la_scale_regs.mc_latency_allowance_sdmmca_0 = (table->la_scale_regs.mc_latency_allowance_sdmmca_0 & MaskHigh) | (allowance1 << 16); + table->la_scale_regs.mc_latency_allowance_ppcs_1 = (table->la_scale_regs.mc_latency_allowance_ppcs_1 & MaskHigh) | (allowance1 << 16); + table->la_scale_regs.mc_latency_allowance_nvdec_0 = (table->la_scale_regs.mc_latency_allowance_nvdec_0 & MaskHigh) | (allowance1 << 16); + table->la_scale_regs.mc_latency_allowance_mpcore_0 = (table->la_scale_regs.mc_latency_allowance_mpcore_0 & MaskHigh) | (allowance1 << 16); + table->la_scale_regs.mc_latency_allowance_avpc_0 = (table->la_scale_regs.mc_latency_allowance_avpc_0 & MaskHigh) | (allowance1 << 16); + table->la_scale_regs.mc_latency_allowance_vic_0 = allowance3 | (table->la_scale_regs.mc_latency_allowance_vic_0 & Mask3) | (allowance1 << 16); + table->la_scale_regs.mc_latency_allowance_isp2_1 = (table->la_scale_regs.mc_latency_allowance_isp2_1 & Mask3) | (allowance1 << 16) | allowance1; + table->la_scale_regs.mc_latency_allowance_nvenc_0 = allowance4 | (table->la_scale_regs.mc_latency_allowance_nvenc_0 & Mask3) | (allowance1 << 16); + table->la_scale_regs.mc_latency_allowance_hc_0 = (table->la_scale_regs.mc_latency_allowance_hc_0 & Mask2) | allowance5; + table->la_scale_regs.mc_latency_allowance_gpu_0 = allowance2 | (table->la_scale_regs.mc_latency_allowance_gpu_0 & Mask3) | (allowance1 << 16); + table->la_scale_regs.mc_latency_allowance_gpu2_0 = allowance2 | (table->la_scale_regs.mc_latency_allowance_gpu2_0 & Mask3) | (allowance1 << 16); + table->la_scale_regs.mc_latency_allowance_hc_1 = (table->la_scale_regs.mc_latency_allowance_hc_1 & Mask2) | allowance1; + table->la_scale_regs.mc_latency_allowance_vi2_0 = (table->la_scale_regs.mc_latency_allowance_vi2_0 & Mask2) | allowance1; table->dram_timings.t_rp = tRFCpb; table->dram_timings.t_rfc = tRFCab; @@ -1008,10 +1009,11 @@ namespace ams::ldr::oc::pcv::mariko { PatcherEntry patches[] = { {"CPU Freq Vdd", &CpuFreqVdd, 1, nullptr, CpuClkOSLimit}, {"CPU Freq Table", CpuFreqCvbTable, 1, nullptr, CpuCvbDefaultMaxFreq}, - {"CPU Volt DVFS", &CpuVoltDVFS, 2, nullptr, CpuVminOfficial}, + {"CPU Volt DVFS", &CpuVoltDVFS, 1, nullptr, CpuVminOfficial}, + {"CPU Volt Thermals", &CpuVoltThermals, 1, nullptr, CpuVminOfficial}, {"CPU Volt Dfll", &CpuVoltDfll, 1, nullptr, 0x0000FFCF}, {"GPU Volt DVFS", &GpuVoltDVFS, 1, nullptr, GpuVminOfficial}, - {"Gpu Volt Thermals", &GpuVoltThermals, 1, nullptr, GpuVminOfficial}, + {"GPU Volt Thermals", &GpuVoltThermals, 1, nullptr, GpuVminOfficial}, {"GPU Freq Table", GpuFreqCvbTable, 1, nullptr, GpuCvbDefaultMaxFreq}, {"GPU Freq Asm", &GpuFreqMaxAsm, 2, &GpuMaxClockPatternFn}, {"GPU PLL Max", &GpuFreqPllMax, 1, nullptr, GpuClkPllMax},