1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright 2023 NXP 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu #ifndef PWR_CTRL_H 8*91f16700Schasinglulu #define PWR_CTRL_H 9*91f16700Schasinglulu 10*91f16700Schasinglulu #include <stdbool.h> 11*91f16700Schasinglulu 12*91f16700Schasinglulu #include <lib/mmio.h> 13*91f16700Schasinglulu 14*91f16700Schasinglulu #include <platform_def.h> 15*91f16700Schasinglulu 16*91f16700Schasinglulu /******************************************************************************* 17*91f16700Schasinglulu * GPC definitions & declarations 18*91f16700Schasinglulu ******************************************************************************/ 19*91f16700Schasinglulu /* GPC GLOBAL */ 20*91f16700Schasinglulu #define GPC_GLOBAL_BASE U(GPC_BASE + 0x4000) 21*91f16700Schasinglulu #define GPC_AUTHEN_CTRL U(0x4) 22*91f16700Schasinglulu #define GPC_DOMAIN U(0x10) 23*91f16700Schasinglulu #define GPC_MASTER U(0x1c) 24*91f16700Schasinglulu #define GPC_SYS_SLEEP U(0x40) 25*91f16700Schasinglulu #define PMIC_CTRL U(0x100) 26*91f16700Schasinglulu #define PMIC_PRE_DLY_CTRL U(0x104) 27*91f16700Schasinglulu #define PMIC_STBY_ACK_CTRL U(0x108) 28*91f16700Schasinglulu #define GPC_ROSC_CTRL U(0x200) 29*91f16700Schasinglulu #define GPC_AON_MEM_CTRL U(0x204) 30*91f16700Schasinglulu #define GPC_EFUSE_CTRL U(0x208) 31*91f16700Schasinglulu 32*91f16700Schasinglulu #define FORCE_CPUx_DISABLE(x) (1 << (16 + (x))) 33*91f16700Schasinglulu #define PMIC_STBY_EN BIT(0) 34*91f16700Schasinglulu #define ROSC_OFF_EN BIT(0) 35*91f16700Schasinglulu 36*91f16700Schasinglulu /* GPC CPU_CTRL */ 37*91f16700Schasinglulu #define CM_SLICE(x) (GPC_BASE + 0x800 * (x)) 38*91f16700Schasinglulu #define CM_AUTHEN_CTRL U(0x4) 39*91f16700Schasinglulu #define CM_MISC U(0xc) 40*91f16700Schasinglulu #define CM_MODE_CTRL U(0x10) 41*91f16700Schasinglulu #define CM_IRQ_WAKEUP_MASK0 U(0x100) 42*91f16700Schasinglulu #define CM_SYS_SLEEP_CTRL U(0x380) 43*91f16700Schasinglulu #define IMR_NUM U(8) 44*91f16700Schasinglulu 45*91f16700Schasinglulu /* CM_MISC */ 46*91f16700Schasinglulu #define SLEEP_HOLD_EN BIT(1) 47*91f16700Schasinglulu #define IRQ_MUX BIT(5) 48*91f16700Schasinglulu #define SW_WAKEUP BIT(6) 49*91f16700Schasinglulu 50*91f16700Schasinglulu /* CM_SYS_SLEEP_CTRL */ 51*91f16700Schasinglulu #define SS_WAIT BIT(0) 52*91f16700Schasinglulu #define SS_STOP BIT(1) 53*91f16700Schasinglulu #define SS_SUSPEND BIT(2) 54*91f16700Schasinglulu 55*91f16700Schasinglulu #define CM_MODE_RUN U(0x0) 56*91f16700Schasinglulu #define CM_MODE_WAIT U(0x1) 57*91f16700Schasinglulu #define CM_MODE_STOP U(0x2) 58*91f16700Schasinglulu #define CM_MODE_SUSPEND U(0x3) 59*91f16700Schasinglulu 60*91f16700Schasinglulu #define LPM_SETTING(d, m) ((m) << (((d) % 8) * 4)) 61*91f16700Schasinglulu 62*91f16700Schasinglulu enum gpc_cmc_slice { 63*91f16700Schasinglulu CPU_M33, 64*91f16700Schasinglulu CPU_A55C0, 65*91f16700Schasinglulu CPU_A55C1, 66*91f16700Schasinglulu CPU_A55_PLAT, 67*91f16700Schasinglulu }; 68*91f16700Schasinglulu 69*91f16700Schasinglulu /* set gpc domain assignment */ 70*91f16700Schasinglulu static inline void gpc_assign_domains(unsigned int domains) 71*91f16700Schasinglulu { 72*91f16700Schasinglulu mmio_write_32(GPC_GLOBAL_BASE + GPC_DOMAIN, domains); 73*91f16700Schasinglulu } 74*91f16700Schasinglulu 75*91f16700Schasinglulu /* force a cpu into sleep status */ 76*91f16700Schasinglulu static inline void gpc_force_cpu_suspend(unsigned int cpu) 77*91f16700Schasinglulu { 78*91f16700Schasinglulu mmio_setbits_32(GPC_GLOBAL_BASE + GPC_SYS_SLEEP, FORCE_CPUx_DISABLE(cpu)); 79*91f16700Schasinglulu } 80*91f16700Schasinglulu 81*91f16700Schasinglulu static inline void gpc_pmic_stby_en(bool en) 82*91f16700Schasinglulu { 83*91f16700Schasinglulu mmio_write_32(GPC_GLOBAL_BASE + PMIC_CTRL, en ? 1 : 0); 84*91f16700Schasinglulu } 85*91f16700Schasinglulu 86*91f16700Schasinglulu static inline void gpc_rosc_off(bool off) 87*91f16700Schasinglulu { 88*91f16700Schasinglulu mmio_write_32(GPC_GLOBAL_BASE + GPC_ROSC_CTRL, off ? 1 : 0); 89*91f16700Schasinglulu } 90*91f16700Schasinglulu 91*91f16700Schasinglulu static inline void gpc_set_cpu_mode(unsigned int cpu, unsigned int mode) 92*91f16700Schasinglulu { 93*91f16700Schasinglulu mmio_write_32(CM_SLICE(cpu) + CM_MODE_CTRL, mode); 94*91f16700Schasinglulu } 95*91f16700Schasinglulu 96*91f16700Schasinglulu static inline void gpc_select_wakeup_gic(unsigned int cpu) 97*91f16700Schasinglulu { 98*91f16700Schasinglulu mmio_setbits_32(CM_SLICE(cpu) + CM_MISC, IRQ_MUX); 99*91f16700Schasinglulu } 100*91f16700Schasinglulu 101*91f16700Schasinglulu static inline void gpc_select_wakeup_raw_irq(unsigned int cpu) 102*91f16700Schasinglulu { 103*91f16700Schasinglulu mmio_clrbits_32(CM_SLICE(cpu) + CM_MISC, IRQ_MUX); 104*91f16700Schasinglulu } 105*91f16700Schasinglulu 106*91f16700Schasinglulu static inline void gpc_assert_sw_wakeup(unsigned int cpu) 107*91f16700Schasinglulu { 108*91f16700Schasinglulu mmio_setbits_32(CM_SLICE(cpu) + CM_MISC, SW_WAKEUP); 109*91f16700Schasinglulu } 110*91f16700Schasinglulu 111*91f16700Schasinglulu static inline void gpc_deassert_sw_wakeup(unsigned int cpu) 112*91f16700Schasinglulu { 113*91f16700Schasinglulu mmio_clrbits_32(CM_SLICE(cpu) + CM_MISC, SW_WAKEUP); 114*91f16700Schasinglulu } 115*91f16700Schasinglulu 116*91f16700Schasinglulu static inline void gpc_clear_cpu_sleep_hold(unsigned int cpu) 117*91f16700Schasinglulu { 118*91f16700Schasinglulu mmio_clrbits_32(CM_SLICE(cpu) + CM_MISC, SLEEP_HOLD_EN); 119*91f16700Schasinglulu } 120*91f16700Schasinglulu 121*91f16700Schasinglulu static inline void gpc_set_irq_mask(unsigned int cpu, unsigned int idx, uint32_t mask) 122*91f16700Schasinglulu { 123*91f16700Schasinglulu mmio_write_32(CM_SLICE(cpu) + idx * 0x4 + CM_IRQ_WAKEUP_MASK0, mask); 124*91f16700Schasinglulu } 125*91f16700Schasinglulu 126*91f16700Schasinglulu /******************************************************************************* 127*91f16700Schasinglulu * SRC definitions & declarations 128*91f16700Schasinglulu ******************************************************************************/ 129*91f16700Schasinglulu #define SRC_SLICE(x) (SRC_BASE + 0x400 * (x)) 130*91f16700Schasinglulu #define SRC_AUTHEN_CTRL U(0x4) 131*91f16700Schasinglulu #define SRC_LPM_SETTING0 U(0x10) 132*91f16700Schasinglulu #define SRC_LPM_SETTING1 U(0x14) 133*91f16700Schasinglulu #define SRC_LPM_SETTING2 U(0x18) 134*91f16700Schasinglulu #define SRC_SLICE_SW_CTRL U(0x20) 135*91f16700Schasinglulu 136*91f16700Schasinglulu #define SRC_MEM_CTRL U(0x4) 137*91f16700Schasinglulu #define MEM_LP_EN BIT(2) 138*91f16700Schasinglulu #define MEM_LP_RETN BIT(1) 139*91f16700Schasinglulu 140*91f16700Schasinglulu enum mix_mem_mode { 141*91f16700Schasinglulu MEM_OFF, 142*91f16700Schasinglulu MEM_RETN, 143*91f16700Schasinglulu }; 144*91f16700Schasinglulu 145*91f16700Schasinglulu enum src_mix_mem_slice { 146*91f16700Schasinglulu SRC_GLOBAL, 147*91f16700Schasinglulu 148*91f16700Schasinglulu /* MIX slice */ 149*91f16700Schasinglulu SRC_SENTINEL, 150*91f16700Schasinglulu SRC_AON, 151*91f16700Schasinglulu SRC_WKUP, 152*91f16700Schasinglulu SRC_DDR, 153*91f16700Schasinglulu SRC_DPHY, 154*91f16700Schasinglulu SRC_ML, 155*91f16700Schasinglulu SRC_NIC, 156*91f16700Schasinglulu SRC_HSIO, 157*91f16700Schasinglulu SRC_MEDIA, 158*91f16700Schasinglulu SRC_M33P, 159*91f16700Schasinglulu SRC_A55C0, 160*91f16700Schasinglulu SRC_A55C1, 161*91f16700Schasinglulu SRC_A55P, 162*91f16700Schasinglulu 163*91f16700Schasinglulu /* MEM slice */ 164*91f16700Schasinglulu SRC_AON_MEM, 165*91f16700Schasinglulu SRC_WKUP_MEM, 166*91f16700Schasinglulu SRC_DDR_MEM, 167*91f16700Schasinglulu SRC_DPHY_MEM, 168*91f16700Schasinglulu SRC_ML_MEM, 169*91f16700Schasinglulu SRC_NIC_MEM, 170*91f16700Schasinglulu SRC_NIC_OCRAM, 171*91f16700Schasinglulu SRC_HSIO_MEM, 172*91f16700Schasinglulu SRC_MEDIA_MEM, 173*91f16700Schasinglulu SRC_A55P0_MEM, 174*91f16700Schasinglulu SRC_A55P1_MEM, 175*91f16700Schasinglulu SRC_A55_SCU_MEM, 176*91f16700Schasinglulu SRC_A55_L3_MEM, 177*91f16700Schasinglulu }; 178*91f16700Schasinglulu 179*91f16700Schasinglulu static inline void src_authen_config(unsigned int mix, unsigned int wlist, 180*91f16700Schasinglulu unsigned int lpm_en) 181*91f16700Schasinglulu { 182*91f16700Schasinglulu mmio_write_32(SRC_SLICE(mix) + SRC_AUTHEN_CTRL, (wlist << 16) | (lpm_en << 2)); 183*91f16700Schasinglulu } 184*91f16700Schasinglulu 185*91f16700Schasinglulu static inline void src_mix_set_lpm(unsigned int mix, unsigned int did, unsigned int lpm_mode) 186*91f16700Schasinglulu { 187*91f16700Schasinglulu mmio_clrsetbits_32(SRC_SLICE(mix) + SRC_LPM_SETTING1 + (did / 8) * 0x4, 188*91f16700Schasinglulu LPM_SETTING(did, 0x7), LPM_SETTING(did, lpm_mode)); 189*91f16700Schasinglulu } 190*91f16700Schasinglulu 191*91f16700Schasinglulu static inline void src_mem_lpm_en(unsigned int mix, bool retn) 192*91f16700Schasinglulu { 193*91f16700Schasinglulu mmio_setbits_32(SRC_SLICE(mix) + SRC_MEM_CTRL, MEM_LP_EN | (retn ? MEM_LP_RETN : 0)); 194*91f16700Schasinglulu } 195*91f16700Schasinglulu 196*91f16700Schasinglulu static inline void src_mem_lpm_dis(unsigned int mix) 197*91f16700Schasinglulu { 198*91f16700Schasinglulu mmio_clrbits_32(SRC_SLICE(mix) + SRC_MEM_CTRL, MEM_LP_EN | MEM_LP_RETN); 199*91f16700Schasinglulu } 200*91f16700Schasinglulu 201*91f16700Schasinglulu /******************************************************************************* 202*91f16700Schasinglulu * BLK_CTRL_S definitions & declarations 203*91f16700Schasinglulu ******************************************************************************/ 204*91f16700Schasinglulu #define HW_LP_HANDHSK U(0x110) 205*91f16700Schasinglulu #define HW_LP_HANDHSK2 U(0x114) 206*91f16700Schasinglulu #define CA55_CPUWAIT U(0x118) 207*91f16700Schasinglulu #define CA55_RVBADDR0_L U(0x11c) 208*91f16700Schasinglulu #define CA55_RVBADDR0_H U(0x120) 209*91f16700Schasinglulu 210*91f16700Schasinglulu /******************************************************************************* 211*91f16700Schasinglulu * Other definitions & declarations 212*91f16700Schasinglulu ******************************************************************************/ 213*91f16700Schasinglulu void pwr_sys_init(void); 214*91f16700Schasinglulu 215*91f16700Schasinglulu #endif /* PWR_CTRL_H */ 216*91f16700Schasinglulu 217