1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2022, MediaTek Inc. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu #ifndef MT_CPU_PM_H 8*91f16700Schasinglulu #define MT_CPU_PM_H 9*91f16700Schasinglulu 10*91f16700Schasinglulu #include <assert.h> 11*91f16700Schasinglulu #include <mcucfg.h> 12*91f16700Schasinglulu #include <platform_def.h> 13*91f16700Schasinglulu 14*91f16700Schasinglulu /* 15*91f16700Schasinglulu * After ARM v8.2, the cache will turn off automatically when powering down CPU. Therefore, there 16*91f16700Schasinglulu * is no doubt to use the spin_lock here. 17*91f16700Schasinglulu */ 18*91f16700Schasinglulu #if !HW_ASSISTED_COHERENCY 19*91f16700Schasinglulu #define MT_CPU_PM_USING_BAKERY_LOCK 20*91f16700Schasinglulu #endif 21*91f16700Schasinglulu 22*91f16700Schasinglulu #define CPU_PM_FN (MTK_CPUPM_FN_CPUPM_GET_PWR_STATE | \ 23*91f16700Schasinglulu MTK_CPUPM_FN_PWR_STATE_VALID | \ 24*91f16700Schasinglulu MTK_CPUPM_FN_PWR_ON_CORE_PREPARE | \ 25*91f16700Schasinglulu MTK_CPUPM_FN_RESUME_CORE | \ 26*91f16700Schasinglulu MTK_CPUPM_FN_SUSPEND_MCUSYS | \ 27*91f16700Schasinglulu MTK_CPUPM_FN_RESUME_MCUSYS | \ 28*91f16700Schasinglulu MTK_CPUPM_FN_SMP_INIT | \ 29*91f16700Schasinglulu MTK_CPUPM_FN_SMP_CORE_ON | \ 30*91f16700Schasinglulu MTK_CPUPM_FN_SMP_CORE_OFF) 31*91f16700Schasinglulu 32*91f16700Schasinglulu #define CPU_PM_ASSERT(_cond) ({ \ 33*91f16700Schasinglulu if (!(_cond)) { \ 34*91f16700Schasinglulu INFO("[%s:%d] - %s\n", __func__, __LINE__, #_cond); \ 35*91f16700Schasinglulu panic(); \ 36*91f16700Schasinglulu } }) 37*91f16700Schasinglulu 38*91f16700Schasinglulu #define CPC_PWR_MASK_MCUSYS_MP0 (0xC001) 39*91f16700Schasinglulu 40*91f16700Schasinglulu #define PER_CPU_PWR_DATA(ctrl, cluster, core) \ 41*91f16700Schasinglulu do { \ 42*91f16700Schasinglulu ctrl.rvbaraddr_l = CORE_RVBRADDR_##cluster##_##core##_L; \ 43*91f16700Schasinglulu ctrl.arch_addr = MCUCFG_MP0_CLUSTER_CFG5; \ 44*91f16700Schasinglulu ctrl.pwpr = SPM_MP##cluster##_CPU##core##_PWR_CON; \ 45*91f16700Schasinglulu } while (0) 46*91f16700Schasinglulu 47*91f16700Schasinglulu #define PER_CPU_PWR_CTRL(ctrl, cpu) ({ \ 48*91f16700Schasinglulu switch (cpu) { \ 49*91f16700Schasinglulu case 0: \ 50*91f16700Schasinglulu PER_CPU_PWR_DATA(ctrl, 0, 0); \ 51*91f16700Schasinglulu break; \ 52*91f16700Schasinglulu case 1: \ 53*91f16700Schasinglulu PER_CPU_PWR_DATA(ctrl, 0, 1); \ 54*91f16700Schasinglulu break; \ 55*91f16700Schasinglulu case 2: \ 56*91f16700Schasinglulu PER_CPU_PWR_DATA(ctrl, 0, 2); \ 57*91f16700Schasinglulu break; \ 58*91f16700Schasinglulu case 3: \ 59*91f16700Schasinglulu PER_CPU_PWR_DATA(ctrl, 0, 3); \ 60*91f16700Schasinglulu break; \ 61*91f16700Schasinglulu case 4: \ 62*91f16700Schasinglulu PER_CPU_PWR_DATA(ctrl, 0, 4); \ 63*91f16700Schasinglulu break; \ 64*91f16700Schasinglulu case 5: \ 65*91f16700Schasinglulu PER_CPU_PWR_DATA(ctrl, 0, 5); \ 66*91f16700Schasinglulu break; \ 67*91f16700Schasinglulu case 6: \ 68*91f16700Schasinglulu PER_CPU_PWR_DATA(ctrl, 0, 6); \ 69*91f16700Schasinglulu break; \ 70*91f16700Schasinglulu case 7: \ 71*91f16700Schasinglulu PER_CPU_PWR_DATA(ctrl, 0, 7); \ 72*91f16700Schasinglulu break; \ 73*91f16700Schasinglulu default: \ 74*91f16700Schasinglulu assert(0); \ 75*91f16700Schasinglulu break; \ 76*91f16700Schasinglulu } }) 77*91f16700Schasinglulu 78*91f16700Schasinglulu 79*91f16700Schasinglulu /* MCUSYS DREQ BIG VPROC ISO control */ 80*91f16700Schasinglulu #define DREQ20_BIG_VPROC_ISO (MCUCFG_BASE + 0xad8c) 81*91f16700Schasinglulu 82*91f16700Schasinglulu /* Definition about bootup address for each core CORE_RVBRADDR_clusterid_cpuid */ 83*91f16700Schasinglulu #define CORE_RVBRADDR_0_0_L (MCUCFG_BASE + 0xc900) 84*91f16700Schasinglulu #define CORE_RVBRADDR_0_1_L (MCUCFG_BASE + 0xc908) 85*91f16700Schasinglulu #define CORE_RVBRADDR_0_2_L (MCUCFG_BASE + 0xc910) 86*91f16700Schasinglulu #define CORE_RVBRADDR_0_3_L (MCUCFG_BASE + 0xc918) 87*91f16700Schasinglulu #define CORE_RVBRADDR_0_4_L (MCUCFG_BASE + 0xc920) 88*91f16700Schasinglulu #define CORE_RVBRADDR_0_5_L (MCUCFG_BASE + 0xc928) 89*91f16700Schasinglulu #define CORE_RVBRADDR_0_6_L (MCUCFG_BASE + 0xc930) 90*91f16700Schasinglulu #define CORE_RVBRADDR_0_7_L (MCUCFG_BASE + 0xc938) 91*91f16700Schasinglulu #define MCUCFG_MP0_CLUSTER_CFG5 (MCUCFG_BASE + 0xc8e4) 92*91f16700Schasinglulu 93*91f16700Schasinglulu struct cpu_pwr_ctrl { 94*91f16700Schasinglulu unsigned int rvbaraddr_l; 95*91f16700Schasinglulu unsigned int arch_addr; 96*91f16700Schasinglulu unsigned int pwpr; 97*91f16700Schasinglulu }; 98*91f16700Schasinglulu 99*91f16700Schasinglulu #define MCUSYS_STATUS_PDN BIT(0) 100*91f16700Schasinglulu #define MCUSYS_STATUS_CPUSYS_PROTECT BIT(8) 101*91f16700Schasinglulu #define MCUSYS_STATUS_MCUSYS_PROTECT BIT(9) 102*91f16700Schasinglulu 103*91f16700Schasinglulu /* cpu_pm function ID */ 104*91f16700Schasinglulu enum mt_cpu_pm_user_id { 105*91f16700Schasinglulu MCUSYS_STATUS, 106*91f16700Schasinglulu CPC_COMMAND, 107*91f16700Schasinglulu }; 108*91f16700Schasinglulu 109*91f16700Schasinglulu /* cpu_pm lp function ID */ 110*91f16700Schasinglulu enum mt_cpu_pm_lp_smc_id { 111*91f16700Schasinglulu LP_CPC_COMMAND, 112*91f16700Schasinglulu IRQS_REMAIN_ALLOC, 113*91f16700Schasinglulu IRQS_REMAIN_CTRL, 114*91f16700Schasinglulu IRQS_REMAIN_IRQ, 115*91f16700Schasinglulu IRQS_REMAIN_WAKEUP_CAT, 116*91f16700Schasinglulu IRQS_REMAIN_WAKEUP_SRC, 117*91f16700Schasinglulu }; 118*91f16700Schasinglulu 119*91f16700Schasinglulu #endif /* MT_CPU_PM_H */ 120