10ae76531SDavid Feng/* 20ae76531SDavid Feng * (C) Copyright 2013 30ae76531SDavid Feng * David Feng <fenghua@phytium.com.cn> 40ae76531SDavid Feng * 50ae76531SDavid Feng * SPDX-License-Identifier: GPL-2.0+ 60ae76531SDavid Feng */ 70ae76531SDavid Feng 80ae76531SDavid Feng#include <asm-offsets.h> 90ae76531SDavid Feng#include <config.h> 100ae76531SDavid Feng#include <linux/linkage.h> 110ae76531SDavid Feng#include <asm/macro.h> 120ae76531SDavid Feng#include <asm/armv8/mmu.h> 130ae76531SDavid Feng 140ae76531SDavid Feng/************************************************************************* 150ae76531SDavid Feng * 160ae76531SDavid Feng * Startup Code (reset vector) 170ae76531SDavid Feng * 180ae76531SDavid Feng *************************************************************************/ 190ae76531SDavid Feng 200ae76531SDavid Feng.globl _start 210ae76531SDavid Feng_start: 22cdaa633fSAndre Przywara#ifdef CONFIG_ENABLE_ARM_SOC_BOOT0_HOOK 23cdaa633fSAndre Przywara/* 24cdaa633fSAndre Przywara * Various SoCs need something special and SoC-specific up front in 25cdaa633fSAndre Przywara * order to boot, allow them to set that in their boot0.h file and then 26cdaa633fSAndre Przywara * use it here. 27cdaa633fSAndre Przywara */ 28cdaa633fSAndre Przywara#include <asm/arch/boot0.h> 29a5168a59SAndre Przywara#else 30a5168a59SAndre Przywara b reset 31cdaa633fSAndre Przywara#endif 32cdaa633fSAndre Przywara 3337e5dcc8SYouMin Chen#if !CONFIG_IS_ENABLED(TINY_FRAMEWORK) 340ae76531SDavid Feng .align 3 350ae76531SDavid Feng 360ae76531SDavid Feng.globl _TEXT_BASE 370ae76531SDavid Feng_TEXT_BASE: 386184121cSAndy Yan#if defined(CONFIG_SPL_BUILD) 396184121cSAndy Yan .quad CONFIG_SPL_TEXT_BASE 406184121cSAndy Yan#else 410ae76531SDavid Feng .quad CONFIG_SYS_TEXT_BASE 426184121cSAndy Yan#endif 430ae76531SDavid Feng 440ae76531SDavid Feng/* 450ae76531SDavid Feng * These are defined in the linker script. 460ae76531SDavid Feng */ 470ae76531SDavid Feng.globl _end_ofs 480ae76531SDavid Feng_end_ofs: 490ae76531SDavid Feng .quad _end - _start 500ae76531SDavid Feng 510ae76531SDavid Feng.globl _bss_start_ofs 520ae76531SDavid Feng_bss_start_ofs: 530ae76531SDavid Feng .quad __bss_start - _start 540ae76531SDavid Feng 550ae76531SDavid Feng.globl _bss_end_ofs 560ae76531SDavid Feng_bss_end_ofs: 570ae76531SDavid Feng .quad __bss_end - _start 580ae76531SDavid Feng 590ae76531SDavid Fengreset: 600e2b5350SStephen Warren /* Allow the board to save important registers */ 610e2b5350SStephen Warren b save_boot_params 620e2b5350SStephen Warren.globl save_boot_params_ret 630e2b5350SStephen Warrensave_boot_params_ret: 640e2b5350SStephen Warren 65f00ac1e5SStephen Warren#if CONFIG_POSITION_INDEPENDENT 66f00ac1e5SStephen Warren /* 67f00ac1e5SStephen Warren * Fix .rela.dyn relocations. This allows U-Boot to be loaded to and 68f00ac1e5SStephen Warren * executed at a different address than it was linked at. 69f00ac1e5SStephen Warren */ 70f00ac1e5SStephen Warrenpie_fixup: 71f00ac1e5SStephen Warren adr x0, _start /* x0 <- Runtime value of _start */ 72f00ac1e5SStephen Warren ldr x1, _TEXT_BASE /* x1 <- Linked value of _start */ 73f00ac1e5SStephen Warren sub x9, x0, x1 /* x9 <- Run-vs-link offset */ 74f00ac1e5SStephen Warren adr x2, __rel_dyn_start /* x2 <- Runtime &__rel_dyn_start */ 75f00ac1e5SStephen Warren adr x3, __rel_dyn_end /* x3 <- Runtime &__rel_dyn_end */ 76f00ac1e5SStephen Warrenpie_fix_loop: 77f00ac1e5SStephen Warren ldp x0, x1, [x2], #16 /* (x0, x1) <- (Link location, fixup) */ 78f00ac1e5SStephen Warren ldr x4, [x2], #8 /* x4 <- addend */ 79f00ac1e5SStephen Warren cmp w1, #1027 /* relative fixup? */ 80f00ac1e5SStephen Warren bne pie_skip_reloc 81f00ac1e5SStephen Warren /* relative fix: store addend plus offset at dest location */ 82f00ac1e5SStephen Warren add x0, x0, x9 83f00ac1e5SStephen Warren add x4, x4, x9 84f00ac1e5SStephen Warren str x4, [x0] 85f00ac1e5SStephen Warrenpie_skip_reloc: 86f00ac1e5SStephen Warren cmp x2, x3 87f00ac1e5SStephen Warren b.lo pie_fix_loop 88f00ac1e5SStephen Warrenpie_fixup_done: 89f00ac1e5SStephen Warren#endif 90f00ac1e5SStephen Warren 9194f7ff36SSergey Temerkhanov#ifdef CONFIG_SYS_RESET_SCTRL 9294f7ff36SSergey Temerkhanov bl reset_sctrl 9394f7ff36SSergey Temerkhanov#endif 940ae76531SDavid Feng /* 950ae76531SDavid Feng * Could be EL3/EL2/EL1, Initial State: 960ae76531SDavid Feng * Little Endian, MMU Disabled, i/dCache Disabled 970ae76531SDavid Feng */ 980ae76531SDavid Feng adr x0, vectors 990ae76531SDavid Feng switch_el x1, 3f, 2f, 1f 1001277bac0SDavid Feng3: msr vbar_el3, x0 1011277bac0SDavid Feng mrs x0, scr_el3 102c71645adSDavid Feng orr x0, x0, #0xf /* SCR_EL3.NS|IRQ|FIQ|EA */ 103c71645adSDavid Feng msr scr_el3, x0 1040ae76531SDavid Feng msr cptr_el3, xzr /* Enable FP/SIMD */ 10570bcb43eSThierry Reding#ifdef COUNTER_FREQUENCY 1060ae76531SDavid Feng ldr x0, =COUNTER_FREQUENCY 1070ae76531SDavid Feng msr cntfrq_el0, x0 /* Initialize CNTFRQ */ 10870bcb43eSThierry Reding#endif 1090ae76531SDavid Feng b 0f 1100ae76531SDavid Feng2: msr vbar_el2, x0 1110ae76531SDavid Feng mov x0, #0x33ff 1120ae76531SDavid Feng msr cptr_el2, x0 /* Enable FP/SIMD */ 1130ae76531SDavid Feng b 0f 1140ae76531SDavid Feng1: msr vbar_el1, x0 1150ae76531SDavid Feng mov x0, #3 << 20 1160ae76531SDavid Feng msr cpacr_el1, x0 /* Enable FP/SIMD */ 1170ae76531SDavid Feng0: 1180ae76531SDavid Feng 1193aec452eSMingkai Hu /* 120f28e2313SJoseph Chen * Enable instruction cache (if required), stack pointer, 121f28e2313SJoseph Chen * data access alignment checks and SError. 122f28e2313SJoseph Chen */ 123f28e2313SJoseph Chen#ifndef CONFIG_SYS_ICACHE_OFF 124f28e2313SJoseph Chen mov x1, #CR_I 125f28e2313SJoseph Chen#else 126f28e2313SJoseph Chen mov x1, #0 127f28e2313SJoseph Chen#endif 128f28e2313SJoseph Chen switch_el x2, 3f, 2f, 1f 129f28e2313SJoseph Chen3: mrs x0, sctlr_el3 130f28e2313SJoseph Chen orr x0, x0, x1 131f28e2313SJoseph Chen msr sctlr_el3, x0 132f28e2313SJoseph Chen#ifndef CONFIG_SUPPORT_USBPLUG 133f28e2313SJoseph Chen msr daifclr, #4 /* Enable SError. SCR_EL3.EA=1 was already set in start.S */ 134f28e2313SJoseph Chen#endif 135f28e2313SJoseph Chen b 0f 136f28e2313SJoseph Chen2: mrs x0, sctlr_el2 137f28e2313SJoseph Chen orr x0, x0, x1 138f28e2313SJoseph Chen msr sctlr_el2, x0 139f28e2313SJoseph Chen 140f28e2313SJoseph Chen mrs x0, hcr_el2 141f28e2313SJoseph Chen orr x0, x0, #HCR_EL2_TGE 142f28e2313SJoseph Chen orr x0, x0, #HCR_EL2_AMO 143f28e2313SJoseph Chen#if CONFIG_IS_ENABLED(IRQ) 144f28e2313SJoseph Chen orr x0, x0, #HCR_EL2_IMO 145f28e2313SJoseph Chen#endif 146f28e2313SJoseph Chen msr hcr_el2, x0 147f28e2313SJoseph Chen msr daifclr, #4 148f28e2313SJoseph Chen b 0f 149f28e2313SJoseph Chen1: mrs x0, sctlr_el1 150f28e2313SJoseph Chen orr x0, x0, x1 151f28e2313SJoseph Chen msr sctlr_el1, x0 152f28e2313SJoseph Chen msr daifclr, #4 153f28e2313SJoseph Chen0: 154f28e2313SJoseph Chen isb 155f28e2313SJoseph Chen 156f28e2313SJoseph Chen /* 1579ad7147bSDinh Nguyen * Enable SMPEN bit for coherency. 1583aec452eSMingkai Hu * This register is not architectural but at the moment 1593aec452eSMingkai Hu * this bit should be set for A53/A57/A72. 1603aec452eSMingkai Hu */ 1613aec452eSMingkai Hu#ifdef CONFIG_ARMV8_SET_SMPEN 162399e2bb6SYork Sun switch_el x1, 3f, 1f, 1f 163399e2bb6SYork Sun3: 1649ad7147bSDinh Nguyen mrs x0, S3_1_c15_c2_1 /* cpuectlr_el1 */ 1653aec452eSMingkai Hu orr x0, x0, #0x40 1663aec452eSMingkai Hu msr S3_1_c15_c2_1, x0 167399e2bb6SYork Sun1: 1683aec452eSMingkai Hu#endif 1693aec452eSMingkai Hu 17037118fb2SBhupesh Sharma /* Apply ARM core specific erratas */ 17137118fb2SBhupesh Sharma bl apply_core_errata 17237118fb2SBhupesh Sharma 1731e6ad55cSYork Sun /* 1741e6ad55cSYork Sun * Cache/BPB/TLB Invalidate 1751e6ad55cSYork Sun * i-cache is invalidated before enabled in icache_enable() 1761e6ad55cSYork Sun * tlb is invalidated before mmu is enabled in dcache_enable() 1771e6ad55cSYork Sun * d-cache is invalidated before enabled in dcache_enable() 1781e6ad55cSYork Sun */ 1790ae76531SDavid Feng 1800ae76531SDavid Feng /* Processor specific initialization */ 1810ae76531SDavid Feng bl lowlevel_init 1820ae76531SDavid Feng 1834b105f6cSOded Gabbay#if defined(CONFIG_ARMV8_SPIN_TABLE) && !defined(CONFIG_SPL_BUILD) 1846b6024eaSMasahiro Yamada branch_if_master x0, x1, master_cpu 1856b6024eaSMasahiro Yamada b spin_table_secondary_jump 1866b6024eaSMasahiro Yamada /* never return */ 1876b6024eaSMasahiro Yamada#elif defined(CONFIG_ARMV8_MULTIENTRY) 1880ae76531SDavid Feng branch_if_master x0, x1, master_cpu 1890ae76531SDavid Feng 1900ae76531SDavid Feng /* 1910ae76531SDavid Feng * Slave CPUs 1920ae76531SDavid Feng */ 1930ae76531SDavid Fengslave_cpu: 1940ae76531SDavid Feng wfe 1950ae76531SDavid Feng ldr x1, =CPU_RELEASE_ADDR 1960ae76531SDavid Feng ldr x0, [x1] 1970ae76531SDavid Feng cbz x0, slave_cpu 1980ae76531SDavid Feng br x0 /* branch to the given address */ 19923b5877cSLinus Walleij#endif /* CONFIG_ARMV8_MULTIENTRY */ 20036c449feSJoseph Chen 201*2f96fde5SJoseph Chen#if CONFIG_IS_ENABLED(SMP) 20236c449feSJoseph Chen mrs x0, mpidr_el1 20336c449feSJoseph Chen and x0, x0, #0xfff 20436c449feSJoseph Chen cmp x0, #0 20536c449feSJoseph Chen beq master_cpu 20636c449feSJoseph Chen 20736c449feSJoseph Chen#ifdef SMP_CPU1 20836c449feSJoseph Chen cmp x0, #(SMP_CPU1) 20936c449feSJoseph Chen ldr x1, =(SMP_CPU1_STACK) 21036c449feSJoseph Chen beq slave_cpu 21136c449feSJoseph Chen#endif 21236c449feSJoseph Chen 21336c449feSJoseph Chen#ifdef SMP_CPU2 21436c449feSJoseph Chen cmp x0, #(SMP_CPU2) 21536c449feSJoseph Chen ldr x1, =(SMP_CPU2_STACK) 21636c449feSJoseph Chen beq slave_cpu 21736c449feSJoseph Chen#endif 21836c449feSJoseph Chen 21936c449feSJoseph Chen#ifdef SMP_CPU3 22036c449feSJoseph Chen cmp x0, #(SMP_CPU3) 22136c449feSJoseph Chen ldr x1, =(SMP_CPU3_STACK) 22236c449feSJoseph Chen beq slave_cpu 22336c449feSJoseph Chen#endif 22436c449feSJoseph Chen dsb sy 22536c449feSJoseph Chen isb 22636c449feSJoseph Chen 22736c449feSJoseph Chenloop: 22836c449feSJoseph Chen wfe 22936c449feSJoseph Chen b loop 23036c449feSJoseph Chen 23136c449feSJoseph Chenslave_cpu: 23236c449feSJoseph Chen bic sp, x1, #0xf 23336c449feSJoseph Chen bl smp_entry 23436c449feSJoseph Chen b loop 23536c449feSJoseph Chen#endif 23636c449feSJoseph Chen 2376b6024eaSMasahiro Yamadamaster_cpu: 2380ae76531SDavid Feng bl _main 2390ae76531SDavid Feng 24094f7ff36SSergey Temerkhanov#ifdef CONFIG_SYS_RESET_SCTRL 24194f7ff36SSergey Temerkhanovreset_sctrl: 24294f7ff36SSergey Temerkhanov switch_el x1, 3f, 2f, 1f 24394f7ff36SSergey Temerkhanov3: 24494f7ff36SSergey Temerkhanov mrs x0, sctlr_el3 24594f7ff36SSergey Temerkhanov b 0f 24694f7ff36SSergey Temerkhanov2: 24794f7ff36SSergey Temerkhanov mrs x0, sctlr_el2 24894f7ff36SSergey Temerkhanov b 0f 24994f7ff36SSergey Temerkhanov1: 25094f7ff36SSergey Temerkhanov mrs x0, sctlr_el1 25194f7ff36SSergey Temerkhanov 25294f7ff36SSergey Temerkhanov0: 25394f7ff36SSergey Temerkhanov ldr x1, =0xfdfffffa 25494f7ff36SSergey Temerkhanov and x0, x0, x1 25594f7ff36SSergey Temerkhanov 25694f7ff36SSergey Temerkhanov switch_el x1, 6f, 5f, 4f 25794f7ff36SSergey Temerkhanov6: 25894f7ff36SSergey Temerkhanov msr sctlr_el3, x0 25994f7ff36SSergey Temerkhanov b 7f 26094f7ff36SSergey Temerkhanov5: 26194f7ff36SSergey Temerkhanov msr sctlr_el2, x0 26294f7ff36SSergey Temerkhanov b 7f 26394f7ff36SSergey Temerkhanov4: 26494f7ff36SSergey Temerkhanov msr sctlr_el1, x0 26594f7ff36SSergey Temerkhanov 26694f7ff36SSergey Temerkhanov7: 26794f7ff36SSergey Temerkhanov dsb sy 26894f7ff36SSergey Temerkhanov isb 26994f7ff36SSergey Temerkhanov b __asm_invalidate_tlb_all 27094f7ff36SSergey Temerkhanov ret 27194f7ff36SSergey Temerkhanov#endif 27294f7ff36SSergey Temerkhanov 2730ae76531SDavid Feng/*-----------------------------------------------------------------------*/ 2740ae76531SDavid Feng 27537118fb2SBhupesh SharmaWEAK(apply_core_errata) 27637118fb2SBhupesh Sharma 27737118fb2SBhupesh Sharma mov x29, lr /* Save LR */ 27837118fb2SBhupesh Sharma /* For now, we support Cortex-A57 specific errata only */ 27937118fb2SBhupesh Sharma 28037118fb2SBhupesh Sharma /* Check if we are running on a Cortex-A57 core */ 28137118fb2SBhupesh Sharma branch_if_a57_core x0, apply_a57_core_errata 28237118fb2SBhupesh Sharma0: 28337118fb2SBhupesh Sharma mov lr, x29 /* Restore LR */ 28437118fb2SBhupesh Sharma ret 28537118fb2SBhupesh Sharma 28637118fb2SBhupesh Sharmaapply_a57_core_errata: 28737118fb2SBhupesh Sharma 28837118fb2SBhupesh Sharma#ifdef CONFIG_ARM_ERRATA_828024 28937118fb2SBhupesh Sharma mrs x0, S3_1_c15_c2_0 /* cpuactlr_el1 */ 29037118fb2SBhupesh Sharma /* Disable non-allocate hint of w-b-n-a memory type */ 291f299b5b0SBhupesh Sharma orr x0, x0, #1 << 49 29237118fb2SBhupesh Sharma /* Disable write streaming no L1-allocate threshold */ 293f299b5b0SBhupesh Sharma orr x0, x0, #3 << 25 29437118fb2SBhupesh Sharma /* Disable write streaming no-allocate threshold */ 295f299b5b0SBhupesh Sharma orr x0, x0, #3 << 27 29637118fb2SBhupesh Sharma msr S3_1_c15_c2_0, x0 /* cpuactlr_el1 */ 29737118fb2SBhupesh Sharma#endif 29837118fb2SBhupesh Sharma 29937118fb2SBhupesh Sharma#ifdef CONFIG_ARM_ERRATA_826974 30037118fb2SBhupesh Sharma mrs x0, S3_1_c15_c2_0 /* cpuactlr_el1 */ 30137118fb2SBhupesh Sharma /* Disable speculative load execution ahead of a DMB */ 302f299b5b0SBhupesh Sharma orr x0, x0, #1 << 59 30337118fb2SBhupesh Sharma msr S3_1_c15_c2_0, x0 /* cpuactlr_el1 */ 30437118fb2SBhupesh Sharma#endif 30537118fb2SBhupesh Sharma 3062ea3a448SAshish kumar#ifdef CONFIG_ARM_ERRATA_833471 3072ea3a448SAshish kumar mrs x0, S3_1_c15_c2_0 /* cpuactlr_el1 */ 3082ea3a448SAshish kumar /* FPSCR write flush. 3092ea3a448SAshish kumar * Note that in some cases where a flush is unnecessary this 3102ea3a448SAshish kumar could impact performance. */ 3112ea3a448SAshish kumar orr x0, x0, #1 << 38 3122ea3a448SAshish kumar msr S3_1_c15_c2_0, x0 /* cpuactlr_el1 */ 3132ea3a448SAshish kumar#endif 3142ea3a448SAshish kumar 3152ea3a448SAshish kumar#ifdef CONFIG_ARM_ERRATA_829520 3162ea3a448SAshish kumar mrs x0, S3_1_c15_c2_0 /* cpuactlr_el1 */ 3172ea3a448SAshish kumar /* Disable Indirect Predictor bit will prevent this erratum 3182ea3a448SAshish kumar from occurring 3192ea3a448SAshish kumar * Note that in some cases where a flush is unnecessary this 3202ea3a448SAshish kumar could impact performance. */ 3212ea3a448SAshish kumar orr x0, x0, #1 << 4 3222ea3a448SAshish kumar msr S3_1_c15_c2_0, x0 /* cpuactlr_el1 */ 3232ea3a448SAshish kumar#endif 3242ea3a448SAshish kumar 32537118fb2SBhupesh Sharma#ifdef CONFIG_ARM_ERRATA_833069 32637118fb2SBhupesh Sharma mrs x0, S3_1_c15_c2_0 /* cpuactlr_el1 */ 32737118fb2SBhupesh Sharma /* Disable Enable Invalidates of BTB bit */ 32837118fb2SBhupesh Sharma and x0, x0, #0xE 32937118fb2SBhupesh Sharma msr S3_1_c15_c2_0, x0 /* cpuactlr_el1 */ 33037118fb2SBhupesh Sharma#endif 33137118fb2SBhupesh Sharma b 0b 33237118fb2SBhupesh SharmaENDPROC(apply_core_errata) 33337118fb2SBhupesh Sharma 33437118fb2SBhupesh Sharma/*-----------------------------------------------------------------------*/ 33537118fb2SBhupesh Sharma 3360ae76531SDavid FengWEAK(lowlevel_init) 3370ae76531SDavid Feng mov x29, lr /* Save LR */ 3380ae76531SDavid Feng 3397cef7918SJoseph Chen#if CONFIG_IS_ENABLED(IRQ) 340c71645adSDavid Feng branch_if_slave x0, 1f 341c71645adSDavid Feng ldr x0, =GICD_BASE 342c71645adSDavid Feng bl gic_init_secure 343c71645adSDavid Feng1: 344c71645adSDavid Feng#if defined(CONFIG_GICV3) 345c71645adSDavid Feng ldr x0, =GICR_BASE 346c71645adSDavid Feng bl gic_init_secure_percpu 347c71645adSDavid Feng#elif defined(CONFIG_GICV2) 348c71645adSDavid Feng ldr x0, =GICD_BASE 349c71645adSDavid Feng ldr x1, =GICC_BASE 350c71645adSDavid Feng bl gic_init_secure_percpu 351c71645adSDavid Feng#endif 35211661193SStephen Warren#endif 353c71645adSDavid Feng 354d38fca40SMasahiro Yamada#ifdef CONFIG_ARMV8_MULTIENTRY 355c71645adSDavid Feng branch_if_master x0, x1, 2f 3560ae76531SDavid Feng 3570ae76531SDavid Feng /* 3580ae76531SDavid Feng * Slave should wait for master clearing spin table. 3590ae76531SDavid Feng * This sync prevent salves observing incorrect 3600ae76531SDavid Feng * value of spin table and jumping to wrong place. 3610ae76531SDavid Feng */ 362c71645adSDavid Feng#if defined(CONFIG_GICV2) || defined(CONFIG_GICV3) 363c71645adSDavid Feng#ifdef CONFIG_GICV2 364c71645adSDavid Feng ldr x0, =GICC_BASE 365c71645adSDavid Feng#endif 366c71645adSDavid Feng bl gic_wait_for_interrupt 367c71645adSDavid Feng#endif 3680ae76531SDavid Feng 3690ae76531SDavid Feng /* 370c71645adSDavid Feng * All slaves will enter EL2 and optionally EL1. 3710ae76531SDavid Feng */ 3727c5e1febSAlison Wang adr x4, lowlevel_in_el2 3737c5e1febSAlison Wang ldr x5, =ES_TO_AARCH64 3740ae76531SDavid Feng bl armv8_switch_to_el2 375ec6617c3SAlison Wang 376ec6617c3SAlison Wanglowlevel_in_el2: 3770ae76531SDavid Feng#ifdef CONFIG_ARMV8_SWITCH_TO_EL1 3787c5e1febSAlison Wang adr x4, lowlevel_in_el1 3797c5e1febSAlison Wang ldr x5, =ES_TO_AARCH64 3800ae76531SDavid Feng bl armv8_switch_to_el1 381ec6617c3SAlison Wang 382ec6617c3SAlison Wanglowlevel_in_el1: 3830ae76531SDavid Feng#endif 3840ae76531SDavid Feng 38523b5877cSLinus Walleij#endif /* CONFIG_ARMV8_MULTIENTRY */ 38623b5877cSLinus Walleij 387c71645adSDavid Feng2: 3880ae76531SDavid Feng mov lr, x29 /* Restore LR */ 3890ae76531SDavid Feng ret 3900ae76531SDavid FengENDPROC(lowlevel_init) 3910ae76531SDavid Feng 392c71645adSDavid FengWEAK(smp_kick_all_cpus) 393c71645adSDavid Feng /* Kick secondary cpus up by SGI 0 interrupt */ 394c71645adSDavid Feng#if defined(CONFIG_GICV2) || defined(CONFIG_GICV3) 395c71645adSDavid Feng ldr x0, =GICD_BASE 396afedf548SMasahiro Yamada b gic_kick_secondary_cpus 397c71645adSDavid Feng#endif 398c71645adSDavid Feng ret 399c71645adSDavid FengENDPROC(smp_kick_all_cpus) 400c71645adSDavid Feng 4010ae76531SDavid Feng/*-----------------------------------------------------------------------*/ 4020ae76531SDavid Feng 4030ae76531SDavid FengENTRY(c_runtime_cpu_setup) 4040ae76531SDavid Feng /* Relocate vBAR */ 4050ae76531SDavid Feng adr x0, vectors 4060ae76531SDavid Feng switch_el x1, 3f, 2f, 1f 4070ae76531SDavid Feng3: msr vbar_el3, x0 4080ae76531SDavid Feng b 0f 4090ae76531SDavid Feng2: msr vbar_el2, x0 4100ae76531SDavid Feng b 0f 4110ae76531SDavid Feng1: msr vbar_el1, x0 4120ae76531SDavid Feng0: 4130ae76531SDavid Feng 4140ae76531SDavid Feng ret 4150ae76531SDavid FengENDPROC(c_runtime_cpu_setup) 4160e2b5350SStephen Warren 4170e2b5350SStephen WarrenWEAK(save_boot_params) 4180e2b5350SStephen Warren b save_boot_params_ret /* back to my caller */ 4190e2b5350SStephen WarrenENDPROC(save_boot_params) 42037e5dcc8SYouMin Chen#endif 421