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");
48 #error Unsupported architecture
56 #define DFII_ADDR_SHIFT CONFIG_CSR_ALIGNMENT/8
60 sdram_dfii_control_write(DFII_CONTROL_CKE
|DFII_CONTROL_ODT
|DFII_CONTROL_RESET_N
);
61 printf("SDRAM now under software control\n");
66 sdram_dfii_control_write(DFII_CONTROL_SEL
);
67 printf("SDRAM now under hardware control\n");
70 void sdrrow(char *_row
)
76 sdram_dfii_pi0_address_write(0x0000);
77 sdram_dfii_pi0_baddress_write(0);
78 command_p0(DFII_COMMAND_RAS
|DFII_COMMAND_WE
|DFII_COMMAND_CS
);
80 printf("Precharged\n");
82 row
= strtoul(_row
, &c
, 0);
84 printf("incorrect row\n");
87 sdram_dfii_pi0_address_write(row
);
88 sdram_dfii_pi0_baddress_write(0);
89 command_p0(DFII_COMMAND_RAS
|DFII_COMMAND_CS
);
91 printf("Activated row %d\n", row
);
104 first_byte
= DFII_PIX_DATA_SIZE
/2 - 1 - dq
;
105 step
= DFII_PIX_DATA_SIZE
/2;
108 for(p
=0;p
<DFII_NPHASES
;p
++)
109 for(i
=first_byte
;i
<DFII_PIX_DATA_SIZE
;i
+=step
)
110 printf("%02x", MMPTR(sdram_dfii_pix_rddata_addr
[p
]+DFII_ADDR_SHIFT
*i
));
114 void sdrrd(char *startaddr
, char *dq
)
120 if(*startaddr
== 0) {
121 printf("sdrrd <address>\n");
124 addr
= strtoul(startaddr
, &c
, 0);
126 printf("incorrect address\n");
132 _dq
= strtoul(dq
, &c
, 0);
134 printf("incorrect DQ\n");
139 sdram_dfii_pird_address_write(addr
);
140 sdram_dfii_pird_baddress_write(0);
141 command_prd(DFII_COMMAND_CAS
|DFII_COMMAND_CS
|DFII_COMMAND_RDDATA
);
146 void sdrrderr(char *count
)
152 unsigned char prev_data
[DFII_NPHASES
*DFII_PIX_DATA_SIZE
];
153 unsigned char errs
[DFII_NPHASES
*DFII_PIX_DATA_SIZE
];
156 printf("sdrrderr <count>\n");
159 _count
= strtoul(count
, &c
, 0);
161 printf("incorrect count\n");
165 for(i
=0;i
<DFII_NPHASES
*DFII_PIX_DATA_SIZE
;i
++)
167 for(addr
=0;addr
<16;addr
++) {
168 sdram_dfii_pird_address_write(addr
*8);
169 sdram_dfii_pird_baddress_write(0);
170 command_prd(DFII_COMMAND_CAS
|DFII_COMMAND_CS
|DFII_COMMAND_RDDATA
);
172 for(p
=0;p
<DFII_NPHASES
;p
++)
173 for(i
=0;i
<DFII_PIX_DATA_SIZE
;i
++)
174 prev_data
[p
*DFII_PIX_DATA_SIZE
+i
] = MMPTR(sdram_dfii_pix_rddata_addr
[p
]+DFII_ADDR_SHIFT
*i
);
176 for(j
=0;j
<_count
;j
++) {
177 command_prd(DFII_COMMAND_CAS
|DFII_COMMAND_CS
|DFII_COMMAND_RDDATA
);
179 for(p
=0;p
<DFII_NPHASES
;p
++)
180 for(i
=0;i
<DFII_PIX_DATA_SIZE
;i
++) {
181 unsigned char new_data
;
183 new_data
= MMPTR(sdram_dfii_pix_rddata_addr
[p
]+DFII_ADDR_SHIFT
*i
);
184 errs
[p
*DFII_PIX_DATA_SIZE
+i
] |= prev_data
[p
*DFII_PIX_DATA_SIZE
+i
] ^ new_data
;
185 prev_data
[p
*DFII_PIX_DATA_SIZE
+i
] = new_data
;
190 for(i
=0;i
<DFII_NPHASES
*DFII_PIX_DATA_SIZE
;i
++)
191 printf("%02x", errs
[i
]);
193 for(p
=0;p
<DFII_NPHASES
;p
++)
194 for(i
=0;i
<DFII_PIX_DATA_SIZE
;i
++)
195 printf("%2x", DFII_PIX_DATA_SIZE
/2 - 1 - (i
% (DFII_PIX_DATA_SIZE
/2)));
199 void sdrwr(char *startaddr
)
206 if(*startaddr
== 0) {
207 printf("sdrrd <address>\n");
210 addr
= strtoul(startaddr
, &c
, 0);
212 printf("incorrect address\n");
216 for(p
=0;p
<DFII_NPHASES
;p
++)
217 for(i
=0;i
<DFII_PIX_DATA_SIZE
;i
++)
218 MMPTR(sdram_dfii_pix_wrdata_addr
[p
]+DFII_ADDR_SHIFT
*i
) = 0x10*p
+ i
;
220 sdram_dfii_piwr_address_write(addr
);
221 sdram_dfii_piwr_baddress_write(0);
222 command_pwr(DFII_COMMAND_CAS
|DFII_COMMAND_WE
|DFII_COMMAND_CS
|DFII_COMMAND_WRDATA
);
225 #ifdef CSR_DDRPHY_BASE
227 #if defined (USDDRPHY)
228 #define ERR_DDRPHY_DELAY 512
229 #define ERR_DDRPHY_BITSLIP 8
230 #define NBMODULES DFII_PIX_DATA_SIZE/2
231 #elif defined (ECP5DDRPHY)
232 #define ERR_DDRPHY_DELAY 8
233 #define ERR_DDRPHY_BITSLIP 1
234 #define NBMODULES DFII_PIX_DATA_SIZE/4
236 #define ERR_DDRPHY_DELAY 32
237 #define ERR_DDRPHY_BITSLIP 8
238 #define NBMODULES DFII_PIX_DATA_SIZE/2
241 #ifdef CSR_DDRPHY_WLEVEL_EN_ADDR
245 sdram_dfii_pi0_address_write(DDRX_MR1
| (1 << 7));
246 sdram_dfii_pi0_baddress_write(1);
247 command_p0(DFII_COMMAND_RAS
|DFII_COMMAND_CAS
|DFII_COMMAND_WE
|DFII_COMMAND_CS
);
248 ddrphy_wlevel_en_write(1);
253 sdram_dfii_pi0_address_write(DDRX_MR1
);
254 sdram_dfii_pi0_baddress_write(1);
255 command_p0(DFII_COMMAND_RAS
|DFII_COMMAND_CAS
|DFII_COMMAND_WE
|DFII_COMMAND_CS
);
256 ddrphy_wlevel_en_write(0);
259 static void write_delay_rst(int module
) {
265 ddrphy_dly_sel_write(1 << module
);
268 ddrphy_wdly_dq_rst_write(1);
269 ddrphy_wdly_dqs_rst_write(1);
270 #ifdef USDDRPHY /* need to init manually on Ultrascale */
271 for(i
=0; i
<ddrphy_half_sys8x_taps_read(); i
++)
272 ddrphy_wdly_dqs_inc_write(1);
276 ddrphy_dly_sel_write(0);
279 static void write_delay_inc(int module
) {
281 ddrphy_dly_sel_write(1 << module
);
284 ddrphy_wdly_dq_inc_write(1);
285 ddrphy_wdly_dqs_inc_write(1);
288 ddrphy_dly_sel_write(0);
291 int write_level(void)
300 unsigned char taps_scan
[ERR_DDRPHY_DELAY
];
302 int one_window_active
;
303 int one_window_start
, one_window_best_start
;
304 int one_window_count
, one_window_best_count
;
306 int delays
[NBMODULES
];
310 err_ddrphy_wdly
= ERR_DDRPHY_DELAY
- ddrphy_half_sys8x_taps_read();
312 printf("Write leveling:\n");
316 for(i
=0;i
<NBMODULES
;i
++) {
318 dq_address
= sdram_dfii_pix_rddata_addr
[0]+DFII_ADDR_SHIFT
*(NBMODULES
-1-i
);
323 /* scan write delay taps */
324 for(j
=0;j
<err_ddrphy_wdly
;j
++) {
331 for (k
=0; k
<128; k
++) {
332 ddrphy_wlevel_strobe_write(1);
334 dq
= MMPTR(dq_address
);
340 if (one_count
> zero_count
)
345 printf("%d", taps_scan
[j
]);
351 /* find longer 1 window and set delay at the 0/1 transition */
352 one_window_active
= 0;
353 one_window_start
= 0;
354 one_window_count
= 0;
355 one_window_best_start
= 0;
356 one_window_best_count
= 0;
358 for(j
=0;j
<err_ddrphy_wdly
;j
++) {
359 if (one_window_active
) {
360 if ((taps_scan
[j
] == 0) | (j
== err_ddrphy_wdly
- 1)) {
361 one_window_active
= 0;
362 one_window_count
= j
- one_window_start
;
363 if (one_window_count
> one_window_best_count
) {
364 one_window_best_start
= one_window_start
;
365 one_window_best_count
= one_window_count
;
370 one_window_active
= 1;
371 one_window_start
= j
;
375 delays
[i
] = one_window_best_start
;
377 /* configure write delay */
379 for(j
=0; j
<delays
[i
]; j
++)
381 printf(" delay: %02d\n", delays
[i
]);
387 for(i
=NBMODULES
-1;i
>=0;i
--) {
395 #endif /* CSR_DDRPHY_WLEVEL_EN_ADDR */
397 static void read_delay_rst(int module
) {
399 ddrphy_dly_sel_write(1 << module
);
402 ddrphy_rdly_dq_rst_write(1);
405 ddrphy_dly_sel_write(0);
408 static void read_delay_inc(int module
) {
410 ddrphy_dly_sel_write(1 << module
);
413 ddrphy_rdly_dq_inc_write(1);
416 ddrphy_dly_sel_write(0);
419 static void read_bitslip_rst(char m
)
422 ddrphy_dly_sel_write(1 << m
);
425 ddrphy_rdly_dq_bitslip_rst_write(1);
428 ddrphy_dly_sel_write(0);
432 static void read_bitslip_inc(char m
)
435 ddrphy_dly_sel_write(1 << m
);
438 ddrphy_rdly_dq_bitslip_write(1);
441 ddrphy_dly_sel_write(0);
444 static int read_level_scan(int module
, int bitslip
)
447 unsigned char prs
[DFII_NPHASES
*DFII_PIX_DATA_SIZE
];
451 /* Generate pseudo-random sequence */
453 for(i
=0;i
<DFII_NPHASES
*DFII_PIX_DATA_SIZE
;i
++) {
454 prv
= 1664525*prv
+ 1013904223;
459 sdram_dfii_pi0_address_write(0);
460 sdram_dfii_pi0_baddress_write(0);
461 command_p0(DFII_COMMAND_RAS
|DFII_COMMAND_CS
);
464 /* Write test pattern */
465 for(p
=0;p
<DFII_NPHASES
;p
++)
466 for(i
=0;i
<DFII_PIX_DATA_SIZE
;i
++)
467 MMPTR(sdram_dfii_pix_wrdata_addr
[p
]+DFII_ADDR_SHIFT
*i
) = prs
[DFII_PIX_DATA_SIZE
*p
+i
];
468 sdram_dfii_piwr_address_write(0);
469 sdram_dfii_piwr_baddress_write(0);
470 command_pwr(DFII_COMMAND_CAS
|DFII_COMMAND_WE
|DFII_COMMAND_CS
|DFII_COMMAND_WRDATA
);
472 /* Calibrate each DQ in turn */
473 sdram_dfii_pird_address_write(0);
474 sdram_dfii_pird_baddress_write(0);
477 printf("m%d, b%d: |", module
, bitslip
);
478 read_delay_rst(module
);
479 for(j
=0; j
<ERR_DDRPHY_DELAY
;j
++) {
486 ddrphy_burstdet_clr_write(1);
488 command_prd(DFII_COMMAND_CAS
|DFII_COMMAND_CS
|DFII_COMMAND_RDDATA
);
491 for(p
=0;p
<DFII_NPHASES
;p
++) {
492 if(MMPTR(sdram_dfii_pix_rddata_addr
[p
]+DFII_ADDR_SHIFT
*(NBMODULES
-module
-1)) != prs
[DFII_PIX_DATA_SIZE
*p
+(NBMODULES
-module
-1)])
494 if(MMPTR(sdram_dfii_pix_rddata_addr
[p
]+DFII_ADDR_SHIFT
*(2*NBMODULES
-module
-1)) != prs
[DFII_PIX_DATA_SIZE
*p
+2*NBMODULES
-module
-1])
498 if (((ddrphy_burstdet_seen_read() >> module
) & 0x1) != 1)
502 printf("%d", working
);
504 read_delay_inc(module
);
509 sdram_dfii_pi0_address_write(0);
510 sdram_dfii_pi0_baddress_write(0);
511 command_p0(DFII_COMMAND_RAS
|DFII_COMMAND_WE
|DFII_COMMAND_CS
);
517 static void read_level(int module
)
520 unsigned char prs
[DFII_NPHASES
*DFII_PIX_DATA_SIZE
];
523 int delay
, delay_min
, delay_max
;
527 /* Generate pseudo-random sequence */
529 for(i
=0;i
<DFII_NPHASES
*DFII_PIX_DATA_SIZE
;i
++) {
530 prv
= 1664525*prv
+ 1013904223;
535 sdram_dfii_pi0_address_write(0);
536 sdram_dfii_pi0_baddress_write(0);
537 command_p0(DFII_COMMAND_RAS
|DFII_COMMAND_CS
);
540 /* Write test pattern */
541 for(p
=0;p
<DFII_NPHASES
;p
++)
542 for(i
=0;i
<DFII_PIX_DATA_SIZE
;i
++)
543 MMPTR(sdram_dfii_pix_wrdata_addr
[p
]+DFII_ADDR_SHIFT
*i
) = prs
[DFII_PIX_DATA_SIZE
*p
+i
];
544 sdram_dfii_piwr_address_write(0);
545 sdram_dfii_piwr_baddress_write(0);
546 command_pwr(DFII_COMMAND_CAS
|DFII_COMMAND_WE
|DFII_COMMAND_CS
|DFII_COMMAND_WRDATA
);
548 /* Calibrate each DQ in turn */
549 sdram_dfii_pird_address_write(0);
550 sdram_dfii_pird_baddress_write(0);
552 /* Find smallest working delay */
554 read_delay_rst(module
);
557 ddrphy_burstdet_clr_write(1);
559 command_prd(DFII_COMMAND_CAS
|DFII_COMMAND_CS
|DFII_COMMAND_RDDATA
);
562 for(p
=0;p
<DFII_NPHASES
;p
++) {
563 if(MMPTR(sdram_dfii_pix_rddata_addr
[p
]+DFII_ADDR_SHIFT
*(NBMODULES
-module
-1)) != prs
[DFII_PIX_DATA_SIZE
*p
+(NBMODULES
-module
-1)])
565 if(MMPTR(sdram_dfii_pix_rddata_addr
[p
]+DFII_ADDR_SHIFT
*(2*NBMODULES
-module
-1)) != prs
[DFII_PIX_DATA_SIZE
*p
+2*NBMODULES
-module
-1])
569 if (((ddrphy_burstdet_seen_read() >> module
) & 0x1) != 1)
575 if(delay
>= ERR_DDRPHY_DELAY
)
577 read_delay_inc(module
);
581 /* Get a bit further into the working zone */
585 read_delay_inc(module
);
589 read_delay_inc(module
);
592 /* Find largest working delay */
595 ddrphy_burstdet_clr_write(1);
597 command_prd(DFII_COMMAND_CAS
|DFII_COMMAND_CS
|DFII_COMMAND_RDDATA
);
600 for(p
=0;p
<DFII_NPHASES
;p
++) {
601 if(MMPTR(sdram_dfii_pix_rddata_addr
[p
]+DFII_ADDR_SHIFT
*(NBMODULES
-module
-1)) != prs
[DFII_PIX_DATA_SIZE
*p
+(NBMODULES
-module
-1)])
603 if(MMPTR(sdram_dfii_pix_rddata_addr
[p
]+DFII_ADDR_SHIFT
*(2*NBMODULES
-module
-1)) != prs
[DFII_PIX_DATA_SIZE
*p
+2*NBMODULES
-module
-1])
607 if (((ddrphy_burstdet_seen_read() >> module
) & 0x1) != 1)
613 if(delay
>= ERR_DDRPHY_DELAY
)
615 read_delay_inc(module
);
619 if (delay_min
>= ERR_DDRPHY_DELAY
)
622 printf("%02d+-%02d", (delay_min
+delay_max
)/2, (delay_max
-delay_min
)/2);
624 /* Set delay to the middle */
625 read_delay_rst(module
);
626 for(j
=0;j
<(delay_min
+delay_max
)/2;j
++)
627 read_delay_inc(module
);
630 sdram_dfii_pi0_address_write(0);
631 sdram_dfii_pi0_baddress_write(0);
632 command_p0(DFII_COMMAND_RAS
|DFII_COMMAND_WE
|DFII_COMMAND_CS
);
635 #endif /* CSR_DDRPHY_BASE */
637 #endif /* CSR_SDRAM_BASE */
639 static unsigned int seed_to_data_32(unsigned int seed
, int random
)
642 return 1664525*seed
+ 1013904223;
647 static unsigned short seed_to_data_16(unsigned short seed
, int random
)
650 return 25173*seed
+ 13849;
655 #define ONEZERO 0xAAAAAAAA
656 #define ZEROONE 0x55555555
658 #ifndef MEMTEST_BUS_SIZE
659 #define MEMTEST_BUS_SIZE (512)
662 //#define MEMTEST_BUS_DEBUG
664 static int memtest_bus(void)
666 volatile unsigned int *array
= (unsigned int *)MAIN_RAM_BASE
;
672 for(i
=0;i
<MEMTEST_BUS_SIZE
/4;i
++) {
676 #ifdef CONFIG_L2_SIZE
679 for(i
=0;i
<MEMTEST_BUS_SIZE
/4;i
++) {
681 if(rdata
!= ONEZERO
) {
683 #ifdef MEMTEST_BUS_DEBUG
684 printf("[bus: 0x%0x]: 0x%08x vs 0x%08x\n", i
, rdata
, ONEZERO
);
689 for(i
=0;i
<MEMTEST_BUS_SIZE
/4;i
++) {
693 #ifdef CONFIG_L2_SIZE
696 for(i
=0;i
<MEMTEST_BUS_SIZE
/4;i
++) {
698 if(rdata
!= ZEROONE
) {
700 #ifdef MEMTEST_BUS_DEBUG
701 printf("[bus 0x%0x]: 0x%08x vs 0x%08x\n", i
, rdata
, ZEROONE
);
709 #ifndef MEMTEST_DATA_SIZE
710 #define MEMTEST_DATA_SIZE (2*1024*1024)
712 #define MEMTEST_DATA_RANDOM 1
714 //#define MEMTEST_DATA_DEBUG
716 static int memtest_data(void)
718 volatile unsigned int *array
= (unsigned int *)MAIN_RAM_BASE
;
720 unsigned int seed_32
;
726 for(i
=0;i
<MEMTEST_DATA_SIZE
/4;i
++) {
727 seed_32
= seed_to_data_32(seed_32
, MEMTEST_DATA_RANDOM
);
733 #ifdef CONFIG_L2_SIZE
736 for(i
=0;i
<MEMTEST_DATA_SIZE
/4;i
++) {
737 seed_32
= seed_to_data_32(seed_32
, MEMTEST_DATA_RANDOM
);
739 if(rdata
!= seed_32
) {
741 #ifdef MEMTEST_DATA_DEBUG
742 printf("[data 0x%0x]: 0x%08x vs 0x%08x\n", i
, rdata
, seed_32
);
749 #ifndef MEMTEST_ADDR_SIZE
750 #define MEMTEST_ADDR_SIZE (32*1024)
752 #define MEMTEST_ADDR_RANDOM 0
754 //#define MEMTEST_ADDR_DEBUG
756 static int memtest_addr(void)
758 volatile unsigned int *array
= (unsigned int *)MAIN_RAM_BASE
;
760 unsigned short seed_16
;
761 unsigned short rdata
;
766 for(i
=0;i
<MEMTEST_ADDR_SIZE
/4;i
++) {
767 seed_16
= seed_to_data_16(seed_16
, MEMTEST_ADDR_RANDOM
);
768 array
[(unsigned int) seed_16
] = i
;
773 #ifdef CONFIG_L2_SIZE
776 for(i
=0;i
<MEMTEST_ADDR_SIZE
/4;i
++) {
777 seed_16
= seed_to_data_16(seed_16
, MEMTEST_ADDR_RANDOM
);
778 rdata
= array
[(unsigned int) seed_16
];
781 #ifdef MEMTEST_ADDR_DEBUG
782 printf("[addr 0x%0x]: 0x%08x vs 0x%08x\n", i
, rdata
, i
);
792 int bus_errors
, data_errors
, addr_errors
;
794 bus_errors
= memtest_bus();
796 printf("Memtest bus failed: %d/%d errors\n", bus_errors
, 2*128);
798 data_errors
= memtest_data();
800 printf("Memtest data failed: %d/%d errors\n", data_errors
, MEMTEST_DATA_SIZE
/4);
802 addr_errors
= memtest_addr();
804 printf("Memtest addr failed: %d/%d errors\n", addr_errors
, MEMTEST_ADDR_SIZE
/4);
806 if(bus_errors
+ data_errors
+ addr_errors
!= 0)
809 printf("Memtest OK\n");
814 #ifdef CSR_SDRAM_BASE
816 #ifdef CSR_DDRPHY_BASE
827 for(module
=0; module
<NBMODULES
; module
++) {
828 #ifdef CSR_DDRPHY_WLEVEL_EN_ADDR
829 write_delay_rst(module
);
831 read_delay_rst(module
);
832 read_bitslip_rst(module
);
835 #ifdef CSR_DDRPHY_WLEVEL_EN_ADDR
840 printf("Read leveling:\n");
841 for(module
=0; module
<NBMODULES
; module
++) {
842 /* scan possible read windows */
845 for(bitslip
=0; bitslip
<ERR_DDRPHY_BITSLIP
; bitslip
++) {
847 score
= read_level_scan(module
, bitslip
);
850 if (score
> best_score
) {
851 best_bitslip
= bitslip
;
855 if (bitslip
== ERR_DDRPHY_BITSLIP
-1)
857 /* increment bitslip */
858 read_bitslip_inc(module
);
861 /* select best read window */
862 printf("best: m%d, b%d ", module
, best_bitslip
);
863 read_bitslip_rst(module
);
864 for (bitslip
=0; bitslip
<best_bitslip
; bitslip
++)
865 read_bitslip_inc(module
);
867 /* re-do leveling on best read window*/
878 printf("Initializing SDRAM...\n");
880 #ifdef CSR_DDRCTRL_BASE
881 ddrctrl_init_done_write(0);
882 ddrctrl_init_error_write(0);
886 #ifdef CSR_DDRPHY_BASE
887 #if CSR_DDRPHY_EN_VTC_ADDR
888 ddrphy_en_vtc_write(0);
891 #if CSR_DDRPHY_EN_VTC_ADDR
892 ddrphy_en_vtc_write(1);
897 #ifdef CSR_DDRCTRL_BASE
898 ddrctrl_init_done_write(1);
899 ddrctrl_init_error_write(1);
903 #ifdef CSR_DDRCTRL_BASE
904 ddrctrl_init_done_write(1);