Esempio n. 1
0
void cluster_enable_cpu0(u64 entry, u32 ns_disable)
{
	//Set ACTIVE_CLUSER to FAST.
	FLOW_CTLR(FLOW_CTLR_BPMP_CLUSTER_CONTROL) &= 0xFFFFFFFE;

	_cluster_enable_power();

	if (!(CLOCK(0xE0) & 0x40000000))
	{
		CLOCK(0x518) &= 0xFFFFFFF7;
		sleep(2);
		CLOCK(0xE0) = 0x80404E02;
		CLOCK(0xE0) = 0x404E02;
		CLOCK(0xE4) = CLOCK(0xE4) & 0xFFFBFFFF | 0x40000;
		CLOCK(0xE0) = 0x40404E02;
	}
	while (!(CLOCK(0xE0) & 0x8000000))
		;

	CLOCK(0x3B4) = CLOCK(0x3B4) & 0x1FFFFF00 | 6;
	CLOCK(0x360) = CLOCK(0x360) & 0xFFFFFFF7 | 8;
	CLOCK(0x20) = 0x20008888;
	CLOCK(0x24) = 0x80000000;
	CLOCK(0x440) = 1;

	clock_enable_coresight();

	CLOCK(0x388) = CLOCK(0x388) & 0xFFFFF000;

	//Enable CPU rail.
	_cluster_pmc_enable_partition(1, 0);
	//Enable cluster 0 non-CPU.
	_cluster_pmc_enable_partition(0x8000, 15);
	//Enable CE0.
	_cluster_pmc_enable_partition(0x4000, 14);

	//Request and wait for RAM repair.
	FLOW_CTLR(FLOW_CTLR_RAM_REPAIR) = 1;
	while (!(FLOW_CTLR(FLOW_CTLR_RAM_REPAIR) & 2))
		;

	EXCP_VEC(0x100) = 0;

	if(ns_disable)
	{
		//Set reset vectors.
		SB(SB_AA64_RESET_LOW) = (u32)entry | 1;
		SB(SB_AA64_RESET_HIGH) = (u32)(entry >> 32);
		//Non-secure reset vector write disable.
		SB(SB_CSR_0) = 2;
	}
	else
	{
Esempio n. 2
0
void launch() {
    u8 pre4x = pk11Offs->kb < KB_FIRMWARE_VERSION_400;

    se_aes_key_clear(0x8);
    se_aes_key_clear(0xB);

    if (pre4x) {
        if (pk11Offs->kb == KB_FIRMWARE_VERSION_300)
            PMC(APBDEV_PMC_SECURE_SCRATCH32) = 0xE3;
        else if (pk11Offs->kb == KB_FIRMWARE_VERSION_301)
            PMC(APBDEV_PMC_SECURE_SCRATCH32) = 0x104;
        se_key_acc_ctrl(12, 0xFF);
        se_key_acc_ctrl(13, 0xFF);
    } else {
        se_key_acc_ctrl(12, 0xFF);
        se_key_acc_ctrl(15, 0xFF);
    }

    // TODO: Don't Clear 'BootConfig' for retail >1.0.0.
    //memset((void *)0x4003D000, 0, 0x3000);

    SE_lock();

    // Start boot process now that pk21 is loaded.
    *BOOT_STATE_ADDR = (pre4x ? BOOT_PKG2_LOADED : BOOT_PKG2_LOADED_4X);

    // Boot secmon and Wait for it get ready.
    cluster_boot_cpu0(pk11Offs->secmon_base);
    while (!*SECMON_STATE_ADDR)
        usleep(1);

    // Disable display.
    if (pre4x)
        display_end();

    // Signal to finish boot process.
    *BOOT_STATE_ADDR = (pre4x ? BOOT_DONE : BOOT_DONE_4X);;

    // Halt ourselves in waitevent state.
    while (1) FLOW_CTLR(0x4) = 0x50000000;
}