xref: /openbmc/u-boot/arch/arc/lib/start.S (revision 61523dde17d1539b8ea361e25909acfdfc465155)
183d290c5STom Rini/* SPDX-License-Identifier: GPL-2.0+ */
24d93617dSAlexey Brodkin/*
34d93617dSAlexey Brodkin * Copyright (C) 2013-2014 Synopsys, Inc. All rights reserved.
44d93617dSAlexey Brodkin */
54d93617dSAlexey Brodkin
64d93617dSAlexey Brodkin#include <asm-offsets.h>
74d93617dSAlexey Brodkin#include <config.h>
84d93617dSAlexey Brodkin#include <linux/linkage.h>
94d93617dSAlexey Brodkin#include <asm/arcregs.h>
104d93617dSAlexey Brodkin
114d93617dSAlexey BrodkinENTRY(_start)
124d93617dSAlexey Brodkin	/* Setup interrupt vector base that matches "__text_start" */
134d93617dSAlexey Brodkin	sr	__ivt_start, [ARC_AUX_INTR_VEC_BASE]
144d93617dSAlexey Brodkin
15ef639e6fSAlexey Brodkin	; Disable/enable I-cache according to configuration
16ef639e6fSAlexey Brodkin	lr	r5, [ARC_BCR_IC_BUILD]
17ef639e6fSAlexey Brodkin	breq	r5, 0, 1f		; I$ doesn't exist
18ef639e6fSAlexey Brodkin	lr	r5, [ARC_AUX_IC_CTRL]
19ef639e6fSAlexey Brodkin#ifndef CONFIG_SYS_ICACHE_OFF
20ef639e6fSAlexey Brodkin	bclr	r5, r5, 0		; 0 - Enable, 1 is Disable
21ef639e6fSAlexey Brodkin#else
22ef639e6fSAlexey Brodkin	bset	r5, r5, 0		; I$ exists, but is not used
23ef639e6fSAlexey Brodkin#endif
24ef639e6fSAlexey Brodkin	sr	r5, [ARC_AUX_IC_CTRL]
25ef639e6fSAlexey Brodkin
26c0e6769aSEugeniy Paltsev	mov	r5, 1
27c0e6769aSEugeniy Paltsev	sr	r5, [ARC_AUX_IC_IVIC]
28c0e6769aSEugeniy Paltsev	; As per ARC HS databook (see chapter 5.3.3.2)
29c0e6769aSEugeniy Paltsev	; it is required to add 3 NOPs after each write to IC_IVIC.
30c0e6769aSEugeniy Paltsev	nop
31c0e6769aSEugeniy Paltsev	nop
32c0e6769aSEugeniy Paltsev	nop
33c0e6769aSEugeniy Paltsev
34ef639e6fSAlexey Brodkin1:
35ef639e6fSAlexey Brodkin	; Disable/enable D-cache according to configuration
36ef639e6fSAlexey Brodkin	lr	r5, [ARC_BCR_DC_BUILD]
37ef639e6fSAlexey Brodkin	breq	r5, 0, 1f		; D$ doesn't exist
38ef639e6fSAlexey Brodkin	lr	r5, [ARC_AUX_DC_CTRL]
39ef639e6fSAlexey Brodkin	bclr	r5, r5, 6		; Invalidate (discard w/o wback)
40ef639e6fSAlexey Brodkin#ifndef CONFIG_SYS_DCACHE_OFF
41ef639e6fSAlexey Brodkin	bclr	r5, r5, 0		; Enable (+Inv)
42ef639e6fSAlexey Brodkin#else
43ef639e6fSAlexey Brodkin	bset	r5, r5, 0		; Disable (+Inv)
44ef639e6fSAlexey Brodkin#endif
45ef639e6fSAlexey Brodkin	sr	r5, [ARC_AUX_DC_CTRL]
46ef639e6fSAlexey Brodkin
47c0e6769aSEugeniy Paltsev	mov	r5, 1
48c0e6769aSEugeniy Paltsev	sr	r5, [ARC_AUX_DC_IVDC]
49c0e6769aSEugeniy Paltsev
50c0e6769aSEugeniy Paltsev
51ef639e6fSAlexey Brodkin1:
52ef639e6fSAlexey Brodkin#ifdef CONFIG_ISA_ARCV2
53ef639e6fSAlexey Brodkin	; Disable System-Level Cache (SLC)
54ef639e6fSAlexey Brodkin	lr	r5, [ARC_BCR_SLC]
55ef639e6fSAlexey Brodkin	breq	r5, 0, 1f		; SLC doesn't exist
56ef639e6fSAlexey Brodkin	lr	r5, [ARC_AUX_SLC_CTRL]
57ef639e6fSAlexey Brodkin	bclr	r5, r5, 6		; Invalidate (discard w/o wback)
58ef639e6fSAlexey Brodkin	bclr	r5, r5, 0		; Enable (+Inv)
59ef639e6fSAlexey Brodkin	sr	r5, [ARC_AUX_SLC_CTRL]
60ef639e6fSAlexey Brodkin
61ef639e6fSAlexey Brodkin1:
62ef639e6fSAlexey Brodkin#endif
63ef639e6fSAlexey Brodkin
64*8f590063SAlexey Brodkin#ifdef __ARC_UNALIGNED__
65*8f590063SAlexey Brodkin	/*
66*8f590063SAlexey Brodkin	 * Enable handling of unaligned access in the CPU as by default
67*8f590063SAlexey Brodkin	 * this HW feature is disabled while GCC starting from 8.1.0
68*8f590063SAlexey Brodkin	 * unconditionally uses it for ARC HS cores.
69*8f590063SAlexey Brodkin	 */
70*8f590063SAlexey Brodkin	flag	1 << STATUS_AD_BIT
71*8f590063SAlexey Brodkin#endif
72*8f590063SAlexey Brodkin
73ecc30663SAlbert ARIBAUD	/* Establish C runtime stack and frame */
744d93617dSAlexey Brodkin	mov	%sp, CONFIG_SYS_INIT_SP_ADDR
754d93617dSAlexey Brodkin	mov	%fp, %sp
764d93617dSAlexey Brodkin
77ecc30663SAlbert ARIBAUD	/* Allocate reserved area from current top of stack */
78f56d625eSAlexey Brodkin	mov	%r0, %sp
79ecc30663SAlbert ARIBAUD	bl	board_init_f_alloc_reserve
80ecc30663SAlbert ARIBAUD	/* Set stack below reserved area, adjust frame pointer accordingly */
81f56d625eSAlexey Brodkin	mov	%sp, %r0
82f56d625eSAlexey Brodkin	mov	%fp, %sp
83f56d625eSAlexey Brodkin
84ecc30663SAlbert ARIBAUD	/* Initialize reserved area - note: r0 already contains address */
85ecc30663SAlbert ARIBAUD	bl	board_init_f_init_reserve
86ecc30663SAlbert ARIBAUD
87429fa25eSEugeniy Paltsev#ifdef CONFIG_DEBUG_UART
88429fa25eSEugeniy Paltsev	/* Earliest point to set up early debug uart */
89429fa25eSEugeniy Paltsev	bl	debug_uart_init
90429fa25eSEugeniy Paltsev#endif
91429fa25eSEugeniy Paltsev
924d93617dSAlexey Brodkin	/* Zero the one and only argument of "board_init_f" */
934d93617dSAlexey Brodkin	mov_s	%r0, 0
94264d298fSAlexey Brodkin	bl	board_init_f
95264d298fSAlexey Brodkin
96264d298fSAlexey Brodkin	/* We only get here if relocation is disabled by GD_FLG_SKIP_RELOC */
97264d298fSAlexey Brodkin	/* Make sure we don't lose GD overwritten by zero new GD */
98264d298fSAlexey Brodkin	mov	%r0, %r25
99264d298fSAlexey Brodkin	mov	%r1, 0
100264d298fSAlexey Brodkin	bl	board_init_r
1014d93617dSAlexey BrodkinENDPROC(_start)
1024d93617dSAlexey Brodkin
1034d93617dSAlexey Brodkin/*
1043fb80163SAlexey Brodkin * void board_init_f_r_trampoline(stack-pointer address)
1054d93617dSAlexey Brodkin *
1064d93617dSAlexey Brodkin * This "function" does not return, instead it continues in RAM
1074d93617dSAlexey Brodkin * after relocating the monitor code.
1084d93617dSAlexey Brodkin *
1093fb80163SAlexey Brodkin * r0 = new stack-pointer
1104d93617dSAlexey Brodkin */
1113fb80163SAlexey BrodkinENTRY(board_init_f_r_trampoline)
1123fb80163SAlexey Brodkin	/* Set up the stack- and frame-pointers */
1133fb80163SAlexey Brodkin	mov	%sp, %r0
1144d93617dSAlexey Brodkin	mov	%fp, %sp
1154d93617dSAlexey Brodkin
1164d93617dSAlexey Brodkin	/* Update position of intterupt vector table */
1173fb80163SAlexey Brodkin	lr	%r0, [ARC_AUX_INTR_VEC_BASE]
1183fb80163SAlexey Brodkin	ld	%r1, [%r25, GD_RELOC_OFF]
1193fb80163SAlexey Brodkin	add	%r0, %r0, %r1
1203fb80163SAlexey Brodkin	sr	%r0, [ARC_AUX_INTR_VEC_BASE]
1214d93617dSAlexey Brodkin
1223fb80163SAlexey Brodkin	/* Re-enter U-Boot by calling board_init_f_r */
1233fb80163SAlexey Brodkin	j	board_init_f_r
1243fb80163SAlexey BrodkinENDPROC(board_init_f_r_trampoline)
125