1
2
3
4
5
6
7
8
9
10
11#include <common.h>
12#include <asm/io.h>
13#include <asm/arch/atmel_mpddrc.h>
14
15#define SAMA5D3_MPDDRC_VERSION 0x140
16
17static inline void atmel_mpddr_op(const struct atmel_mpddr *mpddr,
18 int mode,
19 u32 ram_address)
20{
21 writel(mode, &mpddr->mr);
22 writel(0, ram_address);
23}
24
25static int ddr2_decodtype_is_seq(const unsigned int base, u32 cr)
26{
27 struct atmel_mpddr *mpddr = (struct atmel_mpddr *)base;
28 u16 version = readl(&mpddr->version) & 0xffff;
29
30 if ((version >= SAMA5D3_MPDDRC_VERSION) &&
31 (cr & ATMEL_MPDDRC_CR_DECOD_INTERLEAVED))
32 return 0;
33
34 return 1;
35}
36
37
38int ddr2_init(const unsigned int base,
39 const unsigned int ram_address,
40 const struct atmel_mpddrc_config *mpddr_value)
41{
42 const struct atmel_mpddr *mpddr = (struct atmel_mpddr *)base;
43
44 u32 ba_off, cr;
45
46
47 ba_off = (mpddr_value->cr & ATMEL_MPDDRC_CR_NC_MASK) + 9;
48 if (ddr2_decodtype_is_seq(base, mpddr_value->cr))
49 ba_off += ((mpddr_value->cr & ATMEL_MPDDRC_CR_NR_MASK) >> 2) + 11;
50
51 ba_off += (mpddr_value->md & ATMEL_MPDDRC_MD_DBW_MASK) ? 1 : 2;
52
53
54 writel(mpddr_value->md, &mpddr->md);
55
56
57 writel(mpddr_value->cr, &mpddr->cr);
58
59
60 writel(mpddr_value->tpr0, &mpddr->tpr0);
61 writel(mpddr_value->tpr1, &mpddr->tpr1);
62 writel(mpddr_value->tpr2, &mpddr->tpr2);
63
64
65 atmel_mpddr_op(mpddr, ATMEL_MPDDRC_MR_MODE_NOP_CMD, ram_address);
66
67
68 udelay(200);
69
70
71 atmel_mpddr_op(mpddr, ATMEL_MPDDRC_MR_MODE_NOP_CMD, ram_address);
72
73
74 atmel_mpddr_op(mpddr, ATMEL_MPDDRC_MR_MODE_PRCGALL_CMD, ram_address);
75
76
77 atmel_mpddr_op(mpddr, ATMEL_MPDDRC_MR_MODE_EXT_LMR_CMD,
78 ram_address + (0x2 << ba_off));
79
80
81 atmel_mpddr_op(mpddr, ATMEL_MPDDRC_MR_MODE_EXT_LMR_CMD,
82 ram_address + (0x3 << ba_off));
83
84
85
86
87
88 atmel_mpddr_op(mpddr, ATMEL_MPDDRC_MR_MODE_EXT_LMR_CMD,
89 ram_address + (0x1 << ba_off));
90
91
92 cr = readl(&mpddr->cr);
93 writel(cr | ATMEL_MPDDRC_CR_DLL_RESET_ENABLED, &mpddr->cr);
94
95
96 atmel_mpddr_op(mpddr, ATMEL_MPDDRC_MR_MODE_LMR_CMD, ram_address);
97
98
99 atmel_mpddr_op(mpddr, ATMEL_MPDDRC_MR_MODE_PRCGALL_CMD, ram_address);
100
101
102 atmel_mpddr_op(mpddr, ATMEL_MPDDRC_MR_MODE_RFSH_CMD, ram_address);
103 atmel_mpddr_op(mpddr, ATMEL_MPDDRC_MR_MODE_RFSH_CMD, ram_address);
104
105
106 cr = readl(&mpddr->cr);
107 writel(cr & (~ATMEL_MPDDRC_CR_DLL_RESET_ENABLED), &mpddr->cr);
108
109
110 atmel_mpddr_op(mpddr, ATMEL_MPDDRC_MR_MODE_LMR_CMD, ram_address);
111
112
113 cr = readl(&mpddr->cr);
114 writel(cr | ATMEL_MPDDRC_CR_OCD_DEFAULT, &mpddr->cr);
115
116
117
118
119
120 atmel_mpddr_op(mpddr, ATMEL_MPDDRC_MR_MODE_EXT_LMR_CMD,
121 ram_address + (0x1 << ba_off));
122
123
124 cr = readl(&mpddr->cr);
125 writel(cr & (~ATMEL_MPDDRC_CR_OCD_DEFAULT), &mpddr->cr);
126
127
128
129
130
131 atmel_mpddr_op(mpddr, ATMEL_MPDDRC_MR_MODE_EXT_LMR_CMD,
132 ram_address + (0x1 << ba_off));
133
134
135 atmel_mpddr_op(mpddr, ATMEL_MPDDRC_MR_MODE_NORMAL_CMD, ram_address);
136
137
138 writel(0, ram_address);
139
140
141 writel(mpddr_value->rtr, &mpddr->rtr);
142
143 return 0;
144}
145
146int ddr3_init(const unsigned int base,
147 const unsigned int ram_address,
148 const struct atmel_mpddrc_config *mpddr_value)
149{
150 struct atmel_mpddr *mpddr = (struct atmel_mpddr *)base;
151 u32 ba_off;
152
153
154 ba_off = (mpddr_value->cr & ATMEL_MPDDRC_CR_NC_MASK) + 9;
155 if (ddr2_decodtype_is_seq(base, mpddr_value->cr))
156 ba_off += ((mpddr_value->cr &
157 ATMEL_MPDDRC_CR_NR_MASK) >> 2) + 11;
158
159 ba_off += (mpddr_value->md & ATMEL_MPDDRC_MD_DBW_MASK) ? 1 : 2;
160
161
162 writel(mpddr_value->md, &mpddr->md);
163
164
165
166
167 writel(mpddr_value->cr, &mpddr->cr);
168
169 writel(mpddr_value->tpr0, &mpddr->tpr0);
170 writel(mpddr_value->tpr1, &mpddr->tpr1);
171 writel(mpddr_value->tpr2, &mpddr->tpr2);
172
173
174 atmel_mpddr_op(mpddr, ATMEL_MPDDRC_MR_MODE_NOP_CMD, ram_address);
175
176
177 udelay(500);
178
179
180 atmel_mpddr_op(mpddr, ATMEL_MPDDRC_MR_MODE_NOP_CMD, ram_address);
181
182
183
184
185
186 atmel_mpddr_op(mpddr, ATMEL_MPDDRC_MR_MODE_EXT_LMR_CMD,
187 ram_address + (0x2 << ba_off));
188
189
190
191
192 atmel_mpddr_op(mpddr, ATMEL_MPDDRC_MR_MODE_EXT_LMR_CMD,
193 ram_address + (0x3 << ba_off));
194
195
196
197
198 atmel_mpddr_op(mpddr, ATMEL_MPDDRC_MR_MODE_EXT_LMR_CMD,
199 ram_address + (0x1 << ba_off));
200
201
202
203
204
205
206
207 atmel_mpddr_op(mpddr, ATMEL_MPDDRC_MR_MODE_LMR_CMD, ram_address);
208
209 udelay(50);
210
211
212
213
214
215 atmel_mpddr_op(mpddr, ATMEL_MPDDRC_MR_MODE_DEEP_CMD, ram_address);
216
217
218 atmel_mpddr_op(mpddr, ATMEL_MPDDRC_MR_MODE_NORMAL_CMD, ram_address);
219
220
221 writel(0, ram_address);
222
223
224
225
226
227 writel(mpddr_value->rtr, &mpddr->rtr);
228
229 return 0;
230}
231