blob: 30a5c354885744747556b9368b5e781beaeaffaa [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0
Stefan Roeseae6223d2015-01-19 11:33:40 +01002/*
3 * Copyright (C) Marvell International Ltd. and its affiliates
Stefan Roeseae6223d2015-01-19 11:33:40 +01004 */
5
6#include <common.h>
7#include <i2c.h>
Simon Glass0f2af882020-05-10 11:40:05 -06008#include <log.h>
Stefan Roeseae6223d2015-01-19 11:33:40 +01009#include <spl.h>
10#include <asm/io.h>
11#include <asm/arch/cpu.h>
12#include <asm/arch/soc.h>
13
14#include "ddr3_hw_training.h"
15
16/*
17 * Debug
18 */
19#define DEBUG_RL_C(s, d, l) \
20 DEBUG_RL_S(s); DEBUG_RL_D(d, l); DEBUG_RL_S("\n")
21#define DEBUG_RL_FULL_C(s, d, l) \
22 DEBUG_RL_FULL_S(s); DEBUG_RL_FULL_D(d, l); DEBUG_RL_FULL_S("\n")
23
24#ifdef MV_DEBUG_RL
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)
29#else
30#define DEBUG_RL_S(s)
31#define DEBUG_RL_D(d, l)
32#endif
33
34#ifdef MV_DEBUG_RL_FULL
35#define DEBUG_RL_FULL_S(s) puts(s)
36#define DEBUG_RL_FULL_D(d, l) printf("%x", d)
37#else
38#define DEBUG_RL_FULL_S(s)
39#define DEBUG_RL_FULL_D(d, l)
40#endif
41
42extern u32 rl_pattern[LEN_STD_PATTERN];
43
44#ifdef RL_MODE
45static int ddr3_read_leveling_single_cs_rl_mode(u32 cs, u32 freq,
46 int ratio_2to1, u32 ecc,
47 MV_DRAM_INFO *dram_info);
48#else
49static int ddr3_read_leveling_single_cs_window_mode(u32 cs, u32 freq,
50 int ratio_2to1, u32 ecc,
51 MV_DRAM_INFO *dram_info);
52#endif
53
54/*
55 * Name: ddr3_read_leveling_hw
56 * Desc: Execute the Read leveling phase by HW
57 * Args: dram_info - main struct
58 * freq - current sequence frequency
59 * Notes:
60 * Returns: MV_OK if success, MV_FAIL if fail.
61 */
62int ddr3_read_leveling_hw(u32 freq, MV_DRAM_INFO *dram_info)
63{
64 u32 reg;
65
66 /* Debug message - Start Read leveling procedure */
67 DEBUG_RL_S("DDR3 - Read Leveling - Starting HW RL procedure\n");
68
69 /* Start Auto Read Leveling procedure */
70 reg = 1 << REG_DRAM_TRAINING_RL_OFFS;
71 /* Config the retest number */
72 reg |= (COUNT_HW_RL << REG_DRAM_TRAINING_RETEST_OFFS);
73
74 /* Enable CS in the automatic process */
75 reg |= (dram_info->cs_ena << REG_DRAM_TRAINING_CS_OFFS);
76
77 reg_write(REG_DRAM_TRAINING_ADDR, reg); /* 0x15B0 - Training Register */
78
79 reg = reg_read(REG_DRAM_TRAINING_SHADOW_ADDR) |
80 (1 << REG_DRAM_TRAINING_AUTO_OFFS);
81 reg_write(REG_DRAM_TRAINING_SHADOW_ADDR, reg);
82
83 /* Wait */
84 do {
85 reg = reg_read(REG_DRAM_TRAINING_SHADOW_ADDR) &
86 (1 << REG_DRAM_TRAINING_AUTO_OFFS);
87 } while (reg); /* Wait for '0' */
88
89 /* Check if Successful */
90 if (reg_read(REG_DRAM_TRAINING_SHADOW_ADDR) &
91 (1 << REG_DRAM_TRAINING_ERROR_OFFS)) {
92 u32 delay, phase, pup, cs;
93
94 dram_info->rl_max_phase = 0;
95 dram_info->rl_min_phase = 10;
96
97 /* Read results to arrays */
98 for (cs = 0; cs < MAX_CS; cs++) {
99 if (dram_info->cs_ena & (1 << cs)) {
100 for (pup = 0;
101 pup < dram_info->num_of_total_pups;
102 pup++) {
103 if (pup == dram_info->num_of_std_pups
104 && dram_info->ecc_ena)
105 pup = ECC_PUP;
106 reg =
107 ddr3_read_pup_reg(PUP_RL_MODE, cs,
108 pup);
109 phase = (reg >> REG_PHY_PHASE_OFFS) &
110 PUP_PHASE_MASK;
111 delay = reg & PUP_DELAY_MASK;
112 dram_info->rl_val[cs][pup][P] = phase;
113 if (phase > dram_info->rl_max_phase)
114 dram_info->rl_max_phase = phase;
115 if (phase < dram_info->rl_min_phase)
116 dram_info->rl_min_phase = phase;
117 dram_info->rl_val[cs][pup][D] = delay;
118 dram_info->rl_val[cs][pup][S] =
119 RL_FINAL_STATE;
120 reg =
121 ddr3_read_pup_reg(PUP_RL_MODE + 0x1,
122 cs, pup);
123 dram_info->rl_val[cs][pup][DQS] =
124 (reg & 0x3F);
125 }
126#ifdef MV_DEBUG_RL
127 /* Print results */
128 DEBUG_RL_C("DDR3 - Read Leveling - Results for CS - ",
129 (u32) cs, 1);
130
131 for (pup = 0;
132 pup < (dram_info->num_of_total_pups);
133 pup++) {
134 if (pup == dram_info->num_of_std_pups
135 && dram_info->ecc_ena)
136 pup = ECC_PUP;
137 DEBUG_RL_S("DDR3 - Read Leveling - PUP: ");
138 DEBUG_RL_D((u32) pup, 1);
139 DEBUG_RL_S(", Phase: ");
140 DEBUG_RL_D((u32) dram_info->
141 rl_val[cs][pup][P], 1);
142 DEBUG_RL_S(", Delay: ");
143 DEBUG_RL_D((u32) dram_info->
144 rl_val[cs][pup][D], 2);
145 DEBUG_RL_S("\n");
146 }
147#endif
148 }
149 }
150
151 dram_info->rd_rdy_dly =
152 reg_read(REG_READ_DATA_READY_DELAYS_ADDR) &
153 REG_READ_DATA_SAMPLE_DELAYS_MASK;
154 dram_info->rd_smpl_dly =
155 reg_read(REG_READ_DATA_SAMPLE_DELAYS_ADDR) &
156 REG_READ_DATA_READY_DELAYS_MASK;
157#ifdef MV_DEBUG_RL
158 DEBUG_RL_C("DDR3 - Read Leveling - Read Sample Delay: ",
159 dram_info->rd_smpl_dly, 2);
160 DEBUG_RL_C("DDR3 - Read Leveling - Read Ready Delay: ",
161 dram_info->rd_rdy_dly, 2);
162 DEBUG_RL_S("DDR3 - Read Leveling - HW RL Ended Successfully\n");
163#endif
164 return MV_OK;
165
166 } else {
167 DEBUG_RL_S("DDR3 - Read Leveling - HW RL Error\n");
168 return MV_FAIL;
169 }
170}
171
172/*
173 * Name: ddr3_read_leveling_sw
174 * Desc: Execute the Read leveling phase by SW
175 * Args: dram_info - main struct
176 * freq - current sequence frequency
177 * Notes:
178 * Returns: MV_OK if success, MV_FAIL if fail.
179 */
180int ddr3_read_leveling_sw(u32 freq, int ratio_2to1, MV_DRAM_INFO *dram_info)
181{
182 u32 reg, cs, ecc, pup_num, phase, delay, pup;
183 int status;
184
185 /* Debug message - Start Read leveling procedure */
186 DEBUG_RL_S("DDR3 - Read Leveling - Starting SW RL procedure\n");
187
188 /* Enable SW Read Leveling */
189 reg = reg_read(REG_DRAM_TRAINING_2_ADDR) |
190 (1 << REG_DRAM_TRAINING_2_SW_OVRD_OFFS);
191 reg &= ~(1 << REG_DRAM_TRAINING_2_RL_MODE_OFFS);
192 /* [0]=1 - Enable SW override */
193 /* 0x15B8 - Training SW 2 Register */
194 reg_write(REG_DRAM_TRAINING_2_ADDR, reg);
195
196#ifdef RL_MODE
197 reg = (dram_info->cs_ena << REG_DRAM_TRAINING_CS_OFFS) |
198 (1 << REG_DRAM_TRAINING_AUTO_OFFS);
199 reg_write(REG_DRAM_TRAINING_ADDR, reg); /* 0x15B0 - Training Register */
200#endif
201
202 /* Loop for each CS */
203 for (cs = 0; cs < dram_info->num_cs; cs++) {
204 DEBUG_RL_C("DDR3 - Read Leveling - CS - ", (u32) cs, 1);
205
206 for (ecc = 0; ecc <= (dram_info->ecc_ena); ecc++) {
207 /* ECC Support - Switch ECC Mux on ecc=1 */
208 reg = reg_read(REG_DRAM_TRAINING_2_ADDR) &
209 ~(1 << REG_DRAM_TRAINING_2_ECC_MUX_OFFS);
210 reg |= (dram_info->ecc_ena *
211 ecc << REG_DRAM_TRAINING_2_ECC_MUX_OFFS);
212 reg_write(REG_DRAM_TRAINING_2_ADDR, reg);
213
214 if (ecc)
215 DEBUG_RL_S("DDR3 - Read Leveling - ECC Mux Enabled\n");
216 else
217 DEBUG_RL_S("DDR3 - Read Leveling - ECC Mux Disabled\n");
218
219 /* Set current sample delays */
220 reg = reg_read(REG_READ_DATA_SAMPLE_DELAYS_ADDR);
221 reg &= ~(REG_READ_DATA_SAMPLE_DELAYS_MASK <<
222 (REG_READ_DATA_SAMPLE_DELAYS_OFFS * cs));
223 reg |= (dram_info->cl <<
224 (REG_READ_DATA_SAMPLE_DELAYS_OFFS * cs));
225 reg_write(REG_READ_DATA_SAMPLE_DELAYS_ADDR, reg);
226
227 /* Set current Ready delay */
228 reg = reg_read(REG_READ_DATA_READY_DELAYS_ADDR);
229 reg &= ~(REG_READ_DATA_READY_DELAYS_MASK <<
230 (REG_READ_DATA_READY_DELAYS_OFFS * cs));
231 if (!ratio_2to1) {
232 /* 1:1 mode */
233 reg |= ((dram_info->cl + 1) <<
234 (REG_READ_DATA_READY_DELAYS_OFFS * cs));
235 } else {
236 /* 2:1 mode */
237 reg |= ((dram_info->cl + 2) <<
238 (REG_READ_DATA_READY_DELAYS_OFFS * cs));
239 }
240 reg_write(REG_READ_DATA_READY_DELAYS_ADDR, reg);
241
242 /* Read leveling Single CS[cs] */
243#ifdef RL_MODE
244 status =
245 ddr3_read_leveling_single_cs_rl_mode(cs, freq,
246 ratio_2to1,
247 ecc,
248 dram_info);
249 if (MV_OK != status)
250 return status;
251#else
252 status =
253 ddr3_read_leveling_single_cs_window_mode(cs, freq,
254 ratio_2to1,
255 ecc,
256 dram_info)
257 if (MV_OK != status)
258 return status;
259#endif
260 }
261
262 /* Print results */
263 DEBUG_RL_C("DDR3 - Read Leveling - Results for CS - ", (u32) cs,
264 1);
265
266 for (pup = 0;
267 pup < (dram_info->num_of_std_pups + dram_info->ecc_ena);
268 pup++) {
269 DEBUG_RL_S("DDR3 - Read Leveling - PUP: ");
270 DEBUG_RL_D((u32) pup, 1);
271 DEBUG_RL_S(", Phase: ");
272 DEBUG_RL_D((u32) dram_info->rl_val[cs][pup][P], 1);
273 DEBUG_RL_S(", Delay: ");
274 DEBUG_RL_D((u32) dram_info->rl_val[cs][pup][D], 2);
275 DEBUG_RL_S("\n");
276 }
277
278 DEBUG_RL_C("DDR3 - Read Leveling - Read Sample Delay: ",
279 dram_info->rd_smpl_dly, 2);
280 DEBUG_RL_C("DDR3 - Read Leveling - Read Ready Delay: ",
281 dram_info->rd_rdy_dly, 2);
282
283 /* Configure PHY with average of 3 locked leveling settings */
284 for (pup = 0;
285 pup < (dram_info->num_of_std_pups + dram_info->ecc_ena);
286 pup++) {
287 /* ECC support - bit 8 */
288 pup_num = (pup == dram_info->num_of_std_pups) ? ECC_BIT : pup;
289
290 /* For now, set last cnt result */
291 phase = dram_info->rl_val[cs][pup][P];
292 delay = dram_info->rl_val[cs][pup][D];
293 ddr3_write_pup_reg(PUP_RL_MODE, cs, pup_num, phase,
294 delay);
295 }
296 }
297
298 /* Reset PHY read FIFO */
299 reg = reg_read(REG_DRAM_TRAINING_2_ADDR) |
300 (1 << REG_DRAM_TRAINING_2_FIFO_RST_OFFS);
301 /* 0x15B8 - Training SW 2 Register */
302 reg_write(REG_DRAM_TRAINING_2_ADDR, reg);
303
304 do {
305 reg = (reg_read(REG_DRAM_TRAINING_2_ADDR)) &
306 (1 << REG_DRAM_TRAINING_2_FIFO_RST_OFFS);
307 } while (reg); /* Wait for '0' */
308
309 /* ECC Support - Switch ECC Mux off ecc=0 */
310 reg = reg_read(REG_DRAM_TRAINING_2_ADDR) &
311 ~(1 << REG_DRAM_TRAINING_2_ECC_MUX_OFFS);
312 reg_write(REG_DRAM_TRAINING_2_ADDR, reg);
313
314#ifdef RL_MODE
315 reg_write(REG_DRAM_TRAINING_ADDR, 0); /* 0x15B0 - Training Register */
316#endif
317
318 /* Disable SW Read Leveling */
319 reg = reg_read(REG_DRAM_TRAINING_2_ADDR) &
320 ~(1 << REG_DRAM_TRAINING_2_SW_OVRD_OFFS);
321 /* [0] = 0 - Disable SW override */
322 reg = (reg | (0x1 << REG_DRAM_TRAINING_2_RL_MODE_OFFS));
323 /* [3] = 1 - Disable RL MODE */
324 /* 0x15B8 - Training SW 2 Register */
325 reg_write(REG_DRAM_TRAINING_2_ADDR, reg);
326
327 DEBUG_RL_S("DDR3 - Read Leveling - Finished RL procedure for all CS\n");
328 return MV_OK;
329}
330
331#ifdef RL_MODE
332/*
333 * overrun() extracted from ddr3_read_leveling_single_cs_rl_mode().
334 * This just got too much indented making it hard to read / edit.
335 */
336static void overrun(u32 cs, MV_DRAM_INFO *info, u32 pup, u32 locked_pups,
337 u32 *locked_sum, u32 ecc, int *first_octet_locked,
338 int *counter_in_progress, int final_delay, u32 delay,
339 u32 phase)
340{
341 /* If no OverRun */
342 if (((~locked_pups >> pup) & 0x1) && (final_delay == 0)) {
343 int idx;
344
345 idx = pup + ecc * ECC_BIT;
346
347 /* PUP passed, start examining */
348 if (info->rl_val[cs][idx][S] == RL_UNLOCK_STATE) {
349 /* Must be RL_UNLOCK_STATE */
350 /* Match expected value ? - Update State Machine */
351 if (info->rl_val[cs][idx][C] < RL_RETRY_COUNT) {
352 DEBUG_RL_FULL_C("DDR3 - Read Leveling - We have no overrun and a match on pup: ",
353 (u32)pup, 1);
354 info->rl_val[cs][idx][C]++;
355
356 /* If pup got to last state - lock the delays */
357 if (info->rl_val[cs][idx][C] == RL_RETRY_COUNT) {
358 info->rl_val[cs][idx][C] = 0;
359 info->rl_val[cs][idx][DS] = delay;
360 info->rl_val[cs][idx][PS] = phase;
361
362 /* Go to Final State */
363 info->rl_val[cs][idx][S] = RL_FINAL_STATE;
364 *locked_sum = *locked_sum + 1;
365 DEBUG_RL_FULL_C("DDR3 - Read Leveling - We have locked pup: ",
366 (u32)pup, 1);
367
368 /*
369 * If first lock - need to lock delays
370 */
371 if (*first_octet_locked == 0) {
372 DEBUG_RL_FULL_C("DDR3 - Read Leveling - We got first lock on pup: ",
373 (u32)pup, 1);
374 *first_octet_locked = 1;
375 }
376
377 /*
378 * If pup is in not in final state but
379 * there was match - dont increment
380 * counter
381 */
382 } else {
383 *counter_in_progress = 1;
384 }
385 }
386 }
387 }
388}
389
390/*
391 * Name: ddr3_read_leveling_single_cs_rl_mode
392 * Desc: Execute Read leveling for single Chip select
393 * Args: cs - current chip select
394 * freq - current sequence frequency
395 * ecc - ecc iteration indication
396 * dram_info - main struct
397 * Notes:
398 * Returns: MV_OK if success, MV_FAIL if fail.
399 */
400static int ddr3_read_leveling_single_cs_rl_mode(u32 cs, u32 freq,
401 int ratio_2to1, u32 ecc,
402 MV_DRAM_INFO *dram_info)
403{
404 u32 reg, delay, phase, pup, rd_sample_delay, add, locked_pups,
405 repeat_max_cnt, sdram_offset, locked_sum;
406 u32 phase_min, ui_max_delay;
407 int all_locked, first_octet_locked, counter_in_progress;
408 int final_delay = 0;
409
410 DEBUG_RL_FULL_C("DDR3 - Read Leveling - Single CS - ", (u32) cs, 1);
411
412 /* Init values */
413 phase = 0;
414 delay = 0;
415 rd_sample_delay = dram_info->cl;
416 all_locked = 0;
417 first_octet_locked = 0;
418 repeat_max_cnt = 0;
419 locked_sum = 0;
420
421 for (pup = 0; pup < (dram_info->num_of_std_pups * (1 - ecc) + ecc);
422 pup++)
423 dram_info->rl_val[cs][pup + ecc * ECC_BIT][S] = 0;
424
425 /* Main loop */
426 while (!all_locked) {
427 counter_in_progress = 0;
428
429 DEBUG_RL_FULL_S("DDR3 - Read Leveling - RdSmplDly = ");
430 DEBUG_RL_FULL_D(rd_sample_delay, 2);
431 DEBUG_RL_FULL_S(", RdRdyDly = ");
432 DEBUG_RL_FULL_D(dram_info->rd_rdy_dly, 2);
433 DEBUG_RL_FULL_S(", Phase = ");
434 DEBUG_RL_FULL_D(phase, 1);
435 DEBUG_RL_FULL_S(", Delay = ");
436 DEBUG_RL_FULL_D(delay, 2);
437 DEBUG_RL_FULL_S("\n");
438
439 /*
440 * Broadcast to all PUPs current RL delays: DQS phase,
441 * leveling delay
442 */
443 ddr3_write_pup_reg(PUP_RL_MODE, cs, PUP_BC, phase, delay);
444
445 /* Reset PHY read FIFO */
446 reg = reg_read(REG_DRAM_TRAINING_2_ADDR) |
447 (1 << REG_DRAM_TRAINING_2_FIFO_RST_OFFS);
448 /* 0x15B8 - Training SW 2 Register */
449 reg_write(REG_DRAM_TRAINING_2_ADDR, reg);
450
451 do {
452 reg = (reg_read(REG_DRAM_TRAINING_2_ADDR)) &
453 (1 << REG_DRAM_TRAINING_2_FIFO_RST_OFFS);
454 } while (reg); /* Wait for '0' */
455
456 /* Read pattern from SDRAM */
457 sdram_offset = cs * (SDRAM_CS_SIZE + 1) + SDRAM_RL_OFFS;
458 locked_pups = 0;
459 if (MV_OK !=
460 ddr3_sdram_compare(dram_info, 0xFF, &locked_pups,
461 rl_pattern, LEN_STD_PATTERN,
462 sdram_offset, 0, 0, NULL, 0))
463 return MV_DDR3_TRAINING_ERR_RD_LVL_RL_PATTERN;
464
465 /* Octet evaluation */
466 /* pup_num = Q or 1 for ECC */
467 for (pup = 0; pup < (dram_info->num_of_std_pups * (1 - ecc) + ecc); pup++) {
468 /* Check Overrun */
469 if (!((reg_read(REG_DRAM_TRAINING_2_ADDR) >>
470 (REG_DRAM_TRAINING_2_OVERRUN_OFFS + pup)) & 0x1)) {
471 overrun(cs, dram_info, pup, locked_pups,
472 &locked_sum, ecc, &first_octet_locked,
473 &counter_in_progress, final_delay,
474 delay, phase);
475 } else {
476 DEBUG_RL_FULL_C("DDR3 - Read Leveling - We got overrun on pup: ",
477 (u32)pup, 1);
478 }
479 }
480
481 if (locked_sum == (dram_info->num_of_std_pups *
482 (1 - ecc) + ecc)) {
483 all_locked = 1;
484 DEBUG_RL_FULL_S("DDR3 - Read Leveling - Single Cs - All pups locked\n");
485 }
486
487 /*
488 * This is a fix for unstable condition where pups are
489 * toggling between match and no match
490 */
491 /*
492 * If some of the pups is >1 <3, check if we did it too
493 * many times
494 */
495 if (counter_in_progress == 1) {
496 /* Notify at least one Counter is >=1 and < 3 */
497 if (repeat_max_cnt < RL_RETRY_COUNT) {
498 repeat_max_cnt++;
499 counter_in_progress = 1;
500 DEBUG_RL_FULL_S("DDR3 - Read Leveling - Counter is >=1 and <3\n");
501 DEBUG_RL_FULL_S("DDR3 - Read Leveling - So we will not increment the delay to see if locked again\n");
502 } else {
503 DEBUG_RL_FULL_S("DDR3 - Read Leveling - repeat_max_cnt reached max so now we will increment the delay\n");
504 counter_in_progress = 0;
505 }
506 }
507
508 /*
509 * Check some of the pups are in the middle of state machine
510 * and don't increment the delays
511 */
512 if (!counter_in_progress && !all_locked) {
513 int idx;
514
515 idx = pup + ecc * ECC_BIT;
516
517 repeat_max_cnt = 0;
518 /* if 1:1 mode */
519 if ((!ratio_2to1) && ((phase == 0) || (phase == 4)))
520 ui_max_delay = MAX_DELAY_INV;
521 else
522 ui_max_delay = MAX_DELAY;
523
524 /* Increment Delay */
525 if (delay < ui_max_delay) {
526 delay++;
527 /*
528 * Mark the last delay/pahse place for
529 * window final place
530 */
531 if (delay == ui_max_delay) {
532 if ((!ratio_2to1 && phase ==
533 MAX_PHASE_RL_L_1TO1)
534 || (ratio_2to1 && phase ==
535 MAX_PHASE_RL_L_2TO1))
536 final_delay = 1;
537 }
538 } else {
539 /* Phase+CL Incrementation */
540 delay = 0;
541
542 if (!ratio_2to1) {
543 /* 1:1 mode */
544 if (first_octet_locked) {
545 /* some Pup was Locked */
546 if (phase < MAX_PHASE_RL_L_1TO1) {
547 if (phase == 1) {
548 phase = 4;
549 } else {
550 phase++;
551 delay = MIN_DELAY_PHASE_1_LIMIT;
552 }
553 } else {
554 DEBUG_RL_FULL_S("DDR3 - Read Leveling - ERROR - NOT all PUPs Locked\n");
555 DEBUG_RL_S("1)DDR3 - Read Leveling - ERROR - NOT all PUPs Locked n");
556 return MV_DDR3_TRAINING_ERR_RD_LVL_RL_PUP_UNLOCK;
557 }
558 } else {
559 /* NO Pup was Locked */
560 if (phase < MAX_PHASE_RL_UL_1TO1) {
561 phase++;
562 delay =
563 MIN_DELAY_PHASE_1_LIMIT;
564 } else {
565 phase = 0;
566 }
567 }
568 } else {
569 /* 2:1 mode */
570 if (first_octet_locked) {
571 /* some Pup was Locked */
572 if (phase < MAX_PHASE_RL_L_2TO1) {
573 phase++;
574 } else {
575 DEBUG_RL_FULL_S("DDR3 - Read Leveling - ERROR - NOT all PUPs Locked\n");
576 DEBUG_RL_S("2)DDR3 - Read Leveling - ERROR - NOT all PUPs Locked\n");
577 for (pup = 0; pup < (dram_info->num_of_std_pups * (1 - ecc) + ecc); pup++) {
578 /* pup_num = Q or 1 for ECC */
579 if (dram_info->rl_val[cs][idx][S]
580 == 0) {
581 DEBUG_RL_C("Failed byte is = ",
582 pup, 1);
583 }
584 }
585 return MV_DDR3_TRAINING_ERR_RD_LVL_RL_PUP_UNLOCK;
586 }
587 } else {
588 /* No Pup was Locked */
589 if (phase < MAX_PHASE_RL_UL_2TO1)
590 phase++;
591 else
592 phase = 0;
593 }
594 }
595
596 /*
597 * If we finished a full Phases cycle (so now
598 * phase = 0, need to increment rd_sample_dly
599 */
600 if (phase == 0 && first_octet_locked == 0) {
601 rd_sample_delay++;
602 if (rd_sample_delay == 0x10) {
603 DEBUG_RL_FULL_S("DDR3 - Read Leveling - ERROR - NOT all PUPs Locked\n");
604 DEBUG_RL_S("3)DDR3 - Read Leveling - ERROR - NOT all PUPs Locked\n");
605 for (pup = 0; pup < (dram_info->num_of_std_pups * (1 - ecc) + ecc); pup++) {
606 /* pup_num = Q or 1 for ECC */
607 if (dram_info->
608 rl_val[cs][idx][S] == 0) {
609 DEBUG_RL_C("Failed byte is = ",
610 pup, 1);
611 }
612 }
613 return MV_DDR3_TRAINING_ERR_RD_LVL_PUP_UNLOCK;
614 }
615
616 /* Set current rd_sample_delay */
617 reg = reg_read(REG_READ_DATA_SAMPLE_DELAYS_ADDR);
618 reg &= ~(REG_READ_DATA_SAMPLE_DELAYS_MASK
619 << (REG_READ_DATA_SAMPLE_DELAYS_OFFS
620 * cs));
621 reg |= (rd_sample_delay <<
622 (REG_READ_DATA_SAMPLE_DELAYS_OFFS *
623 cs));
624 reg_write(REG_READ_DATA_SAMPLE_DELAYS_ADDR,
625 reg);
626 }
627
628 /*
629 * Set current rdReadyDelay according to the
630 * hash table (Need to do this in every phase
631 * change)
632 */
633 if (!ratio_2to1) {
634 /* 1:1 mode */
635 add = reg_read(REG_TRAINING_DEBUG_2_ADDR);
636 switch (phase) {
637 case 0:
638 add = (add >>
639 REG_TRAINING_DEBUG_2_OFFS);
640 break;
641 case 1:
642 add = (add >>
643 (REG_TRAINING_DEBUG_2_OFFS
644 + 3));
645 break;
646 case 4:
647 add = (add >>
648 (REG_TRAINING_DEBUG_2_OFFS
649 + 6));
650 break;
651 case 5:
652 add = (add >>
653 (REG_TRAINING_DEBUG_2_OFFS
654 + 9));
655 break;
656 }
657 add &= REG_TRAINING_DEBUG_2_MASK;
658 } else {
659 /* 2:1 mode */
660 add = reg_read(REG_TRAINING_DEBUG_3_ADDR);
661 add = (add >>
662 (phase *
663 REG_TRAINING_DEBUG_3_OFFS));
664 add &= REG_TRAINING_DEBUG_3_MASK;
665 }
666
667 reg = reg_read(REG_READ_DATA_READY_DELAYS_ADDR);
668 reg &= ~(REG_READ_DATA_READY_DELAYS_MASK <<
669 (REG_READ_DATA_READY_DELAYS_OFFS * cs));
670 reg |= ((rd_sample_delay + add) <<
671 (REG_READ_DATA_READY_DELAYS_OFFS * cs));
672 reg_write(REG_READ_DATA_READY_DELAYS_ADDR, reg);
673 dram_info->rd_smpl_dly = rd_sample_delay;
674 dram_info->rd_rdy_dly = rd_sample_delay + add;
675 }
676
677 /* Reset counters for pups with states<RD_STATE_COUNT */
678 for (pup = 0; pup <
679 (dram_info->num_of_std_pups * (1 - ecc) + ecc);
680 pup++) {
681 if (dram_info->rl_val[cs][idx][C] < RL_RETRY_COUNT)
682 dram_info->rl_val[cs][idx][C] = 0;
683 }
684 }
685 }
686
687 phase_min = 10;
688
689 for (pup = 0; pup < (dram_info->num_of_std_pups); pup++) {
690 if (dram_info->rl_val[cs][pup][PS] < phase_min)
691 phase_min = dram_info->rl_val[cs][pup][PS];
692 }
693
694 /*
695 * Set current rdReadyDelay according to the hash table (Need to
696 * do this in every phase change)
697 */
698 if (!ratio_2to1) {
699 /* 1:1 mode */
700 add = reg_read(REG_TRAINING_DEBUG_2_ADDR);
701 switch (phase_min) {
702 case 0:
703 add = (add >> REG_TRAINING_DEBUG_2_OFFS);
704 break;
705 case 1:
706 add = (add >> (REG_TRAINING_DEBUG_2_OFFS + 3));
707 break;
708 case 4:
709 add = (add >> (REG_TRAINING_DEBUG_2_OFFS + 6));
710 break;
711 case 5:
712 add = (add >> (REG_TRAINING_DEBUG_2_OFFS + 9));
713 break;
714 }
715 add &= REG_TRAINING_DEBUG_2_MASK;
716 } else {
717 /* 2:1 mode */
718 add = reg_read(REG_TRAINING_DEBUG_3_ADDR);
719 add = (add >> (phase_min * REG_TRAINING_DEBUG_3_OFFS));
720 add &= REG_TRAINING_DEBUG_3_MASK;
721 }
722
723 reg = reg_read(REG_READ_DATA_READY_DELAYS_ADDR);
724 reg &= ~(REG_READ_DATA_READY_DELAYS_MASK <<
725 (REG_READ_DATA_READY_DELAYS_OFFS * cs));
726 reg |= ((rd_sample_delay + add) << (REG_READ_DATA_READY_DELAYS_OFFS * cs));
727 reg_write(REG_READ_DATA_READY_DELAYS_ADDR, reg);
728 dram_info->rd_rdy_dly = rd_sample_delay + add;
729
730 for (cs = 0; cs < dram_info->num_cs; cs++) {
731 for (pup = 0; pup < dram_info->num_of_total_pups; pup++) {
732 reg = ddr3_read_pup_reg(PUP_RL_MODE + 0x1, cs, pup);
733 dram_info->rl_val[cs][pup][DQS] = (reg & 0x3F);
734 }
735 }
736
737 return MV_OK;
738}
739
740#else
741
742/*
743 * Name: ddr3_read_leveling_single_cs_window_mode
744 * Desc: Execute Read leveling for single Chip select
745 * Args: cs - current chip select
746 * freq - current sequence frequency
747 * ecc - ecc iteration indication
748 * dram_info - main struct
749 * Notes:
750 * Returns: MV_OK if success, MV_FAIL if fail.
751 */
752static int ddr3_read_leveling_single_cs_window_mode(u32 cs, u32 freq,
753 int ratio_2to1, u32 ecc,
754 MV_DRAM_INFO *dram_info)
755{
756 u32 reg, delay, phase, sum, pup, rd_sample_delay, add, locked_pups,
757 repeat_max_cnt, sdram_offset, final_sum, locked_sum;
758 u32 delay_s, delay_e, tmp, phase_min, ui_max_delay;
759 int all_locked, first_octet_locked, counter_in_progress;
760 int final_delay = 0;
761
762 DEBUG_RL_FULL_C("DDR3 - Read Leveling - Single CS - ", (u32) cs, 1);
763
764 /* Init values */
765 phase = 0;
766 delay = 0;
767 rd_sample_delay = dram_info->cl;
768 all_locked = 0;
769 first_octet_locked = 0;
770 repeat_max_cnt = 0;
771 sum = 0;
772 final_sum = 0;
773 locked_sum = 0;
774
775 for (pup = 0; pup < (dram_info->num_of_std_pups * (1 - ecc) + ecc);
776 pup++)
777 dram_info->rl_val[cs][pup + ecc * ECC_BIT][S] = 0;
778
779 /* Main loop */
780 while (!all_locked) {
781 counter_in_progress = 0;
782
783 DEBUG_RL_FULL_S("DDR3 - Read Leveling - RdSmplDly = ");
784 DEBUG_RL_FULL_D(rd_sample_delay, 2);
785 DEBUG_RL_FULL_S(", RdRdyDly = ");
786 DEBUG_RL_FULL_D(dram_info->rd_rdy_dly, 2);
787 DEBUG_RL_FULL_S(", Phase = ");
788 DEBUG_RL_FULL_D(phase, 1);
789 DEBUG_RL_FULL_S(", Delay = ");
790 DEBUG_RL_FULL_D(delay, 2);
791 DEBUG_RL_FULL_S("\n");
792
793 /*
794 * Broadcast to all PUPs current RL delays: DQS phase,leveling
795 * delay
796 */
797 ddr3_write_pup_reg(PUP_RL_MODE, cs, PUP_BC, phase, delay);
798
799 /* Reset PHY read FIFO */
800 reg = reg_read(REG_DRAM_TRAINING_2_ADDR) |
801 (1 << REG_DRAM_TRAINING_2_FIFO_RST_OFFS);
802 /* 0x15B8 - Training SW 2 Register */
803 reg_write(REG_DRAM_TRAINING_2_ADDR, reg);
804
805 do {
806 reg = (reg_read(REG_DRAM_TRAINING_2_ADDR)) &
807 (1 << REG_DRAM_TRAINING_2_FIFO_RST_OFFS);
808 } while (reg); /* Wait for '0' */
809
810 /* Read pattern from SDRAM */
811 sdram_offset = cs * (SDRAM_CS_SIZE + 1) + SDRAM_RL_OFFS;
812 locked_pups = 0;
813 if (MV_OK !=
814 ddr3_sdram_compare(dram_info, 0xFF, &locked_pups,
815 rl_pattern, LEN_STD_PATTERN,
816 sdram_offset, 0, 0, NULL, 0))
817 return MV_DDR3_TRAINING_ERR_RD_LVL_WIN_PATTERN;
818
819 /* Octet evaluation */
820 for (pup = 0; pup < (dram_info->num_of_std_pups *
821 (1 - ecc) + ecc); pup++) {
822 /* pup_num = Q or 1 for ECC */
823 int idx;
824
825 idx = pup + ecc * ECC_BIT;
826
827 /* Check Overrun */
828 if (!((reg_read(REG_DRAM_TRAINING_2_ADDR) >>
829 (REG_DRAM_TRAINING_2_OVERRUN_OFFS +
830 pup)) & 0x1)) {
831 /* If no OverRun */
832
833 /* Inside the window */
834 if (dram_info->rl_val[cs][idx][S] == RL_WINDOW_STATE) {
835 /*
836 * Match expected value ? - Update
837 * State Machine
838 */
839 if (((~locked_pups >> pup) & 0x1)
840 && (final_delay == 0)) {
841 /* Match - Still inside the Window */
842 DEBUG_RL_FULL_C("DDR3 - Read Leveling - We got another match inside the window for pup: ",
843 (u32)pup, 1);
844
845 } else {
846 /* We got fail -> this is the end of the window */
847 dram_info->rl_val[cs][idx][DE] = delay;
848 dram_info->rl_val[cs][idx][PE] = phase;
849 /* Go to Final State */
850 dram_info->rl_val[cs][idx][S]++;
851 final_sum++;
852 DEBUG_RL_FULL_C("DDR3 - Read Leveling - We finished the window for pup: ",
853 (u32)pup, 1);
854 }
855
856 /* Before the start of the window */
857 } else if (dram_info->rl_val[cs][idx][S] ==
858 RL_UNLOCK_STATE) {
859 /* Must be RL_UNLOCK_STATE */
860 /*
861 * Match expected value ? - Update
862 * State Machine
863 */
864 if (dram_info->rl_val[cs][idx][C] <
865 RL_RETRY_COUNT) {
866 if (((~locked_pups >> pup) & 0x1)) {
867 /* Match */
868 DEBUG_RL_FULL_C("DDR3 - Read Leveling - We have no overrun and a match on pup: ",
869 (u32)pup, 1);
870 dram_info->rl_val[cs][idx][C]++;
871
872 /* If pup got to last state - lock the delays */
873 if (dram_info->rl_val[cs][idx][C] ==
874 RL_RETRY_COUNT) {
875 dram_info->rl_val[cs][idx][C] = 0;
876 dram_info->rl_val[cs][idx][DS] =
877 delay;
878 dram_info->rl_val[cs][idx][PS] =
879 phase;
880 dram_info->rl_val[cs][idx][S]++; /* Go to Window State */
881 locked_sum++;
882 /* Will count the pups that got locked */
883
884 /* IF First lock - need to lock delays */
885 if (first_octet_locked == 0) {
886 DEBUG_RL_FULL_C("DDR3 - Read Leveling - We got first lock on pup: ",
887 (u32)pup, 1);
888 first_octet_locked
889 =
890 1;
891 }
892 }
893
894 /* if pup is in not in final state but there was match - dont increment counter */
895 else {
896 counter_in_progress
897 = 1;
898 }
899 }
900 }
901 }
902 } else {
903 DEBUG_RL_FULL_C("DDR3 - Read Leveling - We got overrun on pup: ",
904 (u32)pup, 1);
905 counter_in_progress = 1;
906 }
907 }
908
909 if (final_sum == (dram_info->num_of_std_pups * (1 - ecc) + ecc)) {
910 all_locked = 1;
911 DEBUG_RL_FULL_S("DDR3 - Read Leveling - Single Cs - All pups locked\n");
912 }
913
914 /*
915 * This is a fix for unstable condition where pups are
916 * toggling between match and no match
917 */
918 /*
919 * If some of the pups is >1 <3, check if we did it too many
920 * times
921 */
922 if (counter_in_progress == 1) {
923 if (repeat_max_cnt < RL_RETRY_COUNT) {
924 /* Notify at least one Counter is >=1 and < 3 */
925 repeat_max_cnt++;
926 counter_in_progress = 1;
927 DEBUG_RL_FULL_S("DDR3 - Read Leveling - Counter is >=1 and <3\n");
928 DEBUG_RL_FULL_S("DDR3 - Read Leveling - So we will not increment the delay to see if locked again\n");
929 } else {
930 DEBUG_RL_FULL_S("DDR3 - Read Leveling - repeat_max_cnt reached max so now we will increment the delay\n");
931 counter_in_progress = 0;
932 }
933 }
934
935 /*
936 * Check some of the pups are in the middle of state machine
937 * and don't increment the delays
938 */
939 if (!counter_in_progress && !all_locked) {
940 repeat_max_cnt = 0;
941 if (!ratio_2to1)
942 ui_max_delay = MAX_DELAY_INV;
943 else
944 ui_max_delay = MAX_DELAY;
945
946 /* Increment Delay */
947 if (delay < ui_max_delay) {
948 /* Delay Incrementation */
949 delay++;
950 if (delay == ui_max_delay) {
951 /*
952 * Mark the last delay/pahse place
953 * for window final place
954 */
955 if ((!ratio_2to1
956 && phase == MAX_PHASE_RL_L_1TO1)
957 || (ratio_2to1
958 && phase ==
959 MAX_PHASE_RL_L_2TO1))
960 final_delay = 1;
961 }
962 } else {
963 /* Phase+CL Incrementation */
964 delay = 0;
965 if (!ratio_2to1) {
966 /* 1:1 mode */
967 if (first_octet_locked) {
968 /* some pupet was Locked */
969 if (phase < MAX_PHASE_RL_L_1TO1) {
970#ifdef RL_WINDOW_WA
971 if (phase == 0)
972#else
973 if (phase == 1)
974#endif
975 phase = 4;
976 else
977 phase++;
978 } else {
979 DEBUG_RL_FULL_S("DDR3 - Read Leveling - ERROR - NOT all PUPs Locked\n");
980 return MV_DDR3_TRAINING_ERR_RD_LVL_WIN_PUP_UNLOCK;
981 }
982 } else {
983 /* No Pup was Locked */
984 if (phase < MAX_PHASE_RL_UL_1TO1) {
985#ifdef RL_WINDOW_WA
986 if (phase == 0)
987 phase = 4;
988#else
989 phase++;
990#endif
991 } else
992 phase = 0;
993 }
994 } else {
995 /* 2:1 mode */
996 if (first_octet_locked) {
997 /* Some Pup was Locked */
998 if (phase < MAX_PHASE_RL_L_2TO1) {
999 phase++;
1000 } else {
1001 DEBUG_RL_FULL_S("DDR3 - Read Leveling - ERROR - NOT all PUPs Locked\n");
1002 return MV_DDR3_TRAINING_ERR_RD_LVL_WIN_PUP_UNLOCK;
1003 }
1004 } else {
1005 /* No Pup was Locked */
1006 if (phase < MAX_PHASE_RL_UL_2TO1)
1007 phase++;
1008 else
1009 phase = 0;
1010 }
1011 }
1012
1013 /*
1014 * If we finished a full Phases cycle (so
1015 * now phase = 0, need to increment
1016 * rd_sample_dly
1017 */
1018 if (phase == 0 && first_octet_locked == 0) {
1019 rd_sample_delay++;
1020
1021 /* Set current rd_sample_delay */
1022 reg = reg_read(REG_READ_DATA_SAMPLE_DELAYS_ADDR);
1023 reg &= ~(REG_READ_DATA_SAMPLE_DELAYS_MASK <<
1024 (REG_READ_DATA_SAMPLE_DELAYS_OFFS
1025 * cs));
1026 reg |= (rd_sample_delay <<
1027 (REG_READ_DATA_SAMPLE_DELAYS_OFFS *
1028 cs));
1029 reg_write(REG_READ_DATA_SAMPLE_DELAYS_ADDR,
1030 reg);
1031 }
1032
1033 /*
1034 * Set current rdReadyDelay according to the
1035 * hash table (Need to do this in every phase
1036 * change)
1037 */
1038 if (!ratio_2to1) {
1039 /* 1:1 mode */
1040 add = reg_read(REG_TRAINING_DEBUG_2_ADDR);
1041 switch (phase) {
1042 case 0:
1043 add = add >>
1044 REG_TRAINING_DEBUG_2_OFFS;
1045 break;
1046 case 1:
1047 add = add >>
1048 (REG_TRAINING_DEBUG_2_OFFS
1049 + 3);
1050 break;
1051 case 4:
1052 add = add >>
1053 (REG_TRAINING_DEBUG_2_OFFS
1054 + 6);
1055 break;
1056 case 5:
1057 add = add >>
1058 (REG_TRAINING_DEBUG_2_OFFS
1059 + 9);
1060 break;
1061 }
1062 } else {
1063 /* 2:1 mode */
1064 add = reg_read(REG_TRAINING_DEBUG_3_ADDR);
1065 add = (add >> phase *
1066 REG_TRAINING_DEBUG_3_OFFS);
1067 }
1068 add &= REG_TRAINING_DEBUG_2_MASK;
1069 reg = reg_read(REG_READ_DATA_READY_DELAYS_ADDR);
1070 reg &= ~(REG_READ_DATA_READY_DELAYS_MASK <<
1071 (REG_READ_DATA_READY_DELAYS_OFFS * cs));
1072 reg |= ((rd_sample_delay + add) <<
1073 (REG_READ_DATA_READY_DELAYS_OFFS * cs));
1074 reg_write(REG_READ_DATA_READY_DELAYS_ADDR, reg);
1075 dram_info->rd_smpl_dly = rd_sample_delay;
1076 dram_info->rd_rdy_dly = rd_sample_delay + add;
1077 }
1078
1079 /* Reset counters for pups with states<RD_STATE_COUNT */
1080 for (pup = 0;
1081 pup <
1082 (dram_info->num_of_std_pups * (1 - ecc) + ecc);
1083 pup++) {
1084 if (dram_info->rl_val[cs][idx][C] < RL_RETRY_COUNT)
1085 dram_info->rl_val[cs][idx][C] = 0;
1086 }
1087 }
1088 }
1089
1090 phase_min = 10;
1091
1092 for (pup = 0; pup < (dram_info->num_of_std_pups); pup++) {
1093 DEBUG_RL_S("DDR3 - Read Leveling - Window info - PUP: ");
1094 DEBUG_RL_D((u32) pup, 1);
1095 DEBUG_RL_S(", PS: ");
1096 DEBUG_RL_D((u32) dram_info->rl_val[cs][pup][PS], 1);
1097 DEBUG_RL_S(", DS: ");
1098 DEBUG_RL_D((u32) dram_info->rl_val[cs][pup][DS], 2);
1099 DEBUG_RL_S(", PE: ");
1100 DEBUG_RL_D((u32) dram_info->rl_val[cs][pup][PE], 1);
1101 DEBUG_RL_S(", DE: ");
1102 DEBUG_RL_D((u32) dram_info->rl_val[cs][pup][DE], 2);
1103 DEBUG_RL_S("\n");
1104 }
1105
1106 /* Find center of the window procedure */
1107 for (pup = 0; pup < (dram_info->num_of_std_pups * (1 - ecc) + ecc);
1108 pup++) {
1109#ifdef RL_WINDOW_WA
1110 if (!ratio_2to1) { /* 1:1 mode */
1111 if (dram_info->rl_val[cs][idx][PS] == 4)
1112 dram_info->rl_val[cs][idx][PS] = 1;
1113 if (dram_info->rl_val[cs][idx][PE] == 4)
1114 dram_info->rl_val[cs][idx][PE] = 1;
1115
1116 delay_s = dram_info->rl_val[cs][idx][PS] *
1117 MAX_DELAY_INV + dram_info->rl_val[cs][idx][DS];
1118 delay_e = dram_info->rl_val[cs][idx][PE] *
1119 MAX_DELAY_INV + dram_info->rl_val[cs][idx][DE];
1120
1121 tmp = (delay_e - delay_s) / 2 + delay_s;
1122 phase = tmp / MAX_DELAY_INV;
1123 if (phase == 1) /* 1:1 mode */
1124 phase = 4;
1125
1126 if (phase < phase_min) /* for the read ready delay */
1127 phase_min = phase;
1128
1129 dram_info->rl_val[cs][idx][P] = phase;
1130 dram_info->rl_val[cs][idx][D] = tmp % MAX_DELAY_INV;
1131
1132 } else {
1133 delay_s = dram_info->rl_val[cs][idx][PS] *
1134 MAX_DELAY + dram_info->rl_val[cs][idx][DS];
1135 delay_e = dram_info->rl_val[cs][idx][PE] *
1136 MAX_DELAY + dram_info->rl_val[cs][idx][DE];
1137
1138 tmp = (delay_e - delay_s) / 2 + delay_s;
1139 phase = tmp / MAX_DELAY;
1140
1141 if (phase < phase_min) /* for the read ready delay */
1142 phase_min = phase;
1143
1144 dram_info->rl_val[cs][idx][P] = phase;
1145 dram_info->rl_val[cs][idx][D] = tmp % MAX_DELAY;
1146 }
1147#else
1148 if (!ratio_2to1) { /* 1:1 mode */
1149 if (dram_info->rl_val[cs][idx][PS] > 1)
1150 dram_info->rl_val[cs][idx][PS] -= 2;
1151 if (dram_info->rl_val[cs][idx][PE] > 1)
1152 dram_info->rl_val[cs][idx][PE] -= 2;
1153 }
1154
1155 delay_s = dram_info->rl_val[cs][idx][PS] * MAX_DELAY +
1156 dram_info->rl_val[cs][idx][DS];
1157 delay_e = dram_info->rl_val[cs][idx][PE] * MAX_DELAY +
1158 dram_info->rl_val[cs][idx][DE];
1159
1160 tmp = (delay_e - delay_s) / 2 + delay_s;
1161 phase = tmp / MAX_DELAY;
1162 if (!ratio_2to1 && phase > 1) /* 1:1 mode */
1163 phase += 2;
1164
1165 if (phase < phase_min) /* for the read ready delay */
1166 phase_min = phase;
1167
1168 dram_info->rl_val[cs][idx][P] = phase;
1169 dram_info->rl_val[cs][idx][D] = tmp % MAX_DELAY;
1170#endif
1171 }
1172
1173 /* Set current rdReadyDelay according to the hash table (Need to do this in every phase change) */
1174 if (!ratio_2to1) { /* 1:1 mode */
1175 add = reg_read(REG_TRAINING_DEBUG_2_ADDR);
1176 switch (phase_min) {
1177 case 0:
1178 add = (add >> REG_TRAINING_DEBUG_2_OFFS);
1179 break;
1180 case 1:
1181 add = (add >> (REG_TRAINING_DEBUG_2_OFFS + 3));
1182 break;
1183 case 4:
1184 add = (add >> (REG_TRAINING_DEBUG_2_OFFS + 6));
1185 break;
1186 case 5:
1187 add = (add >> (REG_TRAINING_DEBUG_2_OFFS + 9));
1188 break;
1189 }
1190 } else { /* 2:1 mode */
1191 add = reg_read(REG_TRAINING_DEBUG_3_ADDR);
1192 add = (add >> phase_min * REG_TRAINING_DEBUG_3_OFFS);
1193 }
1194
1195 add &= REG_TRAINING_DEBUG_2_MASK;
1196 reg = reg_read(REG_READ_DATA_READY_DELAYS_ADDR);
1197 reg &=
1198 ~(REG_READ_DATA_READY_DELAYS_MASK <<
1199 (REG_READ_DATA_READY_DELAYS_OFFS * cs));
1200 reg |=
1201 ((rd_sample_delay + add) << (REG_READ_DATA_READY_DELAYS_OFFS * cs));
1202 reg_write(REG_READ_DATA_READY_DELAYS_ADDR, reg);
1203 dram_info->rd_rdy_dly = rd_sample_delay + add;
1204
1205 for (cs = 0; cs < dram_info->num_cs; cs++) {
1206 for (pup = 0; pup < dram_info->num_of_total_pups; pup++) {
1207 reg = ddr3_read_pup_reg(PUP_RL_MODE + 0x1, cs, pup);
1208 dram_info->rl_val[cs][pup][DQS] = (reg & 0x3F);
1209 }
1210 }
1211
1212 return MV_OK;
1213}
1214#endif