1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (C) Marvell International Ltd. and its affiliates
4  */
5 
6 #include <common.h>
7 #include <i2c.h>
8 #include <log.h>
9 #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 
42 extern u32 rl_pattern[LEN_STD_PATTERN];
43 
44 #ifdef RL_MODE
45 static 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
49 static 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  */
ddr3_read_leveling_hw(u32 freq,MV_DRAM_INFO * dram_info)62 int 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  */
ddr3_read_leveling_sw(u32 freq,int ratio_2to1,MV_DRAM_INFO * dram_info)180 int 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  */
overrun(u32 cs,MV_DRAM_INFO * info,u32 pup,u32 locked_pups,u32 * locked_sum,u32 ecc,int * first_octet_locked,int * counter_in_progress,int final_delay,u32 delay,u32 phase)336 static 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  */
ddr3_read_leveling_single_cs_rl_mode(u32 cs,u32 freq,int ratio_2to1,u32 ecc,MV_DRAM_INFO * dram_info)400 static 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  */
ddr3_read_leveling_single_cs_window_mode(u32 cs,u32 freq,int ratio_2to1,u32 ecc,MV_DRAM_INFO * dram_info)752 static 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
1215