2 * Copyright (C) Marvell International Ltd. and its affiliates
4 * SPDX-License-Identifier: GPL-2.0
11 #include <asm/arch/cpu.h>
12 #include <asm/arch/soc.h>
14 #include "ddr3_hw_training.h"
19 #define DEBUG_WL_C(s, d, l) \
20 DEBUG_WL_S(s); DEBUG_WL_D(d, l); DEBUG_WL_S("\n")
21 #define DEBUG_WL_FULL_C(s, d, l) \
22 DEBUG_WL_FULL_S(s); DEBUG_WL_FULL_D(d, l); DEBUG_WL_FULL_S("\n")
25 #define DEBUG_RL_S(s) \
26 debug_cond(ddr3_get_log_level() >= MV_LOG_LEVEL_2, "%s", s)
27 #define DEBUG_RL_D(d, l) \
28 debug_cond(ddr3_get_log_level() >= MV_LOG_LEVEL_2, "%x", d)
31 #define DEBUG_WL_D(d, l)
34 #ifdef MV_DEBUG_WL_FULL
35 #define DEBUG_WL_FULL_S(s) puts(s)
36 #define DEBUG_WL_FULL_D(d, l) printf("%x", d)
38 #define DEBUG_WL_FULL_S(s)
39 #define DEBUG_WL_FULL_D(d, l)
42 #define WL_SUP_EXPECTED_DATA 0x21
43 #define WL_SUP_READ_DRAM_ENTRY 0x8
45 static int ddr3_write_leveling_single_cs(u32 cs
, u32 freq
, int ratio_2to1
,
47 MV_DRAM_INFO
*dram_info
);
48 static void ddr3_write_ctrl_pup_reg(int bc_acc
, u32 pup
, u32 reg_addr
,
51 extern u16 odt_static
[ODT_OPT
][MAX_CS
];
52 extern u16 odt_dynamic
[ODT_OPT
][MAX_CS
];
53 extern u32 wl_sup_pattern
[LEN_WL_SUP_PATTERN
];
56 * Name: ddr3_write_leveling_hw
57 * Desc: Execute Write leveling phase by HW
58 * Args: freq - current sequence frequency
59 * dram_info - main struct
61 * Returns: MV_OK if success, MV_FAIL if fail.
63 int ddr3_write_leveling_hw(u32 freq
, MV_DRAM_INFO
*dram_info
)
65 u32 reg
, phase
, delay
, cs
, pup
;
69 /* Debug message - Start Read leveling procedure */
70 DEBUG_WL_S("DDR3 - Write Leveling - Starting HW WL procedure\n");
73 /* Dynamic pad issue (BTS669) during WL */
74 reg
= reg_read(REG_DUNIT_CTRL_LOW_ADDR
);
75 if (reg
& (1 << REG_DUNIT_CTRL_LOW_DPDE_OFFS
)) {
77 reg_write(REG_DUNIT_CTRL_LOW_ADDR
,
78 reg
& ~(1 << REG_DUNIT_CTRL_LOW_DPDE_OFFS
));
82 reg
= 1 << REG_DRAM_TRAINING_WL_OFFS
;
83 /* Config the retest number */
84 reg
|= (COUNT_HW_WL
<< REG_DRAM_TRAINING_RETEST_OFFS
);
85 reg
|= (dram_info
->cs_ena
<< (REG_DRAM_TRAINING_CS_OFFS
));
86 reg_write(REG_DRAM_TRAINING_ADDR
, reg
); /* 0x15B0 - Training Register */
88 reg
= reg_read(REG_DRAM_TRAINING_SHADOW_ADDR
) |
89 (1 << REG_DRAM_TRAINING_AUTO_OFFS
);
90 reg_write(REG_DRAM_TRAINING_SHADOW_ADDR
, reg
);
94 reg
= reg_read(REG_DRAM_TRAINING_SHADOW_ADDR
) &
95 (1 << REG_DRAM_TRAINING_AUTO_OFFS
);
96 } while (reg
); /* Wait for '0' */
98 reg
= reg_read(REG_DRAM_TRAINING_ADDR
);
99 /* Check if Successful */
100 if (reg
& (1 << REG_DRAM_TRAINING_ERROR_OFFS
)) {
102 * Read results to arrays - Results are required for WL
103 * High freq Supplement and DQS Centralization
105 for (cs
= 0; cs
< MAX_CS
; cs
++) {
106 if (dram_info
->cs_ena
& (1 << cs
)) {
108 pup
< dram_info
->num_of_total_pups
;
110 if (pup
== dram_info
->num_of_std_pups
111 && dram_info
->ecc_ena
)
114 ddr3_read_pup_reg(PUP_WL_MODE
, cs
,
117 (reg
>> REG_PHY_PHASE_OFFS
) &
119 delay
= reg
& PUP_DELAY_MASK
;
120 dram_info
->wl_val
[cs
][pup
][P
] = phase
;
121 dram_info
->wl_val
[cs
][pup
][D
] = delay
;
122 dram_info
->wl_val
[cs
][pup
][S
] =
123 WL_HI_FREQ_STATE
- 1;
125 ddr3_read_pup_reg(PUP_WL_MODE
+ 0x1,
127 dram_info
->wl_val
[cs
][pup
][DQS
] =
132 /* Debug message - Print res for cs[i]: cs,PUP,Phase,Delay */
133 DEBUG_WL_S("DDR3 - Write Leveling - Write Leveling Cs - ");
134 DEBUG_WL_D((u32
) cs
, 1);
135 DEBUG_WL_S(" Results:\n");
137 pup
< dram_info
->num_of_total_pups
;
139 if (pup
== dram_info
->num_of_std_pups
140 && dram_info
->ecc_ena
)
142 DEBUG_WL_S("DDR3 - Write Leveling - PUP: ");
143 DEBUG_WL_D((u32
) pup
, 1);
144 DEBUG_WL_S(", Phase: ");
146 dram_info
->wl_val
[cs
][pup
]
148 DEBUG_WL_S(", Delay: ");
150 dram_info
->wl_val
[cs
][pup
]
158 /* Dynamic pad issue (BTS669) during WL */
161 reg
= reg_read(REG_DUNIT_CTRL_LOW_ADDR
) |
162 (1 << REG_DUNIT_CTRL_LOW_DPDE_OFFS
);
163 reg_write(REG_DUNIT_CTRL_LOW_ADDR
, reg
);
167 DEBUG_WL_S("DDR3 - Write Leveling - HW WL Ended Successfully\n");
171 DEBUG_WL_S("DDR3 - Write Leveling - HW WL Error\n");
177 * Name: ddr3_wl_supplement
178 * Desc: Write Leveling Supplement
179 * Args: dram_info - main struct
181 * Returns: MV_OK if success, MV_FAIL if fail.
183 int ddr3_wl_supplement(MV_DRAM_INFO
*dram_info
)
185 u32 cs
, cnt
, pup_num
, sum
, phase
, delay
, max_pup_num
, pup
, sdram_offset
;
186 u32 tmp_count
, ecc
, reg
;
187 u32 ddr_width
, tmp_pup
, idx
;
188 u32 sdram_pup_val
, uj
;
189 u32 one_clk_err
= 0, align_err
= 0, no_err
= 0, err
= 0, err_n
= 0;
190 u32 sdram_data
[LEN_WL_SUP_PATTERN
] __aligned(32) = { 0 };
192 ddr_width
= dram_info
->ddr_width
;
195 DEBUG_WL_S("DDR3 - Write Leveling Hi-Freq Supplement - Starting\n");
198 /* Data error from pos-adge to pos-adge */
212 DEBUG_WL_S("Error - bus width!!!\n");
216 /* Enable SW override */
217 reg
= reg_read(REG_DRAM_TRAINING_2_ADDR
) |
218 (1 << REG_DRAM_TRAINING_2_SW_OVRD_OFFS
);
220 /* [0] = 1 - Enable SW override */
221 /* 0x15B8 - Training SW 2 Register */
222 reg_write(REG_DRAM_TRAINING_2_ADDR
, reg
);
223 DEBUG_WL_S("DDR3 - Write Leveling Hi-Freq Supplement - SW Override Enabled\n");
224 reg
= (1 << REG_DRAM_TRAINING_AUTO_OFFS
);
225 reg_write(REG_DRAM_TRAINING_ADDR
, reg
); /* 0x15B0 - Training Register */
227 for (cs
= 0; cs
< MAX_CS
; cs
++) {
228 if (dram_info
->cs_ena
& (1 << cs
)) {
231 * 2 iterations loop: 1)actual WL results 2) fix WL
234 for (cnt
= 0; cnt
< COUNT_WL_HI_FREQ
; cnt
++) {
235 DEBUG_WL_C("COUNT = ", cnt
, 1);
236 for (ecc
= 0; ecc
< (dram_info
->ecc_ena
+ 1);
239 DEBUG_WL_S("ECC PUP:\n");
241 DEBUG_WL_S("DATA PUP:\n");
245 dram_info
->num_of_std_pups
* (1 -
248 /* ECC Support - Switch ECC Mux on ecc=1 */
250 (reg_read(REG_DRAM_TRAINING_2_ADDR
)
252 REG_DRAM_TRAINING_2_ECC_MUX_OFFS
));
254 (dram_info
->ecc_ena
*
256 REG_DRAM_TRAINING_2_ECC_MUX_OFFS
);
257 reg_write(REG_DRAM_TRAINING_2_ADDR
,
259 ddr3_reset_phy_read_fifo();
261 /* Write to memory */
263 tmp_count
* (SDRAM_CS_SIZE
+ 1) +
265 if (MV_OK
!= ddr3_dram_sram_burst((u32
)
271 /* Read from memory */
273 ddr3_dram_sram_burst(sdram_offset
,
279 /* Print the buffer */
280 for (uj
= 0; uj
< LEN_WL_SUP_PATTERN
;
282 if ((uj
% 4 == 0) && (uj
!= 0)) {
285 DEBUG_WL_D(sdram_data
[uj
],
290 /* Check pup which DQS/DATA is error */
291 for (pup
= 0; pup
< max_pup_num
; pup
++) {
292 /* ECC support - bit 8 */
293 pup_num
= (ecc
) ? ECC_PUP
: pup
;
294 if (pup
< 4) { /* lower 32 bit */
297 WL_SUP_READ_DRAM_ENTRY
;
298 } else { /* higher 32 bit */
301 WL_SUP_READ_DRAM_ENTRY
304 DEBUG_WL_S("\nCS: ");
305 DEBUG_WL_D((u32
) cs
, 1);
306 DEBUG_WL_S(" PUP: ");
307 DEBUG_WL_D((u32
) pup_num
, 1);
311 ((tmp_pup
) * 8)) & 0xFF);
312 DEBUG_WL_C("Actual Data = ",
314 DEBUG_WL_C("Expected Data = ",
315 (WL_SUP_EXPECTED_DATA
318 * ALINGHMENT: calculate
319 * expected data vs actual data
322 (WL_SUP_EXPECTED_DATA
+
323 pup
) - sdram_pup_val
;
325 * CLOCK LONG: calculate
326 * expected data vs actual data
330 (WL_SUP_EXPECTED_DATA
+
332 DEBUG_WL_C("err = ", err
, 2);
333 DEBUG_WL_C("err_n = ", err_n
,
336 /* PUP is correct - increment State */
337 dram_info
->wl_val
[cs
]
340 } else if (err_n
== one_clk_err
) {
341 /* clock is longer than DQS */
348 dram_info
->wl_val
[cs
]
355 DEBUG_WL_S("#### Clock is longer than DQS more than one clk cycle ####\n");
361 } else if (err
== align_err
) {
362 /* clock is align to DQS */
371 DEBUG_WL_S("#### Alignment PUPS problem ####\n");
376 DEBUG_WL_S("#### Warning - Possible Layout Violation (DQS is longer than CLK)####\n");
381 dram_info
->wl_val
[cs
]
384 dram_info
->wl_val
[cs
]
393 /* Stop condition for ECC phase */
394 pup
= (ecc
) ? max_pup_num
: pup
;
397 /* ECC Support - Disable ECC MUX */
399 (reg_read(REG_DRAM_TRAINING_2_ADDR
)
401 REG_DRAM_TRAINING_2_ECC_MUX_OFFS
));
402 reg_write(REG_DRAM_TRAINING_2_ADDR
,
407 for (pup
= 0; pup
< dram_info
->num_of_std_pups
; pup
++)
408 sum
+= dram_info
->wl_val
[cs
][pup
][S
];
410 if (dram_info
->ecc_ena
)
411 sum
+= dram_info
->wl_val
[cs
][ECC_PUP
][S
];
413 /* Checks if any pup is not locked after the change */
414 if (sum
< (WL_HI_FREQ_STATE
* (dram_info
->num_of_total_pups
))) {
415 DEBUG_WL_C("DDR3 - Write Leveling Hi-Freq Supplement - didn't work for Cs - ",
423 dram_info
->wl_max_phase
= 0;
424 dram_info
->wl_min_phase
= 10;
427 * Read results to arrays - Results are required for DQS Centralization
429 for (cs
= 0; cs
< MAX_CS
; cs
++) {
430 if (dram_info
->cs_ena
& (1 << cs
)) {
431 for (pup
= 0; pup
< dram_info
->num_of_total_pups
; pup
++) {
432 if (pup
== dram_info
->num_of_std_pups
433 && dram_info
->ecc_ena
)
435 reg
= ddr3_read_pup_reg(PUP_WL_MODE
, cs
, pup
);
437 (reg
>> REG_PHY_PHASE_OFFS
) &
439 if (phase
> dram_info
->wl_max_phase
)
440 dram_info
->wl_max_phase
= phase
;
441 if (phase
< dram_info
->wl_min_phase
)
442 dram_info
->wl_min_phase
= phase
;
447 /* Disable SW override - Must be in a different stage */
448 /* [0]=0 - Enable SW override */
449 reg
= reg_read(REG_DRAM_TRAINING_2_ADDR
);
450 reg
&= ~(1 << REG_DRAM_TRAINING_2_SW_OVRD_OFFS
);
451 /* 0x15B8 - Training SW 2 Register */
452 reg_write(REG_DRAM_TRAINING_2_ADDR
, reg
);
454 reg
= reg_read(REG_DRAM_TRAINING_1_ADDR
) |
455 (1 << REG_DRAM_TRAINING_1_TRNBPOINT_OFFS
);
456 reg_write(REG_DRAM_TRAINING_1_ADDR
, reg
);
458 DEBUG_WL_S("DDR3 - Write Leveling Hi-Freq Supplement - Ended Successfully\n");
464 * Name: ddr3_write_leveling_hw_reg_dimm
465 * Desc: Execute Write leveling phase by HW
466 * Args: freq - current sequence frequency
467 * dram_info - main struct
469 * Returns: MV_OK if success, MV_FAIL if fail.
471 int ddr3_write_leveling_hw_reg_dimm(u32 freq
, MV_DRAM_INFO
*dram_info
)
473 u32 reg
, phase
, delay
, cs
, pup
, pup_num
;
474 __maybe_unused
int dpde_flag
= 0;
476 /* Debug message - Start Read leveling procedure */
477 DEBUG_WL_S("DDR3 - Write Leveling - Starting HW WL procedure\n");
479 if (dram_info
->num_cs
> 2) {
480 DEBUG_WL_S("DDR3 - Write Leveling - HW WL Ended Successfully\n");
484 /* If target freq = 400 move clock start point */
485 /* Write to control PUP to Control Deskew Regs */
486 if (freq
<= DDR_400
) {
487 for (pup
= 0; pup
<= dram_info
->num_of_total_pups
; pup
++) {
488 /* PUP_DELAY_MASK 0x1F */
489 /* reg = 0x0C10001F + (uj << 16); */
490 ddr3_write_ctrl_pup_reg(1, pup
, CNTRL_PUP_DESKEW
+ pup
,
496 /* Dynamic pad issue (BTS669) during WL */
497 reg
= reg_read(REG_DUNIT_CTRL_LOW_ADDR
);
498 if (reg
& (1 << REG_DUNIT_CTRL_LOW_DPDE_OFFS
)) {
500 reg_write(REG_DUNIT_CTRL_LOW_ADDR
,
501 reg
& ~(1 << REG_DUNIT_CTRL_LOW_DPDE_OFFS
));
505 reg
= (1 << REG_DRAM_TRAINING_WL_OFFS
);
506 /* Config the retest number */
507 reg
|= (COUNT_HW_WL
<< REG_DRAM_TRAINING_RETEST_OFFS
);
508 reg
|= (dram_info
->cs_ena
<< (REG_DRAM_TRAINING_CS_OFFS
));
509 reg_write(REG_DRAM_TRAINING_ADDR
, reg
); /* 0x15B0 - Training Register */
511 reg
= reg_read(REG_DRAM_TRAINING_SHADOW_ADDR
) |
512 (1 << REG_DRAM_TRAINING_AUTO_OFFS
);
513 reg_write(REG_DRAM_TRAINING_SHADOW_ADDR
, reg
);
517 reg
= reg_read(REG_DRAM_TRAINING_SHADOW_ADDR
) &
518 (1 << REG_DRAM_TRAINING_AUTO_OFFS
);
519 } while (reg
); /* Wait for '0' */
521 reg
= reg_read(REG_DRAM_TRAINING_ADDR
);
522 /* Check if Successful */
523 if (reg
& (1 << REG_DRAM_TRAINING_ERROR_OFFS
)) {
525 * Read results to arrays - Results are required for WL High
526 * freq Supplement and DQS Centralization
528 for (cs
= 0; cs
< MAX_CS
; cs
++) {
529 if (dram_info
->cs_ena
& (1 << cs
)) {
531 pup
< dram_info
->num_of_total_pups
;
533 if (pup
== dram_info
->num_of_std_pups
534 && dram_info
->ecc_ena
)
537 ddr3_read_pup_reg(PUP_WL_MODE
, cs
,
540 (reg
>> REG_PHY_PHASE_OFFS
) &
542 delay
= reg
& PUP_DELAY_MASK
;
543 dram_info
->wl_val
[cs
][pup
][P
] = phase
;
544 dram_info
->wl_val
[cs
][pup
][D
] = delay
;
545 if ((phase
== 1) && (delay
>= 0x1D)) {
547 * Need to do it here for
548 * uncorrect WL values
550 ddr3_write_pup_reg(PUP_WL_MODE
,
553 dram_info
->wl_val
[cs
][pup
][P
] =
555 dram_info
->wl_val
[cs
][pup
][D
] =
558 dram_info
->wl_val
[cs
][pup
][S
] =
559 WL_HI_FREQ_STATE
- 1;
561 ddr3_read_pup_reg(PUP_WL_MODE
+ 0x1,
563 dram_info
->wl_val
[cs
][pup
][DQS
] =
568 * Debug message - Print res for cs[i]:
571 DEBUG_WL_S("DDR3 - Write Leveling - Write Leveling Cs - ");
572 DEBUG_WL_D((u32
) cs
, 1);
573 DEBUG_WL_S(" Results:\n");
575 pup
< dram_info
->num_of_total_pups
;
578 ("DDR3 - Write Leveling - PUP: ");
579 DEBUG_WL_D((u32
) pup
, 1);
580 DEBUG_WL_S(", Phase: ");
582 dram_info
->wl_val
[cs
][pup
]
584 DEBUG_WL_S(", Delay: ");
586 dram_info
->wl_val
[cs
][pup
]
595 /* Dynamic pad issue (BTS669) during WL */
597 reg
= reg_read(REG_DUNIT_CTRL_LOW_ADDR
) |
598 (1 << REG_DUNIT_CTRL_LOW_DPDE_OFFS
);
599 reg_write(REG_DUNIT_CTRL_LOW_ADDR
, reg
);
602 DEBUG_WL_S("DDR3 - Write Leveling - HW WL Ended Successfully\n");
604 /* If target freq = 400 move clock back */
605 /* Write to control PUP to Control Deskew Regs */
606 if (freq
<= DDR_400
) {
607 for (pup
= 0; pup
<= dram_info
->num_of_total_pups
;
609 ddr3_write_ctrl_pup_reg(1, pup
,
610 CNTRL_PUP_DESKEW
+ pup
, 0);
616 /* Configure Each PUP with locked leveling settings */
617 for (cs
= 0; cs
< MAX_CS
; cs
++) {
618 if (dram_info
->cs_ena
& (1 << cs
)) {
620 pup
< dram_info
->num_of_total_pups
;
622 /* ECC support - bit 8 */
623 pup_num
= (pup
== dram_info
->num_of_std_pups
) ?
625 ddr3_write_pup_reg(PUP_WL_MODE
, cs
,
631 reg_write(REG_DRAM_TRAINING_ADDR
, 0);
633 /* If target freq = 400 move clock back */
634 /* Write to control PUP to Control Deskew Regs */
635 if (freq
<= DDR_400
) {
636 for (pup
= 0; pup
<= dram_info
->num_of_total_pups
;
638 ddr3_write_ctrl_pup_reg(1, pup
,
639 CNTRL_PUP_DESKEW
+ pup
, 0);
643 DEBUG_WL_S("DDR3 - Write Leveling - HW WL Ended Successfully\n");
649 * Name: ddr3_write_leveling_sw
650 * Desc: Execute Write leveling phase by SW
651 * Args: freq - current sequence frequency
652 * dram_info - main struct
654 * Returns: MV_OK if success, MV_FAIL if fail.
656 int ddr3_write_leveling_sw(u32 freq
, int ratio_2to1
, MV_DRAM_INFO
*dram_info
)
658 u32 reg
, cs
, cnt
, pup
, max_pup_num
;
660 max_pup_num
= dram_info
->num_of_total_pups
;
661 __maybe_unused
int dpde_flag
= 0;
663 /* Debug message - Start Write leveling procedure */
664 DEBUG_WL_S("DDR3 - Write Leveling - Starting SW WL procedure\n");
667 /* Dynamic pad issue (BTS669) during WL */
668 reg
= reg_read(REG_DUNIT_CTRL_LOW_ADDR
);
669 if (reg
& (1 << REG_DUNIT_CTRL_LOW_DPDE_OFFS
)) {
671 reg_write(REG_DUNIT_CTRL_LOW_ADDR
,
672 reg
& ~(1 << REG_DUNIT_CTRL_LOW_DPDE_OFFS
));
676 /* Set Output buffer-off to all CS and correct ODT values */
677 for (cs
= 0; cs
< MAX_CS
; cs
++) {
678 if (dram_info
->cs_ena
& (1 << cs
)) {
679 reg
= reg_read(REG_DDR3_MR1_ADDR
) &
680 REG_DDR3_MR1_ODT_MASK
;
681 reg
|= odt_static
[dram_info
->cs_ena
][cs
];
682 reg
|= (1 << REG_DDR3_MR1_OUTBUF_DIS_OFFS
);
684 /* 0x15D0 - DDR3 MR0 Register */
685 reg_write(REG_DDR3_MR1_ADDR
, reg
);
686 /* Issue MRS Command to current cs */
687 reg
= REG_SDRAM_OPERATION_CMD_MR1
&
688 ~(1 << (REG_SDRAM_OPERATION_CS_OFFS
+ cs
));
690 * [3-0] = 0x4 - MR1 Command, [11-8] -
693 /* 0x1418 - SDRAM Operation Register */
694 reg_write(REG_SDRAM_OPERATION_ADDR
, reg
);
700 DEBUG_WL_FULL_S("DDR3 - Write Leveling - Qoff and RTT Values are set for all Cs\n");
702 /* Enable SW override */
703 reg
= reg_read(REG_DRAM_TRAINING_2_ADDR
) |
704 (1 << REG_DRAM_TRAINING_2_SW_OVRD_OFFS
);
705 /* [0] = 1 - Enable SW override */
706 /* 0x15B8 - Training SW 2 Register */
707 reg_write(REG_DRAM_TRAINING_2_ADDR
, reg
);
708 DEBUG_WL_FULL_S("DDR3 - Write Leveling - SW Override Enabled\n");
710 /* Enable PHY write leveling mode */
711 reg
= reg_read(REG_DRAM_TRAINING_2_ADDR
) &
712 ~(1 << REG_DRAM_TRAINING_2_WL_MODE_OFFS
);
713 /* [2] = 0 - TrnWLMode - Enable */
714 /* 0x15B8 - Training SW 2 Register */
715 reg_write(REG_DRAM_TRAINING_2_ADDR
, reg
);
716 /* Reset WL results arry */
717 memset(dram_info
->wl_val
, 0, sizeof(u32
) * MAX_CS
* MAX_PUP_NUM
* 7);
719 /* Loop for each cs */
720 for (cs
= 0; cs
< MAX_CS
; cs
++) {
721 if (dram_info
->cs_ena
& (1 << cs
)) {
722 DEBUG_WL_FULL_C("DDR3 - Write Leveling - Starting working with Cs - ",
724 /* Refresh X9 current cs */
725 DEBUG_WL_FULL_S("DDR3 - Write Leveling - Refresh X9\n");
726 for (cnt
= 0; cnt
< COUNT_WL_RFRS
; cnt
++) {
728 REG_SDRAM_OPERATION_CMD_RFRS
& ~(1 <<
729 (REG_SDRAM_OPERATION_CS_OFFS
731 /* [3-0] = 0x2 - refresh, [11-8] - enable current cs */
732 reg_write(REG_SDRAM_OPERATION_ADDR
, reg
); /* 0x1418 - SDRAM Operation Register */
737 (REG_SDRAM_OPERATION_ADDR
)) &
738 REG_SDRAM_OPERATION_CMD_RFRS_DONE
);
739 } while (reg
); /* Wait for '0' */
742 /* Configure MR1 in Cs[CsNum] - write leveling on, output buffer on */
743 DEBUG_WL_FULL_S("DDR3 - Write Leveling - Configure MR1 for current Cs: WL-on,OB-on\n");
744 reg
= reg_read(REG_DDR3_MR1_ADDR
) &
745 REG_DDR3_MR1_OUTBUF_WL_MASK
;
747 reg
&= REG_DDR3_MR1_ODT_MASK
;
748 reg
|= odt_static
[dram_info
->cs_ena
][cs
];
750 reg
|= (1 << REG_DDR3_MR1_WL_ENA_OFFS
);
751 /* [7]=1, [12]=0 - Output Buffer and write leveling enabled */
752 reg_write(REG_DDR3_MR1_ADDR
, reg
); /* 0x15D4 - DDR3 MR1 Register */
753 /* Issue MRS Command to current cs */
754 reg
= REG_SDRAM_OPERATION_CMD_MR1
&
755 ~(1 << (REG_SDRAM_OPERATION_CS_OFFS
+ cs
));
757 * [3-0] = 0x4 - MR1 Command, [11-8] -
760 /* 0x1418 - SDRAM Operation Register */
761 reg_write(REG_SDRAM_OPERATION_ADDR
, reg
);
765 /* Write leveling cs[cs] */
767 ddr3_write_leveling_single_cs(cs
, freq
, ratio_2to1
,
770 DEBUG_WL_FULL_C("DDR3 - Write Leveling single Cs - FAILED - Cs - ",
772 for (pup
= 0; pup
< max_pup_num
; pup
++) {
773 if (((res
[cs
] >> pup
) & 0x1) == 0) {
774 DEBUG_WL_C("Failed Byte : ",
781 /* Set TrnWLDeUpd - After each CS is done */
782 reg
= reg_read(REG_TRAINING_WL_ADDR
) |
783 (1 << REG_TRAINING_WL_CS_DONE_OFFS
);
784 /* 0x16AC - Training Write leveling register */
785 reg_write(REG_TRAINING_WL_ADDR
, reg
);
788 * Debug message - Finished Write leveling cs[cs] -
789 * each PUP Fail/Success
791 DEBUG_WL_FULL_C("DDR3 - Write Leveling - Finished Cs - ", (u32
) cs
,
793 DEBUG_WL_FULL_C("DDR3 - Write Leveling - The Results: 1-PUP locked, 0-PUP failed -",
797 * Configure MR1 in cs[cs] - write leveling off (0),
798 * output buffer off (1)
800 reg
= reg_read(REG_DDR3_MR1_ADDR
) &
801 REG_DDR3_MR1_OUTBUF_WL_MASK
;
802 reg
|= (1 << REG_DDR3_MR1_OUTBUF_DIS_OFFS
);
803 /* No need to sort ODT since it is same CS */
804 /* 0x15D4 - DDR3 MR1 Register */
805 reg_write(REG_DDR3_MR1_ADDR
, reg
);
806 /* Issue MRS Command to current cs */
807 reg
= REG_SDRAM_OPERATION_CMD_MR1
&
808 ~(1 << (REG_SDRAM_OPERATION_CS_OFFS
+ cs
));
810 * [3-0] = 0x4 - MR1 Command, [11-8] -
813 /* 0x1418 - SDRAM Operation Register */
814 reg_write(REG_SDRAM_OPERATION_ADDR
, reg
);
820 /* Disable WL Mode */
821 /* [2]=1 - TrnWLMode - Disable */
822 reg
= reg_read(REG_DRAM_TRAINING_2_ADDR
);
823 reg
|= (1 << REG_DRAM_TRAINING_2_WL_MODE_OFFS
);
824 /* 0x15B8 - Training SW 2 Register */
825 reg_write(REG_DRAM_TRAINING_2_ADDR
, reg
);
827 /* Disable SW override - Must be in a different stage */
828 /* [0]=0 - Enable SW override */
829 reg
= reg_read(REG_DRAM_TRAINING_2_ADDR
);
830 reg
&= ~(1 << REG_DRAM_TRAINING_2_SW_OVRD_OFFS
);
831 /* 0x15B8 - Training SW 2 Register */
832 reg_write(REG_DRAM_TRAINING_2_ADDR
, reg
);
834 /* Set Output buffer-on to all CS and correct ODT values */
835 for (cs
= 0; cs
< MAX_CS
; cs
++) {
836 if (dram_info
->cs_ena
& (1 << cs
)) {
837 reg
= reg_read(REG_DDR3_MR1_ADDR
) &
838 REG_DDR3_MR1_ODT_MASK
;
839 reg
&= REG_DDR3_MR1_OUTBUF_WL_MASK
;
840 reg
|= odt_static
[dram_info
->cs_ena
][cs
];
842 /* 0x15D0 - DDR3 MR1 Register */
843 reg_write(REG_DDR3_MR1_ADDR
, reg
);
844 /* Issue MRS Command to current cs */
845 reg
= REG_SDRAM_OPERATION_CMD_MR1
&
846 ~(1 << (REG_SDRAM_OPERATION_CS_OFFS
+ cs
));
848 * [3-0] = 0x4 - MR1 Command, [11-8] -
851 /* 0x1418 - SDRAM Operation Register */
852 reg_write(REG_SDRAM_OPERATION_ADDR
, reg
);
859 /* Dynamic pad issue (BTS669) during WL */
861 reg
= reg_read(REG_DUNIT_CTRL_LOW_ADDR
) |
862 (1 << REG_DUNIT_CTRL_LOW_DPDE_OFFS
);
863 reg_write(REG_DUNIT_CTRL_LOW_ADDR
, reg
);
866 DEBUG_WL_FULL_S("DDR3 - Write Leveling - Finished WL procedure for all Cs\n");
871 #if !defined(MV88F672X)
873 * Name: ddr3_write_leveling_sw
874 * Desc: Execute Write leveling phase by SW
875 * Args: freq - current sequence frequency
876 * dram_info - main struct
878 * Returns: MV_OK if success, MV_FAIL if fail.
880 int ddr3_write_leveling_sw_reg_dimm(u32 freq
, int ratio_2to1
,
881 MV_DRAM_INFO
*dram_info
)
883 u32 reg
, cs
, cnt
, pup
;
885 __maybe_unused
int dpde_flag
= 0;
887 /* Debug message - Start Write leveling procedure */
888 DEBUG_WL_S("DDR3 - Write Leveling - Starting SW WL procedure\n");
891 /* Dynamic pad issue (BTS669) during WL */
892 reg
= reg_read(REG_DUNIT_CTRL_LOW_ADDR
);
893 if (reg
& (1 << REG_DUNIT_CTRL_LOW_DPDE_OFFS
)) {
895 reg_write(REG_DUNIT_CTRL_LOW_ADDR
,
896 reg
& ~(1 << REG_DUNIT_CTRL_LOW_DPDE_OFFS
));
900 /* If target freq = 400 move clock start point */
901 /* Write to control PUP to Control Deskew Regs */
902 if (freq
<= DDR_400
) {
903 for (pup
= 0; pup
<= dram_info
->num_of_total_pups
; pup
++) {
904 /* PUP_DELAY_MASK 0x1F */
905 /* reg = 0x0C10001F + (uj << 16); */
906 ddr3_write_ctrl_pup_reg(1, pup
, CNTRL_PUP_DESKEW
+ pup
,
911 /* Set Output buffer-off to all CS and correct ODT values */
912 for (cs
= 0; cs
< MAX_CS
; cs
++) {
913 if (dram_info
->cs_ena
& (1 << cs
)) {
914 reg
= reg_read(REG_DDR3_MR1_ADDR
) &
915 REG_DDR3_MR1_ODT_MASK
;
916 reg
|= odt_static
[dram_info
->cs_ena
][cs
];
917 reg
|= (1 << REG_DDR3_MR1_OUTBUF_DIS_OFFS
);
919 /* 0x15D0 - DDR3 MR0 Register */
920 reg_write(REG_DDR3_MR1_ADDR
, reg
);
921 /* Issue MRS Command to current cs */
922 reg
= REG_SDRAM_OPERATION_CMD_MR1
&
923 ~(1 << (REG_SDRAM_OPERATION_CS_OFFS
+ cs
));
925 * [3-0] = 0x4 - MR1 Command, [11-8] -
928 /* 0x1418 - SDRAM Operation Register */
929 reg_write(REG_SDRAM_OPERATION_ADDR
, reg
);
935 DEBUG_WL_FULL_S("DDR3 - Write Leveling - Qoff and RTT Values are set for all Cs\n");
937 /* Enable SW override */
938 reg
= reg_read(REG_DRAM_TRAINING_2_ADDR
) |
939 (1 << REG_DRAM_TRAINING_2_SW_OVRD_OFFS
);
940 /* [0] = 1 - Enable SW override */
941 /* 0x15B8 - Training SW 2 Register */
942 reg_write(REG_DRAM_TRAINING_2_ADDR
, reg
);
943 DEBUG_WL_FULL_S("DDR3 - Write Leveling - SW Override Enabled\n");
945 /* Enable PHY write leveling mode */
946 reg
= reg_read(REG_DRAM_TRAINING_2_ADDR
) &
947 ~(1 << REG_DRAM_TRAINING_2_WL_MODE_OFFS
);
948 /* [2] = 0 - TrnWLMode - Enable */
949 /* 0x15B8 - Training SW 2 Register */
950 reg_write(REG_DRAM_TRAINING_2_ADDR
, reg
);
952 /* Loop for each cs */
953 for (cs
= 0; cs
< MAX_CS
; cs
++) {
954 if (dram_info
->cs_ena
& (1 << cs
)) {
955 DEBUG_WL_FULL_C("DDR3 - Write Leveling - Starting working with Cs - ",
958 /* Refresh X9 current cs */
959 DEBUG_WL_FULL_S("DDR3 - Write Leveling - Refresh X9\n");
960 for (cnt
= 0; cnt
< COUNT_WL_RFRS
; cnt
++) {
962 REG_SDRAM_OPERATION_CMD_RFRS
& ~(1 <<
963 (REG_SDRAM_OPERATION_CS_OFFS
965 /* [3-0] = 0x2 - refresh, [11-8] - enable current cs */
966 reg_write(REG_SDRAM_OPERATION_ADDR
, reg
); /* 0x1418 - SDRAM Operation Register */
971 (REG_SDRAM_OPERATION_ADDR
)) &
972 REG_SDRAM_OPERATION_CMD_RFRS_DONE
);
973 } while (reg
); /* Wait for '0' */
977 * Configure MR1 in Cs[CsNum] - write leveling on,
980 DEBUG_WL_FULL_S("DDR3 - Write Leveling - Configure MR1 for current Cs: WL-on,OB-on\n");
981 reg
= reg_read(REG_DDR3_MR1_ADDR
) &
982 REG_DDR3_MR1_OUTBUF_WL_MASK
;
984 reg
&= REG_DDR3_MR1_ODT_MASK
;
985 reg
|= odt_static
[dram_info
->cs_ena
][cs
];
987 reg
|= (1 << REG_DDR3_MR1_WL_ENA_OFFS
);
989 * [7]=1, [12]=0 - Output Buffer and write leveling
992 /* 0x15D4 - DDR3 MR1 Register */
993 reg_write(REG_DDR3_MR1_ADDR
, reg
);
994 /* Issue MRS Command to current cs */
995 reg
= REG_SDRAM_OPERATION_CMD_MR1
&
996 ~(1 << (REG_SDRAM_OPERATION_CS_OFFS
+ cs
));
998 * [3-0] = 0x4 - MR1 Command, [11-8] -
1001 /* 0x1418 - SDRAM Operation Register */
1002 reg_write(REG_SDRAM_OPERATION_ADDR
, reg
);
1006 /* Write leveling cs[cs] */
1008 ddr3_write_leveling_single_cs(cs
, freq
, ratio_2to1
,
1011 DEBUG_WL_FULL_C("DDR3 - Write Leveling single Cs - FAILED - Cs - ",
1016 /* Set TrnWLDeUpd - After each CS is done */
1017 reg
= reg_read(REG_TRAINING_WL_ADDR
) |
1018 (1 << REG_TRAINING_WL_CS_DONE_OFFS
);
1019 /* 0x16AC - Training Write leveling register */
1020 reg_write(REG_TRAINING_WL_ADDR
, reg
);
1023 * Debug message - Finished Write leveling cs[cs] -
1024 * each PUP Fail/Success
1026 DEBUG_WL_FULL_C("DDR3 - Write Leveling - Finished Cs - ", (u32
) cs
,
1028 DEBUG_WL_FULL_C("DDR3 - Write Leveling - The Results: 1-PUP locked, 0-PUP failed -",
1031 /* Configure MR1 in cs[cs] - write leveling off (0), output buffer off (1) */
1032 reg
= reg_read(REG_DDR3_MR1_ADDR
) &
1033 REG_DDR3_MR1_OUTBUF_WL_MASK
;
1034 reg
|= (1 << REG_DDR3_MR1_OUTBUF_DIS_OFFS
);
1035 /* No need to sort ODT since it is same CS */
1036 /* 0x15D4 - DDR3 MR1 Register */
1037 reg_write(REG_DDR3_MR1_ADDR
, reg
);
1038 /* Issue MRS Command to current cs */
1039 reg
= REG_SDRAM_OPERATION_CMD_MR1
&
1040 ~(1 << (REG_SDRAM_OPERATION_CS_OFFS
+ cs
));
1042 * [3-0] = 0x4 - MR1 Command, [11-8] -
1045 /* 0x1418 - SDRAM Operation Register */
1046 reg_write(REG_SDRAM_OPERATION_ADDR
, reg
);
1052 /* Disable WL Mode */
1053 /* [2]=1 - TrnWLMode - Disable */
1054 reg
= reg_read(REG_DRAM_TRAINING_2_ADDR
);
1055 reg
|= (1 << REG_DRAM_TRAINING_2_WL_MODE_OFFS
);
1056 /* 0x15B8 - Training SW 2 Register */
1057 reg_write(REG_DRAM_TRAINING_2_ADDR
, reg
);
1059 /* Disable SW override - Must be in a different stage */
1060 /* [0]=0 - Enable SW override */
1061 reg
= reg_read(REG_DRAM_TRAINING_2_ADDR
);
1062 reg
&= ~(1 << REG_DRAM_TRAINING_2_SW_OVRD_OFFS
);
1063 /* 0x15B8 - Training SW 2 Register */
1064 reg_write(REG_DRAM_TRAINING_2_ADDR
, reg
);
1066 /* Set Output buffer-on to all CS and correct ODT values */
1067 for (cs
= 0; cs
< MAX_CS
; cs
++) {
1068 if (dram_info
->cs_ena
& (1 << cs
)) {
1069 reg
= reg_read(REG_DDR3_MR1_ADDR
) &
1070 REG_DDR3_MR1_ODT_MASK
;
1071 reg
&= REG_DDR3_MR1_OUTBUF_WL_MASK
;
1072 reg
|= odt_static
[dram_info
->cs_ena
][cs
];
1074 /* 0x15D0 - DDR3 MR1 Register */
1075 reg_write(REG_DDR3_MR1_ADDR
, reg
);
1076 /* Issue MRS Command to current cs */
1077 reg
= REG_SDRAM_OPERATION_CMD_MR1
&
1078 ~(1 << (REG_SDRAM_OPERATION_CS_OFFS
+ cs
));
1080 * [3-0] = 0x4 - MR1 Command, [11-8] -
1083 /* 0x1418 - SDRAM Operation Register */
1084 reg_write(REG_SDRAM_OPERATION_ADDR
, reg
);
1091 /* Dynamic pad issue (BTS669) during WL */
1093 reg
= reg_read(REG_DUNIT_CTRL_LOW_ADDR
) |
1094 (1 << REG_DUNIT_CTRL_LOW_DPDE_OFFS
);
1095 reg_write(REG_DUNIT_CTRL_LOW_ADDR
, reg
);
1099 /* If target freq = 400 move clock back */
1100 /* Write to control PUP to Control Deskew Regs */
1101 if (freq
<= DDR_400
) {
1102 for (pup
= 0; pup
<= dram_info
->num_of_total_pups
; pup
++) {
1103 ddr3_write_ctrl_pup_reg(1, pup
, CNTRL_PUP_DESKEW
+ pup
,
1108 DEBUG_WL_FULL_S("DDR3 - Write Leveling - Finished WL procedure for all Cs\n");
1114 * Name: ddr3_write_leveling_single_cs
1115 * Desc: Execute Write leveling for single Chip select
1116 * Args: cs - current chip select
1117 * freq - current sequence frequency
1118 * result - res array
1119 * dram_info - main struct
1121 * Returns: MV_OK if success, MV_FAIL if fail.
1123 static int ddr3_write_leveling_single_cs(u32 cs
, u32 freq
, int ratio_2to1
,
1124 u32
*result
, MV_DRAM_INFO
*dram_info
)
1126 u32 reg
, pup_num
, delay
, phase
, phaseMax
, max_pup_num
, pup
,
1129 max_pup_num
= dram_info
->num_of_total_pups
;
1131 u32 flag
[MAX_PUP_NUM
] = { 0 };
1133 DEBUG_WL_FULL_C("DDR3 - Write Leveling Single Cs - WL for Cs - ",
1136 switch (max_pup_num
) {
1142 DEBUG_WL_C("max_pup_mask = ", max_pup_mask
, 3);
1145 max_pup_mask
= 0x1f;
1146 DEBUG_WL_C("max_pup_mask = ", max_pup_mask
, 3);
1149 max_pup_mask
= 0xff;
1150 DEBUG_WL_C("max_pup_mask = ", max_pup_mask
, 3);
1153 max_pup_mask
= 0x1ff;
1154 DEBUG_WL_C("max_pup_mask = ", max_pup_mask
, 3);
1157 DEBUG_WL_C("ddr3_write_leveling_single_cs wrong max_pup_num = ",
1162 /* CS ODT Override */
1163 reg
= reg_read(REG_SDRAM_ODT_CTRL_HIGH_ADDR
) &
1164 REG_SDRAM_ODT_CTRL_HIGH_OVRD_MASK
;
1165 reg
|= (REG_SDRAM_ODT_CTRL_HIGH_OVRD_ENA
<< (2 * cs
));
1166 /* Set 0x3 - Enable ODT on the curent cs and disable on other cs */
1167 /* 0x1498 - SDRAM ODT Control high */
1168 reg_write(REG_SDRAM_ODT_CTRL_HIGH_ADDR
, reg
);
1170 DEBUG_WL_FULL_S("DDR3 - Write Leveling Single Cs - ODT Asserted for current Cs\n");
1173 /* Delay of minimum 40 Dram clock cycles - 20 Tclk cycles */
1176 /* [1:0] - current cs number */
1177 reg
= (reg_read(REG_TRAINING_WL_ADDR
) & REG_TRAINING_WL_CS_MASK
) | cs
;
1178 reg
|= (1 << REG_TRAINING_WL_UPD_OFFS
); /* [2] - trnWLCsUpd */
1179 /* 0x16AC - Training Write leveling register */
1180 reg_write(REG_TRAINING_WL_ADDR
, reg
);
1182 /* Broadcast to all PUPs: Reset DQS phase, reset leveling delay */
1183 ddr3_write_pup_reg(PUP_WL_MODE
, cs
, PUP_BC
, 0, 0);
1186 DEBUG_WL_FULL_S("DDR3 - Write Leveling Single Cs - Seek Edge - Current Cs\n");
1188 /* Drive DQS high for one cycle - All data PUPs */
1189 DEBUG_WL_FULL_S("DDR3 - Write Leveling Single Cs - Seek Edge - Driving DQS high for one cycle\n");
1191 reg
= (reg_read(REG_TRAINING_WL_ADDR
) &
1192 REG_TRAINING_WL_RATIO_MASK
) | REG_TRAINING_WL_1TO1
;
1194 reg
= (reg_read(REG_TRAINING_WL_ADDR
) &
1195 REG_TRAINING_WL_RATIO_MASK
) | REG_TRAINING_WL_2TO1
;
1197 /* 0x16AC - Training Write leveling register */
1198 reg_write(REG_TRAINING_WL_ADDR
, reg
);
1202 /* [29] - trnWLDelayExp */
1203 reg
= (reg_read(REG_TRAINING_WL_ADDR
)) &
1204 REG_TRAINING_WL_DELAYEXP_MASK
;
1205 } while (reg
== 0x0); /* Wait for '1' */
1208 reg
= (reg_read(REG_TRAINING_WL_ADDR
) >> REG_TRAINING_WL_RESULTS_OFFS
) &
1209 REG_TRAINING_WL_RESULTS_MASK
;
1210 /* [28:20] - TrnWLResult */
1212 if (!ratio_2to1
) /* Different phase options for 2:1 or 1:1 modes */
1213 phaseMax
= MAX_PHASE_1TO1
;
1215 phaseMax
= MAX_PHASE_2TO1
;
1217 DEBUG_WL_FULL_S("DDR3 - Write Leveling Single Cs - Seek Edge - Shift DQS + Octet Leveling\n");
1219 /* Shift DQS + Octet leveling */
1220 for (phase
= 0; phase
< phaseMax
; phase
++) {
1221 for (delay
= 0; delay
< MAX_DELAY
; delay
++) {
1222 /* Broadcast to all PUPs: DQS phase,leveling delay */
1223 ddr3_write_pup_reg(PUP_WL_MODE
, cs
, PUP_BC
, phase
,
1226 udelay(1); /* Delay of 3 Tclk cycles */
1228 DEBUG_WL_FULL_S("DDR3 - Write Leveling Single Cs - Seek Edge: Phase = ");
1229 DEBUG_WL_FULL_D((u32
) phase
, 1);
1230 DEBUG_WL_FULL_S(", Delay = ");
1231 DEBUG_WL_FULL_D((u32
) delay
, 1);
1232 DEBUG_WL_FULL_S(", Counter = ");
1233 DEBUG_WL_FULL_D((u32
) i
, 1);
1234 DEBUG_WL_FULL_S("\n");
1236 /* Drive DQS high for one cycle - All data PUPs */
1238 reg
= (reg_read(REG_TRAINING_WL_ADDR
) &
1239 REG_TRAINING_WL_RATIO_MASK
) |
1240 REG_TRAINING_WL_1TO1
;
1242 reg
= (reg_read(REG_TRAINING_WL_ADDR
) &
1243 REG_TRAINING_WL_RATIO_MASK
) |
1244 REG_TRAINING_WL_2TO1
;
1246 reg_write(REG_TRAINING_WL_ADDR
, reg
); /* 0x16AC */
1250 reg
= (reg_read(REG_TRAINING_WL_ADDR
)) &
1251 REG_TRAINING_WL_DELAYEXP_MASK
;
1252 } while (reg
== 0x0); /* [29] Wait for '1' */
1255 reg
= reg_read(REG_TRAINING_WL_ADDR
);
1256 reg
= (reg
>> REG_TRAINING_WL_RESULTS_OFFS
) &
1257 REG_TRAINING_WL_RESULTS_MASK
; /* [28:20] */
1259 DEBUG_WL_FULL_C("DDR3 - Write Leveling Single Cs - Seek Edge: Results = ",
1262 /* Update State machine */
1263 for (pup
= 0; pup
< (max_pup_num
); pup
++) {
1264 /* ECC support - bit 8 */
1265 pup_num
= (pup
== dram_info
->num_of_std_pups
) ?
1267 if (dram_info
->wl_val
[cs
][pup
][S
] == 0) {
1268 /* Update phase to PUP */
1269 dram_info
->wl_val
[cs
][pup
][P
] = phase
;
1270 /* Update delay to PUP */
1271 dram_info
->wl_val
[cs
][pup
][D
] = delay
;
1274 if (((reg
>> pup_num
) & 0x1) == 0)
1277 if (((reg
>> pup_num
) & 0x1)
1278 && (flag
[pup_num
] == 1)
1279 && (dram_info
->wl_val
[cs
][pup
][S
] == 0)) {
1281 * If the PUP is locked now and in last
1284 /* Go to next state */
1285 dram_info
->wl_val
[cs
][pup
][S
] = 1;
1287 *result
= *result
| (1 << pup_num
);
1291 /* If all locked - Break the loops - Finished */
1292 if (*result
== max_pup_mask
) {
1295 DEBUG_WL_S("DDR3 - Write Leveling Single Cs - Seek Edge: All Locked\n");
1300 /* Debug message - Print res for cs[i]: cs,PUP,Phase,Delay */
1301 DEBUG_WL_C("DDR3 - Write Leveling - Results for CS - ", (u32
) cs
, 1);
1302 for (pup
= 0; pup
< (max_pup_num
); pup
++) {
1303 DEBUG_WL_S("DDR3 - Write Leveling - PUP: ");
1304 DEBUG_WL_D((u32
) pup
, 1);
1305 DEBUG_WL_S(", Phase: ");
1306 DEBUG_WL_D((u32
) dram_info
->wl_val
[cs
][pup
][P
], 1);
1307 DEBUG_WL_S(", Delay: ");
1308 DEBUG_WL_D((u32
) dram_info
->wl_val
[cs
][pup
][D
], 2);
1312 /* Check if some not locked and return error */
1313 if (*result
!= max_pup_mask
) {
1314 DEBUG_WL_S("DDR3 - Write Leveling - ERROR - not all PUPS were locked\n");
1318 /* Configure Each PUP with locked leveling settings */
1319 for (pup
= 0; pup
< (max_pup_num
); pup
++) {
1320 /* ECC support - bit 8 */
1321 pup_num
= (pup
== dram_info
->num_of_std_pups
) ? ECC_BIT
: pup
;
1322 phase
= dram_info
->wl_val
[cs
][pup
][P
];
1323 delay
= dram_info
->wl_val
[cs
][pup
][D
];
1324 ddr3_write_pup_reg(PUP_WL_MODE
, cs
, pup_num
, phase
, delay
);
1327 /* CS ODT Override */
1328 reg
= reg_read(REG_SDRAM_ODT_CTRL_HIGH_ADDR
) &
1329 REG_SDRAM_ODT_CTRL_HIGH_OVRD_MASK
;
1330 /* 0x1498 - SDRAM ODT Control high */
1331 reg_write(REG_SDRAM_ODT_CTRL_HIGH_ADDR
, reg
);
1337 * Perform DDR3 Control PUP Indirect Write
1339 static void ddr3_write_ctrl_pup_reg(int bc_acc
, u32 pup
, u32 reg_addr
, u32 data
)
1343 /* Store value for write */
1344 reg
= (data
& 0xFFFF);
1346 /* Set bit 26 for control PHY access */
1347 reg
|= (1 << REG_PHY_CNTRL_OFFS
);
1349 /* Configure BC or UC access to PHYs */
1351 reg
|= (1 << REG_PHY_BC_OFFS
);
1353 reg
|= (pup
<< REG_PHY_PUP_OFFS
);
1355 /* Set PHY register address to write to */
1356 reg
|= (reg_addr
<< REG_PHY_CS_OFFS
);
1358 reg_write(REG_PHY_REGISTRY_FILE_ACCESS_ADDR
, reg
); /* 0x16A0 */
1359 reg
|= REG_PHY_REGISTRY_FILE_ACCESS_OP_WR
;
1360 reg_write(REG_PHY_REGISTRY_FILE_ACCESS_ADDR
, reg
); /* 0x16A0 */
1363 reg
= (reg_read(REG_PHY_REGISTRY_FILE_ACCESS_ADDR
)) &
1364 REG_PHY_REGISTRY_FILE_ACCESS_OP_DONE
;
1365 } while (reg
); /* Wait for '0' to mark the end of the transaction */