diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/mariko/calculate_timings.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/mariko/calculate_timings.cpp
index b1bc9456..86e13a19 100644
--- a/Source/Atmosphere/stratosphere/loader/source/oc/mariko/calculate_timings.cpp
+++ b/Source/Atmosphere/stratosphere/loader/source/oc/mariko/calculate_timings.cpp
@@ -14,172 +14,207 @@
* along with this program. If not, see .
*/
-#include "../oc_common.hpp"
#include "../mtc_timing_value.hpp"
+#include "../oc_common.hpp"
#include "timing_tables.hpp"
-namespace ams::ldr::oc::pcv::mariko {
+namespace ams::ldr::oc::pcv::mariko
+{
- s32 FixEinput(s32 val) {
- if (auto patch = FindEinput()) {
- return patch->correct;
- }
- return val;
+s32 FixEinput(s32 val)
+{
+ if (auto patch = FindEinput()) {
+ return patch->correct;
}
-
- u32 GetRext() {
- if (auto r = FindRext()) {
- return r->correct;
- }
- return 0x1A;
- }
-
- /* TODO: This function is quite uggly, refactor! */
- void CalculateMiscTimings() {
- tW2P = 0x2d;
- rdv = 0x39 + C.mem_burst_read_latency;
- einput_duration = 0x1C;
- quse_width = 0x8;
-
- for (u32 i = 0; i < g_misc_table_size; i++) {
- const auto& e = g_misc_table[i];
- if (C.marikoEmcMaxClock >= e.min_freq) {
- rdv += e.rdv_inc;
- if (e.einput) einput_duration = e.einput;
- if (e.quse_width) quse_width = e.quse_width;
- }
- }
-
- if (WL >= 16) tW2P += 6;
- if (WL >= 18) tW2P += 8;
-
- s32 einput_calc = quse_width - (0.010182 * (C.marikoEmcMaxClock / 1000.0) - 0.0879) + 0.5;
- einput = FixEinput(einput_calc);
- rext = GetRext();
- }
-
- void CalculateIbdly() {
- /* Ibdly is so inconsistent, I am using the most common value and then checking with a lookup table. */
- ibdly = 0x1000001D + C.mem_burst_read_latency;
-
- if (auto patch = FindIbdlyPatch()) {
- ibdly += patch->adjust;
- }
- }
-
- void CalculateObdly() {
- obdly = 0x10000002 + C.mem_burst_write_latency;
-
- if (auto patch = FindObdlyPatch()) {
- obdly += patch->adjust;
- }
- }
-
- void CalculateTWTPDEN() {
- tWTPDEN = tW2P + 1 + CEIL(tDQSS_max / tCK_avg) + CEIL(tDQS2DQ_max / tCK_avg) + 6;
- if (C.marikoEmcMaxClock >= 2'233'000 && C.marikoEmcMaxClock < 2'533'000) tWTPDEN++;
- if (C.marikoEmcMaxClock >= 2'433'000 && C.marikoEmcMaxClock < 2'800'000) tWTPDEN--;
- }
-
- void CalculateTR2W() {
- tR2W = CEIL(RL_DBI + (tDQSCK_max / tCK_avg) + (BL / 2) - WL + tWPRE + FLOOR(tRPST) + 9.0);
-
- if (auto patch = FindTR2WPatch()) {
- tR2W += patch->adjust;
- }
- }
-
- void CalculateTW2R() {
- tW2R = WL + (BL / 2) - 6 + CEIL(tWTR / tCK_avg);
-
- const FreqTW2R* t = FindTW2R();
- if (!t) return;
-
- tW2R += t->adjust;
-
- if (t->min_val) {
- tW2R = MAX(tW2R, t->min_val);
- }
-
- if (t->max_val) {
- tW2R = MIN(tW2R, t->max_val);
- }
- }
-
- void CalculateQuse() {
- quse = ROUND(0.002266 * (C.marikoEmcMaxClock / 1000.0) + 31.88) + C.mem_burst_read_latency;
-
- if (auto patch = FindQusePatch()) {
- quse += patch->adjust;
- }
- }
-
- void CalculateQrst() {
- qrst = 0x00070000;
- u32 qrst_calc = ROUND(22.1 - (C.marikoEmcMaxClock / 1000000.0) * 8.0) + C.mem_burst_read_latency;
- u32 qrst_low = MAX(static_cast(0), qrst_calc);
-
- if (C.marikoEmcMaxClock >= 2'533'000) {
- qrst = INCREMENT_HIGH_BYTES_BY(qrst, 1);
- } else if (C.marikoEmcMaxClock == 2'800'000) {
- qrst = SET_HIGH_BYTES(qrst, 6);
- }
-
- qrst = SET_LOW_BYTES(qrst, qrst_low);
-
- if (auto patch = FindQrstPatch()) {
- qrst = INCREMENT_LOW_BYTES_BY(qrst, patch->adjust);
- }
- }
-
- void CalculateQsafe() {
- qsafe = ROUND((C.marikoEmcMaxClock / 1000.0) / 138.0 + 37.4) + C.mem_burst_read_latency;
- if (auto patch = FindQsafePatch()) {
- qsafe += patch->adjust;
- }
- }
-
- void CalculateQpop() {
- qpop = FLOOR(((C.marikoEmcMaxClock / 1000.0) - 2133 + 167) / 200.0) + 0x2D + C.mem_burst_read_latency;
-
- if (C.marikoEmcMaxClock >= 3'133'000) qpop++;
- }
-
- void CalculatePdex2rw() {
- double freq_mhz = C.marikoEmcMaxClock / 1000.0;
-
- double pdex_local = (0.011 * freq_mhz) - 1.443;
- pdex2rw = static_cast(ROUND(pdex_local));
-
- if (pdex2rw < 22) pdex2rw = 22;
- if (pdex2rw > 33) pdex2rw = 33;
-
- if (auto patch = FindPdex2rwPatch()) {
- pdex2rw += patch->adjust;
- }
- }
-
- void CalculateCke2pden() {
- cke2pden = (static_cast((C.marikoEmcMaxClock / 1000.0) * 0.00875) - 0.65);
-
- if (auto patch = FindCke2pdenPatch()) {
- cke2pden += patch->adjust;
- }
- }
-
- void CalculateTimings() {
- CalculateMiscTimings();
- CalculateIbdly();
- CalculateObdly();
- CalculateTWTPDEN();
- CalculateTR2W();
- CalculateTW2R();
- CalculateQuse();
- CalculateQrst();
- CalculateQsafe();
- CalculateQpop();
- CalculatePdex2rw();
- CalculateCke2pden();
- }
-
+ return val;
}
+
+u32 GetRext()
+{
+ if (auto r = FindRext()) {
+ return r->correct;
+ }
+ return 0x1A;
+}
+
+/* TODO: This function is quite uggly, refactor! */
+void CalculateMiscTimings()
+{
+ tW2P = 0x2d;
+ rdv = 0x39 + C.mem_burst_read_latency;
+ einput_duration = 0x1C;
+ quse_width = 0x8;
+
+ for (u32 i = 0; i < g_misc_table_size; i++) {
+ const auto &e = g_misc_table[i];
+ if (C.marikoEmcMaxClock >= e.min_freq) {
+ rdv += e.rdv_inc;
+ if (e.einput)
+ einput_duration = e.einput;
+ if (e.quse_width)
+ quse_width = e.quse_width;
+ }
+ }
+
+ if (WL >= 16)
+ tW2P += 6;
+ if (WL >= 18)
+ tW2P += 8;
+
+ s32 einput_calc =
+ quse_width - (0.010182 * (C.marikoEmcMaxClock / 1000.0) - 0.0879) + 0.5;
+ einput = FixEinput(einput_calc);
+ rext = GetRext();
+}
+
+void CalculateIbdly()
+{
+ /* Ibdly is so inconsistent, I am using the most common value and then
+ * checking with a lookup table. */
+ ibdly = 0x1000001D + C.mem_burst_read_latency;
+
+ if (auto patch = FindIbdlyPatch()) {
+ ibdly += patch->adjust;
+ }
+}
+
+void CalculateObdly()
+{
+ obdly = 0x10000002 + C.mem_burst_write_latency;
+
+ if (auto patch = FindObdlyPatch()) {
+ obdly += patch->adjust;
+ }
+}
+
+void CalculateTWTPDEN()
+{
+ tWTPDEN =
+ tW2P + 1 + CEIL(tDQSS_max / tCK_avg) + CEIL(tDQS2DQ_max / tCK_avg) + 6;
+ if (C.marikoEmcMaxClock >= 2'233'000 && C.marikoEmcMaxClock < 2'533'000)
+ tWTPDEN++;
+ if (C.marikoEmcMaxClock >= 2'433'000 && C.marikoEmcMaxClock < 2'800'000)
+ tWTPDEN--;
+}
+
+void CalculateTR2W()
+{
+ tR2W = CEIL(RL_DBI + (tDQSCK_max / tCK_avg) + (BL / 2) - WL + tWPRE +
+ FLOOR(tRPST) + 9.0);
+
+ if (auto patch = FindTR2WPatch()) {
+ tR2W += patch->adjust;
+ }
+}
+
+void CalculateTW2R()
+{
+ tW2R = WL + (BL / 2) - 6 + CEIL(tWTR / tCK_avg);
+
+ const FreqTW2R *t = FindTW2R();
+ if (!t)
+ return;
+
+ tW2R += t->adjust;
+
+ if (t->min_val) {
+ tW2R = MAX(tW2R, t->min_val);
+ }
+
+ if (t->max_val) {
+ tW2R = MIN(tW2R, t->max_val);
+ }
+}
+
+void CalculateQuse()
+{
+ quse = ROUND(0.002266 * (C.marikoEmcMaxClock / 1000.0) + 31.88) +
+ C.mem_burst_read_latency;
+
+ if (auto patch = FindQusePatch()) {
+ quse += patch->adjust;
+ }
+}
+
+void CalculateQrst()
+{
+ qrst = 0x00070000;
+ u32 qrst_calc = ROUND(22.1 - (C.marikoEmcMaxClock / 1000000.0) * 8.0) +
+ C.mem_burst_read_latency;
+ u32 qrst_low = MAX(static_cast(0), qrst_calc);
+
+ if (C.marikoEmcMaxClock >= 2'533'000) {
+ qrst = INCREMENT_HIGH_BYTES_BY(qrst, 1);
+ } else if (C.marikoEmcMaxClock == 2'800'000) {
+ qrst = SET_HIGH_BYTES(qrst, 6);
+ }
+
+ qrst = SET_LOW_BYTES(qrst, qrst_low);
+
+ if (auto patch = FindQrstPatch()) {
+ qrst = INCREMENT_LOW_BYTES_BY(qrst, patch->adjust);
+ }
+}
+
+void CalculateQsafe()
+{
+ qsafe = ROUND((C.marikoEmcMaxClock / 1000.0) / 138.0 + 37.4) +
+ C.mem_burst_read_latency;
+ if (auto patch = FindQsafePatch()) {
+ qsafe += patch->adjust;
+ }
+}
+
+void CalculateQpop()
+{
+ qpop = FLOOR(((C.marikoEmcMaxClock / 1000.0) - 2133 + 167) / 200.0) + 0x2D +
+ C.mem_burst_read_latency;
+
+ if (C.marikoEmcMaxClock >= 3'133'000)
+ qpop++;
+}
+
+void CalculatePdex2rw()
+{
+ double freq_mhz = C.marikoEmcMaxClock / 1000.0;
+
+ double pdex_local = (0.011 * freq_mhz) - 1.443;
+ pdex2rw = static_cast(ROUND(pdex_local));
+
+ if (pdex2rw < 22)
+ pdex2rw = 22;
+ if (pdex2rw > 33)
+ pdex2rw = 33;
+
+ if (auto patch = FindPdex2rwPatch()) {
+ pdex2rw += patch->adjust;
+ }
+}
+
+void CalculateCke2pden()
+{
+ cke2pden =
+ (static_cast((C.marikoEmcMaxClock / 1000.0) * 0.00875) - 0.65);
+
+ if (auto patch = FindCke2pdenPatch()) {
+ cke2pden += patch->adjust;
+ }
+}
+
+void CalculateTimings()
+{
+ CalculateMiscTimings();
+ CalculateIbdly();
+ CalculateObdly();
+ CalculateTWTPDEN();
+ CalculateTR2W();
+ CalculateTW2R();
+ CalculateQuse();
+ CalculateQrst();
+ CalculateQsafe();
+ CalculateQpop();
+ CalculatePdex2rw();
+ CalculateCke2pden();
+}
+
+} // namespace ams::ldr::oc::pcv::mariko
diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/mariko/timing_tables.cpp b/Source/Atmosphere/stratosphere/loader/source/oc/mariko/timing_tables.cpp
index de54e965..b2ea5192 100644
--- a/Source/Atmosphere/stratosphere/loader/source/oc/mariko/timing_tables.cpp
+++ b/Source/Atmosphere/stratosphere/loader/source/oc/mariko/timing_tables.cpp
@@ -17,324 +17,363 @@
#include "../mtc_timing_value.hpp"
#include "timing_tables.hpp"
-namespace ams::ldr::oc::pcv::mariko {
+namespace ams::ldr::oc::pcv::mariko
+{
- const MiscTimings g_misc_table[] = {
- {1'866'000, 1, 0x20, 0x9, 0},
- {2'133'000, 1, 0x24, 0xA, 0},
- {2'166'000, 1, 0, 0, 0},
- {2'233'000, 0, 0x25, 0, 0},
- {2'300'000, 0, 0x26, 0xB, 0},
- {2'333'000, 0, 0x27, 0, 0},
- {2'366'000, 1, 0x26, 0xA, 0},
- {2'433'000, 0, 0x27, 0, 0},
- {2'466'000, 0, 0x2A, 0, 0},
- {2'500'000, 0, 0x28, 0xB, 0},
- {2'533'000, 0, 0x29, 0, -2},
- {2'566'000, 1, 0, 0, 0},
- {2'633'000, 0, 0x2A, 0, 0},
- {2'700'000, 0, 0x2B, 0xC, 0},
- {2'733'000, 0, 0x2C, 0, 0},
- {2'766'000, 1, 0x2B, 0xB, 0},
- {2'833'000, 0, 0x2C, 0, -2},
- {2'866'000, 0, 0, 0, -2},
- {2'900'000, 0, 0, 0, -2},
- {2'933'000, 0, 0x2E, 0xC, 0},
- {2'966'000, 1, 0, 0, 0},
- {3'033'000, 0, 0x2F, 0, 0},
- {3'133'000, 1, 0x31, 0xD, 0},
- };
+const MiscTimings g_misc_table[] = {
+ { 1'866'000, 1, 0x20, 0x9, 0 },
+ { 2'133'000, 1, 0x24, 0xA, 0 },
+ { 2'166'000, 1, 0, 0, 0 },
+ { 2'233'000, 0, 0x25, 0, 0 },
+ { 2'300'000, 0, 0x26, 0xB, 0 },
+ { 2'333'000, 0, 0x27, 0, 0 },
+ { 2'366'000, 1, 0x26, 0xA, 0 },
+ { 2'433'000, 0, 0x27, 0, 0 },
+ { 2'466'000, 0, 0x2A, 0, 0 },
+ { 2'500'000, 0, 0x28, 0xB, 0 },
+ { 2'533'000, 0, 0x29, 0, -2 },
+ { 2'566'000, 1, 0, 0, 0 },
+ { 2'633'000, 0, 0x2A, 0, 0 },
+ { 2'700'000, 0, 0x2B, 0xC, 0 },
+ { 2'733'000, 0, 0x2C, 0, 0 },
+ { 2'766'000, 1, 0x2B, 0xB, 0 },
+ { 2'833'000, 0, 0x2C, 0, -2 },
+ { 2'866'000, 0, 0, 0, -2 },
+ { 2'900'000, 0, 0, 0, -2 },
+ { 2'933'000, 0, 0x2E, 0xC, 0 },
+ { 2'966'000, 1, 0, 0, 0 },
+ { 3'033'000, 0, 0x2F, 0, 0 },
+ { 3'133'000, 1, 0x31, 0xD, 0 },
+};
- const u32 g_misc_table_size = sizeof(g_misc_table) / sizeof(g_misc_table[0]);
+const u32 g_misc_table_size = sizeof(g_misc_table) / sizeof(g_misc_table[0]);
- const ReplacePatch g_einput_patches[] = {
- {2'133'000, 0x16}, {2'166'000, 0x17}, {2'200'000, 0x17},
- {2'233'000, 0x16}, {2'266'000, 0x16}, {2'300'000, 0x15},
- {2'333'000, 0x14}, {2'366'000, 0x16}, {2'400'000, 0x16},
- {2'433'000, 0x15}, {2'466'000, 0x15}, {2'500'000, 0x14},
- {2'533'000, 0x13}, {2'566'000, 0x14}, {2'600'000, 0x14},
- {2'633'000, 0x13}, {2'666'000, 0x13}, {2'700'000, 0x12},
- {2'733'000, 0x11}, {2'766'000, 0x13}, {2'800'000, 0x13},
- {2'833'000, 0x12}, {2'866'000, 0x12}, {2'900'000, 0x12},
- {2'933'000, 0x10}, {2'966'000, 0x11}, {3'000'000, 0x11},
- {3'033'000, 0x10}, {3'066'000, 0x10}, {3'100'000, 0x10},
- {3'133'000, 0x0F}
- };
+const ReplacePatch g_einput_patches[] = { { 2'133'000, 0x16 },
+ { 2'166'000, 0x17 }, { 2'200'000, 0x17 }, { 2'233'000, 0x16 },
+ { 2'266'000, 0x16 }, { 2'300'000, 0x15 }, { 2'333'000, 0x14 },
+ { 2'366'000, 0x16 }, { 2'400'000, 0x16 }, { 2'433'000, 0x15 },
+ { 2'466'000, 0x15 }, { 2'500'000, 0x14 }, { 2'533'000, 0x13 },
+ { 2'566'000, 0x14 }, { 2'600'000, 0x14 }, { 2'633'000, 0x13 },
+ { 2'666'000, 0x13 }, { 2'700'000, 0x12 }, { 2'733'000, 0x11 },
+ { 2'766'000, 0x13 }, { 2'800'000, 0x13 }, { 2'833'000, 0x12 },
+ { 2'866'000, 0x12 }, { 2'900'000, 0x12 }, { 2'933'000, 0x10 },
+ { 2'966'000, 0x11 }, { 3'000'000, 0x11 }, { 3'033'000, 0x10 },
+ { 3'066'000, 0x10 }, { 3'100'000, 0x10 }, { 3'133'000, 0x0F } };
- const u32 g_einput_patches_size = sizeof(g_einput_patches) / sizeof(g_einput_patches[0]);
-
- const ReplacePatch *FindEinput() {
- for (u32 i = 0; i < g_einput_patches_size; i++)
- if (g_einput_patches[i].freq == C.marikoEmcMaxClock)
- return &g_einput_patches[i];
- return nullptr;
- }
-
- const ReplacePatch g_rext_table[] = {
- {2'133'000, 0x1A}, {2'166'000, 0x19}, {2'200'000, 0x19},
- {2'233'000, 0x19}, {2'266'000, 0x1A}, {2'300'000, 0x1B},
- {2'333'000, 0x1B}, {2'366'000, 0x1B}, {2'400'000, 0x1B},
- {2'433'000, 0x1B}, {2'466'000, 0x1B}, {2'500'000, 0x1A},
- {2'533'000, 0x1C}, {2'566'000, 0x1B}, {2'600'000, 0x17},
- {2'633'000, 0x1B}, {2'666'000, 0x1B}, {2'700'000, 0x1C},
- {2'733'000, 0x1C}, {2'766'000, 0x1D}, {2'800'000, 0x1D},
- {2'833'000, 0x1D}, {2'866'000, 0x1D}, {2'900'000, 0x1D},
- {2'933'000, 0x1C}, {2'966'000, 0x1D}, {3'000'000, 0x1D},
- {3'033'000, 0x1D}, {3'066'000, 0x1D}, {3'100'000, 0x1D},
- {3'133'000, 0x1D},
- };
-
- const u32 g_rext_table_size = sizeof(g_rext_table) / sizeof(g_rext_table[0]);
-
- const ReplacePatch *FindRext() {
- for (u32 i = 0; i < g_rext_table_size; i++)
- if (g_rext_table[i].freq == C.marikoEmcMaxClock)
- return &g_rext_table[i];
- return nullptr;
- }
-
- const FreqTW2R g_tw2r_table[] = {
- {2'300'000, 0x2B, 0xFFFFFFFF, 0},
- {2'400'000, 0, 0x2B, 0},
- {2'500'000, 0x2C, 0xFFFFFFFF, -1},
- {2'566'000, 0x2D, 0xFFFFFFFF, -1},
- {2'700'000, 0x2E, 0xFFFFFFFF, -1},
- {2'800'000, 0x2F, 0xFFFFFFFF, -1},
- {2'900'000, 0x30, 0xFFFFFFFF, -1},
- {3'000'000, 0x31, 0xFFFFFFFF, -1},
- {3'100'000, 0x32, 0xFFFFFFFF, -1},
- {0xFFFFFFFF, 0, 0x33, 0},
- };
-
- const u32 g_tw2r_table_size = sizeof(g_tw2r_table) / sizeof(g_tw2r_table[0]);
-
- const FreqTW2R *FindTW2R() {
- for (u32 i = 0; i < g_tw2r_table_size; i++)
- if (C.marikoEmcMaxClock <= g_tw2r_table[i].max_freq)
- return &g_tw2r_table[i];
- return nullptr;
- }
-
- const AdjustPatch g_ibdly_patches[] = {
- {2'133'000, -2},
- {2'166'000, -1},
- {2'200'000, -1},
- {2'233'000, -1},
- {2'266'000, -1},
- {2'300'000, -2},
- {2'333'000, -2},
- {2'500'000, -1},
- {2'533'000, -2},
- {2'566'000, -1},
- {2'633'000, -1},
- {2'666'000, -1},
- {2'700'000, -2},
- {2'733'000, -2},
- {2'833'000, -9},
- {2'933'000, -1},
- };
-
- const u32 g_ibdly_table_size = sizeof(g_ibdly_patches) / sizeof(g_ibdly_patches[0]);
-
- const AdjustPatch *FindIbdlyPatch() {
- for (u32 i = 0; i < g_ibdly_table_size; i++)
- if (g_ibdly_patches[i].freq == C.marikoEmcMaxClock)
- return &g_ibdly_patches[i];
- return nullptr;
- }
-
- const AdjustPatch g_obdly_patches[] = {
- {2'533'000, -2},
- {2'566'000, -2},
- {2'600'000, -2},
- {2'633'000, -2},
- {2'666'000, -2},
- {2'700'000, -2},
- {2'733'000, -2},
- {2'766'000, -2},
- {2'800'000, -2},
- {2'833'000, -4},
- {2'866'000, -2},
- {2'900'000, -4},
- {2'933'000, -2},
- {2'966'000, -2},
- {3'000'000, -2},
- {3'033'000, -2},
- {3'066'000, -2},
- {3'100'000, -2},
- {3'133'000, -2},
- };
-
- const u32 g_obdly_table_size = sizeof(g_obdly_patches) / sizeof(g_obdly_patches[0]);
-
- const AdjustPatch *FindObdlyPatch() {
- for (u32 i = 0; i < g_obdly_table_size; i++)
- if (g_obdly_patches[i].freq == C.marikoEmcMaxClock)
- return &g_obdly_patches[i];
- return nullptr;
- }
-
- const AdjustPatch g_tr2w_patches[] = {
- {2'500'000, 1},
- {2'533'000, 1},
- {2'566'000, 1},
- {2'866'000, -1},
- {3'100'000, 1},
- {3'133'000, 1},
- };
-
- const u32 g_tr2w_table_size = sizeof(g_tr2w_patches) / sizeof(g_tr2w_patches[0]);
-
- const AdjustPatch *FindTR2WPatch() {
- for (u32 i = 0; i < g_tr2w_table_size; i++)
- if (g_tr2w_patches[i].freq == C.marikoEmcMaxClock)
- return &g_tr2w_patches[i];
- return nullptr;
- }
-
- const AdjustPatch g_quse_patches[] = {
- {2'133'000, -1},
- {2'300'000, -1},
- {2'333'000, -1},
- {2'366'000, +1},
- {2'400'000, +1},
- {2'433'000, +1},
- {2'466'000, +1},
- {2'500'000, -1},
- {2'533'000, -1},
- {2'700'000, -1},
- {2'733'000, -1},
- {2'766'000, +1},
- {2'800'000, +1},
- {2'833'000, +1},
- {2'866'000, +1},
- {2'900'000, +1},
- {2'933'000, -1},
- };
-
- const u32 g_quse_table_size = sizeof(g_quse_patches) / sizeof(g_quse_patches[0]);
-
- const AdjustPatch *FindQusePatch() {
- for (u32 i = 0; i < g_quse_table_size; i++)
- if (g_quse_patches[i].freq == C.marikoEmcMaxClock)
- return &g_quse_patches[i];
- return nullptr;
- }
-
- const AdjustPatch g_qrst_patches[] = {
- {2'166'000, 1},
- {2'200'000, 1},
- {2'233'000, 1},
- {2'266'000, 1},
- {2'366'000, 2},
- {2'400'000, 2},
- {2'433'000, 1},
- {2'466'000, 2},
- {2'500'000, 1},
- {2'533'000, -1},
- {2'700'000, -1},
- {2'733'000, -1},
- {2'766'000, 1},
- {2'800'000, 4},
- {2'833'000, 1},
- {2'866'000, 1},
- {2'900'000, 1},
- {2'933'000, -1},
- {2'966'000, 1},
- {3'100'000, 1},
- {3'166'000, 1},
- {3'200'000, 1},
- };
-
- const u32 g_qrst_table_size = sizeof(g_qrst_patches) / sizeof(g_qrst_patches[0]);
-
- const AdjustPatch *FindQrstPatch() {
- for (u32 i = 0; i < g_qrst_table_size; i++)
- if (g_qrst_patches[i].freq == C.marikoEmcMaxClock)
- return &g_qrst_patches[i];
- return nullptr;
- }
-
- const AdjustPatch g_qsafe_patches[] = {
- {2'166'000, 1},
- {2'200'000, 1},
- {2'500'000, -1},
- {2'533'000, -1},
- {2'666'000, -1},
- {2'700'000, -1},
- {2'733'000, -1},
- {2'800'000, -1},
- {2'833'000, -1},
- {2'866'000, -1},
- {2'900'000, -1},
- {2'933'000, -2},
- {2'966'000, -1},
- {3'000'000, -1},
- {3'033'000, -1},
- {3'066'000, -2},
- {3'100'000, -2},
- {3'166'000, -1},
- {3'200'000, -1},
- };
-
- const u32 g_qsafe_table_size = sizeof(g_qsafe_patches) / sizeof(g_qsafe_patches[0]);
-
- const AdjustPatch *FindQsafePatch() {
- for (u32 i = 0; i < g_qsafe_table_size; i++)
- if (g_qsafe_patches[i].freq == C.marikoEmcMaxClock)
- return &g_qsafe_patches[i];
- return nullptr;
- }
-
- const AdjustPatch g_pdex2rw_patches[] = {
- {2'166'000, 1},
- {2'300'000, 1},
- {2'333'000, 1},
- {2'433'000, 1},
- {2'533'000, 0},
- {2'633'000, -1},
- {2'666'000, -1},
- {2'733'000, -1},
- {2'766'000, -1},
- {2'800'000, -1},
- {2'833'000, -1},
- {2'933'000, -1},
- {3'066'000, 1},
- };
-
- const u32 g_pdex2rw_table_size = sizeof(g_pdex2rw_patches) / sizeof(g_pdex2rw_patches[0]);
-
- const AdjustPatch *FindPdex2rwPatch() {
- for (u32 i = 0; i < g_pdex2rw_table_size; i++)
- if (g_pdex2rw_patches[i].freq == C.marikoEmcMaxClock)
- return &g_pdex2rw_patches[i];
- return nullptr;
- }
-
- const AdjustPatch g_cke2pden_patches[] = {
- {2'133'000, 1},
- {2'166'000, 1},
- {2'266'000, 1},
- {2'300'000, 1},
- {2'366'000, 1},
- {2'400'000, 1},
- {2'500'000, 1},
- {2'633'000, 1},
- {2'733'000, 1},
- {2'833'000, 1},
- {2'866'000, 1},
- {2'966'000, 1},
- {3'066'000, 1},
- {3'100'000, 1},
- };
-
- const u32 g_cke2pden_table_size = sizeof(g_cke2pden_patches) / sizeof(g_cke2pden_patches[0]);
-
- const AdjustPatch *FindCke2pdenPatch() {
- for (u32 i = 0; i < g_cke2pden_table_size; i++)
- if (g_cke2pden_patches[i].freq == C.marikoEmcMaxClock)
- return &g_cke2pden_patches[i];
- return nullptr;
- }
+const u32 g_einput_patches_size =
+sizeof(g_einput_patches) / sizeof(g_einput_patches[0]);
+const ReplacePatch *FindEinput()
+{
+ for (u32 i = 0; i < g_einput_patches_size; i++)
+ if (g_einput_patches[i].freq == C.marikoEmcMaxClock)
+ return &g_einput_patches[i];
+ return nullptr;
}
+
+const ReplacePatch g_rext_table[] = {
+ { 2'133'000, 0x1A },
+ { 2'166'000, 0x19 },
+ { 2'200'000, 0x19 },
+ { 2'233'000, 0x19 },
+ { 2'266'000, 0x1A },
+ { 2'300'000, 0x1B },
+ { 2'333'000, 0x1B },
+ { 2'366'000, 0x1B },
+ { 2'400'000, 0x1B },
+ { 2'433'000, 0x1B },
+ { 2'466'000, 0x1B },
+ { 2'500'000, 0x1A },
+ { 2'533'000, 0x1C },
+ { 2'566'000, 0x1B },
+ { 2'600'000, 0x17 },
+ { 2'633'000, 0x1B },
+ { 2'666'000, 0x1B },
+ { 2'700'000, 0x1C },
+ { 2'733'000, 0x1C },
+ { 2'766'000, 0x1D },
+ { 2'800'000, 0x1D },
+ { 2'833'000, 0x1D },
+ { 2'866'000, 0x1D },
+ { 2'900'000, 0x1D },
+ { 2'933'000, 0x1C },
+ { 2'966'000, 0x1D },
+ { 3'000'000, 0x1D },
+ { 3'033'000, 0x1D },
+ { 3'066'000, 0x1D },
+ { 3'100'000, 0x1D },
+ { 3'133'000, 0x1D },
+};
+
+const u32 g_rext_table_size = sizeof(g_rext_table) / sizeof(g_rext_table[0]);
+
+const ReplacePatch *FindRext()
+{
+ for (u32 i = 0; i < g_rext_table_size; i++)
+ if (g_rext_table[i].freq == C.marikoEmcMaxClock)
+ return &g_rext_table[i];
+ return nullptr;
+}
+
+const FreqTW2R g_tw2r_table[] = {
+ { 2'300'000, 0x2B, 0xFFFFFFFF, 0 },
+ { 2'400'000, 0, 0x2B, 0 },
+ { 2'500'000, 0x2C, 0xFFFFFFFF, -1 },
+ { 2'566'000, 0x2D, 0xFFFFFFFF, -1 },
+ { 2'700'000, 0x2E, 0xFFFFFFFF, -1 },
+ { 2'800'000, 0x2F, 0xFFFFFFFF, -1 },
+ { 2'900'000, 0x30, 0xFFFFFFFF, -1 },
+ { 3'000'000, 0x31, 0xFFFFFFFF, -1 },
+ { 3'100'000, 0x32, 0xFFFFFFFF, -1 },
+ { 0xFFFFFFFF, 0, 0x33, 0 },
+};
+
+const u32 g_tw2r_table_size = sizeof(g_tw2r_table) / sizeof(g_tw2r_table[0]);
+
+const FreqTW2R *FindTW2R()
+{
+ for (u32 i = 0; i < g_tw2r_table_size; i++)
+ if (C.marikoEmcMaxClock <= g_tw2r_table[i].max_freq)
+ return &g_tw2r_table[i];
+ return nullptr;
+}
+
+const AdjustPatch g_ibdly_patches[] = {
+ { 2'133'000, -2 },
+ { 2'166'000, -1 },
+ { 2'200'000, -1 },
+ { 2'233'000, -1 },
+ { 2'266'000, -1 },
+ { 2'300'000, -2 },
+ { 2'333'000, -2 },
+ { 2'500'000, -1 },
+ { 2'533'000, -2 },
+ { 2'566'000, -1 },
+ { 2'633'000, -1 },
+ { 2'666'000, -1 },
+ { 2'700'000, -2 },
+ { 2'733'000, -2 },
+ { 2'833'000, -9 },
+ { 2'933'000, -1 },
+};
+
+const u32 g_ibdly_table_size =
+sizeof(g_ibdly_patches) / sizeof(g_ibdly_patches[0]);
+
+const AdjustPatch *FindIbdlyPatch()
+{
+ for (u32 i = 0; i < g_ibdly_table_size; i++)
+ if (g_ibdly_patches[i].freq == C.marikoEmcMaxClock)
+ return &g_ibdly_patches[i];
+ return nullptr;
+}
+
+const AdjustPatch g_obdly_patches[] = {
+ { 2'533'000, -2 },
+ { 2'566'000, -2 },
+ { 2'600'000, -2 },
+ { 2'633'000, -2 },
+ { 2'666'000, -2 },
+ { 2'700'000, -2 },
+ { 2'733'000, -2 },
+ { 2'766'000, -2 },
+ { 2'800'000, -2 },
+ { 2'833'000, -4 },
+ { 2'866'000, -2 },
+ { 2'900'000, -4 },
+ { 2'933'000, -2 },
+ { 2'966'000, -2 },
+ { 3'000'000, -2 },
+ { 3'033'000, -2 },
+ { 3'066'000, -2 },
+ { 3'100'000, -2 },
+ { 3'133'000, -2 },
+};
+
+const u32 g_obdly_table_size =
+sizeof(g_obdly_patches) / sizeof(g_obdly_patches[0]);
+
+const AdjustPatch *FindObdlyPatch()
+{
+ for (u32 i = 0; i < g_obdly_table_size; i++)
+ if (g_obdly_patches[i].freq == C.marikoEmcMaxClock)
+ return &g_obdly_patches[i];
+ return nullptr;
+}
+
+const AdjustPatch g_tr2w_patches[] = {
+ { 2'500'000, 1 },
+ { 2'533'000, 1 },
+ { 2'566'000, 1 },
+ { 2'866'000, -1 },
+ { 3'100'000, 1 },
+ { 3'133'000, 1 },
+};
+
+const u32 g_tr2w_table_size =
+sizeof(g_tr2w_patches) / sizeof(g_tr2w_patches[0]);
+
+const AdjustPatch *FindTR2WPatch()
+{
+ for (u32 i = 0; i < g_tr2w_table_size; i++)
+ if (g_tr2w_patches[i].freq == C.marikoEmcMaxClock)
+ return &g_tr2w_patches[i];
+ return nullptr;
+}
+
+const AdjustPatch g_quse_patches[] = {
+ { 2'133'000, -1 },
+ { 2'300'000, -1 },
+ { 2'333'000, -1 },
+ { 2'366'000, +1 },
+ { 2'400'000, +1 },
+ { 2'433'000, +1 },
+ { 2'466'000, +1 },
+ { 2'500'000, -1 },
+ { 2'533'000, -1 },
+ { 2'700'000, -1 },
+ { 2'733'000, -1 },
+ { 2'766'000, +1 },
+ { 2'800'000, +1 },
+ { 2'833'000, +1 },
+ { 2'866'000, +1 },
+ { 2'900'000, +1 },
+ { 2'933'000, -1 },
+};
+
+const u32 g_quse_table_size =
+sizeof(g_quse_patches) / sizeof(g_quse_patches[0]);
+
+const AdjustPatch *FindQusePatch()
+{
+ for (u32 i = 0; i < g_quse_table_size; i++)
+ if (g_quse_patches[i].freq == C.marikoEmcMaxClock)
+ return &g_quse_patches[i];
+ return nullptr;
+}
+
+const AdjustPatch g_qrst_patches[] = {
+ { 2'166'000, 1 },
+ { 2'200'000, 1 },
+ { 2'233'000, 1 },
+ { 2'266'000, 1 },
+ { 2'366'000, 2 },
+ { 2'400'000, 2 },
+ { 2'433'000, 1 },
+ { 2'466'000, 2 },
+ { 2'500'000, 1 },
+ { 2'533'000, -1 },
+ { 2'700'000, -1 },
+ { 2'733'000, -1 },
+ { 2'766'000, 1 },
+ { 2'800'000, 4 },
+ { 2'833'000, 1 },
+ { 2'866'000, 1 },
+ { 2'900'000, 1 },
+ { 2'933'000, -1 },
+ { 2'966'000, 1 },
+ { 3'100'000, 1 },
+ { 3'166'000, 1 },
+ { 3'200'000, 1 },
+};
+
+const u32 g_qrst_table_size =
+sizeof(g_qrst_patches) / sizeof(g_qrst_patches[0]);
+
+const AdjustPatch *FindQrstPatch()
+{
+ for (u32 i = 0; i < g_qrst_table_size; i++)
+ if (g_qrst_patches[i].freq == C.marikoEmcMaxClock)
+ return &g_qrst_patches[i];
+ return nullptr;
+}
+
+const AdjustPatch g_qsafe_patches[] = {
+ { 2'166'000, 1 },
+ { 2'200'000, 1 },
+ { 2'500'000, -1 },
+ { 2'533'000, -1 },
+ { 2'666'000, -1 },
+ { 2'700'000, -1 },
+ { 2'733'000, -1 },
+ { 2'800'000, -1 },
+ { 2'833'000, -1 },
+ { 2'866'000, -1 },
+ { 2'900'000, -1 },
+ { 2'933'000, -2 },
+ { 2'966'000, -1 },
+ { 3'000'000, -1 },
+ { 3'033'000, -1 },
+ { 3'066'000, -2 },
+ { 3'100'000, -2 },
+ { 3'166'000, -1 },
+ { 3'200'000, -1 },
+};
+
+const u32 g_qsafe_table_size =
+sizeof(g_qsafe_patches) / sizeof(g_qsafe_patches[0]);
+
+const AdjustPatch *FindQsafePatch()
+{
+ for (u32 i = 0; i < g_qsafe_table_size; i++)
+ if (g_qsafe_patches[i].freq == C.marikoEmcMaxClock)
+ return &g_qsafe_patches[i];
+ return nullptr;
+}
+
+const AdjustPatch g_pdex2rw_patches[] = {
+ { 2'166'000, 1 },
+ { 2'300'000, 1 },
+ { 2'333'000, 1 },
+ { 2'433'000, 1 },
+ { 2'533'000, 0 },
+ { 2'633'000, -1 },
+ { 2'666'000, -1 },
+ { 2'733'000, -1 },
+ { 2'766'000, -1 },
+ { 2'800'000, -1 },
+ { 2'833'000, -1 },
+ { 2'933'000, -1 },
+ { 3'066'000, 1 },
+};
+
+const u32 g_pdex2rw_table_size =
+sizeof(g_pdex2rw_patches) / sizeof(g_pdex2rw_patches[0]);
+
+const AdjustPatch *FindPdex2rwPatch()
+{
+ for (u32 i = 0; i < g_pdex2rw_table_size; i++)
+ if (g_pdex2rw_patches[i].freq == C.marikoEmcMaxClock)
+ return &g_pdex2rw_patches[i];
+ return nullptr;
+}
+
+const AdjustPatch g_cke2pden_patches[] = {
+ { 2'133'000, 1 },
+ { 2'166'000, 1 },
+ { 2'266'000, 1 },
+ { 2'300'000, 1 },
+ { 2'366'000, 1 },
+ { 2'400'000, 1 },
+ { 2'500'000, 1 },
+ { 2'633'000, 1 },
+ { 2'733'000, 1 },
+ { 2'833'000, 1 },
+ { 2'866'000, 1 },
+ { 2'966'000, 1 },
+ { 3'066'000, 1 },
+ { 3'100'000, 1 },
+};
+
+const u32 g_cke2pden_table_size =
+sizeof(g_cke2pden_patches) / sizeof(g_cke2pden_patches[0]);
+
+const AdjustPatch *FindCke2pdenPatch()
+{
+ for (u32 i = 0; i < g_cke2pden_table_size; i++)
+ if (g_cke2pden_patches[i].freq == C.marikoEmcMaxClock)
+ return &g_cke2pden_patches[i];
+ return nullptr;
+}
+
+} // namespace ams::ldr::oc::pcv::mariko
diff --git a/Source/Atmosphere/stratosphere/loader/source/oc/mariko/timing_tables.hpp b/Source/Atmosphere/stratosphere/loader/source/oc/mariko/timing_tables.hpp
index ad5a9fa2..cd5198e7 100644
--- a/Source/Atmosphere/stratosphere/loader/source/oc/mariko/timing_tables.hpp
+++ b/Source/Atmosphere/stratosphere/loader/source/oc/mariko/timing_tables.hpp
@@ -17,78 +17,79 @@
#pragma once
#include "../mtc_timing_value.hpp"
-namespace ams::ldr::oc::pcv::mariko {
+namespace ams::ldr::oc::pcv::mariko
+{
- struct ReplacePatch {
- u32 freq;
- u32 correct;
- };
+struct ReplacePatch {
+ u32 freq;
+ u32 correct;
+};
- extern const ReplacePatch g_einput_patches[];
- extern const u32 g_einput_patches_size;
- const ReplacePatch *FindEinput();
+extern const ReplacePatch g_einput_patches[];
+extern const u32 g_einput_patches_size;
+const ReplacePatch *FindEinput();
- extern const ReplacePatch g_rext_table[];
- extern const u32 g_rext_table_size;
- const ReplacePatch *FindRext();
+extern const ReplacePatch g_rext_table[];
+extern const u32 g_rext_table_size;
+const ReplacePatch *FindRext();
- struct AdjustPatch {
- u32 freq;
- s32 adjust;
- };
+struct AdjustPatch {
+ u32 freq;
+ s32 adjust;
+};
- extern const AdjustPatch g_ibdly_patches[];
- extern const u32 g_ibdly_table_size;
- const AdjustPatch *FindIbdlyPatch();
+extern const AdjustPatch g_ibdly_patches[];
+extern const u32 g_ibdly_table_size;
+const AdjustPatch *FindIbdlyPatch();
- extern const AdjustPatch g_obdly_patches[];
- extern const u32 g_obdly_table_size;
- const AdjustPatch *FindObdlyPatch();
+extern const AdjustPatch g_obdly_patches[];
+extern const u32 g_obdly_table_size;
+const AdjustPatch *FindObdlyPatch();
- extern const AdjustPatch g_tr2w_patches[];
- extern const u32 g_tr2w_table_size;
- const AdjustPatch *FindTR2WPatch();
+extern const AdjustPatch g_tr2w_patches[];
+extern const u32 g_tr2w_table_size;
+const AdjustPatch *FindTR2WPatch();
- extern const AdjustPatch g_quse_patches[];
- extern const u32 g_quse_table_size;
- const AdjustPatch *FindQusePatch();
+extern const AdjustPatch g_quse_patches[];
+extern const u32 g_quse_table_size;
+const AdjustPatch *FindQusePatch();
- extern const AdjustPatch g_qrst_patches[];
- extern const u32 q_qrst_table_size;
- const AdjustPatch *FindQrstPatch();
+extern const AdjustPatch g_qrst_patches[];
+extern const u32 q_qrst_table_size;
+const AdjustPatch *FindQrstPatch();
- extern const AdjustPatch g_qsafe_patches[];
- extern const u32 g_qsafe_table_size;
- const AdjustPatch *FindQsafePatch();
+extern const AdjustPatch g_qsafe_patches[];
+extern const u32 g_qsafe_table_size;
+const AdjustPatch *FindQsafePatch();
- extern const AdjustPatch g_pdex2rw_patches[];
- extern const u32 g_pdex2rw_table_size;
- const AdjustPatch *FindPdex2rwPatch();
+extern const AdjustPatch g_pdex2rw_patches[];
+extern const u32 g_pdex2rw_table_size;
+const AdjustPatch *FindPdex2rwPatch();
- extern const AdjustPatch g_cke2pden_patches[];
- extern const u32 g_cke2pden_table_size;
- const AdjustPatch *FindCke2pdenPatch();
+extern const AdjustPatch g_cke2pden_patches[];
+extern const u32 g_cke2pden_table_size;
+const AdjustPatch *FindCke2pdenPatch();
- struct MiscTimings {
- u32 min_freq;
- u32 rdv_inc;
- u32 einput;
- u32 quse_width;
- s32 obdly_delta;
- };
+struct MiscTimings {
+ u32 min_freq;
+ u32 rdv_inc;
+ u32 einput;
+ u32 quse_width;
+ s32 obdly_delta;
+};
- extern const MiscTimings g_misc_table[];
- extern const u32 g_misc_table_size;
+extern const MiscTimings g_misc_table[];
+extern const u32 g_misc_table_size;
- struct FreqTW2R {
- u32 max_freq;
- u32 min_val;
- u32 max_val;
- s32 adjust;
- };
+struct FreqTW2R {
+ u32 max_freq;
+ u32 min_val;
+ u32 max_val;
+ s32 adjust;
+};
- extern const FreqTW2R g_tw2r_table[];
- extern const u32 g_tw2r_table_size;
- const FreqTW2R *FindTW2R();
+extern const FreqTW2R g_tw2r_table[];
+extern const u32 g_tw2r_table_size;
+const FreqTW2R *FindTW2R();
-}
+} // namespace ams::ldr::oc::pcv::mariko