import of upstream 2.4.34.4 from kernel.org
[linux-2.4.git] / arch / cris / lib / dram_init.S
1 /* $Id: dram_init.S,v 1.15 2003/09/22 09:22:22 starvik Exp $
2  * 
3  * DRAM/SDRAM initialization - alter with care
4  * This file is intended to be included from other assembler files
5  *
6  * Note: This file may not modify r9 because r9 is used to carry
7  *       information from the decompresser to the kernel
8  *
9  * Copyright (C) 2000, 2001 Axis Communications AB
10  *
11  * Authors:  Mikael Starvik (starvik@axis.com)  
12  * 
13  * $Log: dram_init.S,v $
14  * Revision 1.15  2003/09/22 09:22:22  starvik
15  * Decompresser is linked to 0x407xxxxx and sdram commands are at 0x000xxxxx
16  * so we need to mask off 12 bits.
17  *
18  * Revision 1.14  2003/03/31 07:07:08  starvik
19  * Corrected calculation of end of sdram init commands
20  *
21  * Revision 1.13  2002/10/30 07:42:28  starvik
22  * Always read SDRAM command sequence from flash
23  *
24  * Revision 1.12  2002/08/09 11:37:37  orjanf
25  * Added double initialization work-around for Samsung SDRAMs.
26  *
27  * Revision 1.11  2002/06/04 11:43:21  starvik
28  * Check if mrs_data is specified in kernelconfig (necessary for MCM)
29  *
30  * Revision 1.10  2001/10/04 12:00:21  martinnn
31  * Added missing underscores.
32  *
33  * Revision 1.9  2001/10/01 14:47:35  bjornw
34  * Added register prefixes and removed underscores
35  *
36  * Revision 1.8  2001/05/15 07:12:45  hp
37  * Copy warning from head.S about r8 and r9
38  *
39  * Revision 1.7  2001/04/18 12:05:39  bjornw
40  * Fixed comments, and explicitely include config.h to be sure its there
41  *
42  * Revision 1.6  2001/04/10 06:20:16  starvik
43  * Delay should be 200us, not 200ns
44  *
45  * Revision 1.5  2001/04/09 06:01:13  starvik
46  * Added support for 100 MHz SDRAMs
47  *
48  * Revision 1.4  2001/03/26 14:24:01  bjornw
49  * Namechange of some config options
50  *
51  * Revision 1.3  2001/03/23 08:29:41  starvik
52  * Corrected calculation of mrs_data
53  *
54  * Revision 1.2  2001/02/08 15:20:00  starvik
55  * Corrected SDRAM initialization
56  * Should now be included as inline
57  *
58  * Revision 1.1  2001/01/29 13:08:02  starvik
59  * Initial version
60  * This file should be included from all assembler files that needs to
61  * initialize DRAM/SDRAM.
62  *
63  */
64
65 /* Just to be certain the config file is included, we include it here
66  * explicitely instead of depending on it being included in the file that
67  * uses this code.
68  */
69
70 #include <linux/config.h>
71
72         ;; WARNING! The registers r8 and r9 are used as parameters carrying
73         ;; information from the decompressor (if the kernel was compressed). 
74         ;; They should not be used in the code below.
75
76 #ifndef CONFIG_SVINTO_SIM       
77         move.d   CONFIG_ETRAX_DEF_R_WAITSTATES, $r0
78         move.d   $r0, [R_WAITSTATES]
79
80         move.d   CONFIG_ETRAX_DEF_R_BUS_CONFIG, $r0
81         move.d   $r0, [R_BUS_CONFIG]
82         
83 #ifndef CONFIG_ETRAX_SDRAM
84         move.d   CONFIG_ETRAX_DEF_R_DRAM_CONFIG, $r0
85         move.d   $r0, [R_DRAM_CONFIG]
86
87         move.d   CONFIG_ETRAX_DEF_R_DRAM_TIMING, $r0
88         move.d   $r0, [R_DRAM_TIMING]
89 #else
90         ;; Samsung SDRAMs seem to require to be initialized twice to work properly.
91         moveq    2, $r6 
92 _sdram_init:
93         
94         ; Refer to ETRAX 100LX Designers Reference for a description of SDRAM initialization
95         
96         ; Bank configuration
97         move.d   CONFIG_ETRAX_DEF_R_SDRAM_CONFIG, $r0
98         move.d   $r0, [R_SDRAM_CONFIG]
99
100         ; Calculate value of mrs_data 
101         ; CAS latency = 2 && bus_width = 32 => 0x40
102         ; CAS latency = 3 && bus_width = 32 => 0x60
103         ; CAS latency = 2 && bus_width = 16 => 0x20
104         ; CAS latency = 3 && bus_width = 16 => 0x30
105
106         ; Check if value is already supplied in kernel config
107         move.d   CONFIG_ETRAX_DEF_R_SDRAM_TIMING, $r2
108         and.d    0x00ff0000, $r2
109         bne      _set_timing
110         lsrq     16, $r2
111         
112         move.d   0x40, $r2       ; Assume 32 bits and CAS latency = 2
113         move.d   CONFIG_ETRAX_DEF_R_SDRAM_TIMING, $r1
114         move.d   $r1, $r3
115         and.d    0x03, $r1       ; Get CAS latency
116         and.d    0x1000, $r3     ; 50 or 100 MHz?
117         beq      _speed_50
118         nop
119 _speed_100:             
120         cmp.d    0x00, $r1      ; CAS latency = 2?
121         beq      _bw_check
122         nop
123         or.d     0x20, $r2      ; CAS latency = 3 
124         ba       _bw_check
125         nop
126 _speed_50:                      
127         cmp.d    0x01, $r1      ; CAS latency = 2?
128         beq      _bw_check
129         nop
130         or.d     0x20, $r2       ; CAS latency = 3
131 _bw_check:
132         move.d   CONFIG_ETRAX_DEF_R_SDRAM_CONFIG, $r1
133         and.d    0x800000, $r1  ; DRAM width is bit 23
134         bne      _set_timing
135         nop
136         lsrq     1, $r2         ;  16 bits. Shift down value.
137
138         ; Set timing parameters. Starts master clock
139 _set_timing:
140         move.d   CONFIG_ETRAX_DEF_R_SDRAM_TIMING, $r1
141         and.d    0x8000f9ff, $r1 ; Make sure mrs data and command is 0 
142         or.d     0x80000000, $r1        ; Make sure sdram enable bit is set
143         move.d   $r1, $r5
144         or.d     0x0000c000, $r1 ; ref = disable
145         lslq     16, $r2                ; mrs data starts at bit 16
146         or.d     $r2, $r1 
147         move.d   $r1, [R_SDRAM_TIMING]  
148                 
149         ; Wait 200us
150         move.d   10000, $r2
151 1:      bne      1b
152         subq     1, $r2
153         
154         ; Issue initialization command sequence
155         move.d   _sdram_commands_start, $r2
156         and.d    0x000fffff, $r2 ; Make sure commands are read from flash
157         move.d   _sdram_commands_end,  $r3
158         and.d    0x000fffff, $r3
159 1:      clear.d  $r4
160         move.b   [$r2+], $r4
161         lslq     9, $r4 ; Command starts at bit 9
162         or.d     $r1, $r4
163         move.d   $r4, [R_SDRAM_TIMING]
164         nop             ; Wait five nop cycles between each command
165         nop
166         nop
167         nop
168         nop
169         cmp.d    $r2, $r3
170         bne      1b
171         nop
172         move.d   $r5, [R_SDRAM_TIMING]
173         subq     1, $r6
174         bne      _sdram_init
175         nop
176         ba       _sdram_commands_end
177         nop
178
179 _sdram_commands_start:
180         .byte   3       ; Precharge
181         .byte   0       ; nop
182         .byte   2       ; refresh
183         .byte   0       ; nop
184         .byte   2       ; refresh
185         .byte   0       ; nop
186         .byte   2       ; refresh
187         .byte   0       ; nop
188         .byte   2       ; refresh
189         .byte   0       ; nop
190         .byte   2       ; refresh
191         .byte   0       ; nop
192         .byte   2       ; refresh
193         .byte   0       ; nop
194         .byte   2       ; refresh
195         .byte   0       ; nop
196         .byte   2       ; refresh
197         .byte   0       ; nop
198         .byte   1       ; mrs
199         .byte   0       ; nop 
200 _sdram_commands_end:            
201 #endif
202 #endif