1 // This file is Copyright (c) 2013-2014 Sebastien Bourdeauducq <sb@m-labs.hk>
2 // This file is Copyright (c) 2013-2019 Florent Kermarrec <florent@enjoy-digital.fr>
3 // This file is Copyright (c) 2018 Chris Ballance <chris.ballance@physics.ox.ac.uk>
4 // This file is Copyright (c) 2018 Dolu1990 <charles.papon.90@gmail.com>
5 // This file is Copyright (c) 2019 Gabriel L. Somlo <gsomlo@gmail.com>
6 // This file is Copyright (c) 2018 Jean-François Nguyen <jf@lambdaconcept.fr>
7 // This file is Copyright (c) 2018 Sergiusz Bazanski <q3k@q3k.org>
8 // This file is Copyright (c) 2018 Tim 'mithro' Ansell <me@mith.ro>
11 #include <generated/csr.h>
17 #include <generated/sdram_phy.h>
19 #include <generated/mem.h>
25 // FIXME(hack): If we don't have main ram, just target the sram instead.
27 #define MAIN_RAM_BASE SRAM_BASE
30 __attribute__((unused
)) static void cdelay(int i
)
33 #if defined (__lm32__)
34 __asm__
volatile("nop");
35 #elif defined (__or1k__)
36 __asm__
volatile("l.nop");
37 #elif defined (__picorv32__)
38 __asm__
volatile("nop");
39 #elif defined (__vexriscv__)
40 __asm__
volatile("nop");
41 #elif defined (__minerva__)
42 __asm__
volatile("nop");
43 #elif defined (__rocket__)
44 __asm__
volatile("nop");
45 #elif defined (__powerpc__)
46 __asm__
volatile("nop");
47 #elif defined (__microwatt__)
48 __asm__
volatile("nop");
50 #error Unsupported architecture
58 #define DFII_ADDR_SHIFT CONFIG_CSR_ALIGNMENT/8
60 #define CSR_DATA_BYTES CONFIG_CSR_DATA_WIDTH/8
62 #define DFII_PIX_DATA_BYTES DFII_PIX_DATA_SIZE*CSR_DATA_BYTES
66 sdram_dfii_control_write(DFII_CONTROL_CKE
|DFII_CONTROL_ODT
|DFII_CONTROL_RESET_N
);
67 printf("SDRAM now under software control\n");
72 sdram_dfii_control_write(DFII_CONTROL_SEL
);
73 printf("SDRAM now under hardware control\n");
76 void sdrrow(char *_row
)
82 sdram_dfii_pi0_address_write(0x0000);
83 sdram_dfii_pi0_baddress_write(0);
84 command_p0(DFII_COMMAND_RAS
|DFII_COMMAND_WE
|DFII_COMMAND_CS
);
86 printf("Precharged\n");
88 row
= strtoul(_row
, &c
, 0);
90 printf("incorrect row\n");
93 sdram_dfii_pi0_address_write(row
);
94 sdram_dfii_pi0_baddress_write(0);
95 command_p0(DFII_COMMAND_RAS
|DFII_COMMAND_CS
);
97 printf("Activated row %d\n", row
);
101 void sdrrdbuf(int dq
)
104 int first_byte
, step
;
105 unsigned char buf
[DFII_PIX_DATA_BYTES
];
111 first_byte
= DFII_PIX_DATA_BYTES
/2 - 1 - dq
;
112 step
= DFII_PIX_DATA_BYTES
/2;
115 for(p
=0;p
<DFII_NPHASES
;p
++) {
116 csr_rd_buf_uint8(sdram_dfii_pix_rddata_addr
[p
],
117 buf
, DFII_PIX_DATA_BYTES
);
118 for(i
=first_byte
;i
<DFII_PIX_DATA_BYTES
;i
+=step
)
119 printf("%02x", buf
[i
]);
124 void sdrrd(char *startaddr
, char *dq
)
130 if(*startaddr
== 0) {
131 printf("sdrrd <address>\n");
134 addr
= strtoul(startaddr
, &c
, 0);
136 printf("incorrect address\n");
142 _dq
= strtoul(dq
, &c
, 0);
144 printf("incorrect DQ\n");
149 sdram_dfii_pird_address_write(addr
);
150 sdram_dfii_pird_baddress_write(0);
151 command_prd(DFII_COMMAND_CAS
|DFII_COMMAND_CS
|DFII_COMMAND_RDDATA
);
156 void sdrrderr(char *count
)
162 unsigned char prev_data
[DFII_NPHASES
][DFII_PIX_DATA_BYTES
];
163 unsigned char errs
[DFII_NPHASES
][DFII_PIX_DATA_BYTES
];
164 unsigned char new_data
[DFII_PIX_DATA_BYTES
];
167 printf("sdrrderr <count>\n");
170 _count
= strtoul(count
, &c
, 0);
172 printf("incorrect count\n");
176 for(p
=0;p
<DFII_NPHASES
;p
++)
177 for(i
=0;i
<DFII_PIX_DATA_BYTES
;i
++)
180 for(addr
=0;addr
<16;addr
++) {
181 sdram_dfii_pird_address_write(addr
*8);
182 sdram_dfii_pird_baddress_write(0);
183 command_prd(DFII_COMMAND_CAS
|DFII_COMMAND_CS
|DFII_COMMAND_RDDATA
);
185 for(p
=0;p
<DFII_NPHASES
;p
++)
186 csr_rd_buf_uint8(sdram_dfii_pix_rddata_addr
[p
],
187 prev_data
[p
], DFII_PIX_DATA_BYTES
);
189 for(j
=0;j
<_count
;j
++) {
190 command_prd(DFII_COMMAND_CAS
|DFII_COMMAND_CS
|DFII_COMMAND_RDDATA
);
192 for(p
=0;p
<DFII_NPHASES
;p
++) {
193 csr_rd_buf_uint8(sdram_dfii_pix_rddata_addr
[p
],
194 new_data
, DFII_PIX_DATA_BYTES
);
195 for(i
=0;i
<DFII_PIX_DATA_BYTES
;i
++) {
196 errs
[p
][i
] |= prev_data
[p
][i
] ^ new_data
[i
];
197 prev_data
[p
][i
] = new_data
[i
];
203 for(p
=0;p
<DFII_NPHASES
;p
++)
204 for(i
=0;i
<DFII_PIX_DATA_BYTES
;i
++)
205 printf("%02x", errs
[p
][i
]);
207 for(p
=0;p
<DFII_NPHASES
;p
++)
208 for(i
=0;i
<DFII_PIX_DATA_BYTES
;i
++)
209 printf("%2x", DFII_PIX_DATA_BYTES
/2 - 1 - (i
% (DFII_PIX_DATA_BYTES
/2)));
213 void sdrwr(char *startaddr
)
218 unsigned char buf
[DFII_PIX_DATA_BYTES
];
220 if(*startaddr
== 0) {
221 printf("sdrwr <address>\n");
224 addr
= strtoul(startaddr
, &c
, 0);
226 printf("incorrect address\n");
230 for(p
=0;p
<DFII_NPHASES
;p
++) {
231 for(i
=0;i
<DFII_PIX_DATA_BYTES
;i
++)
233 csr_wr_buf_uint8(sdram_dfii_pix_wrdata_addr
[p
],
234 buf
, DFII_PIX_DATA_BYTES
);
237 sdram_dfii_piwr_address_write(addr
);
238 sdram_dfii_piwr_baddress_write(0);
239 command_pwr(DFII_COMMAND_CAS
|DFII_COMMAND_WE
|DFII_COMMAND_CS
|DFII_COMMAND_WRDATA
);
242 #ifdef CSR_DDRPHY_BASE
244 #if defined (USDDRPHY)
245 #define ERR_DDRPHY_DELAY 512
246 #define ERR_DDRPHY_BITSLIP 8
247 #define NBMODULES DFII_PIX_DATA_BYTES/2
248 #elif defined (ECP5DDRPHY)
249 #define ERR_DDRPHY_DELAY 8
250 #define ERR_DDRPHY_BITSLIP 1
251 #define NBMODULES DFII_PIX_DATA_BYTES/4
253 #define ERR_DDRPHY_DELAY 32
254 #define ERR_DDRPHY_BITSLIP 8
255 #define NBMODULES DFII_PIX_DATA_BYTES/2
258 #ifdef CSR_DDRPHY_WLEVEL_EN_ADDR
262 sdram_dfii_pi0_address_write(DDRX_MR1
| (1 << 7));
263 sdram_dfii_pi0_baddress_write(1);
264 command_p0(DFII_COMMAND_RAS
|DFII_COMMAND_CAS
|DFII_COMMAND_WE
|DFII_COMMAND_CS
);
265 ddrphy_wlevel_en_write(1);
270 sdram_dfii_pi0_address_write(DDRX_MR1
);
271 sdram_dfii_pi0_baddress_write(1);
272 command_p0(DFII_COMMAND_RAS
|DFII_COMMAND_CAS
|DFII_COMMAND_WE
|DFII_COMMAND_CS
);
273 ddrphy_wlevel_en_write(0);
276 static void write_delay_rst(int module
) {
282 ddrphy_dly_sel_write(1 << module
);
285 ddrphy_wdly_dq_rst_write(1);
286 ddrphy_wdly_dqs_rst_write(1);
287 #ifdef USDDRPHY /* need to init manually on Ultrascale */
288 for(i
=0; i
<ddrphy_half_sys8x_taps_read(); i
++)
289 ddrphy_wdly_dqs_inc_write(1);
293 ddrphy_dly_sel_write(0);
296 static void write_delay_inc(int module
) {
298 ddrphy_dly_sel_write(1 << module
);
301 ddrphy_wdly_dq_inc_write(1);
302 ddrphy_wdly_dqs_inc_write(1);
305 ddrphy_dly_sel_write(0);
308 int write_level(void)
314 unsigned char taps_scan
[ERR_DDRPHY_DELAY
];
316 int one_window_active
;
317 int one_window_start
, one_window_best_start
;
318 int one_window_count
, one_window_best_count
;
320 int delays
[NBMODULES
];
322 unsigned char buf
[DFII_PIX_DATA_BYTES
];
326 err_ddrphy_wdly
= ERR_DDRPHY_DELAY
- ddrphy_half_sys8x_taps_read();
328 printf("Write leveling:\n");
332 for(i
=0;i
<NBMODULES
;i
++) {
338 /* scan write delay taps */
339 for(j
=0;j
<err_ddrphy_wdly
;j
++) {
346 for (k
=0; k
<128; k
++) {
347 ddrphy_wlevel_strobe_write(1);
349 csr_rd_buf_uint8(sdram_dfii_pix_rddata_addr
[0],
350 buf
, DFII_PIX_DATA_BYTES
);
351 if (buf
[NBMODULES
-1-i
] != 0)
356 if (one_count
> zero_count
)
361 printf("%d", taps_scan
[j
]);
367 /* find longer 1 window and set delay at the 0/1 transition */
368 one_window_active
= 0;
369 one_window_start
= 0;
370 one_window_count
= 0;
371 one_window_best_start
= 0;
372 one_window_best_count
= 0;
374 for(j
=0;j
<err_ddrphy_wdly
;j
++) {
375 if (one_window_active
) {
376 if ((taps_scan
[j
] == 0) | (j
== err_ddrphy_wdly
- 1)) {
377 one_window_active
= 0;
378 one_window_count
= j
- one_window_start
;
379 if (one_window_count
> one_window_best_count
) {
380 one_window_best_start
= one_window_start
;
381 one_window_best_count
= one_window_count
;
386 one_window_active
= 1;
387 one_window_start
= j
;
391 delays
[i
] = one_window_best_start
;
393 /* configure write delay */
395 for(j
=0; j
<delays
[i
]; j
++)
397 printf(" delay: %02d\n", delays
[i
]);
403 for(i
=NBMODULES
-1;i
>=0;i
--) {
411 #endif /* CSR_DDRPHY_WLEVEL_EN_ADDR */
413 static void read_delay_rst(int module
) {
415 ddrphy_dly_sel_write(1 << module
);
418 ddrphy_rdly_dq_rst_write(1);
421 ddrphy_dly_sel_write(0);
424 /* Sync all DQSBUFM's, By toggling all dly_sel (DQSBUFM.PAUSE) lines. */
425 ddrphy_dly_sel_write(0xFF);
426 ddrphy_dly_sel_write(0);
430 static void read_delay_inc(int module
) {
432 ddrphy_dly_sel_write(1 << module
);
435 ddrphy_rdly_dq_inc_write(1);
438 ddrphy_dly_sel_write(0);
441 /* Sync all DQSBUFM's, By toggling all dly_sel (DQSBUFM.PAUSE) lines. */
442 ddrphy_dly_sel_write(0xFF);
443 ddrphy_dly_sel_write(0);
447 static void read_bitslip_rst(char m
)
450 ddrphy_dly_sel_write(1 << m
);
453 ddrphy_rdly_dq_bitslip_rst_write(1);
456 ddrphy_dly_sel_write(0);
460 static void read_bitslip_inc(char m
)
463 ddrphy_dly_sel_write(1 << m
);
466 ddrphy_rdly_dq_bitslip_write(1);
469 ddrphy_dly_sel_write(0);
472 static int read_level_scan(int module
, int bitslip
)
475 unsigned char prs
[DFII_NPHASES
][DFII_PIX_DATA_BYTES
];
476 unsigned char tst
[DFII_PIX_DATA_BYTES
];
480 /* Generate pseudo-random sequence */
482 for(p
=0;p
<DFII_NPHASES
;p
++)
483 for(i
=0;i
<DFII_PIX_DATA_BYTES
;i
++) {
484 prv
= 1664525*prv
+ 1013904223;
489 sdram_dfii_pi0_address_write(0);
490 sdram_dfii_pi0_baddress_write(0);
491 command_p0(DFII_COMMAND_RAS
|DFII_COMMAND_CS
);
494 /* Write test pattern */
495 for(p
=0;p
<DFII_NPHASES
;p
++)
496 csr_wr_buf_uint8(sdram_dfii_pix_wrdata_addr
[p
],
497 prs
[p
], DFII_PIX_DATA_BYTES
);
498 sdram_dfii_piwr_address_write(0);
499 sdram_dfii_piwr_baddress_write(0);
500 command_pwr(DFII_COMMAND_CAS
|DFII_COMMAND_WE
|DFII_COMMAND_CS
|DFII_COMMAND_WRDATA
);
502 /* Calibrate each DQ in turn */
503 sdram_dfii_pird_address_write(0);
504 sdram_dfii_pird_baddress_write(0);
507 printf("m%d, b%d: |", module
, bitslip
);
508 read_delay_rst(module
);
509 for(i
=0;i
<ERR_DDRPHY_DELAY
;i
++) {
516 ddrphy_burstdet_clr_write(1);
518 command_prd(DFII_COMMAND_CAS
|DFII_COMMAND_CS
|DFII_COMMAND_RDDATA
);
520 for(p
=0;p
<DFII_NPHASES
;p
++) {
521 /* read back test pattern */
522 csr_rd_buf_uint8(sdram_dfii_pix_rddata_addr
[p
],
523 tst
, DFII_PIX_DATA_BYTES
);
524 /* verify bytes matching current 'module' */
525 if (prs
[p
][ NBMODULES
-1-module
] != tst
[ NBMODULES
-1-module
] ||
526 prs
[p
][2*NBMODULES
-1-module
] != tst
[2*NBMODULES
-1-module
])
530 if (((ddrphy_burstdet_seen_read() >> module
) & 0x1) != 1)
534 printf("%d", working
);
536 read_delay_inc(module
);
541 sdram_dfii_pi0_address_write(0);
542 sdram_dfii_pi0_baddress_write(0);
543 command_p0(DFII_COMMAND_RAS
|DFII_COMMAND_WE
|DFII_COMMAND_CS
);
549 static void read_level(int module
)
552 unsigned char prs
[DFII_NPHASES
][DFII_PIX_DATA_BYTES
];
553 unsigned char tst
[DFII_PIX_DATA_BYTES
];
556 int delay
, delay_min
, delay_max
;
560 /* Generate pseudo-random sequence */
562 for(p
=0;p
<DFII_NPHASES
;p
++)
563 for(i
=0;i
<DFII_PIX_DATA_BYTES
;i
++) {
564 prv
= 1664525*prv
+ 1013904223;
569 sdram_dfii_pi0_address_write(0);
570 sdram_dfii_pi0_baddress_write(0);
571 command_p0(DFII_COMMAND_RAS
|DFII_COMMAND_CS
);
574 /* Write test pattern */
575 for(p
=0;p
<DFII_NPHASES
;p
++)
576 csr_wr_buf_uint8(sdram_dfii_pix_wrdata_addr
[p
],
577 prs
[p
], DFII_PIX_DATA_BYTES
);
578 sdram_dfii_piwr_address_write(0);
579 sdram_dfii_piwr_baddress_write(0);
580 command_pwr(DFII_COMMAND_CAS
|DFII_COMMAND_WE
|DFII_COMMAND_CS
|DFII_COMMAND_WRDATA
);
582 /* Calibrate each DQ in turn */
583 sdram_dfii_pird_address_write(0);
584 sdram_dfii_pird_baddress_write(0);
586 /* Find smallest working delay */
588 read_delay_rst(module
);
591 ddrphy_burstdet_clr_write(1);
593 command_prd(DFII_COMMAND_CAS
|DFII_COMMAND_CS
|DFII_COMMAND_RDDATA
);
596 for(p
=0;p
<DFII_NPHASES
;p
++) {
597 /* read back test pattern */
598 csr_rd_buf_uint8(sdram_dfii_pix_rddata_addr
[p
],
599 tst
, DFII_PIX_DATA_BYTES
);
600 /* verify bytes matching current 'module' */
601 if (prs
[p
][ NBMODULES
-1-module
] != tst
[ NBMODULES
-1-module
] ||
602 prs
[p
][2*NBMODULES
-1-module
] != tst
[2*NBMODULES
-1-module
])
606 if (((ddrphy_burstdet_seen_read() >> module
) & 0x1) != 1)
612 if(delay
>= ERR_DDRPHY_DELAY
)
614 read_delay_inc(module
);
618 /* Get a bit further into the working zone */
622 read_delay_inc(module
);
626 read_delay_inc(module
);
629 /* Find largest working delay */
632 ddrphy_burstdet_clr_write(1);
634 command_prd(DFII_COMMAND_CAS
|DFII_COMMAND_CS
|DFII_COMMAND_RDDATA
);
637 for(p
=0;p
<DFII_NPHASES
;p
++) {
638 /* read back test pattern */
639 csr_rd_buf_uint8(sdram_dfii_pix_rddata_addr
[p
],
640 tst
, DFII_PIX_DATA_BYTES
);
641 /* verify bytes matching current 'module' */
642 if (prs
[p
][ NBMODULES
-1-module
] != tst
[ NBMODULES
-1-module
] ||
643 prs
[p
][2*NBMODULES
-1-module
] != tst
[2*NBMODULES
-1-module
])
647 if (((ddrphy_burstdet_seen_read() >> module
) & 0x1) != 1)
653 if(delay
>= ERR_DDRPHY_DELAY
)
655 read_delay_inc(module
);
659 if (delay_min
>= ERR_DDRPHY_DELAY
)
662 printf("%02d+-%02d", (delay_min
+delay_max
)/2, (delay_max
-delay_min
)/2);
664 /* Set delay to the middle */
665 read_delay_rst(module
);
666 for(i
=0;i
<(delay_min
+delay_max
)/2;i
++)
667 read_delay_inc(module
);
670 sdram_dfii_pi0_address_write(0);
671 sdram_dfii_pi0_baddress_write(0);
672 command_p0(DFII_COMMAND_RAS
|DFII_COMMAND_WE
|DFII_COMMAND_CS
);
675 #endif /* CSR_DDRPHY_BASE */
677 #endif /* CSR_SDRAM_BASE */
679 static unsigned int seed_to_data_32(unsigned int seed
, int random
)
682 return 1664525*seed
+ 1013904223;
687 static unsigned short seed_to_data_16(unsigned short seed
, int random
)
690 return 25173*seed
+ 13849;
695 #define ONEZERO 0xAAAAAAAA
696 #define ZEROONE 0x55555555
698 #ifndef MEMTEST_BUS_SIZE
699 #define MEMTEST_BUS_SIZE (512)
702 //#define MEMTEST_BUS_DEBUG
704 static int memtest_bus(void)
706 volatile unsigned int *array
= (unsigned int *)MAIN_RAM_BASE
;
712 for(i
=0;i
<MEMTEST_BUS_SIZE
/4;i
++) {
716 #ifdef CONFIG_L2_SIZE
719 for(i
=0;i
<MEMTEST_BUS_SIZE
/4;i
++) {
721 if(rdata
!= ONEZERO
) {
723 #ifdef MEMTEST_BUS_DEBUG
724 printf("[bus: 0x%0x]: 0x%08x vs 0x%08x\n", i
, rdata
, ONEZERO
);
729 for(i
=0;i
<MEMTEST_BUS_SIZE
/4;i
++) {
733 #ifdef CONFIG_L2_SIZE
736 for(i
=0;i
<MEMTEST_BUS_SIZE
/4;i
++) {
738 if(rdata
!= ZEROONE
) {
740 #ifdef MEMTEST_BUS_DEBUG
741 printf("[bus 0x%0x]: 0x%08x vs 0x%08x\n", i
, rdata
, ZEROONE
);
749 #ifndef MEMTEST_DATA_SIZE
750 #define MEMTEST_DATA_SIZE (2*1024*1024)
752 #define MEMTEST_DATA_RANDOM 1
754 //#define MEMTEST_DATA_DEBUG
756 static int memtest_data(void)
758 volatile unsigned int *array
= (unsigned int *)MAIN_RAM_BASE
;
760 unsigned int seed_32
;
766 for(i
=0;i
<MEMTEST_DATA_SIZE
/4;i
++) {
767 seed_32
= seed_to_data_32(seed_32
, MEMTEST_DATA_RANDOM
);
773 #ifdef CONFIG_L2_SIZE
776 for(i
=0;i
<MEMTEST_DATA_SIZE
/4;i
++) {
777 seed_32
= seed_to_data_32(seed_32
, MEMTEST_DATA_RANDOM
);
779 if(rdata
!= seed_32
) {
781 #ifdef MEMTEST_DATA_DEBUG
782 printf("[data 0x%0x]: 0x%08x vs 0x%08x\n", i
, rdata
, seed_32
);
789 #ifndef MEMTEST_ADDR_SIZE
790 #define MEMTEST_ADDR_SIZE (32*1024)
792 #define MEMTEST_ADDR_RANDOM 0
794 //#define MEMTEST_ADDR_DEBUG
796 static int memtest_addr(void)
798 volatile unsigned int *array
= (unsigned int *)MAIN_RAM_BASE
;
800 unsigned short seed_16
;
801 unsigned short rdata
;
806 for(i
=0;i
<MEMTEST_ADDR_SIZE
/4;i
++) {
807 seed_16
= seed_to_data_16(seed_16
, MEMTEST_ADDR_RANDOM
);
808 array
[(unsigned int) seed_16
] = i
;
813 #ifdef CONFIG_L2_SIZE
816 for(i
=0;i
<MEMTEST_ADDR_SIZE
/4;i
++) {
817 seed_16
= seed_to_data_16(seed_16
, MEMTEST_ADDR_RANDOM
);
818 rdata
= array
[(unsigned int) seed_16
];
821 #ifdef MEMTEST_ADDR_DEBUG
822 printf("[addr 0x%0x]: 0x%08x vs 0x%08x\n", i
, rdata
, i
);
830 static void memspeed(void)
832 volatile unsigned int *array
= (unsigned int *)MAIN_RAM_BASE
;
834 unsigned int start
, end
;
835 unsigned long write_speed
;
836 unsigned long read_speed
;
837 __attribute__((unused
)) unsigned int data
;
841 timer0_reload_write(0);
842 timer0_load_write(0xffffffff);
846 timer0_update_value_write(1);
847 start
= timer0_value_read();
848 for(i
=0;i
<MEMTEST_DATA_SIZE
/4;i
++) {
851 timer0_update_value_write(1);
852 end
= timer0_value_read();
853 write_speed
= (8*MEMTEST_DATA_SIZE
*(CONFIG_CLOCK_FREQUENCY
/1000000))/(start
- end
);
855 /* flush CPU and L2 caches */
857 #ifdef CONFIG_L2_SIZE
863 timer0_update_value_write(1);
864 start
= timer0_value_read();
865 for(i
=0;i
<MEMTEST_DATA_SIZE
/4;i
++) {
868 timer0_update_value_write(1);
869 end
= timer0_value_read();
870 read_speed
= (8*MEMTEST_DATA_SIZE
*(CONFIG_CLOCK_FREQUENCY
/1000000))/(start
- end
);
872 printf("Memspeed Writes: %dMbps Reads: %dMbps\n", write_speed
, read_speed
);
877 int bus_errors
, data_errors
, addr_errors
;
879 bus_errors
= memtest_bus();
881 printf("Memtest bus failed: %d/%d errors\n", bus_errors
, 2*128);
883 data_errors
= memtest_data();
885 printf("Memtest data failed: %d/%d errors\n", data_errors
, MEMTEST_DATA_SIZE
/4);
887 addr_errors
= memtest_addr();
889 printf("Memtest addr failed: %d/%d errors\n", addr_errors
, MEMTEST_ADDR_SIZE
/4);
891 if(bus_errors
+ data_errors
+ addr_errors
!= 0)
894 printf("Memtest OK\n");
900 #ifdef CSR_SDRAM_BASE
902 #ifdef CSR_DDRPHY_BASE
913 for(module
=0; module
<NBMODULES
; module
++) {
914 #ifdef CSR_DDRPHY_WLEVEL_EN_ADDR
915 write_delay_rst(module
);
917 read_delay_rst(module
);
918 read_bitslip_rst(module
);
921 #ifdef CSR_DDRPHY_WLEVEL_EN_ADDR
926 printf("Read leveling:\n");
927 for(module
=0; module
<NBMODULES
; module
++) {
928 /* scan possible read windows */
931 for(bitslip
=0; bitslip
<ERR_DDRPHY_BITSLIP
; bitslip
++) {
933 score
= read_level_scan(module
, bitslip
);
936 if (score
> best_score
) {
937 best_bitslip
= bitslip
;
941 if (bitslip
== ERR_DDRPHY_BITSLIP
-1)
943 /* increment bitslip */
944 read_bitslip_inc(module
);
947 /* select best read window */
948 printf("best: m%d, b%d ", module
, best_bitslip
);
949 read_bitslip_rst(module
);
950 for (bitslip
=0; bitslip
<best_bitslip
; bitslip
++)
951 read_bitslip_inc(module
);
953 /* re-do leveling on best read window*/
965 printf("Initializing SDRAM...\n");
967 #ifdef CSR_DDRCTRL_BASE
968 ddrctrl_init_done_write(0);
969 ddrctrl_init_error_write(0);
973 #ifdef CSR_DDRPHY_BASE
974 #if CSR_DDRPHY_EN_VTC_ADDR
975 ddrphy_en_vtc_write(0);
978 #if CSR_DDRPHY_EN_VTC_ADDR
979 ddrphy_en_vtc_write(1);
984 #ifdef CSR_DDRCTRL_BASE
985 ddrctrl_init_done_write(1);
986 ddrctrl_init_error_write(1);
990 #ifdef CSR_DDRCTRL_BASE
991 ddrctrl_init_done_write(1);