xref: /openbmc/u-boot/arch/microblaze/cpu/start.S (revision 6260fb0458d94c83aa5b180745b1946c0c94d364)
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