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