]>
Commit | Line | Data |
---|---|---|
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 | ; Disable/enable I-cache according to configuration | |
17 | lr r5, [ARC_BCR_IC_BUILD] | |
18 | breq r5, 0, 1f ; I$ doesn't exist | |
19 | lr r5, [ARC_AUX_IC_CTRL] | |
20 | #ifndef CONFIG_SYS_ICACHE_OFF | |
21 | bclr r5, r5, 0 ; 0 - Enable, 1 is Disable | |
22 | #else | |
23 | bset r5, r5, 0 ; I$ exists, but is not used | |
24 | #endif | |
25 | sr r5, [ARC_AUX_IC_CTRL] | |
26 | ||
27 | 1: | |
28 | ; Disable/enable D-cache according to configuration | |
29 | lr r5, [ARC_BCR_DC_BUILD] | |
30 | breq r5, 0, 1f ; D$ doesn't exist | |
31 | lr r5, [ARC_AUX_DC_CTRL] | |
32 | bclr r5, r5, 6 ; Invalidate (discard w/o wback) | |
33 | #ifndef CONFIG_SYS_DCACHE_OFF | |
34 | bclr r5, r5, 0 ; Enable (+Inv) | |
35 | #else | |
36 | bset r5, r5, 0 ; Disable (+Inv) | |
37 | #endif | |
38 | sr r5, [ARC_AUX_DC_CTRL] | |
39 | ||
40 | 1: | |
41 | #ifdef CONFIG_ISA_ARCV2 | |
42 | ; Disable System-Level Cache (SLC) | |
43 | lr r5, [ARC_BCR_SLC] | |
44 | breq r5, 0, 1f ; SLC doesn't exist | |
45 | lr r5, [ARC_AUX_SLC_CTRL] | |
46 | bclr r5, r5, 6 ; Invalidate (discard w/o wback) | |
47 | bclr r5, r5, 0 ; Enable (+Inv) | |
48 | sr r5, [ARC_AUX_SLC_CTRL] | |
49 | ||
50 | 1: | |
51 | #endif | |
52 | ||
53 | /* Setup stack- and frame-pointers */ | |
54 | mov %sp, CONFIG_SYS_INIT_SP_ADDR | |
55 | mov %fp, %sp | |
56 | ||
57 | /* Allocate and zero GD, update SP */ | |
58 | mov %r0, %sp | |
59 | bl board_init_f_mem | |
60 | ||
61 | /* Update stack- and frame-pointers */ | |
62 | mov %sp, %r0 | |
63 | mov %fp, %sp | |
64 | ||
65 | /* Zero the one and only argument of "board_init_f" */ | |
66 | mov_s %r0, 0 | |
67 | j board_init_f | |
68 | ENDPROC(_start) | |
69 | ||
70 | /* | |
71 | * void board_init_f_r_trampoline(stack-pointer address) | |
72 | * | |
73 | * This "function" does not return, instead it continues in RAM | |
74 | * after relocating the monitor code. | |
75 | * | |
76 | * r0 = new stack-pointer | |
77 | */ | |
78 | ENTRY(board_init_f_r_trampoline) | |
79 | /* Set up the stack- and frame-pointers */ | |
80 | mov %sp, %r0 | |
81 | mov %fp, %sp | |
82 | ||
83 | /* Update position of intterupt vector table */ | |
84 | lr %r0, [ARC_AUX_INTR_VEC_BASE] | |
85 | ld %r1, [%r25, GD_RELOC_OFF] | |
86 | add %r0, %r0, %r1 | |
87 | sr %r0, [ARC_AUX_INTR_VEC_BASE] | |
88 | ||
89 | /* Re-enter U-Boot by calling board_init_f_r */ | |
90 | j board_init_f_r | |
91 | ENDPROC(board_init_f_r_trampoline) |