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