Merge branch 'master' of git://www.denx.de/git/u-boot-imx
[platform/kernel/u-boot.git] / arch / arc / lib / start.S
1 /*
2  * Copyright (C) 2013-2014 Synopsys, Inc. All rights reserved.
3  *
4  * SPDX-License-Identifier:     GPL-2.0+
5  */
6
7 #include <asm-offsets.h>
8 #include <config.h>
9 #include <linux/linkage.h>
10 #include <asm/arcregs.h>
11
12 ENTRY(_start)
13         /* Setup interrupt vector base that matches "__text_start" */
14         sr      __ivt_start, [ARC_AUX_INTR_VEC_BASE]
15
16         /* Setup stack- and frame-pointers */
17         mov     %sp, CONFIG_SYS_INIT_SP_ADDR
18         mov     %fp, %sp
19
20         /* Unconditionally disable caches */
21 #ifdef CONFIG_ISA_ARCV2
22         bl      slc_flush
23         bl      slc_disable
24 #endif
25         bl      flush_dcache_all
26         bl      dcache_disable
27         bl      icache_disable
28
29         /* Allocate and zero GD, update SP */
30         mov     %r0, %sp
31         bl      board_init_f_mem
32
33         /* Update stack- and frame-pointers */
34         mov     %sp, %r0
35         mov     %fp, %sp
36
37         /* Zero the one and only argument of "board_init_f" */
38         mov_s   %r0, 0
39         j       board_init_f
40 ENDPROC(_start)
41
42 /*
43  * void board_init_f_r_trampoline(stack-pointer address)
44  *
45  * This "function" does not return, instead it continues in RAM
46  * after relocating the monitor code.
47  *
48  * r0 = new stack-pointer
49  */
50 ENTRY(board_init_f_r_trampoline)
51         /* Set up the stack- and frame-pointers */
52         mov     %sp, %r0
53         mov     %fp, %sp
54
55         /* Update position of intterupt vector table */
56         lr      %r0, [ARC_AUX_INTR_VEC_BASE]
57         ld      %r1, [%r25, GD_RELOC_OFF]
58         add     %r0, %r0, %r1
59         sr      %r0, [ARC_AUX_INTR_VEC_BASE]
60
61         /* Re-enter U-Boot by calling board_init_f_r */
62         j       board_init_f_r
63 ENDPROC(board_init_f_r_trampoline)