]> git.karo-electronics.de Git - karo-tx-redboot.git/blob - packages/hal/arm/xscale/ixdp425/v2_0/include/hal_platform_setup.h
d322347ee828c36a6950ca10c9ccd7ea439bbc22
[karo-tx-redboot.git] / packages / hal / arm / xscale / ixdp425 / v2_0 / include / hal_platform_setup.h
1 #ifndef CYGONCE_HAL_PLATFORM_SETUP_H
2 #define CYGONCE_HAL_PLATFORM_SETUP_H
3
4 /*=============================================================================
5 //
6 //      hal_platform_setup.h
7 //
8 //      Platform specific support for HAL (assembly code)
9 //
10 //=============================================================================
11 //####ECOSGPLCOPYRIGHTBEGIN####
12 // -------------------------------------------
13 // This file is part of eCos, the Embedded Configurable Operating System.
14 // Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004 Red Hat, Inc.
15 //
16 // eCos is free software; you can redistribute it and/or modify it under
17 // the terms of the GNU General Public License as published by the Free
18 // Software Foundation; either version 2 or (at your option) any later version.
19 //
20 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
21 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
22 // FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
23 // for more details.
24 //
25 // You should have received a copy of the GNU General Public License along
26 // with eCos; if not, write to the Free Software Foundation, Inc.,
27 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
28 //
29 // As a special exception, if other files instantiate templates or use macros
30 // or inline functions from this file, or you compile this file and link it
31 // with other works to produce a work based on this file, this file does not
32 // by itself cause the resulting work to be covered by the GNU General Public
33 // License. However the source code for this file must still be made available
34 // in accordance with section (3) of the GNU General Public License.
35 //
36 // This exception does not invalidate any other reasons why a work based on
37 // this file might be covered by the GNU General Public License.
38 //
39 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
40 // at http://sources.redhat.com/ecos/ecos-license/
41 // -------------------------------------------
42 //####ECOSGPLCOPYRIGHTEND####
43 //=============================================================================
44 //#####DESCRIPTIONBEGIN####
45 //
46 // Author(s):    msalter
47 // Contributors: msalter
48 // Date:         2002-12-10
49 // Purpose:      Intel XScale IXPD specific support routines
50 // Description: 
51 // Usage:        #include <cyg/hal/hal_platform_setup.h>
52 //     Only used by "vectors.S"         
53 //
54 //####DESCRIPTIONEND####
55 //
56 //===========================================================================*/
57
58 #include <pkgconf/system.h>             // System-wide configuration info
59 #include CYGBLD_HAL_VARIANT_H           // Variant specific configuration
60 #include CYGBLD_HAL_PLATFORM_H          // Platform specific configuration
61 #include <cyg/hal/hal_ixp425.h>         // Variant specific hardware definitions
62 #include <cyg/hal/hal_mmu.h>            // MMU definitions
63 #include <cyg/hal/hal_mm.h>             // more MMU definitions
64 #include <cyg/hal/ixdp425.h>            // Platform specific hardware definitions
65
66 // ------------------------------------------------------------------------
67 // Convenience macros for setting up page table
68 // 
69 .macro IXP_MAP_SDRAM va, c, b, x, p
70     XSCALE_MMU_SECTION SDRAM_PHYS_BASE>>20, \va>>20, SDRAM_SIZE>>20, \c, \b, 3, \x, \p
71 .endm
72
73 .macro IXP_MAP_EXP_V n, va, sz, c, b, x, p
74     XSCALE_MMU_SECTION (0x500 + ((IXP425_EXP_CS_SIZE * \n) >> 20)), \va>>20, \sz>>20, \c, \b, 3, \x, \p
75 .endm
76
77 .macro IXP_MAP_EXP n, sz, c, b, x, p
78     IXP_MAP_EXP_V \n, (0x50000000 + (IXP425_EXP_CS_SIZE * \n)), \sz, \c, \b, \x, \p
79 .endm
80
81 .macro IXP_MAP_IO addr, sz
82     XSCALE_MMU_SECTION \addr>>20, \addr>>20, \sz>>20, 0, 0, 3, 0, 0
83 .endm
84
85
86 #if defined(CYG_HAL_STARTUP_ROM) || defined(CYG_HAL_STARTUP_ROMRAM)
87 #define PLATFORM_SETUP1  _platform_setup1
88 #define CYGHWR_HAL_ARM_HAS_MMU
89
90 // ------------------------------------------------------------------------
91 // Define macro used to diddle the LEDs during early initialization.
92 // Can use r0+r1.  Argument in \x.
93 #define CYGHWR_LED_MACRO  DISPLAY \x, r0, r1
94
95 // Delay a bit
96 .macro DELAY cycles, reg0
97 #if 0
98     ldr     \reg0, =\cycles
99     subs    \reg0, \reg0, #1
100     subne   pc,  pc, #0xc
101 #endif
102 .endm
103
104 // ------------------------------------------------------------------------
105 // This macro represents the initial startup code for the platform        
106         .macro _platform_setup1
107
108 #ifdef CYGHWR_HAL_ARM_BIGENDIAN
109         // set big-endian
110         mrc     p15, 0, r0, c1, c0, 0
111         orr     r0, r0, #0x80
112         mcr     p15, 0, r0, c1, c0, 0
113         CPWAIT  r0
114 #endif
115
116         ldr     r0,=(CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE|CPSR_SUPERVISOR_MODE)
117         msr     cpsr, r0
118
119         // invalidate I & D caches & BTB
120         mcr     p15, 0, r0, c7, c7, 0
121         CPWAIT  r0
122
123         // invalidate I & Data TLB
124         mcr     p15, 0, r0, c8, c7, 0
125         CPWAIT r0
126
127         // drain write and fill buffers
128         mcr     p15, 0, r0, c7, c10, 4
129         CPWAIT  r0
130
131         // disable write buffer coalescing
132         mrc     p15, 0, r0, c1, c0, 1
133         orr     r0, r0, #1
134         mcr     p15, 0, r0, c1, c0, 1
135         CPWAIT  r0
136                 
137         // Setup chip selects
138         ldr     r1, =IXP425_EXP_CFG_BASE
139 #ifdef IXP425_EXP_CS0_INIT
140         ldr     r0, =IXP425_EXP_CS0_INIT
141         str     r0, [r1, #IXP425_EXP_CS0]
142 #endif
143 #ifdef IXP425_EXP_CS1_INIT
144         ldr     r0, =IXP425_EXP_CS1_INIT
145         str     r0, [r1, #IXP425_EXP_CS1]
146 #endif
147 #ifdef IXP425_EXP_CS2_INIT
148         ldr     r0, =IXP425_EXP_CS2_INIT
149         str     r0, [r1, #IXP425_EXP_CS2]
150 #endif
151 #ifdef IXP425_EXP_CS3_INIT
152         ldr     r0, =IXP425_EXP_CS3_INIT
153         str     r0, [r1, #IXP425_EXP_CS3]
154 #endif
155 #ifdef IXP425_EXP_CS4_INIT
156         ldr     r0, =IXP425_EXP_CS4_INIT
157         str     r0, [r1, #IXP425_EXP_CS4]
158 #endif
159 #ifdef IXP425_EXP_CS5_INIT
160         ldr     r0, =IXP425_EXP_CS5_INIT
161         str     r0, [r1, #IXP425_EXP_CS5]
162 #endif
163 #ifdef IXP425_EXP_CS6_INIT
164         ldr     r0, =IXP425_EXP_CS6_INIT
165         str     r0, [r1, #IXP425_EXP_CS6]
166 #endif
167 #ifdef IXP425_EXP_CS7_INIT
168         ldr     r0, =IXP425_EXP_CS7_INIT
169         str     r0, [r1, #IXP425_EXP_CS7]
170 #endif
171
172         DISPLAY 0x1001, r7, r8
173
174         // Enable the Icache
175         mrc     p15, 0, r0, c1, c0, 0
176         orr     r0, r0, #MMU_Control_I
177         mcr     p15, 0, r0, c1, c0, 0
178         CPWAIT  r0
179
180         DISPLAY 0x1002, r7, r8
181
182         // Setup SDRAM controller
183
184         ldr     r0, =IXP425_SDRAM_CFG_BASE
185
186         ldr     r1, =IXP425_SDRAM_CONFIG_INIT
187         str     r1, [r0, #IXP425_SDRAM_CONFIG]
188
189         // disable refresh cycles
190         mov     r1, #0
191         str     r1, [r0, #IXP425_SDRAM_REFRESH]
192
193         // send nop command
194         mov     r1, #SDRAM_IR_NOP
195         str     r1, [r0, #IXP425_SDRAM_IR]
196         DELAY   0x10000, r1
197         
198         // set SDRAM internal refresh val
199         ldr     r1, =IXP425_SDRAM_REFRESH_CNT
200         str     r1, [r0, #IXP425_SDRAM_REFRESH]
201         DELAY   0x10000, r1
202
203         // send precharge-all command to close all open banks
204         mov     r1, #SDRAM_IR_PRECHARGE
205         str     r1, [r0, #IXP425_SDRAM_IR]
206         DELAY   0x10000, r1
207
208         // provide 8 auto-refresh cycles
209         mov     r1, #SDRAM_IR_AUTO_REFRESH
210         mov     r2, #8
211   1:
212         str     r1, [r0, #IXP425_SDRAM_IR]
213         DELAY   0x800, r3
214         subs    r2, r2, #1
215         bne     1b
216
217         // set mode register in sdram
218         mov     r1, #IXP425_SDRAM_SET_MODE_CMD
219         str     r1, [r0, #IXP425_SDRAM_IR]
220         DELAY   0x10000, r1
221
222         // start normal operation
223         mov     r1, #SDRAM_IR_NORMAL
224         str     r1, [r0, #IXP425_SDRAM_IR]
225         DELAY   0x10000, r1
226
227         DISPLAY 0x1003, r7, r8
228
229         // Enable byte swapping control via page table P bit.    
230         ldr     r2, =IXP425_EXP_CFG_BASE
231         ldr     r1, [r2, #IXP425_EXP_CNFG1]
232         orr     r1, r1, #EXP_CNFG1_BYTE_SWAP_EN
233         str     r1, [r2, #IXP425_EXP_CNFG1]
234
235         // value to load into pc to jump to real runtime address
236         ldr     r0, =1f
237 #if defined(CYG_HAL_STARTUP_ROMRAM)
238         // R0 holds a RAM address for ROMRAM startup,
239         // so convert to a flash address.
240         orr     r0, r0, #IXDP_FLASH_BASE
241 #endif
242
243         // Setup EXP_CNFG0 value to switch EXP bus out of low memory
244         ldr     r2, =IXP425_EXP_CFG_BASE
245         ldr     r1, [r2, #IXP425_EXP_CNFG0]
246         bic     r1, r1, #EXP_CNFG0_MEM_MAP
247         ldr     r3, =0xFFFF
248         ldr     r4, =IXDP425_LED_DATA
249
250
251         b       icache_boundary
252         .p2align 5
253 icache_boundary:
254         // Here is where we switch from boot address (0x000000000) to the
255         // actual flash runtime address. We align to cache boundary so we
256         // execute from cache during the switchover. Cachelines are 8 words.
257         str     r1, [r2, #IXP425_EXP_CNFG0]    // make the EXP bus switch
258         nop
259         nop
260         nop
261         nop
262         mov     pc, r0
263         strh    r3, [r4]    // We should never reach this point. If we do,
264                             // display FFFF and loop forever.
265     0:  b       0b
266     1:
267
268         DISPLAY 0x1004, r7, r8
269
270 #if defined(CYG_HAL_STARTUP_ROMRAM)
271         mov     r0, #IXDP_FLASH_BASE
272         mov     r1, #SDRAM_PHYS_BASE
273         ldr     r2, =__ram_data_end
274 20:     ldr     r3, [r0],#4
275         str     r3, [r1],#4
276         cmp     r1, r2
277         bne     20b
278
279         // start executing from RAM
280         ldr     r0, =30f
281         mov     pc, r0
282 30:
283 #endif
284
285         // Build mmu tables into RAM so page table walks by the cpu
286         // don't interfere with FLASH programming.
287         mov     r1, #SDRAM_PHYS_BASE
288         orr     r1, r1, #0x4000         // RAM tables
289         add     r2, r1, #0x4000         // End of tables
290
291         // First clear table
292         mov     r0, #0
293     1:
294         str     r0, [r1], #4
295         cmp     r1, r2
296         bne     1b
297
298         // Build section mappings
299         IXP_MAP_SDRAM   SDRAM_BASE,           1, 0, 0, 0   // Cached SDRAM
300         IXP_MAP_SDRAM   SDRAM_ALIAS_BASE,     1, 0, 0, 0   // Cached SDRAM alias
301         IXP_MAP_SDRAM   SDRAM_UNCACHED_BASE,  0, 0, 0, 0   // Uncached SDRAM
302         IXP_MAP_SDRAM   SDRAM_DC_BASE,        1, 0, 0, 1   // Cached data coherent SDRAM
303
304         IXP_MAP_EXP 0, IXDP_FLASH_SIZE,       1, 0, 0, 0   // Flash
305         IXP_MAP_EXP 2, IXDP425_LED_SIZE,      0, 0, 0, 0   // LED
306         IXP_MAP_EXP 4, (1 << 20),             0, 0, 0, 0   // NPE use
307         IXP_MAP_EXP 5, (1 << 20),             0, 0, 0, 0   // NPE use
308
309         IXP_MAP_EXP_V 0, IXDP_FLASH_DC_BASE, IXDP_FLASH_SIZE, 1, 0, 0, 1  // data coherent flash
310
311         IXP_MAP_IO      IXP425_PCI_WINDOW_BASE,  IXP425_PCI_WINDOW_SIZE
312         IXP_MAP_IO      IXP425_QMGR_BASE,        IXP425_QMGR_SIZE
313         IXP_MAP_IO      IXP425_PCI_CFG_BASE,     IXP425_PCI_CFG_SIZE
314         IXP_MAP_IO      IXP425_EXP_CFG_BASE,     IXP425_EXP_CFG_SIZE
315         IXP_MAP_IO      IXP425_MISC_CFG_BASE,    IXP425_MISC_CFG_SIZE
316         IXP_MAP_IO      IXP425_SDRAM_CFG_BASE,   IXP425_SDRAM_CFG_SIZE
317
318         DISPLAY 0x1005, r7, r8
319
320         mcr     p15, 0, r0, c7, c10, 4  // drain the write & fill buffers
321         CPWAIT  r0
322
323         // Set the TTB register to DRAM mmu_table
324         ldr     r0, =(SDRAM_PHYS_BASE | 0x4000) // RAM tables
325         mcr     p15, 0, r0, c2, c0, 0           // load page table pointer
326         CPWAIT  r0
327
328         // enable permission checks in all domains
329         ldr     r0, =0x55555555
330         mcr     p15, 0, r0, c3, c0, 0
331         CPWAIT  r0
332
333         DISPLAY 0x1006, r7, r8
334         
335         // enable mmu
336         mrc     p15, 0, r0, c1, c0, 0
337         orr     r0, r0, #MMU_Control_M
338         orr     r0, r0, #MMU_Control_R
339         mcr     p15, 0, r0, c1, c0, 0
340         CPWAIT  r0
341
342         DISPLAY 0x1007, r7, r8
343
344         // enable D cache
345         mrc     p15, 0, r0, c1, c0, 0
346         orr     r0, r0, #MMU_Control_C
347         mcr     p15, 0, r0, c1, c0, 0
348         CPWAIT  r0
349
350         DISPLAY 0x1008, r7, r8
351
352         // Enable branch target buffer
353         mrc     p15, 0, r0, c1, c0, 0
354         orr     r0, r0, #MMU_Control_BTB
355         mcr     p15, 0, r0, c1, c0, 0
356         CPWAIT  r0
357
358         DISPLAY 0x1009, r7, r8
359
360         mcr     p15, 0, r0, c7, c10, 4  // drain the write & fill buffers
361         CPWAIT  r0
362
363         mcr     p15, 0, r0, c7, c7, 0   // flush Icache, Dcache and BTB
364         CPWAIT  r0
365
366         mcr     p15, 0, r0, c8, c7, 0   // flush instuction and data TLBs
367         CPWAIT  r0
368
369         mcr     p15, 0, r0, c7, c10, 4  // drain the write & fill buffers
370         CPWAIT r0       
371         
372         DISPLAY 0x100A, r7, r8
373
374         // save SDRAM size
375         ldr     r1, =hal_dram_size  /* [see hal_intr.h] */
376         mov     r8, #SDRAM_SIZE
377         str     r8, [r1]
378
379         DISPLAY 0x100B, r7, r8
380
381         .endm    // _platform_setup1
382
383 #else // defined(CYG_HAL_STARTUP_ROM)
384 #define PLATFORM_SETUP1
385 #endif
386
387 #define PLATFORM_VECTORS         _platform_vectors
388         .macro  _platform_vectors
389         .endm                                        
390
391 /*---------------------------------------------------------------------------*/
392 /* end of hal_platform_setup.h                                               */
393 #endif /* CYGONCE_HAL_PLATFORM_SETUP_H */