xref: /rk3399_rockchip-uboot/arch/arc/lib/start.S (revision ecc306639e83c9019a5093b77a48685ea40eedc2)
14d93617dSAlexey Brodkin/*
24d93617dSAlexey Brodkin * Copyright (C) 2013-2014 Synopsys, Inc. All rights reserved.
34d93617dSAlexey Brodkin *
44d93617dSAlexey Brodkin * SPDX-License-Identifier:	GPL-2.0+
54d93617dSAlexey Brodkin */
64d93617dSAlexey Brodkin
74d93617dSAlexey Brodkin#include <asm-offsets.h>
84d93617dSAlexey Brodkin#include <config.h>
94d93617dSAlexey Brodkin#include <linux/linkage.h>
104d93617dSAlexey Brodkin#include <asm/arcregs.h>
114d93617dSAlexey Brodkin
124d93617dSAlexey BrodkinENTRY(_start)
134d93617dSAlexey Brodkin	/* Setup interrupt vector base that matches "__text_start" */
144d93617dSAlexey Brodkin	sr	__ivt_start, [ARC_AUX_INTR_VEC_BASE]
154d93617dSAlexey Brodkin
16ef639e6fSAlexey Brodkin	; Disable/enable I-cache according to configuration
17ef639e6fSAlexey Brodkin	lr	r5, [ARC_BCR_IC_BUILD]
18ef639e6fSAlexey Brodkin	breq	r5, 0, 1f		; I$ doesn't exist
19ef639e6fSAlexey Brodkin	lr	r5, [ARC_AUX_IC_CTRL]
20ef639e6fSAlexey Brodkin#ifndef CONFIG_SYS_ICACHE_OFF
21ef639e6fSAlexey Brodkin	bclr	r5, r5, 0		; 0 - Enable, 1 is Disable
22ef639e6fSAlexey Brodkin#else
23ef639e6fSAlexey Brodkin	bset	r5, r5, 0		; I$ exists, but is not used
24ef639e6fSAlexey Brodkin#endif
25ef639e6fSAlexey Brodkin	sr	r5, [ARC_AUX_IC_CTRL]
26ef639e6fSAlexey Brodkin
27ef639e6fSAlexey Brodkin1:
28ef639e6fSAlexey Brodkin	; Disable/enable D-cache according to configuration
29ef639e6fSAlexey Brodkin	lr	r5, [ARC_BCR_DC_BUILD]
30ef639e6fSAlexey Brodkin	breq	r5, 0, 1f		; D$ doesn't exist
31ef639e6fSAlexey Brodkin	lr	r5, [ARC_AUX_DC_CTRL]
32ef639e6fSAlexey Brodkin	bclr	r5, r5, 6		; Invalidate (discard w/o wback)
33ef639e6fSAlexey Brodkin#ifndef CONFIG_SYS_DCACHE_OFF
34ef639e6fSAlexey Brodkin	bclr	r5, r5, 0		; Enable (+Inv)
35ef639e6fSAlexey Brodkin#else
36ef639e6fSAlexey Brodkin	bset	r5, r5, 0		; Disable (+Inv)
37ef639e6fSAlexey Brodkin#endif
38ef639e6fSAlexey Brodkin	sr	r5, [ARC_AUX_DC_CTRL]
39ef639e6fSAlexey Brodkin
40ef639e6fSAlexey Brodkin1:
41ef639e6fSAlexey Brodkin#ifdef CONFIG_ISA_ARCV2
42ef639e6fSAlexey Brodkin	; Disable System-Level Cache (SLC)
43ef639e6fSAlexey Brodkin	lr	r5, [ARC_BCR_SLC]
44ef639e6fSAlexey Brodkin	breq	r5, 0, 1f		; SLC doesn't exist
45ef639e6fSAlexey Brodkin	lr	r5, [ARC_AUX_SLC_CTRL]
46ef639e6fSAlexey Brodkin	bclr	r5, r5, 6		; Invalidate (discard w/o wback)
47ef639e6fSAlexey Brodkin	bclr	r5, r5, 0		; Enable (+Inv)
48ef639e6fSAlexey Brodkin	sr	r5, [ARC_AUX_SLC_CTRL]
49ef639e6fSAlexey Brodkin
50ef639e6fSAlexey Brodkin1:
51ef639e6fSAlexey Brodkin#endif
52ef639e6fSAlexey Brodkin
53*ecc30663SAlbert ARIBAUD	/* Establish C runtime stack and frame */
544d93617dSAlexey Brodkin	mov	%sp, CONFIG_SYS_INIT_SP_ADDR
554d93617dSAlexey Brodkin	mov	%fp, %sp
564d93617dSAlexey Brodkin
57*ecc30663SAlbert ARIBAUD	/* Allocate reserved area from current top of stack */
58f56d625eSAlexey Brodkin	mov	%r0, %sp
59*ecc30663SAlbert ARIBAUD	bl	board_init_f_alloc_reserve
60*ecc30663SAlbert ARIBAUD	/* Set stack below reserved area, adjust frame pointer accordingly */
61f56d625eSAlexey Brodkin	mov	%sp, %r0
62f56d625eSAlexey Brodkin	mov	%fp, %sp
63f56d625eSAlexey Brodkin
64*ecc30663SAlbert ARIBAUD	/* Initialize reserved area - note: r0 already contains address */
65*ecc30663SAlbert ARIBAUD	bl	board_init_f_init_reserve
66*ecc30663SAlbert ARIBAUD
674d93617dSAlexey Brodkin	/* Zero the one and only argument of "board_init_f" */
684d93617dSAlexey Brodkin	mov_s	%r0, 0
694d93617dSAlexey Brodkin	j	board_init_f
704d93617dSAlexey BrodkinENDPROC(_start)
714d93617dSAlexey Brodkin
724d93617dSAlexey Brodkin/*
733fb80163SAlexey Brodkin * void board_init_f_r_trampoline(stack-pointer address)
744d93617dSAlexey Brodkin *
754d93617dSAlexey Brodkin * This "function" does not return, instead it continues in RAM
764d93617dSAlexey Brodkin * after relocating the monitor code.
774d93617dSAlexey Brodkin *
783fb80163SAlexey Brodkin * r0 = new stack-pointer
794d93617dSAlexey Brodkin */
803fb80163SAlexey BrodkinENTRY(board_init_f_r_trampoline)
813fb80163SAlexey Brodkin	/* Set up the stack- and frame-pointers */
823fb80163SAlexey Brodkin	mov	%sp, %r0
834d93617dSAlexey Brodkin	mov	%fp, %sp
844d93617dSAlexey Brodkin
854d93617dSAlexey Brodkin	/* Update position of intterupt vector table */
863fb80163SAlexey Brodkin	lr	%r0, [ARC_AUX_INTR_VEC_BASE]
873fb80163SAlexey Brodkin	ld	%r1, [%r25, GD_RELOC_OFF]
883fb80163SAlexey Brodkin	add	%r0, %r0, %r1
893fb80163SAlexey Brodkin	sr	%r0, [ARC_AUX_INTR_VEC_BASE]
904d93617dSAlexey Brodkin
913fb80163SAlexey Brodkin	/* Re-enter U-Boot by calling board_init_f_r */
923fb80163SAlexey Brodkin	j	board_init_f_r
933fb80163SAlexey BrodkinENDPROC(board_init_f_r_trampoline)
94