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");
21 #elif defined (__picorv32__)
22 __asm__
volatile("nop");
23 #elif defined (__vexriscv__)
24 __asm__
volatile("nop");
26 #error Unsupported architecture
34 sdram_dfii_control_write(DFII_CONTROL_CKE
|DFII_CONTROL_ODT
|DFII_CONTROL_RESET_N
);
35 printf("SDRAM now under software control\n");
40 sdram_dfii_control_write(DFII_CONTROL_SEL
);
41 printf("SDRAM now under hardware control\n");
44 void sdrrow(char *_row
)
50 sdram_dfii_pi0_address_write(0x0000);
51 sdram_dfii_pi0_baddress_write(0);
52 command_p0(DFII_COMMAND_RAS
|DFII_COMMAND_WE
|DFII_COMMAND_CS
);
54 printf("Precharged\n");
56 row
= strtoul(_row
, &c
, 0);
58 printf("incorrect row\n");
61 sdram_dfii_pi0_address_write(row
);
62 sdram_dfii_pi0_baddress_write(0);
63 command_p0(DFII_COMMAND_RAS
|DFII_COMMAND_CS
);
65 printf("Activated row %d\n", row
);
78 first_byte
= DFII_PIX_DATA_SIZE
/2 - 1 - dq
;
79 step
= DFII_PIX_DATA_SIZE
/2;
82 for(p
=0;p
<DFII_NPHASES
;p
++)
83 for(i
=first_byte
;i
<DFII_PIX_DATA_SIZE
;i
+=step
)
84 printf("%02x", MMPTR(sdram_dfii_pix_rddata_addr
[p
]+4*i
));
88 void sdrrd(char *startaddr
, char *dq
)
95 printf("sdrrd <address>\n");
98 addr
= strtoul(startaddr
, &c
, 0);
100 printf("incorrect address\n");
106 _dq
= strtoul(dq
, &c
, 0);
108 printf("incorrect DQ\n");
113 sdram_dfii_pird_address_write(addr
);
114 sdram_dfii_pird_baddress_write(0);
115 command_prd(DFII_COMMAND_CAS
|DFII_COMMAND_CS
|DFII_COMMAND_RDDATA
);
120 void sdrrderr(char *count
)
126 unsigned char prev_data
[DFII_NPHASES
*DFII_PIX_DATA_SIZE
];
127 unsigned char errs
[DFII_NPHASES
*DFII_PIX_DATA_SIZE
];
130 printf("sdrrderr <count>\n");
133 _count
= strtoul(count
, &c
, 0);
135 printf("incorrect count\n");
139 for(i
=0;i
<DFII_NPHASES
*DFII_PIX_DATA_SIZE
;i
++)
141 for(addr
=0;addr
<16;addr
++) {
142 sdram_dfii_pird_address_write(addr
*8);
143 sdram_dfii_pird_baddress_write(0);
144 command_prd(DFII_COMMAND_CAS
|DFII_COMMAND_CS
|DFII_COMMAND_RDDATA
);
146 for(p
=0;p
<DFII_NPHASES
;p
++)
147 for(i
=0;i
<DFII_PIX_DATA_SIZE
;i
++)
148 prev_data
[p
*DFII_PIX_DATA_SIZE
+i
] = MMPTR(sdram_dfii_pix_rddata_addr
[p
]+4*i
);
150 for(j
=0;j
<_count
;j
++) {
151 command_prd(DFII_COMMAND_CAS
|DFII_COMMAND_CS
|DFII_COMMAND_RDDATA
);
153 for(p
=0;p
<DFII_NPHASES
;p
++)
154 for(i
=0;i
<DFII_PIX_DATA_SIZE
;i
++) {
155 unsigned char new_data
;
157 new_data
= MMPTR(sdram_dfii_pix_rddata_addr
[p
]+4*i
);
158 errs
[p
*DFII_PIX_DATA_SIZE
+i
] |= prev_data
[p
*DFII_PIX_DATA_SIZE
+i
] ^ new_data
;
159 prev_data
[p
*DFII_PIX_DATA_SIZE
+i
] = new_data
;
164 for(i
=0;i
<DFII_NPHASES
*DFII_PIX_DATA_SIZE
;i
++)
165 printf("%02x", errs
[i
]);
167 for(p
=0;p
<DFII_NPHASES
;p
++)
168 for(i
=0;i
<DFII_PIX_DATA_SIZE
;i
++)
169 printf("%2x", DFII_PIX_DATA_SIZE
/2 - 1 - (i
% (DFII_PIX_DATA_SIZE
/2)));
173 void sdrwr(char *startaddr
)
180 if(*startaddr
== 0) {
181 printf("sdrrd <address>\n");
184 addr
= strtoul(startaddr
, &c
, 0);
186 printf("incorrect address\n");
190 for(p
=0;p
<DFII_NPHASES
;p
++)
191 for(i
=0;i
<DFII_PIX_DATA_SIZE
;i
++)
192 MMPTR(sdram_dfii_pix_wrdata_addr
[p
]+4*i
) = 0x10*p
+ i
;
194 sdram_dfii_piwr_address_write(addr
);
195 sdram_dfii_piwr_baddress_write(0);
196 command_pwr(DFII_COMMAND_CAS
|DFII_COMMAND_WE
|DFII_COMMAND_CS
|DFII_COMMAND_WRDATA
);
199 #ifdef CSR_DDRPHY_BASE
202 #define ERR_DDRPHY_DELAY 512
204 #define ERR_DDRPHY_DELAY 32
207 #ifdef CSR_DDRPHY_WLEVEL_EN_ADDR
211 sdram_dfii_pi0_address_write(DDR3_MR1
| (1 << 7));
212 sdram_dfii_pi0_baddress_write(1);
213 command_p0(DFII_COMMAND_RAS
|DFII_COMMAND_CAS
|DFII_COMMAND_WE
|DFII_COMMAND_CS
);
214 ddrphy_wlevel_en_write(1);
219 sdram_dfii_pi0_address_write(DDR3_MR1
);
220 sdram_dfii_pi0_baddress_write(1);
221 command_p0(DFII_COMMAND_RAS
|DFII_COMMAND_CAS
|DFII_COMMAND_WE
|DFII_COMMAND_CS
);
222 ddrphy_wlevel_en_write(0);
225 static void write_level_scan(void)
231 printf("Write leveling scan:\n");
235 for(i
=0;i
<DFII_PIX_DATA_SIZE
/2;i
++) {
237 dq_address
= sdram_dfii_pix_rddata_addr
[0]+4*(DFII_PIX_DATA_SIZE
/2-1-i
);
238 ddrphy_dly_sel_write(1 << i
);
239 ddrphy_wdly_dq_rst_write(1);
240 ddrphy_wdly_dqs_rst_write(1);
241 for(j
=0;j
<ERR_DDRPHY_DELAY
- ddrphy_half_sys8x_taps_read();j
++) {
242 ddrphy_wlevel_strobe_write(1);
244 dq
= MMPTR(dq_address
);
245 printf("%d", dq
!= 0);
246 ddrphy_wdly_dq_inc_write(1);
247 ddrphy_wdly_dqs_inc_write(1);
255 static int write_level(int *delay
, int *high_skew
)
263 err_ddrphy_wdly
= ERR_DDRPHY_DELAY
- ddrphy_half_sys8x_taps_read();
265 printf("Write leveling: ");
269 for(i
=0;i
<DFII_PIX_DATA_SIZE
/2;i
++) {
270 dq_address
= sdram_dfii_pix_rddata_addr
[0]+4*(DFII_PIX_DATA_SIZE
/2-1-i
);
271 ddrphy_dly_sel_write(1 << i
);
272 ddrphy_wdly_dq_rst_write(1);
273 ddrphy_wdly_dqs_rst_write(1);
274 #ifdef KUSDDRPHY /* Need to init manually on Ultrascale */
276 for(j
=0; j
<ddrphy_wdly_dqs_taps_read(); j
++)
277 ddrphy_wdly_dqs_inc_write(1);
282 ddrphy_wlevel_strobe_write(1);
284 dq
= MMPTR(dq_address
);
287 * Assume this DQ group has between 1 and 2 bit times of skew.
288 * Bring DQS into the CK=0 zone before continuing leveling.
290 #ifndef DDRPHY_HIGH_SKEW_DISABLE
294 if(delay
[i
] >= err_ddrphy_wdly
)
296 ddrphy_wdly_dq_inc_write(1);
297 ddrphy_wdly_dqs_inc_write(1);
298 ddrphy_wlevel_strobe_write(1);
300 dq
= MMPTR(dq_address
);
310 if(delay
[i
] >= err_ddrphy_wdly
)
312 ddrphy_wdly_dq_inc_write(1);
313 ddrphy_wdly_dqs_inc_write(1);
315 ddrphy_wlevel_strobe_write(1);
317 dq
= MMPTR(dq_address
);
323 for(i
=DFII_PIX_DATA_SIZE
/2-1;i
>=0;i
--) {
324 printf("%2d%c ", delay
[i
], high_skew
[i
] ? '*' : ' ');
325 if(delay
[i
] >= err_ddrphy_wdly
)
330 printf("completed\n");
337 #endif /* CSR_DDRPHY_WLEVEL_EN_ADDR */
339 static void read_bitslip_inc(char m
)
341 ddrphy_dly_sel_write(1 << m
);
343 ddrphy_rdly_dq_bitslip_write(1);
345 /* 7-series SERDES in DDR mode needs 3 pulses for 1 bitslip */
346 ddrphy_rdly_dq_bitslip_write(1);
347 ddrphy_rdly_dq_bitslip_write(1);
348 ddrphy_rdly_dq_bitslip_write(1);
352 static void read_bitslip(int *delay
, int *high_skew
)
357 bitslip_thr
= 0x7fffffff;
358 for(i
=0;i
<DFII_PIX_DATA_SIZE
/2;i
++)
359 if(high_skew
[i
] && (delay
[i
] < bitslip_thr
))
360 bitslip_thr
= delay
[i
];
361 if(bitslip_thr
== 0x7fffffff)
363 bitslip_thr
= bitslip_thr
/2;
365 printf("Read bitslip: ");
366 for(i
=DFII_PIX_DATA_SIZE
/2-1;i
>=0;i
--)
367 if(delay
[i
] > bitslip_thr
) {
374 static int read_level_scan(int silent
)
377 unsigned char prs
[DFII_NPHASES
*DFII_PIX_DATA_SIZE
];
384 printf("Read delays scan:\n");
386 /* Generate pseudo-random sequence */
388 for(i
=0;i
<DFII_NPHASES
*DFII_PIX_DATA_SIZE
;i
++) {
389 prv
= 1664525*prv
+ 1013904223;
394 sdram_dfii_pi0_address_write(0);
395 sdram_dfii_pi0_baddress_write(0);
396 command_p0(DFII_COMMAND_RAS
|DFII_COMMAND_CS
);
399 /* Write test pattern */
400 for(p
=0;p
<DFII_NPHASES
;p
++)
401 for(i
=0;i
<DFII_PIX_DATA_SIZE
;i
++)
402 MMPTR(sdram_dfii_pix_wrdata_addr
[p
]+4*i
) = prs
[DFII_PIX_DATA_SIZE
*p
+i
];
403 sdram_dfii_piwr_address_write(0);
404 sdram_dfii_piwr_baddress_write(0);
405 command_pwr(DFII_COMMAND_CAS
|DFII_COMMAND_WE
|DFII_COMMAND_CS
|DFII_COMMAND_WRDATA
);
407 /* Calibrate each DQ in turn */
408 sdram_dfii_pird_address_write(0);
409 sdram_dfii_pird_baddress_write(0);
413 for(i
=DFII_PIX_DATA_SIZE
/2-1;i
>=0;i
--) {
415 printf("m%d: ", (DFII_PIX_DATA_SIZE
/2-i
-1));
416 ddrphy_dly_sel_write(1 << (DFII_PIX_DATA_SIZE
/2-i
-1));
417 ddrphy_rdly_dq_rst_write(1);
418 for(j
=0; j
<ERR_DDRPHY_DELAY
;j
++) {
420 command_prd(DFII_COMMAND_CAS
|DFII_COMMAND_CS
|DFII_COMMAND_RDDATA
);
423 for(p
=0;p
<DFII_NPHASES
;p
++) {
424 if(MMPTR(sdram_dfii_pix_rddata_addr
[p
]+4*i
) != prs
[DFII_PIX_DATA_SIZE
*p
+i
])
426 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])
429 working
|= working_delay
;
430 working_delays
+= working_delay
;
431 if ((j
== 0) || (j
== (ERR_DDRPHY_DELAY
-1)))
432 /* to have an optimal scan, first tap and last tap should not be working */
433 optimal
&= (working_delay
== 0);
435 printf("%d", working_delay
);
436 ddrphy_rdly_dq_inc_write(1);
443 sdram_dfii_pi0_address_write(0);
444 sdram_dfii_pi0_baddress_write(0);
445 command_p0(DFII_COMMAND_RAS
|DFII_COMMAND_WE
|DFII_COMMAND_CS
);
448 /* Successful if working and optimal or if number of working delays > 3/4 of the taps */
449 return (working
& optimal
) | (working_delays
> 3*ERR_DDRPHY_DELAY
/4);
452 static void read_level(void)
455 unsigned char prs
[DFII_NPHASES
*DFII_PIX_DATA_SIZE
];
458 int delay
, delay_min
, delay_max
;
460 printf("Read delays: ");
462 /* Generate pseudo-random sequence */
464 for(i
=0;i
<DFII_NPHASES
*DFII_PIX_DATA_SIZE
;i
++) {
465 prv
= 1664525*prv
+ 1013904223;
470 sdram_dfii_pi0_address_write(0);
471 sdram_dfii_pi0_baddress_write(0);
472 command_p0(DFII_COMMAND_RAS
|DFII_COMMAND_CS
);
475 /* Write test pattern */
476 for(p
=0;p
<DFII_NPHASES
;p
++)
477 for(i
=0;i
<DFII_PIX_DATA_SIZE
;i
++)
478 MMPTR(sdram_dfii_pix_wrdata_addr
[p
]+4*i
) = prs
[DFII_PIX_DATA_SIZE
*p
+i
];
479 sdram_dfii_piwr_address_write(0);
480 sdram_dfii_piwr_baddress_write(0);
481 command_pwr(DFII_COMMAND_CAS
|DFII_COMMAND_WE
|DFII_COMMAND_CS
|DFII_COMMAND_WRDATA
);
483 /* Calibrate each DQ in turn */
484 sdram_dfii_pird_address_write(0);
485 sdram_dfii_pird_baddress_write(0);
486 for(i
=0;i
<DFII_PIX_DATA_SIZE
/2;i
++) {
487 ddrphy_dly_sel_write(1 << (DFII_PIX_DATA_SIZE
/2-i
-1));
490 /* Find smallest working delay */
491 ddrphy_rdly_dq_rst_write(1);
493 command_prd(DFII_COMMAND_CAS
|DFII_COMMAND_CS
|DFII_COMMAND_RDDATA
);
496 for(p
=0;p
<DFII_NPHASES
;p
++) {
497 if(MMPTR(sdram_dfii_pix_rddata_addr
[p
]+4*i
) != prs
[DFII_PIX_DATA_SIZE
*p
+i
])
499 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])
505 if(delay
>= ERR_DDRPHY_DELAY
)
507 ddrphy_rdly_dq_inc_write(1);
511 /* Get a bit further into the working zone */
515 ddrphy_rdly_dq_inc_write(1);
519 ddrphy_rdly_dq_inc_write(1);
522 /* Find largest working delay */
524 command_prd(DFII_COMMAND_CAS
|DFII_COMMAND_CS
|DFII_COMMAND_RDDATA
);
527 for(p
=0;p
<DFII_NPHASES
;p
++) {
528 if(MMPTR(sdram_dfii_pix_rddata_addr
[p
]+4*i
) != prs
[DFII_PIX_DATA_SIZE
*p
+i
])
530 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])
536 if(delay
>= ERR_DDRPHY_DELAY
)
538 ddrphy_rdly_dq_inc_write(1);
542 printf("%d:%02d-%02d ", DFII_PIX_DATA_SIZE
/2-i
-1, delay_min
, delay_max
);
544 /* Set delay to the middle */
545 ddrphy_rdly_dq_rst_write(1);
546 for(j
=0;j
<(delay_min
+delay_max
)/2;j
++)
547 ddrphy_rdly_dq_inc_write(1);
551 sdram_dfii_pi0_address_write(0);
552 sdram_dfii_pi0_baddress_write(0);
553 command_p0(DFII_COMMAND_RAS
|DFII_COMMAND_WE
|DFII_COMMAND_CS
);
556 printf("completed\n");
558 #endif /* CSR_DDRPHY_BASE */
560 static unsigned int seed_to_data_32(unsigned int seed
, int random
)
563 return 1664525*seed
+ 1013904223;
568 static unsigned short seed_to_data_16(unsigned short seed
, int random
)
571 return 25173*seed
+ 13849;
576 #define ONEZERO 0xAAAAAAAA
577 #define ZEROONE 0x55555555
579 #ifndef MEMTEST_BUS_SIZE
580 #define MEMTEST_BUS_SIZE (512)
583 //#define MEMTEST_BUS_DEBUG
585 static int memtest_bus(void)
587 volatile unsigned int *array
= (unsigned int *)MAIN_RAM_BASE
;
593 for(i
=0;i
<MEMTEST_BUS_SIZE
/4;i
++) {
598 for(i
=0;i
<MEMTEST_BUS_SIZE
/4;i
++) {
600 if(rdata
!= ONEZERO
) {
602 #ifdef MEMTEST_BUS_DEBUG
603 printf("[bus: %0x]: %08x vs %08x\n", i
, rdata
, ONEZERO
);
608 for(i
=0;i
<MEMTEST_BUS_SIZE
/4;i
++) {
613 for(i
=0;i
<MEMTEST_BUS_SIZE
/4;i
++) {
615 if(rdata
!= ZEROONE
) {
617 #ifdef MEMTEST_BUS_DEBUG
618 printf("[bus %0x]: %08x vs %08x\n", i
, rdata
, ZEROONE
);
626 #ifndef MEMTEST_DATA_SIZE
627 #define MEMTEST_DATA_SIZE (2*1024*1024)
629 #define MEMTEST_DATA_RANDOM 1
631 //#define MEMTEST_DATA_DEBUG
633 static int memtest_data(void)
635 volatile unsigned int *array
= (unsigned int *)MAIN_RAM_BASE
;
637 unsigned int seed_32
;
643 for(i
=0;i
<MEMTEST_DATA_SIZE
/4;i
++) {
644 seed_32
= seed_to_data_32(seed_32
, MEMTEST_DATA_RANDOM
);
651 for(i
=0;i
<MEMTEST_DATA_SIZE
/4;i
++) {
652 seed_32
= seed_to_data_32(seed_32
, MEMTEST_DATA_RANDOM
);
654 if(rdata
!= seed_32
) {
656 #ifdef MEMTEST_DATA_DEBUG
657 printf("[data %0x]: %08x vs %08x\n", i
, rdata
, seed_32
);
664 #ifndef MEMTEST_ADDR_SIZE
665 #define MEMTEST_ADDR_SIZE (32*1024)
667 #define MEMTEST_ADDR_RANDOM 0
669 //#define MEMTEST_ADDR_DEBUG
671 static int memtest_addr(void)
673 volatile unsigned int *array
= (unsigned int *)MAIN_RAM_BASE
;
675 unsigned short seed_16
;
676 unsigned short rdata
;
681 for(i
=0;i
<MEMTEST_ADDR_SIZE
/4;i
++) {
682 seed_16
= seed_to_data_16(seed_16
, MEMTEST_ADDR_RANDOM
);
683 array
[(unsigned int) seed_16
] = i
;
689 for(i
=0;i
<MEMTEST_ADDR_SIZE
/4;i
++) {
690 seed_16
= seed_to_data_16(seed_16
, MEMTEST_ADDR_RANDOM
);
691 rdata
= array
[(unsigned int) seed_16
];
694 #ifdef MEMTEST_ADDR_DEBUG
695 printf("[addr %0x]: %08x vs %08x\n", i
, rdata
, i
);
705 int bus_errors
, data_errors
, addr_errors
;
707 bus_errors
= memtest_bus();
709 printf("Memtest bus failed: %d/%d errors\n", bus_errors
, 2*128);
711 data_errors
= memtest_data();
713 printf("Memtest data failed: %d/%d errors\n", data_errors
, MEMTEST_DATA_SIZE
/4);
715 addr_errors
= memtest_addr();
717 printf("Memtest addr failed: %d/%d errors\n", addr_errors
, MEMTEST_ADDR_SIZE
/4);
719 if(bus_errors
+ data_errors
+ addr_errors
!= 0)
722 printf("Memtest OK\n");
727 #ifdef CSR_DDRPHY_BASE
730 int delay
[DFII_PIX_DATA_SIZE
/2];
731 int high_skew
[DFII_PIX_DATA_SIZE
/2];
734 for(i
=0; i
<DFII_PIX_DATA_SIZE
/2; i
++) {
735 ddrphy_dly_sel_write(1<<i
);
736 ddrphy_rdly_dq_rst_write(1);
737 ddrphy_rdly_dq_bitslip_rst_write(1);
740 #ifndef CSR_DDRPHY_WLEVEL_EN_ADDR
741 for(i
=0; i
<DFII_PIX_DATA_SIZE
/2; i
++) {
747 if(!write_level(delay
, high_skew
))
750 /* check for optimal read leveling window */
752 if (read_level_scan(1)) {
755 /* else increment bitslip and re-scan */
756 for(j
=0; j
<DFII_PIX_DATA_SIZE
/2; j
++)
760 /* show bitslip and scan */
761 printf("Read bitslip: %d\n", i
);
771 printf("Initializing SDRAM...\n");
774 #ifdef CSR_DDRPHY_BASE
775 #if CSR_DDRPHY_EN_VTC_ADDR
776 ddrphy_en_vtc_write(0);
779 #if CSR_DDRPHY_EN_VTC_ADDR
780 ddrphy_en_vtc_write(1);
783 sdram_dfii_control_write(DFII_CONTROL_SEL
);