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

5
Last change on this file since f6e793a2 was f6e793a2, checked in by Sebastian Huber <sebastian.huber@…>, on 04/03/17 at 08:05:51

bsp/qoriq: Adjust MMU config only once

  • Property mode set to 100644
File size: 8.5 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        li      r3, 1
124        bl      .Linitmmu
125
126        /* Clear SBSS */
127        LWI     r3, bsp_section_sbss_begin
128        LWI     r4, bsp_section_sbss_size
129        bl      bsp_start_zero
130
131        /* Clear BSS */
132        LWI     r3, bsp_section_bss_begin
133        LWI     r4, bsp_section_bss_size
134        bl      bsp_start_zero
135
136        /* Set up EABI and SYSV environment */
137        bl      __eabi
138
139        /* Clear command line */
140        li      r3, 0
141
142        bl      boot_card
143
144.Lcopy:
145        cmpw    r3, r4
146        beqlr
147        b       memcpy
148
149.Linitearly:
150        /*
151         * Do not use r3 here, since it holds the FDT base pointer provided by
152         * the boot loader.
153         */
154
155        /* Disable decrementer */
156        mfspr   r0, BOOKE_TCR
157        LWI     r4, BOOKE_TCR_DIE
158        andc    r0, r0, r4
159        mtspr   BOOKE_TCR, r0
160
161#ifdef QORIQ_INITIAL_SPEFSCR
162        /* SPEFSCR initialization */
163        LWI     r0, QORIQ_INITIAL_SPEFSCR
164        mtspr   FSL_EIS_SPEFSCR, r0
165#endif
166
167#ifdef QORIQ_INITIAL_BUCSR
168        /* BUCSR initialization */
169        LWI     r0, QORIQ_INITIAL_BUCSR
170        mtspr   FSL_EIS_BUCSR, r0
171        isync
172#endif
173
174#ifdef QORIQ_INITIAL_HID0
175        /* HID0 initialization */
176        LWI     r0, QORIQ_INITIAL_HID0
177        mtspr   HID0, r0
178#endif
179
180        /* Invalidate TLS anchor */
181        li      r2, 0
182
183        /* Set small-data anchor */
184        LA      r13, _SDA_BASE_
185
186#ifdef RTEMS_SMP
187        SET_SELF_CPU_CONTROL    r4
188#endif
189
190        blr
191
192.Linitmore:
193        mflr    SAVED_LINK_REGISTER
194
195        /* Invalidate all TS1 MMU entries */
196        li      r3, 1
197        bl      qoriq_tlb1_invalidate_all_by_ts
198
199        /* Add TS1 entry for the first 4GiB of RAM */
200        li      r3, SCRATCH_TLB
201        li      r4, FSL_EIS_MAS1_TS
202        li      r5, FSL_EIS_MAS2_I
203        li      r6, FSL_EIS_MAS3_SR | FSL_EIS_MAS3_SW | FSL_EIS_MAS3_SX
204        li      r7, 0
205        li      r8, 0
206        li      r9, 11
207        bl      qoriq_tlb1_write
208
209        /* MSR initialization and use TS1 for address translation */
210        LWI     INITIAL_MSR, QORIQ_INITIAL_MSR
211        ori     r0, INITIAL_MSR, MSR_IS | MSR_DS
212        mtmsr   r0
213        isync
214
215        /*
216         * Initialize start stack.  Make sure that we do not share a cache line
217         * with the heap block management, since initial stacks for the
218         * secondary processors are allocated from the workspace.
219         */
220        subi    r1, START_STACK, 2 * PPC_DEFAULT_CACHE_LINE_SIZE
221        clrrwi  r1, r1, PPC_DEFAULT_CACHE_LINE_POWER
222        li      r0, 0
223        stw     r0, 0(r1)
224
225#ifdef INITIALIZE_FPU
226        bl      .Linitfpu
227#endif
228
229        mtlr    SAVED_LINK_REGISTER
230        blr
231
232.Linitmmu:
233        mflr    SAVED_LINK_REGISTER
234
235        /* Configure MMU */
236        li      r4, FIRST_TLB
237        li      r5, SCRATCH_TLB
238        bl      qoriq_mmu_config
239        mtmsr   INITIAL_MSR
240        isync
241        li      r3, SCRATCH_TLB
242        bl      qoriq_tlb1_invalidate
243
244        mtlr    SAVED_LINK_REGISTER
245        blr
246
247#ifdef INITIALIZE_FPU
248        /*
249         * Write a value to the FPRs to initialize the hidden tag bits.  See
250         * also "Core Software Initialization Requirements" of the e500mc
251         * reference manual for example.
252         */
253.Linitfpu:
254        li      r0, 0
255        stw     r0, 0(r1)
256        stw     r0, 4(r1)
257        lfd     f0, 0(r1)
258        fmr     f1, f0
259        fmr     f2, f0
260        fmr     f3, f0
261        fmr     f4, f0
262        fmr     f5, f0
263        fmr     f6, f0
264        fmr     f7, f0
265        fmr     f8, f0
266        fmr     f9, f0
267        fmr     f10, f0
268        fmr     f11, f0
269        fmr     f12, f0
270        fmr     f13, f0
271        fmr     f14, f0
272        fmr     f15, f0
273        fmr     f16, f0
274        fmr     f17, f0
275        fmr     f18, f0
276        fmr     f19, f0
277        fmr     f20, f0
278        fmr     f21, f0
279        fmr     f22, f0
280        fmr     f23, f0
281        fmr     f24, f0
282        fmr     f25, f0
283        fmr     f26, f0
284        fmr     f27, f0
285        fmr     f28, f0
286        fmr     f29, f0
287        fmr     f30, f0
288        fmr     f31, f0
289        blr
290#endif
291
292#ifdef RTEMS_SMP
293#if QORIQ_THREAD_COUNT > 1
294_start_thread:
295        /* Adjust PIR */
296        mfspr   r0, BOOKE_PIR
297        srawi   r0, r0, 2
298        ori     r0, r0, 1
299        mtspr   BOOKE_PIR, r0
300
301        bl      .Linitearly
302
303        /* Initialize start stack */
304        GET_SELF_CPU_CONTROL    r3
305        lwz     r3, PER_CPU_INTERRUPT_STACK_HIGH(r3)
306        subi    r1, r3, PPC_MINIMUM_STACK_FRAME_SIZE
307        clrrwi  r1, r1, PPC_STACK_ALIGN_POWER
308        li      r0, 0
309        stw     r0, 0(r1)
310
311#ifdef INITIALIZE_FPU
312        bl      .Linitfpu
313#endif
314
315        b       qoriq_start_thread
316#endif
317_start_secondary_processor:
318        bl      .Linitearly
319
320        /* Get start stack */
321        mr      START_STACK, r3
322
323        bl      .Linitmore
324        li      r3, 0
325        bl      .Linitmmu
326        b       bsp_start_on_secondary_processor
327#endif /* RTEMS_SMP */
328
329        /* Exception vector prologues area */
330        .section ".bsp_start_text", "ax"
331        .align 4
332bsp_exc_vector_base:
333        stw     r1, ppc_exc_lock_crit@sdarel(r13)
334        stw     r4, ppc_exc_vector_register_crit@sdarel(r13)
335        li      r4, -32767
336        b       ppc_exc_wrap_bookE_crit
337        stwu    r1, -EXC_GENERIC_SIZE(r1)
338        stw     r4, GPR4_OFFSET(r1)
339        li      r4, 2
340        b       ppc_exc_wrap_nopush_e500_mchk
341        stwu    r1, -EXC_GENERIC_SIZE(r1)
342        stw     r4, GPR4_OFFSET(r1)
343        li      r4, 3
344        b       ppc_exc_wrap_nopush_std
345        stwu    r1, -EXC_GENERIC_SIZE(r1)
346        stw     r4, GPR4_OFFSET(r1)
347        li      r4, 4
348        b       ppc_exc_wrap_nopush_std
349        stwu    r1, -CPU_INTERRUPT_FRAME_SIZE(r1)
350#ifndef PPC_EXC_CONFIG_USE_FIXED_HANDLER
351        stw     r4, PPC_EXC_VECTOR_PROLOGUE_OFFSET(r1)
352        li      r4, -32763
353#endif
354        b       ppc_exc_wrap_async_normal
355#ifdef PPC_EXC_CONFIG_USE_FIXED_HANDLER
356        nop
357        nop
358#endif
359        stwu    r1, -EXC_GENERIC_SIZE(r1)
360        stw     r4, GPR4_OFFSET(r1)
361        li      r4, 6
362        b       ppc_exc_wrap_nopush_std
363        stwu    r1, -EXC_GENERIC_SIZE(r1)
364        stw     r4, GPR4_OFFSET(r1)
365        li      r4, 7
366        b       ppc_exc_wrap_nopush_std
367        stwu    r1, -EXC_GENERIC_SIZE(r1)
368        stw     r4, GPR4_OFFSET(r1)
369        li      r4, 8
370        b       ppc_exc_wrap_nopush_std
371system_call:
372        stwu    r1, -EXC_GENERIC_SIZE(r1)
373        stw     r4, GPR4_OFFSET(r1)
374        li      r4, 12
375        b       ppc_exc_wrap_nopush_std
376        stwu    r1, -EXC_GENERIC_SIZE(r1)
377        stw     r4, GPR4_OFFSET(r1)
378        li      r4, 24
379        b       ppc_exc_wrap_nopush_std
380        stwu    r1, -CPU_INTERRUPT_FRAME_SIZE(r1)
381#ifndef PPC_EXC_CONFIG_USE_FIXED_HANDLER
382        stw     r4, PPC_EXC_VECTOR_PROLOGUE_OFFSET(r1)
383        li      r4, -32752
384#endif
385        b       ppc_exc_wrap_async_normal
386#ifdef PPC_EXC_CONFIG_USE_FIXED_HANDLER
387        nop
388        nop
389#endif
390        stwu    r1, -CPU_INTERRUPT_FRAME_SIZE(r1)
391#ifndef PPC_EXC_CONFIG_USE_FIXED_HANDLER
392        stw     r4, PPC_EXC_VECTOR_PROLOGUE_OFFSET(r1)
393        li      r4, -32749
394#endif
395        b       ppc_exc_wrap_async_normal
396#ifdef PPC_EXC_CONFIG_USE_FIXED_HANDLER
397        nop
398        nop
399#endif
400        stw     r1, ppc_exc_lock_crit@sdarel(r13)
401        stw     r4, ppc_exc_vector_register_crit@sdarel(r13)
402        li      r4, -32748
403        b       ppc_exc_wrap_bookE_crit
404        stwu    r1, -EXC_GENERIC_SIZE(r1)
405        stw     r4, GPR4_OFFSET(r1)
406        li      r4, 18
407        b       ppc_exc_wrap_nopush_std
408        stwu    r1, -EXC_GENERIC_SIZE(r1)
409        stw     r4, GPR4_OFFSET(r1)
410        li      r4, 17
411        b       ppc_exc_wrap_nopush_std
412        stwu    r1, -EXC_GENERIC_SIZE(r1)
413        stw     r4, GPR4_OFFSET(r1)
414        li      r4, 13
415        b       ppc_exc_wrap_nopush_bookE_crit
416        stwu    r1, -EXC_GENERIC_SIZE(r1)
417        stw     r4, GPR4_OFFSET(r1)
418        li      r4, 10
419        b       ppc_exc_wrap_nopush_std
420        stwu    r1, -EXC_GENERIC_SIZE(r1)
421        stw     r4, GPR4_OFFSET(r1)
422        li      r4, 25
423        b       ppc_exc_wrap_nopush_std
424        stwu    r1, -EXC_GENERIC_SIZE(r1)
425        stw     r4, GPR4_OFFSET(r1)
426        li      r4, 26
427        b       ppc_exc_wrap_nopush_std
428        stwu    r1, -EXC_GENERIC_SIZE(r1)
429        stw     r4, GPR4_OFFSET(r1)
430        li      r4, 15
431        b       ppc_exc_wrap_nopush_std
432
433/* Symbol provided for debugging and tracing */
434bsp_exc_vector_end:
435
436        /* Start stack area */
437        .section ".bsp_rwextra", "aw", @nobits
438        .align 4
439        .space 4096
440start_stack_end:
Note: See TracBrowser for help on using the repository browser.