source: SVN/cambria/redboot/packages/hal/arm/xscale/kixrp435/current/include/hal_platform_setup.h @ 1

Last change on this file since 1 was 1, checked in by Tim Harvey, 2 years ago

restored latest version of files from server backup

Signed-off-by: Tim Harvey <tharvey@…>

File size: 24.8 KB
Line 
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) 2007 Free Software Foundation, 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//####ECOSGPLCOPYRIGHTEND####
40//=============================================================================
41//#####DESCRIPTIONBEGIN####
42//
43// Author(s):    msalter@redhat.com
44// Contributors:
45// Date:         2007-01-05
46// Purpose:      Intel XScale KIXRP435 specific early boot support
47// Description:
48// Usage:        #include <cyg/hal/hal_platform_setup.h>
49//     Only used by "vectors.S"         
50//
51//####DESCRIPTIONEND####
52//
53//===========================================================================*/
54
55#include <pkgconf/system.h>             // System-wide configuration info
56#include CYGBLD_HAL_VARIANT_H           // Variant specific configuration
57#include CYGBLD_HAL_PLATFORM_H          // Platform specific configuration
58#include <cyg/hal/hal_ixp425.h>         // Variant specific hardware definitions
59#include <cyg/hal/hal_mmu.h>            // MMU definitions
60#include <cyg/hal/hal_mm.h>             // more MMU definitions
61#include <cyg/hal/kixrp435.h>            // Platform specific hardware definitions
62
63// ------------------------------------------------------------------------
64// Convenience macros for setting up page table
65//
66.macro IXP_MAP_SDRAM va, c, b, x, p
67    XSCALE_MMU_SECTION SDRAM_PHYS_BASE>>20, \va>>20, SDRAM_SIZE>>20, \c, \b, 3, \x, \p
68.endm
69
70.macro IXP_MAP_EXP_V n, va, sz, c, b, x, p
71    XSCALE_MMU_SECTION (0x500 + ((IXP425_EXP_CS_SIZE * \n) >> 20)), \va>>20, \sz>>20, \c, \b, 3, \x, \p
72.endm
73
74.macro IXP_MAP_EXP n, sz, c, b, x, p
75    IXP_MAP_EXP_V \n, (0x50000000 + (IXP425_EXP_CS_SIZE * \n)), \sz, \c, \b, \x, \p
76.endm
77
78.macro IXP_MAP_IO addr, sz
79    XSCALE_MMU_SECTION \addr>>20, \addr>>20, \sz>>20, 0, 0, 3, 0, 0
80.endm
81
82.macro IXP_MAP_IO_DC addr, sz
83    XSCALE_MMU_SECTION \addr>>20, \addr>>20, \sz>>20, 0, 0, 3, 0, 1
84.endm
85
86
87#if defined(CYG_HAL_STARTUP_ROM) || defined(CYG_HAL_STARTUP_ROMRAM)
88#define PLATFORM_SETUP1  _platform_setup1
89#define CYGHWR_HAL_ARM_HAS_MMU
90
91// ------------------------------------------------------------------------
92// Define macro used to diddle the LEDs during early initialization.
93// Can use r0+r1.  Argument in \x.
94#define CYGHWR_LED_MACRO  DISPLAY \x, r0, r1
95
96// enable GPIO output for bits set in gper
97// and set value to gpoutr
98.macro gpio_init,gpoer,gpoutr,r0,r1
99  ldr   \r1, =IXP425_GPIO_CFG_BASE
100  ldr   \r0, [\r1, #IXP425_GPOUTR]
101  bic   \r0, \r0, #\gpoer  // mask out all but passed in gpoer
102  orr   \r0, \r0, #\gpoutr // set passed in gpoutr
103  str   \r0, [\r1, #IXP425_GPOUTR]
104  ldr   \r0, [\r1, #IXP425_GPOER]
105  bic   \r0, \r0, #\gpoer  // clear gpoer bits (0=output, 1=input)
106  str   \r0, [\r1, #IXP425_GPOER]
107.endm
108
109.macro wdt_enable,count,rd,rx
110        ldr \rx, =IXP425_OST_CFG_BASE
111        ldr \rd, =0x482e
112        str \rd, [\rx, #IXP425_OST_WDOG_KEY]
113        ldr \rd, =\count
114        str \rd, [\rx, #IXP425_OST_WDOG]
115        mov \rd, #0x05   // enable reset and count
116        str \rd, [\rx, #IXP425_OST_WDOG_ENA]
117        ldr \rd, =0x0
118        str \rd, [\rx, #IXP425_OST_WDOG_KEY]
119.endm
120
121.macro wdt_disable,rd,rx
122        ldr \rx, =IXP425_OST_CFG_BASE
123        ldr \rd, =0x482e
124        str \rd, [\rx, #IXP425_OST_WDOG_KEY]
125        mov \rd, #0x00   // disable reset and count
126        str \rd, [\rx, #IXP425_OST_WDOG_ENA]
127        ldr \rd, =0x0
128        str \rd, [\rx, #IXP425_OST_WDOG_KEY]
129.endm
130
131
132
133// Delay a bit
134.macro DELAY cycles, reg0
135    ldr     \reg0, =\cycles
136    subs    \reg0, \reg0, #1
137    subne   pc,  pc, #0xc
138.endm
139
140.macro I2C_DELAY
141    ldr   r0, =0x400
142    subs  r0, r0, #1
143    subne   pc, pc, #0xc
144.endm
145
146PCI_RST_STB:
147    I2C_DELAY
148    ldr   r1, =IXP425_GPIO_CFG_BASE
149    ldr   r0, [r1, #IXP425_GPOER]
150    bic   r0, r0, #0x2000
151    str   r0, [r1, #IXP425_GPOER]
152    ldr   r1, =IXP425_GPIO_CFG_BASE
153    ldr   r0, [r1, #IXP425_GPOUTR]
154    bic   r0, r0, #0x2000
155    str   r0, [r1, #IXP425_GPOUTR]
156    I2C_DELAY
157    ldr     r1, =IXP425_GPIO_CFG_BASE
158    ldr   r0, [r1, #IXP425_GPOUTR]
159    orr   r0, r0, #0x2000
160    str     r0, [r1, #IXP425_GPOUTR]
161    I2C_DELAY
162    mov   pc,r14
163
164CLK_LO:
165    ldr   r1, =IXP425_GPIO_CFG_BASE
166    ldr   r0, [r1, #IXP425_GPOUTR]
167    bic   r0, r0, #0x40
168    str   r0, [r1, #IXP425_GPOUTR]
169    I2C_DELAY
170    mov   pc,r14
171
172CLK_HI:
173    ldr     r1, =IXP425_GPIO_CFG_BASE
174    ldr   r0, [r1, #IXP425_GPOUTR]
175    orr   r0, r0, #0x40
176    str     r0, [r1, #IXP425_GPOUTR]
177    I2C_DELAY
178    mov   pc,r14
179
180CLK_EN:
181    I2C_DELAY
182    ldr   r1, =IXP425_GPIO_CFG_BASE
183    ldr   r0, [r1, #IXP425_GPOER]
184    bic   r0, r0, #0x40
185    str   r0, [r1, #IXP425_GPOER]
186                I2C_DELAY
187    mov   pc, r14
188
189CLK_DIS:
190    I2C_DELAY
191    ldr   r1, =IXP425_GPIO_CFG_BASE
192    ldr   r0, [r1, #IXP425_GPOER]
193    orr   r0, r0, #0x40
194    str   r0, [r1, #IXP425_GPOER]
195                I2C_DELAY
196    mov   pc, r14
197
198CLK_STB:
199    mov r2, r14
200    bl  CLK_DIS
201                bl      DATA_IN
202    bl  CLK_EN
203    mov   pc, r2
204
205DATA_LO:
206    ldr   r1, =IXP425_GPIO_CFG_BASE
207    ldr   r0, [r1, #IXP425_GPOUTR]
208    bic   r0, r0, #0x80
209    str   r0, [r1, #IXP425_GPOUTR]
210    mov   pc, r14
211
212DATA_HI:
213    ldr   r1, =IXP425_GPIO_CFG_BASE
214    ldr   r0, [r1, #IXP425_GPOUTR]
215    orr   r0, r0, #0x80
216    str   r0, [r1, #IXP425_GPOUTR]
217    mov   pc, r14
218
219DATA_EN:
220    ldr   r1, =IXP425_GPIO_CFG_BASE
221    ldr   r0, [r1, #IXP425_GPOER]
222    bic   r0, r0, #0x80
223    str   r0, [r1, #IXP425_GPOER]
224    mov   pc, r14
225
226DATA_DIS:
227    ldr   r1, =IXP425_GPIO_CFG_BASE
228    ldr   r0, [r1, #IXP425_GPOER]
229    orr   r0, r0, #0x80
230    str   r0, [r1, #IXP425_GPOER]
231    mov   pc, r14
232
233DATA_IN:
234    ldr   r1, =IXP425_GPIO_CFG_BASE
235    ldr   r8, [r1, #IXP425_GPINR]
236    mov   r8, r8, lsr #7
237    and   r8, r8, #1
238    mov   pc, r14
239
240
241// send start // configure
242
243eeprom_start:
244                mov     r4,     r14
245eeprom_start_repeat:
246    // start condition
247    bl  DATA_EN
248                I2C_DELAY
249    bl  CLK_EN
250                I2C_DELAY
251
252    bl  DATA_DIS   // output A2
253    bl  CLK_STB
254    bl  DATA_EN
255    bl  CLK_STB
256    bl  DATA_DIS
257    bl  CLK_STB
258    bl  DATA_EN
259    bl  CLK_STB
260    bl  CLK_STB
261    bl  CLK_STB
262    bl  DATA_DIS
263    bl  CLK_STB
264    bl  DATA_EN
265    bl  CLK_STB
266
267    bl  DATA_DIS
268    bl  CLK_STB   // pull ACK into r8
269    //bl  DATA_EN
270
271                cmps r8, #1   // check for ACK
272                blne eeprom_start_exit
273    bl  DATA_EN
274                I2C_DELAY
275    bl  CLK_DIS
276                I2C_DELAY
277    bl  DATA_DIS
278                I2C_DELAY
279
280                // 9 CLK_STB with DATA high should clock through any i2c state machine
281                bl DATA_DIS
282                bl CLK_STB
283                bl CLK_STB
284                bl CLK_STB
285                bl CLK_STB
286                bl CLK_STB
287                bl CLK_STB
288                bl CLK_STB
289                bl CLK_STB
290                bl CLK_STB
291                bl CLK_DIS
292                I2C_DELAY
293
294                bl eeprom_start_repeat
295
296eeprom_start_exit:
297                mov     pc,     r4
298
299// send address
300
301eeprom_start_address:
302
303                mov     r4,     r14
304    bl  DATA_EN   // output AVILA_DRAM (0x00)
305    bl  CLK_STB
306    bl  CLK_STB
307    bl  CLK_STB
308    bl  CLK_STB
309    bl  CLK_STB
310    bl  CLK_STB
311    bl  CLK_STB
312    bl  CLK_STB
313
314    bl  DATA_DIS
315    bl  CLK_STB   // ignore ack
316
317                mov     pc,     r4
318
319
320eeprom_dram_address:
321
322                mov     r4,     r14
323    bl  DATA_EN   // output AVILA_DRAM (0x1f)
324    bl  CLK_STB
325    bl  CLK_STB
326    bl  CLK_STB
327    bl  DATA_DIS
328    bl  CLK_STB
329    bl  CLK_STB
330    bl  CLK_STB
331    bl  CLK_STB
332    bl  CLK_STB
333
334    bl  CLK_STB   // ignore ack
335                mov     pc,     r4
336
337eeprom_cs_address:
338
339                mov     r4,     r14
340    bl  DATA_EN   // output AVILA_DRAM (0x3e)
341    bl  CLK_STB
342    bl  CLK_STB
343    bl  DATA_DIS
344    bl  CLK_STB
345    bl  CLK_STB
346    bl  CLK_STB
347    bl  CLK_STB
348    bl  CLK_STB
349    bl  DATA_EN
350    bl  CLK_STB
351
352    bl  DATA_DIS
353    bl  CLK_STB   // ignore ack
354    //bl  DATA_EN
355
356                mov     pc,     r4
357
358// send start, but read this time indicate read
359
360eeprom_read_start:
361
362                mov     r4,     r14
363    bl  CLK_DIS    // start transaction
364    bl  DATA_EN
365    bl  CLK_EN
366
367    bl  DATA_DIS   // output A3
368    bl  CLK_STB
369    bl  DATA_EN
370    bl  CLK_STB
371    bl  DATA_DIS
372    bl  CLK_STB
373    bl  DATA_EN
374    bl  CLK_STB
375    bl  CLK_STB
376    bl  CLK_STB
377    bl  DATA_DIS
378    bl  CLK_STB
379    bl  CLK_STB
380
381    bl  DATA_DIS
382    bl  CLK_STB   // ignore ack
383                mov     pc,     r4
384
385// read byte
386
387eeprom_getb:
388
389                mov     r4,     r14
390    mov   r3, #0
391    bl  CLK_STB
392    orr r3, r3, r8, lsl #7
393    bl  CLK_STB
394    orr r3, r3, r8, lsl #6
395    bl  CLK_STB
396    orr r3, r3, r8, lsl #5
397    bl  CLK_STB
398    orr r3, r3, r8, lsl #4
399    bl  CLK_STB
400    orr r3, r3, r8, lsl #3
401    bl  CLK_STB
402    orr r3, r3, r8, lsl #2
403    bl  CLK_STB
404    orr r3, r3, r8, lsl #1
405    bl  CLK_STB
406    orr r3, r3, r8
407
408    bl  CLK_STB
409                mov     pc,     r4
410
411eeprom_cont_getb:
412
413                mov     r4,     r14
414                mov     r6,     #0x3e
415                mov     r7,     #0
416ee_repeat_read:
417
418    mov   r3, #0
419    bl  CLK_STB
420                orr r3, r3, r8, lsl #7
421    bl  CLK_STB
422                orr r3, r3, r8, lsl #6
423    bl  CLK_STB
424                orr r3, r3, r8, lsl #5
425    bl  CLK_STB
426                orr r3, r3, r8, lsl #4
427    bl  CLK_STB
428                orr r3, r3, r8, lsl #3
429    bl  CLK_STB
430                orr r3, r3, r8, lsl #2
431    bl  CLK_STB
432                orr r3, r3, r8, lsl #1
433    bl  CLK_STB
434                orr r3, r3, r8
435
436                add     r7, r7, r3
437                cmp r6, #0x1a  // 0x3e-0x24
438                bne not_byte24
439                mov r11, r3
440                b not_byte25
441not_byte24:
442                cmp r6, #0x19  // 0x3e-0x25
443                bne not_byte25
444                mov r12, r3
445
446not_byte25:
447                sub     r6,     r6, #1
448
449    //bl  DATA_EN
450                cmps    r6, #0
451                blne    DATA_EN
452                bl  CLK_STB
453                bl      DATA_DIS
454
455                cmps    r6, #0
456                bne     ee_repeat_read
457
458    //bl  DATA_EN
459                mov     pc,     r4
460
461eeprom_get_cs:
462
463                mov     r4,     r14
464                mov     r6,     #0x2
465    mov   r3, #0
466
467_ee_repeat_read:
468                mov     r10, r3
469    mov r3, #0
470    bl  CLK_STB
471                orr r3, r3, r8, lsl #7
472    bl  CLK_STB
473                orr r3, r3, r8, lsl #6
474    bl  CLK_STB
475                orr r3, r3, r8, lsl #5
476    bl  CLK_STB
477                orr r3, r3, r8, lsl #4
478    bl  CLK_STB
479                orr r3, r3, r8, lsl #3
480    bl  CLK_STB
481                orr r3, r3, r8, lsl #2
482    bl  CLK_STB
483                orr r3, r3, r8, lsl #1
484    bl  CLK_STB
485                orr r3, r3, r8
486
487                sub     r6,     r6, #1
488
489    //bl  DATA_EN
490                cmps    r6, #0
491    blne        DATA_EN
492
493                bl  CLK_STB
494                bl      DATA_DIS
495
496                cmps    r6, #0
497                bne     _ee_repeat_read
498                orr     r3, r3, r10, lsl #8
499       
500                //bl    DATA_EN
501                mov     pc,     r4
502
503// stop
504
505eeprom_stop:
506
507                mov     r4,     r14
508    bl  DATA_EN
509                I2C_DELAY
510    bl  CLK_DIS
511                I2C_DELAY
512    bl  DATA_DIS
513                I2C_DELAY
514                mov     pc,     r4
515
516getdramsize:
517                mov     r5,     r14
518                bl      eeprom_start                                    // configures eeprom 0xa2
519                bl      eeprom_dram_address             // set address to 0x1f
520                bl      eeprom_read_start                       // start's a read
521                bl      eeprom_getb                                             // put's byte in r3
522                bl      eeprom_stop                                             // send stop
523                mov     pc, r5                                                          // return
524
525// return calculated chksum in r7, eeprom chksum in r3
526// model+4 in r11, model+5 in r12
527comp_checksum:
528                mov     r5,     r14
529
530                bl      eeprom_start                                    // configures eeprom 0xa2
531                bl      eeprom_start_address    // set address to 0x00
532                bl      eeprom_read_start                       // start's a read
533                bl      eeprom_cont_getb                        // continually get byte's as long as we need, return value in r7
534                bl      eeprom_stop                                             // send stop
535
536                bl      eeprom_start                                    // configures eeprom
537                bl      eeprom_cs_address                       // set address to 0x3E
538                bl      eeprom_read_start                       //      start's a read
539                bl      eeprom_get_cs                                   // get halfword checksum, return value in r3
540                bl      eeprom_stop                                             // send stob
541
542                mov     pc,     r5                                                              // return
543
544setup_sdram:
545    mov   r9, r14
546    bl    CLK_DIS
547    bl    DATA_DIS
548    bl    CLK_LO
549    bl    DATA_LO
550
551//    mov   r8, #0x100
552//loop_de_loop:
553//    sub   r8, r8, #1
554//    cmps  r8, #0
555//    bne   loop_de_loop
556
557    bl    comp_checksum
558    cmps  r3, r7
559
560    ldr   r4, =KIXRP435_SBR_INIT_64
561    ldr   r5, =KIXRP435_SDRAM_REFRESH_CNT-2
562    mov   r13, #0x0000
563    bne   founddram
564
565    mov   r13, #0x4000 // GPIO14 (default)
566    cmps  r11, #0x35
567    bne   found_model
568model_gw235x:
569    cmps  r12, #0x38
570    beq   found_model
571    cmps  r12, #0x39
572    beq   model_gw2359
573    mov   r13, #0x1000 // GPIO12
574    b     found_model
575model_gw2359:
576    mov   r13, #0x0100 // GPIO08
577
578found_model:
579    bl  getdramsize
580
581    ldr   r4, =KIXRP435_SBR_INIT_64
582    ldr   r5, =KIXRP435_SDRAM_REFRESH_CNT
583    cmps  r3, #0x2
584    beq   founddram
585
586    ldr   r4, =KIXRP435_SBR_INIT_128
587    ldr   r5, =KIXRP435_SDRAM_REFRESH_CNT
588    cmps  r3, #0x4
589    beq   founddram
590
591    ldr   r4, =KIXRP435_SBR_INIT_64
592    ldr   r5, =KIXRP435_SDRAM_REFRESH_CNT-1
593
594founddram:
595  ldr   r1, =IXP425_GPIO_CFG_BASE
596  ldr   r0, [r1, #IXP425_GPOUTR]
597  bic   r0, r0, r13
598  str   r0, [r1, #IXP425_GPOUTR]
599  ldr   r0, [r1, #IXP425_GPOER]
600  bic   r0, r0, r13 // clear gpoer bits (0=output, 1=input)
601  str   r0, [r1, #IXP425_GPOER]
602
603        // enable watchdog around SDRAM controller access
604  wdt_enable 66000000,r0,r1          // 1s expiration watchdog
605
606  // Setup SDRAM controller
607  ldr     r0, =IXP_DDR_CFG_BASE1
608
609        ldr     r1, =KIXRP435_SDCR0_INIT
610        str     r1, [r0, #IXP_DDR_SDCR0]
611
612        ldr     r1, =KIXRP435_SDCR1_INIT
613        str     r1, [r0, #IXP_DDR_SDCR1]
614
615        mov     r1, #SDRAM_PHYS_BASE
616        str     r1, [r0, #IXP_DDR_SDBR]
617        ldr     r1, [r0, #IXP_DDR_SDBR]  // readback
618
619        //ldr   r1, =KIXRP435_SBR0_INIT
620        str     r4, [r0, #IXP_DDR_SBR0]
621        ldr     r1, [r0, #IXP_DDR_SBR0]
622
623        //ldr   r1, =KIXRP435_SBR1_INIT
624        str     r4, [r0, #IXP_DDR_SBR1]
625        ldr     r1, [r0, #IXP_DDR_SBR1]
626
627        // Step 4. Disable refresh cycles
628        mov     r1, #0
629        str     r1, [r0, #IXP_DDR_RFR]
630
631        // Step 5. Send NOP command
632        mov     r1, #DDR_SDIR_NOP
633        str     r1, [r0, #IXP_DDR_SDIR]
634       
635        // Step 6
636        DELAY   0x100000, r1
637       
638        // Step 7. Issue precharge-all command to close all open banks
639        mov     r1, #DDR_SDIR_PRECHARGE_ALL
640        str     r1, [r0, #IXP_DDR_SDIR]
641        DELAY   0x100000, r1
642
643        // Step 8. Issue an extended-mode-register2-set command
644        mov     r1, #DDR_SDIR_EMRS_2_SET_CMD
645        str     r1, [r0, #IXP_DDR_SDIR]
646        DELAY   0x100000, r1
647
648        // Step 9. Issue an extended-mode-register3-set command
649        mov     r1, #DDR_SDIR_EMRS_3_SET_CMD
650        str     r1, [r0, #IXP_DDR_SDIR]
651        DELAY   0x100000, r1
652
653        // Step 10. Issue extended mode register set to enable dll
654        mov     r1, #DDR_SDIR_EMRS_DLL_ENABLE
655        str     r1, [r0, #IXP_DDR_SDIR]
656        DELAY   0x100000, r1
657
658        // Step 11. Issue mode register set w/ DLL reset
659        mov     r1, #DDR_SDIR_MODE_SET_RESET
660        str     r1, [r0, #IXP_DDR_SDIR]
661        DELAY   0x100000, r1
662
663        // Step 12. Issue precharge-all command
664        mov     r1, #DDR_SDIR_PRECHARGE_ALL
665        str     r1, [r0, #IXP_DDR_SDIR]
666        DELAY   0x100000, r1
667
668        // Step 13. provide 2 auto-refresh cycles
669        mov     r1, #DDR_SDIR_AUTO_REFRESH
670        mov     r2, #2
671  1:
672        str     r1, [r0, #IXP_DDR_SDIR]
673        ldr     r3, [r0, #IXP_DDR_SDIR]
674        DELAY   0x800, r3
675        subs    r2, r2, #1
676        bne     1b
677
678        // Step 14. Issue mode register set w/o DLL reset
679        mov     r1, #DDR_SDIR_MODE_SET_NO_RESET
680        str     r1, [r0, #IXP_DDR_SDIR]
681        DELAY   0x100000, r1
682
683        // EMRS OCD calibration (see specification update Dec 2008)
684        ldr r2, [r0, #IXP_DDR_DCALADDR] //save DCALADDR value in r2 before modifying
685        ldr r1, = 0x01000003 //set bit24=1 for SDRAM Enable
686        //set bits[0:1] for EMRS OCD Default
687        str r1, [r0, #IXP_DDR_DCALCSR]
688        ldr r1, =0x00000381 //set bits [9:7] and bit 0 for EMRS OCD Default
689        str r1, [r0, #IXP_DDR_DCALADDR]
690        DELAY 0x100000, r1
691
692        // EMRS OCD calibration mode exit (see specification update Dec 2008)
693        ldr r1, =0x00000001 //set bit 0 only for exit
694        str r1, [r0, #IXP_DDR_DCALADDR]
695        DELAY 0x100000, r1
696        str r2, [r0, #IXP_DDR_DCALADDR] //restore original DCALADDR value
697
698        // Step 15. Start normal operation
699        mov     r1, #0xf
700        str     r1, [r0, #IXP_DDR_SDIR]
701        DELAY   0x10000, r1
702       
703        // Step 16. Set refresh val
704        //ldr   r1, =KIXRP435_SDRAM_REFRESH_CNT
705        str     r5, [r0, #IXP_DDR_RFR]
706        DELAY   0x100000, r1
707        mov pc, r9
708
709
710
711
712// ------------------------------------------------------------------------
713// This macro represents the initial startup code for the platform       
714        .macro _platform_setup1
715
716#ifdef CYGHWR_HAL_ARM_BIGENDIAN
717        // set big-endian
718        mrc     p15, 0, r0, c1, c0, 0
719        orr     r0, r0, #0x80
720        mcr     p15, 0, r0, c1, c0, 0
721        CPWAIT  r0
722#endif
723
724        ldr     r0,=(CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE|CPSR_SUPERVISOR_MODE)
725        msr     cpsr, r0
726
727        // invalidate I & D caches & BTB
728        mcr     p15, 0, r0, c7, c7, 0
729        CPWAIT  r0
730
731        // invalidate I & Data TLB
732        mcr     p15, 0, r0, c8, c7, 0
733        CPWAIT r0
734
735        // drain write and fill buffers
736        mcr     p15, 0, r0, c7, c10, 4
737        CPWAIT  r0
738
739        // disable write buffer coalescing
740        mrc     p15, 0, r0, c1, c0, 1
741        orr     r0, r0, #1
742        mcr     p15, 0, r0, c1, c0, 1
743        CPWAIT  r0
744               
745        // Setup chip selects
746        ldr     r1, =IXP425_EXP_CFG_BASE
747#ifdef IXP425_EXP_CS0_INIT
748        ldr     r0, =IXP425_EXP_CS0_INIT
749        str     r0, [r1, #IXP425_EXP_CS0]
750#endif
751#ifdef IXP425_EXP_CS1_INIT
752        ldr     r0, =IXP425_EXP_CS1_INIT
753        str     r0, [r1, #IXP425_EXP_CS1]
754#endif
755#ifdef IXP425_EXP_CS2_INIT
756        ldr     r0, =IXP425_EXP_CS2_INIT
757        str     r0, [r1, #IXP425_EXP_CS2]
758#endif
759#ifdef IXP425_EXP_CS3_INIT
760        ldr     r0, =IXP425_EXP_CS3_INIT
761        str     r0, [r1, #IXP425_EXP_CS3]
762#endif
763
764
765        // Enable the Icache
766        mrc     p15, 0, r0, c1, c0, 0
767        orr     r0, r0, #MMU_Control_I
768        mcr     p15, 0, r0, c1, c0, 0
769        CPWAIT  r0
770
771
772        bl setup_sdram
773
774
775
776#if 1
777        /* Additional setup for SDRAM controller
778         * see IOP331 documentation:
779         *  http://int.xscale-freak.com/XSDoc/IOP331/27394202.pdf
780         */
781        ldr     r0, =IXP_DDR_CFG_BASE2
782       
783        // Receive Enable Delay Register: 0x50
784        ldr     r1, = 0x00000002  // 2 for DDR2
785        str     r1, [r0, #IXP_DDR_RCVDLY]
786        DELAY   0x100000, r1
787
788        // dynamic DQS DLL delay for high nibble: 0x5c
789        ldr     r1, = 0x00000000
790        str     r1, [r0, #IXP_DDR_SLVLMIX0]
791        DELAY   0x100000, r3
792
793        // dynamic DQS DLL delay for high nibble: 0x60
794        str     r1, [r0, #IXP_DDR_SLVLMIX1]
795        DELAY   0x100000, r3
796
797        // dynamic DQS DLL delay for low nibble: 0x54
798        str     r1, [r0, #IXP_DDR_SLVHMIX0]
799        DELAY   0x100000, r3
800
801        // dynamic DQS DLL delay for low nibble: 0x58
802        str     r1, [r0, #IXP_DDR_SLVHMIX1]
803        DELAY   0x100000, r3
804
805        // static DQS Slave DLL length: 0x64
806        ldr     r1, = 0x00000006
807        str     r1, [r0, #IXP_DDR_SLVLEN]
808        DELAY   0x100000, r1
809
810        // master DQS DL delay loop mixer control: 0x68
811        ldr     r1, = 0x00000000
812        str     r1, [r0, #IXP_DDR_MASTMIX]
813        DELAY   0x100000, r1
814
815        ldr     r1, = 0x0000000f
816        str     r1, [r0, #IXP_DDR_LEGOVERIDE]
817        DELAY   0x100000, r1
818#endif
819#if 1
820                                mov                     r2, #0x6
821ddrmisctl:                             
822        ldr     r1, = 0x0002D400
823        str     r1, [r0, #IXP_DDR_DDRMISCTL]
824        DELAY   0x100000, r1
825                                subs            r2, r2, #1
826                                bne                     ddrmisctl
827
828                                mov                     r2, #0x4
829ddr_hm_wrcal:
830        ldr     r1, = 0x0000889C
831        str     r1, [r0, #IXP_DDR_HM_WRCAL]
832        DELAY   0x100000, r1       
833                                subs            r2, r2, #1
834                                bne                     ddr_hm_wrcal
835
836        ldr     r1, = 0x0000809C
837        str     r1, [r0, #IXP_DDR_HM_WRCAL]
838        DELAY   0x100000, r1     
839       
840        ldr     r1, = 0x80FFFF06
841                                mov                     r3, #0x4
842dram4:
843                                mov                     r2, #0x8
844ddr_dcalcsr:
845                                add                     r1, r1, #0x100
846        str     r1, [r0, #IXP_DDR_DCALCSR]
847        DELAY   0x100000, r4
848                                subs            r2, r2, #1
849                                bne                     ddr_dcalcsr
850
851                                add                     r1, r1, #0x1800
852                                subs            r3, r3, #1
853                                bne                     dram4
854         
855#endif
856
857        // done with sdram config - disable watchdog
858        wdt_disable r0,r1
859
860        // Enable byte swapping control via page table P bit.   
861        ldr     r2, =IXP425_EXP_CFG_BASE
862        ldr     r1, [r2, #IXP425_EXP_CNFG1]
863        orr     r1, r1, #EXP_CNFG1_BYTE_SWAP_EN
864        str     r1, [r2, #IXP425_EXP_CNFG1]
865
866
867        // value to load into pc to jump to real runtime address
868        ldr     r0, =1f
869#if defined(CYG_HAL_STARTUP_ROMRAM)
870        // R0 holds a RAM address for ROMRAM startup,
871        // so convert to a flash address.
872        orr     r0, r0, #KIXRP435_FLASH_BASE
873#endif
874        // Setup EXP_CNFG0 value to switch EXP bus out of low memory
875        ldr     r2, =IXP425_EXP_CFG_BASE
876        ldr     r1, [r2, #IXP425_EXP_CNFG0]
877        bic     r1, r1, #EXP_CNFG0_MEM_MAP
878
879
880        b       icache_boundary
881        .p2align 5
882icache_boundary:
883        // Here is where we switch from boot address (0x000000000) to the
884        // actual flash runtime address. We align to cache boundary so we
885        // execute from cache during the switchover. Cachelines are 8 words.
886        str     r1, [r2, #IXP425_EXP_CNFG0]    // make the EXP bus switch
887        nop
888        nop
889        nop
890        nop
891        mov     pc, r0
892        nop
893    0:  b       0b
894    1:
895// Here is where the mpi_en gets set for the fast ddr access
896        ldr     r1, [r2, #IXP425_EXP_CNFG1]
897        orr     r1, r1, #EXP_CNFG1_MPI_EN
898        str     r1, [r2, #IXP425_EXP_CNFG1]
899        ldr     r3, [r2, #IXP425_EXP_CNFG1]  // read back to ensure its been written
900
901#if defined(CYG_HAL_STARTUP_ROMRAM)
902        mov     r0, #KIXRP435_FLASH_BASE
903        mov     r1, #SDRAM_PHYS_BASE
904        ldr     r2, =__ram_data_end
90520:     ldr     r3, [r0],#4
906        str     r3, [r1],#4
907        cmp     r1, r2
908        bne     20b
909
910        // start executing from RAM
911        ldr     r0, =30f
912        mov     pc, r0
91330:
914#endif
915
916       
917        // Build mmu tables into RAM so page table walks by the cpu
918        // don't interfere with FLASH programming.
919        mov     r1, #SDRAM_PHYS_BASE
920        orr     r1, r1, #0x4000         // RAM tables
921        add     r2, r1, #0x4000         // End of tables
922
923        // First clear table
924        mov     r0, #0
925    1:
926        str     r0, [r1], #4
927        cmp     r1, r2
928        bne     1b
929
930        // Build section mappings             C  B  X  P
931        IXP_MAP_SDRAM   SDRAM_BASE,           1, 1, 0, 0   // Cached SDRAM
932        IXP_MAP_SDRAM   SDRAM_UNCACHED_BASE,  0, 0, 0, 0   // Uncached SDRAM
933        IXP_MAP_SDRAM   SDRAM_DC_BASE,        1, 1, 0, 1   // Cached data coherent SDRAM
934
935        IXP_MAP_EXP 0,  0x01000000,  1, 0, 0, 0   // Flash
936  IXP_MAP_EXP 1,  0x01000000,  1, 0, 0, 0   // Flash
937        IXP_MAP_EXP 2,  0x01000000,  1, 0, 0, 0   // Flash
938        IXP_MAP_EXP 3,  0x01000000,  0, 0, 0, 0   // Flash and Misc
939
940        IXP_MAP_EXP_V 0, KIXRP435_FLASH_DC_BASE, KIXRP435_FLASH_SIZE, 1, 0, 0, 1  // data coherent flash
941
942        IXP_MAP_IO      IXP425_PCI_WINDOW_BASE,  IXP425_PCI_WINDOW_SIZE
943        IXP_MAP_IO_DC   IXP425_QMGR_BASE,        IXP425_QMGR_SIZE
944        IXP_MAP_IO      IXP425_PCI_CFG_BASE,     IXP425_PCI_CFG_SIZE
945        IXP_MAP_IO      IXP425_EXP_CFG_BASE,     IXP425_EXP_CFG_SIZE
946        IXP_MAP_IO      IXP425_MISC_CFG_BASE,    IXP425_MISC_CFG_SIZE
947        IXP_MAP_IO      IXP425_SDRAM_CFG_BASE,   IXP425_SDRAM_CFG_SIZE
948
949        XSCALE_MMU_SECTION 0xE00, 0xE00, 1, 1, 1, 3, 0, 0  // cache flush region
950
951
952        mcr     p15, 0, r0, c7, c10, 4  // drain the write & fill buffers
953        CPWAIT  r0
954
955        // Set the TTB register to DRAM mmu_table
956        ldr     r0, =(SDRAM_PHYS_BASE | 0x4000) // RAM tables
957        mcr     p15, 0, r0, c2, c0, 0           // load page table pointer
958        CPWAIT  r0
959
960        // enable permission checks in all domains
961        ldr     r0, =0x55555555
962        mcr     p15, 0, r0, c3, c0, 0
963        CPWAIT  r0
964
965       
966        // enable mmu
967        mrc     p15, 0, r0, c1, c0, 0
968        orr     r0, r0, #MMU_Control_M
969        orr     r0, r0, #MMU_Control_R
970        mcr     p15, 0, r0, c1, c0, 0
971        CPWAIT  r0
972
973
974        // enable D cache
975        mrc     p15, 0, r0, c1, c0, 0
976        orr     r0, r0, #MMU_Control_C
977        mcr     p15, 0, r0, c1, c0, 0
978        CPWAIT  r0
979
980
981        // Enable branch target buffer
982        mrc     p15, 0, r0, c1, c0, 0
983        orr     r0, r0, #MMU_Control_BTB
984        mcr     p15, 0, r0, c1, c0, 0
985        CPWAIT  r0
986
987
988        mcr     p15, 0, r0, c7, c10, 4  // drain the write & fill buffers
989        CPWAIT  r0
990
991        mcr     p15, 0, r0, c7, c7, 0   // flush Icache, Dcache and BTB
992        CPWAIT  r0
993
994        mcr     p15, 0, r0, c8, c7, 0   // flush instuction and data TLBs
995        CPWAIT  r0
996
997        mcr     p15, 0, r0, c7, c10, 4  // drain the write & fill buffers
998        CPWAIT r0       
999       
1000
1001        // save SDRAM size
1002        ldr     r1, =hal_dram_size  /* [see hal_intr.h] */
1003        mov     r8, #SDRAM_SIZE
1004        str     r8, [r1]
1005
1006        // save original value of fuse register
1007        ldr     r0, =IXP425_EXP_CFG_BASE
1008        ldr     r8, [r0, #IXP400_EXP_FUSE]
1009        ldr     r0, =_ixp4xx_fuse_val
1010        str     r8, [r0]
1011
1012        ldr     r0, =KIXRP435_LED_BASE
1013        mov     r1, #0xff
1014        str     r1, [r0]
1015        .endm    // _platform_setup1
1016
1017#else // defined(CYG_HAL_STARTUP_ROM)
1018#define PLATFORM_SETUP1
1019#endif
1020
1021#define PLATFORM_VECTORS         _platform_vectors
1022        .macro  _platform_vectors
1023        .globl  _ixp4xx_fuse_val
1024_ixp4xx_fuse_val:  .long   0
1025        .endm                                       
1026
1027/*---------------------------------------------------------------------------*/
1028/* end of hal_platform_setup.h                                               */
1029#endif /* CYGONCE_HAL_PLATFORM_SETUP_H */
Note: See TracBrowser for help on using the repository browser.