xref: /arm-trusted-firmware/plat/mediatek/mt8195/drivers/dcm/mtk_dcm_utils.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2021, 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_CPUSYS_TOP_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_CPUSYS_TOP_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(MP_CPUSYS_TOP_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_CPUSYS_TOP_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_CPUSYS_TOP_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(MP_CPUSYS_TOP_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_CPUSYS_TOP_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_CPUSYS_TOP_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(MP_CPUSYS_TOP_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_CPUSYS_TOP_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(MP_CPUSYS_TOP_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(MP_CPUSYS_TOP_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_CPUSYS_TOP_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(MP_CPUSYS_TOP_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(MP_CPUSYS_TOP_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_CPUSYS_TOP_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(MP_CPUSYS_TOP_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(MP_CPUSYS_TOP_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 			BIT(24) | \
142*91f16700Schasinglulu 			BIT(25))
143*91f16700Schasinglulu #define MP_CPUSYS_TOP_BUS_PLL_DIV_DCM_REG0_ON (BIT(11) | \
144*91f16700Schasinglulu 			BIT(24) | \
145*91f16700Schasinglulu 			BIT(25))
146*91f16700Schasinglulu #define MP_CPUSYS_TOP_BUS_PLL_DIV_DCM_REG0_OFF ((0x0 << 11) | \
147*91f16700Schasinglulu 			(0x0 << 24) | \
148*91f16700Schasinglulu 			(0x0 << 25))
149*91f16700Schasinglulu 
150*91f16700Schasinglulu bool dcm_mp_cpusys_top_bus_pll_div_dcm_is_on(void)
151*91f16700Schasinglulu {
152*91f16700Schasinglulu 	bool ret = true;
153*91f16700Schasinglulu 
154*91f16700Schasinglulu 	ret &= ((mmio_read_32(MP_CPUSYS_TOP_BUS_PLLDIV_CFG) &
155*91f16700Schasinglulu 		MP_CPUSYS_TOP_BUS_PLL_DIV_DCM_REG0_MASK) ==
156*91f16700Schasinglulu 		(unsigned int) MP_CPUSYS_TOP_BUS_PLL_DIV_DCM_REG0_ON);
157*91f16700Schasinglulu 
158*91f16700Schasinglulu 	return ret;
159*91f16700Schasinglulu }
160*91f16700Schasinglulu 
161*91f16700Schasinglulu void dcm_mp_cpusys_top_bus_pll_div_dcm(bool on)
162*91f16700Schasinglulu {
163*91f16700Schasinglulu 	if (on) {
164*91f16700Schasinglulu 		/* TINFO = "Turn ON DCM 'mp_cpusys_top_bus_pll_div_dcm'" */
165*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_BUS_PLLDIV_CFG,
166*91f16700Schasinglulu 			MP_CPUSYS_TOP_BUS_PLL_DIV_DCM_REG0_MASK,
167*91f16700Schasinglulu 			MP_CPUSYS_TOP_BUS_PLL_DIV_DCM_REG0_ON);
168*91f16700Schasinglulu 	} else {
169*91f16700Schasinglulu 		/* TINFO = "Turn OFF DCM 'mp_cpusys_top_bus_pll_div_dcm'" */
170*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_BUS_PLLDIV_CFG,
171*91f16700Schasinglulu 			MP_CPUSYS_TOP_BUS_PLL_DIV_DCM_REG0_MASK,
172*91f16700Schasinglulu 			MP_CPUSYS_TOP_BUS_PLL_DIV_DCM_REG0_OFF);
173*91f16700Schasinglulu 	}
174*91f16700Schasinglulu }
175*91f16700Schasinglulu 
176*91f16700Schasinglulu #define MP_CPUSYS_TOP_CORE_STALL_DCM_REG0_MASK (BIT(0))
177*91f16700Schasinglulu #define MP_CPUSYS_TOP_CORE_STALL_DCM_REG0_ON (BIT(0))
178*91f16700Schasinglulu #define MP_CPUSYS_TOP_CORE_STALL_DCM_REG0_OFF ((0x0 << 0))
179*91f16700Schasinglulu 
180*91f16700Schasinglulu bool dcm_mp_cpusys_top_core_stall_dcm_is_on(void)
181*91f16700Schasinglulu {
182*91f16700Schasinglulu 	bool ret = true;
183*91f16700Schasinglulu 
184*91f16700Schasinglulu 	ret &= ((mmio_read_32(MP_CPUSYS_TOP_MP0_DCM_CFG7) &
185*91f16700Schasinglulu 		MP_CPUSYS_TOP_CORE_STALL_DCM_REG0_MASK) ==
186*91f16700Schasinglulu 		(unsigned int) MP_CPUSYS_TOP_CORE_STALL_DCM_REG0_ON);
187*91f16700Schasinglulu 
188*91f16700Schasinglulu 	return ret;
189*91f16700Schasinglulu }
190*91f16700Schasinglulu 
191*91f16700Schasinglulu void dcm_mp_cpusys_top_core_stall_dcm(bool on)
192*91f16700Schasinglulu {
193*91f16700Schasinglulu 	if (on) {
194*91f16700Schasinglulu 		/* TINFO = "Turn ON DCM 'mp_cpusys_top_core_stall_dcm'" */
195*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_MP0_DCM_CFG7,
196*91f16700Schasinglulu 			MP_CPUSYS_TOP_CORE_STALL_DCM_REG0_MASK,
197*91f16700Schasinglulu 			MP_CPUSYS_TOP_CORE_STALL_DCM_REG0_ON);
198*91f16700Schasinglulu 	} else {
199*91f16700Schasinglulu 		/* TINFO = "Turn OFF DCM 'mp_cpusys_top_core_stall_dcm'" */
200*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_MP0_DCM_CFG7,
201*91f16700Schasinglulu 			MP_CPUSYS_TOP_CORE_STALL_DCM_REG0_MASK,
202*91f16700Schasinglulu 			MP_CPUSYS_TOP_CORE_STALL_DCM_REG0_OFF);
203*91f16700Schasinglulu 	}
204*91f16700Schasinglulu }
205*91f16700Schasinglulu 
206*91f16700Schasinglulu #define MP_CPUSYS_TOP_CPUBIU_DCM_REG0_MASK ((0xffff << 0))
207*91f16700Schasinglulu #define MP_CPUSYS_TOP_CPUBIU_DCM_REG0_ON ((0xffff << 0))
208*91f16700Schasinglulu #define MP_CPUSYS_TOP_CPUBIU_DCM_REG0_OFF ((0x0 << 0))
209*91f16700Schasinglulu 
210*91f16700Schasinglulu bool dcm_mp_cpusys_top_cpubiu_dcm_is_on(void)
211*91f16700Schasinglulu {
212*91f16700Schasinglulu 	bool ret = true;
213*91f16700Schasinglulu 
214*91f16700Schasinglulu 	ret &= ((mmio_read_32(MP_CPUSYS_TOP_MCSIC_DCM0) &
215*91f16700Schasinglulu 		MP_CPUSYS_TOP_CPUBIU_DCM_REG0_MASK) ==
216*91f16700Schasinglulu 		(unsigned int) MP_CPUSYS_TOP_CPUBIU_DCM_REG0_ON);
217*91f16700Schasinglulu 
218*91f16700Schasinglulu 	return ret;
219*91f16700Schasinglulu }
220*91f16700Schasinglulu 
221*91f16700Schasinglulu void dcm_mp_cpusys_top_cpubiu_dcm(bool on)
222*91f16700Schasinglulu {
223*91f16700Schasinglulu 	if (on) {
224*91f16700Schasinglulu 		/* TINFO = "Turn ON DCM 'mp_cpusys_top_cpubiu_dcm'" */
225*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_MCSIC_DCM0,
226*91f16700Schasinglulu 			MP_CPUSYS_TOP_CPUBIU_DCM_REG0_MASK,
227*91f16700Schasinglulu 			MP_CPUSYS_TOP_CPUBIU_DCM_REG0_ON);
228*91f16700Schasinglulu 	} else {
229*91f16700Schasinglulu 		/* TINFO = "Turn OFF DCM 'mp_cpusys_top_cpubiu_dcm'" */
230*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_MCSIC_DCM0,
231*91f16700Schasinglulu 			MP_CPUSYS_TOP_CPUBIU_DCM_REG0_MASK,
232*91f16700Schasinglulu 			MP_CPUSYS_TOP_CPUBIU_DCM_REG0_OFF);
233*91f16700Schasinglulu 	}
234*91f16700Schasinglulu }
235*91f16700Schasinglulu 
236*91f16700Schasinglulu #define MP_CPUSYS_TOP_CPU_PLL_DIV_0_DCM_REG0_MASK (BIT(24) | \
237*91f16700Schasinglulu 			BIT(25))
238*91f16700Schasinglulu #define MP_CPUSYS_TOP_CPU_PLL_DIV_0_DCM_REG0_ON (BIT(24) | \
239*91f16700Schasinglulu 			BIT(25))
240*91f16700Schasinglulu #define MP_CPUSYS_TOP_CPU_PLL_DIV_0_DCM_REG0_OFF ((0x0 << 24) | \
241*91f16700Schasinglulu 			(0x0 << 25))
242*91f16700Schasinglulu 
243*91f16700Schasinglulu bool dcm_mp_cpusys_top_cpu_pll_div_0_dcm_is_on(void)
244*91f16700Schasinglulu {
245*91f16700Schasinglulu 	bool ret = true;
246*91f16700Schasinglulu 
247*91f16700Schasinglulu 	ret &= ((mmio_read_32(MP_CPUSYS_TOP_CPU_PLLDIV_CFG0) &
248*91f16700Schasinglulu 		MP_CPUSYS_TOP_CPU_PLL_DIV_0_DCM_REG0_MASK) ==
249*91f16700Schasinglulu 		(unsigned int) MP_CPUSYS_TOP_CPU_PLL_DIV_0_DCM_REG0_ON);
250*91f16700Schasinglulu 
251*91f16700Schasinglulu 	return ret;
252*91f16700Schasinglulu }
253*91f16700Schasinglulu 
254*91f16700Schasinglulu void dcm_mp_cpusys_top_cpu_pll_div_0_dcm(bool on)
255*91f16700Schasinglulu {
256*91f16700Schasinglulu 	if (on) {
257*91f16700Schasinglulu 		/* TINFO = "Turn ON DCM 'mp_cpusys_top_cpu_pll_div_0_dcm'" */
258*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_CPU_PLLDIV_CFG0,
259*91f16700Schasinglulu 			MP_CPUSYS_TOP_CPU_PLL_DIV_0_DCM_REG0_MASK,
260*91f16700Schasinglulu 			MP_CPUSYS_TOP_CPU_PLL_DIV_0_DCM_REG0_ON);
261*91f16700Schasinglulu 	} else {
262*91f16700Schasinglulu 		/* TINFO = "Turn OFF DCM 'mp_cpusys_top_cpu_pll_div_0_dcm'" */
263*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_CPU_PLLDIV_CFG0,
264*91f16700Schasinglulu 			MP_CPUSYS_TOP_CPU_PLL_DIV_0_DCM_REG0_MASK,
265*91f16700Schasinglulu 			MP_CPUSYS_TOP_CPU_PLL_DIV_0_DCM_REG0_OFF);
266*91f16700Schasinglulu 	}
267*91f16700Schasinglulu }
268*91f16700Schasinglulu 
269*91f16700Schasinglulu #define MP_CPUSYS_TOP_CPU_PLL_DIV_1_DCM_REG0_MASK (BIT(24) | \
270*91f16700Schasinglulu 			BIT(25))
271*91f16700Schasinglulu #define MP_CPUSYS_TOP_CPU_PLL_DIV_1_DCM_REG0_ON (BIT(24) | \
272*91f16700Schasinglulu 			BIT(25))
273*91f16700Schasinglulu #define MP_CPUSYS_TOP_CPU_PLL_DIV_1_DCM_REG0_OFF ((0x0 << 24) | \
274*91f16700Schasinglulu 			(0x0 << 25))
275*91f16700Schasinglulu 
276*91f16700Schasinglulu bool dcm_mp_cpusys_top_cpu_pll_div_1_dcm_is_on(void)
277*91f16700Schasinglulu {
278*91f16700Schasinglulu 	bool ret = true;
279*91f16700Schasinglulu 
280*91f16700Schasinglulu 	ret &= ((mmio_read_32(MP_CPUSYS_TOP_CPU_PLLDIV_CFG1) &
281*91f16700Schasinglulu 		MP_CPUSYS_TOP_CPU_PLL_DIV_1_DCM_REG0_MASK) ==
282*91f16700Schasinglulu 		(unsigned int) MP_CPUSYS_TOP_CPU_PLL_DIV_1_DCM_REG0_ON);
283*91f16700Schasinglulu 
284*91f16700Schasinglulu 	return ret;
285*91f16700Schasinglulu }
286*91f16700Schasinglulu 
287*91f16700Schasinglulu void dcm_mp_cpusys_top_cpu_pll_div_1_dcm(bool on)
288*91f16700Schasinglulu {
289*91f16700Schasinglulu 	if (on) {
290*91f16700Schasinglulu 		/* TINFO = "Turn ON DCM 'mp_cpusys_top_cpu_pll_div_1_dcm'" */
291*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_CPU_PLLDIV_CFG1,
292*91f16700Schasinglulu 			MP_CPUSYS_TOP_CPU_PLL_DIV_1_DCM_REG0_MASK,
293*91f16700Schasinglulu 			MP_CPUSYS_TOP_CPU_PLL_DIV_1_DCM_REG0_ON);
294*91f16700Schasinglulu 	} else {
295*91f16700Schasinglulu 		/* TINFO = "Turn OFF DCM 'mp_cpusys_top_cpu_pll_div_1_dcm'" */
296*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_CPU_PLLDIV_CFG1,
297*91f16700Schasinglulu 			MP_CPUSYS_TOP_CPU_PLL_DIV_1_DCM_REG0_MASK,
298*91f16700Schasinglulu 			MP_CPUSYS_TOP_CPU_PLL_DIV_1_DCM_REG0_OFF);
299*91f16700Schasinglulu 	}
300*91f16700Schasinglulu }
301*91f16700Schasinglulu 
302*91f16700Schasinglulu #define MP_CPUSYS_TOP_FCM_STALL_DCM_REG0_MASK (BIT(4))
303*91f16700Schasinglulu #define MP_CPUSYS_TOP_FCM_STALL_DCM_REG0_ON (BIT(4))
304*91f16700Schasinglulu #define MP_CPUSYS_TOP_FCM_STALL_DCM_REG0_OFF ((0x0 << 4))
305*91f16700Schasinglulu 
306*91f16700Schasinglulu bool dcm_mp_cpusys_top_fcm_stall_dcm_is_on(void)
307*91f16700Schasinglulu {
308*91f16700Schasinglulu 	bool ret = true;
309*91f16700Schasinglulu 
310*91f16700Schasinglulu 	ret &= ((mmio_read_32(MP_CPUSYS_TOP_MP0_DCM_CFG7) &
311*91f16700Schasinglulu 		MP_CPUSYS_TOP_FCM_STALL_DCM_REG0_MASK) ==
312*91f16700Schasinglulu 		(unsigned int) MP_CPUSYS_TOP_FCM_STALL_DCM_REG0_ON);
313*91f16700Schasinglulu 
314*91f16700Schasinglulu 	return ret;
315*91f16700Schasinglulu }
316*91f16700Schasinglulu 
317*91f16700Schasinglulu void dcm_mp_cpusys_top_fcm_stall_dcm(bool on)
318*91f16700Schasinglulu {
319*91f16700Schasinglulu 	if (on) {
320*91f16700Schasinglulu 		/* TINFO = "Turn ON DCM 'mp_cpusys_top_fcm_stall_dcm'" */
321*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_MP0_DCM_CFG7,
322*91f16700Schasinglulu 			MP_CPUSYS_TOP_FCM_STALL_DCM_REG0_MASK,
323*91f16700Schasinglulu 			MP_CPUSYS_TOP_FCM_STALL_DCM_REG0_ON);
324*91f16700Schasinglulu 	} else {
325*91f16700Schasinglulu 		/* TINFO = "Turn OFF DCM 'mp_cpusys_top_fcm_stall_dcm'" */
326*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_MP0_DCM_CFG7,
327*91f16700Schasinglulu 			MP_CPUSYS_TOP_FCM_STALL_DCM_REG0_MASK,
328*91f16700Schasinglulu 			MP_CPUSYS_TOP_FCM_STALL_DCM_REG0_OFF);
329*91f16700Schasinglulu 	}
330*91f16700Schasinglulu }
331*91f16700Schasinglulu 
332*91f16700Schasinglulu #define MP_CPUSYS_TOP_LAST_COR_IDLE_DCM_REG0_MASK ((0x1U << 31))
333*91f16700Schasinglulu #define MP_CPUSYS_TOP_LAST_COR_IDLE_DCM_REG0_ON ((0x1U << 31))
334*91f16700Schasinglulu #define MP_CPUSYS_TOP_LAST_COR_IDLE_DCM_REG0_OFF ((0x0U << 31))
335*91f16700Schasinglulu 
336*91f16700Schasinglulu bool dcm_mp_cpusys_top_last_cor_idle_dcm_is_on(void)
337*91f16700Schasinglulu {
338*91f16700Schasinglulu 	bool ret = true;
339*91f16700Schasinglulu 
340*91f16700Schasinglulu 	ret &= ((mmio_read_32(MP_CPUSYS_TOP_BUS_PLLDIV_CFG) &
341*91f16700Schasinglulu 		MP_CPUSYS_TOP_LAST_COR_IDLE_DCM_REG0_MASK) ==
342*91f16700Schasinglulu 		(unsigned int) MP_CPUSYS_TOP_LAST_COR_IDLE_DCM_REG0_ON);
343*91f16700Schasinglulu 
344*91f16700Schasinglulu 	return ret;
345*91f16700Schasinglulu }
346*91f16700Schasinglulu 
347*91f16700Schasinglulu void dcm_mp_cpusys_top_last_cor_idle_dcm(bool on)
348*91f16700Schasinglulu {
349*91f16700Schasinglulu 	if (on) {
350*91f16700Schasinglulu 		/* TINFO = "Turn ON DCM 'mp_cpusys_top_last_cor_idle_dcm'" */
351*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_BUS_PLLDIV_CFG,
352*91f16700Schasinglulu 			MP_CPUSYS_TOP_LAST_COR_IDLE_DCM_REG0_MASK,
353*91f16700Schasinglulu 			MP_CPUSYS_TOP_LAST_COR_IDLE_DCM_REG0_ON);
354*91f16700Schasinglulu 	} else {
355*91f16700Schasinglulu 		/* TINFO = "Turn OFF DCM 'mp_cpusys_top_last_cor_idle_dcm'" */
356*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_BUS_PLLDIV_CFG,
357*91f16700Schasinglulu 			MP_CPUSYS_TOP_LAST_COR_IDLE_DCM_REG0_MASK,
358*91f16700Schasinglulu 			MP_CPUSYS_TOP_LAST_COR_IDLE_DCM_REG0_OFF);
359*91f16700Schasinglulu 	}
360*91f16700Schasinglulu }
361*91f16700Schasinglulu 
362*91f16700Schasinglulu #define MP_CPUSYS_TOP_MISC_DCM_REG0_MASK (BIT(1) | \
363*91f16700Schasinglulu 			BIT(4))
364*91f16700Schasinglulu #define MP_CPUSYS_TOP_MISC_DCM_REG0_ON (BIT(1) | \
365*91f16700Schasinglulu 			BIT(4))
366*91f16700Schasinglulu #define MP_CPUSYS_TOP_MISC_DCM_REG0_OFF ((0x0 << 1) | \
367*91f16700Schasinglulu 			(0x0 << 4))
368*91f16700Schasinglulu 
369*91f16700Schasinglulu bool dcm_mp_cpusys_top_misc_dcm_is_on(void)
370*91f16700Schasinglulu {
371*91f16700Schasinglulu 	bool ret = true;
372*91f16700Schasinglulu 
373*91f16700Schasinglulu 	ret &= ((mmio_read_32(MP_CPUSYS_TOP_MP_MISC_DCM_CFG0) &
374*91f16700Schasinglulu 		MP_CPUSYS_TOP_MISC_DCM_REG0_MASK) ==
375*91f16700Schasinglulu 		(unsigned int) MP_CPUSYS_TOP_MISC_DCM_REG0_ON);
376*91f16700Schasinglulu 
377*91f16700Schasinglulu 	return ret;
378*91f16700Schasinglulu }
379*91f16700Schasinglulu 
380*91f16700Schasinglulu void dcm_mp_cpusys_top_misc_dcm(bool on)
381*91f16700Schasinglulu {
382*91f16700Schasinglulu 	if (on) {
383*91f16700Schasinglulu 		/* TINFO = "Turn ON DCM 'mp_cpusys_top_misc_dcm'" */
384*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_MP_MISC_DCM_CFG0,
385*91f16700Schasinglulu 			MP_CPUSYS_TOP_MISC_DCM_REG0_MASK,
386*91f16700Schasinglulu 			MP_CPUSYS_TOP_MISC_DCM_REG0_ON);
387*91f16700Schasinglulu 	} else {
388*91f16700Schasinglulu 		/* TINFO = "Turn OFF DCM 'mp_cpusys_top_misc_dcm'" */
389*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_MP_MISC_DCM_CFG0,
390*91f16700Schasinglulu 			MP_CPUSYS_TOP_MISC_DCM_REG0_MASK,
391*91f16700Schasinglulu 			MP_CPUSYS_TOP_MISC_DCM_REG0_OFF);
392*91f16700Schasinglulu 	}
393*91f16700Schasinglulu }
394*91f16700Schasinglulu 
395*91f16700Schasinglulu #define MP_CPUSYS_TOP_MP0_QDCM_REG0_MASK (BIT(3))
396*91f16700Schasinglulu #define MP_CPUSYS_TOP_MP0_QDCM_REG1_MASK (BIT(0) | \
397*91f16700Schasinglulu 			BIT(1) | \
398*91f16700Schasinglulu 			BIT(2) | \
399*91f16700Schasinglulu 			BIT(3))
400*91f16700Schasinglulu #define MP_CPUSYS_TOP_MP0_QDCM_REG0_ON (BIT(3))
401*91f16700Schasinglulu #define MP_CPUSYS_TOP_MP0_QDCM_REG1_ON (BIT(0) | \
402*91f16700Schasinglulu 			BIT(1) | \
403*91f16700Schasinglulu 			BIT(2) | \
404*91f16700Schasinglulu 			BIT(3))
405*91f16700Schasinglulu #define MP_CPUSYS_TOP_MP0_QDCM_REG0_OFF ((0x0 << 3))
406*91f16700Schasinglulu #define MP_CPUSYS_TOP_MP0_QDCM_REG1_OFF ((0x0 << 0) | \
407*91f16700Schasinglulu 			(0x0 << 1) | \
408*91f16700Schasinglulu 			(0x0 << 2) | \
409*91f16700Schasinglulu 			(0x0 << 3))
410*91f16700Schasinglulu 
411*91f16700Schasinglulu bool dcm_mp_cpusys_top_mp0_qdcm_is_on(void)
412*91f16700Schasinglulu {
413*91f16700Schasinglulu 	bool ret = true;
414*91f16700Schasinglulu 
415*91f16700Schasinglulu 	ret &= ((mmio_read_32(MP_CPUSYS_TOP_MP_MISC_DCM_CFG0) &
416*91f16700Schasinglulu 		MP_CPUSYS_TOP_MP0_QDCM_REG0_MASK) ==
417*91f16700Schasinglulu 		(unsigned int) MP_CPUSYS_TOP_MP0_QDCM_REG0_ON);
418*91f16700Schasinglulu 	ret &= ((mmio_read_32(MP_CPUSYS_TOP_MP0_DCM_CFG0) &
419*91f16700Schasinglulu 		MP_CPUSYS_TOP_MP0_QDCM_REG1_MASK) ==
420*91f16700Schasinglulu 		(unsigned int) MP_CPUSYS_TOP_MP0_QDCM_REG1_ON);
421*91f16700Schasinglulu 
422*91f16700Schasinglulu 	return ret;
423*91f16700Schasinglulu }
424*91f16700Schasinglulu 
425*91f16700Schasinglulu void dcm_mp_cpusys_top_mp0_qdcm(bool on)
426*91f16700Schasinglulu {
427*91f16700Schasinglulu 	if (on) {
428*91f16700Schasinglulu 		/* TINFO = "Turn ON DCM 'mp_cpusys_top_mp0_qdcm'" */
429*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_MP_MISC_DCM_CFG0,
430*91f16700Schasinglulu 			MP_CPUSYS_TOP_MP0_QDCM_REG0_MASK,
431*91f16700Schasinglulu 			MP_CPUSYS_TOP_MP0_QDCM_REG0_ON);
432*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_MP0_DCM_CFG0,
433*91f16700Schasinglulu 			MP_CPUSYS_TOP_MP0_QDCM_REG1_MASK,
434*91f16700Schasinglulu 			MP_CPUSYS_TOP_MP0_QDCM_REG1_ON);
435*91f16700Schasinglulu 	} else {
436*91f16700Schasinglulu 		/* TINFO = "Turn OFF DCM 'mp_cpusys_top_mp0_qdcm'" */
437*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_MP_MISC_DCM_CFG0,
438*91f16700Schasinglulu 			MP_CPUSYS_TOP_MP0_QDCM_REG0_MASK,
439*91f16700Schasinglulu 			MP_CPUSYS_TOP_MP0_QDCM_REG0_OFF);
440*91f16700Schasinglulu 		mmio_clrsetbits_32(MP_CPUSYS_TOP_MP0_DCM_CFG0,
441*91f16700Schasinglulu 			MP_CPUSYS_TOP_MP0_QDCM_REG1_MASK,
442*91f16700Schasinglulu 			MP_CPUSYS_TOP_MP0_QDCM_REG1_OFF);
443*91f16700Schasinglulu 	}
444*91f16700Schasinglulu }
445*91f16700Schasinglulu 
446*91f16700Schasinglulu #define CPCCFG_REG_EMI_WFIFO_REG0_MASK (BIT(0) | \
447*91f16700Schasinglulu 			BIT(1) | \
448*91f16700Schasinglulu 			BIT(2) | \
449*91f16700Schasinglulu 			BIT(3))
450*91f16700Schasinglulu #define CPCCFG_REG_EMI_WFIFO_REG0_ON (BIT(0) | \
451*91f16700Schasinglulu 			BIT(1) | \
452*91f16700Schasinglulu 			BIT(2) | \
453*91f16700Schasinglulu 			BIT(3))
454*91f16700Schasinglulu #define CPCCFG_REG_EMI_WFIFO_REG0_OFF ((0x0 << 0) | \
455*91f16700Schasinglulu 			(0x0 << 1) | \
456*91f16700Schasinglulu 			(0x0 << 2) | \
457*91f16700Schasinglulu 			(0x0 << 3))
458*91f16700Schasinglulu 
459*91f16700Schasinglulu bool dcm_cpccfg_reg_emi_wfifo_is_on(void)
460*91f16700Schasinglulu {
461*91f16700Schasinglulu 	bool ret = true;
462*91f16700Schasinglulu 
463*91f16700Schasinglulu 	ret &= ((mmio_read_32(CPCCFG_REG_EMI_WFIFO) &
464*91f16700Schasinglulu 		CPCCFG_REG_EMI_WFIFO_REG0_MASK) ==
465*91f16700Schasinglulu 		(unsigned int) CPCCFG_REG_EMI_WFIFO_REG0_ON);
466*91f16700Schasinglulu 
467*91f16700Schasinglulu 	return ret;
468*91f16700Schasinglulu }
469*91f16700Schasinglulu 
470*91f16700Schasinglulu void dcm_cpccfg_reg_emi_wfifo(bool on)
471*91f16700Schasinglulu {
472*91f16700Schasinglulu 	if (on) {
473*91f16700Schasinglulu 		/* TINFO = "Turn ON DCM 'cpccfg_reg_emi_wfifo'" */
474*91f16700Schasinglulu 		mmio_clrsetbits_32(CPCCFG_REG_EMI_WFIFO,
475*91f16700Schasinglulu 			CPCCFG_REG_EMI_WFIFO_REG0_MASK,
476*91f16700Schasinglulu 			CPCCFG_REG_EMI_WFIFO_REG0_ON);
477*91f16700Schasinglulu 	} else {
478*91f16700Schasinglulu 		/* TINFO = "Turn OFF DCM 'cpccfg_reg_emi_wfifo'" */
479*91f16700Schasinglulu 		mmio_clrsetbits_32(CPCCFG_REG_EMI_WFIFO,
480*91f16700Schasinglulu 			CPCCFG_REG_EMI_WFIFO_REG0_MASK,
481*91f16700Schasinglulu 			CPCCFG_REG_EMI_WFIFO_REG0_OFF);
482*91f16700Schasinglulu 	}
483*91f16700Schasinglulu }
484