1c121c5063c0674fad6811f0b0d86ec3bc6eecbbdVineet Gupta/* 2c121c5063c0674fad6811f0b0d86ec3bc6eecbbdVineet Gupta * ARC CPU startup Code 3c121c5063c0674fad6811f0b0d86ec3bc6eecbbdVineet Gupta * 4c121c5063c0674fad6811f0b0d86ec3bc6eecbbdVineet Gupta * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com) 5c121c5063c0674fad6811f0b0d86ec3bc6eecbbdVineet Gupta * 6c121c5063c0674fad6811f0b0d86ec3bc6eecbbdVineet Gupta * This program is free software; you can redistribute it and/or modify 7c121c5063c0674fad6811f0b0d86ec3bc6eecbbdVineet Gupta * it under the terms of the GNU General Public License version 2 as 8c121c5063c0674fad6811f0b0d86ec3bc6eecbbdVineet Gupta * published by the Free Software Foundation. 9c121c5063c0674fad6811f0b0d86ec3bc6eecbbdVineet Gupta * 10c121c5063c0674fad6811f0b0d86ec3bc6eecbbdVineet Gupta * Vineetg: Dec 2007 11c121c5063c0674fad6811f0b0d86ec3bc6eecbbdVineet Gupta * -Check if we are running on Simulator or on real hardware 12c121c5063c0674fad6811f0b0d86ec3bc6eecbbdVineet Gupta * to skip certain things during boot on simulator 13c121c5063c0674fad6811f0b0d86ec3bc6eecbbdVineet Gupta */ 14c121c5063c0674fad6811f0b0d86ec3bc6eecbbdVineet Gupta 15ef680cdc24376f394841a3f19b3a7ef6d57a009dVineet Gupta#include <linux/linkage.h> 16c121c5063c0674fad6811f0b0d86ec3bc6eecbbdVineet Gupta#include <asm/asm-offsets.h> 17c121c5063c0674fad6811f0b0d86ec3bc6eecbbdVineet Gupta#include <asm/entry.h> 18c121c5063c0674fad6811f0b0d86ec3bc6eecbbdVineet Gupta#include <asm/arcregs.h> 19ef680cdc24376f394841a3f19b3a7ef6d57a009dVineet Gupta#include <asm/cache.h> 20ef680cdc24376f394841a3f19b3a7ef6d57a009dVineet Gupta 21ef680cdc24376f394841a3f19b3a7ef6d57a009dVineet Gupta.macro CPU_EARLY_SETUP 22ef680cdc24376f394841a3f19b3a7ef6d57a009dVineet Gupta 23ef680cdc24376f394841a3f19b3a7ef6d57a009dVineet Gupta ; Setting up Vectror Table (in case exception happens in early boot 24ef680cdc24376f394841a3f19b3a7ef6d57a009dVineet Gupta sr @_int_vec_base_lds, [AUX_INTR_VEC_BASE] 25ef680cdc24376f394841a3f19b3a7ef6d57a009dVineet Gupta 26ef680cdc24376f394841a3f19b3a7ef6d57a009dVineet Gupta ; Disable I-cache/D-cache if kernel so configured 27ef680cdc24376f394841a3f19b3a7ef6d57a009dVineet Gupta lr r5, [ARC_REG_IC_BCR] 28ef680cdc24376f394841a3f19b3a7ef6d57a009dVineet Gupta breq r5, 0, 1f ; I$ doesn't exist 29ef680cdc24376f394841a3f19b3a7ef6d57a009dVineet Gupta lr r5, [ARC_REG_IC_CTRL] 30ef680cdc24376f394841a3f19b3a7ef6d57a009dVineet Gupta#ifdef CONFIG_ARC_HAS_ICACHE 31ef680cdc24376f394841a3f19b3a7ef6d57a009dVineet Gupta bclr r5, r5, 0 ; 0 - Enable, 1 is Disable 32ef680cdc24376f394841a3f19b3a7ef6d57a009dVineet Gupta#else 33ef680cdc24376f394841a3f19b3a7ef6d57a009dVineet Gupta bset r5, r5, 0 ; I$ exists, but is not used 34ef680cdc24376f394841a3f19b3a7ef6d57a009dVineet Gupta#endif 35ef680cdc24376f394841a3f19b3a7ef6d57a009dVineet Gupta sr r5, [ARC_REG_IC_CTRL] 36ef680cdc24376f394841a3f19b3a7ef6d57a009dVineet Gupta 37ef680cdc24376f394841a3f19b3a7ef6d57a009dVineet Gupta1: 38ef680cdc24376f394841a3f19b3a7ef6d57a009dVineet Gupta lr r5, [ARC_REG_DC_BCR] 39ef680cdc24376f394841a3f19b3a7ef6d57a009dVineet Gupta breq r5, 0, 1f ; D$ doesn't exist 40ef680cdc24376f394841a3f19b3a7ef6d57a009dVineet Gupta lr r5, [ARC_REG_DC_CTRL] 41ef680cdc24376f394841a3f19b3a7ef6d57a009dVineet Gupta bclr r5, r5, 6 ; Invalidate (discard w/o wback) 42ef680cdc24376f394841a3f19b3a7ef6d57a009dVineet Gupta#ifdef CONFIG_ARC_HAS_DCACHE 43ef680cdc24376f394841a3f19b3a7ef6d57a009dVineet Gupta bclr r5, r5, 0 ; Enable (+Inv) 44ef680cdc24376f394841a3f19b3a7ef6d57a009dVineet Gupta#else 45ef680cdc24376f394841a3f19b3a7ef6d57a009dVineet Gupta bset r5, r5, 0 ; Disable (+Inv) 46ef680cdc24376f394841a3f19b3a7ef6d57a009dVineet Gupta#endif 47ef680cdc24376f394841a3f19b3a7ef6d57a009dVineet Gupta sr r5, [ARC_REG_DC_CTRL] 48ef680cdc24376f394841a3f19b3a7ef6d57a009dVineet Gupta 49ef680cdc24376f394841a3f19b3a7ef6d57a009dVineet Gupta1: 50ef680cdc24376f394841a3f19b3a7ef6d57a009dVineet Gupta.endm 51c121c5063c0674fad6811f0b0d86ec3bc6eecbbdVineet Gupta 52c121c5063c0674fad6811f0b0d86ec3bc6eecbbdVineet Gupta .cpu A7 53c121c5063c0674fad6811f0b0d86ec3bc6eecbbdVineet Gupta 54c121c5063c0674fad6811f0b0d86ec3bc6eecbbdVineet Gupta .section .init.text, "ax",@progbits 55c121c5063c0674fad6811f0b0d86ec3bc6eecbbdVineet Gupta .type stext, @function 56c121c5063c0674fad6811f0b0d86ec3bc6eecbbdVineet Gupta .globl stext 57c121c5063c0674fad6811f0b0d86ec3bc6eecbbdVineet Guptastext: 58c121c5063c0674fad6811f0b0d86ec3bc6eecbbdVineet Gupta ;------------------------------------------------------------------- 59c3441edd2dea83923421fd6050d2ffdc57696323Vineet Gupta ; Don't clobber r0-r2 yet. It might have bootloader provided info 60c121c5063c0674fad6811f0b0d86ec3bc6eecbbdVineet Gupta ;------------------------------------------------------------------- 61c121c5063c0674fad6811f0b0d86ec3bc6eecbbdVineet Gupta 62ef680cdc24376f394841a3f19b3a7ef6d57a009dVineet Gupta CPU_EARLY_SETUP 6305b016ecf5e7a8c24409d8e9effb5d2ec9107708Vineet Gupta 6441195d236e84458bebd4fdc218610a92231ac791Vineet Gupta#ifdef CONFIG_SMP 65c3441edd2dea83923421fd6050d2ffdc57696323Vineet Gupta ; Ensure Boot (Master) proceeds. Others wait in platform dependent way 6641195d236e84458bebd4fdc218610a92231ac791Vineet Gupta ; IDENTITY Reg [ 3 2 1 0 ] 6741195d236e84458bebd4fdc218610a92231ac791Vineet Gupta ; (cpu-id) ^^^ => Zero for UP ARC700 6841195d236e84458bebd4fdc218610a92231ac791Vineet Gupta ; => #Core-ID if SMP (Master 0) 69c3567f8a359b7917dcffa442301f88ed0a75211fNoam Camus ; Note that non-boot CPUs might not land here if halt-on-reset and 70c3567f8a359b7917dcffa442301f88ed0a75211fNoam Camus ; instead breath life from @first_lines_of_secondary, but we still 71c3567f8a359b7917dcffa442301f88ed0a75211fNoam Camus ; need to make sure only boot cpu takes this path. 7241195d236e84458bebd4fdc218610a92231ac791Vineet Gupta GET_CPU_ID r5 7341195d236e84458bebd4fdc218610a92231ac791Vineet Gupta cmp r5, 0 74c3441edd2dea83923421fd6050d2ffdc57696323Vineet Gupta mov.ne r0, r5 75c3441edd2dea83923421fd6050d2ffdc57696323Vineet Gupta jne arc_platform_smp_wait_to_boot 7641195d236e84458bebd4fdc218610a92231ac791Vineet Gupta#endif 77c121c5063c0674fad6811f0b0d86ec3bc6eecbbdVineet Gupta ; Clear BSS before updating any globals 78c121c5063c0674fad6811f0b0d86ec3bc6eecbbdVineet Gupta ; XXX: use ZOL here 79c121c5063c0674fad6811f0b0d86ec3bc6eecbbdVineet Gupta mov r5, __bss_start 80bef444a33004f4062930df1fc703a25dd6d7b460Vineet Gupta sub r6, __bss_stop, r5 81bef444a33004f4062930df1fc703a25dd6d7b460Vineet Gupta lsr.f lp_count, r6, 2 82bef444a33004f4062930df1fc703a25dd6d7b460Vineet Gupta lpnz 1f 83bef444a33004f4062930df1fc703a25dd6d7b460Vineet Gupta st.ab 0, [r5, 4] 84c121c5063c0674fad6811f0b0d86ec3bc6eecbbdVineet Gupta1: 85c121c5063c0674fad6811f0b0d86ec3bc6eecbbdVineet Gupta 8659ed9413533897823bcdb4c79fd2904718e25b0aVineet Gupta ; Uboot - kernel ABI 8759ed9413533897823bcdb4c79fd2904718e25b0aVineet Gupta ; r0 = [0] No uboot interaction, [1] cmdline in r2, [2] DTB in r2 8859ed9413533897823bcdb4c79fd2904718e25b0aVineet Gupta ; r1 = magic number (board identity, unused as of now 8959ed9413533897823bcdb4c79fd2904718e25b0aVineet Gupta ; r2 = pointer to uboot provided cmdline or external DTB in mem 9059ed9413533897823bcdb4c79fd2904718e25b0aVineet Gupta ; These are handled later in setup_arch() 9159ed9413533897823bcdb4c79fd2904718e25b0aVineet Gupta st r0, [@uboot_tag] 9259ed9413533897823bcdb4c79fd2904718e25b0aVineet Gupta st r2, [@uboot_arg] 93c121c5063c0674fad6811f0b0d86ec3bc6eecbbdVineet Gupta 94c121c5063c0674fad6811f0b0d86ec3bc6eecbbdVineet Gupta ; setup "current" tsk and optionally cache it in dedicated r25 95c121c5063c0674fad6811f0b0d86ec3bc6eecbbdVineet Gupta mov r9, @init_task 96c121c5063c0674fad6811f0b0d86ec3bc6eecbbdVineet Gupta SET_CURR_TASK_ON_CPU r9, r0 ; r9 = tsk, r0 = scratch 97c121c5063c0674fad6811f0b0d86ec3bc6eecbbdVineet Gupta 98c121c5063c0674fad6811f0b0d86ec3bc6eecbbdVineet Gupta ; setup stack (fp, sp) 99c121c5063c0674fad6811f0b0d86ec3bc6eecbbdVineet Gupta mov fp, 0 100c121c5063c0674fad6811f0b0d86ec3bc6eecbbdVineet Gupta 101c121c5063c0674fad6811f0b0d86ec3bc6eecbbdVineet Gupta ; tsk->thread_info is really a PAGE, whose bottom hoists stack 102c121c5063c0674fad6811f0b0d86ec3bc6eecbbdVineet Gupta GET_TSK_STACK_BASE r9, sp ; r9 = tsk, sp = stack base(output) 103c121c5063c0674fad6811f0b0d86ec3bc6eecbbdVineet Gupta 104c121c5063c0674fad6811f0b0d86ec3bc6eecbbdVineet Gupta j start_kernel ; "C" entry point 10541195d236e84458bebd4fdc218610a92231ac791Vineet Gupta 10641195d236e84458bebd4fdc218610a92231ac791Vineet Gupta#ifdef CONFIG_SMP 10741195d236e84458bebd4fdc218610a92231ac791Vineet Gupta;---------------------------------------------------------------- 10841195d236e84458bebd4fdc218610a92231ac791Vineet Gupta; First lines of code run by secondary before jumping to 'C' 10941195d236e84458bebd4fdc218610a92231ac791Vineet Gupta;---------------------------------------------------------------- 1108f5d221b0641a9a16311a6e5c056a5b583ef0cbbChen Gang .section .text, "ax",@progbits 11141195d236e84458bebd4fdc218610a92231ac791Vineet Gupta .type first_lines_of_secondary, @function 11241195d236e84458bebd4fdc218610a92231ac791Vineet Gupta .globl first_lines_of_secondary 11341195d236e84458bebd4fdc218610a92231ac791Vineet Gupta 11441195d236e84458bebd4fdc218610a92231ac791Vineet Guptafirst_lines_of_secondary: 11541195d236e84458bebd4fdc218610a92231ac791Vineet Gupta 116ef680cdc24376f394841a3f19b3a7ef6d57a009dVineet Gupta CPU_EARLY_SETUP 117c3567f8a359b7917dcffa442301f88ed0a75211fNoam Camus 11841195d236e84458bebd4fdc218610a92231ac791Vineet Gupta ; setup per-cpu idle task as "current" on this CPU 11941195d236e84458bebd4fdc218610a92231ac791Vineet Gupta ld r0, [@secondary_idle_tsk] 12041195d236e84458bebd4fdc218610a92231ac791Vineet Gupta SET_CURR_TASK_ON_CPU r0, r1 12141195d236e84458bebd4fdc218610a92231ac791Vineet Gupta 12241195d236e84458bebd4fdc218610a92231ac791Vineet Gupta ; setup stack (fp, sp) 12341195d236e84458bebd4fdc218610a92231ac791Vineet Gupta mov fp, 0 12441195d236e84458bebd4fdc218610a92231ac791Vineet Gupta 12541195d236e84458bebd4fdc218610a92231ac791Vineet Gupta ; set it's stack base to tsk->thread_info bottom 12641195d236e84458bebd4fdc218610a92231ac791Vineet Gupta GET_TSK_STACK_BASE r0, sp 12741195d236e84458bebd4fdc218610a92231ac791Vineet Gupta 12841195d236e84458bebd4fdc218610a92231ac791Vineet Gupta j start_kernel_secondary 12941195d236e84458bebd4fdc218610a92231ac791Vineet Gupta 13041195d236e84458bebd4fdc218610a92231ac791Vineet Gupta#endif 131