/* * Copyright 2023 NXP * * SPDX-License-Identifier: BSD-3-Clause */ #include #include #include /*Do the necessary GPC, SRC, BLK_CTRL_S init */ void pwr_sys_init(void) { unsigned int cpu; /* * Assigned A55 cluster to 3, m33 to 2, A55 CORE0 & CORE1 to 0/1. * domain0/1 only used for trigger LPM of themselves. A55 cluster & M33's * domain assignment should be align with the TRDC DID. */ gpc_assign_domains(0x3102); /* CA55 core0/1 config */ for (cpu = CPU_A55C0; cpu <= CPU_A55_PLAT; cpu++) { /* clear the cpu sleep hold */ gpc_clear_cpu_sleep_hold(cpu); /* use gic wakeup source by default */ gpc_select_wakeup_gic(cpu); /* * Ignore A55 core0/1's LPM trigger for system sleep. * normally, for A55 side, only the A55 cluster(plat) * domain will be used to trigger the system wide low * power mode transition. */ if (cpu != CPU_A55_PLAT) { gpc_force_cpu_suspend(cpu); } } /* boot core(A55C0) */ src_mem_lpm_en(SRC_A55P0_MEM, MEM_OFF); /* For A55 core, only need to be on in RUN mode */ src_mix_set_lpm(SRC_A55C0, 0x0, CM_MODE_WAIT); /* whitelist: 0x1 for domain 0 only */ src_authen_config(SRC_A55C0, 0x1, 0x1); /* A55 cluster */ gpc_select_wakeup_gic(CPU_A55_PLAT); gpc_clear_cpu_sleep_hold(CPU_A55_PLAT); /* SCU MEM must be OFF when A55 PLAT OFF */ src_mem_lpm_en(SRC_A55_SCU_MEM, MEM_OFF); /* L3 memory in retention by default */ src_mem_lpm_en(SRC_A55_L3_MEM, MEM_RETN); src_mix_set_lpm(SRC_A55P, 0x3, 0x1); /* whitelist: 0x8 for domain 3 only */ src_authen_config(SRC_A55P, 0x8, 0x1); /* enable the HW LP handshake between S401 & A55 cluster */ mmio_setbits_32(BLK_CTRL_S_BASE + HW_LP_HANDHSK, BIT(5)); }