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