From 04907e282342e1487efbea08877998468758ada2 Mon Sep 17 00:00:00 2001 From: Kostas Missos Date: Sun, 24 Feb 2019 00:59:33 +0200 Subject: [PATCH] Bug fixes and refactoring - Info tools - Tools - Tsec - Many more --- bootloader/frontend/fe_info.c | 109 ++++++++++++++------------------- bootloader/frontend/fe_tools.c | 84 +++++++++++++------------ bootloader/main.c | 10 +-- bootloader/sec/tsec.c | 86 +++++++++++++------------- bootloader/sec/tsec.h | 1 - bootloader/soc/hw_init.c | 28 ++++++--- bootloader/soc/pmc.h | 4 ++ bootloader/soc/t210.h | 4 ++ 8 files changed, 161 insertions(+), 165 deletions(-) diff --git a/bootloader/frontend/fe_info.c b/bootloader/frontend/fe_info.c index 6ef12b8..fa70678 100644 --- a/bootloader/frontend/fe_info.c +++ b/bootloader/frontend/fe_info.c @@ -1,6 +1,6 @@ /* * Copyright (c) 2018 naehrwert - * Copyright (c) 2018 CTCaer + * Copyright (c) 2018-2019 CTCaer * Copyright (c) 2018 balika011 * * This program is free software; you can redistribute it and/or modify it @@ -88,7 +88,7 @@ void print_fuseinfo() gfx_printf(&gfx_con, "%k(Unlocked) fuse cache:\n\n%k", 0xFF00DDFF, 0xFFCCCCCC); gfx_hexdump(&gfx_con, 0x7000F900, (u8 *)0x7000F900, 0x2FC); - gfx_puts(&gfx_con, "Press POWER to dump them to SD Card.\nPress VOL to go to the menu.\n"); + gfx_puts(&gfx_con, "\nPress POWER to dump them to SD Card.\nPress VOL to go to the menu.\n"); u32 btn = btn_wait(); if (btn & BTN_POWER) @@ -352,7 +352,6 @@ void print_tsec_key() gfx_con_setpos(&gfx_con, 0, 0); u32 retries = 0; - u32 key_ver_max = 3; tsec_ctxt_t tsec_ctxt; sdmmc_storage_t storage; @@ -368,85 +367,70 @@ void print_tsec_key() const pkg1_id_t *pkg1_id = pkg1_identify(pkg1); if (!pkg1_id) { - EPRINTFARGS("Unknown package1 version for reading\nTSEC firmware (= '%s').", - (char *)pkg1 + 0x10); + EPRINTF("Unknown pkg1 version for reading\nTSEC firmware."); goto out_wait; } - u8 keys[0x10 * 3]; + u8 keys[0x10 * 2]; + memset(keys, 0x00, 0x20); - tsec_ctxt.size = 0xF00; tsec_ctxt.fw = (u8 *)pkg1 + pkg1_id->tsec_off; tsec_ctxt.pkg1 = pkg1; tsec_ctxt.pkg11_off = pkg1_id->pkg11_off; tsec_ctxt.secmon_base = pkg1_id->secmon_base; - if (pkg1_id->kb >= KB_FIRMWARE_VERSION_620) - { + if (pkg1_id->kb <= KB_FIRMWARE_VERSION_600) + tsec_ctxt.size = 0xF00; + else if (pkg1_id->kb == KB_FIRMWARE_VERSION_620) tsec_ctxt.size = 0x2900; + else + { + tsec_ctxt.size = 0x3000; + // Exit after TSEC key generation. + *((vu16 *)((u32)tsec_ctxt.fw + 0x2DB5)) = 0x02F8; + } + + if (pkg1_id->kb == KB_FIRMWARE_VERSION_620) + { u8 *tsec_paged = (u8 *)page_alloc(3); memcpy(tsec_paged, (void *)tsec_ctxt.fw, tsec_ctxt.size); tsec_ctxt.fw = tsec_paged; - - key_ver_max = 1; } - for (u32 i = 1; i <= key_ver_max; i++) + int res = 0; + + while (tsec_query(keys, pkg1_id->kb, &tsec_ctxt) < 0) { - tsec_ctxt.key_ver = i; - int res = 0; + memset(keys, 0x00, 0x20); - while (tsec_query(keys + ((i - 1) * 0x10), pkg1_id->kb, &tsec_ctxt) < 0) + retries++; + + if (retries > 3) { - if (pkg1_id->kb <= KB_FIRMWARE_VERSION_600) - memset(keys + ((i - 1) * 0x10), 0x00, 0x10); - else - memset(keys, 0x00, 0x30); - - retries++; - - if (retries > 3) - { - res = -1; - break; - } + res = -1; + break; } - - if (pkg1_id->kb <= KB_FIRMWARE_VERSION_600) - { - gfx_printf(&gfx_con, "%kTSEC key %d: %k", 0xFF00DDFF, i, 0xFFCCCCCC); - - if (res >= 0) - { - for (u32 j = 0; j < 0x10; j++) - gfx_printf(&gfx_con, "%02X", keys[((i - 1) * 0x10) + j]); - } - else - EPRINTFARGS("ERROR %X", res); - gfx_putc(&gfx_con, '\n'); - } - else - { - gfx_printf(&gfx_con, "%kTSEC key: %k", 0xFF00DDFF, 0xFFCCCCCC); - - if (res >= 0) - { - for (u32 j = 0; j < 0x10; j++) - gfx_printf(&gfx_con, "%02X", keys[j]); - gfx_putc(&gfx_con, '\n'); - - gfx_printf(&gfx_con, "%kTSEC root: %k", 0xFF00DDFF, 0xFFCCCCCC); - for (u32 j = 0; j < 0x10; j++) - gfx_printf(&gfx_con, "%02X", keys[0x10 + j]); - } - else - EPRINTFARGS("ERROR %X", res); - gfx_putc(&gfx_con, '\n'); - } - } - gfx_puts(&gfx_con, "\nPress POWER to dump them to SD Card.\nPress VOL to go to the menu.\n"); + gfx_printf(&gfx_con, "%kTSEC key: %k", 0xFF00DDFF, 0xFFCCCCCC); + + if (res >= 0) + { + for (u32 j = 0; j < 0x10; j++) + gfx_printf(&gfx_con, "%02X", keys[j]); + + + if (pkg1_id->kb == KB_FIRMWARE_VERSION_620) + { + gfx_printf(&gfx_con, "\n%kTSEC root: %k", 0xFF00DDFF, 0xFFCCCCCC); + for (u32 j = 0; j < 0x10; j++) + gfx_printf(&gfx_con, "%02X", keys[0x10 + j]); + } + } + else + EPRINTFARGS("ERROR %X\n", res); + + gfx_puts(&gfx_con, "\n\nPress POWER to dump them to SD Card.\nPress VOL to go to the menu.\n"); u32 btn = btn_wait(); if (btn & BTN_POWER) @@ -455,7 +439,7 @@ void print_tsec_key() { char path[64]; emmcsn_path_impl(path, "/dumps", "tsec_keys.bin", NULL); - if (!sd_save_to_file(keys, 0x10 * 3, path)) + if (!sd_save_to_file(keys, 0x10 * 2, path)) gfx_puts(&gfx_con, "\nDone!\n"); sd_unmount(); } @@ -709,4 +693,3 @@ void bootrom_ipatches_info() } #pragma GCC pop_options - diff --git a/bootloader/frontend/fe_tools.c b/bootloader/frontend/fe_tools.c index 014c20f..857e455 100644 --- a/bootloader/frontend/fe_tools.c +++ b/bootloader/frontend/fe_tools.c @@ -36,6 +36,7 @@ #include "../utils/util.h" extern hekate_config h_cfg; + extern gfx_ctxt_t gfx_ctxt; extern gfx_con_t gfx_con; extern sdmmc_storage_t sd_storage; @@ -82,15 +83,14 @@ void dump_packages12() if (!pkg1_id) { gfx_con.fntsz = 8; - EPRINTFARGS("Unknown package1 version for reading\nTSEC firmware (= '%s').", (char *)pkg1 + 0x10); + EPRINTF("Unknown pkg1 version for reading\nTSEC firmware."); goto out_free; } kb = pkg1_id->kb; - if (!h_cfg.se_keygen_done || kb >= KB_FIRMWARE_VERSION_620) + if (!h_cfg.se_keygen_done || kb == KB_FIRMWARE_VERSION_620) { - tsec_ctxt.key_ver = 1; tsec_ctxt.fw = (void *)pkg1 + pkg1_id->tsec_off; tsec_ctxt.pkg1 = (void *)pkg1; tsec_ctxt.pkg11_off = pkg1_id->pkg11_off; @@ -110,41 +110,45 @@ void dump_packages12() if (kb <= KB_FIRMWARE_VERSION_600) pkg1_decrypt(pkg1_id, pkg1); - pkg1_unpack(warmboot, secmon, loader, pkg1_id, pkg1); - - // Display info. - gfx_printf(&gfx_con, "%kNX Bootloader size: %k0x%05X\n\n", 0xFFC7EA46, 0xFFCCCCCC, hdr->ldr_size); - - gfx_printf(&gfx_con, "%kSecure monitor addr: %k0x%05X\n", 0xFFC7EA46, 0xFFCCCCCC, pkg1_id->secmon_base); - gfx_printf(&gfx_con, "%kSecure monitor size: %k0x%05X\n\n", 0xFFC7EA46, 0xFFCCCCCC, hdr->sm_size); - - gfx_printf(&gfx_con, "%kWarmboot addr: %k0x%05X\n", 0xFFC7EA46, 0xFFCCCCCC, pkg1_id->warmboot_base); - gfx_printf(&gfx_con, "%kWarmboot size: %k0x%05X\n\n", 0xFFC7EA46, 0xFFCCCCCC, hdr->wb_size); - char path[64]; - // Dump package1.1. - emmcsn_path_impl(path, "/pkg1", "pkg1_decr.bin", &storage); - if (sd_save_to_file(pkg1, 0x40000, path)) - goto out_free; - gfx_puts(&gfx_con, "\nFull package1 dumped to pkg1_decr.bin\n"); - // Dump nxbootloader. - emmcsn_path_impl(path, "/pkg1", "nxloader.bin", &storage); - if (sd_save_to_file(loader, hdr->ldr_size, path)) - goto out_free; - gfx_puts(&gfx_con, "NX Bootloader dumped to nxloader.bin\n"); + if (kb <= KB_FIRMWARE_VERSION_620) + { + pkg1_unpack(warmboot, secmon, loader, pkg1_id, pkg1); + + // Display info. + gfx_printf(&gfx_con, "%kNX Bootloader size: %k0x%05X\n\n", 0xFFC7EA46, 0xFFCCCCCC, hdr->ldr_size); + + gfx_printf(&gfx_con, "%kSecure monitor addr: %k0x%05X\n", 0xFFC7EA46, 0xFFCCCCCC, pkg1_id->secmon_base); + gfx_printf(&gfx_con, "%kSecure monitor size: %k0x%05X\n\n", 0xFFC7EA46, 0xFFCCCCCC, hdr->sm_size); + + gfx_printf(&gfx_con, "%kWarmboot addr: %k0x%05X\n", 0xFFC7EA46, 0xFFCCCCCC, pkg1_id->warmboot_base); + gfx_printf(&gfx_con, "%kWarmboot size: %k0x%05X\n\n", 0xFFC7EA46, 0xFFCCCCCC, hdr->wb_size); - // Dump secmon. - emmcsn_path_impl(path, "/pkg1", "secmon.bin", &storage); - if (sd_save_to_file(secmon, hdr->sm_size, path)) - goto out_free; - gfx_puts(&gfx_con, "Secure Monitor dumped to secmon.bin\n"); - - // Dump warmboot. - emmcsn_path_impl(path, "/pkg1", "warmboot.bin", &storage); - if (sd_save_to_file(warmboot, hdr->wb_size, path)) - goto out_free; - gfx_puts(&gfx_con, "Warmboot dumped to warmboot.bin\n\n\n"); + // Dump package1.1. + emmcsn_path_impl(path, "/pkg1", "pkg1_decr.bin", &storage); + if (sd_save_to_file(pkg1, 0x40000, path)) + goto out_free; + gfx_puts(&gfx_con, "\npkg1 dumped to pkg1_decr.bin\n"); + + // Dump nxbootloader. + emmcsn_path_impl(path, "/pkg1", "nxloader.bin", &storage); + if (sd_save_to_file(loader, hdr->ldr_size, path)) + goto out_free; + gfx_puts(&gfx_con, "NX Bootloader dumped to nxloader.bin\n"); + + // Dump secmon. + emmcsn_path_impl(path, "/pkg1", "secmon.bin", &storage); + if (sd_save_to_file(secmon, hdr->sm_size, path)) + goto out_free; + gfx_puts(&gfx_con, "Secure Monitor dumped to secmon.bin\n"); + + // Dump warmboot. + emmcsn_path_impl(path, "/pkg1", "warmboot.bin", &storage); + if (sd_save_to_file(warmboot, hdr->wb_size, path)) + goto out_free; + gfx_puts(&gfx_con, "Warmboot dumped to warmboot.bin\n\n\n"); + } // Dump package2.1. sdmmc_storage_set_mmc_partition(&storage, 0); @@ -180,7 +184,7 @@ void dump_packages12() emmcsn_path_impl(path, "/pkg2", "pkg2_decr.bin", &storage); if (sd_save_to_file(pkg2, pkg2_hdr->sec_size[PKG2_SEC_KERNEL] + pkg2_hdr->sec_size[PKG2_SEC_INI1], path)) goto out; - gfx_puts(&gfx_con, "\nFull package2 dumped to pkg2_decr.bin\n"); + gfx_puts(&gfx_con, "\npkg2 dumped to pkg2_decr.bin\n"); // Dump kernel. emmcsn_path_impl(path, "/pkg2", "kernel.bin", &storage); @@ -193,7 +197,7 @@ void dump_packages12() if (sd_save_to_file(pkg2_hdr->data + pkg2_hdr->sec_size[PKG2_SEC_KERNEL], pkg2_hdr->sec_size[PKG2_SEC_INI1], path)) goto out; - gfx_puts(&gfx_con, "INI1 kip1 package dumped to ini1.bin\n"); + gfx_puts(&gfx_con, "INI1 dumped to ini1.bin\n"); gfx_puts(&gfx_con, "\nDone. Press any key...\n"); @@ -430,7 +434,7 @@ void _fix_sd_attr(u32 type) break; } - gfx_printf(&gfx_con, "Traversing all %s files!\nThis may take some time, please wait...\n\n", label); + gfx_printf(&gfx_con, "Traversing all %s files!\nThis may take some time...\n\n", label); _fix_attributes(path, &total, type, type); gfx_printf(&gfx_con, "%kTotal archive bits cleared: %d!%k\n\nDone! Press any key...", 0xFF96FF00, total, 0xFFCCCCCC); sd_unmount(); @@ -553,10 +557,10 @@ void fix_battery_desync() }*/ /* -#include "../modules/hekate_libsys_minerva/mtc.h" +#include "../../modules/hekate_libsys_minerva/mtc.h" #include "../ianos/ianos.h" #include "../soc/fuse.h" -mtc_config_t mtc_cfg; +#include "../soc/clock.h" void minerva() { diff --git a/bootloader/main.c b/bootloader/main.c index 6829ea8..ca19f75 100644 --- a/bootloader/main.c +++ b/bootloader/main.c @@ -338,12 +338,8 @@ int launch_payload(char *path, bool update) } f_close(&fp); - if (!update) - { - free(path); - path = NULL; - } - + free(path); + if (update) { @@ -810,7 +806,6 @@ void auto_launch_firmware() { if (!strcmp("logopath", kv->key)) bootlogoCustomEntry = kv->val; - gfx_printf(&gfx_con, "\n%s=%s\n\n", kv->key, kv->val); } break; } @@ -844,7 +839,6 @@ void auto_launch_firmware() { if (!strcmp("logopath", kv->key)) bootlogoCustomEntry = kv->val; - gfx_printf(&gfx_con, "\n%s=%s\n\n", kv->key, kv->val); } break; } diff --git a/bootloader/sec/tsec.c b/bootloader/sec/tsec.c index b2e6922..31421c1 100644 --- a/bootloader/sec/tsec.c +++ b/bootloader/sec/tsec.c @@ -1,6 +1,6 @@ /* * Copyright (c) 2018 naehrwert - * Copyright (c) 2018 CTCaer + * Copyright (c) 2018-2019 CTCaer * Copyright (c) 2018 balika011 * * This program is free software; you can redistribute it and/or modify it @@ -97,15 +97,15 @@ int tsec_query(u8 *tsec_keys, u8 kb, tsec_ctxt_t *tsec_ctxt) } //Load firmware or emulate memio environment for newer TSEC fw. - if (kb <= KB_FIRMWARE_VERSION_600) + if (kb == KB_FIRMWARE_VERSION_620) + TSEC(TSEC_DMATRFBASE) = (u32)tsec_ctxt->fw >> 8; + else { - fwbuf = (u8 *)malloc(0x2000); - u8 *fwbuf_aligned = (u8 *)ALIGN((u32)fwbuf + 0x1000, 0x100); + fwbuf = (u8 *)malloc(0x4000); + u8 *fwbuf_aligned = (u8 *)ALIGN((u32)fwbuf, 0x100); memcpy(fwbuf_aligned, tsec_ctxt->fw, tsec_ctxt->size); TSEC(TSEC_DMATRFBASE) = (u32)fwbuf_aligned >> 8; } - else - TSEC(TSEC_DMATRFBASE) = (u32)tsec_ctxt->fw >> 8; for (u32 addr = 0; addr < tsec_ctxt->size; addr += 0x100) { @@ -116,7 +116,7 @@ int tsec_query(u8 *tsec_keys, u8 kb, tsec_ctxt_t *tsec_ctxt) } } - if (kb >= KB_FIRMWARE_VERSION_620) + if (kb == KB_FIRMWARE_VERSION_620) { // Init SMMU translation for TSEC. pdir = smmu_init_for_tsec(); @@ -174,45 +174,11 @@ int tsec_query(u8 *tsec_keys, u8 kb, tsec_ctxt_t *tsec_ctxt) //Execute firmware. HOST1X(0x3300) = 0x34C2E1DA; TSEC(TSEC_STATUS) = 0; - TSEC(TSEC_BOOTKEYVER) = tsec_ctxt->key_ver; + TSEC(TSEC_BOOTKEYVER) = 1; // HOS uses key version 1. TSEC(TSEC_BOOTVEC) = 0; TSEC(TSEC_CPUCTL) = TSEC_CPUCTL_STARTCPU; - if (kb <= KB_FIRMWARE_VERSION_600) - { - if (!_tsec_dma_wait_idle()) - { - res = -3; - goto out_free; - } - u32 timeout = get_tmr_ms() + 2000; - while (!TSEC(TSEC_STATUS)) - if (get_tmr_ms() > timeout) - { - res = -4; - goto out_free; - } - if (TSEC(TSEC_STATUS) != 0xB0B0B0B0) - { - res = -5; - goto out_free; - } - - //Fetch result. - HOST1X(0x3300) = 0; - u32 buf[4]; - buf[0] = SOR1(SOR_NV_PDISP_SOR_DP_HDCP_BKSV_LSB); - buf[1] = SOR1(SOR_NV_PDISP_SOR_TMDS_HDCP_BKSV_LSB); - buf[2] = SOR1(SOR_NV_PDISP_SOR_TMDS_HDCP_CN_MSB); - buf[3] = SOR1(SOR_NV_PDISP_SOR_TMDS_HDCP_CN_LSB); - SOR1(SOR_NV_PDISP_SOR_DP_HDCP_BKSV_LSB) = 0; - SOR1(SOR_NV_PDISP_SOR_TMDS_HDCP_BKSV_LSB) = 0; - SOR1(SOR_NV_PDISP_SOR_TMDS_HDCP_CN_MSB) = 0; - SOR1(SOR_NV_PDISP_SOR_TMDS_HDCP_CN_LSB) = 0; - - memcpy(tsec_keys, &buf, 0x10); - } - else + if (kb == KB_FIRMWARE_VERSION_620) { u32 start = get_tmr_us(); u32 k = se[SE_KEYTABLE_DATA0_REG_OFFSET / 4]; @@ -261,6 +227,40 @@ int tsec_query(u8 *tsec_keys, u8 kb, tsec_ctxt_t *tsec_ctxt) // gfx_printf(&gfx_con, " dir: %s\n", (errst >> 16) & 1 ? "W" : "R"); // gfx_printf(&gfx_con, " cid: %02x\n", errst & 0xFF); } + else + { + if (!_tsec_dma_wait_idle()) + { + res = -3; + goto out_free; + } + u32 timeout = get_tmr_ms() + 2000; + while (!TSEC(TSEC_STATUS)) + if (get_tmr_ms() > timeout) + { + res = -4; + goto out_free; + } + if (TSEC(TSEC_STATUS) != 0xB0B0B0B0) + { + res = -5; + goto out_free; + } + + //Fetch result. + HOST1X(0x3300) = 0; + u32 buf[4]; + buf[0] = SOR1(SOR_NV_PDISP_SOR_DP_HDCP_BKSV_LSB); + buf[1] = SOR1(SOR_NV_PDISP_SOR_TMDS_HDCP_BKSV_LSB); + buf[2] = SOR1(SOR_NV_PDISP_SOR_TMDS_HDCP_CN_MSB); + buf[3] = SOR1(SOR_NV_PDISP_SOR_TMDS_HDCP_CN_LSB); + SOR1(SOR_NV_PDISP_SOR_DP_HDCP_BKSV_LSB) = 0; + SOR1(SOR_NV_PDISP_SOR_TMDS_HDCP_BKSV_LSB) = 0; + SOR1(SOR_NV_PDISP_SOR_TMDS_HDCP_CN_MSB) = 0; + SOR1(SOR_NV_PDISP_SOR_TMDS_HDCP_CN_LSB) = 0; + + memcpy(tsec_keys, &buf, 0x10); + } out_free:; free(fwbuf); diff --git a/bootloader/sec/tsec.h b/bootloader/sec/tsec.h index 5a04741..45d994c 100644 --- a/bootloader/sec/tsec.h +++ b/bootloader/sec/tsec.h @@ -22,7 +22,6 @@ typedef struct _tsec_ctxt_t { - u32 key_ver; void *fw; u32 size; void *pkg1; diff --git a/bootloader/soc/hw_init.c b/bootloader/soc/hw_init.c index 7701db8..ca0cc50 100644 --- a/bootloader/soc/hw_init.c +++ b/bootloader/soc/hw_init.c @@ -1,6 +1,6 @@ /* * Copyright (c) 2018 naehrwert - * Copyright (c) 2018 CTCaer + * Copyright (c) 2018-2019 CTCaer * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, @@ -97,6 +97,9 @@ void _config_pmc_scratch() void _mbist_workaround() { + CLOCK(CLK_RST_CONTROLLER_CLK_OUT_ENB_V) |= (1 << 10); // Enable AHUB clock. + CLOCK(CLK_RST_CONTROLLER_CLK_OUT_ENB_Y) |= (1 << 6); // Enable APE clock. + CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_SOR1) = (CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_SOR1) | 0x8000) & 0xFFFFBFFF; CLOCK(CLK_RST_CONTROLLER_PLLD_BASE) |= 0x40800000u; CLOCK(CLK_RST_CONTROLLER_RST_DEV_Y_CLR) = 0x40; @@ -207,21 +210,30 @@ void config_hw() i2c_init(I2C_5); i2c_send_byte(I2C_5, MAX77620_I2C_ADDR, MAX77620_REG_CNFGBBC, MAX77620_CNFGBBC_RESISTOR_1K); - i2c_send_byte(I2C_5, MAX77620_I2C_ADDR, MAX77620_REG_ONOFFCNFG1, (1 << 6) | (3 << MAX77620_ONOFFCNFG1_MRT_SHIFT)); // PWR delay for forced shutdown off. + i2c_send_byte(I2C_5, MAX77620_I2C_ADDR, MAX77620_REG_ONOFFCNFG1, + (1 << 6) | (0 << MAX77620_ONOFFCNFG1_MRT_SHIFT)); // PWR delay for forced shutdown off. - i2c_send_byte(I2C_5, MAX77620_I2C_ADDR, MAX77620_REG_FPS_CFG0, (7 << MAX77620_FPS_TIME_PERIOD_SHIFT)); - i2c_send_byte(I2C_5, MAX77620_I2C_ADDR, MAX77620_REG_FPS_CFG1, (7 << MAX77620_FPS_TIME_PERIOD_SHIFT) | (1 << MAX77620_FPS_EN_SRC_SHIFT)); - i2c_send_byte(I2C_5, MAX77620_I2C_ADDR, MAX77620_REG_FPS_CFG2, (7 << MAX77620_FPS_TIME_PERIOD_SHIFT)); + i2c_send_byte(I2C_5, MAX77620_I2C_ADDR, MAX77620_REG_FPS_CFG0, + (7 << MAX77620_FPS_TIME_PERIOD_SHIFT)); + i2c_send_byte(I2C_5, MAX77620_I2C_ADDR, MAX77620_REG_FPS_CFG1, + (7 << MAX77620_FPS_TIME_PERIOD_SHIFT) | (1 << MAX77620_FPS_EN_SRC_SHIFT)); + i2c_send_byte(I2C_5, MAX77620_I2C_ADDR, MAX77620_REG_FPS_CFG2, + (7 << MAX77620_FPS_TIME_PERIOD_SHIFT)); max77620_regulator_config_fps(REGULATOR_LDO4); max77620_regulator_config_fps(REGULATOR_LDO8); max77620_regulator_config_fps(REGULATOR_SD0); max77620_regulator_config_fps(REGULATOR_SD1); max77620_regulator_config_fps(REGULATOR_SD3); - i2c_send_byte(I2C_5, MAX77620_I2C_ADDR, MAX77620_REG_FPS_GPIO3, (4 << MAX77620_FPS_TIME_PERIOD_SHIFT) | (2 << MAX77620_FPS_PD_PERIOD_SHIFT)); // 3.x+ + i2c_send_byte(I2C_5, MAX77620_I2C_ADDR, MAX77620_REG_FPS_GPIO3, + (4 << MAX77620_FPS_TIME_PERIOD_SHIFT) | (2 << MAX77620_FPS_PD_PERIOD_SHIFT)); // 3.x+ max77620_regulator_set_voltage(REGULATOR_SD0, 1125000); + // Fix GPU after warmboot for Linux. + i2c_send_byte(I2C_5, MAX77620_I2C_ADDR, MAX77620_REG_GPIO5, 2); + i2c_send_byte(I2C_5, MAX77620_I2C_ADDR, MAX77620_REG_GPIO6, 2); + _config_pmc_scratch(); // Missing from 4.x+ CLOCK(CLK_RST_CONTROLLER_SCLK_BURST_POLICY) = (CLOCK(CLK_RST_CONTROLLER_SCLK_BURST_POLICY) & 0xFFFF8888) | 0x3333; @@ -247,10 +259,6 @@ void reconfig_hw_workaround(bool extra_reconfig, u32 magic) gpio_config(GPIO_PORT_D, GPIO_PIN_1, GPIO_MODE_SPIO); gpio_config(GPIO_PORT_E, GPIO_PIN_6, GPIO_MODE_SPIO); gpio_config(GPIO_PORT_H, GPIO_PIN_6, GPIO_MODE_SPIO); - - // Fix GPU after warmboot for Linux. - i2c_send_byte(I2C_5, MAX77620_I2C_ADDR, MAX77620_REG_GPIO5, 2); - i2c_send_byte(I2C_5, MAX77620_I2C_ADDR, MAX77620_REG_GPIO6, 2); } // Power off display. diff --git a/bootloader/soc/pmc.h b/bootloader/soc/pmc.h index 7f3c826..123a4c7 100644 --- a/bootloader/soc/pmc.h +++ b/bootloader/soc/pmc.h @@ -32,12 +32,16 @@ #define PMC_PWR_DET_SDMMC1_IO_EN (1 << 12) #define APBDEV_PMC_DDR_PWR 0xE8 #define APBDEV_PMC_CRYPTO_OP 0xF4 +#define APBDEV_PMC_SCRATCH33 0x120 +#define APBDEV_PMC_SCRATCH40 0x13C #define APBDEV_PMC_OSC_EDPD_OVER 0x1A4 #define APBDEV_PMC_RST_STATUS 0x1B4 #define APBDEV_PMC_IO_DPD_REQ 0x1B8 #define APBDEV_PMC_IO_DPD2_REQ 0x1C0 #define APBDEV_PMC_VDDP_SEL 0x1CC #define APBDEV_PMC_DDR_CFG 0x1D0 +#define APBDEV_PMC_SCRATCH45 0x234 +#define APBDEV_PMC_SCRATCH46 0x238 #define APBDEV_PMC_SCRATCH49 0x244 #define APBDEV_PMC_TSC_MULT 0x2B4 #define APBDEV_PMC_SEC_DISABLE2 0x2C4 diff --git a/bootloader/soc/t210.h b/bootloader/soc/t210.h index cd1ce41..761e21e 100644 --- a/bootloader/soc/t210.h +++ b/bootloader/soc/t210.h @@ -179,4 +179,8 @@ #define I2S_CG_SLCG_ENABLE (1 << 0) #define I2S_CTRL_MASTER_EN (1 << 10) +/*! Special registers. */ +#define EMC_SCRATCH0 0x324 +#define EMC_SEPT_RUN (1 << 31) + #endif