diff --git a/bootloader/mem/minerva.c b/bootloader/mem/minerva.c index 6683053..68aa66d 100644 --- a/bootloader/mem/minerva.c +++ b/bootloader/mem/minerva.c @@ -28,7 +28,7 @@ extern volatile nyx_storage_t *nyx_str; -void minerva_init() +u32 minerva_init() { u32 curr_ram_idx = 0; @@ -37,13 +37,17 @@ void minerva_init() // Set table to nyx storage. mtc_cfg->mtc_table = (emc_table_t *)&nyx_str->mtc_table; - mtc_cfg->init_done = MTC_NEW_MAGIC; mtc_cfg->sdram_id = (fuse_read_odm(4) >> 3) & 0x1F; + mtc_cfg->init_done = MTC_NEW_MAGIC; // Initialize mtc table. + u32 ep_addr = ianos_loader(false, "bootloader/sys/libsys_minerva.bso", DRAM_LIB, (void *)mtc_cfg); - minerva_cfg = (void *)ep_addr; + + // Ensure that Minerva is new. + if (mtc_cfg->init_done == MTC_INIT_MAGIC) + minerva_cfg = (void *)ep_addr; if (!minerva_cfg) - return; + return 1; // Get current frequency for (curr_ram_idx = 0; curr_ram_idx < 10; curr_ram_idx++) @@ -69,6 +73,8 @@ void minerva_init() // Switch to max. mtc_cfg->rate_to = 1600000; minerva_cfg(mtc_cfg, NULL); + + return 0; } void minerva_change_freq(minerva_freq_t freq) diff --git a/bootloader/mem/minerva.h b/bootloader/mem/minerva.h index f1edbaa..00228f4 100644 --- a/bootloader/mem/minerva.h +++ b/bootloader/mem/minerva.h @@ -58,7 +58,7 @@ typedef enum } minerva_freq_t; void (*minerva_cfg)(mtc_config_t *mtc_cfg, void *); -void minerva_init(); +u32 minerva_init(); void minerva_change_freq(minerva_freq_t freq); void minerva_periodic_training(); diff --git a/nyx/nyx_gui/mem/minerva.c b/nyx/nyx_gui/mem/minerva.c index 06db131..ca24326 100644 --- a/nyx/nyx_gui/mem/minerva.c +++ b/nyx/nyx_gui/mem/minerva.c @@ -28,7 +28,7 @@ extern volatile nyx_storage_t *nyx_str; -void minerva_init() +u32 minerva_init() { u32 curr_ram_idx = 0; @@ -37,23 +37,26 @@ void minerva_init() // Set table to nyx storage. mtc_cfg->mtc_table = (emc_table_t *)&nyx_str->mtc_table; - // Set table to ram. + // Check if Minerva is already initialized. if (mtc_cfg->init_done == MTC_INIT_MAGIC) { mtc_cfg->train_mode = OP_PERIODIC_TRAIN; // Retrain if needed. u32 ep_addr = ianos_loader(false, "bootloader/sys/libsys_minerva.bso", DRAM_LIB, (void *)mtc_cfg); minerva_cfg = (void *)ep_addr; - return; + return 0; } else { mtc_config_t mtc_tmp; + mtc_tmp.mtc_table = mtc_cfg->mtc_table; mtc_tmp.sdram_id = (fuse_read_odm(4) >> 3) & 0x1F; mtc_tmp.init_done = MTC_NEW_MAGIC; + u32 ep_addr = ianos_loader(false, "bootloader/sys/libsys_minerva.bso", DRAM_LIB, (void *)&mtc_tmp); + // Ensure that Minerva is new. if (mtc_tmp.init_done == MTC_INIT_MAGIC) minerva_cfg = (void *)ep_addr; @@ -63,7 +66,7 @@ void minerva_init() } if (!minerva_cfg) - return; + return 1; // Get current frequency for (curr_ram_idx = 0; curr_ram_idx < 10; curr_ram_idx++) @@ -89,6 +92,8 @@ void minerva_init() // Switch to max. mtc_cfg->rate_to = 1600000; minerva_cfg(mtc_cfg, NULL); + + return 0; } void minerva_change_freq(minerva_freq_t freq) diff --git a/nyx/nyx_gui/mem/minerva.h b/nyx/nyx_gui/mem/minerva.h index f1edbaa..00228f4 100644 --- a/nyx/nyx_gui/mem/minerva.h +++ b/nyx/nyx_gui/mem/minerva.h @@ -58,7 +58,7 @@ typedef enum } minerva_freq_t; void (*minerva_cfg)(mtc_config_t *mtc_cfg, void *); -void minerva_init(); +u32 minerva_init(); void minerva_change_freq(minerva_freq_t freq); void minerva_periodic_training();