diff --git a/bdk/mem/minerva.c b/bdk/mem/minerva.c index 6136d73..2560dfe 100644 --- a/bdk/mem/minerva.c +++ b/bdk/mem/minerva.c @@ -104,21 +104,21 @@ u32 minerva_init() } mtc_cfg->rate_from = mtc_cfg->mtc_table[curr_ram_idx].rate_khz; - mtc_cfg->rate_to = 204000; + mtc_cfg->rate_to = FREQ_204; mtc_cfg->train_mode = OP_TRAIN; minerva_cfg(mtc_cfg, NULL); - mtc_cfg->rate_to = 800000; + mtc_cfg->rate_to = FREQ_800; minerva_cfg(mtc_cfg, NULL); - mtc_cfg->rate_to = 1600000; + mtc_cfg->rate_to = FREQ_1600; minerva_cfg(mtc_cfg, NULL); // FSP WAR. mtc_cfg->train_mode = OP_SWITCH; - mtc_cfg->rate_to = 800000; + mtc_cfg->rate_to = FREQ_800; minerva_cfg(mtc_cfg, NULL); // Switch to max. - mtc_cfg->rate_to = 1600000; + mtc_cfg->rate_to = FREQ_1600; minerva_cfg(mtc_cfg, NULL); return 0; @@ -139,6 +139,23 @@ void minerva_change_freq(minerva_freq_t freq) } } +void minerva_prep_boot_freq() +{ + if (!minerva_cfg) + return; + + mtc_config_t *mtc_cfg = (mtc_config_t *)&nyx_str->mtc_cfg; + + // Check if there's RAM OC. If not exit. + if (mtc_cfg->mtc_table[mtc_cfg->table_entries - 1].rate_khz == FREQ_1600) + return; + + // FSP WAR. + minerva_change_freq(FREQ_204); + // Scale down to 800 MHz boot freq. + minerva_change_freq(FREQ_800); +} + void minerva_periodic_training() { if (!minerva_cfg) diff --git a/bdk/mem/minerva.h b/bdk/mem/minerva.h index ed80b95..51cb215 100644 --- a/bdk/mem/minerva.h +++ b/bdk/mem/minerva.h @@ -60,6 +60,7 @@ typedef enum extern void (*minerva_cfg)(mtc_config_t *mtc_cfg, void *); u32 minerva_init(); void minerva_change_freq(minerva_freq_t freq); +void minerva_prep_boot_freq(); void minerva_periodic_training(); #endif diff --git a/bootloader/hos/hos.c b/bootloader/hos/hos.c index c0e26b1..ceaa8cd 100644 --- a/bootloader/hos/hos.c +++ b/bootloader/hos/hos.c @@ -1140,6 +1140,10 @@ int hos_launch(ini_sec_t *cfg) bpmp_mmu_disable(); bpmp_clk_rate_set(BPMP_CLK_NORMAL); + // Scale down RAM OC if enabled. + if (ctxt.stock) + minerva_prep_boot_freq(); + // emuMMC: Some cards (Sandisk U1), do not like a fast power cycle. Wait min 100ms. sdmmc_storage_init_wait_sd();