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