xref: /arm-trusted-firmware/plat/mediatek/drivers/dcm/mt8188/mtk_dcm_utils.c (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 #include <lib/mmio.h>
8*91f16700Schasinglulu #include <lib/utils_def.h>
9*91f16700Schasinglulu #include <mtk_dcm_utils.h>
10*91f16700Schasinglulu 
11*91f16700Schasinglulu #define MP_CPUSYS_TOP_ADB_DCM_REG0_MASK		BIT(17)
12*91f16700Schasinglulu #define MP_CPUSYS_TOP_ADB_DCM_REG1_MASK		(BIT(15) | BIT(16) | BIT(17) | \
13*91f16700Schasinglulu 						 BIT(18) | BIT(21))
14*91f16700Schasinglulu #define MP_CPUSYS_TOP_ADB_DCM_REG2_MASK		(BIT(15) | BIT(16) | BIT(17) | BIT(18))
15*91f16700Schasinglulu #define MP_CPUSYS_TOP_ADB_DCM_REG0_ON		BIT(17)
16*91f16700Schasinglulu #define MP_CPUSYS_TOP_ADB_DCM_REG1_ON		(BIT(15) | BIT(16) | BIT(17) | \
17*91f16700Schasinglulu 						 BIT(18) | BIT(21))
18*91f16700Schasinglulu #define MP_CPUSYS_TOP_ADB_DCM_REG2_ON		(BIT(15) | BIT(16) | BIT(17) | BIT(18))
19*91f16700Schasinglulu #define MP_CPUSYS_TOP_ADB_DCM_REG0_OFF		(0x0 << 17)
20*91f16700Schasinglulu #define MP_CPUSYS_TOP_ADB_DCM_REG1_OFF		((0x0 << 15) | (0x0 << 16) | \
21*91f16700Schasinglulu 						 (0x0 << 17) | (0x0 << 18) | \
22*91f16700Schasinglulu 						 (0x0 << 21))
23*91f16700Schasinglulu #define MP_CPUSYS_TOP_ADB_DCM_REG2_OFF		((0x0 << 15) | (0x0 << 16) | \
24*91f16700Schasinglulu 						 (0x0 << 17) | (0x0 << 18))
25*91f16700Schasinglulu 
26*91f16700Schasinglulu bool dcm_mp_cpusys_top_adb_dcm_is_on(void)
27*91f16700Schasinglulu {
28*91f16700Schasinglulu 	bool ret = true;
29*91f16700Schasinglulu 
30*91f16700Schasinglulu 	ret &= dcm_check_state(MP_CPUSYS_TOP_MP_ADB_DCM_CFG0,
31*91f16700Schasinglulu 			       MP_CPUSYS_TOP_ADB_DCM_REG0_MASK,
32*91f16700Schasinglulu 			       MP_CPUSYS_TOP_ADB_DCM_REG0_ON);
33*91f16700Schasinglulu 	ret &= dcm_check_state(MP_CPUSYS_TOP_MP_ADB_DCM_CFG4,
34*91f16700Schasinglulu 			       MP_CPUSYS_TOP_ADB_DCM_REG1_MASK,
35*91f16700Schasinglulu 			       MP_CPUSYS_TOP_ADB_DCM_REG1_ON);
36*91f16700Schasinglulu 	ret &= dcm_check_state(MP_CPUSYS_TOP_MCUSYS_DCM_CFG0,
37*91f16700Schasinglulu 			       MP_CPUSYS_TOP_ADB_DCM_REG2_MASK,
38*91f16700Schasinglulu 			       MP_CPUSYS_TOP_ADB_DCM_REG2_ON);
39*91f16700Schasinglulu 
40*91f16700Schasinglulu 	return ret;
41*91f16700Schasinglulu }
42*91f16700Schasinglulu 
43*91f16700Schasinglulu void dcm_mp_cpusys_top_adb_dcm(bool on)
44*91f16700Schasinglulu {
45*91f16700Schasinglulu 	if (on) {
46*91f16700Schasinglulu 		/* TINFO = "Turn ON DCM 'mp_cpusys_top_adb_dcm'" */
47*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_MP_ADB_DCM_CFG0,
48*91f16700Schasinglulu 				   MP_CPUSYS_TOP_ADB_DCM_REG0_MASK,
49*91f16700Schasinglulu 				   MP_CPUSYS_TOP_ADB_DCM_REG0_ON);
50*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_MP_ADB_DCM_CFG4,
51*91f16700Schasinglulu 				   MP_CPUSYS_TOP_ADB_DCM_REG1_MASK,
52*91f16700Schasinglulu 				   MP_CPUSYS_TOP_ADB_DCM_REG1_ON);
53*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_MCUSYS_DCM_CFG0,
54*91f16700Schasinglulu 				   MP_CPUSYS_TOP_ADB_DCM_REG2_MASK,
55*91f16700Schasinglulu 				   MP_CPUSYS_TOP_ADB_DCM_REG2_ON);
56*91f16700Schasinglulu 	} else {
57*91f16700Schasinglulu 		/* TINFO = "Turn OFF DCM 'mp_cpusys_top_adb_dcm'" */
58*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_MP_ADB_DCM_CFG0,
59*91f16700Schasinglulu 				   MP_CPUSYS_TOP_ADB_DCM_REG0_MASK,
60*91f16700Schasinglulu 				   MP_CPUSYS_TOP_ADB_DCM_REG0_OFF);
61*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_MP_ADB_DCM_CFG4,
62*91f16700Schasinglulu 				   MP_CPUSYS_TOP_ADB_DCM_REG1_MASK,
63*91f16700Schasinglulu 				   MP_CPUSYS_TOP_ADB_DCM_REG1_OFF);
64*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_MCUSYS_DCM_CFG0,
65*91f16700Schasinglulu 				   MP_CPUSYS_TOP_ADB_DCM_REG2_MASK,
66*91f16700Schasinglulu 				   MP_CPUSYS_TOP_ADB_DCM_REG2_OFF);
67*91f16700Schasinglulu 	}
68*91f16700Schasinglulu }
69*91f16700Schasinglulu 
70*91f16700Schasinglulu #define MP_CPUSYS_TOP_APB_DCM_REG0_MASK	BIT(5)
71*91f16700Schasinglulu #define MP_CPUSYS_TOP_APB_DCM_REG1_MASK	BIT(8)
72*91f16700Schasinglulu #define MP_CPUSYS_TOP_APB_DCM_REG2_MASK	BIT(16)
73*91f16700Schasinglulu #define MP_CPUSYS_TOP_APB_DCM_REG0_ON	BIT(5)
74*91f16700Schasinglulu #define MP_CPUSYS_TOP_APB_DCM_REG1_ON	BIT(8)
75*91f16700Schasinglulu #define MP_CPUSYS_TOP_APB_DCM_REG2_ON	BIT(16)
76*91f16700Schasinglulu #define MP_CPUSYS_TOP_APB_DCM_REG0_OFF	(0x0 << 5)
77*91f16700Schasinglulu #define MP_CPUSYS_TOP_APB_DCM_REG1_OFF	(0x0 << 8)
78*91f16700Schasinglulu #define MP_CPUSYS_TOP_APB_DCM_REG2_OFF	(0x0 << 16)
79*91f16700Schasinglulu 
80*91f16700Schasinglulu bool dcm_mp_cpusys_top_apb_dcm_is_on(void)
81*91f16700Schasinglulu {
82*91f16700Schasinglulu 	bool ret = true;
83*91f16700Schasinglulu 
84*91f16700Schasinglulu 	ret &= dcm_check_state(MP_CPUSYS_TOP_MP_MISC_DCM_CFG0,
85*91f16700Schasinglulu 			       MP_CPUSYS_TOP_APB_DCM_REG0_MASK,
86*91f16700Schasinglulu 			       MP_CPUSYS_TOP_APB_DCM_REG0_ON);
87*91f16700Schasinglulu 	ret &= dcm_check_state(MP_CPUSYS_TOP_MCUSYS_DCM_CFG0,
88*91f16700Schasinglulu 			       MP_CPUSYS_TOP_APB_DCM_REG1_MASK,
89*91f16700Schasinglulu 			       MP_CPUSYS_TOP_APB_DCM_REG1_ON);
90*91f16700Schasinglulu 	ret &= dcm_check_state(MP_CPUSYS_TOP_MP0_DCM_CFG0,
91*91f16700Schasinglulu 			       MP_CPUSYS_TOP_APB_DCM_REG2_MASK,
92*91f16700Schasinglulu 			       MP_CPUSYS_TOP_APB_DCM_REG2_ON);
93*91f16700Schasinglulu 
94*91f16700Schasinglulu 	return ret;
95*91f16700Schasinglulu }
96*91f16700Schasinglulu 
97*91f16700Schasinglulu void dcm_mp_cpusys_top_apb_dcm(bool on)
98*91f16700Schasinglulu {
99*91f16700Schasinglulu 	if (on) {
100*91f16700Schasinglulu 		/* TINFO = "Turn ON DCM 'mp_cpusys_top_apb_dcm'" */
101*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_MP_MISC_DCM_CFG0,
102*91f16700Schasinglulu 				   MP_CPUSYS_TOP_APB_DCM_REG0_MASK,
103*91f16700Schasinglulu 				   MP_CPUSYS_TOP_APB_DCM_REG0_ON);
104*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_MCUSYS_DCM_CFG0,
105*91f16700Schasinglulu 				   MP_CPUSYS_TOP_APB_DCM_REG1_MASK,
106*91f16700Schasinglulu 				   MP_CPUSYS_TOP_APB_DCM_REG1_ON);
107*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_MP0_DCM_CFG0,
108*91f16700Schasinglulu 				   MP_CPUSYS_TOP_APB_DCM_REG2_MASK,
109*91f16700Schasinglulu 				   MP_CPUSYS_TOP_APB_DCM_REG2_ON);
110*91f16700Schasinglulu 	} else {
111*91f16700Schasinglulu 		/* TINFO = "Turn OFF DCM 'mp_cpusys_top_apb_dcm'" */
112*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_MP_MISC_DCM_CFG0,
113*91f16700Schasinglulu 				   MP_CPUSYS_TOP_APB_DCM_REG0_MASK,
114*91f16700Schasinglulu 				   MP_CPUSYS_TOP_APB_DCM_REG0_OFF);
115*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_MCUSYS_DCM_CFG0,
116*91f16700Schasinglulu 				   MP_CPUSYS_TOP_APB_DCM_REG1_MASK,
117*91f16700Schasinglulu 				   MP_CPUSYS_TOP_APB_DCM_REG1_OFF);
118*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_MP0_DCM_CFG0,
119*91f16700Schasinglulu 				   MP_CPUSYS_TOP_APB_DCM_REG2_MASK,
120*91f16700Schasinglulu 				   MP_CPUSYS_TOP_APB_DCM_REG2_OFF);
121*91f16700Schasinglulu 	}
122*91f16700Schasinglulu }
123*91f16700Schasinglulu 
124*91f16700Schasinglulu #define MP_CPUSYS_TOP_BUS_PLL_DIV_DCM_REG0_MASK (BIT(11) | BIT(24) | BIT(25))
125*91f16700Schasinglulu #define MP_CPUSYS_TOP_BUS_PLL_DIV_DCM_REG0_ON (BIT(11) | BIT(24) | BIT(25))
126*91f16700Schasinglulu #define MP_CPUSYS_TOP_BUS_PLL_DIV_DCM_REG0_OFF ((0x0 << 11) | \
127*91f16700Schasinglulu 						(0x0 << 24) | \
128*91f16700Schasinglulu 						(0x0 << 25))
129*91f16700Schasinglulu 
130*91f16700Schasinglulu bool dcm_mp_cpusys_top_bus_pll_div_dcm_is_on(void)
131*91f16700Schasinglulu {
132*91f16700Schasinglulu 	return dcm_check_state(MP_CPUSYS_TOP_BUS_PLLDIV_CFG,
133*91f16700Schasinglulu 			       MP_CPUSYS_TOP_BUS_PLL_DIV_DCM_REG0_MASK,
134*91f16700Schasinglulu 			       MP_CPUSYS_TOP_BUS_PLL_DIV_DCM_REG0_ON);
135*91f16700Schasinglulu }
136*91f16700Schasinglulu 
137*91f16700Schasinglulu void dcm_mp_cpusys_top_bus_pll_div_dcm(bool on)
138*91f16700Schasinglulu {
139*91f16700Schasinglulu 	if (on) {
140*91f16700Schasinglulu 		/* TINFO = "Turn ON DCM 'mp_cpusys_top_bus_pll_div_dcm'" */
141*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_BUS_PLLDIV_CFG,
142*91f16700Schasinglulu 				   MP_CPUSYS_TOP_BUS_PLL_DIV_DCM_REG0_MASK,
143*91f16700Schasinglulu 				   MP_CPUSYS_TOP_BUS_PLL_DIV_DCM_REG0_ON);
144*91f16700Schasinglulu 	} else {
145*91f16700Schasinglulu 		/* TINFO = "Turn OFF DCM 'mp_cpusys_top_bus_pll_div_dcm'" */
146*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_BUS_PLLDIV_CFG,
147*91f16700Schasinglulu 				   MP_CPUSYS_TOP_BUS_PLL_DIV_DCM_REG0_MASK,
148*91f16700Schasinglulu 				   MP_CPUSYS_TOP_BUS_PLL_DIV_DCM_REG0_OFF);
149*91f16700Schasinglulu 	}
150*91f16700Schasinglulu }
151*91f16700Schasinglulu 
152*91f16700Schasinglulu #define MP_CPUSYS_TOP_CORE_STALL_DCM_REG0_MASK	BIT(0)
153*91f16700Schasinglulu #define MP_CPUSYS_TOP_CORE_STALL_DCM_REG0_ON	BIT(0)
154*91f16700Schasinglulu #define MP_CPUSYS_TOP_CORE_STALL_DCM_REG0_OFF	(0x0 << 0)
155*91f16700Schasinglulu 
156*91f16700Schasinglulu bool dcm_mp_cpusys_top_core_stall_dcm_is_on(void)
157*91f16700Schasinglulu {
158*91f16700Schasinglulu 	return dcm_check_state(MP_CPUSYS_TOP_MP0_DCM_CFG7,
159*91f16700Schasinglulu 			       MP_CPUSYS_TOP_CORE_STALL_DCM_REG0_MASK,
160*91f16700Schasinglulu 			       MP_CPUSYS_TOP_CORE_STALL_DCM_REG0_ON);
161*91f16700Schasinglulu }
162*91f16700Schasinglulu 
163*91f16700Schasinglulu void dcm_mp_cpusys_top_core_stall_dcm(bool on)
164*91f16700Schasinglulu {
165*91f16700Schasinglulu 	if (on) {
166*91f16700Schasinglulu 		/* TINFO = "Turn ON DCM 'mp_cpusys_top_core_stall_dcm'" */
167*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_MP0_DCM_CFG7,
168*91f16700Schasinglulu 				   MP_CPUSYS_TOP_CORE_STALL_DCM_REG0_MASK,
169*91f16700Schasinglulu 				   MP_CPUSYS_TOP_CORE_STALL_DCM_REG0_ON);
170*91f16700Schasinglulu 	} else {
171*91f16700Schasinglulu 		/* TINFO = "Turn OFF DCM 'mp_cpusys_top_core_stall_dcm'" */
172*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_MP0_DCM_CFG7,
173*91f16700Schasinglulu 				   MP_CPUSYS_TOP_CORE_STALL_DCM_REG0_MASK,
174*91f16700Schasinglulu 				   MP_CPUSYS_TOP_CORE_STALL_DCM_REG0_OFF);
175*91f16700Schasinglulu 	}
176*91f16700Schasinglulu }
177*91f16700Schasinglulu 
178*91f16700Schasinglulu #define MP_CPUSYS_TOP_CPUBIU_DCM_REG0_MASK	(0xffff << 0)
179*91f16700Schasinglulu #define MP_CPUSYS_TOP_CPUBIU_DCM_REG0_ON	(0xffff << 0)
180*91f16700Schasinglulu #define MP_CPUSYS_TOP_CPUBIU_DCM_REG0_OFF	(0x0 << 0)
181*91f16700Schasinglulu 
182*91f16700Schasinglulu bool dcm_mp_cpusys_top_cpubiu_dcm_is_on(void)
183*91f16700Schasinglulu {
184*91f16700Schasinglulu 	return dcm_check_state(MP_CPUSYS_TOP_MCSIC_DCM0,
185*91f16700Schasinglulu 			       MP_CPUSYS_TOP_CPUBIU_DCM_REG0_MASK,
186*91f16700Schasinglulu 			       MP_CPUSYS_TOP_CPUBIU_DCM_REG0_ON);
187*91f16700Schasinglulu }
188*91f16700Schasinglulu 
189*91f16700Schasinglulu void dcm_mp_cpusys_top_cpubiu_dcm(bool on)
190*91f16700Schasinglulu {
191*91f16700Schasinglulu 	if (on) {
192*91f16700Schasinglulu 		/* TINFO = "Turn ON DCM 'mp_cpusys_top_cpubiu_dcm'" */
193*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_MCSIC_DCM0,
194*91f16700Schasinglulu 				   MP_CPUSYS_TOP_CPUBIU_DCM_REG0_MASK,
195*91f16700Schasinglulu 				   MP_CPUSYS_TOP_CPUBIU_DCM_REG0_ON);
196*91f16700Schasinglulu 	} else {
197*91f16700Schasinglulu 		/* TINFO = "Turn OFF DCM 'mp_cpusys_top_cpubiu_dcm'" */
198*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_MCSIC_DCM0,
199*91f16700Schasinglulu 				   MP_CPUSYS_TOP_CPUBIU_DCM_REG0_MASK,
200*91f16700Schasinglulu 				   MP_CPUSYS_TOP_CPUBIU_DCM_REG0_OFF);
201*91f16700Schasinglulu 	}
202*91f16700Schasinglulu }
203*91f16700Schasinglulu 
204*91f16700Schasinglulu #define MP_CPUSYS_TOP_CPU_PLL_DIV_0_DCM_REG0_MASK (BIT(24) | BIT(25))
205*91f16700Schasinglulu #define MP_CPUSYS_TOP_CPU_PLL_DIV_0_DCM_REG0_ON (BIT(24) | BIT(25))
206*91f16700Schasinglulu #define MP_CPUSYS_TOP_CPU_PLL_DIV_0_DCM_REG0_OFF ((0x0 << 24) | (0x0 << 25))
207*91f16700Schasinglulu 
208*91f16700Schasinglulu bool dcm_mp_cpusys_top_cpu_pll_div_0_dcm_is_on(void)
209*91f16700Schasinglulu {
210*91f16700Schasinglulu 	return dcm_check_state(MP_CPUSYS_TOP_CPU_PLLDIV_CFG0,
211*91f16700Schasinglulu 			       MP_CPUSYS_TOP_CPU_PLL_DIV_0_DCM_REG0_MASK,
212*91f16700Schasinglulu 			       MP_CPUSYS_TOP_CPU_PLL_DIV_0_DCM_REG0_ON);
213*91f16700Schasinglulu }
214*91f16700Schasinglulu 
215*91f16700Schasinglulu void dcm_mp_cpusys_top_cpu_pll_div_0_dcm(bool on)
216*91f16700Schasinglulu {
217*91f16700Schasinglulu 	if (on) {
218*91f16700Schasinglulu 		/* TINFO = "Turn ON DCM 'mp_cpusys_top_cpu_pll_div_0_dcm'" */
219*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_CPU_PLLDIV_CFG0,
220*91f16700Schasinglulu 				   MP_CPUSYS_TOP_CPU_PLL_DIV_0_DCM_REG0_MASK,
221*91f16700Schasinglulu 				   MP_CPUSYS_TOP_CPU_PLL_DIV_0_DCM_REG0_ON);
222*91f16700Schasinglulu 	} else {
223*91f16700Schasinglulu 		/* TINFO = "Turn OFF DCM 'mp_cpusys_top_cpu_pll_div_0_dcm'" */
224*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_CPU_PLLDIV_CFG0,
225*91f16700Schasinglulu 				   MP_CPUSYS_TOP_CPU_PLL_DIV_0_DCM_REG0_MASK,
226*91f16700Schasinglulu 				   MP_CPUSYS_TOP_CPU_PLL_DIV_0_DCM_REG0_OFF);
227*91f16700Schasinglulu 	}
228*91f16700Schasinglulu }
229*91f16700Schasinglulu 
230*91f16700Schasinglulu #define MP_CPUSYS_TOP_CPU_PLL_DIV_1_DCM_REG0_MASK (BIT(24) | BIT(25))
231*91f16700Schasinglulu #define MP_CPUSYS_TOP_CPU_PLL_DIV_1_DCM_REG0_ON (BIT(24) | BIT(25))
232*91f16700Schasinglulu #define MP_CPUSYS_TOP_CPU_PLL_DIV_1_DCM_REG0_OFF ((0x0 << 24) | (0x0 << 25))
233*91f16700Schasinglulu 
234*91f16700Schasinglulu bool dcm_mp_cpusys_top_cpu_pll_div_1_dcm_is_on(void)
235*91f16700Schasinglulu {
236*91f16700Schasinglulu 	return dcm_check_state(MP_CPUSYS_TOP_CPU_PLLDIV_CFG1,
237*91f16700Schasinglulu 			       MP_CPUSYS_TOP_CPU_PLL_DIV_1_DCM_REG0_MASK,
238*91f16700Schasinglulu 			       MP_CPUSYS_TOP_CPU_PLL_DIV_1_DCM_REG0_ON);
239*91f16700Schasinglulu }
240*91f16700Schasinglulu 
241*91f16700Schasinglulu void dcm_mp_cpusys_top_cpu_pll_div_1_dcm(bool on)
242*91f16700Schasinglulu {
243*91f16700Schasinglulu 	if (on) {
244*91f16700Schasinglulu 		/* TINFO = "Turn ON DCM 'mp_cpusys_top_cpu_pll_div_1_dcm'" */
245*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_CPU_PLLDIV_CFG1,
246*91f16700Schasinglulu 				   MP_CPUSYS_TOP_CPU_PLL_DIV_1_DCM_REG0_MASK,
247*91f16700Schasinglulu 				   MP_CPUSYS_TOP_CPU_PLL_DIV_1_DCM_REG0_ON);
248*91f16700Schasinglulu 	} else {
249*91f16700Schasinglulu 		/* TINFO = "Turn OFF DCM 'mp_cpusys_top_cpu_pll_div_1_dcm'" */
250*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_CPU_PLLDIV_CFG1,
251*91f16700Schasinglulu 				   MP_CPUSYS_TOP_CPU_PLL_DIV_1_DCM_REG0_MASK,
252*91f16700Schasinglulu 				   MP_CPUSYS_TOP_CPU_PLL_DIV_1_DCM_REG0_OFF);
253*91f16700Schasinglulu 	}
254*91f16700Schasinglulu }
255*91f16700Schasinglulu 
256*91f16700Schasinglulu #define MP_CPUSYS_TOP_FCM_STALL_DCM_REG0_MASK	BIT(4)
257*91f16700Schasinglulu #define MP_CPUSYS_TOP_FCM_STALL_DCM_REG0_ON	BIT(4)
258*91f16700Schasinglulu #define MP_CPUSYS_TOP_FCM_STALL_DCM_REG0_OFF	(0x0 << 4)
259*91f16700Schasinglulu 
260*91f16700Schasinglulu bool dcm_mp_cpusys_top_fcm_stall_dcm_is_on(void)
261*91f16700Schasinglulu {
262*91f16700Schasinglulu 	return dcm_check_state(MP_CPUSYS_TOP_MP0_DCM_CFG7,
263*91f16700Schasinglulu 			       MP_CPUSYS_TOP_FCM_STALL_DCM_REG0_MASK,
264*91f16700Schasinglulu 			       MP_CPUSYS_TOP_FCM_STALL_DCM_REG0_ON);
265*91f16700Schasinglulu }
266*91f16700Schasinglulu 
267*91f16700Schasinglulu void dcm_mp_cpusys_top_fcm_stall_dcm(bool on)
268*91f16700Schasinglulu {
269*91f16700Schasinglulu 	if (on) {
270*91f16700Schasinglulu 		/* TINFO = "Turn ON DCM 'mp_cpusys_top_fcm_stall_dcm'" */
271*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_MP0_DCM_CFG7,
272*91f16700Schasinglulu 				   MP_CPUSYS_TOP_FCM_STALL_DCM_REG0_MASK,
273*91f16700Schasinglulu 				   MP_CPUSYS_TOP_FCM_STALL_DCM_REG0_ON);
274*91f16700Schasinglulu 	} else {
275*91f16700Schasinglulu 		/* TINFO = "Turn OFF DCM 'mp_cpusys_top_fcm_stall_dcm'" */
276*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_MP0_DCM_CFG7,
277*91f16700Schasinglulu 				   MP_CPUSYS_TOP_FCM_STALL_DCM_REG0_MASK,
278*91f16700Schasinglulu 				   MP_CPUSYS_TOP_FCM_STALL_DCM_REG0_OFF);
279*91f16700Schasinglulu 	}
280*91f16700Schasinglulu }
281*91f16700Schasinglulu 
282*91f16700Schasinglulu #define MP_CPUSYS_TOP_LAST_COR_IDLE_DCM_REG0_MASK	BIT(31)
283*91f16700Schasinglulu #define MP_CPUSYS_TOP_LAST_COR_IDLE_DCM_REG0_ON		BIT(31)
284*91f16700Schasinglulu #define MP_CPUSYS_TOP_LAST_COR_IDLE_DCM_REG0_OFF	(0x0U << 31)
285*91f16700Schasinglulu 
286*91f16700Schasinglulu bool dcm_mp_cpusys_top_last_cor_idle_dcm_is_on(void)
287*91f16700Schasinglulu {
288*91f16700Schasinglulu 	return dcm_check_state(MP_CPUSYS_TOP_BUS_PLLDIV_CFG,
289*91f16700Schasinglulu 			       MP_CPUSYS_TOP_LAST_COR_IDLE_DCM_REG0_MASK,
290*91f16700Schasinglulu 			       MP_CPUSYS_TOP_LAST_COR_IDLE_DCM_REG0_ON);
291*91f16700Schasinglulu }
292*91f16700Schasinglulu 
293*91f16700Schasinglulu void dcm_mp_cpusys_top_last_cor_idle_dcm(bool on)
294*91f16700Schasinglulu {
295*91f16700Schasinglulu 	if (on) {
296*91f16700Schasinglulu 		/* TINFO = "Turn ON DCM 'mp_cpusys_top_last_cor_idle_dcm'" */
297*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_BUS_PLLDIV_CFG,
298*91f16700Schasinglulu 				   MP_CPUSYS_TOP_LAST_COR_IDLE_DCM_REG0_MASK,
299*91f16700Schasinglulu 				   MP_CPUSYS_TOP_LAST_COR_IDLE_DCM_REG0_ON);
300*91f16700Schasinglulu 	} else {
301*91f16700Schasinglulu 		/* TINFO = "Turn OFF DCM 'mp_cpusys_top_last_cor_idle_dcm'" */
302*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_BUS_PLLDIV_CFG,
303*91f16700Schasinglulu 				   MP_CPUSYS_TOP_LAST_COR_IDLE_DCM_REG0_MASK,
304*91f16700Schasinglulu 				   MP_CPUSYS_TOP_LAST_COR_IDLE_DCM_REG0_OFF);
305*91f16700Schasinglulu 	}
306*91f16700Schasinglulu }
307*91f16700Schasinglulu 
308*91f16700Schasinglulu #define MP_CPUSYS_TOP_MISC_DCM_REG0_MASK (BIT(1) | BIT(4))
309*91f16700Schasinglulu #define MP_CPUSYS_TOP_MISC_DCM_REG0_ON (BIT(1) | BIT(4))
310*91f16700Schasinglulu #define MP_CPUSYS_TOP_MISC_DCM_REG0_OFF ((0x0 << 1) | (0x0 << 4))
311*91f16700Schasinglulu 
312*91f16700Schasinglulu bool dcm_mp_cpusys_top_misc_dcm_is_on(void)
313*91f16700Schasinglulu {
314*91f16700Schasinglulu 	return dcm_check_state(MP_CPUSYS_TOP_MP_MISC_DCM_CFG0,
315*91f16700Schasinglulu 			       MP_CPUSYS_TOP_MISC_DCM_REG0_MASK,
316*91f16700Schasinglulu 			       MP_CPUSYS_TOP_MISC_DCM_REG0_ON);
317*91f16700Schasinglulu }
318*91f16700Schasinglulu 
319*91f16700Schasinglulu void dcm_mp_cpusys_top_misc_dcm(bool on)
320*91f16700Schasinglulu {
321*91f16700Schasinglulu 	if (on) {
322*91f16700Schasinglulu 		/* TINFO = "Turn ON DCM 'mp_cpusys_top_misc_dcm'" */
323*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_MP_MISC_DCM_CFG0,
324*91f16700Schasinglulu 				   MP_CPUSYS_TOP_MISC_DCM_REG0_MASK,
325*91f16700Schasinglulu 				   MP_CPUSYS_TOP_MISC_DCM_REG0_ON);
326*91f16700Schasinglulu 	} else {
327*91f16700Schasinglulu 		/* TINFO = "Turn OFF DCM 'mp_cpusys_top_misc_dcm'" */
328*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_MP_MISC_DCM_CFG0,
329*91f16700Schasinglulu 				   MP_CPUSYS_TOP_MISC_DCM_REG0_MASK,
330*91f16700Schasinglulu 				   MP_CPUSYS_TOP_MISC_DCM_REG0_OFF);
331*91f16700Schasinglulu 	}
332*91f16700Schasinglulu }
333*91f16700Schasinglulu 
334*91f16700Schasinglulu #define MP_CPUSYS_TOP_MP0_QDCM_REG0_MASK BIT(3)
335*91f16700Schasinglulu #define MP_CPUSYS_TOP_MP0_QDCM_REG1_MASK (BIT(0) | BIT(1) | BIT(2) | BIT(3))
336*91f16700Schasinglulu #define MP_CPUSYS_TOP_MP0_QDCM_REG0_ON BIT(3)
337*91f16700Schasinglulu #define MP_CPUSYS_TOP_MP0_QDCM_REG1_ON (BIT(0) | BIT(1) | BIT(2) | BIT(3))
338*91f16700Schasinglulu #define MP_CPUSYS_TOP_MP0_QDCM_REG0_OFF ((0x0 << 3))
339*91f16700Schasinglulu #define MP_CPUSYS_TOP_MP0_QDCM_REG1_OFF ((0x0 << 0) | (0x0 << 1) | \
340*91f16700Schasinglulu 					 (0x0 << 2) | (0x0 << 3))
341*91f16700Schasinglulu 
342*91f16700Schasinglulu bool dcm_mp_cpusys_top_mp0_qdcm_is_on(void)
343*91f16700Schasinglulu {
344*91f16700Schasinglulu 	bool ret = true;
345*91f16700Schasinglulu 
346*91f16700Schasinglulu 	ret &= dcm_check_state(MP_CPUSYS_TOP_MP_MISC_DCM_CFG0,
347*91f16700Schasinglulu 			       MP_CPUSYS_TOP_MP0_QDCM_REG0_MASK,
348*91f16700Schasinglulu 			       MP_CPUSYS_TOP_MP0_QDCM_REG0_ON);
349*91f16700Schasinglulu 	ret &= dcm_check_state(MP_CPUSYS_TOP_MP0_DCM_CFG0,
350*91f16700Schasinglulu 			       MP_CPUSYS_TOP_MP0_QDCM_REG1_MASK,
351*91f16700Schasinglulu 			       MP_CPUSYS_TOP_MP0_QDCM_REG1_ON);
352*91f16700Schasinglulu 
353*91f16700Schasinglulu 	return ret;
354*91f16700Schasinglulu }
355*91f16700Schasinglulu 
356*91f16700Schasinglulu void dcm_mp_cpusys_top_mp0_qdcm(bool on)
357*91f16700Schasinglulu {
358*91f16700Schasinglulu 	if (on) {
359*91f16700Schasinglulu 		/* TINFO = "Turn ON DCM 'mp_cpusys_top_mp0_qdcm'" */
360*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_MP_MISC_DCM_CFG0,
361*91f16700Schasinglulu 				   MP_CPUSYS_TOP_MP0_QDCM_REG0_MASK,
362*91f16700Schasinglulu 				   MP_CPUSYS_TOP_MP0_QDCM_REG0_ON);
363*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_MP0_DCM_CFG0,
364*91f16700Schasinglulu 				   MP_CPUSYS_TOP_MP0_QDCM_REG1_MASK,
365*91f16700Schasinglulu 				   MP_CPUSYS_TOP_MP0_QDCM_REG1_ON);
366*91f16700Schasinglulu 	} else {
367*91f16700Schasinglulu 		/* TINFO = "Turn OFF DCM 'mp_cpusys_top_mp0_qdcm'" */
368*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_MP_MISC_DCM_CFG0,
369*91f16700Schasinglulu 				   MP_CPUSYS_TOP_MP0_QDCM_REG0_MASK,
370*91f16700Schasinglulu 				   MP_CPUSYS_TOP_MP0_QDCM_REG0_OFF);
371*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_MP0_DCM_CFG0,
372*91f16700Schasinglulu 				   MP_CPUSYS_TOP_MP0_QDCM_REG1_MASK,
373*91f16700Schasinglulu 				   MP_CPUSYS_TOP_MP0_QDCM_REG1_OFF);
374*91f16700Schasinglulu 	}
375*91f16700Schasinglulu }
376*91f16700Schasinglulu 
377*91f16700Schasinglulu #define CPCCFG_REG_EMI_WFIFO_REG0_MASK (BIT(0) | BIT(1) | BIT(2) | BIT(3))
378*91f16700Schasinglulu #define CPCCFG_REG_EMI_WFIFO_REG0_ON (BIT(0) | BIT(1) | BIT(2) | BIT(3))
379*91f16700Schasinglulu #define CPCCFG_REG_EMI_WFIFO_REG0_OFF ((0x0 << 0) | (0x0 << 1) | \
380*91f16700Schasinglulu 				       (0x0 << 2) | (0x0 << 3))
381*91f16700Schasinglulu 
382*91f16700Schasinglulu bool dcm_cpccfg_reg_emi_wfifo_is_on(void)
383*91f16700Schasinglulu {
384*91f16700Schasinglulu 	return dcm_check_state(CPCCFG_REG_EMI_WFIFO,
385*91f16700Schasinglulu 			       CPCCFG_REG_EMI_WFIFO_REG0_MASK,
386*91f16700Schasinglulu 			       CPCCFG_REG_EMI_WFIFO_REG0_ON);
387*91f16700Schasinglulu }
388*91f16700Schasinglulu 
389*91f16700Schasinglulu void dcm_cpccfg_reg_emi_wfifo(bool on)
390*91f16700Schasinglulu {
391*91f16700Schasinglulu 	if (on) {
392*91f16700Schasinglulu 		/* TINFO = "Turn ON DCM 'cpccfg_reg_emi_wfifo'" */
393*91f16700Schasinglulu 		mmio_clrsetbits_32(CPCCFG_REG_EMI_WFIFO,
394*91f16700Schasinglulu 				   CPCCFG_REG_EMI_WFIFO_REG0_MASK,
395*91f16700Schasinglulu 				   CPCCFG_REG_EMI_WFIFO_REG0_ON);
396*91f16700Schasinglulu 	} else {
397*91f16700Schasinglulu 		/* TINFO = "Turn OFF DCM 'cpccfg_reg_emi_wfifo'" */
398*91f16700Schasinglulu 		mmio_clrsetbits_32(CPCCFG_REG_EMI_WFIFO,
399*91f16700Schasinglulu 				   CPCCFG_REG_EMI_WFIFO_REG0_MASK,
400*91f16700Schasinglulu 				   CPCCFG_REG_EMI_WFIFO_REG0_OFF);
401*91f16700Schasinglulu 	}
402*91f16700Schasinglulu }
403