xref: /openbmc/u-boot/arch/arc/lib/start.S (revision d891ab95)
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
12ENTRY(_start)
13	; Non-masters will be halted immediately, they might be kicked later
14	; by platform code right before passing control to the Linux kernel
15	; in bootm.c:boot_jump_linux().
16	lr 	r5, [identity]
17	lsr	r5, r5, 8
18	bmsk	r5, r5, 7
19	cmp	r5, 0
20	mov.nz	r0, r5
21	bz	.Lmaster_proceed
22	flag	1
23	nop
24	nop
25	nop
26
27.Lmaster_proceed:
28
29	/* Setup interrupt vector base that matches "__text_start" */
30	sr	__ivt_start, [ARC_AUX_INTR_VEC_BASE]
31
32	; Disable/enable I-cache according to configuration
33	lr	r5, [ARC_BCR_IC_BUILD]
34	breq	r5, 0, 1f		; I$ doesn't exist
35	lr	r5, [ARC_AUX_IC_CTRL]
36#ifndef CONFIG_SYS_ICACHE_OFF
37	bclr	r5, r5, 0		; 0 - Enable, 1 is Disable
38#else
39	bset	r5, r5, 0		; I$ exists, but is not used
40#endif
41	sr	r5, [ARC_AUX_IC_CTRL]
42
431:
44	; Disable/enable D-cache according to configuration
45	lr	r5, [ARC_BCR_DC_BUILD]
46	breq	r5, 0, 1f		; D$ doesn't exist
47	lr	r5, [ARC_AUX_DC_CTRL]
48	bclr	r5, r5, 6		; Invalidate (discard w/o wback)
49#ifndef CONFIG_SYS_DCACHE_OFF
50	bclr	r5, r5, 0		; Enable (+Inv)
51#else
52	bset	r5, r5, 0		; Disable (+Inv)
53#endif
54	sr	r5, [ARC_AUX_DC_CTRL]
55
561:
57#ifdef CONFIG_ISA_ARCV2
58	; Disable System-Level Cache (SLC)
59	lr	r5, [ARC_BCR_SLC]
60	breq	r5, 0, 1f		; SLC doesn't exist
61	lr	r5, [ARC_AUX_SLC_CTRL]
62	bclr	r5, r5, 6		; Invalidate (discard w/o wback)
63	bclr	r5, r5, 0		; Enable (+Inv)
64	sr	r5, [ARC_AUX_SLC_CTRL]
65
661:
67#endif
68
69	/* Establish C runtime stack and frame */
70	mov	%sp, CONFIG_SYS_INIT_SP_ADDR
71	mov	%fp, %sp
72
73	/* Allocate reserved area from current top of stack */
74	mov	%r0, %sp
75	bl	board_init_f_alloc_reserve
76	/* Set stack below reserved area, adjust frame pointer accordingly */
77	mov	%sp, %r0
78	mov	%fp, %sp
79
80	/* Initialize reserved area - note: r0 already contains address */
81	bl	board_init_f_init_reserve
82
83	/* Zero the one and only argument of "board_init_f" */
84	mov_s	%r0, 0
85	j	board_init_f
86ENDPROC(_start)
87
88/*
89 * void board_init_f_r_trampoline(stack-pointer address)
90 *
91 * This "function" does not return, instead it continues in RAM
92 * after relocating the monitor code.
93 *
94 * r0 = new stack-pointer
95 */
96ENTRY(board_init_f_r_trampoline)
97	/* Set up the stack- and frame-pointers */
98	mov	%sp, %r0
99	mov	%fp, %sp
100
101	/* Update position of intterupt vector table */
102	lr	%r0, [ARC_AUX_INTR_VEC_BASE]
103	ld	%r1, [%r25, GD_RELOC_OFF]
104	add	%r0, %r0, %r1
105	sr	%r0, [ARC_AUX_INTR_VEC_BASE]
106
107	/* Re-enter U-Boot by calling board_init_f_r */
108	j	board_init_f_r
109ENDPROC(board_init_f_r_trampoline)
110