1c121c506SVineet Gupta/* 2c121c506SVineet Gupta * ARC CPU startup Code 3c121c506SVineet Gupta * 4c121c506SVineet Gupta * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com) 5c121c506SVineet Gupta * 6c121c506SVineet Gupta * This program is free software; you can redistribute it and/or modify 7c121c506SVineet Gupta * it under the terms of the GNU General Public License version 2 as 8c121c506SVineet Gupta * published by the Free Software Foundation. 9c121c506SVineet Gupta * 10c121c506SVineet Gupta * Vineetg: Dec 2007 11c121c506SVineet Gupta * -Check if we are running on Simulator or on real hardware 12c121c506SVineet Gupta * to skip certain things during boot on simulator 13c121c506SVineet Gupta */ 14c121c506SVineet Gupta 15ef680cdcSVineet Gupta#include <linux/linkage.h> 16c121c506SVineet Gupta#include <asm/asm-offsets.h> 17c121c506SVineet Gupta#include <asm/entry.h> 18c121c506SVineet Gupta#include <asm/arcregs.h> 19ef680cdcSVineet Gupta#include <asm/cache.h> 20ef680cdcSVineet Gupta 21ef680cdcSVineet Gupta.macro CPU_EARLY_SETUP 22ef680cdcSVineet Gupta 23ef680cdcSVineet Gupta ; Setting up Vectror Table (in case exception happens in early boot 24ef680cdcSVineet Gupta sr @_int_vec_base_lds, [AUX_INTR_VEC_BASE] 25ef680cdcSVineet Gupta 26ef680cdcSVineet Gupta ; Disable I-cache/D-cache if kernel so configured 27ef680cdcSVineet Gupta lr r5, [ARC_REG_IC_BCR] 28ef680cdcSVineet Gupta breq r5, 0, 1f ; I$ doesn't exist 29ef680cdcSVineet Gupta lr r5, [ARC_REG_IC_CTRL] 30ef680cdcSVineet Gupta#ifdef CONFIG_ARC_HAS_ICACHE 31ef680cdcSVineet Gupta bclr r5, r5, 0 ; 0 - Enable, 1 is Disable 32ef680cdcSVineet Gupta#else 33ef680cdcSVineet Gupta bset r5, r5, 0 ; I$ exists, but is not used 34ef680cdcSVineet Gupta#endif 35ef680cdcSVineet Gupta sr r5, [ARC_REG_IC_CTRL] 36ef680cdcSVineet Gupta 37ef680cdcSVineet Gupta1: 38ef680cdcSVineet Gupta lr r5, [ARC_REG_DC_BCR] 39ef680cdcSVineet Gupta breq r5, 0, 1f ; D$ doesn't exist 40ef680cdcSVineet Gupta lr r5, [ARC_REG_DC_CTRL] 41ef680cdcSVineet Gupta bclr r5, r5, 6 ; Invalidate (discard w/o wback) 42ef680cdcSVineet Gupta#ifdef CONFIG_ARC_HAS_DCACHE 43ef680cdcSVineet Gupta bclr r5, r5, 0 ; Enable (+Inv) 44ef680cdcSVineet Gupta#else 45ef680cdcSVineet Gupta bset r5, r5, 0 ; Disable (+Inv) 46ef680cdcSVineet Gupta#endif 47ef680cdcSVineet Gupta sr r5, [ARC_REG_DC_CTRL] 48ef680cdcSVineet Gupta 49ef680cdcSVineet Gupta1: 50ef680cdcSVineet Gupta.endm 51c121c506SVineet Gupta 52c121c506SVineet Gupta .section .init.text, "ax",@progbits 533971cdc2SVineet Gupta 543971cdc2SVineet Gupta;---------------------------------------------------------------- 553971cdc2SVineet Gupta; Default Reset Handler (jumped into from Reset vector) 563971cdc2SVineet Gupta; - Don't clobber r0,r1,r2 as they might have u-boot provided args 573971cdc2SVineet Gupta; - Platforms can override this weak version if needed 583971cdc2SVineet Gupta;---------------------------------------------------------------- 593971cdc2SVineet GuptaWEAK(res_service) 603971cdc2SVineet Gupta j stext 613971cdc2SVineet GuptaEND(res_service) 623971cdc2SVineet Gupta 633971cdc2SVineet Gupta;---------------------------------------------------------------- 643971cdc2SVineet Gupta; Kernel Entry point 653971cdc2SVineet Gupta;---------------------------------------------------------------- 663971cdc2SVineet GuptaENTRY(stext) 67c121c506SVineet Gupta 68ef680cdcSVineet Gupta CPU_EARLY_SETUP 6905b016ecSVineet Gupta 7041195d23SVineet Gupta#ifdef CONFIG_SMP 7141195d23SVineet Gupta GET_CPU_ID r5 7241195d23SVineet Gupta cmp r5, 0 733971cdc2SVineet Gupta mov.nz r0, r5 74*bf02454aSVineet Gupta bz .Lmaster_proceed 75*bf02454aSVineet Gupta 763971cdc2SVineet Gupta ; Non-Masters wait for Master to boot enough and bring them up 77*bf02454aSVineet Gupta ; when they resume, tail-call to entry point 78*bf02454aSVineet Gupta mov blink, @first_lines_of_secondary 79*bf02454aSVineet Gupta j arc_platform_smp_wait_to_boot 80*bf02454aSVineet Gupta 81*bf02454aSVineet Gupta.Lmaster_proceed: 823971cdc2SVineet Gupta#endif 833971cdc2SVineet Gupta 84c121c506SVineet Gupta ; Clear BSS before updating any globals 85c121c506SVineet Gupta ; XXX: use ZOL here 86c121c506SVineet Gupta mov r5, __bss_start 87bef444a3SVineet Gupta sub r6, __bss_stop, r5 88bef444a3SVineet Gupta lsr.f lp_count, r6, 2 89bef444a3SVineet Gupta lpnz 1f 90c121c506SVineet Gupta st.ab 0, [r5, 4] 91bef444a3SVineet Gupta1: 92c121c506SVineet Gupta 93036b2c56SVineet Gupta#ifdef CONFIG_ARC_UBOOT_SUPPORT 9459ed9413SVineet Gupta ; Uboot - kernel ABI 9559ed9413SVineet Gupta ; r0 = [0] No uboot interaction, [1] cmdline in r2, [2] DTB in r2 9659ed9413SVineet Gupta ; r1 = magic number (board identity, unused as of now 9759ed9413SVineet Gupta ; r2 = pointer to uboot provided cmdline or external DTB in mem 9859ed9413SVineet Gupta ; These are handled later in setup_arch() 9959ed9413SVineet Gupta st r0, [@uboot_tag] 10059ed9413SVineet Gupta st r2, [@uboot_arg] 101036b2c56SVineet Gupta#endif 102c121c506SVineet Gupta 103c121c506SVineet Gupta ; setup "current" tsk and optionally cache it in dedicated r25 104c121c506SVineet Gupta mov r9, @init_task 105c121c506SVineet Gupta SET_CURR_TASK_ON_CPU r9, r0 ; r9 = tsk, r0 = scratch 106c121c506SVineet Gupta 107c121c506SVineet Gupta ; setup stack (fp, sp) 108c121c506SVineet Gupta mov fp, 0 109c121c506SVineet Gupta 110c121c506SVineet Gupta ; tsk->thread_info is really a PAGE, whose bottom hoists stack 111c121c506SVineet Gupta GET_TSK_STACK_BASE r9, sp ; r9 = tsk, sp = stack base(output) 112c121c506SVineet Gupta 113c121c506SVineet Gupta j start_kernel ; "C" entry point 1143971cdc2SVineet GuptaEND(stext) 11541195d23SVineet Gupta 11641195d23SVineet Gupta#ifdef CONFIG_SMP 11741195d23SVineet Gupta;---------------------------------------------------------------- 11841195d23SVineet Gupta; First lines of code run by secondary before jumping to 'C' 11941195d23SVineet Gupta;---------------------------------------------------------------- 1208f5d221bSChen Gang .section .text, "ax",@progbits 1213971cdc2SVineet GuptaENTRY(first_lines_of_secondary) 12241195d23SVineet Gupta 12341195d23SVineet Gupta ; setup per-cpu idle task as "current" on this CPU 12441195d23SVineet Gupta ld r0, [@secondary_idle_tsk] 12541195d23SVineet Gupta SET_CURR_TASK_ON_CPU r0, r1 12641195d23SVineet Gupta 12741195d23SVineet Gupta ; setup stack (fp, sp) 12841195d23SVineet Gupta mov fp, 0 12941195d23SVineet Gupta 13041195d23SVineet Gupta ; set it's stack base to tsk->thread_info bottom 13141195d23SVineet Gupta GET_TSK_STACK_BASE r0, sp 13241195d23SVineet Gupta 13341195d23SVineet Gupta j start_kernel_secondary 1343971cdc2SVineet GuptaEND(first_lines_of_secondary) 13541195d23SVineet Gupta#endif 136