source: rtems/c/src/lib/libbsp/powerpc/helas403/flashentry/flashentry.S @ 39785ad1

4.104.114.84.9
Last change on this file since 39785ad1 was 39785ad1, checked in by Ralf Corsepius <ralf.corsepius@…>, on Nov 2, 2004 at 2:41:28 AM

2004-10-02 Ralf Corsepius <ralf_corsepius@…>

PR 697/bsps

  • flashentry/flashentry.S: Fix broken comments (Patch by Thomas.Doerfler@…)
  • Property mode set to 100644
File size: 19.8 KB
Line 
1/*  flashentry.s
2 *
3 *  This file contains the entry code for RTEMS programs starting
4 *  directly from Flash.
5 *
6 *  Author:     Thomas Doerfler <td@imd.m.isar.de>
7 *              IMD Ingenieurbuero fuer Microcomputertechnik
8 *
9 *  COPYRIGHT (c) 1998 by IMD
10 *
11 *  Changes from IMD are covered by the original distributions terms.
12 *  This file has been derived from the papyrus BSP:
13 *
14 *  This file contains the entry veneer for RTEMS programs
15 *  stored in Papyrus' flash ROM.
16 *
17 *  Author:     Andrew Bray <andy@i-cubed.co.uk>
18 *
19 *  COPYRIGHT (c) 1995 by i-cubed ltd.
20 *
21 *  To anyone who acknowledges that this file is provided "AS IS"
22 *  without any express or implied warranty:
23 *      permission to use, copy, modify, and distribute this file
24 *      for any purpose is hereby granted without fee, provided that
25 *      the above copyright notice and this notice appears in all
26 *      copies, and that the name of i-cubed limited not be used in
27 *      advertising or publicity pertaining to distribution of the
28 *      software without specific, written prior permission.
29 *      i-cubed limited makes no representations about the suitability
30 *      of this software for any purpose.
31 *
32 *  $Id$
33 */
34
35#include <rtems/asm.h>
36#include <rtems/score/powerpc.h>
37
38/*----------------------------------------------------------------------------
39 * Reset_entry.
40 *---------------------------------------------------------------------------*/
41#if PPC_ASM == PPC_ASM_ELF
42        .section .reset,"ax",@progbits
43        /* this section MUST be located at absolute address 0xFFFFFFFC
44           or last word of EPROM */
45#else
46        .csect .text[PR]
47#endif
48
49        ba      flash_entry /* this is the first instruction after reset */
50
51        .previous
52
53/*----------------------------------------------------------------------------
54 * ROM Vector area.
55 *---------------------------------------------------------------------------*/
56#if PPC_ASM == PPC_ASM_ELF
57        .section .entry,"ax",@progbits
58#else
59        .csect .text[PR]
60#endif
61        PUBLIC_VAR (flash_entry)
62SYM (flash_entry):
63        bl      .startup /* call startup, link reg points to base_addr */
64base_addr:
65/*----------------------------------------------------------------------------
66 * Parameters from linker
67 *---------------------------------------------------------------------------*/
68toc_pointer:
69#if PPC_ASM == PPC_ASM_ELF
70        .long   s.got
71#else
72        .long   TOC[tc0]
73#endif
74text_length:
75        .long   text.size
76text_addr:
77        .long   text.start
78copy_src:
79        .long   copy.src
80copy_length:
81        .long   copy.size
82copy_dest:
83        .long   copy.dest
84bss_length:
85        .long   bss.size
86bss_addr:
87        .long   bss.start
88stack_top:
89        .long   stack.end
90
91/*----------------------------------------------------------------------------
92 * from Reset_entry.
93 *---------------------------------------------------------------------------*/
94.startup:
95        /* Get start address, r1 points to label base_addr */
96        mflr    r1
97
98        /* Set up Bank regs, cache etc. */
99        /* set up bank register BR0 for Flash-EPROM:
100         * NOTE: bank size should stay 1MByte, this is standard size
101         *       after RESET
102         * base addr = Fffxxxxx -> 0b11111111........................
103         * bank size = 1 MByte  -> 0b........000..................... (std)
104         * bank use  = readonly -> 0b...........01...................
105         * seq. fill = targ frst-> 0b.............0..................
106         * burst mode= enable   -> 0b..............1.................
107         * bus width = 8 bit    -> 0b...............00...............
108         * ready pin = disable  -> 0b.................0..............
109         * first wait= 2 clocks -> 0b..................0010..........
110         * burst wait= 2 clocks -> 0b......................10........
111         * CSon time = 0 clocks -> 0b........................0.......
112         * OEon time = 0 clocks -> 0b.........................0......
113         * WBon time = 1 clocks -> 0b..........................1.....
114         * WBoff time= 0 clocks -> 0b...........................0....
115         * Hold time = 1 clocks -> 0b............................001.
116         * ram type  = SRAM(ign)-> 0b...............................1
117         * value                   0b11111111000010100000101000100011
118         *                         0x   F   F   0   A   0   A   2   3
119         */
120        lis     r2,0xFF0A
121        ori     r2,r2,0x0A23
122
123        mtdcr   br0,r2 /* write to DCR BR0 */
124
125        /*--------------------------------------------------------------------
126         * test various RAM configurations (from big to small per bank)
127         *------------------------------------------------------------------*/
128        /*--------------------------------------------------------------------
129         * test RAM config 16 MByte (1x4Mx32Bit)
130         *------------------------------------------------------------------*/
131        /* set up bank register BR7 for DRAM:
132         * base addr = 000xxxxx -> 0b00000000........................
133         * bank size = 16MByte  -> 0b........100.....................
134         * bank use  = readwrite-> 0b...........11...................
135         * seq. fill = targ.frst-> 0b.............0..................
136         * early RAS = disabled -> 0b..............0.................
137         * bus width = 32bit    -> 0b...............10...............
138         * adr mux   = internal -> 0b.................0..............
139         * RAS to CAS= 2 clocks -> 0b..................1.............
140         * Alt. Rfrsh= normal   -> 0b...................0............
141         * page mode = enabled  -> 0b....................1...........
142         * first wait= 1 clocks -> 0b.....................01.........
143         * burst wait= 1 clocks -> 0b.......................01.......
144         * precharge = 1 clocks -> 0b.........................0......
145         * RAS Rfrsh = 2 clocks -> 0b..........................1.....
146         * Rfrsh Itvl= 512 clks -> 0b...........................1000.
147         * ram type  = DRAM     -> 0b...............................0
148         * value                   0b00000000100110010010101010110000
149         *                         0x   0   0   9   9   2   A   B   0
150         */
151        lis     r2,0x0099
152        ori     r2,r2,0x2AB0
153        mtdcr   br7,r2 /* write to DCR BR7*/
154
155        lis     r2,0x0000       /* start address = 0x00000000 */
156        lis     r3,0x0100       /* size  16 MB   = 0x01000000 */
157        bl      ramacc          /* test memory accessibility  */
158        cmpi    0,0,r4,0        /* memory ok? else test smaller size */
159        bne     ramcfgt18
160
161        /*--------------------------------------------------------------------
162         * test RAM config 32 MByte (2x4Mx32Bit)
163         *------------------------------------------------------------------*/
164        /* set up bank register BR7 like above
165         * set up bank register BR6 for DRAM:
166         * base addr = 010xxxxx -> 0b00010000........................
167         * bank size = 16MByte  -> 0b........100..................... (for now)
168         * bank use  = readwrite-> 0b...........11...................
169         * seq. fill = targ.frst-> 0b.............0..................
170         * early RAS = disabled -> 0b..............0.................
171         * bus width = 32bit    -> 0b...............10...............
172         * adr mux   = internal -> 0b.................0..............
173         * RAS to CAS= 2 clocks -> 0b..................1.............
174         * Alt. Rfrsh= normal   -> 0b...................0............
175         * page mode = enabled  -> 0b....................1...........
176         * first wait= 1 clocks -> 0b.....................01.........
177         * burst wait= 1 clocks -> 0b.......................01.......
178         * precharge = 1 clocks -> 0b.........................0......
179         * RAS Rfrsh = 2 clocks -> 0b..........................1.....
180         * Rfrsh Itvl= 512 clks -> 0b...........................1000.
181         * ram type  = DRAM     -> 0b...............................0
182         * value                   0b00010000100110010010101010110000
183         *                         0x   1   0   9   9   2   A   B   0
184         */
185        lis     r2,0x1099
186        ori     r2,r2,0x2AB0
187        mtdcr   br6,r2          /* write to DCR BR6*/
188
189        lis     r2,0x0100       /* start address = 0x01000000 */
190        lis     r3,0x0100       /* size  16 MB   = 0x01000000 */
191        bl      ramacc          /* test memory accessibility  */
192        cmpi    0,0,r4,0        /* memory ok? else test smaller size */
193        beq     ramcfgok        /* ok, we found configuration... */
194
195        lis     r2,0x0000       /* disable BR6, config not ok */
196        mtdcr   br6,r2          /* write to DCR BR6*/
197        b       ramcfgok        /* and finish configuration */
198
199ramcfgt18:
200        /*--------------------------------------------------------------------
201         * test RAM config 8 MByte (1x2Mx32Bit)
202         *------------------------------------------------------------------*/
203        /* set up bank register BR7 for DRAM:
204         * base addr = 000xxxxx -> 0b00000000........................
205         * bank size =  8MByte  -> 0b........011.....................
206         * bank use  = readwrite-> 0b...........11...................
207         * seq. fill = targ.frst-> 0b.............0..................
208         * early RAS = disabled -> 0b..............0.................
209         * bus width = 32bit    -> 0b...............10...............
210         * adr mux   = internal -> 0b.................0..............
211         * RAS to CAS= 2 clocks -> 0b..................1.............
212         * Alt. Rfrsh= normal   -> 0b...................0............
213         * page mode = enabled  -> 0b....................1...........
214         * first wait= 1 clocks -> 0b.....................01.........
215         * burst wait= 1 clocks -> 0b.......................01.......
216         * precharge = 1 clocks -> 0b.........................0......
217         * RAS Rfrsh = 2 clocks -> 0b..........................1.....
218         * Rfrsh Itvl= 512 clks -> 0b...........................1000.
219         * ram type  = DRAM     -> 0b...............................0
220         * value                   0b00000000011110010010101010110000
221         *                         0x   0   0   7   9   2   A   B   0
222         */
223        lis     r2,0x0079
224        ori     r2,r2,0x2AB0
225        mtdcr   br7,r2         /* write to DCR BR7           */
226
227        lis     r2,0x0000       /* start address = 0x00000000 */
228        lis     r3,0x0080       /* size   8 MB   = 0x00800000 */
229        bl      ramacc          /* test memory accessibility  */
230        cmpi    0,0,r4,0        /* memory ok? else test smaller size */
231        bne     ramcfgt14
232
233        /*--------------------------------------------------------------------
234         * test RAM config 16 MByte (2x2Mx32Bit)
235         *------------------------------------------------------------------*/
236        /* set up bank register BR7 like above
237         * set up bank register BR6 for DRAM:
238         * base addr = 008xxxxx -> 0b00001000........................
239         * bank size = 08MByte  -> 0b........011..................... (for now)
240         * bank use  = readwrite-> 0b...........11...................
241         * seq. fill = targ.frst-> 0b.............0..................
242         * early RAS = disabled -> 0b..............0.................
243         * bus width = 32bit    -> 0b...............10...............
244         * adr mux   = internal -> 0b.................0..............
245         * RAS to CAS= 2 clocks -> 0b..................1.............
246         * Alt. Rfrsh= normal   -> 0b...................0............
247         * page mode = enabled  -> 0b....................1...........
248         * first wait= 1 clocks -> 0b.....................01.........
249         * burst wait= 1 clocks -> 0b.......................01.......
250         * precharge = 1 clocks -> 0b.........................0......
251         * RAS Rfrsh = 2 clocks -> 0b..........................1.....
252         * Rfrsh Itvl= 512 clks -> 0b...........................1000.
253         * ram type  = DRAM     -> 0b...............................0
254         * value                   0b00001000011110010010101010110000
255         *                         0x   0   8   7   9   2   A   B   0
256         */
257        lis     r2,0x0879
258        ori     r2,r2,0x2AB0
259        mtdcr   br6,r2          /* write to DCR BR6*/
260
261        lis     r2,0x0080       /* start address = 0x00800000 */
262        lis     r3,0x0080       /* size   8 MB   = 0x00800000 */
263        bl      ramacc          /* test memory accessibility  */
264        cmpi    0,0,r4,0        /* memory ok? else test smaller size */
265        beq     ramcfgok        /* ok, we found configuration... */
266
267        lis     r2,0x0000       /* disable BR6, config not ok */
268        mtdcr   br6,r2          /* write to DCR BR6*/
269        b       ramcfgok        /* and finish configuration */
270
271ramcfgt14:
272        /*--------------------------------------------------------------------
273         * test RAM config 4 MByte (1x1Mx32Bit)
274         *------------------------------------------------------------------*/
275        /* set up bank register BR7 for DRAM:
276         * base addr = 000xxxxx -> 0b00000000........................
277         * bank size =  4MByte  -> 0b........010.....................
278         * bank use  = readwrite-> 0b...........11...................
279         * seq. fill = targ.frst-> 0b.............0..................
280         * early RAS = disabled -> 0b..............0.................
281         * bus width = 32bit    -> 0b...............10...............
282         * adr mux   = internal -> 0b.................0..............
283         * RAS to CAS= 2 clocks -> 0b..................1.............
284         * Alt. Rfrsh= normal   -> 0b...................0............
285         * page mode = enabled  -> 0b....................1...........
286         * first wait= 1 clocks -> 0b.....................01.........
287         * burst wait= 1 clocks -> 0b.......................01.......
288         * precharge = 1 clocks -> 0b.........................0......
289         * RAS Rfrsh = 2 clocks -> 0b..........................1.....
290         * Rfrsh Itvl= 512 clks -> 0b...........................1000.
291         * ram type  = DRAM     -> 0b...............................0
292         * value                   0b00000000010110010010101010110000
293         *                         0x   0   0   5   9   2   A   B   0
294         */
295        /*
296         * FIXME: this is the minimum size supported, should test and
297         * report error, when failed
298         */
299        lis     r2,0x0059
300        ori     r2,r2,0x2AB0
301        mtdcr   br7,r2 /* write to DCR BR7*/
302
303        /*--------------------------------------------------------------------
304         * test RAM config  8 MByte (2x1Mx32Bit)
305         *------------------------------------------------------------------*/
306        /* set up bank register BR7 like above
307         * set up bank register BR6 for DRAM:
308         * base addr = 004xxxxx -> 0b00000100........................
309         * bank size =  4MByte  -> 0b........010..................... (for now)
310         * bank use  = readwrite-> 0b...........11...................
311         * seq. fill = targ.frst-> 0b.............0..................
312         * early RAS = disabled -> 0b..............0.................
313         * bus width = 32bit    -> 0b...............10...............
314         * adr mux   = internal -> 0b.................0..............
315         * RAS to CAS= 2 clocks -> 0b..................1.............
316         * Alt. Rfrsh= normal   -> 0b...................0............
317         * page mode = enabled  -> 0b....................1...........
318         * first wait= 1 clocks -> 0b.....................01.........
319         * burst wait= 1 clocks -> 0b.......................01.......
320         * precharge = 1 clocks -> 0b.........................0......
321         * RAS Rfrsh = 2 clocks -> 0b..........................1.....
322         * Rfrsh Itvl= 512 clks -> 0b...........................1000.
323         * ram type  = DRAM     -> 0b...............................0
324         * value                   0b00000100010110010010101010110000
325         *                         0x   0   4   5   9   2   A   B   0
326         */
327        lis     r2,0x0459
328        ori     r2,r2,0x2AB0
329        mtdcr   br6,r2          /* write to DCR BR6*/
330
331        lis     r2,0x0040       /* start address = 0x00400000 */
332        lis     r3,0x0040       /* size   4 MB   = 0x00400000 */
333        bl      ramacc          /* test memory accessibility  */
334        cmpi    0,0,r4,0        /* memory ok? else test smaller size */
335        beq     ramcfgok        /* ok, we found configuration... */
336
337        lis     r2,0x0000       /* disable BR6, config not ok */
338        mtdcr   br6,r2          /* write to DCR BR6*/
339        b       ramcfgok        /* and finish configuration */
340
341ramcfgok:
342        /*--------------------------------------------------------------------
343         * init the DRAM where STACK+ DATA+ BBS will be placed.  If this is OK
344         * we will return here.
345         *-------------------------------------------------------------------*/
346        bl      rom2ram
347
348        /* clear caches */
349        addi    r2,0,PPC_I_CACHE/PPC_CACHE_ALIGNMENT
350        mtctr   r2              /* count the loops needed... */
351        xor     r2,r2,r2        /* start at adr zero */
352icinvlp:
353        iccci   0,r2
354        addi    r2,r2,PPC_CACHE_ALIGNMENT
355        bdnz    icinvlp
356
357        addi    r2,r0,PPC_D_CACHE/PPC_CACHE_ALIGNMENT
358        mtctr   r2              /* count the loops needed... */
359        xor     r2,r2,r2        /* start at adr 0 */
360dcinvlp:
361        dccci   0,r2
362        addi    r2,r2,PPC_CACHE_ALIGNMENT
363        bdnz    dcinvlp
364        /*--------------------------------------------------------------------
365         * Enable two 128MB cachable regions.
366         * FEPROM is cachable    at 0xFFF00000..0xFFFFFFFF
367         * DRAM   is cachable    at 0x00000000..0x00FFFFFF
368         * FEPROM is noncachable at 0x7FF00000..0x7FFFFFFF
369         * DRAM   is noncachable at 0x80000000..0x80FFFFFF
370         *-------------------------------------------------------------------*/
371        addis   r2,r0,0x8000
372        addi    r2,r2,0x0001
373
374        mtspr   iccr, r2               /* ICCR */
375        mtspr   dccr, r2               /* DCCR */
376
377        .extern SYM(__vectors)
378
379        lis     r2,__vectors@h          /* set EVPR exc. vector prefix */
380        mtspr   evpr,r2
381
382        lis     r2,0x0000
383        ori     r2,r2,0x0000
384        mtmsr   r2                      /* set default msr           */
385        lis     r2,0x0000               /* do not allow critical IRQ */
386        ori     r2,r2,0x0000
387        mtdcr   exier, r2               /* disable all external IRQs */
388
389        addi    r2,r0,-1                /* r2 = 0xffffffff               */
390        mtdcr   exisr, r2               /* clear all pendingdisable IRQs */
391
392        /*--------------------------------------------------------------------
393         * C_setup.
394         *-------------------------------------------------------------------*/
395
396        lwz     r2,toc_pointer-base_addr(r1)       /* set r2 to toc */
397        lwz     r1,stack_top-base_addr(r1)         /* set r1 to stack_top */
398
399        addi    r1,r1,-56                /* start stack at data_addr - 56 */
400        addi    r3,r0,0x0                /* clear r3 */
401        stw     r3, 0(r1)                /* Clear stack chain */
402        stw     r3, 4(r1)
403        stw     r3, 8(r1)
404        stw     r3, 12(r1)
405        lis     r5,environ@ha
406        la      r5,environ@l(r5)        /* environp */
407        li      r4, 0                   /* argv */
408        li      r3, 0                   /* argc */
409        .extern SYM (boot_card)
410        b       SYM (boot_card)          /* call the first C routine */
411
412/*----------------------------------------------------------------------------
413 * Rom2ram.
414 *---------------------------------------------------------------------------*/
415rom2ram:
416        lwz     r2,copy_dest-base_addr(r1)    /* start of data set by loader */
417        lwz     r3,copy_length-base_addr(r1)  /* data length                 */
418        rlwinm  r3,r3,30,0x3FFFFFFF           /* form length/4               */
419        mtctr   r3                            /* set ctr reg                 */
420        /*--------------------------------------------------------------------
421         * Calculate offset of data in image.
422         *-------------------------------------------------------------------*/
423        lwz     r4,copy_src-base_addr(r1)      /* get start of copy area */
424move_data:
425        lswi    r6,r4,0x4               /* load r6 */
426        stswi   r6,r2,0x4               /* store r6 */
427        addi    r4,r4,0x4               /* update r4 */
428        addi    r2,r2,0x4               /* update r2 */
429        bdnz    move_data               /* decrement counter and loop */
430        /*--------------------------------------------------------------------
431         * Data move finished, zero out bss.
432         *-------------------------------------------------------------------*/
433        lwz     r2,bss_addr-base_addr(r1) /* start of bss set by loader */
434        lwz     r3,bss_length-base_addr(r1)       /* bss length */
435        rlwinm. r3,r3,30,0x3FFFFFFF     /* form length/4 */
436        beqlr                           /* no bss */
437        mtctr   r3                      /* set ctr reg */
438        xor     r6,r6,r6                /* r6 = 0 */
439clear_bss:
440        stswi   r6,r2,0x4               /* store r6 */
441        addi    r2,r2,0x4               /* update r2 */
442        bdnz    clear_bss               /* decrement counter and loop */
443        blr                             /* return */
444
445/*----------------------------------------------------------------------------
446 * ramacc test accessibility of RAM
447 * input:       r2 = start address, r3 = length (in byte)
448 * output:      r4 = 0 -> ok, !=0 -> fail
449 *---------------------------------------------------------------------------*/
450ramacc:
451        xor     r4,r4,r4                /* r4 = 0                    */
452        stw     r4,0(r2)                /* init ram at start address */
453        addi    r4,r0,0x04              /* set start shift           */
454ramaccf1:
455        cmp     0,0,r4,r3               /* compare with length       */
456        bge     ramaccfx                /* r4 >= r3? then finished   */
457        add     r5,r4,r2                /* get next address to fill  */
458        stw     r4,0(r5)                /* store new pattern         */
459        add     r4,r4,r4                /* r4 = r4*2                 */
460        b       ramaccf1                /* and then next loop        */
461
462ramaccfx:
463        lwz     r4,0(r2)                /* get memory at start adr  */
464        blr
465
466#if PPC_ABI == PPC_ABI_POWEROPEN
467        DESCRIPTOR (startup)
468#endif
469
470        .comm   environ,4,4
Note: See TracBrowser for help on using the repository browser.