source: rtems/c/src/lib/libbsp/powerpc/qoriq/start/start.S @ f383f4bf

5
Last change on this file since f383f4bf was f383f4bf, checked in by Sebastian Huber <sebastian.huber@…>, on 07/27/16 at 09:39:56

bsp/qoriq: Remove legacy U-Boot support

  • Property mode set to 100644
File size: 8.4 KB
Line 
1/**
2 * @file
3 *
4 * @ingroup qoriq
5 *
6 * @brief BSP start.
7 */
8
9/*
10 * Copyright (c) 2010, 2016 embedded brains GmbH.  All rights reserved.
11 *
12 *  embedded brains GmbH
13 *  Dornierstr. 4
14 *  82178 Puchheim
15 *  Germany
16 *  <rtems@embedded-brains.de>
17 *
18 * The license and distribution terms for this file may be
19 * found in the file LICENSE in this distribution or at
20 * http://www.rtems.org/license/LICENSE.
21 */
22
23#include <rtems/score/percpu.h>
24
25#include <bspopts.h>
26
27#include <libcpu/powerpc-utility.h>
28
29#include <bsp/vectors.h>
30
31#if (QORIQ_INITIAL_MSR & MSR_FP) != 0
32#define INITIALIZE_FPU
33#endif
34
35#define FIRST_TLB 0
36#define SCRATCH_TLB QORIQ_TLB1_ENTRY_COUNT - 1
37#define INITIAL_MSR r14
38#define START_STACK r15
39#define SAVED_LINK_REGISTER r16
40
41        .globl _start
42#ifdef RTEMS_SMP
43#if QORIQ_THREAD_COUNT > 1
44        .globl _start_thread
45#endif
46        .globl _start_secondary_processor
47#endif
48        .globl bsp_exc_vector_base
49
50        .section ".bsp_start_text", "ax"
51
52_start:
53        bl      .Linitearly
54        bl      bsp_fdt_copy
55
56#ifdef QORIQ_HAS_WRITE_BACK_L1_CACHE
57        LWI     r3, bsp_section_start_begin
58        LWI     r4, bsp_section_data_load_end
59        sub     r4, r4, r3
60        bl      rtems_cache_flush_multiple_data_lines
61#else
62        bl      qoriq_l1cache_invalidate
63#endif
64
65#ifdef QORIQ_CLUSTER_1_L2CSR0
66        LWI     r3, QORIQ_CLUSTER_1_L2CSR0
67        bl      qoriq_l2cache_flush_invalidate
68#endif
69
70#ifdef QORIQ_CLUSTER_2_L2CSR0
71        LWI     r3, QORIQ_CLUSTER_2_L2CSR0
72        bl      qoriq_l2cache_flush_invalidate
73#endif
74
75#ifdef QORIQ_CLUSTER_3_L2CSR0
76        LWI     r3, QORIQ_CLUSTER_3_L2CSR0
77        bl      qoriq_l2cache_flush_invalidate
78#endif
79
80        /* Get start stack */
81        LWI     START_STACK, start_stack_end
82
83        bl      .Linitmore
84
85        /* Copy fast text */
86        LWI     r3, bsp_section_fast_text_begin
87        LWI     r4, bsp_section_fast_text_load_begin
88        LWI     r5, bsp_section_fast_text_size
89        bl      .Lcopy
90
91        /* Copy read-only data */
92        LWI     r3, bsp_section_rodata_begin
93        LWI     r4, bsp_section_rodata_load_begin
94        LWI     r5, bsp_section_rodata_size
95        bl      .Lcopy
96
97        /* Copy fast data */
98        LWI     r3, bsp_section_fast_data_begin
99        LWI     r4, bsp_section_fast_data_load_begin
100        LWI     r5, bsp_section_fast_data_size
101        bl      .Lcopy
102
103        /* Copy data */
104        LWI     r3, bsp_section_data_begin
105        LWI     r4, bsp_section_data_load_begin
106        LWI     r5, bsp_section_data_size
107        bl      .Lcopy
108
109        /* NULL pointer access protection (only core 0 has to do this) */
110        mfspr   r3, BOOKE_PIR
111        cmpwi   r3, 0
112        bne     .Lnull_area_setup_done
113        LWI     r3, bsp_section_start_begin
114        srawi   r3, r3, 2
115        mtctr   r3
116        li      r3, -4
117        LWI     r4, 0x44000002
118.Lnull_area_setup_loop:
119        stwu    r4, 4(r3)
120        bdnz    .Lnull_area_setup_loop
121.Lnull_area_setup_done:
122
123        bl      .Linitmmu
124
125        /* Clear SBSS */
126        LWI     r3, bsp_section_sbss_begin
127        LWI     r4, bsp_section_sbss_size
128        bl      bsp_start_zero
129
130        /* Clear BSS */
131        LWI     r3, bsp_section_bss_begin
132        LWI     r4, bsp_section_bss_size
133        bl      bsp_start_zero
134
135        /* Set up EABI and SYSV environment */
136        bl      __eabi
137
138        /* Clear command line */
139        li      r3, 0
140
141        bl      boot_card
142
143.Lcopy:
144        cmpw    r3, r4
145        beqlr
146        b       memcpy
147
148.Linitearly:
149        /*
150         * Do not use r3 here, since it holds the FDT base pointer provided by
151         * the boot loader.
152         */
153
154        /* Disable decrementer */
155        mfspr   r0, BOOKE_TCR
156        LWI     r4, BOOKE_TCR_DIE
157        andc    r0, r0, r4
158        mtspr   BOOKE_TCR, r0
159
160#ifdef QORIQ_INITIAL_SPEFSCR
161        /* SPEFSCR initialization */
162        LWI     r0, QORIQ_INITIAL_SPEFSCR
163        mtspr   FSL_EIS_SPEFSCR, r0
164#endif
165
166#ifdef QORIQ_INITIAL_BUCSR
167        /* BUCSR initialization */
168        LWI     r0, QORIQ_INITIAL_BUCSR
169        mtspr   FSL_EIS_BUCSR, r0
170        isync
171#endif
172
173#ifdef QORIQ_INITIAL_HID0
174        /* HID0 initialization */
175        LWI     r0, QORIQ_INITIAL_HID0
176        mtspr   HID0, r0
177#endif
178
179        /* Invalidate TLS anchor */
180        li      r2, 0
181
182        /* Set small-data anchor */
183        LA      r13, _SDA_BASE_
184
185        blr
186
187.Linitmore:
188        mflr    SAVED_LINK_REGISTER
189
190        /* Invalidate all TS1 MMU entries */
191        li      r3, 1
192        bl      qoriq_tlb1_invalidate_all_by_ts
193
194        /* Add TS1 entry for the first 4GiB of RAM */
195        li      r3, SCRATCH_TLB
196        li      r4, FSL_EIS_MAS1_TS
197        li      r5, FSL_EIS_MAS2_I
198        li      r6, FSL_EIS_MAS3_SR | FSL_EIS_MAS3_SW | FSL_EIS_MAS3_SX
199        li      r7, 0
200        li      r8, 0
201        li      r9, 11
202        bl      qoriq_tlb1_write
203
204        /* MSR initialization and use TS1 for address translation */
205        LWI     INITIAL_MSR, QORIQ_INITIAL_MSR
206        ori     r0, INITIAL_MSR, MSR_IS | MSR_DS
207        mtmsr   r0
208        isync
209
210        /*
211         * Initialize start stack.  Make sure that we do not share a cache line
212         * with the heap block management, since initial stacks for the
213         * secondary processors are allocated from the workspace.
214         */
215        subi    r1, START_STACK, 2 * PPC_DEFAULT_CACHE_LINE_SIZE
216        clrrwi  r1, r1, PPC_DEFAULT_CACHE_LINE_POWER
217        li      r0, 0
218        stw     r0, 0(r1)
219
220#ifdef INITIALIZE_FPU
221        bl      .Linitfpu
222#endif
223
224        mtlr    SAVED_LINK_REGISTER
225        blr
226
227.Linitmmu:
228        mflr    SAVED_LINK_REGISTER
229
230        /* Configure MMU */
231        li      r3, FIRST_TLB
232        li      r4, SCRATCH_TLB
233        bl      qoriq_mmu_config
234        mtmsr   INITIAL_MSR
235        isync
236        li      r3, SCRATCH_TLB
237        bl      qoriq_tlb1_invalidate
238
239        mtlr    SAVED_LINK_REGISTER
240        blr
241
242#ifdef INITIALIZE_FPU
243        /*
244         * Write a value to the FPRs to initialize the hidden tag bits.  See
245         * also "Core Software Initialization Requirements" of the e500mc
246         * reference manual for example.
247         */
248.Linitfpu:
249        li      r0, 0
250        stw     r0, 0(r1)
251        stw     r0, 4(r1)
252        lfd     f0, 0(r1)
253        fmr     f1, f0
254        fmr     f2, f0
255        fmr     f3, f0
256        fmr     f4, f0
257        fmr     f5, f0
258        fmr     f6, f0
259        fmr     f7, f0
260        fmr     f8, f0
261        fmr     f9, f0
262        fmr     f10, f0
263        fmr     f11, f0
264        fmr     f12, f0
265        fmr     f13, f0
266        fmr     f14, f0
267        fmr     f15, f0
268        fmr     f16, f0
269        fmr     f17, f0
270        fmr     f18, f0
271        fmr     f19, f0
272        fmr     f20, f0
273        fmr     f21, f0
274        fmr     f22, f0
275        fmr     f23, f0
276        fmr     f24, f0
277        fmr     f25, f0
278        fmr     f26, f0
279        fmr     f27, f0
280        fmr     f28, f0
281        fmr     f29, f0
282        fmr     f30, f0
283        fmr     f31, f0
284        blr
285#endif
286
287#ifdef RTEMS_SMP
288#if QORIQ_THREAD_COUNT > 1
289_start_thread:
290        /* Adjust PIR */
291        mfspr   r0, BOOKE_PIR
292        srawi   r0, r0, 2
293        ori     r0, r0, 1
294        mtspr   BOOKE_PIR, r0
295
296        bl      .Linitearly
297
298        /* Initialize start stack */
299        GET_SELF_CPU_CONTROL    r3
300        lwz     r3, PER_CPU_INTERRUPT_STACK_HIGH(r3)
301        subi    r1, r3, PPC_MINIMUM_STACK_FRAME_SIZE
302        clrrwi  r1, r1, PPC_STACK_ALIGN_POWER
303        li      r0, 0
304        stw     r0, 0(r1)
305
306#ifdef INITIALIZE_FPU
307        bl      .Linitfpu
308#endif
309
310        b       qoriq_start_thread
311#endif
312_start_secondary_processor:
313        bl      .Linitearly
314
315        /* Get start stack */
316        mr      START_STACK, r3
317
318        bl      .Linitmore
319        bl      .Linitmmu
320        b       bsp_start_on_secondary_processor
321#endif /* RTEMS_SMP */
322
323        /* Exception vector prologues area */
324        .section ".bsp_start_text", "ax"
325        .align 4
326bsp_exc_vector_base:
327        stw     r1, ppc_exc_lock_crit@sdarel(r13)
328        stw     r4, ppc_exc_vector_register_crit@sdarel(r13)
329        li      r4, -32767
330        b       ppc_exc_wrap_bookE_crit
331        stwu    r1, -EXC_GENERIC_SIZE(r1)
332        stw     r4, GPR4_OFFSET(r1)
333        li      r4, 2
334        b       ppc_exc_wrap_nopush_e500_mchk
335        stwu    r1, -EXC_GENERIC_SIZE(r1)
336        stw     r4, GPR4_OFFSET(r1)
337        li      r4, 3
338        b       ppc_exc_wrap_nopush_std
339        stwu    r1, -EXC_GENERIC_SIZE(r1)
340        stw     r4, GPR4_OFFSET(r1)
341        li      r4, 4
342        b       ppc_exc_wrap_nopush_std
343        stwu    r1, -PPC_EXC_MINIMAL_FRAME_SIZE(r1)
344#ifndef PPC_EXC_CONFIG_USE_FIXED_HANDLER
345        stw     r4, PPC_EXC_VECTOR_PROLOGUE_OFFSET(r1)
346        li      r4, -32763
347#endif
348        b       ppc_exc_wrap_async_normal
349#ifdef PPC_EXC_CONFIG_USE_FIXED_HANDLER
350        nop
351        nop
352#endif
353        stwu    r1, -EXC_GENERIC_SIZE(r1)
354        stw     r4, GPR4_OFFSET(r1)
355        li      r4, 6
356        b       ppc_exc_wrap_nopush_std
357        stwu    r1, -EXC_GENERIC_SIZE(r1)
358        stw     r4, GPR4_OFFSET(r1)
359        li      r4, 7
360        b       ppc_exc_wrap_nopush_std
361        stwu    r1, -EXC_GENERIC_SIZE(r1)
362        stw     r4, GPR4_OFFSET(r1)
363        li      r4, 8
364        b       ppc_exc_wrap_nopush_std
365system_call:
366        stwu    r1, -EXC_GENERIC_SIZE(r1)
367        stw     r4, GPR4_OFFSET(r1)
368        li      r4, 12
369        b       ppc_exc_wrap_nopush_std
370        stwu    r1, -EXC_GENERIC_SIZE(r1)
371        stw     r4, GPR4_OFFSET(r1)
372        li      r4, 24
373        b       ppc_exc_wrap_nopush_std
374        stwu    r1, -PPC_EXC_MINIMAL_FRAME_SIZE(r1)
375#ifndef PPC_EXC_CONFIG_USE_FIXED_HANDLER
376        stw     r4, PPC_EXC_VECTOR_PROLOGUE_OFFSET(r1)
377        li      r4, -32752
378#endif
379        b       ppc_exc_wrap_async_normal
380#ifdef PPC_EXC_CONFIG_USE_FIXED_HANDLER
381        nop
382        nop
383#endif
384        stwu    r1, -PPC_EXC_MINIMAL_FRAME_SIZE(r1)
385#ifndef PPC_EXC_CONFIG_USE_FIXED_HANDLER
386        stw     r4, PPC_EXC_VECTOR_PROLOGUE_OFFSET(r1)
387        li      r4, -32749
388#endif
389        b       ppc_exc_wrap_async_normal
390#ifdef PPC_EXC_CONFIG_USE_FIXED_HANDLER
391        nop
392        nop
393#endif
394        stw     r1, ppc_exc_lock_crit@sdarel(r13)
395        stw     r4, ppc_exc_vector_register_crit@sdarel(r13)
396        li      r4, -32748
397        b       ppc_exc_wrap_bookE_crit
398        stwu    r1, -EXC_GENERIC_SIZE(r1)
399        stw     r4, GPR4_OFFSET(r1)
400        li      r4, 18
401        b       ppc_exc_wrap_nopush_std
402        stwu    r1, -EXC_GENERIC_SIZE(r1)
403        stw     r4, GPR4_OFFSET(r1)
404        li      r4, 17
405        b       ppc_exc_wrap_nopush_std
406        stwu    r1, -EXC_GENERIC_SIZE(r1)
407        stw     r4, GPR4_OFFSET(r1)
408        li      r4, 13
409        b       ppc_exc_wrap_nopush_bookE_crit
410        stwu    r1, -EXC_GENERIC_SIZE(r1)
411        stw     r4, GPR4_OFFSET(r1)
412        li      r4, 10
413        b       ppc_exc_wrap_nopush_std
414        stwu    r1, -EXC_GENERIC_SIZE(r1)
415        stw     r4, GPR4_OFFSET(r1)
416        li      r4, 25
417        b       ppc_exc_wrap_nopush_std
418        stwu    r1, -EXC_GENERIC_SIZE(r1)
419        stw     r4, GPR4_OFFSET(r1)
420        li      r4, 26
421        b       ppc_exc_wrap_nopush_std
422        stwu    r1, -EXC_GENERIC_SIZE(r1)
423        stw     r4, GPR4_OFFSET(r1)
424        li      r4, 15
425        b       ppc_exc_wrap_nopush_std
426
427/* Symbol provided for debugging and tracing */
428bsp_exc_vector_end:
429
430        /* Start stack area */
431        .section ".bsp_rwextra", "aw", @nobits
432        .align 4
433        .space 4096
434start_stack_end:
Note: See TracBrowser for help on using the repository browser.