1*6260fb04SPeter Tyser/* 2*6260fb04SPeter Tyser * (C) Copyright 2007 Michal Simek 3*6260fb04SPeter Tyser * (C) Copyright 2004 Atmark Techno, Inc. 4*6260fb04SPeter Tyser * 5*6260fb04SPeter Tyser * Michal SIMEK <monstr@monstr.eu> 6*6260fb04SPeter Tyser * Yasushi SHOJI <yashi@atmark-techno.com> 7*6260fb04SPeter Tyser * 8*6260fb04SPeter Tyser * See file CREDITS for list of people who contributed to this 9*6260fb04SPeter Tyser * project. 10*6260fb04SPeter Tyser * 11*6260fb04SPeter Tyser * This program is free software; you can redistribute it and/or 12*6260fb04SPeter Tyser * modify it under the terms of the GNU General Public License as 13*6260fb04SPeter Tyser * published by the Free Software Foundation; either version 2 of 14*6260fb04SPeter Tyser * the License, or (at your option) any later version. 15*6260fb04SPeter Tyser * 16*6260fb04SPeter Tyser * This program is distributed in the hope that it will be useful, 17*6260fb04SPeter Tyser * but WITHOUT ANY WARRANTY; without even the implied warranty of 18*6260fb04SPeter Tyser * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19*6260fb04SPeter Tyser * GNU General Public License for more details. 20*6260fb04SPeter Tyser * 21*6260fb04SPeter Tyser * You should have received a copy of the GNU General Public License 22*6260fb04SPeter Tyser * along with this program; if not, write to the Free Software 23*6260fb04SPeter Tyser * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 24*6260fb04SPeter Tyser * MA 02111-1307 USA 25*6260fb04SPeter Tyser */ 26*6260fb04SPeter Tyser 27*6260fb04SPeter Tyser#include <config.h> 28*6260fb04SPeter Tyser 29*6260fb04SPeter Tyser .text 30*6260fb04SPeter Tyser .global _start 31*6260fb04SPeter Tyser_start: 32*6260fb04SPeter Tyser mts rmsr, r0 /* disable cache */ 33*6260fb04SPeter Tyser addi r1, r0, CONFIG_SYS_INIT_SP_OFFSET 34*6260fb04SPeter Tyser addi r1, r1, -4 /* Decrement SP to top of memory */ 35*6260fb04SPeter Tyser /* add opcode instruction for 32bit jump - 2 instruction imm & brai*/ 36*6260fb04SPeter Tyser addi r6, r0, 0xb0000000 /* hex b000 opcode imm */ 37*6260fb04SPeter Tyser swi r6, r0, 0x0 /* reset address */ 38*6260fb04SPeter Tyser swi r6, r0, 0x8 /* user vector exception */ 39*6260fb04SPeter Tyser swi r6, r0, 0x10 /* interrupt */ 40*6260fb04SPeter Tyser swi r6, r0, 0x20 /* hardware exception */ 41*6260fb04SPeter Tyser 42*6260fb04SPeter Tyser addi r6, r0, 0xb8080000 /* hew b808 opcode brai*/ 43*6260fb04SPeter Tyser swi r6, r0, 0x4 /* reset address */ 44*6260fb04SPeter Tyser swi r6, r0, 0xC /* user vector exception */ 45*6260fb04SPeter Tyser swi r6, r0, 0x14 /* interrupt */ 46*6260fb04SPeter Tyser swi r6, r0, 0x24 /* hardware exception */ 47*6260fb04SPeter Tyser 48*6260fb04SPeter Tyser#ifdef CONFIG_SYS_RESET_ADDRESS 49*6260fb04SPeter Tyser /* reset address */ 50*6260fb04SPeter Tyser addik r6, r0, CONFIG_SYS_RESET_ADDRESS 51*6260fb04SPeter Tyser sw r6, r1, r0 52*6260fb04SPeter Tyser lhu r7, r1, r0 53*6260fb04SPeter Tyser shi r7, r0, 0x2 54*6260fb04SPeter Tyser shi r6, r0, 0x6 55*6260fb04SPeter Tyser/* 56*6260fb04SPeter Tyser * Copy U-Boot code to TEXT_BASE 57*6260fb04SPeter Tyser * solve problem with sbrk_base 58*6260fb04SPeter Tyser */ 59*6260fb04SPeter Tyser#if (CONFIG_SYS_RESET_ADDRESS != TEXT_BASE) 60*6260fb04SPeter Tyser addi r4, r0, __end 61*6260fb04SPeter Tyser addi r5, r0, __text_start 62*6260fb04SPeter Tyser rsub r4, r5, r4 /* size = __end - __text_start */ 63*6260fb04SPeter Tyser addi r6, r0, CONFIG_SYS_RESET_ADDRESS /* source address */ 64*6260fb04SPeter Tyser addi r7, r0, 0 /* counter */ 65*6260fb04SPeter Tyser4: 66*6260fb04SPeter Tyser lw r8, r6, r7 67*6260fb04SPeter Tyser sw r8, r5, r7 68*6260fb04SPeter Tyser addi r7, r7, 0x4 69*6260fb04SPeter Tyser cmp r8, r4, r7 70*6260fb04SPeter Tyser blti r8, 4b 71*6260fb04SPeter Tyser#endif 72*6260fb04SPeter Tyser#endif 73*6260fb04SPeter Tyser 74*6260fb04SPeter Tyser#ifdef CONFIG_SYS_USR_EXCEP 75*6260fb04SPeter Tyser /* user_vector_exception */ 76*6260fb04SPeter Tyser addik r6, r0, _exception_handler 77*6260fb04SPeter Tyser sw r6, r1, r0 78*6260fb04SPeter Tyser lhu r7, r1, r0 79*6260fb04SPeter Tyser shi r7, r0, 0xa 80*6260fb04SPeter Tyser shi r6, r0, 0xe 81*6260fb04SPeter Tyser#endif 82*6260fb04SPeter Tyser 83*6260fb04SPeter Tyser#ifdef CONFIG_SYS_INTC_0 84*6260fb04SPeter Tyser /* interrupt_handler */ 85*6260fb04SPeter Tyser addik r6, r0, _interrupt_handler 86*6260fb04SPeter Tyser sw r6, r1, r0 87*6260fb04SPeter Tyser lhu r7, r1, r0 88*6260fb04SPeter Tyser shi r7, r0, 0x12 89*6260fb04SPeter Tyser shi r6, r0, 0x16 90*6260fb04SPeter Tyser#endif 91*6260fb04SPeter Tyser 92*6260fb04SPeter Tyser /* hardware exception */ 93*6260fb04SPeter Tyser addik r6, r0, _hw_exception_handler 94*6260fb04SPeter Tyser sw r6, r1, r0 95*6260fb04SPeter Tyser lhu r7, r1, r0 96*6260fb04SPeter Tyser shi r7, r0, 0x22 97*6260fb04SPeter Tyser shi r6, r0, 0x26 98*6260fb04SPeter Tyser 99*6260fb04SPeter Tyser /* enable instruction and data cache */ 100*6260fb04SPeter Tyser mfs r12, rmsr 101*6260fb04SPeter Tyser ori r12, r12, 0xa0 102*6260fb04SPeter Tyser mts rmsr, r12 103*6260fb04SPeter Tyser 104*6260fb04SPeter Tyserclear_bss: 105*6260fb04SPeter Tyser /* clear BSS segments */ 106*6260fb04SPeter Tyser addi r5, r0, __bss_start 107*6260fb04SPeter Tyser addi r4, r0, __bss_end 108*6260fb04SPeter Tyser cmp r6, r5, r4 109*6260fb04SPeter Tyser beqi r6, 3f 110*6260fb04SPeter Tyser2: 111*6260fb04SPeter Tyser swi r0, r5, 0 /* write zero to loc */ 112*6260fb04SPeter Tyser addi r5, r5, 4 /* increment to next loc */ 113*6260fb04SPeter Tyser cmp r6, r5, r4 /* check if we have reach the end */ 114*6260fb04SPeter Tyser bnei r6, 2b 115*6260fb04SPeter Tyser3: /* jumping to board_init */ 116*6260fb04SPeter Tyser brai board_init 117*6260fb04SPeter Tyser1: bri 1b 118*6260fb04SPeter Tyser 119*6260fb04SPeter Tyser/* 120*6260fb04SPeter Tyser * Read 16bit little endian 121*6260fb04SPeter Tyser */ 122*6260fb04SPeter Tyser .text 123*6260fb04SPeter Tyser .global in16 124*6260fb04SPeter Tyser .ent in16 125*6260fb04SPeter Tyser .align 2 126*6260fb04SPeter Tyserin16: lhu r3, r0, r5 127*6260fb04SPeter Tyser bslli r4, r3, 8 128*6260fb04SPeter Tyser bsrli r3, r3, 8 129*6260fb04SPeter Tyser andi r4, r4, 0xffff 130*6260fb04SPeter Tyser or r3, r3, r4 131*6260fb04SPeter Tyser rtsd r15, 8 132*6260fb04SPeter Tyser sext16 r3, r3 133*6260fb04SPeter Tyser .end in16 134*6260fb04SPeter Tyser 135*6260fb04SPeter Tyser/* 136*6260fb04SPeter Tyser * Write 16bit little endian 137*6260fb04SPeter Tyser * first parameter(r5) - address, second(r6) - short value 138*6260fb04SPeter Tyser */ 139*6260fb04SPeter Tyser .text 140*6260fb04SPeter Tyser .global out16 141*6260fb04SPeter Tyser .ent out16 142*6260fb04SPeter Tyser .align 2 143*6260fb04SPeter Tyserout16: bslli r3, r6, 8 144*6260fb04SPeter Tyser bsrli r6, r6, 8 145*6260fb04SPeter Tyser andi r3, r3, 0xffff 146*6260fb04SPeter Tyser or r3, r3, r6 147*6260fb04SPeter Tyser sh r3, r0, r5 148*6260fb04SPeter Tyser rtsd r15, 8 149*6260fb04SPeter Tyser or r0, r0, r0 150*6260fb04SPeter Tyser .end out16 151