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 {
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; }