/******************************************************************************* * Initialize the gic, configure the CLCD and zero out variables needed by the * secondaries to boot up correctly. ******************************************************************************/ void bl31_platform_setup() { unsigned int reg_val; /* Initialize the gic cpu and distributor interfaces */ gic_setup(); /* * TODO: Configure the CLCD before handing control to * linux. Need to see if a separate driver is needed * instead. */ mmio_write_32(VE_SYSREGS_BASE + V2M_SYS_CFGDATA, 0); mmio_write_32(VE_SYSREGS_BASE + V2M_SYS_CFGCTRL, (1ull << 31) | (1 << 30) | (7 << 20) | (0 << 16)); /* Enable and initialize the System level generic timer */ mmio_write_32(SYS_CNTCTL_BASE + CNTCR_OFF, CNTCR_FCREQ(0) | CNTCR_EN); /* Allow access to the System counter timer module */ reg_val = (1 << CNTACR_RPCT_SHIFT) | (1 << CNTACR_RVCT_SHIFT); reg_val |= (1 << CNTACR_RFRQ_SHIFT) | (1 << CNTACR_RVOFF_SHIFT); reg_val |= (1 << CNTACR_RWVT_SHIFT) | (1 << CNTACR_RWPT_SHIFT); mmio_write_32(SYS_TIMCTL_BASE + CNTACR_BASE(0), reg_val); mmio_write_32(SYS_TIMCTL_BASE + CNTACR_BASE(1), reg_val); reg_val = (1 << CNTNSAR_NS_SHIFT(0)) | (1 << CNTNSAR_NS_SHIFT(1)); mmio_write_32(SYS_TIMCTL_BASE + CNTNSAR, reg_val); /* Intialize the power controller */ fvp_pwrc_setup(); /* Topologies are best known to the platform. */ plat_setup_topology(); }
/******************************************************************************* * FVP handler called when an affinity instance has just been powered on after * having been suspended earlier. The level and mpidr determine the affinity * instance. * TODO: At the moment we reuse the on finisher and reinitialize the secure * context. Need to implement a separate suspend finisher. ******************************************************************************/ int plat_affinst_suspend_finish(unsigned long mpidr, unsigned int afflvl, unsigned int state) { if (afflvl >= MPIDR_AFFLVL2) { plat_restore_el3_dormant_data(); gic_setup(); gic_dist_restore(); } return plat_affinst_on_finish(mpidr, afflvl, state); }
/******************************************************************************* * MTK_platform handler called when an affinity instance has just been powered on after * having been suspended earlier. The level and mpidr determine the affinity * instance. * TODO: At the moment we reuse the on finisher and reinitialize the secure * context. Need to implement a separate suspend finisher. ******************************************************************************/ int mt_affinst_suspend_finish(unsigned long mpidr, unsigned int afflvl, unsigned int state) { int rc = PSCI_E_SUCCESS; switch (afflvl) { case MPIDR_AFFLVL2: if (state == PSCI_STATE_OFF) { struct _el3_dormant_data *p = &el3_dormant_data[0]; if (p->mp0_l2actlr_el1 == 0 && p->mp0_l2ectlr_el1==0) panic(); write_l2actlr(p->mp0_l2actlr_el1); write_l2ectlr(p->mp0_l2ectlr_el1); //restore L2RSTDIRSABLE mmio_write_32(MP0_CA7L_CACHE_CONFIG, (mmio_read_32(MP0_CA7L_CACHE_CONFIG) & ~L2RSTDISABLE) | (p->mp0_l2rstdisable & L2RSTDISABLE)); gic_setup(); gic_dist_restore(); } break; case MPIDR_AFFLVL1: case MPIDR_AFFLVL0: return mt_affinst_on_finish(mpidr, afflvl, state); default: assert(0); } return rc; }