Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/cris/arch-v10/lib/dram_init.S
15131 views
1
/*
2
* DRAM/SDRAM initialization - alter with care
3
* This file is intended to be included from other assembler files
4
*
5
* Note: This file may not modify r9 because r9 is used to carry
6
* information from the decompresser to the kernel
7
*
8
* Copyright (C) 2000, 2001 Axis Communications AB
9
*
10
* Authors: Mikael Starvik ([email protected])
11
*
12
*/
13
14
/* Just to be certain the config file is included, we include it here
15
* explicitly instead of depending on it being included in the file that
16
* uses this code.
17
*/
18
19
20
;; WARNING! The registers r8 and r9 are used as parameters carrying
21
;; information from the decompressor (if the kernel was compressed).
22
;; They should not be used in the code below.
23
24
#ifndef CONFIG_SVINTO_SIM
25
move.d CONFIG_ETRAX_DEF_R_WAITSTATES, $r0
26
move.d $r0, [R_WAITSTATES]
27
28
move.d CONFIG_ETRAX_DEF_R_BUS_CONFIG, $r0
29
move.d $r0, [R_BUS_CONFIG]
30
31
#ifndef CONFIG_ETRAX_SDRAM
32
move.d CONFIG_ETRAX_DEF_R_DRAM_CONFIG, $r0
33
move.d $r0, [R_DRAM_CONFIG]
34
35
move.d CONFIG_ETRAX_DEF_R_DRAM_TIMING, $r0
36
move.d $r0, [R_DRAM_TIMING]
37
#else
38
;; Samsung SDRAMs seem to require to be initialized twice to work properly.
39
moveq 2, $r6
40
_sdram_init:
41
42
; Refer to ETRAX 100LX Designers Reference for a description of SDRAM initialization
43
44
; Bank configuration
45
move.d CONFIG_ETRAX_DEF_R_SDRAM_CONFIG, $r0
46
move.d $r0, [R_SDRAM_CONFIG]
47
48
; Calculate value of mrs_data
49
; CAS latency = 2 && bus_width = 32 => 0x40
50
; CAS latency = 3 && bus_width = 32 => 0x60
51
; CAS latency = 2 && bus_width = 16 => 0x20
52
; CAS latency = 3 && bus_width = 16 => 0x30
53
54
; Check if value is already supplied in kernel config
55
move.d CONFIG_ETRAX_DEF_R_SDRAM_TIMING, $r2
56
and.d 0x00ff0000, $r2
57
bne _set_timing
58
lsrq 16, $r2
59
60
move.d 0x40, $r2 ; Assume 32 bits and CAS latency = 2
61
move.d CONFIG_ETRAX_DEF_R_SDRAM_TIMING, $r1
62
move.d $r1, $r3
63
and.d 0x03, $r1 ; Get CAS latency
64
and.d 0x1000, $r3 ; 50 or 100 MHz?
65
beq _speed_50
66
nop
67
_speed_100:
68
cmp.d 0x00, $r1 ; CAS latency = 2?
69
beq _bw_check
70
nop
71
or.d 0x20, $r2 ; CAS latency = 3
72
ba _bw_check
73
nop
74
_speed_50:
75
cmp.d 0x01, $r1 ; CAS latency = 2?
76
beq _bw_check
77
nop
78
or.d 0x20, $r2 ; CAS latency = 3
79
_bw_check:
80
move.d CONFIG_ETRAX_DEF_R_SDRAM_CONFIG, $r1
81
and.d 0x800000, $r1 ; DRAM width is bit 23
82
bne _set_timing
83
nop
84
lsrq 1, $r2 ; 16 bits. Shift down value.
85
86
; Set timing parameters. Starts master clock
87
_set_timing:
88
move.d CONFIG_ETRAX_DEF_R_SDRAM_TIMING, $r1
89
and.d 0x8000f9ff, $r1 ; Make sure mrs data and command is 0
90
or.d 0x80000000, $r1 ; Make sure sdram enable bit is set
91
move.d $r1, $r5
92
or.d 0x0000c000, $r1 ; ref = disable
93
lslq 16, $r2 ; mrs data starts at bit 16
94
or.d $r2, $r1
95
move.d $r1, [R_SDRAM_TIMING]
96
97
; Wait 200us
98
move.d 10000, $r2
99
1: bne 1b
100
subq 1, $r2
101
102
; Issue initialization command sequence
103
move.d _sdram_commands_start, $r2
104
and.d 0x000fffff, $r2 ; Make sure commands are read from flash
105
move.d _sdram_commands_end, $r3
106
and.d 0x000fffff, $r3
107
1: clear.d $r4
108
move.b [$r2+], $r4
109
lslq 9, $r4 ; Command starts at bit 9
110
or.d $r1, $r4
111
move.d $r4, [R_SDRAM_TIMING]
112
nop ; Wait five nop cycles between each command
113
nop
114
nop
115
nop
116
nop
117
cmp.d $r2, $r3
118
bne 1b
119
nop
120
move.d $r5, [R_SDRAM_TIMING]
121
subq 1, $r6
122
bne _sdram_init
123
nop
124
ba _sdram_commands_end
125
nop
126
127
_sdram_commands_start:
128
.byte 3 ; Precharge
129
.byte 0 ; nop
130
.byte 2 ; refresh
131
.byte 0 ; nop
132
.byte 2 ; refresh
133
.byte 0 ; nop
134
.byte 2 ; refresh
135
.byte 0 ; nop
136
.byte 2 ; refresh
137
.byte 0 ; nop
138
.byte 2 ; refresh
139
.byte 0 ; nop
140
.byte 2 ; refresh
141
.byte 0 ; nop
142
.byte 2 ; refresh
143
.byte 0 ; nop
144
.byte 2 ; refresh
145
.byte 0 ; nop
146
.byte 1 ; mrs
147
.byte 0 ; nop
148
_sdram_commands_end:
149
#endif
150
#endif
151
152