From bc7dec2e6124116c1bafb912d9027de4991213cf Mon Sep 17 00:00:00 2001 From: Kostas Missos Date: Sat, 7 Dec 2019 01:47:44 +0200 Subject: [PATCH] bpmp: Add forcable maintenance + Fix build issues --- bootloader/soc/bpmp.c | 13 +++++-------- bootloader/soc/bpmp.h | 2 +- bootloader/storage/emummc.c | 2 +- bootloader/storage/sdmmc_driver.c | 4 ++-- nyx/nyx_gui/frontend/fe_emmc_tools.c | 1 + nyx/nyx_gui/soc/bpmp.c | 13 +++++-------- nyx/nyx_gui/soc/bpmp.h | 2 +- nyx/nyx_gui/storage/sdmmc_driver.c | 4 ++-- nyx/nyx_gui/utils/util.c | 1 + 9 files changed, 19 insertions(+), 23 deletions(-) diff --git a/bootloader/soc/bpmp.c b/bootloader/soc/bpmp.c index 3d6091d..6522b7e 100644 --- a/bootloader/soc/bpmp.c +++ b/bootloader/soc/bpmp.c @@ -78,9 +78,9 @@ bpmp_mmu_entry_t mmu_entries[] = { IPL_LOAD_ADDR, 0x40040000, MMU_EN_READ | MMU_EN_WRITE | MMU_EN_EXEC | MMU_EN_CACHED, true } }; -void bpmp_mmu_maintenance(u32 op) +void bpmp_mmu_maintenance(u32 op, bool force) { - if (!(BPMP_CACHE_CTRL(BPMP_CACHE_CONFIG) & CFG_ENABLE)) + if (!force && !(BPMP_CACHE_CTRL(BPMP_CACHE_CONFIG) & CFG_ENABLE)) return; BPMP_CACHE_CTRL(BPMP_CACHE_INT_CLEAR) = INT_CLR_MAINT_DONE; @@ -132,13 +132,13 @@ void bpmp_mmu_enable() BPMP_CACHE_CTRL(BPMP_CACHE_MMU_CMD) = MMU_CMD_COPY_SHADOW; // Invalidate cache. - bpmp_mmu_maintenance(BPMP_MMU_MAINT_INVALID_WAY); + bpmp_mmu_maintenance(BPMP_MMU_MAINT_INVALID_WAY, true); // Enable cache. BPMP_CACHE_CTRL(BPMP_CACHE_CONFIG) = CFG_ENABLE | CFG_FORCE_WRITE_THROUGH | CFG_TAG_CHK_ABRT_ON_ERR; // HW bug. Invalidate cache again. - bpmp_mmu_maintenance(BPMP_MMU_MAINT_INVALID_WAY); + bpmp_mmu_maintenance(BPMP_MMU_MAINT_INVALID_WAY, false); } void bpmp_mmu_disable() @@ -147,13 +147,10 @@ void bpmp_mmu_disable() return; // Clean and invalidate cache. - bpmp_mmu_maintenance(BPMP_MMU_MAINT_CLN_INV_WAY); + bpmp_mmu_maintenance(BPMP_MMU_MAINT_CLN_INV_WAY, false); // Disable cache. BPMP_CACHE_CTRL(BPMP_CACHE_CONFIG) = 0; - - // HW bug. Invalidate cache again. - bpmp_mmu_maintenance(BPMP_MMU_MAINT_INVALID_WAY); } const u8 pllc4_divn[] = { diff --git a/bootloader/soc/bpmp.h b/bootloader/soc/bpmp.h index b45ab7a..d85252f 100644 --- a/bootloader/soc/bpmp.h +++ b/bootloader/soc/bpmp.h @@ -42,7 +42,7 @@ typedef enum BPMP_CLK_MAX } bpmp_freq_t; -void bpmp_mmu_maintenance(u32 op); +void bpmp_mmu_maintenance(u32 op, bool force); void bpmp_mmu_set_entry(int idx, bpmp_mmu_entry_t *entry, bool apply); void bpmp_mmu_enable(); void bpmp_mmu_disable(); diff --git a/bootloader/storage/emummc.c b/bootloader/storage/emummc.c index e12d665..e3eb7ae 100644 --- a/bootloader/storage/emummc.c +++ b/bootloader/storage/emummc.c @@ -95,7 +95,7 @@ static int emummc_raw_get_part_off(int part_idx) int emummc_storage_init_mmc(sdmmc_storage_t *storage, sdmmc_t *sdmmc) { FILINFO fno; - if (!sdmmc_storage_init_mmc(storage, sdmmc, SDMMC_4, SDMMC_BUS_WIDTH_8, SDHCI_TIMING_MMC_HS400)) + if (!sdmmc_storage_init_mmc(storage, sdmmc, SDMMC_4, SDMMC_BUS_WIDTH_8, 4)) return 2; if (h_cfg.emummc_force_disable) diff --git a/bootloader/storage/sdmmc_driver.c b/bootloader/storage/sdmmc_driver.c index d7a5705..57d20f9 100644 --- a/bootloader/storage/sdmmc_driver.c +++ b/bootloader/storage/sdmmc_driver.c @@ -830,7 +830,7 @@ static int _sdmmc_config_dma(sdmmc_t *sdmmc, u32 *blkcnt_out, sdmmc_req_t *req) trnmode |= TEGRA_MMC_TRNMOD_DATA_XFER_DIR_SEL_READ; if (req->is_auto_cmd12) trnmode = (trnmode & 0xFFF3) | TEGRA_MMC_TRNMOD_AUTO_CMD12; - bpmp_mmu_maintenance(BPMP_MMU_MAINT_CLN_INV_WAY); + bpmp_mmu_maintenance(BPMP_MMU_MAINT_CLN_INV_WAY, false); sdmmc->regs->trnmod = trnmode; return 1; @@ -855,7 +855,7 @@ static int _sdmmc_update_dma(sdmmc_t *sdmmc) break; if (intr & TEGRA_MMC_NORINTSTS_XFER_COMPLETE) { - bpmp_mmu_maintenance(BPMP_MMU_MAINT_CLN_INV_WAY); + bpmp_mmu_maintenance(BPMP_MMU_MAINT_CLN_INV_WAY, false); return 1; // Transfer complete. } if (intr & TEGRA_MMC_NORINTSTS_DMA_INTERRUPT) diff --git a/nyx/nyx_gui/frontend/fe_emmc_tools.c b/nyx/nyx_gui/frontend/fe_emmc_tools.c index 117a750..1dfc05e 100644 --- a/nyx/nyx_gui/frontend/fe_emmc_tools.c +++ b/nyx/nyx_gui/frontend/fe_emmc_tools.c @@ -28,6 +28,7 @@ #include "../libs/fatfs/ff.h" #include "../mem/heap.h" #include "../sec/se.h" +#include "../sec/se_t210.h" #include "../storage/nx_emmc.h" #include "../storage/sdmmc.h" #include "../utils/btn.h" diff --git a/nyx/nyx_gui/soc/bpmp.c b/nyx/nyx_gui/soc/bpmp.c index effca15..bdda136 100644 --- a/nyx/nyx_gui/soc/bpmp.c +++ b/nyx/nyx_gui/soc/bpmp.c @@ -81,9 +81,9 @@ bpmp_mmu_entry_t mmu_entries[] = { NYX_LOAD_ADDR, 0x40040000, MMU_EN_READ | MMU_EN_WRITE | MMU_EN_EXEC | MMU_EN_CACHED, true } }; -void bpmp_mmu_maintenance(u32 op) +void bpmp_mmu_maintenance(u32 op, bool force) { - if (!(BPMP_CACHE_CTRL(BPMP_CACHE_CONFIG) & CFG_ENABLE)) + if (!force && !(BPMP_CACHE_CTRL(BPMP_CACHE_CONFIG) & CFG_ENABLE)) return; BPMP_CACHE_CTRL(BPMP_CACHE_INT_CLEAR) = INT_CLR_MAINT_DONE; @@ -135,13 +135,13 @@ void bpmp_mmu_enable() BPMP_CACHE_CTRL(BPMP_CACHE_MMU_CMD) = MMU_CMD_COPY_SHADOW; // Invalidate cache. - bpmp_mmu_maintenance(BPMP_MMU_MAINT_INVALID_WAY); + bpmp_mmu_maintenance(BPMP_MMU_MAINT_INVALID_WAY, true); // Enable cache. BPMP_CACHE_CTRL(BPMP_CACHE_CONFIG) = CFG_ENABLE | CFG_FORCE_WRITE_THROUGH | CFG_TAG_CHK_ABRT_ON_ERR; // HW bug. Invalidate cache again. - bpmp_mmu_maintenance(BPMP_MMU_MAINT_INVALID_WAY); + bpmp_mmu_maintenance(BPMP_MMU_MAINT_INVALID_WAY, false); } void bpmp_mmu_disable() @@ -150,13 +150,10 @@ void bpmp_mmu_disable() return; // Clean and invalidate cache. - bpmp_mmu_maintenance(BPMP_MMU_MAINT_CLN_INV_WAY); + bpmp_mmu_maintenance(BPMP_MMU_MAINT_CLN_INV_WAY, false); // Disable cache. BPMP_CACHE_CTRL(BPMP_CACHE_CONFIG) = 0; - - // HW bug. Invalidate cache again. - bpmp_mmu_maintenance(BPMP_MMU_MAINT_INVALID_WAY); } const u8 pllc4_divn[] = { diff --git a/nyx/nyx_gui/soc/bpmp.h b/nyx/nyx_gui/soc/bpmp.h index b45ab7a..d85252f 100644 --- a/nyx/nyx_gui/soc/bpmp.h +++ b/nyx/nyx_gui/soc/bpmp.h @@ -42,7 +42,7 @@ typedef enum BPMP_CLK_MAX } bpmp_freq_t; -void bpmp_mmu_maintenance(u32 op); +void bpmp_mmu_maintenance(u32 op, bool force); void bpmp_mmu_set_entry(int idx, bpmp_mmu_entry_t *entry, bool apply); void bpmp_mmu_enable(); void bpmp_mmu_disable(); diff --git a/nyx/nyx_gui/storage/sdmmc_driver.c b/nyx/nyx_gui/storage/sdmmc_driver.c index d7a5705..57d20f9 100644 --- a/nyx/nyx_gui/storage/sdmmc_driver.c +++ b/nyx/nyx_gui/storage/sdmmc_driver.c @@ -830,7 +830,7 @@ static int _sdmmc_config_dma(sdmmc_t *sdmmc, u32 *blkcnt_out, sdmmc_req_t *req) trnmode |= TEGRA_MMC_TRNMOD_DATA_XFER_DIR_SEL_READ; if (req->is_auto_cmd12) trnmode = (trnmode & 0xFFF3) | TEGRA_MMC_TRNMOD_AUTO_CMD12; - bpmp_mmu_maintenance(BPMP_MMU_MAINT_CLN_INV_WAY); + bpmp_mmu_maintenance(BPMP_MMU_MAINT_CLN_INV_WAY, false); sdmmc->regs->trnmod = trnmode; return 1; @@ -855,7 +855,7 @@ static int _sdmmc_update_dma(sdmmc_t *sdmmc) break; if (intr & TEGRA_MMC_NORINTSTS_XFER_COMPLETE) { - bpmp_mmu_maintenance(BPMP_MMU_MAINT_CLN_INV_WAY); + bpmp_mmu_maintenance(BPMP_MMU_MAINT_CLN_INV_WAY, false); return 1; // Transfer complete. } if (intr & TEGRA_MMC_NORINTSTS_DMA_INTERRUPT) diff --git a/nyx/nyx_gui/utils/util.c b/nyx/nyx_gui/utils/util.c index a705325..ba0b753 100644 --- a/nyx/nyx_gui/utils/util.c +++ b/nyx/nyx_gui/utils/util.c @@ -19,6 +19,7 @@ #include "../gfx/di.h" #include "../mem/minerva.h" #include "../power/max77620.h" +#include "../rtc/max77620-rtc.h" #include "../soc/bpmp.h" #include "../soc/i2c.h" #include "../soc/pmc.h"