source: rtems/bsps/powerpc/gen5200/start/start.S @ 84e59b7c

Last change on this file since 84e59b7c was 84e59b7c, checked in by Sebastian Huber <sebastian.huber@…>, on Nov 15, 2018 at 7:47:22 PM

bsps/powerpc: Use interrupt stack for init stack

Move start.o to separate file.

Update #3459.

  • Property mode set to 100644
File size: 25.5 KB
Line 
1/*===============================================================*\
2| Project: RTEMS generic MPC5200 BSP                              |
3+-----------------------------------------------------------------+
4| Partially based on the code references which are named below.   |
5| Adaptions, modifications, enhancements and any recent parts of  |
6| the code are:                                                   |
7|                    Copyright (c) 2005                           |
8|                    Embedded Brains GmbH                         |
9|                    Obere Lagerstr. 30                           |
10|                    D-82178 Puchheim                             |
11|                    Germany                                      |
12|                    rtems@embedded-brains.de                     |
13+-----------------------------------------------------------------+
14| The license and distribution terms for this file may be         |
15| found in the file LICENSE in this distribution or at            |
16|                                                                 |
17| http://www.rtems.org/license/LICENSE.                           |
18|                                                                 |
19+-----------------------------------------------------------------+
20| this file contains the startup assembly code                    |
21\*===============================================================*/
22/***********************************************************************/
23/*                                                                     */
24/*   Module:       start.S                                             */
25/*   Date:         07/17/2003                                          */
26/*   Purpose:      RTEMS MPC5x00 CPU assembly startup                  */
27/*                                                                     */
28/*---------------------------------------------------------------------*/
29/*                                                                     */
30/*   Description:  This file contains the assembler portion of MPC5x00 */
31/*                 startup code                                        */
32/*                                                                     */
33/*---------------------------------------------------------------------*/
34/*                                                                     */
35/*   Code                                                              */
36/*   References:   startup code for Motorola PQII ADS board            */
37/*   Module:       start.S                                             */
38/*   Project:      RTEMS 4.6.0pre1 / MCF8260ads BSP                    */
39/*   Version       1.2                                                 */
40/*   Date:         04/18/2002                                          */
41/*                                                                     */
42/*   Author(s) / Copyright(s):                                         */
43/*                                                                     */
44/*   Modified for the Motorola PQII ADS board by                       */
45/*   Andy Dachs <a.dachs@sstl.co.uk> 23-11-00.                         */
46/*   Surrey Satellite Technology Limited                               */
47/*                                                                     */
48/*   I have a proprietary bootloader programmed into the flash         */
49/*   on the board which initialises the SDRAM prior to calling         */
50/*   this function.                                                    */
51/*                                                                     */
52/*   This file is based on the one by Jay Monkman (jmonkman@fracsa.com)*/
53/*   which in turn was based on the dlentry.s file for the Papyrus BSP,*/
54/*   written by:                                                       */
55/*                                                                     */
56/*   Author:     Andrew Bray <andy@i-cubed.co.uk>                      */
57/*                                                                     */
58/*   COPYRIGHT (c) 1995 by i-cubed ltd.                                */
59/*                                                                     */
60/*   To anyone who acknowledges that this file is provided "AS IS"     */
61/*   without any express or implied warranty:                          */
62/*      permission to use, copy, modify, and distribute this file      */
63/*      for any purpose is hereby granted without fee, provided that   */
64/*      the above copyright notice and this notice appears in all      */
65/*      copies, and that the name of i-cubed limited not be used in    */
66/*      advertising or publicity pertaining to distribution of the     */
67/*      software without specific, written prior permission.           */
68/*      i-cubed limited makes no representations about the suitability */
69/*      of this software for any purpose.                              */
70/*                                                                     */
71/*---------------------------------------------------------------------*/
72/*                                                                     */
73/*   Partially based on the code references which are named above.     */
74/*   Adaptions, modifications, enhancements and any recent parts of    */
75/*   the code are under the right of                                   */
76/*                                                                     */
77/*         IPR Engineering, Dachauer Straße 38, D-80335 MÃŒnchen        */
78/*                        Copyright(C) 2003                            */
79/*                                                                     */
80/*---------------------------------------------------------------------*/
81/*                                                                     */
82/*   IPR Engineering makes no representation or warranties with        */
83/*   respect to the performance of this computer program, and          */
84/*   specifically disclaims any responsibility for any damages,        */
85/*   special or consequential, connected with the use of this program. */
86/*                                                                     */
87/*---------------------------------------------------------------------*/
88/*                                                                     */
89/*   Version history:  1.0                                             */
90/*                                                                     */
91/***********************************************************************/
92
93#include <rtems/asm.h>
94#include <rtems/powerpc/cache.h>
95#include <libcpu/powerpc-utility.h>
96
97#include <bsp.h>
98#include <bsp/mpc5200.h>
99
100/* Some register offsets of MPC5x00 memory map registers */
101.set    CS0STR,                 0x04
102.set    CS0STP,                 0x08
103.set    CS1STR,                 0x0C
104.set    CS1STP,                 0x10
105.set    SDRAMCS0,               0x34
106.set    SDRAMCS1,               0x38
107.set    BOOTSTR,                0x4C
108.set    BOOTSTP,                0x50
109.set    ADREN,                  0x54
110.set    CSSR0,                  0x58            /* Critical Interrupt SSR0 (603le only) */
111.set    CSSR1,                  0x59            /* Critical Interrupt SSR1 (603le only) */
112.set    CFG,                    0x20C
113.set    CSBOOTROM,              0x300
114.set    CSCONTROL,              0x318
115.set    CS1CONF,        0x304
116
117
118/* Register offsets of MPC5x00 SDRAM memory controller registers */
119.set    MOD,                    0x100
120.set    CTRL,                   0x104
121.set    CFG1,                   0x108
122.set    CFG2,                   0x10C
123.set    ADRSEL,                 0x110
124.set    SDELAY,                 0x190
125
126/* Register offsets of MPC5x00 GPIO registers needed */
127.set    GPIOPCR,                0xb00
128.set    GPIOWE,                 0xc00
129.set    GPIOWOD,                0xc04
130.set    GPIOWDD,                0xc08
131.set    GPIOWDO,                0xc0c
132
133.set    GPIOSEN,                0xb04
134.set    GPIOSDD,                0xb0c
135.set    GPIOSDO,                0xb10
136
137/* Register offsets of MPC5x00 Arbiter registers */
138.set    ARBCFG,                 0x1f40
139.set    ARBADRTO,               0x1f58
140.set    ARBDATTO,               0x1f5c
141.set    ARBMPREN,               0x1f64
142.set    ARBMPRIO,               0x1f68
143.set    ARBSNOOP,               0x1f70
144
145/* Some bit encodings for MGT5100 registers */
146.set    ADREN_BOOT_EN,          (1 << (31 - 6))
147.set    ADREN_CS0_EN,           (1 << (31 - 15))
148.set    ADREN_CS1_EN,           (1 << (31 - 14))
149.set    ADREN_WSE,              (1 << (31 - 31))
150
151.set    CTRL_PRECHARGE_ALL,     (1 << (31 - 30))
152.set    CTRL_REFRESH,           (1 << (31 - 29))
153.set    CTRL_MODE_EN,           (1 << (31 - 0))
154
155.set    CSCONF_CE,              (1<<12)
156
157/* Some fixed values for MPC5x00 registers */
158.set    CSCONTROL_VAL,          0x91000000
159
160/*
161 * The DDR_MODE bit is a read-only status and should be written as 0.
162 *
163 * XLB_CLK = FVCO / 4
164 * IPB_CLK = XLB_CLK / 2
165 * PCI_CLK = IPB_CLK
166 */
167.set    CFG_VAL,                0x00000100
168
169.extern boot_card
170
171.section ".vectors", "ax"
172        bl      start
173        .rep 63
174        .long 0x04000400
175        .endr
176__vec2: b       __vec2
177        .rep 63
178        .long 0x04000400
179        .endr
180__vec3: b       __vec3
181        .rep 63
182        .long 0x04000400
183        .endr
184__vec4: b       __vec4
185        .rep 63
186        .long 0x04000400
187        .endr
188__vec5: b       __vec5
189        .rep 63
190        .long 0x04000400
191        .endr
192__vec6: b       __vec6
193        .rep 63
194        .long 0x04000400
195        .endr
196__vec7: b       __vec7
197        .rep 63
198        .long 0x04000400
199        .endr
200__vec8: b       __vec8
201        .rep 63
202        .long 0x04000400
203        .endr
204__vec9: b       __vec9
205        .rep 63
206        .long 0x04000400
207        .endr
208__veca: b       __veca
209        .rep 63
210        .long 0x04000400
211        .endr
212__vecb: b       __vecb
213        .rep 63
214        .long 0x04000400
215        .endr
216__vecc: b       __vecc
217        .rep 63
218        .long 0x04000400
219        .endr
220__vecd: b       __vecd
221        .rep 63
222        .long 0x04000400
223        .endr
224__vece: b       __vece
225        .rep 63
226        .long 0x04000400
227        .endr
228__vecf: b       __vecf
229        .rep 63+1024
230        .long 0x04000400
231        .endr
232
233.section ".entry"
234PUBLIC_VAR (start)
235start:
236/* 1st: initialization work (common for RAM/ROM startup) */
237        mfmsr   r30
238        SETBITS r30, r29, MSR_ME|MSR_RI
239        CLRBITS r30, r29, MSR_EE
240        mtmsr   r30                             /* Set RI/ME, Clr EE in MSR */
241
242#ifdef HAS_UBOOT
243        mr      r14, r3
244#endif /* HAS_UBOOT */
245
246#if defined(NEED_LOW_LEVEL_INIT)
247/* initialize the MBAR (common RAM/ROM startup) */
248        LWI     r31, MBAR_RESET
249        LWI     r29, MBAR
250        rlwinm  r30, r29,16,16,31
251        stw     r30, 0(r31)                     /* Set the MBAR */
252#endif
253
254        LWI     r31, MBAR                       /* set r31 to current MBAR */
255        /* init GPIOPCR */
256        lwz     r29,GPIOPCR(r31)
257        LWI     r30, BSP_GPIOPCR_INITMASK
258        not     r30,r30
259        and     r29,r29,r30
260        LWI     r30, BSP_GPIOPCR_INITVAL
261        or      r29,r29,r30
262        stw     r29, GPIOPCR(r31)
263
264/* further initialization work (common RAM/ROM startup) */
265        bl      TLB_init                        /* Initialize TLBs */
266
267
268        bl      FID_DCache                      /* Flush, inhibit and disable data cache */
269
270
271        bl      IDUL_ICache                     /* Inhibit, disable and unlock instruction cache */
272
273
274        bl      FPU_init                        /* Initialize FPU */
275
276
277#if defined(NEED_LOW_LEVEL_INIT)
278        bl      SPRG_init                       /* Initialize special purpose registers */
279#endif
280
281#if defined(NEED_LOW_LEVEL_INIT)
282/* detect RAM/ROM startup (common for RAM/ROM startup) */
283        LWI     r20, bsp_rom_start              /* set the relocation offset */
284
285
286        LWI     r30, CFG_VAL                    /* get CFG register content */
287        lwz     r30, CFG(r31)                   /* set CFG register */
288
289
290
291        lwz     r30, ADREN(r31)                 /* get content of ADREN */
292
293
294
295        TSTBITS r30, r29, ADREN_BOOT_EN
296        bne     skip_ROM_start                  /* If BOOT_ROM is not enabled, skip further initialization */
297
298/* do some board dependent configuration (unique for ROM startup) */
299        LWI     r30, CSCONTROL_VAL              /* get CSCONTROL register content */
300        stw     r30, CSCONTROL(r31)             /* enable internal/external bus error and master for CS */
301
302
303#if defined(MPC5200_BOARD_BRS5L)
304        #define CSBOOTROM_VAL 0x0101D910
305#elif defined(MPC5200_BOARD_BRS6L)
306        #define CSBOOTROM_VAL 0x0202D910
307#endif
308
309#ifdef CSBOOTROM_VAL
310        LWI     r30, CSBOOTROM_VAL
311        stw     r30, CSBOOTROM(r31)             /* Set CSBOOTROM */
312#endif
313
314        /* FIXME: map BOOT ROM into final location with CS0 registers */
315        LWI     r30, bsp_rom_start
316        rlwinm  r30, r30,17,15,31
317        stw     r30, CS0STR(r31)                /* Set CS0STR */
318
319        LWI     r30, bsp_rom_end - 1
320
321        rlwinm  r30, r30,17,15,31
322        stw     r30, CS0STP(r31)                /* Set CS0STP */
323
324        lwz     r30, ADREN(r31)                 /* get content of ADREN */
325        SETBITS r30, r29, ADREN_CS0_EN
326        stw     r30, ADREN(r31)                 /* enable CS0 mapping */
327        isync
328        /* jump to same code in final BOOT ROM location */
329        LWI     r30, reloc_in_CS0
330        LWI     r29, bsp_ram_start
331        sub     r30,r30,r29
332        LWI     r29, bsp_rom_start
333        add     r30,r30,r29
334        mtctr   r30
335        bctr
336
337reloc_in_CS0:
338        /* disable CSBOOT (or map it to CS0 range) */
339        lwz     r30, ADREN(r31)                 /* get content of ADREN */
340        CLRBITS r30, r29, ADREN_BOOT_EN
341        stw     r30, ADREN(r31)                 /* disable BOOT mapping */
342
343        /* init SDRAM */
344        LWI     r30, bsp_ram_start
345        ori     r30, r30, 0x1a                  /* size code: bank is 128MByte */
346        stw     r30, SDRAMCS0(r31)              /* Set SDRAMCS0 */
347
348        LWI     r30, bsp_ram_size
349        srawi   r30, r30, 1
350        ori     r30, r30, 0x1a                  /* size code: bank is 128MByte */
351        stw     r30, SDRAMCS1(r31)              /* Set SDRAMCS1 */
352
353        bl      SDRAM_init                      /* Initialize SDRAM controller */
354
355        bl      XLB_init
356/* copy .text section from ROM to RAM location (unique for ROM startup) */
357        LA      r30, bsp_section_text_start     /* get start address of text section in RAM */
358
359
360        add     r30, r20, r30                   /* get start address of text section in ROM (add reloc offset) */
361
362
363        LA      r29, bsp_section_text_start     /* get start address of text section in RAM */
364
365
366        LA      r28, bsp_section_text_size      /* get size of RAM image */
367
368
369        bl      copy_image                      /* copy text section from ROM to RAM location */
370
371
372/* copy .data section from ROM to RAM location (unique for ROM startup) */
373        LA      r30, bsp_section_data_start     /* get start address of data section in RAM */
374
375
376        add     r30, r20, r30                   /* get start address of data section in ROM (add reloc offset) */
377
378
379        LA      r29, bsp_section_data_start     /* get start address of data section in RAM */
380
381
382        LA      r28, bsp_section_data_size      /* get size of RAM image */
383
384
385        bl      copy_image                      /* copy initialized data section from ROM to RAM location */
386
387
388        LA      r29, remap_rom                  /* get compile time address of label */
389        mtlr    r29
390
391        blrl                                    /* now further execution RAM */
392
393remap_rom:
394/* remap BOOT ROM to CS0 (common for RAM/ROM startup) */
395        lwz     r30, CSBOOTROM(r31)             /* get content of CSBOOTROM */
396
397
398
399        CLRBITS r30, r29, CSCONF_CE
400        stw     r30, CSBOOTROM(r31)             /* disable BOOT CS */
401
402
403
404        lwz     r30, ADREN(r31)                 /* get content of ADREN */
405
406
407
408        mr      r29, r30                        /* move content of r30 to r29 */
409
410
411        LWI     r30, ADREN_BOOT_EN              /* mask ADREN_BOOT_EN */
412        andc    r29,r29,r30
413
414
415        LWI     r30, ADREN_CS0_EN               /* unmask ADREN_CS0_EN */
416        or      r29,r29,r30
417
418
419        stw     r29,ADREN(r31)                  /* Simultaneous enable CS0 and disable BOOT address space */
420
421
422
423        lwz     r30, CSBOOTROM(r31)             /* get content of CSBOOTROM */
424
425
426
427        SETBITS r30, r29, CSCONF_CE
428        stw     r30, CSBOOTROM(r31)             /* disable BOOT CS */
429
430
431
432skip_ROM_start:
433/* configure external DPRAM CS1 */
434        LWI     r30, 0xFFFFFB10
435        stw     r30, CS1CONF(r31)
436
437/* map external DPRAM (CS1) */
438        LWI     r30, bsp_dpram_start
439        srawi   r30, r30, 16
440        stw     r30, CS1STR(r31)
441
442        LWI     r30, bsp_dpram_end
443        srawi   r30, r30, 16
444        stw     r30, CS1STP(r31)
445
446        lwz     r30, ADREN(r31)                 /* get content of ADREN */
447
448        LWI     r29, ADREN_CS1_EN               /* unmask ADREN_CS1_EN */
449        or      r30, r30,r29
450
451        stw     r30, ADREN(r31)                 /* enable CS1 */
452
453/* clear entire on chip SRAM (unique for ROM startup) */
454        lis     r30, (MBAR+ONCHIP_SRAM_OFFSET)@h        /* get start address of onchip SRAM */
455        ori     r30, r30,(MBAR+ONCHIP_SRAM_OFFSET)@l
456        LWI     r29, ONCHIP_SRAM_SIZE           /* get size of onchip SRAM */
457
458        bl      clr_mem                         /* Clear onchip SRAM */
459
460#else /* defined(NEED_LOW_LEVEL_INIT) */
461        bl      XLB_init
462#endif /* defined(NEED_LOW_LEVEL_INIT) */
463/* clear .bss section (unique for ROM startup) */
464        LWI     r30, bsp_section_bss_start      /* get start address of bss section */
465        LWI     r29, bsp_section_bss_size       /* get size of bss section */
466
467
468        bl      clr_mem                         /* Clear the bss section */
469
470#ifdef HAS_UBOOT
471        mr      r3, r14
472        bl      bsp_uboot_copy_board_info
473#endif /* HAS_UBOOT */
474
475        /*
476         * Initialize start stack (common for RAM/ROM startup).  The stacks are
477         * statically allocated and properly aligned.
478         */
479        LA      r1, _ISR_Stack_area_end
480        subi    r1, r1, PPC_DEFAULT_CACHE_LINE_SIZE
481        li      r0, 0
482        stw     r0, 0(r1)
483
484        bl      __eabi                          /* Set up EABI and SYSV environment */
485
486/* enable dynamic power management(common for RAM/ROM startup) */
487        bl      PPC_HID0_rd                     /* Get the content of HID0 */
488
489        SETBITS r30, r29, HID0_DPM
490        bl      PPC_HID0_wr                     /* Set DPM in HID0 */
491
492/* clear arguments and do further init. in C (common for RAM/ROM startup) */
493
494        /* Clear cmdline */
495        xor r3, r3, r3
496
497        bl      SYM (boot_card)                 /* Call the first C routine */
498
499twiddle:
500        b       twiddle                         /* We don't expect to return from boot_card but if we do */
501                                                /* wait here for watchdog to kick us into hard reset     */
502
503#if defined(NEED_LOW_LEVEL_INIT)
504SDRAM_init:
505        mflr    r12
506
507#if defined(MPC5200_BOARD_BRS5L)
508      /* set GPIO_WKUP7 pin low for 66MHz buffering */
509      /* or high for 133MHz registered buffering    */
510        LWI     r30, 0x80000000
511
512        lwz     r29, GPIOWE(r31)
513        or      r29,r29,r30                     /* set bit 0 in r29/GPIOWE */
514        stw     r29,GPIOWE(r31)
515
516        lwz     r29, GPIOWOD(r31)
517        andc    r29,r29,r30                     /* clear bit 0 in r29/GPIOWOD */
518        stw     r29,GPIOWOD(r31)
519
520        lwz     r29, GPIOWDO(r31)
521        andc    r29,r29,r30                     /* clear bit 0 in r29/GPIOWDO */
522        stw     r29,GPIOWDO(r31)
523
524        lwz     r29, GPIOWDD(r31)
525        or      r29,r29,r30                     /* set bit 0 in r29/GPIOWDD */
526        stw     r29,GPIOWDD(r31)
527
528        /* activate MEM_CS1 output */
529        lwz     r29, GPIOPCR(r31)
530        or      r29,r29,r30                     /* set bit 0 in r29/GPIOPCR */
531        stw     r29,GPIOPCR(r31)
532
533#endif
534
535        #define SDELAY_VAL 0x00000004
536
537#if defined(MPC5200_BOARD_BRS6L)
538        #define CFG1_VAL 0x73722930
539#else
540        /*
541         * Single Read2Read/Write delay=0xC, Single Write2Read/Prec. delay=0x4
542         * Read CAS latency=0x2, Active2Read delay=0x2, Prec.2active delay=0x2
543         */
544        #define CFG1_VAL 0xC4222600
545#endif
546
547#if defined(MPC5200_BOARD_BRS6L)
548        #define CFG2_VAL 0x47770000
549#else
550        /* Refr.2No-Read delay=0x06, Write latency=0x0 */
551        /* Burst2Read Prec.delay=0x8, Burst Write delay=0x8 */
552        /* Burst Read2Write delay=0xB, Burst length=0x7, Read Tap=0x4 */
553        #define CFG2_VAL 0xCCC70004
554#endif
555
556#if defined(MPC5200_BOARD_BRS5L)
557        /* Mode Set enabled, Clock enabled, Auto refresh enabled, Mem. data drv */
558        /* Refresh counter=0xFFFF */
559        #define CTRL_VAL 0xD1470000
560#elif defined(MPC5200_BOARD_BRS6L)
561        #define CTRL_VAL 0xF15F0F00
562#else
563        /* Mode Set enabled, Clock enabled, Auto refresh enabled, Mem. data drv */
564        /* Refresh counter=0xFFFF */
565        #define CTRL_VAL 0xD04F0000
566#endif
567
568#if defined(MPC5200_BOARD_BRS6L)
569        /* Enable DLL, normal drive strength */
570        #define EMODE_VAL 0x40010000
571#endif
572
573#if defined(MPC5200_BOARD_BRS6L)
574        /* Burst length = 8, burst type sequential, CAS latency 2.5, normal operation/reset DLL */
575        #define MODE_VAL 0x058D0000
576#else
577        /* Op.Mode=0x0, Read CAS latency=0x2, Burst length=0x3, Write strobe puls */
578        #define MODE_VAL 0x008D0000
579#endif
580
581#if defined(MPC5200_BOARD_BRS6L)
582        /* Burst length = 8, burst type sequential, CAS latency 2.5, normal operation */
583        #define SECOND_MODE_VAL (MODE_VAL & ~0x04000000)
584#endif
585
586        /* SDRAM initialization according to application note AN3221 */
587
588        /* SDRAM controller setup */
589
590        LWI     r3, SDELAY_VAL
591        stw     r3, SDELAY(r31)
592
593        LWI     r3, CFG1_VAL
594        stw     r3, CFG1(r31)
595
596        LWI     r3, CFG2_VAL
597        stw     r3, CFG2(r31)
598
599        LWI     r11, CTRL_VAL
600        stw     r11, CTRL(r31)
601        lwz     r3, CTRL(r31)
602
603        /* Perform a PRECHARGE ALL command */
604        ori     r3, r11, CTRL_PRECHARGE_ALL
605        stw     r3, CTRL(r31)
606        lwz     r3, CTRL(r31)
607
608        /* Wait at least tRP time */
609        li      r3, 15
610        bl      ndelay
611
612#if defined(EMODE_VAL)
613        /* Write EMODE register */
614        LWI     r3, EMODE_VAL
615        stw     r3, MOD(r31)
616
617        /* Wait at least tMRD time */
618        li      r3, 10
619        bl      ndelay
620#endif
621
622        /* Write MODE register */
623        LWI     r3, MODE_VAL
624        stw     r3, MOD(r31)
625
626        /* Wait at least tMRD time */
627        li      r3, 10
628        bl      ndelay
629
630        /* Perform a PRECHARGE ALL command */
631        ori     r3, r11, CTRL_PRECHARGE_ALL
632        stw     r3, CTRL(r31)
633        lwz     r3, CTRL(r31)
634
635        /* Wait at least tRP time */
636        li      r3, 15
637        bl      ndelay
638
639        /* Perform an AUTO REFRESH */
640        ori     r3, r11, CTRL_REFRESH
641        stw     r3, CTRL(r31)
642        lwz     r3, CTRL(r31)
643
644        /* Wait at least tRFC time */
645        li      r3, 70
646        bl      ndelay
647
648        /* Perform an AUTO REFRESH */
649        ori     r3, r11, CTRL_REFRESH
650        stw     r3, CTRL(r31)
651        lwz     r3, CTRL(r31)
652
653        /* Wait at least tRFC time */
654        li      r3, 70
655        bl      ndelay
656
657#if defined(SECOND_MODE_VAL)
658        /* Write MODE register */
659        LWI     r3, SECOND_MODE_VAL
660        stw     r3, MOD(r31)
661#endif
662
663        /* Disable MODE register access */
664        lis     r4, CTRL_MODE_EN@h
665        andc    r3, r11, r4
666        stw     r3, CTRL(r31)
667        lwz     r3, CTRL(r31)
668
669        mtlr    r12
670        blr
671
672copy_image:
673        mr      r27, r28
674        srwi    r28, r28, 2
675        mtctr   r28
676
677
678        slwi    r28, r28, 2
679        sub     r27, r27, r28                   /* maybe some residual bytes */
680
681
682copy_image_word:
683        lswi    r28, r30, 0x04
684
685        stswi   r28, r29, 0x04                  /* do word copy ROM -> RAM */
686
687
688        addi    r30, r30, 0x04                  /* increment source pointer */
689        addi    r29, r29, 0x04                  /* increment destination pointer */
690
691        bdnz    copy_image_word                 /* decrement ctr and branch if not 0 */
692
693        cmpwi   r27, 0x00                       /* copy image finished ? */
694        beq     copy_image_end;
695        mtctr   r27                             /* reload counter for residual bytes */
696copy_image_byte:
697        lswi    r28, r30, 0x01
698
699        stswi   r28, r29, 0x01                  /* do byte copy ROM -> RAM */
700
701
702        addi    r30, r30, 0x01                  /* increment source pointer */
703        addi    r29, r29, 0x01                  /* increment destination pointer */
704
705        bdnz    copy_image_byte                 /* decrement ctr and branch if not 0 */
706
707copy_image_end:
708        blr
709#endif /* defined(NEED_LOW_LEVEL_INIT) */
710
711FID_DCache:
712        mflr    r26
713
714        bl      PPC_HID0_rd
715        TSTBITS r30, r29, HID0_DCE
716        bne     FID_DCache_exit                 /* If data cache is switched of, skip further actions */
717
718        li      r29, PPC_D_CACHE                /* 16 Kb data cache on 603e */
719        LWI     r28, bsp_section_text_start     /* Load base address (begin of RAM) */
720
721FID_DCache_loop_1:
722        lwz     r27, 0(r28)                     /* Load data at address */
723
724        addi    r28, r28, PPC_CACHE_ALIGNMENT   /* increment cache line address */
725        subi    r29, r29, PPC_CACHE_ALIGNMENT   /* increment loop counter */
726        cmpwi   r29, 0x0
727        bne     FID_DCache_loop_1               /* Loop until cache size is reached */
728
729        li      r29, PPC_D_CACHE                /* 16 Kb data cache on 603e */
730        LWI     r28, bsp_section_text_start     /* Reload base address (begin of RAM) */
731        xor     r27, r27, r27
732FID_DCache_loop_2:
733
734        dcbf    r27, r28                        /* Flush and invalidate cache */
735
736        addi    r28, r28, PPC_CACHE_ALIGNMENT   /* increment cache line address */
737        subi    r29, r29, PPC_CACHE_ALIGNMENT   /* increment loop counter */
738        cmpwi   r29, 0x0
739        bne     FID_DCache_loop_2               /* Loop around until cache size is reached */
740
741        bl      PPC_HID0_rd                     /* Read HID0 */
742        CLRBITS r30, r29, HID0_DCE
743        bl      PPC_HID0_wr                     /* Clear DCE */
744
745FID_DCache_exit:
746        mtlr    r26
747        blr
748
749IDUL_ICache:
750        mflr    r26
751
752        bl      PPC_HID0_rd
753        TSTBITS r30, r29, HID0_ICE
754        bne     IDUL_ICache_exit                /* If instruction cache is switched of, skip further actions */
755
756        CLRBITS r30, r29, HID0_ICE
757        bl      PPC_HID0_wr                     /* Disable ICE bit */
758
759        SETBITS r30, r29, HID0_ICFI
760        bl      PPC_HID0_wr                     /* Invalidate instruction cache */
761
762        CLRBITS r30, r29, HID0_ICFI
763        bl      PPC_HID0_wr                     /* Disable cache invalidate */
764
765        CLRBITS r30, r29, HID0_ILOCK
766        bl      PPC_HID0_wr                     /* Disable instruction cache lock */
767
768IDUL_ICache_exit:
769        mtlr    r26
770        blr
771
772
773TLB_init:                                       /* Initialize translation lookaside buffers (TLBs) */
774        xor     r30, r30, r30
775        xor     r29, r29, r29
776
777TLB_init_loop:
778        tlbie   r29
779        tlbsync
780        addi    r29, r29, 0x1000
781        addi    r30, r30, 0x01
782        cmpli   0, 0, r30, 0x0080
783        bne     TLB_init_loop
784        blr
785
786FPU_init:
787        mfmsr   r30                             /* get content of MSR */
788
789
790        SETBITS r30, r29, MSR_FP
791        mtmsr   r30                             /* enable FPU and FPU exceptions */
792        sync
793
794        lfd     f0, 0(r29)
795        fmr     f1, f0
796        fmr     f2, f0
797        fmr     f3, f0
798        fmr     f4, f0
799        fmr     f5, f0
800        fmr     f6, f0
801        fmr     f7, f0
802        fmr     f8, f0
803        fmr     f9, f0
804        fmr     f10, f0
805        fmr     f11, f0
806        fmr     f12, f0
807        fmr     f13, f0
808        fmr     f14, f0
809        fmr     f15, f0
810        fmr     f16, f0
811        fmr     f17, f0
812        fmr     f18, f0
813        fmr     f19, f0
814        fmr     f20, f0
815        fmr     f21, f0
816        fmr     f22, f0
817        fmr     f23, f0
818        fmr     f24, f0
819        fmr     f25, f0
820        fmr     f26, f0
821        fmr     f27, f0
822        fmr     f28, f0
823        fmr     f29, f0
824        fmr     f30, f0
825        fmr     f31, f0
826
827
828        mtfsfi  0, 0                            /* initialize bit positons in FPSCR */
829        mtfsfi  1, 0
830        mtfsfi  2, 0
831        mtfsfi  3, 0
832        mtfsfi  4, 0
833        mtfsfi  5, 0
834        mtfsfi  6, 0
835        mtfsfi  7, 0
836
837        blr
838
839SPRG_init:                                      /* initialize registers */
840        xor     r30, r30, r30
841
842        mtspr   PPC_XER, r30
843        mtspr   PPC_CTR, r30
844        mtspr   DSISR, r30
845        mtspr   PPC_DAR, r30
846        mtspr   PPC_DEC, r30
847        mtspr   SDR1, r30
848        mtspr   SRR0, r30
849        mtspr   SRR1, r30
850        mtspr   CSSR0, r30
851        mtspr   CSSR1, r30
852        mtspr   SPRG0, r30
853        mtspr   SPRG1, r30
854        mtspr   SPRG2, r30
855        mtspr   SPRG3, r30
856        mtspr   SPRG4, r30
857        mtspr   SPRG5, r30
858        mtspr   SPRG6, r30
859        mtspr   SPRG7, r30
860        mtspr   PPC_EAR, r30
861        mtspr   TBWU, r30
862        mtspr   TBWL, r30
863        mtspr   IBAT0U, r30
864        mtspr   IBAT0L, r30
865        mtspr   IBAT1U, r30
866        mtspr   IBAT1L, r30
867        mtspr   IBAT2U, r30
868        mtspr   IBAT2L, r30
869        mtspr   IBAT3U, r30
870        mtspr   IBAT3L, r30
871        mtspr   IBAT4U, r30
872        mtspr   IBAT4L, r30
873        mtspr   IBAT5U, r30
874        mtspr   IBAT5L, r30
875        mtspr   IBAT6U, r30
876        mtspr   IBAT6L, r30
877        mtspr   IBAT7U, r30
878        mtspr   IBAT7L, r30
879        mtspr   DBAT0U, r30
880        mtspr   DBAT0L, r30
881        mtspr   DBAT1U, r30
882        mtspr   DBAT1L, r30
883        mtspr   DBAT2U, r30
884        mtspr   DBAT2L, r30
885        mtspr   DBAT3U, r30
886        mtspr   DBAT3L, r30
887        mtspr   DBAT4U, r30
888        mtspr   DBAT4L, r30
889        mtspr   DBAT5U, r30
890        mtspr   DBAT5L, r30
891        mtspr   DBAT6U, r30
892        mtspr   DBAT6L, r30
893        mtspr   DBAT7U, r30
894        mtspr   DBAT7L, r30
895        mtspr   DMISS, r30
896        mtspr   DCMP, r30
897        mtspr   HASH1, r30
898        mtspr   HASH2, r30
899        mtspr   IMISS, r30
900        mtspr   ICMP, r30
901        mtspr   PPC_RPA, r30
902        mtsr    PPC_SR0, r30
903        mtsr    PPC_SR1, r30
904        mtsr    PPC_SR2, r30
905        mtsr    PPC_SR3, r30
906        mtsr    PPC_SR4, r30
907        mtsr    PPC_SR5, r30
908        mtsr    PPC_SR6, r30
909        mtsr    PPC_SR7, r30
910        mtsr    PPC_SR8, r30
911        mtsr    PPC_SR9, r30
912        mtsr    PPC_SR10, r30
913        mtsr    PPC_SR12, r30
914        mtsr    PPC_SR13, r30
915        mtsr    PPC_SR14, r30
916        mtsr    PPC_SR15, r30
917
918
919
920
921
922        blr
923
924PPC_HID0_rd:                                    /* get HID0 content to r30 */
925
926
927        mfspr   r30, HID0
928
929        blr
930
931
932PPC_HID0_wr:                                    /* put r30 content to HID0 */
933
934
935        mtspr   HID0, r30
936
937        blr
938
939clr_mem:
940        mr      r28, r29
941        srwi    r29, r29, 2
942        mtctr   r29                             /* set ctr reg */
943
944
945        slwi    r29, r29, 2
946        sub     r28, r28, r29                   /* maybe some residual bytes */
947        xor     r29, r29, r29
948
949
950clr_mem_word:
951        stswi   r29, r30, 0x04                  /* store r29 (word) to r30 memory location */
952        addi    r30, r30, 0x04                  /* increment r30 */
953
954        bdnz    clr_mem_word                    /* dec counter and loop */
955
956
957        cmpwi   r28, 0x00                       /* clear mem. finished ? */
958        beq     clr_mem_end;
959        mtctr   r28                             /* reload counter for residual bytes */
960clr_mem_byte:
961        stswi   r29, r30, 0x01                  /* store r29 (byte) to r30 memory location  */
962        addi    r30, r30, 0x01                  /* update r30 */
963
964        bdnz    clr_mem_byte                    /* dec counter and loop */
965
966clr_mem_end:
967        blr                                     /* return */
968
969XLB_init:
970/* init arbiter and stuff... */
971        LWI     r30, 0x8000a06e
972        stw     r30, ARBCFG(r31)                /* Set ARBCFG */
973
974        LWI     r30, 0x000000ff
975        stw     r30, ARBMPREN(r31)              /* Set ARBMPREN */
976
977        LWI     r30, 0x00001234
978        stw     r30, ARBMPRIO(r31)              /* Set ARBPRIO */
979
980        LWI     r30, 0x0000001e
981        stw     r30, ARBSNOOP(r31)              /* Set ARBSNOOP */
982
983        LWI     r30, 4096
984        stw     r30, ARBADRTO(r31)              /* Set ARBADRTO */
985        stw     r30, ARBDATTO(r31)              /* Set ARBDATTO */
986
987        blr
988
989ndelay:
990        /*
991         * The maximum core frequency is 396MHz.
992         * We have (396MHz * 1024) / 10**9 == 405.
993         */
994        mulli   r3, r3, 405
995        srwi.   r3, r3, 10
996
997        beqlr
998
999        mtctr   r3
1000
1001ndelay_loop:
1002        bdnz    ndelay_loop
1003
1004        blr
Note: See TracBrowser for help on using the repository browser.