Migrate UI cleanup phase 4 from MIPS into ARM
[tomato.git] / release / src-rt-6.x.4708 / shared / bootarm.S
blob4007448b6308ceaf0dfb6a474c8a726ad95f8d12
1 /*
2  * HNDRTE ARM boot code for standalone apps.
3  *
4  * Code should be position-independent until it copies itself to SRAM.
5  *
6  * Copyright (C) 2013, Broadcom Corporation. All Rights Reserved.
7  * 
8  * Permission to use, copy, modify, and/or distribute this software for any
9  * purpose with or without fee is hereby granted, provided that the above
10  * copyright notice and this permission notice appear in all copies.
11  * 
12  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
15  * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
17  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
18  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19  *
20  * $Id: bootarm.S,v 1.18 2008-04-03 18:30:21 $
21  */
23 #include <arminc.h>
24 #include <sbhndarm.h>
25 #include <sbconfig.h>
27 #include "startarm.S"
29         .text
31 #if defined(__ARM_ARCH_7R__)
32 FUNC(inflrom)
34 #ifndef FLOPS_SUPPORT
36 /* In the cr4 we don't have the luxury of multiple windows into ram/rom,
37  * when the rom is remapped to address 0, the ram shadowed by the rom is
38  * simply not available
39  *
40  * So the boot process is going to be:
41  *      1) Jump to the rom's real address
42  *      2) Change remap
43  *      3) Copy image to ram
44  *      4) Jump to ram
45  * Input:
46  *      r9 - arm wrapper
47  * Changed:
48         r0-r7
49  */
51         /* 1) Jump to the rom's real address */
52         ldr     r0,=atrom
53 #ifndef CONFIG_XIP
54         ldr     r1,=SI_ARM_ROM
55         add     r0,r0,r1
56 #endif
57         mov     r15, r0
59         /* 2) Change remap */
60 atrom:  
61         mov     r2,r9                   /* Get arm wrapper */
62         ldr     r5,=AI_IOCTRL
63         ldr     r3,[r2,r5]
64         ldr     r4,=SICF_REMAP_MSK
65         bic     r3,r3,r4
66         ldr     r4,=SICF_REMAP_NONE
67         orr     r3,r3,r4
68         str     r3,[r2,r5]
69         ldr     r3,[r2,r5]              /* read back to wait for the posted write */
71         /* 3) Copy image to ram */
72 #ifdef  CONFIG_XIP
73         /* install the exception handler in RAM */
74         ldr     r0,=text_start
75         eor     r1,r1,r1
76         ldr     r2,=disable_arm_irq
77 1:      ldmia   r0!,{r4-r7}
78         stmia   r1!,{r4-r7}
79         cmp     r2,r0
80         bhi     1b
82         /* Just copy the data segment */
83         ldr     r0,=rodata_end
84         ldr     r1,=data_start
86 #else
87         /* Copy entire image */
88         ldr     r0,=SI_ARM_ROM
89         ldr     r1,=text_start
91 #endif  /* CONFIG_XIP */
93 #else /* FLOPS_SUPPORT */
94         /* for case where flops is supported, there is no need to remap
95          * or copy the image/vectors to ram. Just copying the data 
96          * segment would be enough.
97          */
98         ldr     r0,=rodata_end
99         ldr     r1,=data_start
101 #endif /* FLOPS_SUPPORT */
103         ldr     r2,=data_end
104 2:      ldmia   r0!,{r4-r7}
105         stmia   r1!,{r4-r7}
106         cmp     r2,r1
107         bhi     2b
109         /* 4) Jump to ram */
110         bx      lr
111 #elif defined(__ARM_ARCH_7A__)
112 FUNC(inflrom)
114 #else   /* !__ARM_ARCH_7R__ && !__ARM_ARCH_7A__ */
117  * Copy data and code into RAM depending on where it's booted.
118  * Input:
119  *      r3 - remap.
120  *      r7 - (chip type << CID_TYPE_SHIFT)
121  *      r11 - socram wrapper
122  * Changed:
123  *      r0, r1, r2, r3, r4, r5
124  */
125 FUNC(inflrom)
126         /* Don't reset SOCRAM if running from ROM */
127         ldr     r0,=SICF_REMAP_ROM
128         cmp     r0,r3
129         beq     copytoram
131 /* Initialize SOCRAM */
132 initsocram:
133         mov     r0,r11
134         tst     r7,r7
135         bne     ai_initsocram
137         /* Do a core reset in SB chips */
138         ldr     r1,=(((SICF_FGC | SICF_CLOCK_EN) << SBTML_SICF_SHIFT) | SBTML_RESET)
139         ldr     r2,=SBTMSTATELOW
140         str     r1,[r0,r2]
141         /* Read back and delay */
142         ldr     r1,[r0,r2]
143         ldr     r1,[r0,r2]
144         ldr     r1,[r0,r2]
145         /* Clear reset */
146         ldr     r1,=((SICF_FGC | SICF_CLOCK_EN) << SBTML_SICF_SHIFT)
147         str     r1,[r0,r2]
148         /* Read back and delay */
149         ldr     r1,[r0,r2]
150         ldr     r1,[r0,r2]
151         ldr     r1,[r0,r2]
152         /* Leave clock enabled */
153         ldr     r1,=(SICF_CLOCK_EN << SBTML_SICF_SHIFT)
154         str     r1,[r0,r2]
155         /* Read back and delay */
156         ldr     r1,[r0,r2]
157         ldr     r1,[r0,r2]
158         ldr     r1,[r0,r2]
160         b       copytoram
162         /* Do a core reset in AI chips */
163 ai_initsocram:
164         /* Set reset while enabling the clock */
165         ldr     r1,=(SICF_FGC | SICF_CLOCK_EN)
166         ldr     r2,=AI_IOCTRLSET
167         str     r1,[r0,r2]
168         ldr     r1,=AIRC_RESET
169         ldr     r2,=AI_RESETCTRL
170         str     r1,[r0,r2]
171         /* Read back and delay */
172         ldr     r1,[r0,r2]
173         ldr     r1,[r0,r2]
174         ldr     r1,[r0,r2]
176         /* Clear reset */
177         ldr     r1,=0
178         str     r1,[r0,r2]
179         /* Read back and delay */
180         ldr     r1,[r0,r2]
181         ldr     r1,[r0,r2]
182         ldr     r1,[r0,r2]
184         /* Clear Force Gated Clock */
185         ldr     r1,=SICF_FGC
186         ldr     r2,=AI_IOCTRLCLEAR
187         str     r1,[r0,r2]
188         /* Read back and delay */
189         ldr     r2,=AI_IOCTRL
190         ldr     r1,[r0,r2]
191         ldr     r1,[r0,r2]
192         ldr     r1,[r0,r2]
194 /* Copy data or self to SRAM */
195 copytoram:
196 #ifdef  CONFIG_XIP
197         /* Just copy the data segment */
198         ldr     r0,=rodata_end
199         ldr     r1,=data_start
200         ldr     r2,=data_end
201 1:      ldmia   r0!,{r3-r4}
202         stmia   r1!,{r3-r4}
203         cmp     r2,r1
204         bhi     1b
205         mov     pc,lr
206 #else
207         /* Copy entire image */
208         ldr     r0,=SI_ARM_ROM
209         ldr     r2,=SICF_REMAP_ROM
210         cmp     r3,r2
211         beq     1f
212         ldr     r0,=SI_FLASH2
213 1:      ldr     r1,=text_start
215         /* Copy upto donecopy and then run docopy from SRAM */
216         ldr     r2,=donecopy
217         ldr     r3,=SI_ARM_SRAM2
218         add     r1,r1,r3
219         add     r2,r2,r3
220         ldr     r3,=mapoff
221         b       docopy
223 /* Now change RAM mapping to NONE/SRAM */
224 mapoff:
225         mov     r2,r9                   /* Get arm wrapper */
226         tst     r7,r7
227         bne     1f
229         /* For SB chips, get sbtmstatelow and shift it */
230         ldr     r5,=SBTMSTATELOW
231         ldr     r3,[r2,r5]
232         ldr     r6,=SBTML_SICF_SHIFT
233         _LSR_   r3,r3,r6
234         b       2f
236         /* For AI chips, just get ioctrl register */
237 1:      ldr     r5,=AI_IOCTRL
238         ldr     r3,[r2,r5]
239         eor     r6,r6,r6
241 2:      ldr     r4,=SICF_REMAP_MSK
242         bic     r3,r3,r4
243         ldr     r4,=SICF_REMAP_NONE
244         orr     r3,r3,r4
245         _LSL_   r3,r3,r6
246 3:      str     r3,[r2,r5]
247         /* read back to wait for the posted write */
248         ldr     r3,[r2,r5]
249         nop
250         nop
252         /* Copy after donecopy using docopy in SRAM */
253         ldr     r2,=data_end
254         ldr     r3,=SI_ARM_SRAM2
255         add     r2,r2,r3
256         mov     r3,lr
258 docopy:
259         ldmia   r0!,{r4}
260         stmia   r1!,{r4}
261         cmp     r2,r1
262         bhi     docopy
263         mov     pc,r3
265         /* Make sure any literals needed by the code above are "close" and
266          * have been copied to ram before we switch:
267          */
268         .ltorg
269 donecopy:
270 #endif  /* CONFIG_XIP */
271 #endif  /* __ARM_ARCH_7R__ */   
272 END(inflrom)