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