mirror of
https://github.com/CTCaer/hekate
synced 2024-12-22 19:31:12 +00:00
Bug fixes and refactoring
- Info tools - Tools - Tsec - Many more
This commit is contained in:
parent
4f5fcf9fbd
commit
04907e2823
8 changed files with 161 additions and 165 deletions
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (c) 2018 CTCaer
|
* Copyright (c) 2018-2019 CTCaer
|
||||||
* Copyright (c) 2018 balika011
|
* Copyright (c) 2018 balika011
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* 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_printf(&gfx_con, "%k(Unlocked) fuse cache:\n\n%k", 0xFF00DDFF, 0xFFCCCCCC);
|
||||||
gfx_hexdump(&gfx_con, 0x7000F900, (u8 *)0x7000F900, 0x2FC);
|
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();
|
u32 btn = btn_wait();
|
||||||
if (btn & BTN_POWER)
|
if (btn & BTN_POWER)
|
||||||
|
@ -352,7 +352,6 @@ void print_tsec_key()
|
||||||
gfx_con_setpos(&gfx_con, 0, 0);
|
gfx_con_setpos(&gfx_con, 0, 0);
|
||||||
|
|
||||||
u32 retries = 0;
|
u32 retries = 0;
|
||||||
u32 key_ver_max = 3;
|
|
||||||
|
|
||||||
tsec_ctxt_t tsec_ctxt;
|
tsec_ctxt_t tsec_ctxt;
|
||||||
sdmmc_storage_t storage;
|
sdmmc_storage_t storage;
|
||||||
|
@ -368,85 +367,70 @@ void print_tsec_key()
|
||||||
const pkg1_id_t *pkg1_id = pkg1_identify(pkg1);
|
const pkg1_id_t *pkg1_id = pkg1_identify(pkg1);
|
||||||
if (!pkg1_id)
|
if (!pkg1_id)
|
||||||
{
|
{
|
||||||
EPRINTFARGS("Unknown package1 version for reading\nTSEC firmware (= '%s').",
|
EPRINTF("Unknown pkg1 version for reading\nTSEC firmware.");
|
||||||
(char *)pkg1 + 0x10);
|
|
||||||
goto out_wait;
|
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.fw = (u8 *)pkg1 + pkg1_id->tsec_off;
|
||||||
tsec_ctxt.pkg1 = pkg1;
|
tsec_ctxt.pkg1 = pkg1;
|
||||||
tsec_ctxt.pkg11_off = pkg1_id->pkg11_off;
|
tsec_ctxt.pkg11_off = pkg1_id->pkg11_off;
|
||||||
tsec_ctxt.secmon_base = pkg1_id->secmon_base;
|
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;
|
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);
|
u8 *tsec_paged = (u8 *)page_alloc(3);
|
||||||
memcpy(tsec_paged, (void *)tsec_ctxt.fw, tsec_ctxt.size);
|
memcpy(tsec_paged, (void *)tsec_ctxt.fw, tsec_ctxt.size);
|
||||||
tsec_ctxt.fw = tsec_paged;
|
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;
|
memset(keys, 0x00, 0x20);
|
||||||
int res = 0;
|
|
||||||
|
|
||||||
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)
|
res = -1;
|
||||||
memset(keys + ((i - 1) * 0x10), 0x00, 0x10);
|
break;
|
||||||
else
|
|
||||||
memset(keys, 0x00, 0x30);
|
|
||||||
|
|
||||||
retries++;
|
|
||||||
|
|
||||||
if (retries > 3)
|
|
||||||
{
|
|
||||||
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();
|
u32 btn = btn_wait();
|
||||||
if (btn & BTN_POWER)
|
if (btn & BTN_POWER)
|
||||||
|
@ -455,7 +439,7 @@ void print_tsec_key()
|
||||||
{
|
{
|
||||||
char path[64];
|
char path[64];
|
||||||
emmcsn_path_impl(path, "/dumps", "tsec_keys.bin", NULL);
|
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");
|
gfx_puts(&gfx_con, "\nDone!\n");
|
||||||
sd_unmount();
|
sd_unmount();
|
||||||
}
|
}
|
||||||
|
@ -709,4 +693,3 @@ void bootrom_ipatches_info()
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma GCC pop_options
|
#pragma GCC pop_options
|
||||||
|
|
||||||
|
|
|
@ -36,6 +36,7 @@
|
||||||
#include "../utils/util.h"
|
#include "../utils/util.h"
|
||||||
|
|
||||||
extern hekate_config h_cfg;
|
extern hekate_config h_cfg;
|
||||||
|
|
||||||
extern gfx_ctxt_t gfx_ctxt;
|
extern gfx_ctxt_t gfx_ctxt;
|
||||||
extern gfx_con_t gfx_con;
|
extern gfx_con_t gfx_con;
|
||||||
extern sdmmc_storage_t sd_storage;
|
extern sdmmc_storage_t sd_storage;
|
||||||
|
@ -82,15 +83,14 @@ void dump_packages12()
|
||||||
if (!pkg1_id)
|
if (!pkg1_id)
|
||||||
{
|
{
|
||||||
gfx_con.fntsz = 8;
|
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;
|
goto out_free;
|
||||||
}
|
}
|
||||||
|
|
||||||
kb = pkg1_id->kb;
|
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.fw = (void *)pkg1 + pkg1_id->tsec_off;
|
||||||
tsec_ctxt.pkg1 = (void *)pkg1;
|
tsec_ctxt.pkg1 = (void *)pkg1;
|
||||||
tsec_ctxt.pkg11_off = pkg1_id->pkg11_off;
|
tsec_ctxt.pkg11_off = pkg1_id->pkg11_off;
|
||||||
|
@ -110,41 +110,45 @@ void dump_packages12()
|
||||||
if (kb <= KB_FIRMWARE_VERSION_600)
|
if (kb <= KB_FIRMWARE_VERSION_600)
|
||||||
pkg1_decrypt(pkg1_id, pkg1);
|
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];
|
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.
|
if (kb <= KB_FIRMWARE_VERSION_620)
|
||||||
emmcsn_path_impl(path, "/pkg1", "nxloader.bin", &storage);
|
{
|
||||||
if (sd_save_to_file(loader, hdr->ldr_size, path))
|
pkg1_unpack(warmboot, secmon, loader, pkg1_id, pkg1);
|
||||||
goto out_free;
|
|
||||||
gfx_puts(&gfx_con, "NX Bootloader dumped to nxloader.bin\n");
|
|
||||||
|
|
||||||
// Dump secmon.
|
// Display info.
|
||||||
emmcsn_path_impl(path, "/pkg1", "secmon.bin", &storage);
|
gfx_printf(&gfx_con, "%kNX Bootloader size: %k0x%05X\n\n", 0xFFC7EA46, 0xFFCCCCCC, hdr->ldr_size);
|
||||||
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.
|
gfx_printf(&gfx_con, "%kSecure monitor addr: %k0x%05X\n", 0xFFC7EA46, 0xFFCCCCCC, pkg1_id->secmon_base);
|
||||||
emmcsn_path_impl(path, "/pkg1", "warmboot.bin", &storage);
|
gfx_printf(&gfx_con, "%kSecure monitor size: %k0x%05X\n\n", 0xFFC7EA46, 0xFFCCCCCC, hdr->sm_size);
|
||||||
if (sd_save_to_file(warmboot, hdr->wb_size, path))
|
|
||||||
goto out_free;
|
gfx_printf(&gfx_con, "%kWarmboot addr: %k0x%05X\n", 0xFFC7EA46, 0xFFCCCCCC, pkg1_id->warmboot_base);
|
||||||
gfx_puts(&gfx_con, "Warmboot dumped to warmboot.bin\n\n\n");
|
gfx_printf(&gfx_con, "%kWarmboot size: %k0x%05X\n\n", 0xFFC7EA46, 0xFFCCCCCC, hdr->wb_size);
|
||||||
|
|
||||||
|
// 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.
|
// Dump package2.1.
|
||||||
sdmmc_storage_set_mmc_partition(&storage, 0);
|
sdmmc_storage_set_mmc_partition(&storage, 0);
|
||||||
|
@ -180,7 +184,7 @@ void dump_packages12()
|
||||||
emmcsn_path_impl(path, "/pkg2", "pkg2_decr.bin", &storage);
|
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))
|
if (sd_save_to_file(pkg2, pkg2_hdr->sec_size[PKG2_SEC_KERNEL] + pkg2_hdr->sec_size[PKG2_SEC_INI1], path))
|
||||||
goto out;
|
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.
|
// Dump kernel.
|
||||||
emmcsn_path_impl(path, "/pkg2", "kernel.bin", &storage);
|
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],
|
if (sd_save_to_file(pkg2_hdr->data + pkg2_hdr->sec_size[PKG2_SEC_KERNEL],
|
||||||
pkg2_hdr->sec_size[PKG2_SEC_INI1], path))
|
pkg2_hdr->sec_size[PKG2_SEC_INI1], path))
|
||||||
goto out;
|
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");
|
gfx_puts(&gfx_con, "\nDone. Press any key...\n");
|
||||||
|
|
||||||
|
@ -430,7 +434,7 @@ void _fix_sd_attr(u32 type)
|
||||||
break;
|
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);
|
_fix_attributes(path, &total, type, type);
|
||||||
gfx_printf(&gfx_con, "%kTotal archive bits cleared: %d!%k\n\nDone! Press any key...", 0xFF96FF00, total, 0xFFCCCCCC);
|
gfx_printf(&gfx_con, "%kTotal archive bits cleared: %d!%k\n\nDone! Press any key...", 0xFF96FF00, total, 0xFFCCCCCC);
|
||||||
sd_unmount();
|
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 "../ianos/ianos.h"
|
||||||
#include "../soc/fuse.h"
|
#include "../soc/fuse.h"
|
||||||
mtc_config_t mtc_cfg;
|
#include "../soc/clock.h"
|
||||||
|
|
||||||
void minerva()
|
void minerva()
|
||||||
{
|
{
|
||||||
|
|
|
@ -338,11 +338,7 @@ int launch_payload(char *path, bool update)
|
||||||
}
|
}
|
||||||
|
|
||||||
f_close(&fp);
|
f_close(&fp);
|
||||||
if (!update)
|
free(path);
|
||||||
{
|
|
||||||
free(path);
|
|
||||||
path = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (update)
|
if (update)
|
||||||
|
@ -810,7 +806,6 @@ void auto_launch_firmware()
|
||||||
{
|
{
|
||||||
if (!strcmp("logopath", kv->key))
|
if (!strcmp("logopath", kv->key))
|
||||||
bootlogoCustomEntry = kv->val;
|
bootlogoCustomEntry = kv->val;
|
||||||
gfx_printf(&gfx_con, "\n%s=%s\n\n", kv->key, kv->val);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -844,7 +839,6 @@ void auto_launch_firmware()
|
||||||
{
|
{
|
||||||
if (!strcmp("logopath", kv->key))
|
if (!strcmp("logopath", kv->key))
|
||||||
bootlogoCustomEntry = kv->val;
|
bootlogoCustomEntry = kv->val;
|
||||||
gfx_printf(&gfx_con, "\n%s=%s\n\n", kv->key, kv->val);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* Copyright (c) 2018 naehrwert
|
||||||
* Copyright (c) 2018 CTCaer
|
* Copyright (c) 2018-2019 CTCaer
|
||||||
* Copyright (c) 2018 balika011
|
* Copyright (c) 2018 balika011
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* 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.
|
//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);
|
fwbuf = (u8 *)malloc(0x4000);
|
||||||
u8 *fwbuf_aligned = (u8 *)ALIGN((u32)fwbuf + 0x1000, 0x100);
|
u8 *fwbuf_aligned = (u8 *)ALIGN((u32)fwbuf, 0x100);
|
||||||
memcpy(fwbuf_aligned, tsec_ctxt->fw, tsec_ctxt->size);
|
memcpy(fwbuf_aligned, tsec_ctxt->fw, tsec_ctxt->size);
|
||||||
TSEC(TSEC_DMATRFBASE) = (u32)fwbuf_aligned >> 8;
|
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)
|
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.
|
// Init SMMU translation for TSEC.
|
||||||
pdir = smmu_init_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.
|
//Execute firmware.
|
||||||
HOST1X(0x3300) = 0x34C2E1DA;
|
HOST1X(0x3300) = 0x34C2E1DA;
|
||||||
TSEC(TSEC_STATUS) = 0;
|
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_BOOTVEC) = 0;
|
||||||
TSEC(TSEC_CPUCTL) = TSEC_CPUCTL_STARTCPU;
|
TSEC(TSEC_CPUCTL) = TSEC_CPUCTL_STARTCPU;
|
||||||
|
|
||||||
if (kb <= KB_FIRMWARE_VERSION_600)
|
if (kb == KB_FIRMWARE_VERSION_620)
|
||||||
{
|
|
||||||
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
|
|
||||||
{
|
{
|
||||||
u32 start = get_tmr_us();
|
u32 start = get_tmr_us();
|
||||||
u32 k = se[SE_KEYTABLE_DATA0_REG_OFFSET / 4];
|
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, " dir: %s\n", (errst >> 16) & 1 ? "W" : "R");
|
||||||
// gfx_printf(&gfx_con, " cid: %02x\n", errst & 0xFF);
|
// 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:;
|
out_free:;
|
||||||
free(fwbuf);
|
free(fwbuf);
|
||||||
|
|
|
@ -22,7 +22,6 @@
|
||||||
|
|
||||||
typedef struct _tsec_ctxt_t
|
typedef struct _tsec_ctxt_t
|
||||||
{
|
{
|
||||||
u32 key_ver;
|
|
||||||
void *fw;
|
void *fw;
|
||||||
u32 size;
|
u32 size;
|
||||||
void *pkg1;
|
void *pkg1;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018 naehrwert
|
* 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
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU General Public License,
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
@ -97,6 +97,9 @@ void _config_pmc_scratch()
|
||||||
|
|
||||||
void _mbist_workaround()
|
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_CLK_SOURCE_SOR1) = (CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_SOR1) | 0x8000) & 0xFFFFBFFF;
|
||||||
CLOCK(CLK_RST_CONTROLLER_PLLD_BASE) |= 0x40800000u;
|
CLOCK(CLK_RST_CONTROLLER_PLLD_BASE) |= 0x40800000u;
|
||||||
CLOCK(CLK_RST_CONTROLLER_RST_DEV_Y_CLR) = 0x40;
|
CLOCK(CLK_RST_CONTROLLER_RST_DEV_Y_CLR) = 0x40;
|
||||||
|
@ -207,21 +210,30 @@ void config_hw()
|
||||||
i2c_init(I2C_5);
|
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_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_CFG0,
|
||||||
i2c_send_byte(I2C_5, MAX77620_I2C_ADDR, MAX77620_REG_FPS_CFG1, (7 << MAX77620_FPS_TIME_PERIOD_SHIFT) | (1 << MAX77620_FPS_EN_SRC_SHIFT));
|
(7 << MAX77620_FPS_TIME_PERIOD_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_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_LDO4);
|
||||||
max77620_regulator_config_fps(REGULATOR_LDO8);
|
max77620_regulator_config_fps(REGULATOR_LDO8);
|
||||||
max77620_regulator_config_fps(REGULATOR_SD0);
|
max77620_regulator_config_fps(REGULATOR_SD0);
|
||||||
max77620_regulator_config_fps(REGULATOR_SD1);
|
max77620_regulator_config_fps(REGULATOR_SD1);
|
||||||
max77620_regulator_config_fps(REGULATOR_SD3);
|
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);
|
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+
|
_config_pmc_scratch(); // Missing from 4.x+
|
||||||
|
|
||||||
CLOCK(CLK_RST_CONTROLLER_SCLK_BURST_POLICY) = (CLOCK(CLK_RST_CONTROLLER_SCLK_BURST_POLICY) & 0xFFFF8888) | 0x3333;
|
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_D, GPIO_PIN_1, GPIO_MODE_SPIO);
|
||||||
gpio_config(GPIO_PORT_E, GPIO_PIN_6, 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);
|
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.
|
// Power off display.
|
||||||
|
|
|
@ -32,12 +32,16 @@
|
||||||
#define PMC_PWR_DET_SDMMC1_IO_EN (1 << 12)
|
#define PMC_PWR_DET_SDMMC1_IO_EN (1 << 12)
|
||||||
#define APBDEV_PMC_DDR_PWR 0xE8
|
#define APBDEV_PMC_DDR_PWR 0xE8
|
||||||
#define APBDEV_PMC_CRYPTO_OP 0xF4
|
#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_OSC_EDPD_OVER 0x1A4
|
||||||
#define APBDEV_PMC_RST_STATUS 0x1B4
|
#define APBDEV_PMC_RST_STATUS 0x1B4
|
||||||
#define APBDEV_PMC_IO_DPD_REQ 0x1B8
|
#define APBDEV_PMC_IO_DPD_REQ 0x1B8
|
||||||
#define APBDEV_PMC_IO_DPD2_REQ 0x1C0
|
#define APBDEV_PMC_IO_DPD2_REQ 0x1C0
|
||||||
#define APBDEV_PMC_VDDP_SEL 0x1CC
|
#define APBDEV_PMC_VDDP_SEL 0x1CC
|
||||||
#define APBDEV_PMC_DDR_CFG 0x1D0
|
#define APBDEV_PMC_DDR_CFG 0x1D0
|
||||||
|
#define APBDEV_PMC_SCRATCH45 0x234
|
||||||
|
#define APBDEV_PMC_SCRATCH46 0x238
|
||||||
#define APBDEV_PMC_SCRATCH49 0x244
|
#define APBDEV_PMC_SCRATCH49 0x244
|
||||||
#define APBDEV_PMC_TSC_MULT 0x2B4
|
#define APBDEV_PMC_TSC_MULT 0x2B4
|
||||||
#define APBDEV_PMC_SEC_DISABLE2 0x2C4
|
#define APBDEV_PMC_SEC_DISABLE2 0x2C4
|
||||||
|
|
|
@ -179,4 +179,8 @@
|
||||||
#define I2S_CG_SLCG_ENABLE (1 << 0)
|
#define I2S_CG_SLCG_ENABLE (1 << 0)
|
||||||
#define I2S_CTRL_MASTER_EN (1 << 10)
|
#define I2S_CTRL_MASTER_EN (1 << 10)
|
||||||
|
|
||||||
|
/*! Special registers. */
|
||||||
|
#define EMC_SCRATCH0 0x324
|
||||||
|
#define EMC_SEPT_RUN (1 << 31)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue