redo timing
This commit is contained in:
@@ -56,13 +56,13 @@ volatile CustomizeTable C = {
|
|||||||
* - System instabilities
|
* - System instabilities
|
||||||
* - NAND corruption
|
* - NAND corruption
|
||||||
*/
|
*/
|
||||||
.eristaEmcMaxClock = 2132640,
|
.eristaEmcMaxClock = 2265280,
|
||||||
|
|
||||||
/* Mariko CPU:
|
/* Mariko CPU:
|
||||||
* - Max Voltage in mV:
|
* - Max Voltage in mV:
|
||||||
* Default voltage: 1120
|
* Default voltage: 1120
|
||||||
*/
|
*/
|
||||||
.marikoCpuMaxVolt = 1257,
|
.marikoCpuMaxVolt = 1120,
|
||||||
|
|
||||||
/* Mariko EMC(RAM):
|
/* Mariko EMC(RAM):
|
||||||
* - RAM Clock in kHz:
|
* - RAM Clock in kHz:
|
||||||
@@ -99,23 +99,17 @@ volatile CustomizeTable C = {
|
|||||||
|
|
||||||
.enableEristaCpuUnsafeFreqs = ENABLED,
|
.enableEristaCpuUnsafeFreqs = ENABLED,
|
||||||
|
|
||||||
.commonGpuVoltOffset = 0, // TODO: Split tRCD, tRP and tRAS into separate timings
|
.commonGpuVoltOffset = 0,
|
||||||
|
|
||||||
.marikoEmcDvbShift = 4,
|
.t1_tRCD = 4,
|
||||||
|
.t2_tRP = 5,
|
||||||
.ramTimingPresetOne = 0,
|
.t3_tRAS = 9,
|
||||||
|
.t4_tRRD = 1,
|
||||||
.ramTimingPresetTwo = 1,
|
.t5_tRFC = 2,
|
||||||
|
.t6_tRTW = 6,
|
||||||
.ramTimingPresetThree = 0,
|
.t7_tWTR = 4,
|
||||||
|
.t8_tREFI = 6,
|
||||||
.ramTimingPresetFour = 2,
|
.mem_burst_latency = 2,
|
||||||
|
|
||||||
.ramTimingPresetFive = 4,
|
|
||||||
|
|
||||||
.ramTimingPresetSix = 4, // Keep at 4, most optimal
|
|
||||||
|
|
||||||
.ramTimingPresetSeven = 0, // Sets the BL of the ram. Change to 2 to get 1866BL and set to 0 to keep the default 1600BL
|
|
||||||
|
|
||||||
// Erista default (HB-MGCH ST timing)
|
// Erista default (HB-MGCH ST timing)
|
||||||
//
|
//
|
||||||
@@ -161,7 +155,7 @@ volatile CustomizeTable C = {
|
|||||||
875 /* 691 */,
|
875 /* 691 */,
|
||||||
900 /* 768 */,
|
900 /* 768 */,
|
||||||
950 /* 844 */,
|
950 /* 844 */,
|
||||||
975 /* 921 */,
|
900 /* 921 */,
|
||||||
910 /* 998 (Disabled by default) */,
|
910 /* 998 (Disabled by default) */,
|
||||||
950 /* 1075 (Disabled by default) */,
|
950 /* 1075 (Disabled by default) */,
|
||||||
1000 /* 1152 (Disabled by default) */,
|
1000 /* 1152 (Disabled by default) */,
|
||||||
|
|||||||
@@ -16,34 +16,34 @@
|
|||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#define CUST_REV 11
|
#define CUST_REV 11
|
||||||
|
|
||||||
#include "oc_common.hpp"
|
#include "oc_common.hpp"
|
||||||
#include "pcv/pcv_common.hpp"
|
#include "pcv/pcv_common.hpp"
|
||||||
|
|
||||||
namespace ams::ldr::oc {
|
namespace ams::ldr::oc {
|
||||||
|
|
||||||
#include "mtc_timing_table.hpp"
|
#include "mtc_timing_table.hpp"
|
||||||
|
|
||||||
enum MtcConfig: u32 {
|
enum MtcConfig: u32 {
|
||||||
AUTO_ADJ_ALL = 0,
|
AUTO_ADJ_ALL = 0,
|
||||||
CUSTOM_ADJ_ALL = 1,
|
CUSTOM_ADJ_ALL = 1,
|
||||||
NO_ADJ_ALL = 2,
|
NO_ADJ_ALL = 2,
|
||||||
|
|
||||||
CUSTOMIZED_ALL = 4,
|
CUSTOMIZED_ALL = 4,
|
||||||
};
|
};
|
||||||
|
|
||||||
using CustomizeCpuDvfsTable = pcv::cvb_entry_t[pcv::DvfsTableEntryLimit];
|
using CustomizeCpuDvfsTable = pcv::cvb_entry_t[pcv::DvfsTableEntryLimit];
|
||||||
using CustomizeGpuDvfsTable = pcv::cvb_entry_t[pcv::DvfsTableEntryLimit];
|
using CustomizeGpuDvfsTable = pcv::cvb_entry_t[pcv::DvfsTableEntryLimit];
|
||||||
static_assert(sizeof(CustomizeCpuDvfsTable) == sizeof(CustomizeGpuDvfsTable));
|
static_assert(sizeof(CustomizeCpuDvfsTable) == sizeof(CustomizeGpuDvfsTable));
|
||||||
static_assert(sizeof(CustomizeCpuDvfsTable) == sizeof(pcv::cvb_entry_t) * pcv::DvfsTableEntryLimit);
|
static_assert(sizeof(CustomizeCpuDvfsTable) == sizeof(pcv::cvb_entry_t) * pcv::DvfsTableEntryLimit);
|
||||||
|
|
||||||
constexpr uint32_t ERISTA_MTC_MAGIC = 0x43544D45; // EMTC
|
constexpr uint32_t ERISTA_MTC_MAGIC = 0x43544D45; // EMTC
|
||||||
constexpr uint32_t MARIKO_MTC_MAGIC = 0x43544D4D; // MMTC
|
constexpr uint32_t MARIKO_MTC_MAGIC = 0x43544D4D; // MMTC
|
||||||
|
|
||||||
typedef struct CustomizeTable {
|
typedef struct CustomizeTable {
|
||||||
u8 cust[4] = {'C', 'U', 'S', 'T'};
|
u8 cust[4] = {'C', 'U', 'S', 'T'};
|
||||||
u32 custRev = CUST_REV;
|
u32 custRev = CUST_REV;
|
||||||
u32 mtcConf = AUTO_ADJ_ALL;
|
u32 mtcConf = AUTO_ADJ_ALL;
|
||||||
@@ -67,16 +67,20 @@ typedef struct CustomizeTable {
|
|||||||
u32 enableEristaCpuUnsafeFreqs;
|
u32 enableEristaCpuUnsafeFreqs;
|
||||||
|
|
||||||
u32 commonGpuVoltOffset;
|
u32 commonGpuVoltOffset;
|
||||||
// advanced config
|
|
||||||
u32 marikoEmcDvbShift;
|
u32 marikoEmcDvbShift;
|
||||||
u32 ramTimingPresetOne;
|
|
||||||
u32 ramTimingPresetTwo;
|
// advanced config
|
||||||
u32 ramTimingPresetThree;
|
u32 t1_tRCD;
|
||||||
u32 ramTimingPresetFour;
|
u32 t2_tRP;
|
||||||
u32 ramTimingPresetFive;
|
u32 t3_tRAS;
|
||||||
u32 ramTimingPresetSix;
|
u32 t4_tRRD;
|
||||||
u32 ramTimingPresetSeven;
|
u32 t5_tRFC;
|
||||||
//
|
u32 t6_tRTW;
|
||||||
|
u32 t7_tWTR;
|
||||||
|
u32 t8_tREFI;
|
||||||
|
u32 mem_burst_latency;
|
||||||
|
|
||||||
u32 marikoGpuVoltArray[24];
|
u32 marikoGpuVoltArray[24];
|
||||||
u32 eristaGpuVoltArray[15];
|
u32 eristaGpuVoltArray[15];
|
||||||
|
|
||||||
@@ -99,13 +103,13 @@ typedef struct CustomizeTable {
|
|||||||
CustomizeCpuDvfsTable marikoCpuDvfsTableUnsafeFreqs;
|
CustomizeCpuDvfsTable marikoCpuDvfsTableUnsafeFreqs;
|
||||||
CustomizeCpuDvfsTable eristaCpuDvfsTableUnsafeFreqs;
|
CustomizeCpuDvfsTable eristaCpuDvfsTableUnsafeFreqs;
|
||||||
|
|
||||||
} CustomizeTable;
|
} CustomizeTable;
|
||||||
//static_assert(sizeof(CustomizeTable) == sizeof(u8) * 4 + sizeof(u32) * 10 + sizeof(CustomizeCpuDvfsTable) * 5 + sizeof(void*) * 2);
|
//static_assert(sizeof(CustomizeTable) == sizeof(u8) * 4 + sizeof(u32) * 10 + sizeof(CustomizeCpuDvfsTable) * 5 + sizeof(void*) * 2);
|
||||||
//static_assert(sizeof(CustomizeTable) == 7000);
|
//static_assert(sizeof(CustomizeTable) == 7000);
|
||||||
|
|
||||||
extern volatile CustomizeTable C;
|
extern volatile CustomizeTable C;
|
||||||
|
|
||||||
//extern volatile EristaMtcTable EristaMtcTablePlaceholder;
|
//extern volatile EristaMtcTable EristaMtcTablePlaceholder;
|
||||||
//extern volatile MarikoMtcTable MarikoMtcTablePlaceholder;
|
//extern volatile MarikoMtcTable MarikoMtcTablePlaceholder;
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -16,11 +16,13 @@
|
|||||||
* from GCC preprocessor output
|
* from GCC preprocessor output
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "oc_common.hpp"
|
|
||||||
|
|
||||||
namespace ams::ldr::oc {
|
#pragma once
|
||||||
|
|
||||||
|
#include "oc_common.hpp"
|
||||||
|
|
||||||
|
namespace ams::ldr::oc {
|
||||||
#define MAX(A, B) std::max(A, B)
|
#define MAX(A, B) std::max(A, B)
|
||||||
#define MIN(A, B) std::min(A, B)
|
#define MIN(A, B) std::min(A, B)
|
||||||
#define CEIL(A) std::ceil(A)
|
#define CEIL(A) std::ceil(A)
|
||||||
@@ -36,7 +38,7 @@ namespace ams::ldr::oc {
|
|||||||
const std::array<double, 5> tFAW_values = {40, 30, 24, 16, 12};
|
const std::array<double, 5> tFAW_values = {40, 30, 24, 16, 12};
|
||||||
|
|
||||||
// Preset Three
|
// Preset Three
|
||||||
const std::array<u32, 6> tWR_values = {18, 15, 15, 12, 12, 8};
|
const std::array<u32, 6> tWR_values = {18, 15, 15, 12, 12, 8}; // TODO: identify what exactly eos tRTW even is (is it even real?)
|
||||||
const std::array<double, 6> tRTP_values = {7.5, 7.5, 6, 6, 4, 4};
|
const std::array<double, 6> tRTP_values = {7.5, 7.5, 6, 6, 4, 4};
|
||||||
|
|
||||||
// Preset Four
|
// Preset Four
|
||||||
@@ -46,33 +48,33 @@ namespace ams::ldr::oc {
|
|||||||
const std::array<u32, 10> tWTR_values = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
|
const std::array<u32, 10> tWTR_values = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
|
||||||
|
|
||||||
// Preset Six
|
// Preset Six
|
||||||
const std::array<u32, 5> tREFpb_values = {488, 976, 1952, 3256, 9999};
|
const std::array<u32, 6> tREFpb_values = {488, 976, 1952, 3256, 9999, 9999};
|
||||||
|
|
||||||
const u32 TIMING_PRESET_ONE = C.ramTimingPresetOne;
|
// const u32 TIMING_PRESET_ONE = C.ramTimingPresetOne;
|
||||||
const u32 TIMING_PRESET_TWO = C.ramTimingPresetTwo;
|
// const u32 TIMING_PRESET_TWO = C.ramTimingPresetTwo;
|
||||||
const u32 TIMING_PRESET_THREE = C.ramTimingPresetThree;
|
const u32 TIMING_PRESET_THREE = 0;
|
||||||
const u32 TIMING_PRESET_FOUR = C.ramTimingPresetFour;
|
// const u32 TIMING_PRESET_FOUR = C.ramTimingPresetFour;
|
||||||
const u32 TIMING_PRESET_FIVE = C.ramTimingPresetFive;
|
// const u32 TIMING_PRESET_FIVE = C.ramTimingPresetFive;
|
||||||
const u32 TIMING_PRESET_SIX = C.ramTimingPresetSix;
|
// const u32 TIMING_PRESET_SIX = C.ramTimingPresetSix;
|
||||||
const u32 TIMING_PRESET_SEVEN = C.ramTimingPresetSeven;
|
// const u32 TIMING_PRESET_SEVEN = C.ramTimingPresetSeven;
|
||||||
|
|
||||||
// Burst Length
|
// Burst Length
|
||||||
const u32 BL = 16;
|
const u32 BL = 16;
|
||||||
|
|
||||||
// tRFCpb (refresh cycle time per bank) in ns for 8Gb density
|
// tRFCpb (refresh cycle time per bank) in ns for 8Gb density
|
||||||
const u32 tRFCpb = !TIMING_PRESET_FOUR ? 140 : tRFC_values[TIMING_PRESET_FOUR-1];
|
const u32 tRFCpb = !C.t5_tRFC ? 140 : tRFC_values[C.t5_tRFC-1];
|
||||||
|
|
||||||
// tRFCab (refresh cycle time all banks) in ns for 8Gb density
|
// tRFCab (refresh cycle time all banks) in ns for 8Gb density
|
||||||
const u32 tRFCab = !TIMING_PRESET_FOUR ? 280 : 2*tRFCpb;
|
const u32 tRFCab = !C.t5_tRFC ? 280 : 2*tRFCpb;
|
||||||
|
|
||||||
// tRAS (row active time) in ns
|
// tRAS (row active time) in ns
|
||||||
const u32 tRAS = !TIMING_PRESET_ONE ? 42 : tRAS_values[TIMING_PRESET_ONE-1];
|
const u32 tRAS = !C.t3_tRAS ? 42 : tRAS_values[C.t3_tRAS-1];
|
||||||
|
|
||||||
// tRPpb (row precharge time per bank) in ns
|
// tRPpb (row precharge time per bank) in ns
|
||||||
const u32 tRPpb = !TIMING_PRESET_ONE ? 18 : tRP_values[TIMING_PRESET_ONE-1];
|
const u32 tRPpb = !C.t2_tRP ? 18 : tRP_values[C.t2_tRP-1];
|
||||||
|
|
||||||
// tRPab (row precharge time all banks) in ns
|
// tRPab (row precharge time all banks) in ns
|
||||||
const u32 tRPab = !TIMING_PRESET_ONE ? 21 : tRPpb + 3;
|
const u32 tRPab = !C.t2_tRP ? 21 : tRPpb + 3;
|
||||||
|
|
||||||
// tRC (ACTIVATE-ACTIVATE command period same bank) in ns
|
// tRC (ACTIVATE-ACTIVATE command period same bank) in ns
|
||||||
const u32 tRC = tRPpb + tRAS;
|
const u32 tRC = tRPpb + tRAS;
|
||||||
@@ -93,7 +95,7 @@ namespace ams::ldr::oc {
|
|||||||
const double tDQSQ = 0.18;
|
const double tDQSQ = 0.18;
|
||||||
|
|
||||||
// Write-to-Read delay
|
// Write-to-Read delay
|
||||||
const u32 tWTR = !TIMING_PRESET_FIVE ? 10 : tWTR_values[TIMING_PRESET_FIVE-1];
|
const u32 tWTR = !C.t7_tWTR ? 10 : tWTR_values[C.t7_tWTR-1];
|
||||||
|
|
||||||
// Internal READ-to-PRE-CHARGE command delay in ns
|
// Internal READ-to-PRE-CHARGE command delay in ns
|
||||||
const double tRTP = !TIMING_PRESET_THREE ? 7.5 : tRTP_values[TIMING_PRESET_THREE-1];
|
const double tRTP = !TIMING_PRESET_THREE ? 7.5 : tRTP_values[TIMING_PRESET_THREE-1];
|
||||||
@@ -105,13 +107,13 @@ namespace ams::ldr::oc {
|
|||||||
const u32 tR2REF = tRTP + tRPpb;
|
const u32 tR2REF = tRTP + tRPpb;
|
||||||
|
|
||||||
// tRCD (RAS-CAS delay) in ns
|
// tRCD (RAS-CAS delay) in ns
|
||||||
const u32 tRCD = !TIMING_PRESET_ONE ? 18 : tRCD_values[TIMING_PRESET_ONE-1];
|
const u32 tRCD = !C.t1_tRCD ? 18 : tRCD_values[C.t1_tRCD-1];
|
||||||
|
|
||||||
// tRRD (Active bank-A to Active bank-B) in ns
|
// tRRD (Active bank-A to Active bank-B) in ns
|
||||||
const double tRRD = !TIMING_PRESET_TWO ? 10. : tRRD_values[TIMING_PRESET_TWO-1];
|
const double tRRD = !C.t4_tRRD ? 10. : tRRD_values[C.t4_tRRD-1];
|
||||||
|
|
||||||
// tREFpb (average refresh interval per bank) in ns for 8Gb density
|
// tREFpb (average refresh interval per bank) in ns for 8Gb density
|
||||||
const u32 tREFpb = !TIMING_PRESET_SIX ? 488 : tREFpb_values[TIMING_PRESET_SIX-1];
|
const u32 tREFpb = !C.t8_tREFI ? 488 : tREFpb_values[C.t8_tREFI-1];
|
||||||
// tREFab (average refresh interval all 8 banks) in ns for 8Gb density
|
// tREFab (average refresh interval all 8 banks) in ns for 8Gb density
|
||||||
// const u32 tREFab = tREFpb * 8;
|
// const u32 tREFab = tREFpb * 8;
|
||||||
|
|
||||||
@@ -143,7 +145,7 @@ namespace ams::ldr::oc {
|
|||||||
const u32 tSR = 15;
|
const u32 tSR = 15;
|
||||||
|
|
||||||
// tFAW (Four-bank Activate Window) in ns
|
// tFAW (Four-bank Activate Window) in ns
|
||||||
const u32 tFAW = !TIMING_PRESET_TWO ? 40 : tFAW_values[TIMING_PRESET_TWO-1];
|
const u32 tFAW = 40;// !TIMING_PRESET_TWO ? 40 : tFAW_values[TIMING_PRESET_TWO-1]; TOGO
|
||||||
|
|
||||||
// Valid Clock requirement before CKE Input HIGH in ns
|
// Valid Clock requirement before CKE Input HIGH in ns
|
||||||
const double tCKCKEH = 1.75;
|
const double tCKCKEH = 1.75;
|
||||||
@@ -156,9 +158,9 @@ namespace ams::ldr::oc {
|
|||||||
const double tCK_avg = 1000'000. / C.eristaEmcMaxClock;
|
const double tCK_avg = 1000'000. / C.eristaEmcMaxClock;
|
||||||
|
|
||||||
// Write Latency
|
// Write Latency
|
||||||
const u32 WL = 14 + TIMING_PRESET_SEVEN;
|
const u32 WL = 14 + C.mem_burst_latency;
|
||||||
// Read Latency
|
// Read Latency
|
||||||
const u32 RL = 32 + TIMING_PRESET_SEVEN;
|
const u32 RL = 32 - C.mem_burst_latency;
|
||||||
|
|
||||||
// minimum number of cycles from any read command to any write command, irrespective of bank
|
// minimum number of cycles from any read command to any write command, irrespective of bank
|
||||||
const u32 R2W = CEIL (RL + CEIL(tDQSCK_max/tCK_avg) + BL/2 - WL + tWPRE + FLOOR(tRPST)) + 6;
|
const u32 R2W = CEIL (RL + CEIL(tDQSCK_max/tCK_avg) + BL/2 - WL + tWPRE + FLOOR(tRPST)) + 6;
|
||||||
@@ -190,9 +192,9 @@ namespace ams::ldr::oc {
|
|||||||
// tCK_avg (average clock period) in ns
|
// tCK_avg (average clock period) in ns
|
||||||
const double tCK_avg = 1000'000. / C.marikoEmcMaxClock;
|
const double tCK_avg = 1000'000. / C.marikoEmcMaxClock;
|
||||||
// Write Latency
|
// Write Latency
|
||||||
const u32 WL = 14 + TIMING_PRESET_SEVEN;
|
const u32 WL = 14 + C.mem_burst_latency;
|
||||||
// Read Latency
|
// Read Latency
|
||||||
const u32 RL = 32 + TIMING_PRESET_SEVEN;
|
const u32 RL = 32 - C.mem_burst_latency;
|
||||||
|
|
||||||
// minimum number of cycles from any read command to any write command, irrespective of bank
|
// minimum number of cycles from any read command to any write command, irrespective of bank
|
||||||
const u32 R2W = CEIL (RL + CEIL(tDQSCK_max/tCK_avg) + BL/2 - WL + tWPRE + FLOOR(tRPST));
|
const u32 R2W = CEIL (RL + CEIL(tDQSCK_max/tCK_avg) + BL/2 - WL + tWPRE + FLOOR(tRPST));
|
||||||
@@ -232,4 +234,5 @@ namespace ams::ldr::oc {
|
|||||||
// tPDEX2MRR (timing delay from exiting powerdown mode to MRR command) in ns
|
// tPDEX2MRR (timing delay from exiting powerdown mode to MRR command) in ns
|
||||||
const double tPDEX2MRR = tXP + tMRRI;
|
const double tPDEX2MRR = tXP + tMRRI;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -16,11 +16,11 @@
|
|||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "pcv.hpp"
|
#include "pcv.hpp"
|
||||||
#include "../mtc_timing_value.hpp"
|
#include "../mtc_timing_value.hpp"
|
||||||
|
|
||||||
namespace ams::ldr::oc::pcv::erista
|
namespace ams::ldr::oc::pcv::erista
|
||||||
{
|
{
|
||||||
|
|
||||||
Result CpuVoltRange(u32 *ptr)
|
Result CpuVoltRange(u32 *ptr)
|
||||||
{
|
{
|
||||||
@@ -107,13 +107,13 @@ namespace ams::ldr::oc::pcv::erista
|
|||||||
if (C.mtcConf != AUTO_ADJ_ALL)
|
if (C.mtcConf != AUTO_ADJ_ALL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
#define WRITE_PARAM_ALL_REG(TABLE, PARAM, VALUE) \
|
#define WRITE_PARAM_ALL_REG(TABLE, PARAM, VALUE) \
|
||||||
TABLE->burst_regs.PARAM = VALUE; \
|
TABLE->burst_regs.PARAM = VALUE; \
|
||||||
TABLE->shadow_regs_ca_train.PARAM = VALUE; \
|
TABLE->shadow_regs_ca_train.PARAM = VALUE; \
|
||||||
TABLE->shadow_regs_quse_train.PARAM = VALUE; \
|
TABLE->shadow_regs_quse_train.PARAM = VALUE; \
|
||||||
TABLE->shadow_regs_rdwr_train.PARAM = VALUE;
|
TABLE->shadow_regs_rdwr_train.PARAM = VALUE;
|
||||||
|
|
||||||
#define GET_CYCLE_CEIL(PARAM) u32(CEIL(double(PARAM) / tCK_avg))
|
#define GET_CYCLE_CEIL(PARAM) u32(CEIL(double(PARAM) / tCK_avg))
|
||||||
|
|
||||||
WRITE_PARAM_ALL_REG(table, emc_rc, GET_CYCLE_CEIL(tRC));
|
WRITE_PARAM_ALL_REG(table, emc_rc, GET_CYCLE_CEIL(tRC));
|
||||||
WRITE_PARAM_ALL_REG(table, emc_rfc, GET_CYCLE_CEIL(tRFCab));
|
WRITE_PARAM_ALL_REG(table, emc_rfc, GET_CYCLE_CEIL(tRFCab));
|
||||||
@@ -149,7 +149,7 @@ namespace ams::ldr::oc::pcv::erista
|
|||||||
WRITE_PARAM_ALL_REG(table, emc_tclkstop, GET_CYCLE_CEIL(tCKE) + 8);
|
WRITE_PARAM_ALL_REG(table, emc_tclkstop, GET_CYCLE_CEIL(tCKE) + 8);
|
||||||
WRITE_PARAM_ALL_REG(table, emc_trefbw, REFBW);
|
WRITE_PARAM_ALL_REG(table, emc_trefbw, REFBW);
|
||||||
|
|
||||||
#define WRITE_PARAM_BURST_MC_REG(TABLE, PARAM, VALUE) TABLE->burst_mc_regs.PARAM = VALUE;
|
#define WRITE_PARAM_BURST_MC_REG(TABLE, PARAM, VALUE) TABLE->burst_mc_regs.PARAM = VALUE;
|
||||||
|
|
||||||
constexpr u32 MC_ARB_DIV = 4;
|
constexpr u32 MC_ARB_DIV = 4;
|
||||||
constexpr u32 MC_ARB_SFA = 2;
|
constexpr u32 MC_ARB_SFA = 2;
|
||||||
@@ -177,8 +177,6 @@ namespace ams::ldr::oc::pcv::erista
|
|||||||
constexpr u32 MC_ARB_DIV = 4;
|
constexpr u32 MC_ARB_DIV = 4;
|
||||||
constexpr u32 MC_ARB_SFA = 2;
|
constexpr u32 MC_ARB_SFA = 2;
|
||||||
|
|
||||||
if (TIMING_PRESET_ONE)
|
|
||||||
{
|
|
||||||
WRITE_PARAM_ALL_REG(table, emc_rc, GET_CYCLE_CEIL(tRC));
|
WRITE_PARAM_ALL_REG(table, emc_rc, GET_CYCLE_CEIL(tRC));
|
||||||
WRITE_PARAM_ALL_REG(table, emc_ras, GET_CYCLE_CEIL(tRAS));
|
WRITE_PARAM_ALL_REG(table, emc_ras, GET_CYCLE_CEIL(tRAS));
|
||||||
WRITE_PARAM_ALL_REG(table, emc_rp, GET_CYCLE_CEIL(tRPpb));
|
WRITE_PARAM_ALL_REG(table, emc_rp, GET_CYCLE_CEIL(tRPpb));
|
||||||
@@ -191,53 +189,37 @@ namespace ams::ldr::oc::pcv::erista
|
|||||||
table->burst_mc_regs.mc_emem_arb_timing_rc = CEIL(GET_CYCLE_CEIL(tRC) / MC_ARB_DIV - 1);
|
table->burst_mc_regs.mc_emem_arb_timing_rc = CEIL(GET_CYCLE_CEIL(tRC) / MC_ARB_DIV - 1);
|
||||||
table->burst_mc_regs.mc_emem_arb_timing_rp = CEIL(GET_CYCLE_CEIL(tRPpb) / MC_ARB_DIV - 1 + MC_ARB_SFA);
|
table->burst_mc_regs.mc_emem_arb_timing_rp = CEIL(GET_CYCLE_CEIL(tRPpb) / MC_ARB_DIV - 1 + MC_ARB_SFA);
|
||||||
table->burst_mc_regs.mc_emem_arb_timing_ras = CEIL(GET_CYCLE_CEIL(tRAS) / MC_ARB_DIV - 2);
|
table->burst_mc_regs.mc_emem_arb_timing_ras = CEIL(GET_CYCLE_CEIL(tRAS) / MC_ARB_DIV - 2);
|
||||||
}
|
|
||||||
|
|
||||||
if (TIMING_PRESET_TWO)
|
|
||||||
{
|
|
||||||
WRITE_PARAM_ALL_REG(table, emc_tfaw, GET_CYCLE_CEIL(tFAW));
|
WRITE_PARAM_ALL_REG(table, emc_tfaw, GET_CYCLE_CEIL(tFAW));
|
||||||
WRITE_PARAM_ALL_REG(table, emc_rrd, GET_CYCLE_CEIL(tRRD));
|
WRITE_PARAM_ALL_REG(table, emc_rrd, GET_CYCLE_CEIL(tRRD));
|
||||||
|
|
||||||
table->burst_mc_regs.mc_emem_arb_timing_faw = CEIL(GET_CYCLE_CEIL(tFAW) / MC_ARB_DIV) - 1;
|
table->burst_mc_regs.mc_emem_arb_timing_faw = CEIL(GET_CYCLE_CEIL(tFAW) / MC_ARB_DIV) - 1;
|
||||||
table->burst_mc_regs.mc_emem_arb_timing_rrd = CEIL(GET_CYCLE_CEIL(tRRD) / MC_ARB_DIV) - 1;
|
table->burst_mc_regs.mc_emem_arb_timing_rrd = CEIL(GET_CYCLE_CEIL(tRRD) / MC_ARB_DIV) - 1;
|
||||||
}
|
|
||||||
|
|
||||||
if (TIMING_PRESET_THREE)
|
|
||||||
{
|
|
||||||
WRITE_PARAM_ALL_REG(table, emc_r2p, GET_CYCLE_CEIL(tRTP));
|
WRITE_PARAM_ALL_REG(table, emc_r2p, GET_CYCLE_CEIL(tRTP));
|
||||||
WRITE_PARAM_ALL_REG(table, emc_w2p, WTP);
|
WRITE_PARAM_ALL_REG(table, emc_w2p, WTP);
|
||||||
WRITE_PARAM_ALL_REG(table, emc_rw2pden, WTPDEN);
|
WRITE_PARAM_ALL_REG(table, emc_rw2pden, WTPDEN);
|
||||||
|
|
||||||
table->burst_mc_regs.mc_emem_arb_timing_rap2pre = CEIL(GET_CYCLE_CEIL(tRTP) / MC_ARB_DIV);
|
table->burst_mc_regs.mc_emem_arb_timing_rap2pre = CEIL(GET_CYCLE_CEIL(tRTP) / MC_ARB_DIV);
|
||||||
table->burst_mc_regs.mc_emem_arb_timing_wap2pre = CEIL(WTP / MC_ARB_DIV);
|
table->burst_mc_regs.mc_emem_arb_timing_wap2pre = CEIL(WTP / MC_ARB_DIV);
|
||||||
}
|
|
||||||
|
|
||||||
if (TIMING_PRESET_FOUR)
|
|
||||||
{
|
|
||||||
WRITE_PARAM_ALL_REG(table, emc_rfc, GET_CYCLE_CEIL(tRFCab));
|
WRITE_PARAM_ALL_REG(table, emc_rfc, GET_CYCLE_CEIL(tRFCab));
|
||||||
WRITE_PARAM_ALL_REG(table, emc_rfcpb, GET_CYCLE_CEIL(tRFCpb));
|
WRITE_PARAM_ALL_REG(table, emc_rfcpb, GET_CYCLE_CEIL(tRFCpb));
|
||||||
WRITE_PARAM_ALL_REG(table, emc_txsr, MIN(GET_CYCLE_CEIL(tXSR), (u32)0x3fe));
|
WRITE_PARAM_ALL_REG(table, emc_txsr, MIN(GET_CYCLE_CEIL(tXSR), (u32)0x3fe));
|
||||||
WRITE_PARAM_ALL_REG(table, emc_txsrdll, MIN(GET_CYCLE_CEIL(tXSR), (u32)0x3fe));
|
WRITE_PARAM_ALL_REG(table, emc_txsrdll, MIN(GET_CYCLE_CEIL(tXSR), (u32)0x3fe));
|
||||||
|
|
||||||
table->burst_mc_regs.mc_emem_arb_timing_rfcpb = CEIL(GET_CYCLE_CEIL(tRFCpb) / MC_ARB_DIV);
|
table->burst_mc_regs.mc_emem_arb_timing_rfcpb = CEIL(GET_CYCLE_CEIL(tRFCpb) / MC_ARB_DIV);
|
||||||
}
|
|
||||||
|
|
||||||
if (TIMING_PRESET_FIVE)
|
|
||||||
{
|
|
||||||
WRITE_PARAM_ALL_REG(table, emc_w2r, W2R);
|
WRITE_PARAM_ALL_REG(table, emc_w2r, W2R);
|
||||||
|
|
||||||
table->burst_mc_regs.mc_emem_arb_timing_w2r = CEIL(W2R / MC_ARB_DIV) - 1 + MC_ARB_SFA;
|
table->burst_mc_regs.mc_emem_arb_timing_w2r = CEIL(W2R / MC_ARB_DIV) - 1 + MC_ARB_SFA;
|
||||||
}
|
|
||||||
|
|
||||||
if (TIMING_PRESET_SIX)
|
|
||||||
{
|
|
||||||
WRITE_PARAM_ALL_REG(table, emc_refresh, REFRESH);
|
WRITE_PARAM_ALL_REG(table, emc_refresh, REFRESH);
|
||||||
WRITE_PARAM_ALL_REG(table, emc_pre_refresh_req_cnt, REFRESH / 4);
|
WRITE_PARAM_ALL_REG(table, emc_pre_refresh_req_cnt, REFRESH / 4);
|
||||||
WRITE_PARAM_ALL_REG(table, emc_trefbw, REFBW);
|
WRITE_PARAM_ALL_REG(table, emc_trefbw, REFBW);
|
||||||
}
|
|
||||||
|
|
||||||
if (TIMING_PRESET_SEVEN)
|
|
||||||
{
|
|
||||||
WRITE_PARAM_ALL_REG(table, emc_r2w, R2W);
|
WRITE_PARAM_ALL_REG(table, emc_r2w, R2W);
|
||||||
WRITE_PARAM_ALL_REG(table, emc_w2r, W2R);
|
WRITE_PARAM_ALL_REG(table, emc_w2r, W2R);
|
||||||
WRITE_PARAM_ALL_REG(table, emc_w2p, WTP);
|
WRITE_PARAM_ALL_REG(table, emc_w2p, WTP);
|
||||||
@@ -246,7 +228,6 @@ namespace ams::ldr::oc::pcv::erista
|
|||||||
table->burst_mc_regs.mc_emem_arb_timing_wap2pre = CEIL(WTP / MC_ARB_DIV);
|
table->burst_mc_regs.mc_emem_arb_timing_wap2pre = CEIL(WTP / MC_ARB_DIV);
|
||||||
table->burst_mc_regs.mc_emem_arb_timing_r2w = CEIL(R2W / MC_ARB_DIV) - 1 + MC_ARB_SFA;
|
table->burst_mc_regs.mc_emem_arb_timing_r2w = CEIL(R2W / MC_ARB_DIV) - 1 + MC_ARB_SFA;
|
||||||
table->burst_mc_regs.mc_emem_arb_timing_w2r = CEIL(W2R / MC_ARB_DIV) - 1 + MC_ARB_SFA;
|
table->burst_mc_regs.mc_emem_arb_timing_w2r = CEIL(W2R / MC_ARB_DIV) - 1 + MC_ARB_SFA;
|
||||||
}
|
|
||||||
|
|
||||||
u32 DA_TURNS = 0;
|
u32 DA_TURNS = 0;
|
||||||
DA_TURNS |= u8(table->burst_mc_regs.mc_emem_arb_timing_r2w / 2) << 16; // R2W TURN
|
DA_TURNS |= u8(table->burst_mc_regs.mc_emem_arb_timing_r2w / 2) << 16; // R2W TURN
|
||||||
@@ -342,4 +323,4 @@ namespace ams::ldr::oc::pcv::erista
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -16,12 +16,12 @@
|
|||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "pcv.hpp"
|
#include "pcv.hpp"
|
||||||
#include "../mtc_timing_value.hpp"
|
#include "../mtc_timing_value.hpp"
|
||||||
|
|
||||||
namespace ams::ldr::oc::pcv::mariko {
|
namespace ams::ldr::oc::pcv::mariko {
|
||||||
|
|
||||||
Result CpuFreqVdd(u32* ptr) {
|
Result CpuFreqVdd(u32* ptr) {
|
||||||
dvfs_rail* entry = reinterpret_cast<dvfs_rail *>(reinterpret_cast<u8 *>(ptr) - offsetof(dvfs_rail, freq));
|
dvfs_rail* entry = reinterpret_cast<dvfs_rail *>(reinterpret_cast<u8 *>(ptr) - offsetof(dvfs_rail, freq));
|
||||||
|
|
||||||
R_UNLESS(entry->id == 1, ldr::ResultInvalidCpuFreqVddEntry());
|
R_UNLESS(entry->id == 1, ldr::ResultInvalidCpuFreqVddEntry());
|
||||||
@@ -40,9 +40,9 @@ Result CpuFreqVdd(u32* ptr) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
R_SUCCEED();
|
R_SUCCEED();
|
||||||
}
|
}
|
||||||
|
|
||||||
Result CpuVoltRange(u32* ptr) {
|
Result CpuVoltRange(u32* ptr) {
|
||||||
u32 min_volt_got = *(ptr - 1);
|
u32 min_volt_got = *(ptr - 1);
|
||||||
for (const auto& mv : CpuMinVolts) {
|
for (const auto& mv : CpuMinVolts) {
|
||||||
if (min_volt_got != mv)
|
if (min_volt_got != mv)
|
||||||
@@ -65,9 +65,9 @@ Result CpuVoltRange(u32* ptr) {
|
|||||||
R_SUCCEED();
|
R_SUCCEED();
|
||||||
}
|
}
|
||||||
R_THROW(ldr::ResultInvalidCpuMinVolt());
|
R_THROW(ldr::ResultInvalidCpuMinVolt());
|
||||||
}
|
}
|
||||||
|
|
||||||
Result CpuVoltDfll(u32* ptr) {
|
Result CpuVoltDfll(u32* ptr) {
|
||||||
cvb_cpu_dfll_data *entry = reinterpret_cast<cvb_cpu_dfll_data *>(ptr);
|
cvb_cpu_dfll_data *entry = reinterpret_cast<cvb_cpu_dfll_data *>(ptr);
|
||||||
|
|
||||||
R_UNLESS(entry->tune0_low == 0x0000FFCF, ldr::ResultInvalidCpuVoltDfllEntry());
|
R_UNLESS(entry->tune0_low == 0x0000FFCF, ldr::ResultInvalidCpuVoltDfllEntry());
|
||||||
@@ -103,9 +103,9 @@ Result CpuVoltDfll(u32* ptr) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
R_SUCCEED();
|
R_SUCCEED();
|
||||||
}
|
}
|
||||||
|
|
||||||
Result GpuFreqMaxAsm(u32* ptr32) {
|
Result GpuFreqMaxAsm(u32* ptr32) {
|
||||||
// Check if both two instructions match the pattern
|
// Check if both two instructions match the pattern
|
||||||
u32 ins1 = *ptr32, ins2 = *(ptr32 + 1);
|
u32 ins1 = *ptr32, ins2 = *(ptr32 + 1);
|
||||||
if (!(asm_compare_no_rd(ins1, asm_pattern[0]) && asm_compare_no_rd(ins2, asm_pattern[1])))
|
if (!(asm_compare_no_rd(ins1, asm_pattern[0]) && asm_compare_no_rd(ins2, asm_pattern[1])))
|
||||||
@@ -149,9 +149,9 @@ Result GpuFreqMaxAsm(u32* ptr32) {
|
|||||||
PATCH_OFFSET(ptr32 + 1, asm_patch[1]);
|
PATCH_OFFSET(ptr32 + 1, asm_patch[1]);
|
||||||
|
|
||||||
R_SUCCEED();
|
R_SUCCEED();
|
||||||
}
|
}
|
||||||
|
|
||||||
Result GpuFreqPllLimit(u32* ptr) {
|
Result GpuFreqPllLimit(u32* ptr) {
|
||||||
clk_pll_param* entry = reinterpret_cast<clk_pll_param *>(ptr);
|
clk_pll_param* entry = reinterpret_cast<clk_pll_param *>(ptr);
|
||||||
|
|
||||||
// All zero except for freq
|
// All zero except for freq
|
||||||
@@ -163,9 +163,9 @@ Result GpuFreqPllLimit(u32* ptr) {
|
|||||||
u32 max_clk = entry->freq * 2;
|
u32 max_clk = entry->freq * 2;
|
||||||
entry->freq = max_clk;
|
entry->freq = max_clk;
|
||||||
R_SUCCEED();
|
R_SUCCEED();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MemMtcTableAutoAdjust(MarikoMtcTable* table, const MarikoMtcTable* ref) {
|
void MemMtcTableAutoAdjust(MarikoMtcTable* table, const MarikoMtcTable* ref) {
|
||||||
/* Official Tegra X1 TRM, sign up for nvidia developer program (free) to download:
|
/* Official Tegra X1 TRM, sign up for nvidia developer program (free) to download:
|
||||||
* https://developer.nvidia.com/embedded/dlc/tegra-x1-technical-reference-manual
|
* https://developer.nvidia.com/embedded/dlc/tegra-x1-technical-reference-manual
|
||||||
* Section 18.11: MC Registers
|
* Section 18.11: MC Registers
|
||||||
@@ -353,16 +353,15 @@ void MemMtcTableAutoAdjust(MarikoMtcTable* table, const MarikoMtcTable* ref) {
|
|||||||
//table->dram_timings.rl = 32;
|
//table->dram_timings.rl = 32;
|
||||||
|
|
||||||
table->emc_cfg_2 = 0x0011083d;
|
table->emc_cfg_2 = 0x0011083d;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MemMtcTableCustomAdjust(MarikoMtcTable* table) {
|
void MemMtcTableCustomAdjust(MarikoMtcTable* table) {
|
||||||
if (C.mtcConf != CUSTOM_ADJ_ALL)
|
if (C.mtcConf != CUSTOM_ADJ_ALL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
constexpr u32 MC_ARB_DIV = 4;
|
constexpr u32 MC_ARB_DIV = 4;
|
||||||
constexpr u32 MC_ARB_SFA = 2;
|
constexpr u32 MC_ARB_SFA = 2;
|
||||||
|
|
||||||
if (TIMING_PRESET_ONE) {
|
|
||||||
WRITE_PARAM_ALL_REG(table, emc_rc, GET_CYCLE_CEIL(tRC));
|
WRITE_PARAM_ALL_REG(table, emc_rc, GET_CYCLE_CEIL(tRC));
|
||||||
WRITE_PARAM_ALL_REG(table, emc_ras, GET_CYCLE_CEIL(tRAS));
|
WRITE_PARAM_ALL_REG(table, emc_ras, GET_CYCLE_CEIL(tRAS));
|
||||||
WRITE_PARAM_ALL_REG(table, emc_rp, GET_CYCLE_CEIL(tRPpb));
|
WRITE_PARAM_ALL_REG(table, emc_rp, GET_CYCLE_CEIL(tRPpb));
|
||||||
@@ -376,17 +375,13 @@ void MemMtcTableCustomAdjust(MarikoMtcTable* table) {
|
|||||||
table->burst_mc_regs.mc_emem_arb_timing_rp = CEIL(GET_CYCLE_CEIL(tRPpb) / MC_ARB_DIV) - 1 + MC_ARB_SFA;
|
table->burst_mc_regs.mc_emem_arb_timing_rp = CEIL(GET_CYCLE_CEIL(tRPpb) / MC_ARB_DIV) - 1 + MC_ARB_SFA;
|
||||||
table->burst_mc_regs.mc_emem_arb_timing_ras = CEIL(GET_CYCLE_CEIL(tRAS) / MC_ARB_DIV) - 2;
|
table->burst_mc_regs.mc_emem_arb_timing_ras = CEIL(GET_CYCLE_CEIL(tRAS) / MC_ARB_DIV) - 2;
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if (TIMING_PRESET_TWO) {
|
|
||||||
WRITE_PARAM_ALL_REG(table, emc_tfaw, GET_CYCLE_CEIL(tFAW));
|
WRITE_PARAM_ALL_REG(table, emc_tfaw, GET_CYCLE_CEIL(tFAW));
|
||||||
WRITE_PARAM_ALL_REG(table, emc_rrd, GET_CYCLE_CEIL(tRRD));
|
WRITE_PARAM_ALL_REG(table, emc_rrd, GET_CYCLE_CEIL(tRRD));
|
||||||
|
|
||||||
table->burst_mc_regs.mc_emem_arb_timing_faw = CEIL(GET_CYCLE_CEIL(tFAW) / MC_ARB_DIV) - 1;
|
table->burst_mc_regs.mc_emem_arb_timing_faw = CEIL(GET_CYCLE_CEIL(tFAW) / MC_ARB_DIV) - 1;
|
||||||
table->burst_mc_regs.mc_emem_arb_timing_rrd = CEIL(GET_CYCLE_CEIL(tRRD) / MC_ARB_DIV) - 1;
|
table->burst_mc_regs.mc_emem_arb_timing_rrd = CEIL(GET_CYCLE_CEIL(tRRD) / MC_ARB_DIV) - 1;
|
||||||
}
|
|
||||||
|
|
||||||
if (TIMING_PRESET_THREE) {
|
|
||||||
WRITE_PARAM_ALL_REG(table, emc_r2p, GET_CYCLE_CEIL(tRTP));
|
WRITE_PARAM_ALL_REG(table, emc_r2p, GET_CYCLE_CEIL(tRTP));
|
||||||
WRITE_PARAM_ALL_REG(table, emc_w2p, WTP);
|
WRITE_PARAM_ALL_REG(table, emc_w2p, WTP);
|
||||||
WRITE_PARAM_ALL_REG(table, emc_tratm, RATM);
|
WRITE_PARAM_ALL_REG(table, emc_tratm, RATM);
|
||||||
@@ -395,30 +390,22 @@ void MemMtcTableCustomAdjust(MarikoMtcTable* table) {
|
|||||||
|
|
||||||
table->burst_mc_regs.mc_emem_arb_timing_rap2pre = CEIL(GET_CYCLE_CEIL(tRTP) / MC_ARB_DIV);
|
table->burst_mc_regs.mc_emem_arb_timing_rap2pre = CEIL(GET_CYCLE_CEIL(tRTP) / MC_ARB_DIV);
|
||||||
table->burst_mc_regs.mc_emem_arb_timing_wap2pre = CEIL(WTP / MC_ARB_DIV);
|
table->burst_mc_regs.mc_emem_arb_timing_wap2pre = CEIL(WTP / MC_ARB_DIV);
|
||||||
}
|
|
||||||
|
|
||||||
if (TIMING_PRESET_FOUR) {
|
|
||||||
WRITE_PARAM_ALL_REG(table, emc_rfc, GET_CYCLE_CEIL(tRFCab));
|
WRITE_PARAM_ALL_REG(table, emc_rfc, GET_CYCLE_CEIL(tRFCab));
|
||||||
WRITE_PARAM_ALL_REG(table, emc_rfcpb, GET_CYCLE_CEIL(tRFCpb));
|
WRITE_PARAM_ALL_REG(table, emc_rfcpb, GET_CYCLE_CEIL(tRFCpb));
|
||||||
WRITE_PARAM_ALL_REG(table, emc_txsr, MIN(GET_CYCLE_CEIL(tXSR), (u32)0x3fe));
|
WRITE_PARAM_ALL_REG(table, emc_txsr, MIN(GET_CYCLE_CEIL(tXSR), (u32)0x3fe));
|
||||||
WRITE_PARAM_ALL_REG(table, emc_txsrdll, MIN(GET_CYCLE_CEIL(tXSR), (u32)0x3fe));
|
WRITE_PARAM_ALL_REG(table, emc_txsrdll, MIN(GET_CYCLE_CEIL(tXSR), (u32)0x3fe));
|
||||||
|
|
||||||
table->burst_mc_regs.mc_emem_arb_timing_rfcpb = CEIL(GET_CYCLE_CEIL(tRFCpb) / MC_ARB_DIV);
|
table->burst_mc_regs.mc_emem_arb_timing_rfcpb = CEIL(GET_CYCLE_CEIL(tRFCpb) / MC_ARB_DIV);
|
||||||
}
|
|
||||||
|
|
||||||
if (TIMING_PRESET_FIVE) {
|
|
||||||
WRITE_PARAM_ALL_REG(table, emc_w2r, W2R);
|
WRITE_PARAM_ALL_REG(table, emc_w2r, W2R);
|
||||||
|
|
||||||
table->burst_mc_regs.mc_emem_arb_timing_w2r = CEIL(W2R / MC_ARB_DIV) - 1 + MC_ARB_SFA;
|
table->burst_mc_regs.mc_emem_arb_timing_w2r = CEIL(W2R / MC_ARB_DIV) - 1 + MC_ARB_SFA;
|
||||||
}
|
|
||||||
|
|
||||||
if (TIMING_PRESET_SIX) {
|
|
||||||
WRITE_PARAM_ALL_REG(table, emc_refresh, REFRESH);
|
WRITE_PARAM_ALL_REG(table, emc_refresh, REFRESH);
|
||||||
WRITE_PARAM_ALL_REG(table, emc_pre_refresh_req_cnt, REFRESH / 4);
|
WRITE_PARAM_ALL_REG(table, emc_pre_refresh_req_cnt, REFRESH / 4);
|
||||||
WRITE_PARAM_ALL_REG(table, emc_trefbw, REFBW);
|
WRITE_PARAM_ALL_REG(table, emc_trefbw, REFBW);
|
||||||
}
|
|
||||||
|
|
||||||
if (TIMING_PRESET_SEVEN) {
|
|
||||||
WRITE_PARAM_ALL_REG(table, emc_r2w, R2W);
|
WRITE_PARAM_ALL_REG(table, emc_r2w, R2W);
|
||||||
WRITE_PARAM_ALL_REG(table, emc_w2r, W2R);
|
WRITE_PARAM_ALL_REG(table, emc_w2r, W2R);
|
||||||
WRITE_PARAM_ALL_REG(table, emc_w2p, WTP);
|
WRITE_PARAM_ALL_REG(table, emc_w2p, WTP);
|
||||||
@@ -431,7 +418,6 @@ void MemMtcTableCustomAdjust(MarikoMtcTable* table) {
|
|||||||
table->burst_mc_regs.mc_emem_arb_timing_wap2pre = CEIL(WTP / MC_ARB_DIV);
|
table->burst_mc_regs.mc_emem_arb_timing_wap2pre = CEIL(WTP / MC_ARB_DIV);
|
||||||
table->burst_mc_regs.mc_emem_arb_timing_r2w = CEIL(R2W / MC_ARB_DIV) - 1 + MC_ARB_SFA;
|
table->burst_mc_regs.mc_emem_arb_timing_r2w = CEIL(R2W / MC_ARB_DIV) - 1 + MC_ARB_SFA;
|
||||||
table->burst_mc_regs.mc_emem_arb_timing_w2r = CEIL(W2R / MC_ARB_DIV) - 1 + MC_ARB_SFA;
|
table->burst_mc_regs.mc_emem_arb_timing_w2r = CEIL(W2R / MC_ARB_DIV) - 1 + MC_ARB_SFA;
|
||||||
}
|
|
||||||
|
|
||||||
u32 DA_TURNS = 0;
|
u32 DA_TURNS = 0;
|
||||||
DA_TURNS |= u8(table->burst_mc_regs.mc_emem_arb_timing_r2w / 2) << 16; //R2W TURN
|
DA_TURNS |= u8(table->burst_mc_regs.mc_emem_arb_timing_r2w / 2) << 16; //R2W TURN
|
||||||
@@ -444,9 +430,9 @@ void MemMtcTableCustomAdjust(MarikoMtcTable* table) {
|
|||||||
DA_COVERS |= (R_COVER << 8); //RCD_R COVER
|
DA_COVERS |= (R_COVER << 8); //RCD_R COVER
|
||||||
DA_COVERS |= (W_COVER << 16); //RCD_W COVER
|
DA_COVERS |= (W_COVER << 16); //RCD_W COVER
|
||||||
WRITE_PARAM_BURST_MC_REG(table, mc_emem_arb_da_covers, DA_COVERS);
|
WRITE_PARAM_BURST_MC_REG(table, mc_emem_arb_da_covers, DA_COVERS);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MemMtcPllmbDivisor(MarikoMtcTable* table) {
|
void MemMtcPllmbDivisor(MarikoMtcTable* table) {
|
||||||
// Calculate DIVM and DIVN (clock divisors)
|
// Calculate DIVM and DIVN (clock divisors)
|
||||||
// Common PLL oscillator is 38.4 MHz
|
// Common PLL oscillator is 38.4 MHz
|
||||||
// PLLMB_OUT = 38.4 MHz / PLLLMB_DIVM * PLLMB_DIVN
|
// PLLMB_OUT = 38.4 MHz / PLLLMB_DIVM * PLLMB_DIVN
|
||||||
@@ -473,9 +459,9 @@ void MemMtcPllmbDivisor(MarikoMtcTable* table) {
|
|||||||
|
|
||||||
table->pllmb_divm = divm;
|
table->pllmb_divm = divm;
|
||||||
table->pllmb_divn = divn;
|
table->pllmb_divn = divn;
|
||||||
}
|
}
|
||||||
|
|
||||||
Result MemFreqMtcTable(u32* ptr) {
|
Result MemFreqMtcTable(u32* ptr) {
|
||||||
u32 khz_list[] = { 1600000, 1331200, 204000 };
|
u32 khz_list[] = { 1600000, 1331200, 204000 };
|
||||||
u32 khz_list_size = sizeof(khz_list) / sizeof(u32);
|
u32 khz_list_size = sizeof(khz_list) / sizeof(u32);
|
||||||
|
|
||||||
@@ -513,9 +499,9 @@ Result MemFreqMtcTable(u32* ptr) {
|
|||||||
// }
|
// }
|
||||||
|
|
||||||
R_SUCCEED();
|
R_SUCCEED();
|
||||||
}
|
}
|
||||||
|
|
||||||
Result MemFreqDvbTable(u32* ptr) {
|
Result MemFreqDvbTable(u32* ptr) {
|
||||||
emc_dvb_dvfs_table_t* default_end = reinterpret_cast<emc_dvb_dvfs_table_t *>(ptr);
|
emc_dvb_dvfs_table_t* default_end = reinterpret_cast<emc_dvb_dvfs_table_t *>(ptr);
|
||||||
emc_dvb_dvfs_table_t* new_start = default_end + 1;
|
emc_dvb_dvfs_table_t* new_start = default_end + 1;
|
||||||
|
|
||||||
@@ -558,17 +544,17 @@ Result MemFreqDvbTable(u32* ptr) {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
R_SUCCEED();
|
R_SUCCEED();
|
||||||
}
|
}
|
||||||
|
|
||||||
Result MemFreqMax(u32* ptr) {
|
Result MemFreqMax(u32* ptr) {
|
||||||
if (C.marikoEmcMaxClock <= EmcClkOSLimit)
|
if (C.marikoEmcMaxClock <= EmcClkOSLimit)
|
||||||
R_SKIP();
|
R_SKIP();
|
||||||
|
|
||||||
PATCH_OFFSET(ptr, C.marikoEmcMaxClock);
|
PATCH_OFFSET(ptr, C.marikoEmcMaxClock);
|
||||||
R_SUCCEED();
|
R_SUCCEED();
|
||||||
}
|
}
|
||||||
|
|
||||||
Result I2cSet_U8(I2cDevice dev, u8 reg, u8 val) {
|
Result I2cSet_U8(I2cDevice dev, u8 reg, u8 val) {
|
||||||
struct {
|
struct {
|
||||||
u8 reg;
|
u8 reg;
|
||||||
u8 val;
|
u8 val;
|
||||||
@@ -584,9 +570,9 @@ Result I2cSet_U8(I2cDevice dev, u8 reg, u8 val) {
|
|||||||
res = i2csessionSendAuto(&_session, &cmd, sizeof(cmd), I2cTransactionOption_All);
|
res = i2csessionSendAuto(&_session, &cmd, sizeof(cmd), I2cTransactionOption_All);
|
||||||
i2csessionClose(&_session);
|
i2csessionClose(&_session);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
Result EmcVddqVolt(u32* ptr) {
|
Result EmcVddqVolt(u32* ptr) {
|
||||||
regulator* entry = reinterpret_cast<regulator *>(reinterpret_cast<u8 *>(ptr) - offsetof(regulator, type_2_3.default_uv));
|
regulator* entry = reinterpret_cast<regulator *>(reinterpret_cast<u8 *>(ptr) - offsetof(regulator, type_2_3.default_uv));
|
||||||
|
|
||||||
constexpr u32 uv_step = 5'000;
|
constexpr u32 uv_step = 5'000;
|
||||||
@@ -616,9 +602,9 @@ Result EmcVddqVolt(u32* ptr) {
|
|||||||
i2cExit();
|
i2cExit();
|
||||||
|
|
||||||
R_SUCCEED();
|
R_SUCCEED();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Patch(uintptr_t mapped_nso, size_t nso_size) {
|
void Patch(uintptr_t mapped_nso, size_t nso_size) {
|
||||||
u32 CpuCvbDefaultMaxFreq = static_cast<u32>(GetDvfsTableLastEntry(CpuCvbTableDefault)->freq);
|
u32 CpuCvbDefaultMaxFreq = static_cast<u32>(GetDvfsTableLastEntry(CpuCvbTableDefault)->freq);
|
||||||
u32 GpuCvbDefaultMaxFreq = static_cast<u32>(GetDvfsTableLastEntry(GpuCvbTableDefault)->freq);
|
u32 GpuCvbDefaultMaxFreq = static_cast<u32>(GetDvfsTableLastEntry(GpuCvbTableDefault)->freq);
|
||||||
|
|
||||||
@@ -654,6 +640,6 @@ void Patch(uintptr_t mapped_nso, size_t nso_size) {
|
|||||||
if (R_FAILED(entry.CheckResult()))
|
if (R_FAILED(entry.CheckResult()))
|
||||||
CRASH(entry.description);
|
CRASH(entry.description);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user