ldr: clean formating, fix tRC cap, map erista mtc indexes
This commit is contained in:
@@ -50,11 +50,11 @@ volatile CustomizeTable C = {
|
|||||||
.emcDvbShift = 0,
|
.emcDvbShift = 0,
|
||||||
.marikoSocVmax = 0, /* 0 = stock limits (1450 - 1597 is 1050mV, 1598-1708 is 1025mV, 1709+ is 1000mV). */
|
.marikoSocVmax = 0, /* 0 = stock limits (1450 - 1597 is 1050mV, 1598-1708 is 1025mV, 1709+ is 1000mV). */
|
||||||
|
|
||||||
// Primary
|
/* Primary. */
|
||||||
.t1_tRCD = 0,
|
.t1_tRCD = 0,
|
||||||
.t2_tRP = 0,
|
.t2_tRP = 0,
|
||||||
.t3_tRAS = 0,
|
.t3_tRAS = 0,
|
||||||
// Secondary
|
/* Secondary. */
|
||||||
.t4_tRRD = 0,
|
.t4_tRRD = 0,
|
||||||
.t5_tRFC = 0,
|
.t5_tRFC = 0,
|
||||||
.t6_tRTW = 0,
|
.t6_tRTW = 0,
|
||||||
|
|||||||
@@ -20,9 +20,8 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
// Ensure to set KIP_VERSION and CUST_REV in sysmodule Makefile when updating these
|
|
||||||
#define CUST_REV 2
|
#define CUST_REV 2
|
||||||
#define HOC_VERSION 220
|
#define KIP_VERSION 220
|
||||||
|
|
||||||
#include "oc_common.hpp"
|
#include "oc_common.hpp"
|
||||||
#include "pcv/pcv_common.hpp"
|
#include "pcv/pcv_common.hpp"
|
||||||
@@ -78,10 +77,10 @@ static_assert(sizeof(CustomizeCpuDvfsTable) == sizeof(pcv::cvb_entry_t) * pcv::D
|
|||||||
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 {
|
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 hocVersion = HOC_VERSION;
|
u32 kipVersion = KIP_VERSION;
|
||||||
|
|
||||||
u32 hpMode;
|
u32 hpMode;
|
||||||
|
|
||||||
@@ -169,7 +168,7 @@ typedef struct CustomizeTable {
|
|||||||
CustomizeGpuDvfsTable marikoGpuDvfsTableSLT;
|
CustomizeGpuDvfsTable marikoGpuDvfsTableSLT;
|
||||||
CustomizeGpuDvfsTable marikoGpuDvfsTableHiOPT;
|
CustomizeGpuDvfsTable marikoGpuDvfsTableHiOPT;
|
||||||
|
|
||||||
} CustomizeTable;
|
};
|
||||||
|
|
||||||
extern volatile CustomizeTable C;
|
extern volatile CustomizeTable C;
|
||||||
|
|
||||||
|
|||||||
@@ -26,8 +26,8 @@ namespace ams::ldr::hoc::pcv::mariko {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Fallback. */
|
/* > 3200 */
|
||||||
rext = 0x1A;
|
rext = 0x1E;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SwitchLatency(volatile u32 &latency, u32 index, u32 latencyStep) {
|
void SwitchLatency(volatile u32 &latency, u32 index, u32 latencyStep) {
|
||||||
|
|||||||
@@ -87,7 +87,7 @@ namespace ams::ldr::hoc {
|
|||||||
static bool initDone = false;
|
static bool initDone = false;
|
||||||
log_ctx_t *log_ctx = (log_ctx_t*)working_buf;
|
log_ctx_t *log_ctx = (log_ctx_t*)working_buf;
|
||||||
|
|
||||||
SmcCopyFromIram(working_buf, IRAM_LOG_CTX_ADDR, sizeof(working_buf));
|
R_DISCARD(SmcCopyFromIram(working_buf, IRAM_LOG_CTX_ADDR, sizeof(working_buf)));
|
||||||
|
|
||||||
if (!initDone) {
|
if (!initDone) {
|
||||||
initDone = true;
|
initDone = true;
|
||||||
@@ -103,21 +103,25 @@ namespace ams::ldr::hoc {
|
|||||||
va_end(args);
|
va_end(args);
|
||||||
|
|
||||||
if (res < 0 || res >= (static_cast<s32>(max_log_sz - log_ctx->end))) {
|
if (res < 0 || res >= (static_cast<s32>(max_log_sz - log_ctx->end))) {
|
||||||
SmcCopyToIram(IRAM_LOG_CTX_ADDR, working_buf, sizeof(working_buf));
|
R_DISCARD(SmcCopyToIram(IRAM_LOG_CTX_ADDR, working_buf, sizeof(working_buf)));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
log_ctx->end += res;
|
log_ctx->end += res;
|
||||||
SmcCopyToIram(IRAM_LOG_CTX_ADDR, working_buf, sizeof(working_buf));
|
R_DISCARD(SmcCopyToIram(IRAM_LOG_CTX_ADDR, working_buf, sizeof(working_buf)));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(AMS_BUILD_FOR_AUDITING) || defined(AMS_BUILD_FOR_DEBUGGING)
|
#if defined(AMS_BUILD_FOR_AUDITING) || defined(AMS_BUILD_FOR_DEBUGGING)
|
||||||
void ViewLog() {
|
void ViewLog() {
|
||||||
|
if (spl::GetSocType() == spl::SocType_Mariko) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
constexpr size_t PageSize = 4096;
|
constexpr size_t PageSize = 4096;
|
||||||
for (size_t ofs = 0; ofs < fatal_handler_bin_size; ofs += PageSize) {
|
for (size_t ofs = 0; ofs < fatal_handler_bin_size; ofs += PageSize) {
|
||||||
memcpy(&working_buf, fatal_handler_bin + ofs, std::min(fatal_handler_bin_size - ofs, PageSize));
|
memcpy(&working_buf, fatal_handler_bin + ofs, std::min(fatal_handler_bin_size - ofs, PageSize));
|
||||||
SmcCopyToIram(ATMOSPHERE_IRAM_PAYLOAD_BASE + ofs, &working_buf, std::min(fatal_handler_bin_size - ofs, PageSize));
|
R_DISCARD(SmcCopyToIram(ATMOSPHERE_IRAM_PAYLOAD_BASE + ofs, &working_buf, std::min(fatal_handler_bin_size - ofs, PageSize)));
|
||||||
}
|
}
|
||||||
|
|
||||||
SmcRebootToIramPayload();
|
SmcRebootToIramPayload();
|
||||||
|
|||||||
@@ -22,23 +22,23 @@
|
|||||||
|
|
||||||
namespace ams::ldr::hoc::pcv {
|
namespace ams::ldr::hoc::pcv {
|
||||||
|
|
||||||
typedef struct cvb_coefficients {
|
struct cvb_coefficients {
|
||||||
s32 c0 = 0;
|
s32 c0 = 0;
|
||||||
s32 c1 = 0;
|
s32 c1 = 0;
|
||||||
s32 c2 = 0;
|
s32 c2 = 0;
|
||||||
s32 c3 = 0;
|
s32 c3 = 0;
|
||||||
s32 c4 = 0;
|
s32 c4 = 0;
|
||||||
s32 c5 = 0;
|
s32 c5 = 0;
|
||||||
} cvb_coefficients;
|
};
|
||||||
|
|
||||||
typedef struct cvb_entry_t {
|
struct cvb_entry_t {
|
||||||
u64 freq;
|
u64 freq;
|
||||||
cvb_coefficients cvb_dfll_param;
|
cvb_coefficients cvb_dfll_param;
|
||||||
cvb_coefficients cvb_pll_param;
|
cvb_coefficients cvb_pll_param;
|
||||||
} cvb_entry_t;
|
};
|
||||||
static_assert(sizeof(cvb_entry_t) == 0x38);
|
static_assert(sizeof(cvb_entry_t) == 0x38);
|
||||||
|
|
||||||
typedef struct cvb_cpu_dfll_data {
|
struct cvb_cpu_dfll_data {
|
||||||
u32 tune0_low;
|
u32 tune0_low;
|
||||||
u32 tune0_high;
|
u32 tune0_high;
|
||||||
u32 tune1_low;
|
u32 tune1_low;
|
||||||
@@ -46,9 +46,9 @@ namespace ams::ldr::hoc::pcv {
|
|||||||
unsigned int tune_high_min_millivolts;
|
unsigned int tune_high_min_millivolts;
|
||||||
unsigned int tune_high_margin_millivolts;
|
unsigned int tune_high_margin_millivolts;
|
||||||
unsigned long dvco_calibration_max;
|
unsigned long dvco_calibration_max;
|
||||||
} cvb_cpu_dfll_data;
|
};
|
||||||
|
|
||||||
typedef struct __attribute__((packed)) div_nmp {
|
struct __attribute__((packed)) div_nmp {
|
||||||
u8 divn_shift;
|
u8 divn_shift;
|
||||||
u8 divn_width;
|
u8 divn_width;
|
||||||
u8 divm_shift;
|
u8 divm_shift;
|
||||||
@@ -58,9 +58,9 @@ namespace ams::ldr::hoc::pcv {
|
|||||||
u8 override_divn_shift;
|
u8 override_divn_shift;
|
||||||
u8 override_divm_shift;
|
u8 override_divm_shift;
|
||||||
u8 override_divp_shift;
|
u8 override_divp_shift;
|
||||||
} div_nmp;
|
};
|
||||||
|
|
||||||
typedef struct __attribute__((packed)) clk_pll_param {
|
struct __attribute__((packed)) clk_pll_param {
|
||||||
u32 freq;
|
u32 freq;
|
||||||
u32 input_min;
|
u32 input_min;
|
||||||
u32 input_max;
|
u32 input_max;
|
||||||
@@ -74,9 +74,9 @@ namespace ams::ldr::hoc::pcv {
|
|||||||
struct div_nmp *div_nmp;
|
struct div_nmp *div_nmp;
|
||||||
u32 unk_1[4];
|
u32 unk_1[4];
|
||||||
void (*unk_fn)(u64* unk_struct); // set_defaults?
|
void (*unk_fn)(u64* unk_struct); // set_defaults?
|
||||||
} clk_pll_param;
|
};
|
||||||
|
|
||||||
typedef struct __attribute__((packed)) dvfs_rail {
|
struct __attribute__((packed)) dvfs_rail {
|
||||||
u32 id;
|
u32 id;
|
||||||
u32 unk_0[5];
|
u32 unk_0[5];
|
||||||
u32 freq;
|
u32 freq;
|
||||||
@@ -86,9 +86,9 @@ namespace ams::ldr::hoc::pcv {
|
|||||||
u32 step_mv;
|
u32 step_mv;
|
||||||
u32 max_mv;
|
u32 max_mv;
|
||||||
u32 unk_2[11];
|
u32 unk_2[11];
|
||||||
} dvfs_rail;
|
};
|
||||||
|
|
||||||
typedef struct __attribute__((packed)) regulator {
|
struct __attribute__((packed)) regulator {
|
||||||
u64 id;
|
u64 id;
|
||||||
const char* name;
|
const char* name;
|
||||||
u32 type;
|
u32 type;
|
||||||
@@ -112,7 +112,7 @@ namespace ams::ldr::hoc::pcv {
|
|||||||
} type_2_3;
|
} type_2_3;
|
||||||
};
|
};
|
||||||
u32 unk_x[60];
|
u32 unk_x[60];
|
||||||
} regulator;
|
};
|
||||||
static_assert(sizeof(regulator) == 0x120);
|
static_assert(sizeof(regulator) == 0x120);
|
||||||
|
|
||||||
constexpr u32 CpuClkOSLimit = 1785'000;
|
constexpr u32 CpuClkOSLimit = 1785'000;
|
||||||
|
|||||||
@@ -216,7 +216,7 @@ namespace ams::ldr::hoc::pcv::erista {
|
|||||||
|
|
||||||
WRITE_PARAM_ALL_REG(table, emc_rd_rcd, GET_CYCLE_CEIL(tRCD));
|
WRITE_PARAM_ALL_REG(table, emc_rd_rcd, GET_CYCLE_CEIL(tRCD));
|
||||||
WRITE_PARAM_ALL_REG(table, emc_wr_rcd, GET_CYCLE_CEIL(tRCD));
|
WRITE_PARAM_ALL_REG(table, emc_wr_rcd, GET_CYCLE_CEIL(tRCD));
|
||||||
WRITE_PARAM_ALL_REG(table, emc_rc, MIN(GET_CYCLE_CEIL(tRC), static_cast<u32>(0xB8)));
|
WRITE_PARAM_ALL_REG(table, emc_rc, MIN(GET_CYCLE_CEIL(tRC), static_cast<u32>(0xB9)));
|
||||||
WRITE_PARAM_ALL_REG(table, emc_ras, MIN(GET_CYCLE_CEIL(tRAS), static_cast<u32>(0x7F)));
|
WRITE_PARAM_ALL_REG(table, emc_ras, MIN(GET_CYCLE_CEIL(tRAS), static_cast<u32>(0x7F)));
|
||||||
WRITE_PARAM_ALL_REG(table, emc_rrd, GET_CYCLE_CEIL(tRRD));
|
WRITE_PARAM_ALL_REG(table, emc_rrd, GET_CYCLE_CEIL(tRRD));
|
||||||
WRITE_PARAM_ALL_REG(table, emc_rfcpb, GET_CYCLE_CEIL(tRFCpb));
|
WRITE_PARAM_ALL_REG(table, emc_rfcpb, GET_CYCLE_CEIL(tRFCpb));
|
||||||
@@ -362,10 +362,6 @@ namespace ams::ldr::hoc::pcv::erista {
|
|||||||
|
|
||||||
/* Probably more intuitive to point to 40800 rather than 1600000, but oh well. */
|
/* Probably more intuitive to point to 40800 rather than 1600000, but oh well. */
|
||||||
Result MemFreqMtcTable(u32 *ptr) {
|
Result MemFreqMtcTable(u32 *ptr) {
|
||||||
if (GET_MAX_OF_ARR(maxEmcClocks) <= EmcClkOSLimit) {
|
|
||||||
R_SKIP();
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 khz_list[] = { 40800, 68000, 102000, 204000, 408000, 665600, 800000, 1065600, 1331200, 1600000 };
|
u32 khz_list[] = { 40800, 68000, 102000, 204000, 408000, 665600, 800000, 1065600, 1331200, 1600000 };
|
||||||
std::sort(maxEmcClocks, maxEmcClocks + std::size(maxEmcClocks));
|
std::sort(maxEmcClocks, maxEmcClocks + std::size(maxEmcClocks));
|
||||||
u32 khz_list_size = std::size(khz_list);
|
u32 khz_list_size = std::size(khz_list);
|
||||||
@@ -380,6 +376,10 @@ namespace ams::ldr::hoc::pcv::erista {
|
|||||||
R_UNLESS(table_list[mtcIndex]->rev == MTC_TABLE_REV, ldr::ResultInvalidMtcTable());
|
R_UNLESS(table_list[mtcIndex]->rev == MTC_TABLE_REV, ldr::ResultInvalidMtcTable());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (GET_MAX_OF_ARR(maxEmcClocks) <= EmcClkOSLimit) {
|
||||||
|
R_SKIP();
|
||||||
|
}
|
||||||
|
|
||||||
/* If we oc ram at all, tables are always shifted by at least 1. */
|
/* If we oc ram at all, tables are always shifted by at least 1. */
|
||||||
u32 tableShifts = 1;
|
u32 tableShifts = 1;
|
||||||
for (u32 i = 0; i < std::size(maxEmcClocks) - 1; ++i) {
|
for (u32 i = 0; i < std::size(maxEmcClocks) - 1; ++i) {
|
||||||
@@ -451,21 +451,24 @@ namespace ams::ldr::hoc::pcv::erista {
|
|||||||
// }
|
// }
|
||||||
|
|
||||||
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 GpuCvbDefaultMaxFreq = static_cast<u32>(GetDvfsTableLastEntry(GpuCvbTableDefault)->freq);
|
||||||
|
|
||||||
PatcherEntry<u32> patches[] = {
|
PatcherEntry<u32> patches[] = {
|
||||||
{"CPU Freq Table", CpuFreqCvbTable<false>, 1, nullptr, static_cast<u32>(GetDvfsTableLastEntry(CpuCvbTableDefault)->freq)},
|
{"CPU Freq Table", CpuFreqCvbTable<false>, 1, nullptr, CpuCvbDefaultMaxFreq },
|
||||||
{"CPU Volt DVFS", &CpuVoltDvfs, 1, nullptr, CpuVminOfficial},
|
{"CPU Volt DVFS", &CpuVoltDvfs, 1, nullptr, CpuVminOfficial },
|
||||||
{"CPU Volt Thermals", &CpuVoltThermals, 1, nullptr, CpuVminOfficial},
|
{"CPU Volt Thermals", &CpuVoltThermals, 1, nullptr, CpuVminOfficial },
|
||||||
{"CPU Volt Dfll", &CpuVoltDfll, 1, nullptr, 0xFFEAD0FF},
|
{"CPU Volt Dfll", &CpuVoltDfll, 1, nullptr, CpuTune0Low },
|
||||||
{"GPU Volt DVFS", &GpuVoltDVFS, 1, nullptr, GpuVminOfficial},
|
{"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<false>, 1, nullptr, static_cast<u32>(GetDvfsTableLastEntry(GpuCvbTableDefault)->freq)},
|
{"GPU Freq Table", GpuFreqCvbTable<false>, 1, nullptr, GpuCvbDefaultMaxFreq },
|
||||||
{"GPU Freq Asm", &GpuFreqMaxAsm, 2, &GpuMaxClockPatternFn},
|
{"GPU Freq Asm", &GpuFreqMaxAsm, 2, &GpuMaxClockPatternFn },
|
||||||
{"GPU PLL Max", &GpuFreqPllMax, 1, nullptr, GpuClkPllMax},
|
{"GPU PLL Max", & GpuFreqPllMax, 1, nullptr, GpuClkPllMax },
|
||||||
// {"GPU PLL Limit", &GpuFreqPllLimit, 4, nullptr, GpuClkPllLimit},
|
// {"GPU PLL Limit", &GpuFreqPllLimit, 4, nullptr, GpuClkPllLimit },
|
||||||
{"MEM Freq Mtc", &MemFreqMtcTable, 0, nullptr, EmcClkOSLimit},
|
{"MEM Freq Mtc", &MemFreqMtcTable, 0, nullptr, EmcClkOSLimit },
|
||||||
{"MEM Freq Max", &MemFreqMax, 0, nullptr, EmcClkOSLimit},
|
{"MEM Freq Max", &MemFreqMax, 0, nullptr, EmcClkOSLimit },
|
||||||
{"MEM Freq PLLM", &MemFreqPllmLimit, 2, nullptr, EmcClkPllmLimit},
|
{"MEM Freq PLLM", &MemFreqPllmLimit, 2, nullptr, EmcClkPllmLimit },
|
||||||
{"MEM Volt", &MemVoltHandler, 2, nullptr, MemVoltHOS},
|
{"MEM Volt", &MemVoltHandler, 2, nullptr, MemVoltHOS },
|
||||||
};
|
};
|
||||||
|
|
||||||
for (uintptr_t ptr = mapped_nso; ptr <= mapped_nso + nso_size - sizeof(EristaMtcTable); ptr += sizeof(u32)) {
|
for (uintptr_t ptr = mapped_nso; ptr <= mapped_nso + nso_size - sizeof(EristaMtcTable); ptr += sizeof(u32)) {
|
||||||
|
|||||||
@@ -51,16 +51,16 @@ namespace ams::ldr::hoc::pcv::erista {
|
|||||||
};
|
};
|
||||||
|
|
||||||
constexpr u32 CpuVoltOfficial = 1227;
|
constexpr u32 CpuVoltOfficial = 1227;
|
||||||
|
|
||||||
constexpr u32 CpuVminOfficial = 825;
|
constexpr u32 CpuVminOfficial = 825;
|
||||||
|
constexpr u32 CpuTune0Low = 0xFFEAD0FF;
|
||||||
|
|
||||||
constexpr u32 CpuVoltL4T = 1257'000;
|
constexpr u32 CpuVoltL4T = 1257'000;
|
||||||
|
|
||||||
static const u32 cpuVoltDvfsPattern[] = { 1227, 1000, 100, 1000, 0 };
|
static const u32 cpuVoltDvfsPattern[] = { 1227, 1000, 100, 1000, 0 };
|
||||||
static_assert(sizeof(cpuVoltDvfsPattern) == 0x14, "invalid cpuVoltDvfsPattern size");
|
static_assert(sizeof(cpuVoltDvfsPattern) == 0x14, "Invalid cpuVoltDvfsPattern size");
|
||||||
|
|
||||||
static const u32 cpuVoltageThermalPattern[] = { 950, 1132, 0, 950, 1227, 0, 825, 1227, 15000, 825, 1170, 60000, 825, 1132, 80000 };
|
static const u32 cpuVoltageThermalPattern[] = { 950, 1132, 0, 950, 1227, 0, 825, 1227, 15000, 825, 1170, 60000, 825, 1132, 80000 };
|
||||||
static_assert(sizeof(cpuVoltageThermalPattern) == 0x3c, "invalid cpuVoltageThermalPattern size");
|
static_assert(sizeof(cpuVoltageThermalPattern) == 0x3c, "Invalid cpuVoltageThermalPattern size");
|
||||||
|
|
||||||
constexpr u32 GpuClkPllLimit = 2'600'000;
|
constexpr u32 GpuClkPllLimit = 2'600'000;
|
||||||
constexpr u32 GpuClkPllMax = 921'600'000;
|
constexpr u32 GpuClkPllMax = 921'600'000;
|
||||||
@@ -72,7 +72,7 @@ namespace ams::ldr::hoc::pcv::erista {
|
|||||||
static_assert(sizeof(gpuVoltDvfsPattern) == (sizeof(u32) * 6), "Invalid gpuVoltDvfsPattern");
|
static_assert(sizeof(gpuVoltDvfsPattern) == (sizeof(u32) * 6), "Invalid gpuVoltDvfsPattern");
|
||||||
|
|
||||||
static const u32 gpuVoltThermalPattern[] = { 950, 1132, 0, 810, 1132, 15000, 810, 1132, 30000, 810, 1132, 50000, 810, 1132, 70000, 810, 1132, 105000 };
|
static const u32 gpuVoltThermalPattern[] = { 950, 1132, 0, 810, 1132, 15000, 810, 1132, 30000, 810, 1132, 50000, 810, 1132, 70000, 810, 1132, 105000 };
|
||||||
static_assert(sizeof(gpuVoltThermalPattern) == 0x48, "invalid gpuVoltageThermalPattern size");
|
static_assert(sizeof(gpuVoltThermalPattern) == 0x48, "Invalid gpuVoltageThermalPattern size");
|
||||||
|
|
||||||
/* GPU Max Clock asm Pattern:
|
/* GPU Max Clock asm Pattern:
|
||||||
*
|
*
|
||||||
@@ -123,13 +123,13 @@ namespace ams::ldr::hoc::pcv::erista {
|
|||||||
enum DramId {
|
enum DramId {
|
||||||
ICOSA_4GB_SAMSUNG_K4F6E304HB_MGCH = 0,
|
ICOSA_4GB_SAMSUNG_K4F6E304HB_MGCH = 0,
|
||||||
ICOSA_4GB_HYNIX_H9HCNNNBPUMLHR_NLE = 1,
|
ICOSA_4GB_HYNIX_H9HCNNNBPUMLHR_NLE = 1,
|
||||||
ICOSA_4GB_MICRON_MT53B512M32D2NP_062_WTC = 2, /* This doesn't have a table in pcv? Wtf? */
|
ICOSA_4GB_MICRON_MT53B512M32D2NP_062_WTC = 2,
|
||||||
ICOSA_6GB_SAMSUNG_K4FHE3D4HM_MGCH = 4,
|
ICOSA_6GB_SAMSUNG_K4FHE3D4HM_MGCH = 4,
|
||||||
ICOSA_8GB_SAMSUNG_K4FBE3D4HM_MGXX = 7, /* No table, but expected */
|
ICOSA_8GB_SAMSUNG_K4FBE3D4HM_MGXX = 7,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum MtcTableIndex {
|
enum MtcTableIndex {
|
||||||
T210SdevEmcDvfsTableS4gb01 = 0, /* HB-MGCH */
|
T210SdevEmcDvfsTableS4gb01 = 0, /* HB-MGCH, WT:C */
|
||||||
T210SdevEmcDvfsTableS6gb01 = 1, /* HM-MGCH */
|
T210SdevEmcDvfsTableS6gb01 = 1, /* HM-MGCH */
|
||||||
T210SdevEmcDvfsTableH4gb01 = 2, /* HR-NLE */
|
T210SdevEmcDvfsTableH4gb01 = 2, /* HR-NLE */
|
||||||
MtcTableIndex_Invalid = 3,
|
MtcTableIndex_Invalid = 3,
|
||||||
@@ -142,6 +142,7 @@ namespace ams::ldr::hoc::pcv::erista {
|
|||||||
|
|
||||||
constexpr MtcDramIndex mtcIndexTable[] = {
|
constexpr MtcDramIndex mtcIndexTable[] = {
|
||||||
{ ICOSA_4GB_SAMSUNG_K4F6E304HB_MGCH, T210SdevEmcDvfsTableS4gb01, },
|
{ ICOSA_4GB_SAMSUNG_K4F6E304HB_MGCH, T210SdevEmcDvfsTableS4gb01, },
|
||||||
|
{ ICOSA_4GB_MICRON_MT53B512M32D2NP_062_WTC, T210SdevEmcDvfsTableS4gb01, },
|
||||||
{ ICOSA_6GB_SAMSUNG_K4FHE3D4HM_MGCH, T210SdevEmcDvfsTableS6gb01, },
|
{ ICOSA_6GB_SAMSUNG_K4FHE3D4HM_MGCH, T210SdevEmcDvfsTableS6gb01, },
|
||||||
{ ICOSA_4GB_HYNIX_H9HCNNNBPUMLHR_NLE, T210SdevEmcDvfsTableH4gb01, },
|
{ ICOSA_4GB_HYNIX_H9HCNNNBPUMLHR_NLE, T210SdevEmcDvfsTableH4gb01, },
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -89,6 +89,7 @@ namespace ams::ldr::hoc::pcv::mariko {
|
|||||||
} else {
|
} else {
|
||||||
PATCH_OFFSET(ptr, GetDvfsTableLastEntry(C.marikoCpuDvfsTable)->freq);
|
PATCH_OFFSET(ptr, GetDvfsTableLastEntry(C.marikoCpuDvfsTable)->freq);
|
||||||
}
|
}
|
||||||
|
|
||||||
R_SUCCEED();
|
R_SUCCEED();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -373,7 +374,7 @@ namespace ams::ldr::hoc::pcv::mariko {
|
|||||||
|
|
||||||
WRITE_PARAM_ALL_REG(table, emc_rd_rcd, GET_CYCLE_CEIL(tRCD));
|
WRITE_PARAM_ALL_REG(table, emc_rd_rcd, GET_CYCLE_CEIL(tRCD));
|
||||||
WRITE_PARAM_ALL_REG(table, emc_wr_rcd, GET_CYCLE_CEIL(tRCD));
|
WRITE_PARAM_ALL_REG(table, emc_wr_rcd, GET_CYCLE_CEIL(tRCD));
|
||||||
WRITE_PARAM_ALL_REG(table, emc_rc, MIN(GET_CYCLE_CEIL(tRC), static_cast<u32>(0xB8)));
|
WRITE_PARAM_ALL_REG(table, emc_rc, MIN(GET_CYCLE_CEIL(tRC), static_cast<u32>(0xB9)));
|
||||||
WRITE_PARAM_ALL_REG(table, emc_ras, MIN(GET_CYCLE_CEIL(tRAS), static_cast<u32>(0x7F)));
|
WRITE_PARAM_ALL_REG(table, emc_ras, MIN(GET_CYCLE_CEIL(tRAS), static_cast<u32>(0x7F)));
|
||||||
WRITE_PARAM_ALL_REG(table, emc_rrd, GET_CYCLE_CEIL(tRRD));
|
WRITE_PARAM_ALL_REG(table, emc_rrd, GET_CYCLE_CEIL(tRRD));
|
||||||
WRITE_PARAM_ALL_REG(table, emc_rfcpb, GET_CYCLE_CEIL(tRFCpb));
|
WRITE_PARAM_ALL_REG(table, emc_rfcpb, GET_CYCLE_CEIL(tRFCpb));
|
||||||
@@ -432,7 +433,6 @@ namespace ams::ldr::hoc::pcv::mariko {
|
|||||||
WRITE_PARAM_ALL_REG(table, emc_rdv_early_mask, rdv);
|
WRITE_PARAM_ALL_REG(table, emc_rdv_early_mask, rdv);
|
||||||
WRITE_PARAM_ALL_REG(table, emc_rdv_mask, rdv + 2);
|
WRITE_PARAM_ALL_REG(table, emc_rdv_mask, rdv + 2);
|
||||||
WRITE_PARAM_ALL_REG(table, emc_tr_rdv, rdv);
|
WRITE_PARAM_ALL_REG(table, emc_tr_rdv, rdv);
|
||||||
/* TODO: Check this out again at some point. */
|
|
||||||
WRITE_PARAM_ALL_REG(table, emc_cmd_brlshft_2, 0x24);
|
WRITE_PARAM_ALL_REG(table, emc_cmd_brlshft_2, 0x24);
|
||||||
WRITE_PARAM_ALL_REG(table, emc_cmd_brlshft_3, 0x24);
|
WRITE_PARAM_ALL_REG(table, emc_cmd_brlshft_3, 0x24);
|
||||||
|
|
||||||
@@ -947,6 +947,7 @@ namespace ams::ldr::hoc::pcv::mariko {
|
|||||||
|
|
||||||
PATCH_OFFSET(ptr - BrOffset, NopIns);
|
PATCH_OFFSET(ptr - BrOffset, NopIns);
|
||||||
PATCH_OFFSET(ptr - MovOffset, movCountPatch);
|
PATCH_OFFSET(ptr - MovOffset, movCountPatch);
|
||||||
|
|
||||||
R_SUCCEED();
|
R_SUCCEED();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user