1*09f455dcSMasahiro Yamada /* 2*09f455dcSMasahiro Yamada * Copyright (c) 2010-2014, NVIDIA CORPORATION. All rights reserved. 3*09f455dcSMasahiro Yamada * 4*09f455dcSMasahiro Yamada * This program is free software; you can redistribute it and/or modify it 5*09f455dcSMasahiro Yamada * under the terms and conditions of the GNU General Public License, 6*09f455dcSMasahiro Yamada * version 2, as published by the Free Software Foundation. 7*09f455dcSMasahiro Yamada * 8*09f455dcSMasahiro Yamada * This program is distributed in the hope it will be useful, but WITHOUT 9*09f455dcSMasahiro Yamada * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 10*09f455dcSMasahiro Yamada * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11*09f455dcSMasahiro Yamada * more details. 12*09f455dcSMasahiro Yamada * 13*09f455dcSMasahiro Yamada * You should have received a copy of the GNU General Public License 14*09f455dcSMasahiro Yamada * along with this program. If not, see <http://www.gnu.org/licenses/>. 15*09f455dcSMasahiro Yamada */ 16*09f455dcSMasahiro Yamada 17*09f455dcSMasahiro Yamada #include <common.h> 18*09f455dcSMasahiro Yamada #include <asm/io.h> 19*09f455dcSMasahiro Yamada #include <asm/arch/clock.h> 20*09f455dcSMasahiro Yamada #include <asm/arch/flow.h> 21*09f455dcSMasahiro Yamada #include <asm/arch/pinmux.h> 22*09f455dcSMasahiro Yamada #include <asm/arch/tegra.h> 23*09f455dcSMasahiro Yamada #include <asm/arch-tegra/clk_rst.h> 24*09f455dcSMasahiro Yamada #include <asm/arch-tegra/pmc.h> 25*09f455dcSMasahiro Yamada #include "../cpu.h" 26*09f455dcSMasahiro Yamada 27*09f455dcSMasahiro Yamada /* Tegra114-specific CPU init code */ 28*09f455dcSMasahiro Yamada static void enable_cpu_power_rail(void) 29*09f455dcSMasahiro Yamada { 30*09f455dcSMasahiro Yamada struct pmc_ctlr *pmc = (struct pmc_ctlr *)NV_PA_PMC_BASE; 31*09f455dcSMasahiro Yamada struct clk_rst_ctlr *clkrst = (struct clk_rst_ctlr *)NV_PA_CLK_RST_BASE; 32*09f455dcSMasahiro Yamada u32 reg; 33*09f455dcSMasahiro Yamada 34*09f455dcSMasahiro Yamada debug("enable_cpu_power_rail entry\n"); 35*09f455dcSMasahiro Yamada 36*09f455dcSMasahiro Yamada /* un-tristate PWR_I2C SCL/SDA, rest of the defaults are correct */ 37*09f455dcSMasahiro Yamada pinmux_tristate_disable(PMUX_PINGRP_PWR_I2C_SCL_PZ6); 38*09f455dcSMasahiro Yamada pinmux_tristate_disable(PMUX_PINGRP_PWR_I2C_SDA_PZ7); 39*09f455dcSMasahiro Yamada 40*09f455dcSMasahiro Yamada /* 41*09f455dcSMasahiro Yamada * Set CPUPWRGOOD_TIMER - APB clock is 1/2 of SCLK (102MHz), 42*09f455dcSMasahiro Yamada * set it for 25ms (102MHz * .025) 43*09f455dcSMasahiro Yamada */ 44*09f455dcSMasahiro Yamada reg = 0x26E8F0; 45*09f455dcSMasahiro Yamada writel(reg, &pmc->pmc_cpupwrgood_timer); 46*09f455dcSMasahiro Yamada 47*09f455dcSMasahiro Yamada /* Set polarity to 0 (normal) and enable CPUPWRREQ_OE */ 48*09f455dcSMasahiro Yamada clrbits_le32(&pmc->pmc_cntrl, CPUPWRREQ_POL); 49*09f455dcSMasahiro Yamada setbits_le32(&pmc->pmc_cntrl, CPUPWRREQ_OE); 50*09f455dcSMasahiro Yamada 51*09f455dcSMasahiro Yamada /* 52*09f455dcSMasahiro Yamada * Set CLK_RST_CONTROLLER_CPU_SOFTRST_CTRL2_0_CAR2PMC_CPU_ACK_WIDTH 53*09f455dcSMasahiro Yamada * to 408 to satisfy the requirement of having at least 16 CPU clock 54*09f455dcSMasahiro Yamada * cycles before clamp removal. 55*09f455dcSMasahiro Yamada */ 56*09f455dcSMasahiro Yamada 57*09f455dcSMasahiro Yamada clrbits_le32(&clkrst->crc_cpu_softrst_ctrl2, 0xFFF); 58*09f455dcSMasahiro Yamada setbits_le32(&clkrst->crc_cpu_softrst_ctrl2, 408); 59*09f455dcSMasahiro Yamada } 60*09f455dcSMasahiro Yamada 61*09f455dcSMasahiro Yamada static void enable_cpu_clocks(void) 62*09f455dcSMasahiro Yamada { 63*09f455dcSMasahiro Yamada struct clk_rst_ctlr *clkrst = (struct clk_rst_ctlr *)NV_PA_CLK_RST_BASE; 64*09f455dcSMasahiro Yamada u32 reg; 65*09f455dcSMasahiro Yamada 66*09f455dcSMasahiro Yamada debug("enable_cpu_clocks entry\n"); 67*09f455dcSMasahiro Yamada 68*09f455dcSMasahiro Yamada /* Wait for PLL-X to lock */ 69*09f455dcSMasahiro Yamada do { 70*09f455dcSMasahiro Yamada reg = readl(&clkrst->crc_pll_simple[SIMPLE_PLLX].pll_base); 71*09f455dcSMasahiro Yamada } while ((reg & PLL_LOCK_MASK) == 0); 72*09f455dcSMasahiro Yamada 73*09f455dcSMasahiro Yamada /* Wait until all clocks are stable */ 74*09f455dcSMasahiro Yamada udelay(PLL_STABILIZATION_DELAY); 75*09f455dcSMasahiro Yamada 76*09f455dcSMasahiro Yamada writel(CCLK_BURST_POLICY, &clkrst->crc_cclk_brst_pol); 77*09f455dcSMasahiro Yamada writel(SUPER_CCLK_DIVIDER, &clkrst->crc_super_cclk_div); 78*09f455dcSMasahiro Yamada 79*09f455dcSMasahiro Yamada /* Always enable the main CPU complex clocks */ 80*09f455dcSMasahiro Yamada clock_enable(PERIPH_ID_CPU); 81*09f455dcSMasahiro Yamada clock_enable(PERIPH_ID_CPULP); 82*09f455dcSMasahiro Yamada clock_enable(PERIPH_ID_CPUG); 83*09f455dcSMasahiro Yamada } 84*09f455dcSMasahiro Yamada 85*09f455dcSMasahiro Yamada static void remove_cpu_resets(void) 86*09f455dcSMasahiro Yamada { 87*09f455dcSMasahiro Yamada struct clk_rst_ctlr *clkrst = (struct clk_rst_ctlr *)NV_PA_CLK_RST_BASE; 88*09f455dcSMasahiro Yamada u32 reg; 89*09f455dcSMasahiro Yamada 90*09f455dcSMasahiro Yamada debug("remove_cpu_resets entry\n"); 91*09f455dcSMasahiro Yamada /* Take the slow non-CPU partition out of reset */ 92*09f455dcSMasahiro Yamada reg = readl(&clkrst->crc_rst_cpulp_cmplx_clr); 93*09f455dcSMasahiro Yamada writel((reg | CLR_NONCPURESET), &clkrst->crc_rst_cpulp_cmplx_clr); 94*09f455dcSMasahiro Yamada 95*09f455dcSMasahiro Yamada /* Take the fast non-CPU partition out of reset */ 96*09f455dcSMasahiro Yamada reg = readl(&clkrst->crc_rst_cpug_cmplx_clr); 97*09f455dcSMasahiro Yamada writel((reg | CLR_NONCPURESET), &clkrst->crc_rst_cpug_cmplx_clr); 98*09f455dcSMasahiro Yamada 99*09f455dcSMasahiro Yamada /* Clear the SW-controlled reset of the slow cluster */ 100*09f455dcSMasahiro Yamada reg = readl(&clkrst->crc_rst_cpulp_cmplx_clr); 101*09f455dcSMasahiro Yamada reg |= (CLR_CPURESET0+CLR_DBGRESET0+CLR_CORERESET0+CLR_CXRESET0); 102*09f455dcSMasahiro Yamada writel(reg, &clkrst->crc_rst_cpulp_cmplx_clr); 103*09f455dcSMasahiro Yamada 104*09f455dcSMasahiro Yamada /* Clear the SW-controlled reset of the fast cluster */ 105*09f455dcSMasahiro Yamada reg = readl(&clkrst->crc_rst_cpug_cmplx_clr); 106*09f455dcSMasahiro Yamada reg |= (CLR_CPURESET0+CLR_DBGRESET0+CLR_CORERESET0+CLR_CXRESET0); 107*09f455dcSMasahiro Yamada reg |= (CLR_CPURESET1+CLR_DBGRESET1+CLR_CORERESET1+CLR_CXRESET1); 108*09f455dcSMasahiro Yamada reg |= (CLR_CPURESET2+CLR_DBGRESET2+CLR_CORERESET2+CLR_CXRESET2); 109*09f455dcSMasahiro Yamada reg |= (CLR_CPURESET3+CLR_DBGRESET3+CLR_CORERESET3+CLR_CXRESET3); 110*09f455dcSMasahiro Yamada writel(reg, &clkrst->crc_rst_cpug_cmplx_clr); 111*09f455dcSMasahiro Yamada } 112*09f455dcSMasahiro Yamada 113*09f455dcSMasahiro Yamada /** 114*09f455dcSMasahiro Yamada * The T114 requires some special clock initialization, including setting up 115*09f455dcSMasahiro Yamada * the DVC I2C, turning on MSELECT and selecting the G CPU cluster 116*09f455dcSMasahiro Yamada */ 117*09f455dcSMasahiro Yamada void t114_init_clocks(void) 118*09f455dcSMasahiro Yamada { 119*09f455dcSMasahiro Yamada struct clk_rst_ctlr *clkrst = 120*09f455dcSMasahiro Yamada (struct clk_rst_ctlr *)NV_PA_CLK_RST_BASE; 121*09f455dcSMasahiro Yamada struct flow_ctlr *flow = (struct flow_ctlr *)NV_PA_FLOW_BASE; 122*09f455dcSMasahiro Yamada u32 val; 123*09f455dcSMasahiro Yamada 124*09f455dcSMasahiro Yamada debug("t114_init_clocks entry\n"); 125*09f455dcSMasahiro Yamada 126*09f455dcSMasahiro Yamada /* Set active CPU cluster to G */ 127*09f455dcSMasahiro Yamada clrbits_le32(&flow->cluster_control, 1); 128*09f455dcSMasahiro Yamada 129*09f455dcSMasahiro Yamada writel(SUPER_SCLK_ENB_MASK, &clkrst->crc_super_sclk_div); 130*09f455dcSMasahiro Yamada 131*09f455dcSMasahiro Yamada debug("Setting up PLLX\n"); 132*09f455dcSMasahiro Yamada init_pllx(); 133*09f455dcSMasahiro Yamada 134*09f455dcSMasahiro Yamada val = (1 << CLK_SYS_RATE_AHB_RATE_SHIFT); 135*09f455dcSMasahiro Yamada writel(val, &clkrst->crc_clk_sys_rate); 136*09f455dcSMasahiro Yamada 137*09f455dcSMasahiro Yamada /* Enable clocks to required peripherals. TBD - minimize this list */ 138*09f455dcSMasahiro Yamada debug("Enabling clocks\n"); 139*09f455dcSMasahiro Yamada 140*09f455dcSMasahiro Yamada clock_set_enable(PERIPH_ID_CACHE2, 1); 141*09f455dcSMasahiro Yamada clock_set_enable(PERIPH_ID_GPIO, 1); 142*09f455dcSMasahiro Yamada clock_set_enable(PERIPH_ID_TMR, 1); 143*09f455dcSMasahiro Yamada clock_set_enable(PERIPH_ID_RTC, 1); 144*09f455dcSMasahiro Yamada clock_set_enable(PERIPH_ID_CPU, 1); 145*09f455dcSMasahiro Yamada clock_set_enable(PERIPH_ID_EMC, 1); 146*09f455dcSMasahiro Yamada clock_set_enable(PERIPH_ID_I2C5, 1); 147*09f455dcSMasahiro Yamada clock_set_enable(PERIPH_ID_FUSE, 1); 148*09f455dcSMasahiro Yamada clock_set_enable(PERIPH_ID_PMC, 1); 149*09f455dcSMasahiro Yamada clock_set_enable(PERIPH_ID_APBDMA, 1); 150*09f455dcSMasahiro Yamada clock_set_enable(PERIPH_ID_MEM, 1); 151*09f455dcSMasahiro Yamada clock_set_enable(PERIPH_ID_IRAMA, 1); 152*09f455dcSMasahiro Yamada clock_set_enable(PERIPH_ID_IRAMB, 1); 153*09f455dcSMasahiro Yamada clock_set_enable(PERIPH_ID_IRAMC, 1); 154*09f455dcSMasahiro Yamada clock_set_enable(PERIPH_ID_IRAMD, 1); 155*09f455dcSMasahiro Yamada clock_set_enable(PERIPH_ID_CORESIGHT, 1); 156*09f455dcSMasahiro Yamada clock_set_enable(PERIPH_ID_MSELECT, 1); 157*09f455dcSMasahiro Yamada clock_set_enable(PERIPH_ID_EMC1, 1); 158*09f455dcSMasahiro Yamada clock_set_enable(PERIPH_ID_MC1, 1); 159*09f455dcSMasahiro Yamada clock_set_enable(PERIPH_ID_DVFS, 1); 160*09f455dcSMasahiro Yamada 161*09f455dcSMasahiro Yamada /* 162*09f455dcSMasahiro Yamada * Set MSELECT clock source as PLLP (00), and ask for a clock 163*09f455dcSMasahiro Yamada * divider that would set the MSELECT clock at 102MHz for a 164*09f455dcSMasahiro Yamada * PLLP base of 408MHz. 165*09f455dcSMasahiro Yamada */ 166*09f455dcSMasahiro Yamada clock_ll_set_source_divisor(PERIPH_ID_MSELECT, 0, 167*09f455dcSMasahiro Yamada CLK_DIVIDER(NVBL_PLLP_KHZ, 102000)); 168*09f455dcSMasahiro Yamada 169*09f455dcSMasahiro Yamada /* I2C5 (DVC) gets CLK_M and a divisor of 17 */ 170*09f455dcSMasahiro Yamada clock_ll_set_source_divisor(PERIPH_ID_I2C5, 3, 16); 171*09f455dcSMasahiro Yamada 172*09f455dcSMasahiro Yamada /* Give clocks time to stabilize */ 173*09f455dcSMasahiro Yamada udelay(1000); 174*09f455dcSMasahiro Yamada 175*09f455dcSMasahiro Yamada /* Take required peripherals out of reset */ 176*09f455dcSMasahiro Yamada debug("Taking periphs out of reset\n"); 177*09f455dcSMasahiro Yamada reset_set_enable(PERIPH_ID_CACHE2, 0); 178*09f455dcSMasahiro Yamada reset_set_enable(PERIPH_ID_GPIO, 0); 179*09f455dcSMasahiro Yamada reset_set_enable(PERIPH_ID_TMR, 0); 180*09f455dcSMasahiro Yamada reset_set_enable(PERIPH_ID_COP, 0); 181*09f455dcSMasahiro Yamada reset_set_enable(PERIPH_ID_EMC, 0); 182*09f455dcSMasahiro Yamada reset_set_enable(PERIPH_ID_I2C5, 0); 183*09f455dcSMasahiro Yamada reset_set_enable(PERIPH_ID_FUSE, 0); 184*09f455dcSMasahiro Yamada reset_set_enable(PERIPH_ID_APBDMA, 0); 185*09f455dcSMasahiro Yamada reset_set_enable(PERIPH_ID_MEM, 0); 186*09f455dcSMasahiro Yamada reset_set_enable(PERIPH_ID_CORESIGHT, 0); 187*09f455dcSMasahiro Yamada reset_set_enable(PERIPH_ID_MSELECT, 0); 188*09f455dcSMasahiro Yamada reset_set_enable(PERIPH_ID_EMC1, 0); 189*09f455dcSMasahiro Yamada reset_set_enable(PERIPH_ID_MC1, 0); 190*09f455dcSMasahiro Yamada reset_set_enable(PERIPH_ID_DVFS, 0); 191*09f455dcSMasahiro Yamada 192*09f455dcSMasahiro Yamada debug("t114_init_clocks exit\n"); 193*09f455dcSMasahiro Yamada } 194*09f455dcSMasahiro Yamada 195*09f455dcSMasahiro Yamada static bool is_partition_powered(u32 partid) 196*09f455dcSMasahiro Yamada { 197*09f455dcSMasahiro Yamada struct pmc_ctlr *pmc = (struct pmc_ctlr *)NV_PA_PMC_BASE; 198*09f455dcSMasahiro Yamada u32 reg; 199*09f455dcSMasahiro Yamada 200*09f455dcSMasahiro Yamada /* Get power gate status */ 201*09f455dcSMasahiro Yamada reg = readl(&pmc->pmc_pwrgate_status); 202*09f455dcSMasahiro Yamada return !!(reg & (1 << partid)); 203*09f455dcSMasahiro Yamada } 204*09f455dcSMasahiro Yamada 205*09f455dcSMasahiro Yamada static bool is_clamp_enabled(u32 partid) 206*09f455dcSMasahiro Yamada { 207*09f455dcSMasahiro Yamada struct pmc_ctlr *pmc = (struct pmc_ctlr *)NV_PA_PMC_BASE; 208*09f455dcSMasahiro Yamada u32 reg; 209*09f455dcSMasahiro Yamada 210*09f455dcSMasahiro Yamada /* Get clamp status. */ 211*09f455dcSMasahiro Yamada reg = readl(&pmc->pmc_clamp_status); 212*09f455dcSMasahiro Yamada return !!(reg & (1 << partid)); 213*09f455dcSMasahiro Yamada } 214*09f455dcSMasahiro Yamada 215*09f455dcSMasahiro Yamada static void power_partition(u32 partid) 216*09f455dcSMasahiro Yamada { 217*09f455dcSMasahiro Yamada struct pmc_ctlr *pmc = (struct pmc_ctlr *)NV_PA_PMC_BASE; 218*09f455dcSMasahiro Yamada 219*09f455dcSMasahiro Yamada debug("%s: part ID = %08X\n", __func__, partid); 220*09f455dcSMasahiro Yamada /* Is the partition already on? */ 221*09f455dcSMasahiro Yamada if (!is_partition_powered(partid)) { 222*09f455dcSMasahiro Yamada /* No, toggle the partition power state (OFF -> ON) */ 223*09f455dcSMasahiro Yamada debug("power_partition, toggling state\n"); 224*09f455dcSMasahiro Yamada writel(START_CP | partid, &pmc->pmc_pwrgate_toggle); 225*09f455dcSMasahiro Yamada 226*09f455dcSMasahiro Yamada /* Wait for the power to come up */ 227*09f455dcSMasahiro Yamada while (!is_partition_powered(partid)) 228*09f455dcSMasahiro Yamada ; 229*09f455dcSMasahiro Yamada 230*09f455dcSMasahiro Yamada /* Wait for the clamp status to be cleared */ 231*09f455dcSMasahiro Yamada while (is_clamp_enabled(partid)) 232*09f455dcSMasahiro Yamada ; 233*09f455dcSMasahiro Yamada 234*09f455dcSMasahiro Yamada /* Give I/O signals time to stabilize */ 235*09f455dcSMasahiro Yamada udelay(IO_STABILIZATION_DELAY); 236*09f455dcSMasahiro Yamada } 237*09f455dcSMasahiro Yamada } 238*09f455dcSMasahiro Yamada 239*09f455dcSMasahiro Yamada void powerup_cpus(void) 240*09f455dcSMasahiro Yamada { 241*09f455dcSMasahiro Yamada debug("powerup_cpus entry\n"); 242*09f455dcSMasahiro Yamada 243*09f455dcSMasahiro Yamada /* We boot to the fast cluster */ 244*09f455dcSMasahiro Yamada debug("powerup_cpus entry: G cluster\n"); 245*09f455dcSMasahiro Yamada /* Power up the fast cluster rail partition */ 246*09f455dcSMasahiro Yamada power_partition(CRAIL); 247*09f455dcSMasahiro Yamada 248*09f455dcSMasahiro Yamada /* Power up the fast cluster non-CPU partition */ 249*09f455dcSMasahiro Yamada power_partition(C0NC); 250*09f455dcSMasahiro Yamada 251*09f455dcSMasahiro Yamada /* Power up the fast cluster CPU0 partition */ 252*09f455dcSMasahiro Yamada power_partition(CE0); 253*09f455dcSMasahiro Yamada } 254*09f455dcSMasahiro Yamada 255*09f455dcSMasahiro Yamada void start_cpu(u32 reset_vector) 256*09f455dcSMasahiro Yamada { 257*09f455dcSMasahiro Yamada u32 imme, inst; 258*09f455dcSMasahiro Yamada 259*09f455dcSMasahiro Yamada debug("start_cpu entry, reset_vector = %x\n", reset_vector); 260*09f455dcSMasahiro Yamada 261*09f455dcSMasahiro Yamada t114_init_clocks(); 262*09f455dcSMasahiro Yamada 263*09f455dcSMasahiro Yamada /* Enable VDD_CPU */ 264*09f455dcSMasahiro Yamada enable_cpu_power_rail(); 265*09f455dcSMasahiro Yamada 266*09f455dcSMasahiro Yamada /* Get the CPU(s) running */ 267*09f455dcSMasahiro Yamada enable_cpu_clocks(); 268*09f455dcSMasahiro Yamada 269*09f455dcSMasahiro Yamada /* Enable CoreSight */ 270*09f455dcSMasahiro Yamada clock_enable_coresight(1); 271*09f455dcSMasahiro Yamada 272*09f455dcSMasahiro Yamada /* Take CPU(s) out of reset */ 273*09f455dcSMasahiro Yamada remove_cpu_resets(); 274*09f455dcSMasahiro Yamada 275*09f455dcSMasahiro Yamada /* Set the entry point for CPU execution from reset */ 276*09f455dcSMasahiro Yamada 277*09f455dcSMasahiro Yamada /* 278*09f455dcSMasahiro Yamada * A01P with patched boot ROM; vector hard-coded to 0x4003fffc. 279*09f455dcSMasahiro Yamada * See nvbug 1193357 for details. 280*09f455dcSMasahiro Yamada */ 281*09f455dcSMasahiro Yamada 282*09f455dcSMasahiro Yamada /* mov r0, #lsb(reset_vector) */ 283*09f455dcSMasahiro Yamada imme = reset_vector & 0xffff; 284*09f455dcSMasahiro Yamada inst = imme & 0xfff; 285*09f455dcSMasahiro Yamada inst |= ((imme >> 12) << 16); 286*09f455dcSMasahiro Yamada inst |= 0xe3000000; 287*09f455dcSMasahiro Yamada writel(inst, 0x4003fff0); 288*09f455dcSMasahiro Yamada 289*09f455dcSMasahiro Yamada /* movt r0, #msb(reset_vector) */ 290*09f455dcSMasahiro Yamada imme = (reset_vector >> 16) & 0xffff; 291*09f455dcSMasahiro Yamada inst = imme & 0xfff; 292*09f455dcSMasahiro Yamada inst |= ((imme >> 12) << 16); 293*09f455dcSMasahiro Yamada inst |= 0xe3400000; 294*09f455dcSMasahiro Yamada writel(inst, 0x4003fff4); 295*09f455dcSMasahiro Yamada 296*09f455dcSMasahiro Yamada /* bx r0 */ 297*09f455dcSMasahiro Yamada writel(0xe12fff10, 0x4003fff8); 298*09f455dcSMasahiro Yamada 299*09f455dcSMasahiro Yamada /* b -12 */ 300*09f455dcSMasahiro Yamada imme = (u32)-20; 301*09f455dcSMasahiro Yamada inst = (imme >> 2) & 0xffffff; 302*09f455dcSMasahiro Yamada inst |= 0xea000000; 303*09f455dcSMasahiro Yamada writel(inst, 0x4003fffc); 304*09f455dcSMasahiro Yamada 305*09f455dcSMasahiro Yamada /* Write to orignal location for compatibility */ 306*09f455dcSMasahiro Yamada writel(reset_vector, EXCEP_VECTOR_CPU_RESET_VECTOR); 307*09f455dcSMasahiro Yamada 308*09f455dcSMasahiro Yamada /* If the CPU(s) don't already have power, power 'em up */ 309*09f455dcSMasahiro Yamada powerup_cpus(); 310*09f455dcSMasahiro Yamada } 311