From adfa7c0780214f6712510a12621fb33bc7bfc0b3 Mon Sep 17 00:00:00 2001 From: CTCaer Date: Sat, 18 Jul 2020 01:15:28 +0300 Subject: [PATCH] fuse: Use fuse count function for burnt fuses --- bdk/soc/fuse.c | 12 ++++++++++++ bdk/soc/fuse.h | 9 +++++---- nyx/nyx_gui/frontend/gui_info.c | 18 +++++------------- 3 files changed, 22 insertions(+), 17 deletions(-) diff --git a/bdk/soc/fuse.c b/bdk/soc/fuse.c index 84c366d..97433f2 100644 --- a/bdk/soc/fuse.c +++ b/bdk/soc/fuse.c @@ -68,6 +68,18 @@ u32 fuse_read_odm_keygen_rev() return 0; } +u8 fuse_count_burnt(u32 val) +{ + u8 burnt_fuses = 0; + for (u32 i = 0; i < 32; i++) + { + if ((val >> i) & 1) + burnt_fuses++; + } + + return burnt_fuses; +} + void fuse_wait_idle() { u32 ctrl; diff --git a/bdk/soc/fuse.h b/bdk/soc/fuse.h index e5ca2fb..ae96096 100644 --- a/bdk/soc/fuse.h +++ b/bdk/soc/fuse.h @@ -76,11 +76,12 @@ #define FUSE_RESERVED_ODMX(x) (0x1C8 + 4 * (x)) void fuse_disable_program(); -u32 fuse_read_odm(u32 idx); -u32 fuse_read_odm_keygen_rev(); +u32 fuse_read_odm(u32 idx); +u32 fuse_read_odm_keygen_rev(); +u8 fuse_count_burnt(u32 val); void fuse_wait_idle(); -int fuse_read_ipatch(void (*ipatch)(u32 offset, u32 value)); -int fuse_read_evp_thunk(u32 *iram_evp_thunks, u32 *iram_evp_thunks_len); +int fuse_read_ipatch(void (*ipatch)(u32 offset, u32 value)); +int fuse_read_evp_thunk(u32 *iram_evp_thunks, u32 *iram_evp_thunks_len); void fuse_read_array(u32 *words); bool fuse_check_patched_rcm(); diff --git a/nyx/nyx_gui/frontend/gui_info.c b/nyx/nyx_gui/frontend/gui_info.c index a4de3f4..d28a84d 100644 --- a/nyx/nyx_gui/frontend/gui_info.c +++ b/nyx/nyx_gui/frontend/gui_info.c @@ -514,8 +514,6 @@ static lv_res_t _create_window_fuses_info_status(lv_obj_t *btn) char *txt_buf = (char *)malloc(0x4000); // Decode fuses. - u8 burntFuses7 = 0; - u8 burntFuses6 = 0; u32 odm4 = fuse_read_odm(4); u8 dram_id = (odm4 >> 3) & 0x1F; char dram_man[16] = {0}; @@ -536,17 +534,11 @@ static lv_res_t _create_window_fuses_info_status(lv_obj_t *btn) break; } - for (u32 i = 0; i < 32; i++) - { - if ((fuse_read_odm(7) >> i) & 1) - burntFuses7++; - } - for (u32 i = 0; i < 32; i++) - { - if ((fuse_read_odm(6) >> i) & 1) - burntFuses6++; - } + // Count burnt fuses. + u8 burnt_fuses_7 = fuse_count_burnt(fuse_read_odm(7)); + u8 burnt_fuses_6 = fuse_count_burnt(fuse_read_odm(6)); + // Calculate LOT. u32 lot_code0 = (FUSE(FUSE_OPT_LOT_CODE_0) & 0xFFFFFFF) << 2; u32 lot_bin = 0; for (int i = 0; i < 5; ++i) @@ -565,7 +557,7 @@ static lv_res_t _create_window_fuses_info_status(lv_obj_t *btn) "%d\n%d\n%d (0x%X)\n%d\n%d\n%d\n%d\n" "ID: %02X, Major: A0%d, Minor: %d", FUSE(FUSE_SKU_INFO), odm4 & 0x30000 ? "Mariko" : "Erista", (fuse_read_odm(4) & 3) ? "Dev" : "Retail", - dram_id, dram_man, burntFuses7, burntFuses6, + dram_id, dram_man, burnt_fuses_7, burnt_fuses_6, byte_swap_32(FUSE(FUSE_PRIVATE_KEY0)), byte_swap_32(FUSE(FUSE_PRIVATE_KEY1)), byte_swap_32(FUSE(FUSE_PRIVATE_KEY2)), byte_swap_32(FUSE(FUSE_PRIVATE_KEY3)), byte_swap_32(FUSE(FUSE_PRIVATE_KEY4)),