xref: /arm-trusted-firmware/plat/mediatek/mt8192/drivers/dcm/mtk_dcm_utils.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2020, 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) | \
13*91f16700Schasinglulu 			BIT(16) | \
14*91f16700Schasinglulu 			BIT(17) | \
15*91f16700Schasinglulu 			BIT(18) | \
16*91f16700Schasinglulu 			BIT(21))
17*91f16700Schasinglulu #define MP_CPUSYS_TOP_ADB_DCM_REG2_MASK (BIT(15) | \
18*91f16700Schasinglulu 			BIT(16) | \
19*91f16700Schasinglulu 			BIT(17) | \
20*91f16700Schasinglulu 			BIT(18))
21*91f16700Schasinglulu #define MP_CPUSYS_TOP_ADB_DCM_REG0_ON (BIT(17))
22*91f16700Schasinglulu #define MP_CPUSYS_TOP_ADB_DCM_REG1_ON (BIT(15) | \
23*91f16700Schasinglulu 			BIT(16) | \
24*91f16700Schasinglulu 			BIT(17) | \
25*91f16700Schasinglulu 			BIT(18) | \
26*91f16700Schasinglulu 			BIT(21))
27*91f16700Schasinglulu #define MP_CPUSYS_TOP_ADB_DCM_REG2_ON (BIT(15) | \
28*91f16700Schasinglulu 			BIT(16) | \
29*91f16700Schasinglulu 			BIT(17) | \
30*91f16700Schasinglulu 			BIT(18))
31*91f16700Schasinglulu #define MP_CPUSYS_TOP_ADB_DCM_REG0_OFF ((0x0 << 17))
32*91f16700Schasinglulu #define MP_CPUSYS_TOP_ADB_DCM_REG1_OFF ((0x0 << 15) | \
33*91f16700Schasinglulu 			(0x0 << 16) | \
34*91f16700Schasinglulu 			(0x0 << 17) | \
35*91f16700Schasinglulu 			(0x0 << 18) | \
36*91f16700Schasinglulu 			(0x0 << 21))
37*91f16700Schasinglulu #define MP_CPUSYS_TOP_ADB_DCM_REG2_OFF ((0x0 << 15) | \
38*91f16700Schasinglulu 			(0x0 << 16) | \
39*91f16700Schasinglulu 			(0x0 << 17) | \
40*91f16700Schasinglulu 			(0x0 << 18))
41*91f16700Schasinglulu 
42*91f16700Schasinglulu bool dcm_mp_cpusys_top_adb_dcm_is_on(void)
43*91f16700Schasinglulu {
44*91f16700Schasinglulu 	bool ret = true;
45*91f16700Schasinglulu 
46*91f16700Schasinglulu 	ret &= ((mmio_read_32(MP_ADB_DCM_CFG0) &
47*91f16700Schasinglulu 		MP_CPUSYS_TOP_ADB_DCM_REG0_MASK) ==
48*91f16700Schasinglulu 		(unsigned int) MP_CPUSYS_TOP_ADB_DCM_REG0_ON);
49*91f16700Schasinglulu 	ret &= ((mmio_read_32(MP_ADB_DCM_CFG4) &
50*91f16700Schasinglulu 		MP_CPUSYS_TOP_ADB_DCM_REG1_MASK) ==
51*91f16700Schasinglulu 		(unsigned int) MP_CPUSYS_TOP_ADB_DCM_REG1_ON);
52*91f16700Schasinglulu 	ret &= ((mmio_read_32(MCUSYS_DCM_CFG0) &
53*91f16700Schasinglulu 		MP_CPUSYS_TOP_ADB_DCM_REG2_MASK) ==
54*91f16700Schasinglulu 		(unsigned int) MP_CPUSYS_TOP_ADB_DCM_REG2_ON);
55*91f16700Schasinglulu 
56*91f16700Schasinglulu 	return ret;
57*91f16700Schasinglulu }
58*91f16700Schasinglulu 
59*91f16700Schasinglulu void dcm_mp_cpusys_top_adb_dcm(bool on)
60*91f16700Schasinglulu {
61*91f16700Schasinglulu 	if (on) {
62*91f16700Schasinglulu 		/* TINFO = "Turn ON DCM 'mp_cpusys_top_adb_dcm'" */
63*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_ADB_DCM_CFG0,
64*91f16700Schasinglulu 			MP_CPUSYS_TOP_ADB_DCM_REG0_MASK,
65*91f16700Schasinglulu 			MP_CPUSYS_TOP_ADB_DCM_REG0_ON);
66*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_ADB_DCM_CFG4,
67*91f16700Schasinglulu 			MP_CPUSYS_TOP_ADB_DCM_REG1_MASK,
68*91f16700Schasinglulu 			MP_CPUSYS_TOP_ADB_DCM_REG1_ON);
69*91f16700Schasinglulu 		mmio_clrsetbits_32(MCUSYS_DCM_CFG0,
70*91f16700Schasinglulu 			MP_CPUSYS_TOP_ADB_DCM_REG2_MASK,
71*91f16700Schasinglulu 			MP_CPUSYS_TOP_ADB_DCM_REG2_ON);
72*91f16700Schasinglulu 	} else {
73*91f16700Schasinglulu 		/* TINFO = "Turn OFF DCM 'mp_cpusys_top_adb_dcm'" */
74*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_ADB_DCM_CFG0,
75*91f16700Schasinglulu 			MP_CPUSYS_TOP_ADB_DCM_REG0_MASK,
76*91f16700Schasinglulu 			MP_CPUSYS_TOP_ADB_DCM_REG0_OFF);
77*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_ADB_DCM_CFG4,
78*91f16700Schasinglulu 			MP_CPUSYS_TOP_ADB_DCM_REG1_MASK,
79*91f16700Schasinglulu 			MP_CPUSYS_TOP_ADB_DCM_REG1_OFF);
80*91f16700Schasinglulu 		mmio_clrsetbits_32(MCUSYS_DCM_CFG0,
81*91f16700Schasinglulu 			MP_CPUSYS_TOP_ADB_DCM_REG2_MASK,
82*91f16700Schasinglulu 			MP_CPUSYS_TOP_ADB_DCM_REG2_OFF);
83*91f16700Schasinglulu 	}
84*91f16700Schasinglulu }
85*91f16700Schasinglulu 
86*91f16700Schasinglulu #define MP_CPUSYS_TOP_APB_DCM_REG0_MASK (BIT(5))
87*91f16700Schasinglulu #define MP_CPUSYS_TOP_APB_DCM_REG1_MASK (BIT(8))
88*91f16700Schasinglulu #define MP_CPUSYS_TOP_APB_DCM_REG2_MASK (BIT(16))
89*91f16700Schasinglulu #define MP_CPUSYS_TOP_APB_DCM_REG0_ON (BIT(5))
90*91f16700Schasinglulu #define MP_CPUSYS_TOP_APB_DCM_REG1_ON (BIT(8))
91*91f16700Schasinglulu #define MP_CPUSYS_TOP_APB_DCM_REG2_ON (BIT(16))
92*91f16700Schasinglulu #define MP_CPUSYS_TOP_APB_DCM_REG0_OFF ((0x0 << 5))
93*91f16700Schasinglulu #define MP_CPUSYS_TOP_APB_DCM_REG1_OFF ((0x0 << 8))
94*91f16700Schasinglulu #define MP_CPUSYS_TOP_APB_DCM_REG2_OFF ((0x0 << 16))
95*91f16700Schasinglulu 
96*91f16700Schasinglulu bool dcm_mp_cpusys_top_apb_dcm_is_on(void)
97*91f16700Schasinglulu {
98*91f16700Schasinglulu 	bool ret = true;
99*91f16700Schasinglulu 
100*91f16700Schasinglulu 	ret &= ((mmio_read_32(MP_MISC_DCM_CFG0) &
101*91f16700Schasinglulu 		MP_CPUSYS_TOP_APB_DCM_REG0_MASK) ==
102*91f16700Schasinglulu 		(unsigned int) MP_CPUSYS_TOP_APB_DCM_REG0_ON);
103*91f16700Schasinglulu 	ret &= ((mmio_read_32(MCUSYS_DCM_CFG0) &
104*91f16700Schasinglulu 		MP_CPUSYS_TOP_APB_DCM_REG1_MASK) ==
105*91f16700Schasinglulu 		(unsigned int) MP_CPUSYS_TOP_APB_DCM_REG1_ON);
106*91f16700Schasinglulu 	ret &= ((mmio_read_32(MP0_DCM_CFG0) &
107*91f16700Schasinglulu 		MP_CPUSYS_TOP_APB_DCM_REG2_MASK) ==
108*91f16700Schasinglulu 		(unsigned int) MP_CPUSYS_TOP_APB_DCM_REG2_ON);
109*91f16700Schasinglulu 
110*91f16700Schasinglulu 	return ret;
111*91f16700Schasinglulu }
112*91f16700Schasinglulu 
113*91f16700Schasinglulu void dcm_mp_cpusys_top_apb_dcm(bool on)
114*91f16700Schasinglulu {
115*91f16700Schasinglulu 	if (on) {
116*91f16700Schasinglulu 		/* TINFO = "Turn ON DCM 'mp_cpusys_top_apb_dcm'" */
117*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_MISC_DCM_CFG0,
118*91f16700Schasinglulu 			MP_CPUSYS_TOP_APB_DCM_REG0_MASK,
119*91f16700Schasinglulu 			MP_CPUSYS_TOP_APB_DCM_REG0_ON);
120*91f16700Schasinglulu 		mmio_clrsetbits_32(MCUSYS_DCM_CFG0,
121*91f16700Schasinglulu 			MP_CPUSYS_TOP_APB_DCM_REG1_MASK,
122*91f16700Schasinglulu 			MP_CPUSYS_TOP_APB_DCM_REG1_ON);
123*91f16700Schasinglulu 		mmio_clrsetbits_32(MP0_DCM_CFG0,
124*91f16700Schasinglulu 			MP_CPUSYS_TOP_APB_DCM_REG2_MASK,
125*91f16700Schasinglulu 			MP_CPUSYS_TOP_APB_DCM_REG2_ON);
126*91f16700Schasinglulu 	} else {
127*91f16700Schasinglulu 		/* TINFO = "Turn OFF DCM 'mp_cpusys_top_apb_dcm'" */
128*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_MISC_DCM_CFG0,
129*91f16700Schasinglulu 			MP_CPUSYS_TOP_APB_DCM_REG0_MASK,
130*91f16700Schasinglulu 			MP_CPUSYS_TOP_APB_DCM_REG0_OFF);
131*91f16700Schasinglulu 		mmio_clrsetbits_32(MCUSYS_DCM_CFG0,
132*91f16700Schasinglulu 			MP_CPUSYS_TOP_APB_DCM_REG1_MASK,
133*91f16700Schasinglulu 			MP_CPUSYS_TOP_APB_DCM_REG1_OFF);
134*91f16700Schasinglulu 		mmio_clrsetbits_32(MP0_DCM_CFG0,
135*91f16700Schasinglulu 			MP_CPUSYS_TOP_APB_DCM_REG2_MASK,
136*91f16700Schasinglulu 			MP_CPUSYS_TOP_APB_DCM_REG2_OFF);
137*91f16700Schasinglulu 	}
138*91f16700Schasinglulu }
139*91f16700Schasinglulu 
140*91f16700Schasinglulu #define MP_CPUSYS_TOP_BUS_PLL_DIV_DCM_REG0_MASK (BIT(11))
141*91f16700Schasinglulu #define MP_CPUSYS_TOP_BUS_PLL_DIV_DCM_REG0_ON (BIT(11))
142*91f16700Schasinglulu #define MP_CPUSYS_TOP_BUS_PLL_DIV_DCM_REG0_OFF ((0x0 << 11))
143*91f16700Schasinglulu 
144*91f16700Schasinglulu bool dcm_mp_cpusys_top_bus_pll_div_dcm_is_on(void)
145*91f16700Schasinglulu {
146*91f16700Schasinglulu 	bool ret = true;
147*91f16700Schasinglulu 
148*91f16700Schasinglulu 	ret &= ((mmio_read_32(BUS_PLLDIV_CFG) &
149*91f16700Schasinglulu 		MP_CPUSYS_TOP_BUS_PLL_DIV_DCM_REG0_MASK) ==
150*91f16700Schasinglulu 		(unsigned int) MP_CPUSYS_TOP_BUS_PLL_DIV_DCM_REG0_ON);
151*91f16700Schasinglulu 
152*91f16700Schasinglulu 	return ret;
153*91f16700Schasinglulu }
154*91f16700Schasinglulu 
155*91f16700Schasinglulu void dcm_mp_cpusys_top_bus_pll_div_dcm(bool on)
156*91f16700Schasinglulu {
157*91f16700Schasinglulu 	if (on) {
158*91f16700Schasinglulu 		/* TINFO = "Turn ON DCM 'mp_cpusys_top_bus_pll_div_dcm'" */
159*91f16700Schasinglulu 		mmio_clrsetbits_32(BUS_PLLDIV_CFG,
160*91f16700Schasinglulu 			MP_CPUSYS_TOP_BUS_PLL_DIV_DCM_REG0_MASK,
161*91f16700Schasinglulu 			MP_CPUSYS_TOP_BUS_PLL_DIV_DCM_REG0_ON);
162*91f16700Schasinglulu 	} else {
163*91f16700Schasinglulu 		/* TINFO = "Turn OFF DCM 'mp_cpusys_top_bus_pll_div_dcm'" */
164*91f16700Schasinglulu 		mmio_clrsetbits_32(BUS_PLLDIV_CFG,
165*91f16700Schasinglulu 			MP_CPUSYS_TOP_BUS_PLL_DIV_DCM_REG0_MASK,
166*91f16700Schasinglulu 			MP_CPUSYS_TOP_BUS_PLL_DIV_DCM_REG0_OFF);
167*91f16700Schasinglulu 	}
168*91f16700Schasinglulu }
169*91f16700Schasinglulu 
170*91f16700Schasinglulu #define MP_CPUSYS_TOP_CORE_STALL_DCM_REG0_MASK (BIT(0))
171*91f16700Schasinglulu #define MP_CPUSYS_TOP_CORE_STALL_DCM_REG0_ON (BIT(0))
172*91f16700Schasinglulu #define MP_CPUSYS_TOP_CORE_STALL_DCM_REG0_OFF ((0x0 << 0))
173*91f16700Schasinglulu 
174*91f16700Schasinglulu bool dcm_mp_cpusys_top_core_stall_dcm_is_on(void)
175*91f16700Schasinglulu {
176*91f16700Schasinglulu 	bool ret = true;
177*91f16700Schasinglulu 
178*91f16700Schasinglulu 	ret &= ((mmio_read_32(MP0_DCM_CFG7) &
179*91f16700Schasinglulu 		MP_CPUSYS_TOP_CORE_STALL_DCM_REG0_MASK) ==
180*91f16700Schasinglulu 		(unsigned int) MP_CPUSYS_TOP_CORE_STALL_DCM_REG0_ON);
181*91f16700Schasinglulu 
182*91f16700Schasinglulu 	return ret;
183*91f16700Schasinglulu }
184*91f16700Schasinglulu 
185*91f16700Schasinglulu void dcm_mp_cpusys_top_core_stall_dcm(bool on)
186*91f16700Schasinglulu {
187*91f16700Schasinglulu 	if (on) {
188*91f16700Schasinglulu 		/* TINFO = "Turn ON DCM 'mp_cpusys_top_core_stall_dcm'" */
189*91f16700Schasinglulu 		mmio_clrsetbits_32(MP0_DCM_CFG7,
190*91f16700Schasinglulu 			MP_CPUSYS_TOP_CORE_STALL_DCM_REG0_MASK,
191*91f16700Schasinglulu 			MP_CPUSYS_TOP_CORE_STALL_DCM_REG0_ON);
192*91f16700Schasinglulu 	} else {
193*91f16700Schasinglulu 		/* TINFO = "Turn OFF DCM 'mp_cpusys_top_core_stall_dcm'" */
194*91f16700Schasinglulu 		mmio_clrsetbits_32(MP0_DCM_CFG7,
195*91f16700Schasinglulu 			MP_CPUSYS_TOP_CORE_STALL_DCM_REG0_MASK,
196*91f16700Schasinglulu 			MP_CPUSYS_TOP_CORE_STALL_DCM_REG0_OFF);
197*91f16700Schasinglulu 	}
198*91f16700Schasinglulu }
199*91f16700Schasinglulu 
200*91f16700Schasinglulu #define MP_CPUSYS_TOP_CPUBIU_DCM_REG0_MASK ((0xffff << 0))
201*91f16700Schasinglulu #define MP_CPUSYS_TOP_CPUBIU_DCM_REG0_ON ((0xffff << 0))
202*91f16700Schasinglulu #define MP_CPUSYS_TOP_CPUBIU_DCM_REG0_OFF ((0x0 << 0))
203*91f16700Schasinglulu 
204*91f16700Schasinglulu bool dcm_mp_cpusys_top_cpubiu_dcm_is_on(void)
205*91f16700Schasinglulu {
206*91f16700Schasinglulu 	bool ret = true;
207*91f16700Schasinglulu 
208*91f16700Schasinglulu 	ret &= ((mmio_read_32(MCSI_DCM0) &
209*91f16700Schasinglulu 		MP_CPUSYS_TOP_CPUBIU_DCM_REG0_MASK) ==
210*91f16700Schasinglulu 		(unsigned int) MP_CPUSYS_TOP_CPUBIU_DCM_REG0_ON);
211*91f16700Schasinglulu 
212*91f16700Schasinglulu 	return ret;
213*91f16700Schasinglulu }
214*91f16700Schasinglulu 
215*91f16700Schasinglulu void dcm_mp_cpusys_top_cpubiu_dcm(bool on)
216*91f16700Schasinglulu {
217*91f16700Schasinglulu 	if (on) {
218*91f16700Schasinglulu 		/* TINFO = "Turn ON DCM 'mp_cpusys_top_cpubiu_dcm'" */
219*91f16700Schasinglulu 		mmio_clrsetbits_32(MCSI_DCM0,
220*91f16700Schasinglulu 			MP_CPUSYS_TOP_CPUBIU_DCM_REG0_MASK,
221*91f16700Schasinglulu 			MP_CPUSYS_TOP_CPUBIU_DCM_REG0_ON);
222*91f16700Schasinglulu 	} else {
223*91f16700Schasinglulu 		/* TINFO = "Turn OFF DCM 'mp_cpusys_top_cpubiu_dcm'" */
224*91f16700Schasinglulu 		mmio_clrsetbits_32(MCSI_DCM0,
225*91f16700Schasinglulu 			MP_CPUSYS_TOP_CPUBIU_DCM_REG0_MASK,
226*91f16700Schasinglulu 			MP_CPUSYS_TOP_CPUBIU_DCM_REG0_OFF);
227*91f16700Schasinglulu 	}
228*91f16700Schasinglulu }
229*91f16700Schasinglulu 
230*91f16700Schasinglulu #define MP_CPUSYS_TOP_CPU_PLL_DIV_0_DCM_REG0_MASK (BIT(11))
231*91f16700Schasinglulu #define MP_CPUSYS_TOP_CPU_PLL_DIV_0_DCM_REG0_ON (BIT(11))
232*91f16700Schasinglulu #define MP_CPUSYS_TOP_CPU_PLL_DIV_0_DCM_REG0_OFF ((0x0 << 11))
233*91f16700Schasinglulu 
234*91f16700Schasinglulu bool dcm_mp_cpusys_top_cpu_pll_div_0_dcm_is_on(void)
235*91f16700Schasinglulu {
236*91f16700Schasinglulu 	bool ret = true;
237*91f16700Schasinglulu 
238*91f16700Schasinglulu 	ret &= ((mmio_read_32(CPU_PLLDIV_CFG0) &
239*91f16700Schasinglulu 		MP_CPUSYS_TOP_CPU_PLL_DIV_0_DCM_REG0_MASK) ==
240*91f16700Schasinglulu 		(unsigned int) MP_CPUSYS_TOP_CPU_PLL_DIV_0_DCM_REG0_ON);
241*91f16700Schasinglulu 
242*91f16700Schasinglulu 	return ret;
243*91f16700Schasinglulu }
244*91f16700Schasinglulu 
245*91f16700Schasinglulu void dcm_mp_cpusys_top_cpu_pll_div_0_dcm(bool on)
246*91f16700Schasinglulu {
247*91f16700Schasinglulu 	if (on) {
248*91f16700Schasinglulu 		/* TINFO = "Turn ON DCM 'mp_cpusys_top_cpu_pll_div_0_dcm'" */
249*91f16700Schasinglulu 		mmio_clrsetbits_32(CPU_PLLDIV_CFG0,
250*91f16700Schasinglulu 			MP_CPUSYS_TOP_CPU_PLL_DIV_0_DCM_REG0_MASK,
251*91f16700Schasinglulu 			MP_CPUSYS_TOP_CPU_PLL_DIV_0_DCM_REG0_ON);
252*91f16700Schasinglulu 	} else {
253*91f16700Schasinglulu 		/* TINFO = "Turn OFF DCM 'mp_cpusys_top_cpu_pll_div_0_dcm'" */
254*91f16700Schasinglulu 		mmio_clrsetbits_32(CPU_PLLDIV_CFG0,
255*91f16700Schasinglulu 			MP_CPUSYS_TOP_CPU_PLL_DIV_0_DCM_REG0_MASK,
256*91f16700Schasinglulu 			MP_CPUSYS_TOP_CPU_PLL_DIV_0_DCM_REG0_OFF);
257*91f16700Schasinglulu 	}
258*91f16700Schasinglulu }
259*91f16700Schasinglulu 
260*91f16700Schasinglulu #define MP_CPUSYS_TOP_CPU_PLL_DIV_1_DCM_REG0_MASK (BIT(11))
261*91f16700Schasinglulu #define MP_CPUSYS_TOP_CPU_PLL_DIV_1_DCM_REG0_ON (BIT(11))
262*91f16700Schasinglulu #define MP_CPUSYS_TOP_CPU_PLL_DIV_1_DCM_REG0_OFF ((0x0 << 11))
263*91f16700Schasinglulu 
264*91f16700Schasinglulu bool dcm_mp_cpusys_top_cpu_pll_div_1_dcm_is_on(void)
265*91f16700Schasinglulu {
266*91f16700Schasinglulu 	bool ret = true;
267*91f16700Schasinglulu 
268*91f16700Schasinglulu 	ret &= ((mmio_read_32(CPU_PLLDIV_CFG1) &
269*91f16700Schasinglulu 		MP_CPUSYS_TOP_CPU_PLL_DIV_1_DCM_REG0_MASK) ==
270*91f16700Schasinglulu 		(unsigned int) MP_CPUSYS_TOP_CPU_PLL_DIV_1_DCM_REG0_ON);
271*91f16700Schasinglulu 
272*91f16700Schasinglulu 	return ret;
273*91f16700Schasinglulu }
274*91f16700Schasinglulu 
275*91f16700Schasinglulu void dcm_mp_cpusys_top_cpu_pll_div_1_dcm(bool on)
276*91f16700Schasinglulu {
277*91f16700Schasinglulu 	if (on) {
278*91f16700Schasinglulu 		/* TINFO = "Turn ON DCM 'mp_cpusys_top_cpu_pll_div_1_dcm'" */
279*91f16700Schasinglulu 		mmio_clrsetbits_32(CPU_PLLDIV_CFG1,
280*91f16700Schasinglulu 			MP_CPUSYS_TOP_CPU_PLL_DIV_1_DCM_REG0_MASK,
281*91f16700Schasinglulu 			MP_CPUSYS_TOP_CPU_PLL_DIV_1_DCM_REG0_ON);
282*91f16700Schasinglulu 	} else {
283*91f16700Schasinglulu 		/* TINFO = "Turn OFF DCM 'mp_cpusys_top_cpu_pll_div_1_dcm'" */
284*91f16700Schasinglulu 		mmio_clrsetbits_32(CPU_PLLDIV_CFG1,
285*91f16700Schasinglulu 			MP_CPUSYS_TOP_CPU_PLL_DIV_1_DCM_REG0_MASK,
286*91f16700Schasinglulu 			MP_CPUSYS_TOP_CPU_PLL_DIV_1_DCM_REG0_OFF);
287*91f16700Schasinglulu 	}
288*91f16700Schasinglulu }
289*91f16700Schasinglulu 
290*91f16700Schasinglulu #define MP_CPUSYS_TOP_CPU_PLL_DIV_2_DCM_REG0_MASK (BIT(11))
291*91f16700Schasinglulu #define MP_CPUSYS_TOP_CPU_PLL_DIV_2_DCM_REG0_ON (BIT(11))
292*91f16700Schasinglulu #define MP_CPUSYS_TOP_CPU_PLL_DIV_2_DCM_REG0_OFF ((0x0 << 11))
293*91f16700Schasinglulu 
294*91f16700Schasinglulu bool dcm_mp_cpusys_top_cpu_pll_div_2_dcm_is_on(void)
295*91f16700Schasinglulu {
296*91f16700Schasinglulu 	bool ret = true;
297*91f16700Schasinglulu 
298*91f16700Schasinglulu 	ret &= ((mmio_read_32(CPU_PLLDIV_CFG2) &
299*91f16700Schasinglulu 		MP_CPUSYS_TOP_CPU_PLL_DIV_2_DCM_REG0_MASK) ==
300*91f16700Schasinglulu 		(unsigned int) MP_CPUSYS_TOP_CPU_PLL_DIV_2_DCM_REG0_ON);
301*91f16700Schasinglulu 
302*91f16700Schasinglulu 	return ret;
303*91f16700Schasinglulu }
304*91f16700Schasinglulu 
305*91f16700Schasinglulu void dcm_mp_cpusys_top_cpu_pll_div_2_dcm(bool on)
306*91f16700Schasinglulu {
307*91f16700Schasinglulu 	if (on) {
308*91f16700Schasinglulu 		/* TINFO = "Turn ON DCM 'mp_cpusys_top_cpu_pll_div_2_dcm'" */
309*91f16700Schasinglulu 		mmio_clrsetbits_32(CPU_PLLDIV_CFG2,
310*91f16700Schasinglulu 			MP_CPUSYS_TOP_CPU_PLL_DIV_2_DCM_REG0_MASK,
311*91f16700Schasinglulu 			MP_CPUSYS_TOP_CPU_PLL_DIV_2_DCM_REG0_ON);
312*91f16700Schasinglulu 	} else {
313*91f16700Schasinglulu 		/* TINFO = "Turn OFF DCM 'mp_cpusys_top_cpu_pll_div_2_dcm'" */
314*91f16700Schasinglulu 		mmio_clrsetbits_32(CPU_PLLDIV_CFG2,
315*91f16700Schasinglulu 			MP_CPUSYS_TOP_CPU_PLL_DIV_2_DCM_REG0_MASK,
316*91f16700Schasinglulu 			MP_CPUSYS_TOP_CPU_PLL_DIV_2_DCM_REG0_OFF);
317*91f16700Schasinglulu 	}
318*91f16700Schasinglulu }
319*91f16700Schasinglulu 
320*91f16700Schasinglulu #define MP_CPUSYS_TOP_CPU_PLL_DIV_3_DCM_REG0_MASK (BIT(11))
321*91f16700Schasinglulu #define MP_CPUSYS_TOP_CPU_PLL_DIV_3_DCM_REG0_ON (BIT(11))
322*91f16700Schasinglulu #define MP_CPUSYS_TOP_CPU_PLL_DIV_3_DCM_REG0_OFF ((0x0 << 11))
323*91f16700Schasinglulu 
324*91f16700Schasinglulu bool dcm_mp_cpusys_top_cpu_pll_div_3_dcm_is_on(void)
325*91f16700Schasinglulu {
326*91f16700Schasinglulu 	bool ret = true;
327*91f16700Schasinglulu 
328*91f16700Schasinglulu 	ret &= ((mmio_read_32(CPU_PLLDIV_CFG3) &
329*91f16700Schasinglulu 		MP_CPUSYS_TOP_CPU_PLL_DIV_3_DCM_REG0_MASK) ==
330*91f16700Schasinglulu 		(unsigned int) MP_CPUSYS_TOP_CPU_PLL_DIV_3_DCM_REG0_ON);
331*91f16700Schasinglulu 
332*91f16700Schasinglulu 	return ret;
333*91f16700Schasinglulu }
334*91f16700Schasinglulu 
335*91f16700Schasinglulu void dcm_mp_cpusys_top_cpu_pll_div_3_dcm(bool on)
336*91f16700Schasinglulu {
337*91f16700Schasinglulu 	if (on) {
338*91f16700Schasinglulu 		/* TINFO = "Turn ON DCM 'mp_cpusys_top_cpu_pll_div_3_dcm'" */
339*91f16700Schasinglulu 		mmio_clrsetbits_32(CPU_PLLDIV_CFG3,
340*91f16700Schasinglulu 			MP_CPUSYS_TOP_CPU_PLL_DIV_3_DCM_REG0_MASK,
341*91f16700Schasinglulu 			MP_CPUSYS_TOP_CPU_PLL_DIV_3_DCM_REG0_ON);
342*91f16700Schasinglulu 	} else {
343*91f16700Schasinglulu 		/* TINFO = "Turn OFF DCM 'mp_cpusys_top_cpu_pll_div_3_dcm'" */
344*91f16700Schasinglulu 		mmio_clrsetbits_32(CPU_PLLDIV_CFG3,
345*91f16700Schasinglulu 			MP_CPUSYS_TOP_CPU_PLL_DIV_3_DCM_REG0_MASK,
346*91f16700Schasinglulu 			MP_CPUSYS_TOP_CPU_PLL_DIV_3_DCM_REG0_OFF);
347*91f16700Schasinglulu 	}
348*91f16700Schasinglulu }
349*91f16700Schasinglulu 
350*91f16700Schasinglulu #define MP_CPUSYS_TOP_CPU_PLL_DIV_4_DCM_REG0_MASK (BIT(11))
351*91f16700Schasinglulu #define MP_CPUSYS_TOP_CPU_PLL_DIV_4_DCM_REG0_ON (BIT(11))
352*91f16700Schasinglulu #define MP_CPUSYS_TOP_CPU_PLL_DIV_4_DCM_REG0_OFF ((0x0 << 11))
353*91f16700Schasinglulu 
354*91f16700Schasinglulu bool dcm_mp_cpusys_top_cpu_pll_div_4_dcm_is_on(void)
355*91f16700Schasinglulu {
356*91f16700Schasinglulu 	bool ret = true;
357*91f16700Schasinglulu 
358*91f16700Schasinglulu 	ret &= ((mmio_read_32(CPU_PLLDIV_CFG4) &
359*91f16700Schasinglulu 		MP_CPUSYS_TOP_CPU_PLL_DIV_4_DCM_REG0_MASK) ==
360*91f16700Schasinglulu 		(unsigned int) MP_CPUSYS_TOP_CPU_PLL_DIV_4_DCM_REG0_ON);
361*91f16700Schasinglulu 
362*91f16700Schasinglulu 	return ret;
363*91f16700Schasinglulu }
364*91f16700Schasinglulu 
365*91f16700Schasinglulu void dcm_mp_cpusys_top_cpu_pll_div_4_dcm(bool on)
366*91f16700Schasinglulu {
367*91f16700Schasinglulu 	if (on) {
368*91f16700Schasinglulu 		/* TINFO = "Turn ON DCM 'mp_cpusys_top_cpu_pll_div_4_dcm'" */
369*91f16700Schasinglulu 		mmio_clrsetbits_32(CPU_PLLDIV_CFG4,
370*91f16700Schasinglulu 			MP_CPUSYS_TOP_CPU_PLL_DIV_4_DCM_REG0_MASK,
371*91f16700Schasinglulu 			MP_CPUSYS_TOP_CPU_PLL_DIV_4_DCM_REG0_ON);
372*91f16700Schasinglulu 	} else {
373*91f16700Schasinglulu 		/* TINFO = "Turn OFF DCM 'mp_cpusys_top_cpu_pll_div_4_dcm'" */
374*91f16700Schasinglulu 		mmio_clrsetbits_32(CPU_PLLDIV_CFG4,
375*91f16700Schasinglulu 			MP_CPUSYS_TOP_CPU_PLL_DIV_4_DCM_REG0_MASK,
376*91f16700Schasinglulu 			MP_CPUSYS_TOP_CPU_PLL_DIV_4_DCM_REG0_OFF);
377*91f16700Schasinglulu 	}
378*91f16700Schasinglulu }
379*91f16700Schasinglulu 
380*91f16700Schasinglulu #define MP_CPUSYS_TOP_FCM_STALL_DCM_REG0_MASK (BIT(4))
381*91f16700Schasinglulu #define MP_CPUSYS_TOP_FCM_STALL_DCM_REG0_ON (BIT(4))
382*91f16700Schasinglulu #define MP_CPUSYS_TOP_FCM_STALL_DCM_REG0_OFF ((0x0 << 4))
383*91f16700Schasinglulu 
384*91f16700Schasinglulu bool dcm_mp_cpusys_top_fcm_stall_dcm_is_on(void)
385*91f16700Schasinglulu {
386*91f16700Schasinglulu 	bool ret = true;
387*91f16700Schasinglulu 
388*91f16700Schasinglulu 	ret &= ((mmio_read_32(MP0_DCM_CFG7) &
389*91f16700Schasinglulu 		MP_CPUSYS_TOP_FCM_STALL_DCM_REG0_MASK) ==
390*91f16700Schasinglulu 		(unsigned int) MP_CPUSYS_TOP_FCM_STALL_DCM_REG0_ON);
391*91f16700Schasinglulu 
392*91f16700Schasinglulu 	return ret;
393*91f16700Schasinglulu }
394*91f16700Schasinglulu 
395*91f16700Schasinglulu void dcm_mp_cpusys_top_fcm_stall_dcm(bool on)
396*91f16700Schasinglulu {
397*91f16700Schasinglulu 	if (on) {
398*91f16700Schasinglulu 		/* TINFO = "Turn ON DCM 'mp_cpusys_top_fcm_stall_dcm'" */
399*91f16700Schasinglulu 		mmio_clrsetbits_32(MP0_DCM_CFG7,
400*91f16700Schasinglulu 			MP_CPUSYS_TOP_FCM_STALL_DCM_REG0_MASK,
401*91f16700Schasinglulu 			MP_CPUSYS_TOP_FCM_STALL_DCM_REG0_ON);
402*91f16700Schasinglulu 	} else {
403*91f16700Schasinglulu 		/* TINFO = "Turn OFF DCM 'mp_cpusys_top_fcm_stall_dcm'" */
404*91f16700Schasinglulu 		mmio_clrsetbits_32(MP0_DCM_CFG7,
405*91f16700Schasinglulu 			MP_CPUSYS_TOP_FCM_STALL_DCM_REG0_MASK,
406*91f16700Schasinglulu 			MP_CPUSYS_TOP_FCM_STALL_DCM_REG0_OFF);
407*91f16700Schasinglulu 	}
408*91f16700Schasinglulu }
409*91f16700Schasinglulu 
410*91f16700Schasinglulu #define MP_CPUSYS_TOP_LAST_COR_IDLE_DCM_REG0_MASK ((0x1U << 31))
411*91f16700Schasinglulu #define MP_CPUSYS_TOP_LAST_COR_IDLE_DCM_REG0_ON ((0x1U << 31))
412*91f16700Schasinglulu #define MP_CPUSYS_TOP_LAST_COR_IDLE_DCM_REG0_OFF ((0x0U << 31))
413*91f16700Schasinglulu 
414*91f16700Schasinglulu bool dcm_mp_cpusys_top_last_cor_idle_dcm_is_on(void)
415*91f16700Schasinglulu {
416*91f16700Schasinglulu 	bool ret = true;
417*91f16700Schasinglulu 
418*91f16700Schasinglulu 	ret &= ((mmio_read_32(BUS_PLLDIV_CFG) &
419*91f16700Schasinglulu 		MP_CPUSYS_TOP_LAST_COR_IDLE_DCM_REG0_MASK) ==
420*91f16700Schasinglulu 		(unsigned int) MP_CPUSYS_TOP_LAST_COR_IDLE_DCM_REG0_ON);
421*91f16700Schasinglulu 
422*91f16700Schasinglulu 	return ret;
423*91f16700Schasinglulu }
424*91f16700Schasinglulu 
425*91f16700Schasinglulu void dcm_mp_cpusys_top_last_cor_idle_dcm(bool on)
426*91f16700Schasinglulu {
427*91f16700Schasinglulu 	if (on) {
428*91f16700Schasinglulu 		/* TINFO = "Turn ON DCM 'mp_cpusys_top_last_cor_idle_dcm'" */
429*91f16700Schasinglulu 		mmio_clrsetbits_32(BUS_PLLDIV_CFG,
430*91f16700Schasinglulu 			MP_CPUSYS_TOP_LAST_COR_IDLE_DCM_REG0_MASK,
431*91f16700Schasinglulu 			MP_CPUSYS_TOP_LAST_COR_IDLE_DCM_REG0_ON);
432*91f16700Schasinglulu 	} else {
433*91f16700Schasinglulu 		/* TINFO = "Turn OFF DCM 'mp_cpusys_top_last_cor_idle_dcm'" */
434*91f16700Schasinglulu 		mmio_clrsetbits_32(BUS_PLLDIV_CFG,
435*91f16700Schasinglulu 			MP_CPUSYS_TOP_LAST_COR_IDLE_DCM_REG0_MASK,
436*91f16700Schasinglulu 			MP_CPUSYS_TOP_LAST_COR_IDLE_DCM_REG0_OFF);
437*91f16700Schasinglulu 	}
438*91f16700Schasinglulu }
439*91f16700Schasinglulu 
440*91f16700Schasinglulu #define MP_CPUSYS_TOP_MISC_DCM_REG0_MASK (BIT(1) | \
441*91f16700Schasinglulu 			BIT(4))
442*91f16700Schasinglulu #define MP_CPUSYS_TOP_MISC_DCM_REG0_ON (BIT(1) | \
443*91f16700Schasinglulu 			BIT(4))
444*91f16700Schasinglulu #define MP_CPUSYS_TOP_MISC_DCM_REG0_OFF ((0x0 << 1) | \
445*91f16700Schasinglulu 			(0x0 << 4))
446*91f16700Schasinglulu 
447*91f16700Schasinglulu bool dcm_mp_cpusys_top_misc_dcm_is_on(void)
448*91f16700Schasinglulu {
449*91f16700Schasinglulu 	bool ret = true;
450*91f16700Schasinglulu 
451*91f16700Schasinglulu 	ret &= ((mmio_read_32(MP_MISC_DCM_CFG0) &
452*91f16700Schasinglulu 		MP_CPUSYS_TOP_MISC_DCM_REG0_MASK) ==
453*91f16700Schasinglulu 		(unsigned int) MP_CPUSYS_TOP_MISC_DCM_REG0_ON);
454*91f16700Schasinglulu 
455*91f16700Schasinglulu 	return ret;
456*91f16700Schasinglulu }
457*91f16700Schasinglulu 
458*91f16700Schasinglulu void dcm_mp_cpusys_top_misc_dcm(bool on)
459*91f16700Schasinglulu {
460*91f16700Schasinglulu 	if (on) {
461*91f16700Schasinglulu 		/* TINFO = "Turn ON DCM 'mp_cpusys_top_misc_dcm'" */
462*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_MISC_DCM_CFG0,
463*91f16700Schasinglulu 			MP_CPUSYS_TOP_MISC_DCM_REG0_MASK,
464*91f16700Schasinglulu 			MP_CPUSYS_TOP_MISC_DCM_REG0_ON);
465*91f16700Schasinglulu 	} else {
466*91f16700Schasinglulu 		/* TINFO = "Turn OFF DCM 'mp_cpusys_top_misc_dcm'" */
467*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_MISC_DCM_CFG0,
468*91f16700Schasinglulu 			MP_CPUSYS_TOP_MISC_DCM_REG0_MASK,
469*91f16700Schasinglulu 			MP_CPUSYS_TOP_MISC_DCM_REG0_OFF);
470*91f16700Schasinglulu 	}
471*91f16700Schasinglulu }
472*91f16700Schasinglulu 
473*91f16700Schasinglulu #define MP_CPUSYS_TOP_MP0_QDCM_REG0_MASK (BIT(3))
474*91f16700Schasinglulu #define MP_CPUSYS_TOP_MP0_QDCM_REG1_MASK (BIT(0) | \
475*91f16700Schasinglulu 			BIT(1) | \
476*91f16700Schasinglulu 			BIT(2) | \
477*91f16700Schasinglulu 			BIT(3))
478*91f16700Schasinglulu #define MP_CPUSYS_TOP_MP0_QDCM_REG0_ON (BIT(3))
479*91f16700Schasinglulu #define MP_CPUSYS_TOP_MP0_QDCM_REG1_ON (BIT(0) | \
480*91f16700Schasinglulu 			BIT(1) | \
481*91f16700Schasinglulu 			BIT(2) | \
482*91f16700Schasinglulu 			BIT(3))
483*91f16700Schasinglulu #define MP_CPUSYS_TOP_MP0_QDCM_REG0_OFF ((0x0 << 3))
484*91f16700Schasinglulu #define MP_CPUSYS_TOP_MP0_QDCM_REG1_OFF ((0x0 << 0) | \
485*91f16700Schasinglulu 			(0x0 << 1) | \
486*91f16700Schasinglulu 			(0x0 << 2) | \
487*91f16700Schasinglulu 			(0x0 << 3))
488*91f16700Schasinglulu 
489*91f16700Schasinglulu bool dcm_mp_cpusys_top_mp0_qdcm_is_on(void)
490*91f16700Schasinglulu {
491*91f16700Schasinglulu 	bool ret = true;
492*91f16700Schasinglulu 
493*91f16700Schasinglulu 	ret &= ((mmio_read_32(MP_MISC_DCM_CFG0) &
494*91f16700Schasinglulu 		MP_CPUSYS_TOP_MP0_QDCM_REG0_MASK) ==
495*91f16700Schasinglulu 		(unsigned int) MP_CPUSYS_TOP_MP0_QDCM_REG0_ON);
496*91f16700Schasinglulu 	ret &= ((mmio_read_32(MP0_DCM_CFG0) &
497*91f16700Schasinglulu 		MP_CPUSYS_TOP_MP0_QDCM_REG1_MASK) ==
498*91f16700Schasinglulu 		(unsigned int) MP_CPUSYS_TOP_MP0_QDCM_REG1_ON);
499*91f16700Schasinglulu 
500*91f16700Schasinglulu 	return ret;
501*91f16700Schasinglulu }
502*91f16700Schasinglulu 
503*91f16700Schasinglulu void dcm_mp_cpusys_top_mp0_qdcm(bool on)
504*91f16700Schasinglulu {
505*91f16700Schasinglulu 	if (on) {
506*91f16700Schasinglulu 		/* TINFO = "Turn ON DCM 'mp_cpusys_top_mp0_qdcm'" */
507*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_MISC_DCM_CFG0,
508*91f16700Schasinglulu 			MP_CPUSYS_TOP_MP0_QDCM_REG0_MASK,
509*91f16700Schasinglulu 			MP_CPUSYS_TOP_MP0_QDCM_REG0_ON);
510*91f16700Schasinglulu 		mmio_clrsetbits_32(MP0_DCM_CFG0,
511*91f16700Schasinglulu 			MP_CPUSYS_TOP_MP0_QDCM_REG1_MASK,
512*91f16700Schasinglulu 			MP_CPUSYS_TOP_MP0_QDCM_REG1_ON);
513*91f16700Schasinglulu 	} else {
514*91f16700Schasinglulu 		/* TINFO = "Turn OFF DCM 'mp_cpusys_top_mp0_qdcm'" */
515*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_MISC_DCM_CFG0,
516*91f16700Schasinglulu 			MP_CPUSYS_TOP_MP0_QDCM_REG0_MASK,
517*91f16700Schasinglulu 			MP_CPUSYS_TOP_MP0_QDCM_REG0_OFF);
518*91f16700Schasinglulu 		mmio_clrsetbits_32(MP0_DCM_CFG0,
519*91f16700Schasinglulu 			MP_CPUSYS_TOP_MP0_QDCM_REG1_MASK,
520*91f16700Schasinglulu 			MP_CPUSYS_TOP_MP0_QDCM_REG1_OFF);
521*91f16700Schasinglulu 	}
522*91f16700Schasinglulu }
523*91f16700Schasinglulu 
524*91f16700Schasinglulu #define CPCCFG_REG_EMI_WFIFO_REG0_MASK (BIT(0) | \
525*91f16700Schasinglulu 			BIT(1) | \
526*91f16700Schasinglulu 			BIT(2) | \
527*91f16700Schasinglulu 			BIT(3))
528*91f16700Schasinglulu #define CPCCFG_REG_EMI_WFIFO_REG0_ON (BIT(0) | \
529*91f16700Schasinglulu 			BIT(1) | \
530*91f16700Schasinglulu 			BIT(2) | \
531*91f16700Schasinglulu 			BIT(3))
532*91f16700Schasinglulu #define CPCCFG_REG_EMI_WFIFO_REG0_OFF ((0x0 << 0) | \
533*91f16700Schasinglulu 			(0x0 << 1) | \
534*91f16700Schasinglulu 			(0x0 << 2) | \
535*91f16700Schasinglulu 			(0x0 << 3))
536*91f16700Schasinglulu 
537*91f16700Schasinglulu bool dcm_cpccfg_reg_emi_wfifo_is_on(void)
538*91f16700Schasinglulu {
539*91f16700Schasinglulu 	bool ret = true;
540*91f16700Schasinglulu 
541*91f16700Schasinglulu 	ret &= ((mmio_read_32(EMI_WFIFO) &
542*91f16700Schasinglulu 		CPCCFG_REG_EMI_WFIFO_REG0_MASK) ==
543*91f16700Schasinglulu 		(unsigned int) CPCCFG_REG_EMI_WFIFO_REG0_ON);
544*91f16700Schasinglulu 
545*91f16700Schasinglulu 	return ret;
546*91f16700Schasinglulu }
547*91f16700Schasinglulu 
548*91f16700Schasinglulu void dcm_cpccfg_reg_emi_wfifo(bool on)
549*91f16700Schasinglulu {
550*91f16700Schasinglulu 	if (on) {
551*91f16700Schasinglulu 		/* TINFO = "Turn ON DCM 'cpccfg_reg_emi_wfifo'" */
552*91f16700Schasinglulu 		mmio_clrsetbits_32(EMI_WFIFO,
553*91f16700Schasinglulu 			CPCCFG_REG_EMI_WFIFO_REG0_MASK,
554*91f16700Schasinglulu 			CPCCFG_REG_EMI_WFIFO_REG0_ON);
555*91f16700Schasinglulu 	} else {
556*91f16700Schasinglulu 		/* TINFO = "Turn OFF DCM 'cpccfg_reg_emi_wfifo'" */
557*91f16700Schasinglulu 		mmio_clrsetbits_32(EMI_WFIFO,
558*91f16700Schasinglulu 			CPCCFG_REG_EMI_WFIFO_REG0_MASK,
559*91f16700Schasinglulu 			CPCCFG_REG_EMI_WFIFO_REG0_OFF);
560*91f16700Schasinglulu 	}
561*91f16700Schasinglulu }
562*91f16700Schasinglulu 
563