1
2
3
4
5
6
7
8
9
10
11 #include <linux/init.h>
12 #include <linux/linkage.h>
13 #include <asm/thread_info.h>
14 #include <asm/mmu.h>
15 #include <cpu/mmu_context.h>
16
17 #ifdef CONFIG_CPU_SH4A
18 #define SYNCO() synco
19
20 #define PREFI(label, reg) \
21 mov.l label, reg; \
22 prefi @reg
23 #else
24 #define SYNCO()
25 #define PREFI(label, reg)
26 #endif
27
28 .section .empty_zero_page, "aw"
29 ENTRY(empty_zero_page)
30 .long 1
31 .long 0
32 .long 0x0200
33 .long 1
34 .long 0x00000000
35 .long 0x00000000
36 #ifdef CONFIG_32BIT
37 .long 0x53453f00 + 32
38 #else
39 .long 0x53453f00 + 29
40 #endif
41 1:
42 .skip PAGE_SIZE - empty_zero_page - 1b
43
44 __HEAD
45
46
47
48
49
50
51
52
53
54
55
56
57 ENTRY(_stext)
58 ! Initialize Status Register
59 mov.l 1f, r0 ! MD=1, RB=0, BL=0, IMASK=0xF
60 ldc r0, sr
61 ! Initialize global interrupt mask
62 #ifdef CONFIG_CPU_HAS_SR_RB
63 mov #0, r0
64 ldc r0, r6_bank
65 #endif
66
67 #ifdef CONFIG_OF_FLATTREE
68 mov r4, r12 ! Store device tree blob pointer in r12
69 #endif
70
71
72
73
74
75
76
77
78 PREFI(5f, r0)
79 PREFI(6f, r0)
80
81 !
82 mov.l 2f, r0
83 mov r0, r15 ! Set initial r15 (stack pointer)
84 #ifdef CONFIG_CPU_HAS_SR_RB
85 mov.l 7f, r0
86 ldc r0, r7_bank ! ... and initial thread_info
87 #endif
88
89 #ifdef CONFIG_PMB
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138 mov.l .LMMUCR, r1
139 mov.l @r1, r0
140 or #MMUCR_TI, r0
141 mov.l r0, @r1
142
143 mov.l .LMEMORY_SIZE, r5
144
145 mov #PMB_E_SHIFT, r0
146 mov #0x1, r4
147 shld r0, r4
148
149 mov.l .LFIRST_DATA_ENTRY, r0
150 mov.l .LPMB_DATA, r1
151 mov.l .LFIRST_ADDR_ENTRY, r2
152 mov.l .LPMB_ADDR, r3
153
154
155
156
157
158
159
160
161
162
163
164
165 mov #0, r10
166 mov #NR_PMB_ENTRIES, r9
167
168 mov r1, r7
169
170 .Lvalidate_existing_mappings:
171
172 mov.l .LPMB_DATA_MASK, r11
173 mov.l @r7, r8
174 and r11, r8
175 cmp/eq r0, r8
176 bt .Lpmb_done
177
178 add #1, r10
179 cmp/eq r9, r10
180 bf/s .Lvalidate_existing_mappings
181 add r4, r7
182
183
184
185
186
187
188 mov r5, r7
189 mov #0, r10
190
191 #ifdef CONFIG_UNCACHED_MAPPING
192
193
194
195 mov #(PMB_SZ_16M >> 2), r9
196 shll2 r9
197
198 mov #(PMB_UB >> 8), r8
199 shll8 r8
200
201 or r0, r8
202 or r9, r8
203 mov.l r8, @r1
204 mov r2, r8
205 add r7, r8
206 mov.l r8, @r3
207
208 add r4, r1
209 add r4, r3
210 add #1, r10
211 #endif
212
213
214
215
216
217 #define __PMB_ITER_BY_SIZE(size) \
218 .L##size: \
219 mov #(size >> 4), r6; \
220 shll16 r6; \
221 shll8 r6; \
222 \
223 cmp/hi r5, r6; \
224 bt 9999f; \
225 \
226 mov #(PMB_SZ_##size##M >> 2), r9; \
227 shll2 r9; \
228 \
229
230
231 \
232 mov #PMB_C, r8; \
233 or r0, r8; \
234 or r9, r8; \
235 mov.l r8, @r1; \
236 mov.l r2, @r3; \
237 \
238 \
239 add r4, r1; \
240 \
241 add r4, r3; \
242 \
243 add #1, r10; \
244 \
245 sub r6, r5; \
246 add r6, r0; \
247 add r6, r2; \
248 \
249 bra .L##size; \
250 9999:
251
252 __PMB_ITER_BY_SIZE(512)
253 __PMB_ITER_BY_SIZE(128)
254 __PMB_ITER_BY_SIZE(64)
255 __PMB_ITER_BY_SIZE(16)
256
257 #ifdef CONFIG_UNCACHED_MAPPING
258
259
260
261
262 mov.l .Lcached_to_uncached, r0
263 mov.l r7, @r0
264
265 mov.l .Luncached_size, r0
266 mov #1, r7
267 shll16 r7
268 shll8 r7
269 mov.l r7, @r0
270 #endif
271
272
273
274
275
276
277
278 mov #0, r1
279 mov #NR_PMB_ENTRIES, r0
280
281 .Lagain:
282 mov.l r1, @r3
283 add #1, r10
284 cmp/eq r0, r10
285 bf/s .Lagain
286 add r4, r3
287
288 mov.l 6f, r0
289 icbi @r0
290
291 .Lpmb_done:
292 #endif
293
294 #ifndef CONFIG_SH_NO_BSS_INIT
295
296
297
298
299
300 ! Clear BSS area
301 #ifdef CONFIG_SMP
302 mov.l 3f, r0
303 cmp/eq #0, r0 ! skip clear if set to zero
304 bt 10f
305 #endif
306
307 mov.l 3f, r1
308 add #4, r1
309 mov.l 4f, r2
310 mov #0, r0
311 9: cmp/hs r2, r1
312 bf/s 9b ! while (r1 < r2)
313 mov.l r0,@-r2
314
315 10:
316 #endif
317
318 #ifdef CONFIG_OF_FLATTREE
319 mov.l 8f, r0 ! Make flat device tree available early.
320 jsr @r0
321 mov r12, r4
322 #endif
323
324 ! Additional CPU initialization
325 mov.l 6f, r0
326 jsr @r0
327 nop
328
329 SYNCO() ! Wait for pending instructions..
330
331 ! Start kernel
332 mov.l 5f, r0
333 jmp @r0
334 nop
335
336 .balign 4
337 #if defined(CONFIG_CPU_SH2)
338 1: .long 0x000000F0 ! IMASK=0xF
339 #else
340 1: .long 0x500080F0 ! MD=1, RB=0, BL=1, FD=1, IMASK=0xF
341 #endif
342 ENTRY(stack_start)
343 2: .long init_thread_union+THREAD_SIZE
344 3: .long __bss_start
345 4: .long _end
346 5: .long start_kernel
347 6: .long cpu_init
348 7: .long init_thread_union
349 #if defined(CONFIG_OF_FLATTREE)
350 8: .long sh_fdt_init
351 #endif
352
353 #ifdef CONFIG_PMB
354 .LPMB_ADDR: .long PMB_ADDR
355 .LPMB_DATA: .long PMB_DATA
356 .LPMB_DATA_MASK: .long PMB_PFN_MASK | PMB_V
357 .LFIRST_ADDR_ENTRY: .long PAGE_OFFSET | PMB_V
358 .LFIRST_DATA_ENTRY: .long __MEMORY_START | PMB_V
359 .LMMUCR: .long MMUCR
360 .LMEMORY_SIZE: .long __MEMORY_SIZE
361 #ifdef CONFIG_UNCACHED_MAPPING
362 .Lcached_to_uncached: .long cached_to_uncached
363 .Luncached_size: .long uncached_size
364 #endif
365 #endif