Update to Hekate bdk 5.5.0, prelim Mariko support
This commit is contained in:
		| @@ -23,6 +23,7 @@ | ||||
| #include "gfx/tui.h" | ||||
| #include <libs/fatfs/ff.h> | ||||
| #include <soc/fuse.h> | ||||
| #include <soc/hw_init.h> | ||||
| #include <soc/t210.h> | ||||
| #include <storage/nx_sd.h> | ||||
| #include <storage/sdmmc.h> | ||||
| @@ -42,12 +43,14 @@ void set_default_configuration() | ||||
| 	h_cfg.autohosoff = 0; | ||||
| 	h_cfg.autonogc = 1; | ||||
| 	h_cfg.updater2p = 0; | ||||
| 	h_cfg.brand = NULL; | ||||
| 	h_cfg.tagline = NULL; | ||||
| 	h_cfg.bootprotect = 0; | ||||
| 	h_cfg.errors = 0; | ||||
| 	h_cfg.eks = NULL; | ||||
| 	h_cfg.sept_run = EMC(EMC_SCRATCH0) & EMC_SEPT_RUN; | ||||
| 	h_cfg.aes_slots_new = false; | ||||
| 	h_cfg.rcm_patched = fuse_check_patched_rcm(); | ||||
| 	h_cfg.emummc_force_disable = false; | ||||
| 	h_cfg.t210b01 = hw_get_chip_id() == GP_HIDREV_MAJOR_T210B01; | ||||
|  | ||||
| 	sd_power_cycle_time_start = 0; | ||||
| } | ||||
|   | ||||
| @@ -17,6 +17,7 @@ | ||||
| #ifndef _CONFIG_H_ | ||||
| #define _CONFIG_H_ | ||||
|  | ||||
| #include "hos/hos.h" | ||||
| #include <utils/types.h> | ||||
|  | ||||
| typedef struct _hekate_config | ||||
| @@ -29,14 +30,16 @@ typedef struct _hekate_config | ||||
| 	u32 autohosoff; | ||||
| 	u32 autonogc; | ||||
| 	u32 updater2p; | ||||
| 	char *brand; | ||||
| 	char *tagline; | ||||
| 	u32 bootprotect; | ||||
| 	// Global temporary config. | ||||
| 	bool t210b01; | ||||
| 	bool se_keygen_done; | ||||
| 	bool sept_run; | ||||
| 	bool aes_slots_new; | ||||
| 	bool emummc_force_disable; | ||||
| 	bool rcm_patched; | ||||
| 	u32  errors; | ||||
| 	hos_eks_mbr_t *eks; | ||||
| } hekate_config; | ||||
|  | ||||
| void set_default_configuration(); | ||||
|   | ||||
| @@ -19,6 +19,7 @@ | ||||
| #include <string.h> | ||||
|  | ||||
| #include "fss.h" | ||||
| #include "hos.h" | ||||
| #include "../config.h" | ||||
| #include <libs/fatfs/ff.h> | ||||
| #include <mem/heap.h> | ||||
| @@ -35,6 +36,7 @@ extern bool is_ipl_updated(void *buf, char *path, bool force); | ||||
| // FSS0 Magic and Meta header offset. | ||||
| #define FSS0_MAGIC 0x30535346 | ||||
| #define FSS0_META_OFFSET 0x4 | ||||
| #define FSS0_VERSION_0_17_0 0x110000 | ||||
|  | ||||
| // FSS0 Content Types. | ||||
| #define CNT_TYPE_FSP 0 | ||||
| @@ -48,9 +50,10 @@ extern bool is_ipl_updated(void *buf, char *path, bool force); | ||||
| #define CNT_TYPE_EMC 8 | ||||
| #define CNT_TYPE_KLD 9  // Kernel Loader. | ||||
| #define CNT_TYPE_KRN 10 // Kernel. | ||||
| #define CNT_TYPE_EXF 11 // Exosphere Mariko fatal payload. | ||||
|  | ||||
| // FSS0 Content Flags. | ||||
| #define CNT_FLAG0_EXPERIMENTAL (1 << 0) | ||||
| #define CNT_FLAG0_EXPERIMENTAL BIT(0) | ||||
|  | ||||
| // FSS0 Meta Header. | ||||
| typedef struct _fss_meta_t | ||||
| @@ -85,8 +88,12 @@ int parse_fss(launch_ctxt_t *ctxt, const char *path, fss0_sept_t *sept_ctxt) | ||||
| 	bool stock = false; | ||||
| 	int sept_used = 0; | ||||
|  | ||||
| 	// Skip if stock and Exosphere and warmboot are not needed. | ||||
| 	if (!sept_ctxt) | ||||
| 	{ | ||||
| 		bool pkg1_old = ctxt->pkg1_id->kb <= KB_FIRMWARE_VERSION_620; | ||||
| 		bool emummc_disabled = !emu_cfg.enabled || h_cfg.emummc_force_disable; | ||||
|  | ||||
| 		LIST_FOREACH_ENTRY(ini_kv_t, kv, &ctxt->cfg->kvs, link) | ||||
| 		{ | ||||
| 			if (!strcmp("stock", kv->key)) | ||||
| @@ -94,7 +101,11 @@ int parse_fss(launch_ctxt_t *ctxt, const char *path, fss0_sept_t *sept_ctxt) | ||||
| 					stock = true; | ||||
| 		} | ||||
|  | ||||
| 		if (stock && ctxt->pkg1_id->kb <= KB_FIRMWARE_VERSION_620 && (!emu_cfg.enabled || h_cfg.emummc_force_disable)) | ||||
| #ifdef HOS_MARIKO_STOCK_SECMON | ||||
| 		if (stock && emummc_disabled && (pkg1_old || h_cfg.t210b01)) | ||||
| #else | ||||
| 		if (stock && emummc_disabled && pkg1_old) | ||||
| #endif | ||||
| 			return 1; | ||||
| 	} | ||||
|  | ||||
| @@ -113,12 +124,25 @@ int parse_fss(launch_ctxt_t *ctxt, const char *path, fss0_sept_t *sept_ctxt) | ||||
| 	// Check if valid FSS0 and parse it. | ||||
| 	if (fss_meta->magic == FSS0_MAGIC) | ||||
| 	{ | ||||
| 		bool mariko_not_supported = false; | ||||
| 		if (h_cfg.t210b01 && (fss_meta->version < FSS0_VERSION_0_17_0)) | ||||
| 		{ | ||||
| 			gfx_con.mute = false; | ||||
| 			mariko_not_supported = true; | ||||
| 		} | ||||
|  | ||||
| 		gfx_printf("Found FSS0, Atmosphere %d.%d.%d-%08x\n" | ||||
| 			"Max HOS supported: %d.%d.%d\n" | ||||
| 			"Unpacking and loading components..  ", | ||||
| 			fss_meta->version >> 24, (fss_meta->version >> 16) & 0xFF, (fss_meta->version >> 8) & 0xFF, fss_meta->git_rev, | ||||
| 			fss_meta->hos_ver >> 24, (fss_meta->hos_ver >> 16) & 0xFF, (fss_meta->hos_ver >> 8) & 0xFF); | ||||
|  | ||||
| 		if (mariko_not_supported) | ||||
| 		{ | ||||
| 			EPRINTF("Mariko not supported on < 0.17.0!"); | ||||
| 			goto fail; | ||||
| 		} | ||||
|  | ||||
| 		if (!sept_ctxt) | ||||
| 		{ | ||||
| 			ctxt->atmosphere = true; | ||||
| @@ -137,7 +161,7 @@ int parse_fss(launch_ctxt_t *ctxt, const char *path, fss0_sept_t *sept_ctxt) | ||||
| 				continue; | ||||
|  | ||||
| 			// If content is experimental and experimental flag is not enabled, skip it. | ||||
| 			if ((curr_fss_cnt[i].flags0 & CNT_FLAG0_EXPERIMENTAL) && !ctxt->fss0_enable_experimental) | ||||
| 			if ((curr_fss_cnt[i].flags0 & CNT_FLAG0_EXPERIMENTAL) && !ctxt->fss0_experimental) | ||||
| 				continue; | ||||
|  | ||||
| 			// Parse content. | ||||
| @@ -154,14 +178,31 @@ int parse_fss(launch_ctxt_t *ctxt, const char *path, fss0_sept_t *sept_ctxt) | ||||
| 					list_append(&ctxt->kip1_list, &mkip1->link); | ||||
| 					DPRINTF("Loaded %s.kip1 from FSS0 (size %08X)\n", curr_fss_cnt[i].name, curr_fss_cnt[i].size); | ||||
| 					break; | ||||
|  | ||||
| 				case CNT_TYPE_KRN: | ||||
| 					if (stock) | ||||
| 						continue; | ||||
| 					ctxt->kernel_size = curr_fss_cnt[i].size; | ||||
| 					ctxt->kernel = content; | ||||
| 					break; | ||||
|  | ||||
| 				case CNT_TYPE_EXO: | ||||
| 					ctxt->secmon_size = curr_fss_cnt[i].size; | ||||
| 					ctxt->secmon = content; | ||||
| 					break; | ||||
|  | ||||
| 				case CNT_TYPE_EXF: | ||||
| 					ctxt->exofatal_size = curr_fss_cnt[i].size; | ||||
| 					ctxt->exofatal = content; | ||||
| 					break; | ||||
|  | ||||
| 				case CNT_TYPE_WBT: | ||||
| 					if (h_cfg.t210b01) | ||||
| 						continue; | ||||
| 					ctxt->warmboot_size = curr_fss_cnt[i].size; | ||||
| 					ctxt->warmboot = content; | ||||
| 					break; | ||||
|  | ||||
| 				default: | ||||
| 					continue; | ||||
| 				} | ||||
| @@ -201,6 +242,7 @@ out: | ||||
| 		return (!sept_ctxt ? 1 : sept_used); | ||||
| 	} | ||||
|  | ||||
| fail: | ||||
| 	f_close(&fp); | ||||
| 	free(fss); | ||||
|  | ||||
|   | ||||
| @@ -42,6 +42,9 @@ | ||||
| #define HOS_PKG11_MAGIC 0x31314B50 | ||||
| #define HOS_EKS_MAGIC   0x30534B45 | ||||
|  | ||||
| // Use official Mariko secmon when in stock. | ||||
| //#define HOS_MARIKO_STOCK_SECMON | ||||
|  | ||||
| typedef struct _exo_ctxt_t | ||||
| { | ||||
| 	bool fs_is_510; | ||||
| @@ -66,17 +69,17 @@ typedef struct _hos_eks_bis_keys_t | ||||
| typedef struct _hos_eks_mbr_t | ||||
| { | ||||
| 	u32 magic; | ||||
| 	u8  enabled[6]; | ||||
| 	u8  enabled[5]; | ||||
| 	u8  enabled_bis; | ||||
| 	u8  rsvd; | ||||
| 	u32 sbk_low; | ||||
| 	u8  rsvd[2]; | ||||
| 	u32 lot0; | ||||
| 	u8  dkg[0x10]; | ||||
| 	u8  dkk[0x10]; | ||||
| 	hos_eks_keys_t keys[6]; | ||||
| 	hos_eks_keys_t keys[5]; | ||||
| 	hos_eks_bis_keys_t bis_keys[3]; | ||||
| } hos_eks_mbr_t; | ||||
|  | ||||
| static_assert(sizeof(hos_eks_mbr_t) == 336, "HOS EKS size is wrong!"); | ||||
| static_assert(sizeof(hos_eks_mbr_t) == 304, "HOS EKS size is wrong!"); | ||||
|  | ||||
| typedef struct _launch_ctxt_t | ||||
| { | ||||
| @@ -90,6 +93,8 @@ typedef struct _launch_ctxt_t | ||||
| 	u32   warmboot_size; | ||||
| 	void *secmon; | ||||
| 	u32   secmon_size; | ||||
| 	void *exofatal; | ||||
| 	u32   exofatal_size; | ||||
|  | ||||
| 	void *pkg2; | ||||
| 	u32   pkg2_size; | ||||
| @@ -97,6 +102,7 @@ typedef struct _launch_ctxt_t | ||||
|  | ||||
| 	void  *kernel; | ||||
| 	u32    kernel_size; | ||||
|  | ||||
| 	link_t kip1_list; | ||||
| 	char*  kip1_patches; | ||||
|  | ||||
| @@ -105,7 +111,7 @@ typedef struct _launch_ctxt_t | ||||
| 	bool debugmode; | ||||
| 	bool stock; | ||||
| 	bool atmosphere; | ||||
| 	bool fss0_enable_experimental; | ||||
| 	bool fss0_experimental; | ||||
| 	bool emummc_forced; | ||||
|  | ||||
| 	exo_ctxt_t exo_ctx; | ||||
|   | ||||
| @@ -45,7 +45,7 @@ static const pkg1_id_t _pkg1_ids[] = { | ||||
| const pkg1_id_t *pkg1_identify(u8 *pkg1) | ||||
| { | ||||
| 	for (u32 i = 0; _pkg1_ids[i].id; i++) | ||||
| 		if (!memcmp(pkg1 + 0x10, _pkg1_ids[i].id, 12)) | ||||
| 		if (!memcmp(pkg1 + 0x10, _pkg1_ids[i].id, 8)) | ||||
| 			return &_pkg1_ids[i]; | ||||
| 	return NULL; | ||||
| } | ||||
|   | ||||
| @@ -173,7 +173,7 @@ int reboot_to_sept(const u8 *tsec_fw, const u32 tsec_size, const u32 kb) | ||||
| 	PMC(APBDEV_PMC_SCRATCH33) = SEPT_PRI_ADDR; | ||||
| 	PMC(APBDEV_PMC_SCRATCH40) = 0x6000F208; | ||||
|  | ||||
| 	reconfig_hw_workaround(false, 0); | ||||
| 	hw_reinit_workaround(false, 0); | ||||
|  | ||||
| 	(*sept)(); | ||||
|  | ||||
|   | ||||
| @@ -31,7 +31,7 @@ | ||||
| #include <power/max77620.h> | ||||
| #include <rtc/max77620-rtc.h> | ||||
| #include <soc/bpmp.h> | ||||
| #include "soc/hw_init.h" | ||||
| #include <soc/hw_init.h> | ||||
| #include "storage/emummc.h" | ||||
| #include "storage/nx_emmc.h" | ||||
| #include <storage/nx_sd.h> | ||||
| @@ -126,12 +126,12 @@ int launch_payload(char *path) | ||||
| 		{ | ||||
| 			reloc_patcher(PATCHED_RELOC_ENTRY, EXT_PAYLOAD_ADDR, ALIGN(size, 0x10)); | ||||
|  | ||||
| 			reconfig_hw_workaround(false, byte_swap_32(*(u32 *)(buf + size - sizeof(u32)))); | ||||
| 			hw_reinit_workaround(false, byte_swap_32(*(u32 *)(buf + size - sizeof(u32)))); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			reloc_patcher(PATCHED_RELOC_ENTRY, EXT_PAYLOAD_ADDR, 0x7000); | ||||
| 			reconfig_hw_workaround(true, 0); | ||||
| 			hw_reinit_workaround(true, 0); | ||||
| 		} | ||||
|  | ||||
| 		// Some cards (Sandisk U1), do not like a fast power cycle. Wait min 100ms. | ||||
| @@ -326,7 +326,7 @@ extern void pivot_stack(u32 stack_top); | ||||
| void ipl_main() | ||||
| { | ||||
| 	// Do initial HW configuration. This is compatible with consecutive reruns without a reset. | ||||
| 	config_hw(); | ||||
| 	hw_init(); | ||||
|  | ||||
| 	// Pivot the stack so we have enough space. | ||||
| 	pivot_stack(IPL_STACK_TOP); | ||||
| @@ -342,9 +342,12 @@ void ipl_main() | ||||
| 	// Set bootloader's default configuration. | ||||
| 	set_default_configuration(); | ||||
|  | ||||
| 	sd_mount(); | ||||
| 	// Mount SD Card. | ||||
| 	h_cfg.errors |= !sd_mount() ? ERR_SD_BOOT_EN : 0; | ||||
|  | ||||
| 	minerva_init(); | ||||
| 	// Train DRAM and switch to max frequency. | ||||
| 	if (minerva_init()) //!TODO: Add Tegra210B01 support to minerva. | ||||
| 		h_cfg.errors |= ERR_LIBSYS_MTC; | ||||
| 	minerva_change_freq(FREQ_1600); | ||||
|  | ||||
| 	display_init(); | ||||
| @@ -356,6 +359,15 @@ void ipl_main() | ||||
|  | ||||
| 	display_backlight_pwm_init(); | ||||
|  | ||||
| 	if (h_cfg.t210b01) | ||||
| 	{ | ||||
| 		gfx_printf("Mariko SOC detected!\nMariko is currently unsupported\nbut stay tuned..."); | ||||
| 		gfx_printf("\n\n Press any button to power off."); | ||||
| 		display_backlight_brightness(h_cfg.backlight, 1000); | ||||
| 		btn_wait(); | ||||
| 		power_off(); | ||||
| 	} | ||||
|  | ||||
| 	// Overclock BPMP. | ||||
| 	bpmp_clk_rate_set(BPMP_CLK_DEFAULT_BOOST); | ||||
|  | ||||
|   | ||||
| @@ -136,7 +136,7 @@ int emummc_storage_init_mmc(sdmmc_storage_t *storage, sdmmc_t *sdmmc) | ||||
| 	FILINFO fno; | ||||
| 	emu_cfg.active_part = 0; | ||||
|  | ||||
| 	// Always init eMMC even when in emuMMC. eMMC is needed from theh emuMMC driver anyway. | ||||
| 	// Always init eMMC even when in emuMMC. eMMC is needed from the emuMMC driver anyway. | ||||
| 	if (!sdmmc_storage_init_mmc(storage, sdmmc, SDMMC_BUS_WIDTH_8, SDHCI_TIMING_MMC_HS400)) | ||||
| 		return 2; | ||||
|  | ||||
| @@ -276,7 +276,7 @@ int emummc_storage_set_mmc_partition(sdmmc_storage_t *storage, u32 partition) | ||||
| 	emu_cfg.active_part = partition; | ||||
|  | ||||
| 	if (!emu_cfg.enabled || h_cfg.emummc_force_disable) | ||||
| 		return sdmmc_storage_set_mmc_partition(storage, partition); | ||||
| 		sdmmc_storage_set_mmc_partition(storage, partition); | ||||
| 	else if (emu_cfg.sector) | ||||
| 		return 1; | ||||
| 	else | ||||
|   | ||||
		Reference in New Issue
	
	Block a user