xloader: Panda - clean board files style
[x-loader:tajourias-x-loader.git] / cpu / omap4 / start.S
1 /*
2  *  armboot - Startup Code for OMAP4430/ARM Cortex CPU-core
3  *
4  *  Copyright (c) 2004  Texas Instruments <r-woodruff2@ti.com>
5  *
6  *  Copyright (c) 2001  Marius Groger <mag@sysgo.de>
7  *  Copyright (c) 2002  Alex Zupke <azu@sysgo.de>
8  *  Copyright (c) 2002  Gary Jennejohn <gj@denx.de>
9  *  Copyright (c) 2003  Richard Woodruff <r-woodruff2@ti.com>
10  *  Copyright (c) 2003  Kshitij <kshitij@ti.com>
11  *  Copyright (c) 2006  Syed Mohammed Khasim <x0khasim@ti.com>
12  *  Copyright (c) 2009  Texas Instruments
13  *
14  * See file CREDITS for list of people who contributed to this
15  * project.
16  *
17  * This program is free software; you can redistribute it and/or
18  * modify it under the terms of the GNU General Public License
19  * version 2 as published by the Free Software Foundation.
20  *
21  * This program is distributed in the hope that it will be useful,
22  * but WITHOUT ANY WARRANTY; without even the implied warranty of
23  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
24  * GNU General Public License for more details.
25  *
26  * You should have received a copy of the GNU General Public License
27  * along with this program; if not, write to the Free Software
28  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
29  * MA 02111-1307 USA
30  */
31
32 #include <config.h>
33 #if !defined(CONFIG_INTEGRATOR) && ! defined(CONFIG_ARCH_CINTEGRATOR)
34 #include <asm/arch/cpu.h>
35 #endif
36 #define CONFIG_SKIP_RELOCATE_XLOADER
37 .globl _start
38 _start:
39         b       reset
40         ldr     pc, _hang
41         ldr     pc, _hang
42         ldr     pc, _hang
43         ldr     pc, _hang
44         ldr     pc, _hang
45         ldr     pc, _hang
46         ldr     pc, _hang
47
48 _hang:
49         .word do_hang
50
51         .word 0x12345678
52         .word 0x12345678
53         .word 0x12345678
54         .word 0x12345678
55         .word 0x12345678
56         .word 0x12345678
57         .word 0x12345678 /* now 16*4=64 */
58
59 .global _end_vect
60 _end_vect:
61
62         .balignl 16,0xdeadbeef
63 /*
64  *************************************************************************
65  *
66  * Startup Code (reset vector)
67  *
68  * do important init only if we don't start from memory!
69  * setup Memory and board specific bits prior to relocation.
70  * relocate armboot to ram
71  * setup stack
72  *
73  *************************************************************************
74  */
75
76 _TEXT_BASE:
77         .word   TEXT_BASE
78
79 .globl _armboot_start
80 _armboot_start:
81         .word _start
82
83 /*
84  * These are defined in the board-specific linker script.
85  */
86 .globl _bss_start
87 _bss_start:
88         .word __bss_start
89
90 .globl _bss_end
91 _bss_end:
92         .word _end
93
94 /*
95  * the actual reset code
96  */
97
98 reset:
99         /* Use a temp scratch pad memory
100          * to store the boot reason
101          */
102         ldr     r4, scratchpad
103         ldr     r5, [r0, #0x8]          /* r5 <- value of boot device */
104         str     r5, [r4]                /* store r5 in scratchpad reg */
105
106         /*
107          * set the cpu to SVC32 mode
108          */
109         mrs     r0,cpsr
110         bic     r0,r0,#0x1f
111         orr     r0,r0,#0xd3
112         msr     cpsr,r0
113
114        /* Copy vectors to mask ROM indirect addr */
115         adr     r0, _start              /* r0 <- current position of code   */
116         add     r0, r0, #4                              /* skip reset vector */
117         mov     r2, #64                 /* r2 <- size to copy  */
118         add     r2, r0, r2              /* r2 <- source end address         */
119         mov     r1, #SRAM_OFFSET0         /* build vect addr */
120         mov     r3, #SRAM_OFFSET1
121         add     r1, r1, r3
122         mov     r3, #SRAM_OFFSET2
123         add     r1, r1, r3
124 next:
125         ldmia   r0!, {r3-r10}           /* copy from source address [r0]    */
126         stmia   r1!, {r3-r10}           /* copy to   target address [r1]    */
127         cmp     r0, r2                  /* until source end address [r2]    */
128         bne     next                    /* loop until equal */
129         /* the mask ROM code should have PLL and others stable */
130         bl  cpu_init_crit
131
132 #ifndef CONFIG_SKIP_RELOCATE_XLOADER
133 relocate:                               /* relocate U-Boot to RAM           */
134         adr     r0, _start              /* r0 <- current position of code   */
135         ldr     r1, _TEXT_BASE          /* test if we run from flash or RAM */
136         cmp     r0, r1                  /* don't reloc during debug         */
137         beq     stack_setup
138
139         ldr     r2, _armboot_start
140         ldr     r3, _bss_start
141         sub     r2, r3, r2              /* r2 <- size of armboot            */
142         add     r2, r0, r2              /* r2 <- source end address         */
143
144 copy_loop:                              /* copy 32 bytes at a time          */
145         ldmia   r0!, {r3-r10}           /* copy from source address [r0]    */
146         stmia   r1!, {r3-r10}           /* copy to   target address [r1]    */
147         cmp     r0, r2                  /* until source end addreee [r2]    */
148         ble     copy_loop
149 #endif
150
151         /* Set up the stack                                                 */
152 stack_setup:
153         ldr     r0, _TEXT_BASE          /* upper 128 KiB: relocated uboot   */
154         and     sp, sp, #~7             /* 8 byte alinged for (ldr/str)d    */
155
156         /* Clear BSS (if any).  Is below tx (watch load addr - need space)  */
157 clear_bss:
158         ldr     r0, _bss_start          /* find start of bss segment        */
159         ldr     r1, _bss_end            /* stop here                        */
160         mov     r2, #0x00000000         /* clear value                      */
161 clbss_l:
162         str     r2, [r0]                /* clear BSS location               */
163         cmp     r0, r1                  /* are we at the end yet            */
164         add     r0, r0, #4              /* increment clear index pointer    */
165         bne     clbss_l                 /* keep clearing till at end        */
166
167         ldr     pc, _start_armboot      /* jump to C code                   */
168
169 _start_armboot: .word start_armboot
170
171
172 /*
173  *************************************************************************
174  *
175  * CPU_init_critical registers
176  *
177  * setup important registers
178  * setup memory timing
179  *
180  *************************************************************************
181  */
182 cpu_init_crit:
183         /*
184          * Invalidate L1 I/D
185          */
186         mov     r0, #0                 /* set up for MCR */
187         mcr     p15, 0, r0, c8, c7, 0  /* invalidate TLBs */
188         mcr     p15, 0, r0, c7, c5, 0  /* invalidate icache */
189
190         /*
191          * disable MMU stuff and caches
192          */
193         mrc     p15, 0, r0, c1, c0, 0
194         bic     r0, r0, #0x00002000     @ clear bits 13 (--V-)
195         bic     r0, r0, #0x00000007     @ clear bits 2:0 (-CAM)
196         orr     r0, r0, #0x00000002     @ set bit 1 (--A-) Align
197         orr     r0, r0, #0x00000800     @ set bit 12 (Z---) BTB
198         mcr     p15, 0, r0, c1, c0, 0
199
200         /*
201          * Jump to board specific initialization... The Mask ROM will
202          * have already initialized basic memory.  Go here to bump up
203          * clock rate and handle wake up conditions.
204          */
205         mov     ip, lr          /* persevere link reg across call */
206         bl      lowlevel_init   /* go setup pll,mux,memory */
207         mov     lr, ip          /* restore link */
208         mov     pc, lr          /* back to my caller */
209
210
211 /*
212  * exception handler
213  */
214         .align  5
215 do_hang:
216         ldr     sp, _TEXT_BASE          /* use 32 words abort stack */
217         bl      hang                    /* hang and never return */
218
219 scratchpad:
220     .word 0x4A326000