1*7352f329Skenny liang /* 2*7352f329Skenny liang * Copyright (c) 2019, MediaTek Inc. All rights reserved. 3*7352f329Skenny liang * 4*7352f329Skenny liang * SPDX-License-Identifier: BSD-3-Clause 5*7352f329Skenny liang */ 6*7352f329Skenny liang 7*7352f329Skenny liang #include <assert.h> 8*7352f329Skenny liang #include <arch_helpers.h> 9*7352f329Skenny liang #include <cortex_a53.h> 10*7352f329Skenny liang #include <cortex_a73.h> 11*7352f329Skenny liang #include <common/debug.h> 12*7352f329Skenny liang #include <lib/mmio.h> 13*7352f329Skenny liang #include <platform_def.h> 14*7352f329Skenny liang #include <mcucfg.h> 15*7352f329Skenny liang #include <spm.h> 16*7352f329Skenny liang #include <drivers/delay_timer.h> 17*7352f329Skenny liang #include <mtspmc.h> 18*7352f329Skenny liang 19*7352f329Skenny liang #include "mtspmc_private.h" 20*7352f329Skenny liang 21*7352f329Skenny liang 22*7352f329Skenny liang static void set_retention(int cluster, int tick) 23*7352f329Skenny liang { 24*7352f329Skenny liang uint64_t cpuectlr; 25*7352f329Skenny liang 26*7352f329Skenny liang if (cluster) 27*7352f329Skenny liang cpuectlr = read_a73_cpuectlr_el1(); 28*7352f329Skenny liang else 29*7352f329Skenny liang cpuectlr = read_a53_cpuectlr_el1(); 30*7352f329Skenny liang 31*7352f329Skenny liang cpuectlr &= ~0x7ULL; 32*7352f329Skenny liang cpuectlr |= tick & 0x7; 33*7352f329Skenny liang 34*7352f329Skenny liang if (cluster) 35*7352f329Skenny liang write_a73_cpuectlr_el1(cpuectlr); 36*7352f329Skenny liang else 37*7352f329Skenny liang write_a53_cpuectlr_el1(cpuectlr); 38*7352f329Skenny liang } 39*7352f329Skenny liang 40*7352f329Skenny liang void spm_enable_cpu_auto_off(int cluster, int cpu) 41*7352f329Skenny liang { 42*7352f329Skenny liang uintptr_t reg = per_cpu(cluster, cpu, MCUCFG_SPARK); 43*7352f329Skenny liang 44*7352f329Skenny liang set_retention(cluster, 1); 45*7352f329Skenny liang mmio_clrbits_32(reg, SW_NO_WAIT_Q); 46*7352f329Skenny liang } 47*7352f329Skenny liang 48*7352f329Skenny liang void spm_disable_cpu_auto_off(int cluster, int cpu) 49*7352f329Skenny liang { 50*7352f329Skenny liang uintptr_t reg = per_cpu(cluster, cpu, MCUCFG_SPARK); 51*7352f329Skenny liang 52*7352f329Skenny liang mmio_setbits_32(reg, SW_NO_WAIT_Q); 53*7352f329Skenny liang set_retention(cluster, 0); 54*7352f329Skenny liang } 55*7352f329Skenny liang 56*7352f329Skenny liang void spm_set_cpu_power_off(int cluster, int cpu) 57*7352f329Skenny liang { 58*7352f329Skenny liang mmio_clrbits_32(per_cpu(cluster, cpu, SPM_CPU_PWR), PWRCTRL_PWR_ON); 59*7352f329Skenny liang } 60*7352f329Skenny liang 61*7352f329Skenny liang void spm_enable_cluster_auto_off(int cluster) 62*7352f329Skenny liang { 63*7352f329Skenny liang assert(cluster); 64*7352f329Skenny liang 65*7352f329Skenny liang mmio_clrbits_32(MCUCFG_MP2_SPMC, SW_NO_WAIT_Q); 66*7352f329Skenny liang mmio_clrbits_32(MCUCFG_MP2_COQ, BIT(0)); 67*7352f329Skenny liang 68*7352f329Skenny liang mmio_clrbits_32(SPM_SPMC_DORMANT_ENABLE, MP1_SPMC_SRAM_DORMANT_EN); 69*7352f329Skenny liang 70*7352f329Skenny liang mmio_clrbits_32(per_cluster(cluster, SPM_CLUSTER_PWR), PWRCTRL_PWR_ON); 71*7352f329Skenny liang } 72*7352f329Skenny liang 73*7352f329Skenny liang void mcucfg_set_bootaddr(int cluster, int cpu, uintptr_t bootaddr) 74*7352f329Skenny liang { 75*7352f329Skenny liang uintptr_t reg; 76*7352f329Skenny liang const uintptr_t mp2_bootreg[] = { 77*7352f329Skenny liang MCUCFG_MP2_RVADDR0, MCUCFG_MP2_RVADDR1, 78*7352f329Skenny liang MCUCFG_MP2_RVADDR2, MCUCFG_MP2_RVADDR3 }; 79*7352f329Skenny liang 80*7352f329Skenny liang if (cluster) { 81*7352f329Skenny liang assert(cpu >= 0 && cpu < 4); 82*7352f329Skenny liang reg = mp2_bootreg[cpu]; 83*7352f329Skenny liang } else { 84*7352f329Skenny liang reg = per_cpu(cluster, cpu, MCUCFG_BOOTADDR); 85*7352f329Skenny liang } 86*7352f329Skenny liang 87*7352f329Skenny liang mmio_write_32(reg, bootaddr); 88*7352f329Skenny liang } 89*7352f329Skenny liang 90*7352f329Skenny liang uintptr_t mcucfg_get_bootaddr(int cluster, int cpu) 91*7352f329Skenny liang { 92*7352f329Skenny liang uintptr_t reg; 93*7352f329Skenny liang const uintptr_t mp2_bootreg[] = { 94*7352f329Skenny liang MCUCFG_MP2_RVADDR0, MCUCFG_MP2_RVADDR1, 95*7352f329Skenny liang MCUCFG_MP2_RVADDR2, MCUCFG_MP2_RVADDR3 }; 96*7352f329Skenny liang 97*7352f329Skenny liang if (cluster) { 98*7352f329Skenny liang assert(cpu >= 0 && cpu < 4); 99*7352f329Skenny liang reg = mp2_bootreg[cpu]; 100*7352f329Skenny liang } else { 101*7352f329Skenny liang reg = per_cpu(cluster, cpu, MCUCFG_BOOTADDR); 102*7352f329Skenny liang } 103*7352f329Skenny liang 104*7352f329Skenny liang return mmio_read_32(reg); 105*7352f329Skenny liang } 106*7352f329Skenny liang 107*7352f329Skenny liang void mcucfg_init_archstate(int cluster, int cpu, int arm64) 108*7352f329Skenny liang { 109*7352f329Skenny liang uintptr_t reg; 110*7352f329Skenny liang int i; 111*7352f329Skenny liang 112*7352f329Skenny liang reg = per_cluster(cluster, MCUCFG_INITARCH); 113*7352f329Skenny liang i = cluster ? 16 : 12; 114*7352f329Skenny liang 115*7352f329Skenny liang mmio_setbits_32(reg, (arm64 & 1) << (i + cpu)); 116*7352f329Skenny liang } 117*7352f329Skenny liang 118*7352f329Skenny liang /** 119*7352f329Skenny liang * Return power state of specified subsystem 120*7352f329Skenny liang * 121*7352f329Skenny liang * @mask: mask to SPM_PWR_STATUS to query the power state 122*7352f329Skenny liang * of one subsystem. 123*7352f329Skenny liang * RETURNS: 124*7352f329Skenny liang * 0 (the subsys was powered off) 125*7352f329Skenny liang * 1 (the subsys was powered on) 126*7352f329Skenny liang */ 127*7352f329Skenny liang int spm_get_powerstate(uint32_t mask) 128*7352f329Skenny liang { 129*7352f329Skenny liang return mmio_read_32(SPM_PWR_STATUS) & mask; 130*7352f329Skenny liang } 131*7352f329Skenny liang 132*7352f329Skenny liang int spm_get_cluster_powerstate(int cluster) 133*7352f329Skenny liang { 134*7352f329Skenny liang uint32_t mask; 135*7352f329Skenny liang 136*7352f329Skenny liang mask = cluster ? PWR_STATUS_MP1_CPUTOP : PWR_STATUS_MP0_CPUTOP; 137*7352f329Skenny liang 138*7352f329Skenny liang return spm_get_powerstate(mask); 139*7352f329Skenny liang } 140*7352f329Skenny liang 141*7352f329Skenny liang int spm_get_cpu_powerstate(int cluster, int cpu) 142*7352f329Skenny liang { 143*7352f329Skenny liang uint32_t i; 144*7352f329Skenny liang 145*7352f329Skenny liang /* 146*7352f329Skenny liang * a quick way to specify the mask of cpu[0-3]/cpu[4-7] in PWR_STATUS 147*7352f329Skenny liang * register which are the BITS[9:12](MP0_CPU0~3) and 148*7352f329Skenny liang * BITS[16:19](MP1_CPU0~3) 149*7352f329Skenny liang */ 150*7352f329Skenny liang i = (cluster) ? 16 : 9; 151*7352f329Skenny liang i = 1 << (i + cpu); 152*7352f329Skenny liang 153*7352f329Skenny liang return spm_get_powerstate(i); 154*7352f329Skenny liang } 155*7352f329Skenny liang 156*7352f329Skenny liang int spmc_init(void) 157*7352f329Skenny liang { 158*7352f329Skenny liang /* enable SPM register control */ 159*7352f329Skenny liang mmio_write_32(SPM_POWERON_CONFIG_EN, 160*7352f329Skenny liang PROJECT_CODE | MD_BCLK_CG_EN | BCLK_CG_EN); 161*7352f329Skenny liang 162*7352f329Skenny liang #if SPMC_MODE == 1 163*7352f329Skenny liang INFO("SPM: enable SPMC mode\n"); 164*7352f329Skenny liang 165*7352f329Skenny liang /* 0: SPMC mode 1: Legacy mode */ 166*7352f329Skenny liang mmio_write_32(SPM_BYPASS_SPMC, 0); 167*7352f329Skenny liang 168*7352f329Skenny liang mmio_clrbits_32(per_cluster(0, SPM_CLUSTER_PWR), PWRCTRL_PWR_ON_2ND); 169*7352f329Skenny liang 170*7352f329Skenny liang mmio_clrbits_32(per_cpu(0, 0, SPM_CPU_PWR), PWRCTRL_PWR_ON_2ND); 171*7352f329Skenny liang mmio_clrbits_32(per_cpu(0, 1, SPM_CPU_PWR), PWRCTRL_PWR_ON_2ND); 172*7352f329Skenny liang mmio_clrbits_32(per_cpu(0, 2, SPM_CPU_PWR), PWRCTRL_PWR_ON_2ND); 173*7352f329Skenny liang mmio_clrbits_32(per_cpu(0, 3, SPM_CPU_PWR), PWRCTRL_PWR_ON_2ND); 174*7352f329Skenny liang 175*7352f329Skenny liang mmio_setbits_32(per_cpu(0, 1, SPM_CPU_PWR), PWRCTRL_PWR_RST_B); 176*7352f329Skenny liang mmio_setbits_32(per_cpu(0, 2, SPM_CPU_PWR), PWRCTRL_PWR_RST_B); 177*7352f329Skenny liang mmio_setbits_32(per_cpu(0, 3, SPM_CPU_PWR), PWRCTRL_PWR_RST_B); 178*7352f329Skenny liang #endif 179*7352f329Skenny liang 180*7352f329Skenny liang mmio_clrbits_32(per_cluster(1, SPM_CLUSTER_PWR), PWRCTRL_PWR_ON_2ND); 181*7352f329Skenny liang mmio_setbits_32(per_cluster(1, SPM_CLUSTER_PWR), PWRCTRL_PWR_RST_B); 182*7352f329Skenny liang mmio_clrbits_32(per_cluster(1, SPM_CLUSTER_PWR), PWRCTRL_PWR_CLK_DIS); 183*7352f329Skenny liang 184*7352f329Skenny liang mmio_clrbits_32(per_cpu(1, 0, SPM_CPU_PWR), PWRCTRL_PWR_ON_2ND); 185*7352f329Skenny liang mmio_clrbits_32(per_cpu(1, 1, SPM_CPU_PWR), PWRCTRL_PWR_ON_2ND); 186*7352f329Skenny liang mmio_clrbits_32(per_cpu(1, 2, SPM_CPU_PWR), PWRCTRL_PWR_ON_2ND); 187*7352f329Skenny liang mmio_clrbits_32(per_cpu(1, 3, SPM_CPU_PWR), PWRCTRL_PWR_ON_2ND); 188*7352f329Skenny liang 189*7352f329Skenny liang mmio_setbits_32(per_cpu(1, 0, SPM_CPU_PWR), PWRCTRL_PWR_RST_B); 190*7352f329Skenny liang mmio_setbits_32(per_cpu(1, 1, SPM_CPU_PWR), PWRCTRL_PWR_RST_B); 191*7352f329Skenny liang mmio_setbits_32(per_cpu(1, 2, SPM_CPU_PWR), PWRCTRL_PWR_RST_B); 192*7352f329Skenny liang mmio_setbits_32(per_cpu(1, 3, SPM_CPU_PWR), PWRCTRL_PWR_RST_B); 193*7352f329Skenny liang 194*7352f329Skenny liang return 0; 195*7352f329Skenny liang } 196*7352f329Skenny liang 197*7352f329Skenny liang /** 198*7352f329Skenny liang * Power on a core with specified cluster and core index 199*7352f329Skenny liang * 200*7352f329Skenny liang * @cluster: the cluster ID of the CPU which to be powered on 201*7352f329Skenny liang * @cpu: the CPU ID of the CPU which to be powered on 202*7352f329Skenny liang */ 203*7352f329Skenny liang void spm_poweron_cpu(int cluster, int cpu) 204*7352f329Skenny liang { 205*7352f329Skenny liang INFO("spmc: power on core %d.%d\n", cluster, cpu); 206*7352f329Skenny liang 207*7352f329Skenny liang /* STA_POWER_ON */ 208*7352f329Skenny liang /* Start to turn on MP0_CPU0 */ 209*7352f329Skenny liang 210*7352f329Skenny liang /* Set PWR_RST_B = 1 */ 211*7352f329Skenny liang mmio_setbits_32(per_cpu(cluster, cpu, SPM_CPU_PWR), PWRCTRL_PWR_RST_B); 212*7352f329Skenny liang 213*7352f329Skenny liang /* Set PWR_ON = 1 */ 214*7352f329Skenny liang mmio_setbits_32(per_cpu(cluster, cpu, SPM_CPU_PWR), PWRCTRL_PWR_ON); 215*7352f329Skenny liang 216*7352f329Skenny liang /* Wait until MP0_CPU0_PWR_STA_MASK = 1 */ 217*7352f329Skenny liang while (!spm_get_cpu_powerstate(cluster, cpu)) 218*7352f329Skenny liang ; 219*7352f329Skenny liang 220*7352f329Skenny liang /* Finish to turn on MP0_CPU0 */ 221*7352f329Skenny liang INFO("spmc: power on core %d.%d successfully\n", cluster, cpu); 222*7352f329Skenny liang } 223*7352f329Skenny liang 224*7352f329Skenny liang /** 225*7352f329Skenny liang * Power off a core with specified cluster and core index 226*7352f329Skenny liang * 227*7352f329Skenny liang * @cluster: the cluster ID of the CPU which to be powered off 228*7352f329Skenny liang * @cpu: the CPU ID of the CPU which to be powered off 229*7352f329Skenny liang */ 230*7352f329Skenny liang void spm_poweroff_cpu(int cluster, int cpu) 231*7352f329Skenny liang { 232*7352f329Skenny liang INFO("spmc: power off core %d.%d\n", cluster, cpu); 233*7352f329Skenny liang 234*7352f329Skenny liang /* Start to turn off MP0_CPU0 */ 235*7352f329Skenny liang /* Set PWR_ON_2ND = 0 */ 236*7352f329Skenny liang mmio_clrbits_32(per_cpu(cluster, cpu, SPM_CPU_PWR), PWRCTRL_PWR_ON_2ND); 237*7352f329Skenny liang 238*7352f329Skenny liang /* Set PWR_ON = 0 */ 239*7352f329Skenny liang mmio_clrbits_32(per_cpu(cluster, cpu, SPM_CPU_PWR), PWRCTRL_PWR_ON); 240*7352f329Skenny liang 241*7352f329Skenny liang /* Wait until MP0_CPU0_PWR_STA_MASK = 0 */ 242*7352f329Skenny liang while (spm_get_cpu_powerstate(cluster, cpu)) 243*7352f329Skenny liang ; 244*7352f329Skenny liang 245*7352f329Skenny liang /* Set PWR_RST_B = 0 */ 246*7352f329Skenny liang mmio_clrbits_32(per_cpu(cluster, cpu, SPM_CPU_PWR), PWRCTRL_PWR_RST_B); 247*7352f329Skenny liang 248*7352f329Skenny liang /* Finish to turn off MP0_CPU0 */ 249*7352f329Skenny liang INFO("spmc: power off core %d.%d successfully\n", cluster, cpu); 250*7352f329Skenny liang } 251*7352f329Skenny liang 252*7352f329Skenny liang /** 253*7352f329Skenny liang * Power off a cluster with specified index 254*7352f329Skenny liang * 255*7352f329Skenny liang * @cluster: the cluster index which to be powered off 256*7352f329Skenny liang */ 257*7352f329Skenny liang void spm_poweroff_cluster(int cluster) 258*7352f329Skenny liang { 259*7352f329Skenny liang uint32_t mask; 260*7352f329Skenny liang uint32_t pwr_rst_ctl; 261*7352f329Skenny liang 262*7352f329Skenny liang INFO("spmc: power off cluster %d\n", cluster); 263*7352f329Skenny liang 264*7352f329Skenny liang /* Start to turn off MP0_CPUTOP */ 265*7352f329Skenny liang /* Set bus protect - step1 : 0 */ 266*7352f329Skenny liang mask = (cluster) ? MP1_CPUTOP_PROT_STEP1_0_MASK : 267*7352f329Skenny liang MP0_CPUTOP_PROT_STEP1_0_MASK; 268*7352f329Skenny liang mmio_write_32(INFRA_TOPAXI_PROTECTEN_1_SET, mask); 269*7352f329Skenny liang 270*7352f329Skenny liang while ((mmio_read_32(INFRA_TOPAXI_PROTECTEN_STA1_1) & mask) != mask) 271*7352f329Skenny liang ; 272*7352f329Skenny liang 273*7352f329Skenny liang /* Set PWR_ON_2ND = 0 */ 274*7352f329Skenny liang mmio_clrbits_32(per_cluster(cluster, SPM_CLUSTER_PWR), 275*7352f329Skenny liang PWRCTRL_PWR_ON_2ND); 276*7352f329Skenny liang 277*7352f329Skenny liang /* SPMC_DORMANT_ENABLE[0]=0 */ 278*7352f329Skenny liang mask = (cluster) ? MP1_SPMC_SRAM_DORMANT_EN : MP0_SPMC_SRAM_DORMANT_EN; 279*7352f329Skenny liang mmio_clrbits_32(SPM_SPMC_DORMANT_ENABLE, mask); 280*7352f329Skenny liang 281*7352f329Skenny liang /* Set PWR_ON = 0" */ 282*7352f329Skenny liang mmio_clrbits_32(per_cluster(cluster, SPM_CLUSTER_PWR), PWRCTRL_PWR_ON); 283*7352f329Skenny liang 284*7352f329Skenny liang /* Wait until MP0_CPUTOP_PWR_STA_MASK = 0 */ 285*7352f329Skenny liang while (spm_get_cluster_powerstate(cluster)) 286*7352f329Skenny liang ; 287*7352f329Skenny liang 288*7352f329Skenny liang /* NOTE 289*7352f329Skenny liang * Following flow only for BIG core cluster. It was from 290*7352f329Skenny liang * application note but not covered in mtcmos_ctrl.c 291*7352f329Skenny liang */ 292*7352f329Skenny liang if (cluster) { 293*7352f329Skenny liang pwr_rst_ctl = mmio_read_32(MCUCFG_MP2_PWR_RST_CTL); 294*7352f329Skenny liang mmio_write_32(MCUCFG_MP2_PWR_RST_CTL, 295*7352f329Skenny liang (pwr_rst_ctl & ~SW_RST_B) | TOPAON_APB_MASK); 296*7352f329Skenny liang } 297*7352f329Skenny liang 298*7352f329Skenny liang /* CPU_EXT_BUCK_ISO[0]=1 */ 299*7352f329Skenny liang if (cluster) 300*7352f329Skenny liang mmio_setbits_32(SPM_CPU_EXT_BUCK_ISO, MP1_EXT_BUCK_ISO); 301*7352f329Skenny liang 302*7352f329Skenny liang /* Finish to turn off MP0_CPUTOP */ 303*7352f329Skenny liang INFO("spmc: power off cluster %d successfully\n", cluster); 304*7352f329Skenny liang } 305*7352f329Skenny liang 306*7352f329Skenny liang /** 307*7352f329Skenny liang * Power on a cluster with specified index 308*7352f329Skenny liang * 309*7352f329Skenny liang * @cluster: the cluster index which to be powered on 310*7352f329Skenny liang */ 311*7352f329Skenny liang void spm_poweron_cluster(int cluster) 312*7352f329Skenny liang { 313*7352f329Skenny liang uint32_t mask; 314*7352f329Skenny liang uint32_t pwr_rst_ctl; 315*7352f329Skenny liang 316*7352f329Skenny liang INFO("spmc: power on cluster %d\n", cluster); 317*7352f329Skenny liang 318*7352f329Skenny liang /* Start to turn on MP1_CPUTOP */ 319*7352f329Skenny liang 320*7352f329Skenny liang /* NOTE 321*7352f329Skenny liang * Following flow only for BIG core cluster. It was from 322*7352f329Skenny liang * application note but not covered in mtcmos_ctrl.c 323*7352f329Skenny liang */ 324*7352f329Skenny liang if (cluster) { 325*7352f329Skenny liang mmio_clrbits_32(MCUCFG_MP2_PWR_RST_CTL, SW_RST_B); 326*7352f329Skenny liang 327*7352f329Skenny liang /* CPU_EXT_BUCK_ISO[1]=0 */ 328*7352f329Skenny liang /* Set mp<n>_vproc_ext_off to 0 to release vproc isolation control */ 329*7352f329Skenny liang mmio_clrbits_32(SPM_CPU_EXT_BUCK_ISO, MP1_EXT_BUCK_ISO); 330*7352f329Skenny liang 331*7352f329Skenny liang /* NOTE 332*7352f329Skenny liang * Following flow only for BIG core cluster. It was from 333*7352f329Skenny liang * application note but not covered in mtcmos_ctrl.c 334*7352f329Skenny liang */ 335*7352f329Skenny liang pwr_rst_ctl = mmio_read_32(MCUCFG_MP2_PWR_RST_CTL); 336*7352f329Skenny liang mmio_write_32(MCUCFG_MP2_PWR_RST_CTL, 337*7352f329Skenny liang (pwr_rst_ctl | SW_RST_B) & ~TOPAON_APB_MASK); 338*7352f329Skenny liang } 339*7352f329Skenny liang 340*7352f329Skenny liang /* Set PWR_ON_2ND = 0 */ 341*7352f329Skenny liang mmio_clrbits_32(per_cluster(cluster, SPM_CLUSTER_PWR), 342*7352f329Skenny liang PWRCTRL_PWR_ON_2ND); 343*7352f329Skenny liang 344*7352f329Skenny liang /* Set PWR_RST_B = 1 */ 345*7352f329Skenny liang mmio_setbits_32(per_cluster(cluster, SPM_CLUSTER_PWR), 346*7352f329Skenny liang PWRCTRL_PWR_RST_B); 347*7352f329Skenny liang 348*7352f329Skenny liang /* Set PWR_CLK_DIS = 0 */ 349*7352f329Skenny liang mmio_clrbits_32(per_cluster(cluster, SPM_CLUSTER_PWR), 350*7352f329Skenny liang PWRCTRL_PWR_CLK_DIS); 351*7352f329Skenny liang 352*7352f329Skenny liang /* Set PWR_ON = 1 */ 353*7352f329Skenny liang mmio_setbits_32(per_cluster(cluster, SPM_CLUSTER_PWR), PWRCTRL_PWR_ON); 354*7352f329Skenny liang 355*7352f329Skenny liang /* Wait until MP1_CPUTOP_PWR_STA_MASK = 1 */ 356*7352f329Skenny liang while (!spm_get_cluster_powerstate(cluster)) 357*7352f329Skenny liang ; 358*7352f329Skenny liang 359*7352f329Skenny liang /* Release bus protect - step1 : 0 */ 360*7352f329Skenny liang mask = (cluster) ? MP1_CPUTOP_PROT_STEP1_0_MASK : 361*7352f329Skenny liang MP0_CPUTOP_PROT_STEP1_0_MASK; 362*7352f329Skenny liang mmio_write_32(INFRA_TOPAXI_PROTECTEN_1_CLR, mask); 363*7352f329Skenny liang 364*7352f329Skenny liang /* Finish to turn on MP1_CPUTOP */ 365*7352f329Skenny liang INFO("spmc: power on cluster %d successfully\n", cluster); 366*7352f329Skenny liang } 367