1 #include <generated/csr.h>
7 #include <generated/sdram_phy.h>
8 #include <generated/mem.h>
14 static void cdelay(int i
)
17 #if defined (__lm32__)
18 __asm__
volatile("nop");
19 #elif defined (__or1k__)
20 __asm__
volatile("l.nop");
22 #error Unsupported architecture
30 sdram_dfii_control_write(DFII_CONTROL_CKE
|DFII_CONTROL_ODT
|DFII_CONTROL_RESET_N
);
31 printf("SDRAM now under software control\n");
36 sdram_dfii_control_write(DFII_CONTROL_SEL
);
37 printf("SDRAM now under hardware control\n");
40 void sdrrow(char *_row
)
46 sdram_dfii_pi0_address_write(0x0000);
47 sdram_dfii_pi0_baddress_write(0);
48 command_p0(DFII_COMMAND_RAS
|DFII_COMMAND_WE
|DFII_COMMAND_CS
);
50 printf("Precharged\n");
52 row
= strtoul(_row
, &c
, 0);
54 printf("incorrect row\n");
57 sdram_dfii_pi0_address_write(row
);
58 sdram_dfii_pi0_baddress_write(0);
59 command_p0(DFII_COMMAND_RAS
|DFII_COMMAND_CS
);
61 printf("Activated row %d\n", row
);
74 first_byte
= DFII_PIX_DATA_SIZE
/2 - 1 - dq
;
75 step
= DFII_PIX_DATA_SIZE
/2;
78 for(p
=0;p
<DFII_NPHASES
;p
++)
79 for(i
=first_byte
;i
<DFII_PIX_DATA_SIZE
;i
+=step
)
80 printf("%02x", MMPTR(sdram_dfii_pix_rddata_addr
[p
]+4*i
));
84 void sdrrd(char *startaddr
, char *dq
)
91 printf("sdrrd <address>\n");
94 addr
= strtoul(startaddr
, &c
, 0);
96 printf("incorrect address\n");
102 _dq
= strtoul(dq
, &c
, 0);
104 printf("incorrect DQ\n");
109 sdram_dfii_pird_address_write(addr
);
110 sdram_dfii_pird_baddress_write(0);
111 command_prd(DFII_COMMAND_CAS
|DFII_COMMAND_CS
|DFII_COMMAND_RDDATA
);
116 void sdrrderr(char *count
)
122 unsigned char prev_data
[DFII_NPHASES
*DFII_PIX_DATA_SIZE
];
123 unsigned char errs
[DFII_NPHASES
*DFII_PIX_DATA_SIZE
];
126 printf("sdrrderr <count>\n");
129 _count
= strtoul(count
, &c
, 0);
131 printf("incorrect count\n");
135 for(i
=0;i
<DFII_NPHASES
*DFII_PIX_DATA_SIZE
;i
++)
137 for(addr
=0;addr
<16;addr
++) {
138 sdram_dfii_pird_address_write(addr
*8);
139 sdram_dfii_pird_baddress_write(0);
140 command_prd(DFII_COMMAND_CAS
|DFII_COMMAND_CS
|DFII_COMMAND_RDDATA
);
142 for(p
=0;p
<DFII_NPHASES
;p
++)
143 for(i
=0;i
<DFII_PIX_DATA_SIZE
;i
++)
144 prev_data
[p
*DFII_PIX_DATA_SIZE
+i
] = MMPTR(sdram_dfii_pix_rddata_addr
[p
]+4*i
);
146 for(j
=0;j
<_count
;j
++) {
147 command_prd(DFII_COMMAND_CAS
|DFII_COMMAND_CS
|DFII_COMMAND_RDDATA
);
149 for(p
=0;p
<DFII_NPHASES
;p
++)
150 for(i
=0;i
<DFII_PIX_DATA_SIZE
;i
++) {
151 unsigned char new_data
;
153 new_data
= MMPTR(sdram_dfii_pix_rddata_addr
[p
]+4*i
);
154 errs
[p
*DFII_PIX_DATA_SIZE
+i
] |= prev_data
[p
*DFII_PIX_DATA_SIZE
+i
] ^ new_data
;
155 prev_data
[p
*DFII_PIX_DATA_SIZE
+i
] = new_data
;
160 for(i
=0;i
<DFII_NPHASES
*DFII_PIX_DATA_SIZE
;i
++)
161 printf("%02x", errs
[i
]);
163 for(p
=0;p
<DFII_NPHASES
;p
++)
164 for(i
=0;i
<DFII_PIX_DATA_SIZE
;i
++)
165 printf("%2x", DFII_PIX_DATA_SIZE
/2 - 1 - (i
% (DFII_PIX_DATA_SIZE
/2)));
169 void sdrwr(char *startaddr
)
176 if(*startaddr
== 0) {
177 printf("sdrrd <address>\n");
180 addr
= strtoul(startaddr
, &c
, 0);
182 printf("incorrect address\n");
186 for(p
=0;p
<DFII_NPHASES
;p
++)
187 for(i
=0;i
<DFII_PIX_DATA_SIZE
;i
++)
188 MMPTR(sdram_dfii_pix_wrdata_addr
[p
]+4*i
) = 0x10*p
+ i
;
190 sdram_dfii_piwr_address_write(addr
);
191 sdram_dfii_piwr_baddress_write(0);
192 command_pwr(DFII_COMMAND_CAS
|DFII_COMMAND_WE
|DFII_COMMAND_CS
|DFII_COMMAND_WRDATA
);
195 #ifdef CSR_DDRPHY_BASE
199 sdram_dfii_pi0_address_write(DDR3_MR1
| (1 << 7));
200 sdram_dfii_pi0_baddress_write(1);
201 command_p0(DFII_COMMAND_RAS
|DFII_COMMAND_CAS
|DFII_COMMAND_WE
|DFII_COMMAND_CS
);
202 ddrphy_wlevel_en_write(1);
207 sdram_dfii_pi0_address_write(DDR3_MR1
);
208 sdram_dfii_pi0_baddress_write(1);
209 command_p0(DFII_COMMAND_RAS
|DFII_COMMAND_CAS
|DFII_COMMAND_WE
|DFII_COMMAND_CS
);
210 ddrphy_wlevel_en_write(0);
213 #define ERR_DDRPHY_DELAY 32
215 static int write_level(int *delay
, int *high_skew
)
222 printf("Write leveling: ");
226 for(i
=0;i
<DFII_PIX_DATA_SIZE
/2;i
++) {
227 dq_address
= sdram_dfii_pix_rddata_addr
[0]+4*(DFII_PIX_DATA_SIZE
/2-1-i
);
228 ddrphy_dly_sel_write(1 << i
);
229 ddrphy_wdly_dq_rst_write(1);
230 ddrphy_wdly_dqs_rst_write(1);
234 ddrphy_wlevel_strobe_write(1);
236 dq
= MMPTR(dq_address
);
239 * Assume this DQ group has between 1 and 2 bit times of skew.
240 * Bring DQS into the CK=0 zone before continuing leveling.
245 if(delay
[i
] >= ERR_DDRPHY_DELAY
)
247 ddrphy_wdly_dq_inc_write(1);
248 ddrphy_wdly_dqs_inc_write(1);
249 ddrphy_wlevel_strobe_write(1);
251 dq
= MMPTR(dq_address
);
258 if(delay
[i
] >= ERR_DDRPHY_DELAY
)
260 ddrphy_wdly_dq_inc_write(1);
261 ddrphy_wdly_dqs_inc_write(1);
263 ddrphy_wlevel_strobe_write(1);
265 dq
= MMPTR(dq_address
);
271 for(i
=DFII_PIX_DATA_SIZE
/2-1;i
>=0;i
--) {
272 printf("%2d%c ", delay
[i
], high_skew
[i
] ? '*' : ' ');
273 if(delay
[i
] >= ERR_DDRPHY_DELAY
)
278 printf("completed\n");
285 static void read_bitslip(int *delay
, int *high_skew
)
290 bitslip_thr
= 0x7fffffff;
291 for(i
=0;i
<DFII_PIX_DATA_SIZE
/2;i
++)
292 if(high_skew
[i
] && (delay
[i
] < bitslip_thr
))
293 bitslip_thr
= delay
[i
];
294 if(bitslip_thr
== 0x7fffffff)
296 bitslip_thr
= bitslip_thr
/2;
298 printf("Read bitslip: ");
299 for(i
=DFII_PIX_DATA_SIZE
/2-1;i
>=0;i
--)
300 if(delay
[i
] > bitslip_thr
) {
301 ddrphy_dly_sel_write(1 << i
);
302 /* 7-series SERDES in DDR mode needs 3 pulses for 1 bitslip */
303 ddrphy_rdly_dq_bitslip_write(1);
304 ddrphy_rdly_dq_bitslip_write(1);
305 ddrphy_rdly_dq_bitslip_write(1);
311 static void read_delays(void)
314 unsigned char prs
[DFII_NPHASES
*DFII_PIX_DATA_SIZE
];
317 int delay
, delay_min
, delay_max
;
319 printf("Read delays: ");
321 /* Generate pseudo-random sequence */
323 for(i
=0;i
<DFII_NPHASES
*DFII_PIX_DATA_SIZE
;i
++) {
324 prv
= 1664525*prv
+ 1013904223;
329 sdram_dfii_pi0_address_write(0);
330 sdram_dfii_pi0_baddress_write(0);
331 command_p0(DFII_COMMAND_RAS
|DFII_COMMAND_CS
);
334 /* Write test pattern */
335 for(p
=0;p
<DFII_NPHASES
;p
++)
336 for(i
=0;i
<DFII_PIX_DATA_SIZE
;i
++)
337 MMPTR(sdram_dfii_pix_wrdata_addr
[p
]+4*i
) = prs
[DFII_PIX_DATA_SIZE
*p
+i
];
338 sdram_dfii_piwr_address_write(0);
339 sdram_dfii_piwr_baddress_write(0);
340 command_pwr(DFII_COMMAND_CAS
|DFII_COMMAND_WE
|DFII_COMMAND_CS
|DFII_COMMAND_WRDATA
);
342 /* Calibrate each DQ in turn */
343 sdram_dfii_pird_address_write(0);
344 sdram_dfii_pird_baddress_write(0);
345 for(i
=0;i
<DFII_PIX_DATA_SIZE
/2;i
++) {
346 ddrphy_dly_sel_write(1 << (DFII_PIX_DATA_SIZE
/2-i
-1));
349 /* Find smallest working delay */
350 ddrphy_rdly_dq_rst_write(1);
352 command_prd(DFII_COMMAND_CAS
|DFII_COMMAND_CS
|DFII_COMMAND_RDDATA
);
355 for(p
=0;p
<DFII_NPHASES
;p
++) {
356 if(MMPTR(sdram_dfii_pix_rddata_addr
[p
]+4*i
) != prs
[DFII_PIX_DATA_SIZE
*p
+i
])
358 if(MMPTR(sdram_dfii_pix_rddata_addr
[p
]+4*(i
+DFII_PIX_DATA_SIZE
/2)) != prs
[DFII_PIX_DATA_SIZE
*p
+i
+DFII_PIX_DATA_SIZE
/2])
364 if(delay
>= ERR_DDRPHY_DELAY
)
366 ddrphy_rdly_dq_inc_write(1);
370 /* Get a bit further into the working zone */
372 ddrphy_rdly_dq_inc_write(1);
374 /* Find largest working delay */
376 command_prd(DFII_COMMAND_CAS
|DFII_COMMAND_CS
|DFII_COMMAND_RDDATA
);
379 for(p
=0;p
<DFII_NPHASES
;p
++) {
380 if(MMPTR(sdram_dfii_pix_rddata_addr
[p
]+4*i
) != prs
[DFII_PIX_DATA_SIZE
*p
+i
])
382 if(MMPTR(sdram_dfii_pix_rddata_addr
[p
]+4*(i
+DFII_PIX_DATA_SIZE
/2)) != prs
[DFII_PIX_DATA_SIZE
*p
+i
+DFII_PIX_DATA_SIZE
/2])
388 if(delay
>= ERR_DDRPHY_DELAY
)
390 ddrphy_rdly_dq_inc_write(1);
394 printf("%d:%02d-%02d ", DFII_PIX_DATA_SIZE
/2-i
-1, delay_min
, delay_max
);
396 /* Set delay to the middle */
397 ddrphy_rdly_dq_rst_write(1);
398 for(j
=0;j
<(delay_min
+delay_max
)/2;j
++)
399 ddrphy_rdly_dq_inc_write(1);
403 sdram_dfii_pi0_address_write(0);
404 sdram_dfii_pi0_baddress_write(0);
405 command_p0(DFII_COMMAND_RAS
|DFII_COMMAND_WE
|DFII_COMMAND_CS
);
408 printf("completed\n");
413 int delay
[DFII_PIX_DATA_SIZE
/2];
414 int high_skew
[DFII_PIX_DATA_SIZE
/2];
416 if(!write_level(delay
, high_skew
))
418 read_bitslip(delay
, high_skew
);
424 #endif /* CSR_DDRPHY_BASE */
426 #define TEST_DATA_SIZE (32*1024) // FIXME add #define
427 #define TEST_DATA_RANDOM 1
429 #define TEST_ADDR_SIZE (32*1024)
430 #define TEST_ADDR_RANDOM 0
432 #define ONEZERO 0xAAAAAAAA
433 #define ZEROONE 0x55555555
435 static unsigned int seed_to_data_32(unsigned int seed
, int random
)
438 return 1664525*seed
+ 1013904223;
443 static unsigned short seed_to_data_16(unsigned short seed
, int random
)
446 return 25173*seed
+ 13849;
451 int memtest_silent(void)
453 volatile unsigned int *array
= (unsigned int *)MAIN_RAM_BASE
;
455 unsigned int seed_32
;
456 unsigned short seed_16
;
457 unsigned int error_cnt
;
468 if(array
[i
] != ONEZERO
)
478 if(array
[i
] != ZEROONE
)
482 /* test counter or random data */
484 for(i
=0;i
<TEST_DATA_SIZE
/4;i
++) {
485 seed_32
= seed_to_data_32(seed_32
, TEST_DATA_RANDOM
);
492 for(i
=0;i
<TEST_DATA_SIZE
/4;i
++) {
493 seed_32
= seed_to_data_32(seed_32
, TEST_DATA_RANDOM
);
494 if(array
[i
] != seed_32
)
498 /* test random addressing */
500 for(i
=0;i
<TEST_ADDR_SIZE
/4;i
++) {
501 seed_16
= seed_to_data_16(seed_16
, TEST_ADDR_RANDOM
);
502 array
[(unsigned int) seed_16
] = i
;
508 for(i
=0;i
<TEST_ADDR_SIZE
/4;i
++) {
509 seed_16
= seed_to_data_16(seed_16
, TEST_ADDR_RANDOM
);
510 if(array
[(unsigned int) seed_16
] != i
)
521 e
= memtest_silent();
523 printf("Memtest failed: %d/%d words incorrect\n", e
, 2*128 + TEST_DATA_SIZE
/4 + TEST_ADDR_SIZE
/4);
526 printf("Memtest OK\n");
533 printf("Initializing SDRAM...\n");
536 #ifdef CSR_DDRPHY_BASE
540 sdram_dfii_control_write(DFII_CONTROL_SEL
);