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 static unsigned int seed_to_data_32(unsigned int seed
, int random
)
429 return 1664525*seed
+ 1013904223;
434 static unsigned short seed_to_data_16(unsigned short seed
, int random
)
437 return 25173*seed
+ 13849;
442 #define ONEZERO 0xAAAAAAAA
443 #define ZEROONE 0x55555555
445 #ifndef MEMTEST_BUS_SIZE
446 #define MEMTEST_BUS_SIZE (512)
449 static int memtest_bus(void)
451 volatile unsigned int *array
= (unsigned int *)MAIN_RAM_BASE
;
456 for(i
=0;i
<MEMTEST_BUS_SIZE
/4;i
++) {
461 for(i
=0;i
<MEMTEST_BUS_SIZE
/4;i
++) {
462 if(array
[i
] != ONEZERO
)
466 for(i
=0;i
<MEMTEST_BUS_SIZE
/4;i
++) {
471 for(i
=0;i
<MEMTEST_BUS_SIZE
/4;i
++) {
472 if(array
[i
] != ZEROONE
)
479 #ifndef MEMTEST_DATA_SIZE
480 #define MEMTEST_DATA_SIZE (2*1024*1024)
482 #define MEMTEST_DATA_RANDOM 1
484 static int memtest_data(void)
486 volatile unsigned int *array
= (unsigned int *)MAIN_RAM_BASE
;
488 unsigned int seed_32
;
493 for(i
=0;i
<MEMTEST_DATA_SIZE
/4;i
++) {
494 seed_32
= seed_to_data_32(seed_32
, MEMTEST_DATA_RANDOM
);
501 for(i
=0;i
<MEMTEST_DATA_SIZE
/4;i
++) {
502 seed_32
= seed_to_data_32(seed_32
, MEMTEST_DATA_RANDOM
);
503 if(array
[i
] != seed_32
)
509 #ifndef MEMTEST_ADDR_SIZE
510 #define MEMTEST_ADDR_SIZE (32*1024)
512 #define MEMTEST_ADDR_RANDOM 0
514 static int memtest_addr(void)
516 volatile unsigned int *array
= (unsigned int *)MAIN_RAM_BASE
;
518 unsigned short seed_16
;
523 for(i
=0;i
<MEMTEST_ADDR_SIZE
/4;i
++) {
524 seed_16
= seed_to_data_16(seed_16
, MEMTEST_ADDR_RANDOM
);
525 array
[(unsigned int) seed_16
] = i
;
531 for(i
=0;i
<MEMTEST_ADDR_SIZE
/4;i
++) {
532 seed_16
= seed_to_data_16(seed_16
, MEMTEST_ADDR_RANDOM
);
533 if(array
[(unsigned int) seed_16
] != i
)
542 int bus_errors
, data_errors
, addr_errors
;
544 bus_errors
= memtest_bus();
546 printf("Memtest bus failed: %d/%d errors\n", bus_errors
, 2*128);
548 data_errors
= memtest_data();
550 printf("Memtest data failed: %d/%d errors\n", data_errors
, MEMTEST_DATA_SIZE
/4);
552 addr_errors
= memtest_addr();
554 printf("Memtest addr failed: %d/%d errors\n", addr_errors
, MEMTEST_ADDR_SIZE
/4);
556 if(bus_errors
+ data_errors
+ addr_errors
!= 0)
559 printf("Memtest OK\n");
566 printf("Initializing SDRAM...\n");
569 #ifdef CSR_DDRPHY_BASE
573 sdram_dfii_control_write(DFII_CONTROL_SEL
);