xref: /arm-trusted-firmware/plat/mediatek/drivers/cpu_pm/cpcv3_2/mt_cpu_pm.h (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
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