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

5
Last change on this file since d2a45a58 was d2a45a58, checked in by Sebastian Huber <sebastian.huber@…>, on 03/23/17 at 09:07:52

bsp/qoriq: Fix L1 cache flush

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