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

5
Last change on this file since e29f1f5 was e29f1f5, checked in by Sebastian Huber <sebastian.huber@…>, on 10/19/15 at 06:44:33

bsp/qoriq: Use U-Boot provided FDT

  • Property mode set to 100644
File size: 7.6 KB
Line 
1/**
2 * @file
3 *
4 * @ingroup qoriq
5 *
6 * @brief BSP start.
7 */
8
9/*
10 * Copyright (c) 2010-2015 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
55#ifdef HAS_UBOOT
56        bl      bsp_uboot_copy_board_info
57#endif /* HAS_UBOOT */
58
59#ifdef U_BOOT_USE_FDT
60        bl      bsp_fdt_copy
61#endif /* U_BOOT_USE_FDT */
62
63        /* Get start stack */
64        LWI     START_STACK, start_stack_end
65
66        bl      .Linitmore
67
68        /* Copy fast text */
69        LWI     r3, bsp_section_fast_text_begin
70        LWI     r4, bsp_section_fast_text_load_begin
71        LWI     r5, bsp_section_fast_text_size
72        bl      .Lcopy
73
74        /* Copy read-only data */
75        LWI     r3, bsp_section_rodata_begin
76        LWI     r4, bsp_section_rodata_load_begin
77        LWI     r5, bsp_section_rodata_size
78        bl      .Lcopy
79
80        /* Copy fast data */
81        LWI     r3, bsp_section_fast_data_begin
82        LWI     r4, bsp_section_fast_data_load_begin
83        LWI     r5, bsp_section_fast_data_size
84        bl      .Lcopy
85
86        /* Copy data */
87        LWI     r3, bsp_section_data_begin
88        LWI     r4, bsp_section_data_load_begin
89        LWI     r5, bsp_section_data_size
90        bl      .Lcopy
91
92        /* NULL pointer access protection (only core 0 has to do this) */
93        mfspr   r3, BOOKE_PIR
94        cmpwi   r3, 0
95        bne     .Lnull_area_setup_done
96        LWI     r3, bsp_section_start_begin
97        srawi   r3, r3, 2
98        mtctr   r3
99        li      r3, -4
100        LWI     r4, 0x44000002
101.Lnull_area_setup_loop:
102        stwu    r4, 4(r3)
103        bdnz    .Lnull_area_setup_loop
104.Lnull_area_setup_done:
105
106        bl      .Linitmmu
107
108        /* Clear SBSS */
109        LWI     r3, bsp_section_sbss_begin
110        LWI     r4, bsp_section_sbss_size
111        bl      bsp_start_zero
112
113        /* Clear BSS */
114        LWI     r3, bsp_section_bss_begin
115        LWI     r4, bsp_section_bss_size
116        bl      bsp_start_zero
117
118        /* Set up EABI and SYSV environment */
119        bl      __eabi
120
121        /* Clear command line */
122        li      r3, 0
123
124        bl      boot_card
125
126.Lcopy:
127        cmpw    r3, r4
128        beqlr
129        b       memcpy
130
131        /* Do not use r3 here, since this could be the U-Boot board info */
132.Linitearly:
133        /* Reset time base */
134        li      r0, 0
135        mtspr   TBWU, r0
136        mtspr   TBWL, r0
137
138        /* Disable decrementer */
139        mfspr   r0, BOOKE_TCR
140        LWI     r4, BOOKE_TCR_DIE
141        andc    r0, r0, r4
142        mtspr   BOOKE_TCR, r0
143
144#ifdef QORIQ_INITIAL_SPEFSCR
145        /* SPEFSCR initialization */
146        LWI     r0, QORIQ_INITIAL_SPEFSCR
147        mtspr   FSL_EIS_SPEFSCR, r0
148#endif
149
150#ifdef QORIQ_INITIAL_BUCSR
151        /* BUCSR initialization */
152        LWI     r0, QORIQ_INITIAL_BUCSR
153        mtspr   FSL_EIS_BUCSR, r0
154        isync
155#endif
156
157        /* Set small-data anchors */
158        LA      r2, _SDA2_BASE_
159        LA      r13, _SDA_BASE_
160
161        blr
162
163.Linitmore:
164        mflr    SAVED_LINK_REGISTER
165
166        /* Initial MMU setup */
167        bl      qoriq_tlb1_ts_0_only
168        li      r3, SCRATCH_TLB
169        li      r4, FSL_EIS_MAS1_TS
170        li      r5, FSL_EIS_MAS2_I
171        li      r6, FSL_EIS_MAS3_SR | FSL_EIS_MAS3_SW | FSL_EIS_MAS3_SX
172        li      r7, 0
173        li      r8, 0
174        li      r9, 11
175        bl      qoriq_tlb1_write
176
177        /* MSR initialization */
178        LWI     INITIAL_MSR, QORIQ_INITIAL_MSR
179        ori     r0, INITIAL_MSR, MSR_IS | MSR_DS
180        mtmsr   r0
181        isync
182
183        /* Initialize start stack */
184        subi    r1, START_STACK, PPC_MINIMUM_STACK_FRAME_SIZE
185        clrrwi  r1, r1, PPC_STACK_ALIGN_POWER
186        li      r0, 0
187        stw     r0, 0(r1)
188
189#ifdef INITIALIZE_FPU
190        bl      .Linitfpu
191#endif
192
193        mtlr    SAVED_LINK_REGISTER
194        blr
195
196.Linitmmu:
197        mflr    SAVED_LINK_REGISTER
198
199        /* Configure MMU */
200        li      r3, FIRST_TLB
201        li      r4, SCRATCH_TLB
202        bl      qoriq_mmu_config
203        mtmsr   INITIAL_MSR
204        isync
205        li      r3, SCRATCH_TLB
206        bl      qoriq_tlb1_invalidate
207
208        mtlr    SAVED_LINK_REGISTER
209        blr
210
211
212#ifdef INITIALIZE_FPU
213        /*
214         * Write a value to the FPRs to initialize the hidden tag bits.  See
215         * also "Core Software Initialization Requirements" of the e500mc
216         * reference manual for example.
217         */
218.Linitfpu:
219        li      r0, 0
220        stw     r0, 0(r1)
221        stw     r0, 4(r1)
222        lfd     f0, 0(r1)
223        fmr     f1, f0
224        fmr     f2, f0
225        fmr     f3, f0
226        fmr     f4, f0
227        fmr     f5, f0
228        fmr     f6, f0
229        fmr     f7, f0
230        fmr     f8, f0
231        fmr     f9, f0
232        fmr     f10, f0
233        fmr     f11, f0
234        fmr     f12, f0
235        fmr     f13, f0
236        fmr     f14, f0
237        fmr     f15, f0
238        fmr     f16, f0
239        fmr     f17, f0
240        fmr     f18, f0
241        fmr     f19, f0
242        fmr     f20, f0
243        fmr     f21, f0
244        fmr     f22, f0
245        fmr     f23, f0
246        fmr     f24, f0
247        fmr     f25, f0
248        fmr     f26, f0
249        fmr     f27, f0
250        fmr     f28, f0
251        fmr     f29, f0
252        fmr     f30, f0
253        fmr     f31, f0
254        blr
255#endif
256
257#ifdef RTEMS_SMP
258#if QORIQ_THREAD_COUNT > 1
259_start_thread:
260        /* Adjust PIR */
261        mfspr   r0, BOOKE_PIR
262        srawi   r0, r0, 2
263        ori     r0, r0, 1
264        mtspr   BOOKE_PIR, r0
265
266        bl      .Linitearly
267
268        /* Initialize start stack */
269        GET_SELF_CPU_CONTROL    r3
270        lwz     r3, PER_CPU_INTERRUPT_STACK_HIGH(r3)
271        subi    r1, r3, PPC_MINIMUM_STACK_FRAME_SIZE
272        clrrwi  r1, r1, PPC_STACK_ALIGN_POWER
273        li      r0, 0
274        stw     r0, 0(r1)
275
276#ifdef INITIALIZE_FPU
277        bl      .Linitfpu
278#endif
279
280        b       qoriq_start_thread
281#endif
282_start_secondary_processor:
283        bl      .Linitearly
284
285        /* Get start stack */
286        mr      START_STACK, r3
287
288        bl      .Linitmore
289        bl      .Linitmmu
290        b       bsp_start_on_secondary_processor
291#endif /* RTEMS_SMP */
292
293        /* Exception vector prologues area */
294        .section ".bsp_start_text", "ax"
295        .align 4
296bsp_exc_vector_base:
297        stw     r1, ppc_exc_lock_crit@sdarel(r13)
298        stw     r4, ppc_exc_vector_register_crit@sdarel(r13)
299        li      r4, -32767
300        b       ppc_exc_wrap_bookE_crit
301        stwu    r1, -EXC_GENERIC_SIZE(r1)
302        stw     r4, GPR4_OFFSET(r1)
303        li      r4, 2
304        b       ppc_exc_wrap_nopush_e500_mchk
305        stwu    r1, -EXC_GENERIC_SIZE(r1)
306        stw     r4, GPR4_OFFSET(r1)
307        li      r4, 3
308        b       ppc_exc_wrap_nopush_std
309        stwu    r1, -EXC_GENERIC_SIZE(r1)
310        stw     r4, GPR4_OFFSET(r1)
311        li      r4, 4
312        b       ppc_exc_wrap_nopush_std
313        stwu    r1, -PPC_EXC_MINIMAL_FRAME_SIZE(r1)
314#ifndef PPC_EXC_CONFIG_USE_FIXED_HANDLER
315        stw     r4, PPC_EXC_VECTOR_PROLOGUE_OFFSET(r1)
316        li      r4, -32763
317#endif
318        b       ppc_exc_wrap_async_normal
319#ifdef PPC_EXC_CONFIG_USE_FIXED_HANDLER
320        nop
321        nop
322#endif
323        stwu    r1, -EXC_GENERIC_SIZE(r1)
324        stw     r4, GPR4_OFFSET(r1)
325        li      r4, 6
326        b       ppc_exc_wrap_nopush_std
327        stwu    r1, -EXC_GENERIC_SIZE(r1)
328        stw     r4, GPR4_OFFSET(r1)
329        li      r4, 7
330        b       ppc_exc_wrap_nopush_std
331        stwu    r1, -EXC_GENERIC_SIZE(r1)
332        stw     r4, GPR4_OFFSET(r1)
333        li      r4, 8
334        b       ppc_exc_wrap_nopush_std
335system_call:
336        stwu    r1, -EXC_GENERIC_SIZE(r1)
337        stw     r4, GPR4_OFFSET(r1)
338        li      r4, 12
339        b       ppc_exc_wrap_nopush_std
340        stwu    r1, -EXC_GENERIC_SIZE(r1)
341        stw     r4, GPR4_OFFSET(r1)
342        li      r4, 24
343        b       ppc_exc_wrap_nopush_std
344        stwu    r1, -PPC_EXC_MINIMAL_FRAME_SIZE(r1)
345#ifndef PPC_EXC_CONFIG_USE_FIXED_HANDLER
346        stw     r4, PPC_EXC_VECTOR_PROLOGUE_OFFSET(r1)
347        li      r4, -32752
348#endif
349        b       ppc_exc_wrap_async_normal
350#ifdef PPC_EXC_CONFIG_USE_FIXED_HANDLER
351        nop
352        nop
353#endif
354        stwu    r1, -PPC_EXC_MINIMAL_FRAME_SIZE(r1)
355#ifndef PPC_EXC_CONFIG_USE_FIXED_HANDLER
356        stw     r4, PPC_EXC_VECTOR_PROLOGUE_OFFSET(r1)
357        li      r4, -32749
358#endif
359        b       ppc_exc_wrap_async_normal
360#ifdef PPC_EXC_CONFIG_USE_FIXED_HANDLER
361        nop
362        nop
363#endif
364        stw     r1, ppc_exc_lock_crit@sdarel(r13)
365        stw     r4, ppc_exc_vector_register_crit@sdarel(r13)
366        li      r4, -32748
367        b       ppc_exc_wrap_bookE_crit
368        stwu    r1, -EXC_GENERIC_SIZE(r1)
369        stw     r4, GPR4_OFFSET(r1)
370        li      r4, 18
371        b       ppc_exc_wrap_nopush_std
372        stwu    r1, -EXC_GENERIC_SIZE(r1)
373        stw     r4, GPR4_OFFSET(r1)
374        li      r4, 17
375        b       ppc_exc_wrap_nopush_std
376        stwu    r1, -EXC_GENERIC_SIZE(r1)
377        stw     r4, GPR4_OFFSET(r1)
378        li      r4, 13
379        b       ppc_exc_wrap_nopush_bookE_crit
380        stwu    r1, -EXC_GENERIC_SIZE(r1)
381        stw     r4, GPR4_OFFSET(r1)
382        li      r4, 10
383        b       ppc_exc_wrap_nopush_std
384        stwu    r1, -EXC_GENERIC_SIZE(r1)
385        stw     r4, GPR4_OFFSET(r1)
386        li      r4, 25
387        b       ppc_exc_wrap_nopush_std
388        stwu    r1, -EXC_GENERIC_SIZE(r1)
389        stw     r4, GPR4_OFFSET(r1)
390        li      r4, 26
391        b       ppc_exc_wrap_nopush_std
392        stwu    r1, -EXC_GENERIC_SIZE(r1)
393        stw     r4, GPR4_OFFSET(r1)
394        li      r4, 15
395        b       ppc_exc_wrap_nopush_std
396
397/* Symbol provided for debugging and tracing */
398bsp_exc_vector_end:
399
400        /* Start stack area */
401        .section ".bsp_rwextra", "aw", @nobits
402        .align 4
403        .space 4096
404start_stack_end:
Note: See TracBrowser for help on using the repository browser.