From b093b32b297482f23f38550b69b793352afeb751 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Wed, 29 Jul 2026 19:06:10 -0400 Subject: [PATCH] perfect ram timings --- .../loader/source/oc/mtc_timing_value.hpp | 2 +- .../pcv/mariko/calculate_timings_mariko.cpp | 31 +++++++++++++++++-- .../source/oc/pcv/mariko/pcv_mariko_mtc.hpp | 2 ++ .../hoc-clk/overlay/src/ui/gui/misc_gui.cpp | 2 +- Source/hoc-clk/sysmodule/src/file/kip.cpp | 3 ++ 5 files changed, 35 insertions(+), 5 deletions(-) diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/mtc_timing_value.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/mtc_timing_value.hpp index 7b23d587..e3263abe 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/mtc_timing_value.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/mtc_timing_value.hpp @@ -113,7 +113,7 @@ namespace ams::ldr::hoc { const std::array tRCD_values = { 18, 17, 16, 15, 14, 13, 12, 11 }; const std::array tRP_values = { 18, 17, 16, 15, 14, 13, 12, 11 }; const std::array tRAS_values = { 42, 36, 34, 32, 30, 28, 26, 24, 22, 20 }; - const std::array tRRD_values = { /*10.0,*/ 7.5, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0 }; /* 10.0 is used for <2133mhz; do we care? 8gb uses 7.5 tRRD on >=1331. */ + const std::array tRRD_values = { 10.0, 7.5, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0 }; const std::array tRFC_values = { 140, 130, 120, 110, 100, 90, 80, 70, 60, 50, 40 }; const std::array tWTR_values = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 }; const std::array tREFpb_values = { 3900, 5850, 7800, 11700, 15600, 99999 }; diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp index 40a0644d..7b5d3f0f 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/calculate_timings_mariko.cpp @@ -15,18 +15,42 @@ */ #include +#include "../pcv.hpp" #include "../../mtc_timing_value.hpp" #include "timing_tables.hpp" namespace ams::ldr::hoc::pcv::mariko { + double GetMaxTrrd(u32 freq) { + DramId id = GetDramId(); + + if (freq >= 1866'000) { + return 7.5; + } + + switch (id) { + case HOAG_4GB_HYNIX_H9HCNNNBKMMLXR_NEE ... IOWA_4GB_HYNIX_H9HCNNNBKMMLXR_NEE: + case IOWA_4GB_MICRON_MT53E512M32D2NP_046_WTE: + case HOAG_4GB_MICRON_MT53E512M32D2NP_046_WTE: + case IOWA_8GB_SAMSUNG_K4UBE3D4AA_MGCL: + case HOAG_8GB_SAMSUNG_K4UBE3D4AA_MGCL: + case AULA_8GB_SAMSUNG_K4UBE3D4AA_MGCL: + case IOWA_4GB_MICRON_MT53E512M32D1NP_046_WTB ... AULA_4GB_MICRON_MT53E512M32D1NP_046_WTB: + return 7.5; + default: + break; + } + + return 10.0; + } + void GetRext(u32 freq) { if (auto r = FindRext(freq)) { rext = r->rext; return; } - /* > 3200 */ + /* Fallback */ rext = 0x1E; } @@ -46,9 +70,10 @@ namespace ams::ldr::hoc::pcv::mariko { } void AutoLatency(volatile u32 &latency, u32 freq, u32 latencyStep) { - if (freq > 1600'000 && freq <= 1896'000) { /* 1866tRWL */ + if (freq > 1600'000 && freq <= 1866'000) { /* 1866tRWL */ latency += latencyStep * 2; } else { /* 2133tRWL */ + // Note: JEDEC/Datasheet mandates 2133 for >1866, even if <2133 latency += latencyStep * 3; } } @@ -139,7 +164,7 @@ namespace ams::ldr::hoc::pcv::mariko { tRCD = tRCD_values[lowFreq ? C.low_t1_tRCD : C.t1_tRCD]; tRPpb = tRP_values[lowFreq ? C.low_t2_tRP : C.t2_tRP]; tRAS = tRAS_values[lowFreq ? C.low_t3_tRAS : C.t3_tRAS]; - tRRD = tRRD_values[lowFreq ? C.low_t4_tRRD : C.t4_tRRD]; + tRRD = MIN(tRRD_values[lowFreq ? C.low_t4_tRRD : C.t4_tRRD], GetMaxTrrd(freq)); tRFCpb = tRFC_values[lowFreq ? C.low_t5_tRFC : C.t5_tRFC]; u32 tRTW = lowFreq ? C.low_t6_tRTW : C.t6_tRTW; diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.hpp index 99531813..4cafea52 100644 --- a/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.hpp +++ b/Source/Atmosphere/stratosphere/loader/source/oc/pcv/mariko/pcv_mariko_mtc.hpp @@ -26,6 +26,8 @@ namespace ams::ldr::hoc::pcv::mariko { + DramId GetDramId(); + void MtcGenerateFreqTables(); Result MemFreqMtcTable(u32 *ptr); Result MemFreqDvbTable(u32 *ptr); 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 616f8e7e..639e54d4 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp @@ -1342,7 +1342,7 @@ class RamTimingsSubmenuGui : public MiscGui { addConfigTrackbar(KipConfigValue_t1_tRCD, "t1 tRCD", ValueRange(0, 7, 1)); addConfigTrackbar(KipConfigValue_t2_tRP, "t2 tRP", ValueRange(0, 7, 1)); addConfigTrackbar(KipConfigValue_t3_tRAS, "t3 tRAS", ValueRange(0, 9, 1)); - addConfigTrackbar(KipConfigValue_t4_tRRD, "t4 tRRD", ValueRange(0, 6, 1)); + addConfigTrackbar(KipConfigValue_t4_tRRD, "t4 tRRD", ValueRange(0, 7, 1)); addConfigTrackbar(KipConfigValue_t5_tRFC, "t5 tRFC", ValueRange(0, IsErista() ? 5u : 10u, 1)); addConfigTrackbar(KipConfigValue_t6_tRTW, "t6 tRTW", ValueRange(0, 9, 1)); addConfigTrackbar(KipConfigValue_t7_tWTR, "t7 tWTR", ValueRange(0, 9, 1)); diff --git a/Source/hoc-clk/sysmodule/src/file/kip.cpp b/Source/hoc-clk/sysmodule/src/file/kip.cpp index 4f5f675a..97aa4771 100644 --- a/Source/hoc-clk/sysmodule/src/file/kip.cpp +++ b/Source/hoc-clk/sysmodule/src/file/kip.cpp @@ -367,6 +367,9 @@ namespace kip { config::DeleteKey(CONFIG_VAL_SECTION, "tdp_limit_l"); } config::SetConfigValues(&configValues, true); + if(previousVersion < 300 && version >= 300) { + configValues.values[KipConfigValue_t4_tRRD]++; // tRRD needs to be increased by one for equivalent timing + } } } // namespace kip