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