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_WL_C(s, d, l) \
     19 	DEBUG_WL_S(s); DEBUG_WL_D(d, l); DEBUG_WL_S("\n")
     20 #define DEBUG_WL_FULL_C(s, d, l) \
     21 	DEBUG_WL_FULL_S(s); DEBUG_WL_FULL_D(d, l); DEBUG_WL_FULL_S("\n")
     22 
     23 #ifdef MV_DEBUG_WL
     24 #define DEBUG_WL_S(s)			puts(s)
     25 #define DEBUG_WL_D(d, l)		printf("%x", d)
     26 #define DEBUG_RL_S(s) \
     27 	debug_cond(ddr3_get_log_level() >= MV_LOG_LEVEL_2, "%s", s)
     28 #define DEBUG_RL_D(d, l) \
     29 	debug_cond(ddr3_get_log_level() >= MV_LOG_LEVEL_2, "%x", d)
     30 #else
     31 #define DEBUG_WL_S(s)
     32 #define DEBUG_WL_D(d, l)
     33 #endif
     34 
     35 #ifdef MV_DEBUG_WL_FULL
     36 #define DEBUG_WL_FULL_S(s)		puts(s)
     37 #define DEBUG_WL_FULL_D(d, l)		printf("%x", d)
     38 #else
     39 #define DEBUG_WL_FULL_S(s)
     40 #define DEBUG_WL_FULL_D(d, l)
     41 #endif
     42 
     43 #define WL_SUP_EXPECTED_DATA		0x21
     44 #define WL_SUP_READ_DRAM_ENTRY		0x8
     45 
     46 static int ddr3_write_leveling_single_cs(u32 cs, u32 freq, int ratio_2to1,
     47 					 u32 *result,
     48 					 MV_DRAM_INFO *dram_info);
     49 static void ddr3_write_ctrl_pup_reg(int bc_acc, u32 pup, u32 reg_addr,
     50 				    u32 data);
     51 
     52 extern u16 odt_static[ODT_OPT][MAX_CS];
     53 extern u16 odt_dynamic[ODT_OPT][MAX_CS];
     54 extern u32 wl_sup_pattern[LEN_WL_SUP_PATTERN];
     55 
     56 /*
     57  * Name:     ddr3_write_leveling_hw
     58  * Desc:     Execute Write leveling phase by HW
     59  * Args:     freq      - current sequence frequency
     60  *           dram_info   - main struct
     61  * Notes:
     62  * Returns:  MV_OK if success, MV_FAIL if fail.
     63  */
     64 int ddr3_write_leveling_hw(u32 freq, MV_DRAM_INFO *dram_info)
     65 {
     66 	u32 reg, phase, delay, cs, pup;
     67 #ifdef MV88F67XX
     68 	int dpde_flag = 0;
     69 #endif
     70 	/* Debug message - Start Read leveling procedure */
     71 	DEBUG_WL_S("DDR3 - Write Leveling - Starting HW WL procedure\n");
     72 
     73 #ifdef MV88F67XX
     74 	/* Dynamic pad issue (BTS669) during WL */
     75 	reg = reg_read(REG_DUNIT_CTRL_LOW_ADDR);
     76 	if (reg & (1 << REG_DUNIT_CTRL_LOW_DPDE_OFFS)) {
     77 		dpde_flag = 1;
     78 		reg_write(REG_DUNIT_CTRL_LOW_ADDR,
     79 			  reg & ~(1 << REG_DUNIT_CTRL_LOW_DPDE_OFFS));
     80 	}
     81 #endif
     82 
     83 	reg = 1 << REG_DRAM_TRAINING_WL_OFFS;
     84 	/* Config the retest number */
     85 	reg |= (COUNT_HW_WL << REG_DRAM_TRAINING_RETEST_OFFS);
     86 	reg |= (dram_info->cs_ena << (REG_DRAM_TRAINING_CS_OFFS));
     87 	reg_write(REG_DRAM_TRAINING_ADDR, reg);	/* 0x15B0 - Training Register */
     88 
     89 	reg =  reg_read(REG_DRAM_TRAINING_SHADOW_ADDR) |
     90 		(1 << REG_DRAM_TRAINING_AUTO_OFFS);
     91 	reg_write(REG_DRAM_TRAINING_SHADOW_ADDR, reg);
     92 
     93 	/* Wait */
     94 	do {
     95 		reg = reg_read(REG_DRAM_TRAINING_SHADOW_ADDR) &
     96 			(1 << REG_DRAM_TRAINING_AUTO_OFFS);
     97 	} while (reg);		/* Wait for '0' */
     98 
     99 	reg = reg_read(REG_DRAM_TRAINING_ADDR);
    100 	/* Check if Successful */
    101 	if (reg & (1 << REG_DRAM_TRAINING_ERROR_OFFS)) {
    102 		/*
    103 		 * Read results to arrays - Results are required for WL
    104 		 * High freq Supplement and DQS Centralization
    105 		 */
    106 		for (cs = 0; cs < MAX_CS; cs++) {
    107 			if (dram_info->cs_ena & (1 << cs)) {
    108 				for (pup = 0;
    109 				     pup < dram_info->num_of_total_pups;
    110 				     pup++) {
    111 					if (pup == dram_info->num_of_std_pups
    112 					    && dram_info->ecc_ena)
    113 						pup = ECC_PUP;
    114 					reg =
    115 					    ddr3_read_pup_reg(PUP_WL_MODE, cs,
    116 							      pup);
    117 					phase =
    118 					    (reg >> REG_PHY_PHASE_OFFS) &
    119 					    PUP_PHASE_MASK;
    120 					delay = reg & PUP_DELAY_MASK;
    121 					dram_info->wl_val[cs][pup][P] = phase;
    122 					dram_info->wl_val[cs][pup][D] = delay;
    123 					dram_info->wl_val[cs][pup][S] =
    124 					    WL_HI_FREQ_STATE - 1;
    125 					reg =
    126 					    ddr3_read_pup_reg(PUP_WL_MODE + 0x1,
    127 							      cs, pup);
    128 					dram_info->wl_val[cs][pup][DQS] =
    129 					    (reg & 0x3F);
    130 				}
    131 
    132 #ifdef MV_DEBUG_WL
    133 				/* Debug message - Print res for cs[i]: cs,PUP,Phase,Delay */
    134 				DEBUG_WL_S("DDR3 - Write Leveling - Write Leveling Cs - ");
    135 				DEBUG_WL_D((u32) cs, 1);
    136 				DEBUG_WL_S(" Results:\n");
    137 				for (pup = 0;
    138 				     pup < dram_info->num_of_total_pups;
    139 				     pup++) {
    140 					if (pup == dram_info->num_of_std_pups
    141 					    && dram_info->ecc_ena)
    142 						pup = ECC_PUP;
    143 					DEBUG_WL_S("DDR3 - Write Leveling - PUP: ");
    144 					DEBUG_WL_D((u32) pup, 1);
    145 					DEBUG_WL_S(", Phase: ");
    146 					DEBUG_WL_D((u32)
    147 						   dram_info->wl_val[cs][pup]
    148 						   [P], 1);
    149 					DEBUG_WL_S(", Delay: ");
    150 					DEBUG_WL_D((u32)
    151 						   dram_info->wl_val[cs][pup]
    152 						   [D], 2);
    153 					DEBUG_WL_S("\n");
    154 				}
    155 #endif
    156 			}
    157 		}
    158 
    159 		/* Dynamic pad issue (BTS669) during WL */
    160 #ifdef MV88F67XX
    161 		if (dpde_flag) {
    162 			reg = reg_read(REG_DUNIT_CTRL_LOW_ADDR) |
    163 				(1 << REG_DUNIT_CTRL_LOW_DPDE_OFFS);
    164 			reg_write(REG_DUNIT_CTRL_LOW_ADDR, reg);
    165 		}
    166 #endif
    167 
    168 		DEBUG_WL_S("DDR3 - Write Leveling - HW WL Ended Successfully\n");
    169 
    170 		return MV_OK;
    171 	} else {
    172 		DEBUG_WL_S("DDR3 - Write Leveling - HW WL Error\n");
    173 		return MV_FAIL;
    174 	}
    175 }
    176 
    177 /*
    178  * Name:     ddr3_wl_supplement
    179  * Desc:     Write Leveling Supplement
    180  * Args:     dram_info   - main struct
    181  * Notes:
    182  * Returns:  MV_OK if success, MV_FAIL if fail.
    183  */
    184 int ddr3_wl_supplement(MV_DRAM_INFO *dram_info)
    185 {
    186 	u32 cs, cnt, pup_num, sum, phase, delay, max_pup_num, pup, sdram_offset;
    187 	u32 tmp_count, ecc, reg;
    188 	u32 ddr_width, tmp_pup, idx;
    189 	u32 sdram_pup_val, uj;
    190 	u32 one_clk_err = 0, align_err = 0, no_err = 0, err = 0, err_n = 0;
    191 	u32 sdram_data[LEN_WL_SUP_PATTERN] __aligned(32) = { 0 };
    192 
    193 	ddr_width = dram_info->ddr_width;
    194 	no_err = 0;
    195 
    196 	DEBUG_WL_S("DDR3 - Write Leveling Hi-Freq Supplement - Starting\n");
    197 
    198 	switch (ddr_width) {
    199 		/* Data error from pos-adge to pos-adge */
    200 	case 16:
    201 		one_clk_err = 4;
    202 		align_err = 4;
    203 		break;
    204 	case 32:
    205 		one_clk_err = 8;
    206 		align_err = 8;
    207 		break;
    208 	case 64:
    209 		one_clk_err = 0x10;
    210 		align_err = 0x10;
    211 		break;
    212 	default:
    213 		DEBUG_WL_S("Error - bus width!!!\n");
    214 		return MV_FAIL;
    215 	}
    216 
    217 	/* Enable SW override */
    218 	reg = reg_read(REG_DRAM_TRAINING_2_ADDR) |
    219 		(1 << REG_DRAM_TRAINING_2_SW_OVRD_OFFS);
    220 
    221 	/* [0] = 1 - Enable SW override  */
    222 	/* 0x15B8 - Training SW 2 Register */
    223 	reg_write(REG_DRAM_TRAINING_2_ADDR, reg);
    224 	DEBUG_WL_S("DDR3 - Write Leveling Hi-Freq Supplement - SW Override Enabled\n");
    225 	reg = (1 << REG_DRAM_TRAINING_AUTO_OFFS);
    226 	reg_write(REG_DRAM_TRAINING_ADDR, reg);	/* 0x15B0 - Training Register */
    227 	tmp_count = 0;
    228 	for (cs = 0; cs < MAX_CS; cs++) {
    229 		if (dram_info->cs_ena & (1 << cs)) {
    230 			sum = 0;
    231 			/*
    232 			 * 2 iterations loop: 1)actual WL results 2) fix WL
    233 			 * if needed
    234 			 */
    235 			for (cnt = 0; cnt < COUNT_WL_HI_FREQ; cnt++) {
    236 				DEBUG_WL_C("COUNT = ", cnt, 1);
    237 				for (ecc = 0; ecc < (dram_info->ecc_ena + 1);
    238 				     ecc++) {
    239 					if (ecc) {
    240 						DEBUG_WL_S("ECC PUP:\n");
    241 					} else {
    242 						DEBUG_WL_S("DATA PUP:\n");
    243 					}
    244 
    245 					max_pup_num =
    246 					    dram_info->num_of_std_pups * (1 -
    247 									  ecc) +
    248 					    ecc;
    249 					/* ECC Support - Switch ECC Mux on ecc=1 */
    250 					reg =
    251 					    (reg_read(REG_DRAM_TRAINING_2_ADDR)
    252 					     & ~(1 <<
    253 						 REG_DRAM_TRAINING_2_ECC_MUX_OFFS));
    254 					reg |=
    255 					    (dram_info->ecc_ena *
    256 					     ecc <<
    257 					     REG_DRAM_TRAINING_2_ECC_MUX_OFFS);
    258 					reg_write(REG_DRAM_TRAINING_2_ADDR,
    259 						  reg);
    260 					ddr3_reset_phy_read_fifo();
    261 
    262 					/* Write to memory */
    263 					sdram_offset =
    264 					    tmp_count * (SDRAM_CS_SIZE + 1) +
    265 					    0x200;
    266 					if (MV_OK != ddr3_dram_sram_burst((u32)
    267 									  wl_sup_pattern,
    268 									  sdram_offset,
    269 									  LEN_WL_SUP_PATTERN))
    270 						return MV_FAIL;
    271 
    272 					/* Read from memory */
    273 					if (MV_OK !=
    274 					    ddr3_dram_sram_burst(sdram_offset,
    275 								 (u32)
    276 								 sdram_data,
    277 								 LEN_WL_SUP_PATTERN))
    278 						return MV_FAIL;
    279 
    280 					/* Print the buffer */
    281 					for (uj = 0; uj < LEN_WL_SUP_PATTERN;
    282 					     uj++) {
    283 						if ((uj % 4 == 0) && (uj != 0)) {
    284 							DEBUG_WL_S("\n");
    285 						}
    286 						DEBUG_WL_D(sdram_data[uj],
    287 							   8);
    288 						DEBUG_WL_S(" ");
    289 					}
    290 
    291 					/* Check pup which DQS/DATA is error */
    292 					for (pup = 0; pup < max_pup_num; pup++) {
    293 						/* ECC support - bit 8 */
    294 						pup_num = (ecc) ? ECC_PUP : pup;
    295 						if (pup < 4) {	/* lower 32 bit */
    296 							tmp_pup = pup;
    297 							idx =
    298 							    WL_SUP_READ_DRAM_ENTRY;
    299 						} else {	/* higher 32 bit */
    300 							tmp_pup = pup - 4;
    301 							idx =
    302 							    WL_SUP_READ_DRAM_ENTRY
    303 							    + 1;
    304 						}
    305 						DEBUG_WL_S("\nCS: ");
    306 						DEBUG_WL_D((u32) cs, 1);
    307 						DEBUG_WL_S(" PUP: ");
    308 						DEBUG_WL_D((u32) pup_num, 1);
    309 						DEBUG_WL_S("\n");
    310 						sdram_pup_val =
    311 						    ((sdram_data[idx] >>
    312 						      ((tmp_pup) * 8)) & 0xFF);
    313 						DEBUG_WL_C("Actual Data = ",
    314 							   sdram_pup_val, 2);
    315 						DEBUG_WL_C("Expected Data = ",
    316 							   (WL_SUP_EXPECTED_DATA
    317 							    + pup), 2);
    318 						/*
    319 						 * ALINGHMENT: calculate
    320 						 * expected data vs actual data
    321 						 */
    322 						err =
    323 						    (WL_SUP_EXPECTED_DATA +
    324 						     pup) - sdram_pup_val;
    325 						/*
    326 						 * CLOCK LONG: calculate
    327 						 * expected data vs actual data
    328 						 */
    329 						err_n =
    330 						    sdram_pup_val -
    331 						    (WL_SUP_EXPECTED_DATA +
    332 						     pup);
    333 						DEBUG_WL_C("err = ", err, 2);
    334 						DEBUG_WL_C("err_n = ", err_n,
    335 							   2);
    336 						if (err == no_err) {
    337 							/* PUP is correct - increment State */
    338 							dram_info->wl_val[cs]
    339 							    [pup_num]
    340 							    [S] = 1;
    341 						} else if (err_n == one_clk_err) {
    342 							/* clock is longer than DQS */
    343 							phase =
    344 							    ((dram_info->wl_val
    345 							      [cs]
    346 							      [pup_num][P] +
    347 							      WL_HI_FREQ_SHIFT)
    348 							     % MAX_PHASE_2TO1);
    349 							dram_info->wl_val[cs]
    350 							    [pup_num]
    351 							    [P] = phase;
    352 							delay =
    353 							    dram_info->wl_val
    354 							    [cs][pup_num]
    355 							    [D];
    356 							DEBUG_WL_S("#### Clock is longer than DQS more than one clk cycle ####\n");
    357 							ddr3_write_pup_reg
    358 							    (PUP_WL_MODE, cs,
    359 							     pup * (1 - ecc) +
    360 							     ECC_PUP * ecc,
    361 							     phase, delay);
    362 						} else if (err == align_err) {
    363 							/* clock is align to DQS */
    364 							phase =
    365 							    dram_info->wl_val
    366 							    [cs][pup_num]
    367 							    [P];
    368 							delay =
    369 							    dram_info->wl_val
    370 							    [cs][pup_num]
    371 							    [D];
    372 							DEBUG_WL_S("#### Alignment PUPS problem ####\n");
    373 							if ((phase == 0)
    374 							    || ((phase == 1)
    375 								&& (delay <=
    376 								    0x10))) {
    377 								DEBUG_WL_S("#### Warning - Possible Layout Violation (DQS is longer than CLK)####\n");
    378 							}
    379 
    380 							phase = 0x0;
    381 							delay = 0x0;
    382 							dram_info->wl_val[cs]
    383 							    [pup_num]
    384 							    [P] = phase;
    385 							dram_info->wl_val[cs]
    386 							    [pup_num]
    387 							    [D] = delay;
    388 							ddr3_write_pup_reg
    389 							    (PUP_WL_MODE, cs,
    390 							     pup * (1 - ecc) +
    391 							     ECC_PUP * ecc,
    392 							     phase, delay);
    393 						}
    394 						/* Stop condition for ECC phase */
    395 						pup = (ecc) ? max_pup_num : pup;
    396 					}
    397 
    398 					/* ECC Support - Disable ECC MUX */
    399 					reg =
    400 					    (reg_read(REG_DRAM_TRAINING_2_ADDR)
    401 					     & ~(1 <<
    402 						 REG_DRAM_TRAINING_2_ECC_MUX_OFFS));
    403 					reg_write(REG_DRAM_TRAINING_2_ADDR,
    404 						  reg);
    405 				}
    406 			}
    407 
    408 			for (pup = 0; pup < dram_info->num_of_std_pups; pup++)
    409 				sum += dram_info->wl_val[cs][pup][S];
    410 
    411 			if (dram_info->ecc_ena)
    412 				sum += dram_info->wl_val[cs][ECC_PUP][S];
    413 
    414 			/* Checks if any pup is not locked after the change */
    415 			if (sum < (WL_HI_FREQ_STATE * (dram_info->num_of_total_pups))) {
    416 				DEBUG_WL_C("DDR3 - Write Leveling Hi-Freq Supplement - didn't work for Cs - ",
    417 					   (u32) cs, 1);
    418 				return MV_FAIL;
    419 			}
    420 			tmp_count++;
    421 		}
    422 	}
    423 
    424 	dram_info->wl_max_phase = 0;
    425 	dram_info->wl_min_phase = 10;
    426 
    427 	/*
    428 	 * Read results to arrays - Results are required for DQS Centralization
    429 	 */
    430 	for (cs = 0; cs < MAX_CS; cs++) {
    431 		if (dram_info->cs_ena & (1 << cs)) {
    432 			for (pup = 0; pup < dram_info->num_of_total_pups; pup++) {
    433 				if (pup == dram_info->num_of_std_pups
    434 				    && dram_info->ecc_ena)
    435 					pup = ECC_PUP;
    436 				reg = ddr3_read_pup_reg(PUP_WL_MODE, cs, pup);
    437 				phase =
    438 				    (reg >> REG_PHY_PHASE_OFFS) &
    439 				    PUP_PHASE_MASK;
    440 				if (phase > dram_info->wl_max_phase)
    441 					dram_info->wl_max_phase = phase;
    442 				if (phase < dram_info->wl_min_phase)
    443 					dram_info->wl_min_phase = phase;
    444 			}
    445 		}
    446 	}
    447 
    448 	/* Disable SW override - Must be in a different stage */
    449 	/* [0]=0 - Enable SW override  */
    450 	reg = reg_read(REG_DRAM_TRAINING_2_ADDR);
    451 	reg &= ~(1 << REG_DRAM_TRAINING_2_SW_OVRD_OFFS);
    452 	/* 0x15B8 - Training SW 2 Register */
    453 	reg_write(REG_DRAM_TRAINING_2_ADDR, reg);
    454 
    455 	reg = reg_read(REG_DRAM_TRAINING_1_ADDR) |
    456 		(1 << REG_DRAM_TRAINING_1_TRNBPOINT_OFFS);
    457 	reg_write(REG_DRAM_TRAINING_1_ADDR, reg);
    458 
    459 	DEBUG_WL_S("DDR3 - Write Leveling Hi-Freq Supplement - Ended Successfully\n");
    460 
    461 	return MV_OK;
    462 }
    463 
    464 /*
    465  * Name:     ddr3_write_leveling_hw_reg_dimm
    466  * Desc:     Execute Write leveling phase by HW
    467  * Args:     freq      - current sequence frequency
    468  *           dram_info   - main struct
    469  * Notes:
    470  * Returns:  MV_OK if success, MV_FAIL if fail.
    471  */
    472 int ddr3_write_leveling_hw_reg_dimm(u32 freq, MV_DRAM_INFO *dram_info)
    473 {
    474 	u32 reg, phase, delay, cs, pup, pup_num;
    475 	__maybe_unused int dpde_flag = 0;
    476 
    477 	/* Debug message - Start Read leveling procedure */
    478 	DEBUG_WL_S("DDR3 - Write Leveling - Starting HW WL procedure\n");
    479 
    480 	if (dram_info->num_cs > 2) {
    481 		DEBUG_WL_S("DDR3 - Write Leveling - HW WL Ended Successfully\n");
    482 		return MV_NO_CHANGE;
    483 	}
    484 
    485 	/* If target freq = 400 move clock start point */
    486 	/* Write to control PUP to Control Deskew Regs */
    487 	if (freq <= DDR_400) {
    488 		for (pup = 0; pup <= dram_info->num_of_total_pups; pup++) {
    489 			/* PUP_DELAY_MASK 0x1F */
    490 			/* reg = 0x0C10001F + (uj << 16); */
    491 			ddr3_write_ctrl_pup_reg(1, pup, CNTRL_PUP_DESKEW + pup,
    492 						0x1F);
    493 		}
    494 	}
    495 
    496 #ifdef MV88F67XX
    497 	/* Dynamic pad issue (BTS669) during WL */
    498 	reg = reg_read(REG_DUNIT_CTRL_LOW_ADDR);
    499 	if (reg & (1 << REG_DUNIT_CTRL_LOW_DPDE_OFFS)) {
    500 		dpde_flag = 1;
    501 		reg_write(REG_DUNIT_CTRL_LOW_ADDR,
    502 			  reg & ~(1 << REG_DUNIT_CTRL_LOW_DPDE_OFFS));
    503 	}
    504 #endif
    505 
    506 	reg = (1 << REG_DRAM_TRAINING_WL_OFFS);
    507 	/* Config the retest number */
    508 	reg |= (COUNT_HW_WL << REG_DRAM_TRAINING_RETEST_OFFS);
    509 	reg |= (dram_info->cs_ena << (REG_DRAM_TRAINING_CS_OFFS));
    510 	reg_write(REG_DRAM_TRAINING_ADDR, reg);	/* 0x15B0 - Training Register */
    511 
    512 	reg = reg_read(REG_DRAM_TRAINING_SHADOW_ADDR) |
    513 		(1 << REG_DRAM_TRAINING_AUTO_OFFS);
    514 	reg_write(REG_DRAM_TRAINING_SHADOW_ADDR, reg);
    515 
    516 	/* Wait */
    517 	do {
    518 		reg = reg_read(REG_DRAM_TRAINING_SHADOW_ADDR) &
    519 			(1 << REG_DRAM_TRAINING_AUTO_OFFS);
    520 	} while (reg);		/* Wait for '0' */
    521 
    522 	reg = reg_read(REG_DRAM_TRAINING_ADDR);
    523 	/* Check if Successful */
    524 	if (reg & (1 << REG_DRAM_TRAINING_ERROR_OFFS)) {
    525 		/*
    526 		 * Read results to arrays - Results are required for WL High
    527 		 * freq Supplement and DQS Centralization
    528 		 */
    529 		for (cs = 0; cs < MAX_CS; cs++) {
    530 			if (dram_info->cs_ena & (1 << cs)) {
    531 				for (pup = 0;
    532 				     pup < dram_info->num_of_total_pups;
    533 				     pup++) {
    534 					if (pup == dram_info->num_of_std_pups
    535 					    && dram_info->ecc_ena)
    536 						pup = ECC_BIT;
    537 					reg =
    538 					    ddr3_read_pup_reg(PUP_WL_MODE, cs,
    539 							      pup);
    540 					phase =
    541 					    (reg >> REG_PHY_PHASE_OFFS) &
    542 					    PUP_PHASE_MASK;
    543 					delay = reg & PUP_DELAY_MASK;
    544 					dram_info->wl_val[cs][pup][P] = phase;
    545 					dram_info->wl_val[cs][pup][D] = delay;
    546 					if ((phase == 1) && (delay >= 0x1D)) {
    547 						/*
    548 						 * Need to do it here for
    549 						 * uncorrect WL values
    550 						 */
    551 						ddr3_write_pup_reg(PUP_WL_MODE,
    552 								   cs, pup, 0,
    553 								   0);
    554 						dram_info->wl_val[cs][pup][P] =
    555 						    0;
    556 						dram_info->wl_val[cs][pup][D] =
    557 						    0;
    558 					}
    559 					dram_info->wl_val[cs][pup][S] =
    560 					    WL_HI_FREQ_STATE - 1;
    561 					reg =
    562 					    ddr3_read_pup_reg(PUP_WL_MODE + 0x1,
    563 							      cs, pup);
    564 					dram_info->wl_val[cs][pup][DQS] =
    565 					    (reg & 0x3F);
    566 				}
    567 #ifdef MV_DEBUG_WL
    568 				/*
    569 				 * Debug message - Print res for cs[i]:
    570 				 * cs,PUP,Phase,Delay
    571 				 */
    572 				DEBUG_WL_S("DDR3 - Write Leveling - Write Leveling Cs - ");
    573 				DEBUG_WL_D((u32) cs, 1);
    574 				DEBUG_WL_S(" Results:\n");
    575 				for (pup = 0;
    576 				     pup < dram_info->num_of_total_pups;
    577 				     pup++) {
    578 					DEBUG_WL_S
    579 					    ("DDR3 - Write Leveling - PUP: ");
    580 					DEBUG_WL_D((u32) pup, 1);
    581 					DEBUG_WL_S(", Phase: ");
    582 					DEBUG_WL_D((u32)
    583 						   dram_info->wl_val[cs][pup]
    584 						   [P], 1);
    585 					DEBUG_WL_S(", Delay: ");
    586 					DEBUG_WL_D((u32)
    587 						   dram_info->wl_val[cs][pup]
    588 						   [D], 2);
    589 					DEBUG_WL_S("\n");
    590 				}
    591 #endif
    592 			}
    593 		}
    594 
    595 #ifdef MV88F67XX
    596 		/* Dynamic pad issue (BTS669) during WL */
    597 		if (dpde_flag) {
    598 			reg = reg_read(REG_DUNIT_CTRL_LOW_ADDR) |
    599 				(1 << REG_DUNIT_CTRL_LOW_DPDE_OFFS);
    600 			reg_write(REG_DUNIT_CTRL_LOW_ADDR, reg);
    601 		}
    602 #endif
    603 		DEBUG_WL_S("DDR3 - Write Leveling - HW WL Ended Successfully\n");
    604 
    605 		/* If target freq = 400 move clock back */
    606 		/* Write to control PUP to Control Deskew Regs */
    607 		if (freq <= DDR_400) {
    608 			for (pup = 0; pup <= dram_info->num_of_total_pups;
    609 			     pup++) {
    610 				ddr3_write_ctrl_pup_reg(1, pup,
    611 							CNTRL_PUP_DESKEW + pup, 0);
    612 			}
    613 		}
    614 
    615 		return MV_OK;
    616 	} else {
    617 		/* Configure Each PUP with locked leveling settings */
    618 		for (cs = 0; cs < MAX_CS; cs++) {
    619 			if (dram_info->cs_ena & (1 << cs)) {
    620 				for (pup = 0;
    621 				     pup < dram_info->num_of_total_pups;
    622 				     pup++) {
    623 					/* ECC support - bit 8 */
    624 					pup_num = (pup == dram_info->num_of_std_pups) ?
    625 						ECC_BIT : pup;
    626 					ddr3_write_pup_reg(PUP_WL_MODE, cs,
    627 							   pup_num, 0, 0);
    628 				}
    629 			}
    630 		}
    631 
    632 		reg_write(REG_DRAM_TRAINING_ADDR, 0);
    633 
    634 		/* If target freq = 400 move clock back */
    635 		/* Write to control PUP to Control Deskew Regs */
    636 		if (freq <= DDR_400) {
    637 			for (pup = 0; pup <= dram_info->num_of_total_pups;
    638 			     pup++) {
    639 				ddr3_write_ctrl_pup_reg(1, pup,
    640 							CNTRL_PUP_DESKEW + pup, 0);
    641 			}
    642 		}
    643 
    644 		DEBUG_WL_S("DDR3 - Write Leveling - HW WL Ended Successfully\n");
    645 		return MV_NO_CHANGE;
    646 	}
    647 }
    648 
    649 /*
    650  * Name:     ddr3_write_leveling_sw
    651  * Desc:     Execute Write leveling phase by SW
    652  * Args:     freq      - current sequence frequency
    653  *           dram_info   - main struct
    654  * Notes:
    655  * Returns:  MV_OK if success, MV_FAIL if fail.
    656  */
    657 int ddr3_write_leveling_sw(u32 freq, int ratio_2to1, MV_DRAM_INFO *dram_info)
    658 {
    659 	u32 reg, cs, cnt, pup, max_pup_num;
    660 	u32 res[MAX_CS];
    661 	max_pup_num = dram_info->num_of_total_pups;
    662 	__maybe_unused int dpde_flag = 0;
    663 
    664 	/* Debug message - Start Write leveling procedure */
    665 	DEBUG_WL_S("DDR3 - Write Leveling - Starting SW WL procedure\n");
    666 
    667 #ifdef MV88F67XX
    668 	/* Dynamic pad issue (BTS669) during WL */
    669 	reg = reg_read(REG_DUNIT_CTRL_LOW_ADDR);
    670 	if (reg & (1 << REG_DUNIT_CTRL_LOW_DPDE_OFFS)) {
    671 		dpde_flag = 1;
    672 		reg_write(REG_DUNIT_CTRL_LOW_ADDR,
    673 			  reg & ~(1 << REG_DUNIT_CTRL_LOW_DPDE_OFFS));
    674 	}
    675 #endif
    676 
    677 	/* Set Output buffer-off to all CS and correct ODT values */
    678 	for (cs = 0; cs < MAX_CS; cs++) {
    679 		if (dram_info->cs_ena & (1 << cs)) {
    680 			reg = reg_read(REG_DDR3_MR1_ADDR) &
    681 				REG_DDR3_MR1_ODT_MASK;
    682 			reg |= odt_static[dram_info->cs_ena][cs];
    683 			reg |= (1 << REG_DDR3_MR1_OUTBUF_DIS_OFFS);
    684 
    685 			/* 0x15D0 - DDR3 MR0 Register */
    686 			reg_write(REG_DDR3_MR1_ADDR, reg);
    687 			/* Issue MRS Command to current cs */
    688 			reg = REG_SDRAM_OPERATION_CMD_MR1 &
    689 				~(1 << (REG_SDRAM_OPERATION_CS_OFFS + cs));
    690 			/*
    691 			 * [3-0] = 0x4 - MR1 Command, [11-8] -
    692 			 * enable current cs
    693 			 */
    694 			/* 0x1418 - SDRAM Operation Register */
    695 			reg_write(REG_SDRAM_OPERATION_ADDR, reg);
    696 
    697 			udelay(MRS_DELAY);
    698 		}
    699 	}
    700 
    701 	DEBUG_WL_FULL_S("DDR3 - Write Leveling - Qoff and RTT Values are set for all Cs\n");
    702 
    703 	/* Enable SW override */
    704 	reg = reg_read(REG_DRAM_TRAINING_2_ADDR) |
    705 		(1 << REG_DRAM_TRAINING_2_SW_OVRD_OFFS);
    706 	/* [0] = 1 - Enable SW override  */
    707 	/* 0x15B8 - Training SW 2 Register */
    708 	reg_write(REG_DRAM_TRAINING_2_ADDR, reg);
    709 	DEBUG_WL_FULL_S("DDR3 - Write Leveling - SW Override Enabled\n");
    710 
    711 	/* Enable PHY write leveling mode */
    712 	reg = reg_read(REG_DRAM_TRAINING_2_ADDR) &
    713 		~(1 << REG_DRAM_TRAINING_2_WL_MODE_OFFS);
    714 	/* [2] = 0 - TrnWLMode - Enable */
    715 	/* 0x15B8 - Training SW 2 Register */
    716 	reg_write(REG_DRAM_TRAINING_2_ADDR, reg);
    717 	/* Reset WL results arry */
    718 	memset(dram_info->wl_val, 0, sizeof(u32) * MAX_CS * MAX_PUP_NUM * 7);
    719 
    720 	/* Loop for each cs */
    721 	for (cs = 0; cs < MAX_CS; cs++) {
    722 		if (dram_info->cs_ena & (1 << cs)) {
    723 			DEBUG_WL_FULL_C("DDR3 - Write Leveling - Starting working with Cs - ",
    724 					(u32) cs, 1);
    725 			/* Refresh X9 current cs */
    726 			DEBUG_WL_FULL_S("DDR3 - Write Leveling - Refresh X9\n");
    727 			for (cnt = 0; cnt < COUNT_WL_RFRS; cnt++) {
    728 				reg =
    729 				    REG_SDRAM_OPERATION_CMD_RFRS & ~(1 <<
    730 								     (REG_SDRAM_OPERATION_CS_OFFS
    731 								      + cs));
    732 				/* [3-0] = 0x2 - refresh, [11-8] - enable current cs */
    733 				reg_write(REG_SDRAM_OPERATION_ADDR, reg);	/* 0x1418 - SDRAM Operation Register */
    734 
    735 				do {
    736 					reg =
    737 					    ((reg_read
    738 					      (REG_SDRAM_OPERATION_ADDR)) &
    739 					     REG_SDRAM_OPERATION_CMD_RFRS_DONE);
    740 				} while (reg);	/* Wait for '0' */
    741 			}
    742 
    743 			/* Configure MR1 in Cs[CsNum] - write leveling on, output buffer on */
    744 			DEBUG_WL_FULL_S("DDR3 - Write Leveling - Configure MR1 for current Cs: WL-on,OB-on\n");
    745 			reg = reg_read(REG_DDR3_MR1_ADDR) &
    746 				REG_DDR3_MR1_OUTBUF_WL_MASK;
    747 			/* Set ODT Values */
    748 			reg &= REG_DDR3_MR1_ODT_MASK;
    749 			reg |= odt_static[dram_info->cs_ena][cs];
    750 			/* Enable WL MODE */
    751 			reg |= (1 << REG_DDR3_MR1_WL_ENA_OFFS);
    752 			/* [7]=1, [12]=0 - Output Buffer and write leveling enabled */
    753 			reg_write(REG_DDR3_MR1_ADDR, reg);	/* 0x15D4 - DDR3 MR1 Register */
    754 			/* Issue MRS Command to current cs */
    755 			reg = REG_SDRAM_OPERATION_CMD_MR1 &
    756 				~(1 << (REG_SDRAM_OPERATION_CS_OFFS + cs));
    757 			/*
    758 			 * [3-0] = 0x4 - MR1 Command, [11-8] -
    759 			 * enable current cs
    760 			 */
    761 			/* 0x1418 - SDRAM Operation Register */
    762 			reg_write(REG_SDRAM_OPERATION_ADDR, reg);
    763 
    764 			udelay(MRS_DELAY);
    765 
    766 			/* Write leveling  cs[cs] */
    767 			if (MV_OK !=
    768 			    ddr3_write_leveling_single_cs(cs, freq, ratio_2to1,
    769 							  (u32 *)(res + cs),
    770 							  dram_info)) {
    771 				DEBUG_WL_FULL_C("DDR3 - Write Leveling single Cs - FAILED -  Cs - ",
    772 						(u32) cs, 1);
    773 				for (pup = 0; pup < max_pup_num; pup++) {
    774 					if (((res[cs] >> pup) & 0x1) == 0) {
    775 						DEBUG_WL_C("Failed Byte : ",
    776 							   pup, 1);
    777 					}
    778 				}
    779 				return MV_FAIL;
    780 			}
    781 
    782 			/* Set TrnWLDeUpd - After each CS is done */
    783 			reg = reg_read(REG_TRAINING_WL_ADDR) |
    784 				(1 << REG_TRAINING_WL_CS_DONE_OFFS);
    785 			/* 0x16AC - Training Write leveling register */
    786 			reg_write(REG_TRAINING_WL_ADDR, reg);
    787 
    788 			/*
    789 			 * Debug message - Finished Write leveling cs[cs] -
    790 			 * each PUP Fail/Success
    791 			 */
    792 			DEBUG_WL_FULL_C("DDR3 - Write Leveling - Finished Cs - ", (u32) cs,
    793 					1);
    794 			DEBUG_WL_FULL_C("DDR3 - Write Leveling - The Results: 1-PUP locked, 0-PUP failed -",
    795 					(u32) res[cs], 3);
    796 
    797 			/*
    798 			 * Configure MR1 in cs[cs] - write leveling off (0),
    799 			 * output buffer off (1)
    800 			 */
    801 			reg = reg_read(REG_DDR3_MR1_ADDR) &
    802 				REG_DDR3_MR1_OUTBUF_WL_MASK;
    803 			reg |= (1 << REG_DDR3_MR1_OUTBUF_DIS_OFFS);
    804 			/* No need to sort ODT since it is same CS */
    805 			/* 0x15D4 - DDR3 MR1 Register */
    806 			reg_write(REG_DDR3_MR1_ADDR, reg);
    807 			/* Issue MRS Command to current cs */
    808 			reg = REG_SDRAM_OPERATION_CMD_MR1 &
    809 				~(1 << (REG_SDRAM_OPERATION_CS_OFFS + cs));
    810 			/*
    811 			 * [3-0] = 0x4 - MR1 Command, [11-8] -
    812 			 * enable current cs
    813 			 */
    814 			/* 0x1418 - SDRAM Operation Register */
    815 			reg_write(REG_SDRAM_OPERATION_ADDR, reg);
    816 
    817 			udelay(MRS_DELAY);
    818 		}
    819 	}
    820 
    821 	/* Disable WL Mode */
    822 	/* [2]=1 - TrnWLMode - Disable */
    823 	reg = reg_read(REG_DRAM_TRAINING_2_ADDR);
    824 	reg |= (1 << REG_DRAM_TRAINING_2_WL_MODE_OFFS);
    825 	/* 0x15B8 - Training SW 2 Register */
    826 	reg_write(REG_DRAM_TRAINING_2_ADDR, reg);
    827 
    828 	/* Disable SW override - Must be in a different stage */
    829 	/* [0]=0 - Enable SW override  */
    830 	reg = reg_read(REG_DRAM_TRAINING_2_ADDR);
    831 	reg &= ~(1 << REG_DRAM_TRAINING_2_SW_OVRD_OFFS);
    832 	/* 0x15B8 - Training SW 2 Register */
    833 	reg_write(REG_DRAM_TRAINING_2_ADDR, reg);
    834 
    835 	/* Set Output buffer-on to all CS and correct ODT values */
    836 	for (cs = 0; cs < MAX_CS; cs++) {
    837 		if (dram_info->cs_ena & (1 << cs)) {
    838 			reg = reg_read(REG_DDR3_MR1_ADDR) &
    839 				REG_DDR3_MR1_ODT_MASK;
    840 			reg &= REG_DDR3_MR1_OUTBUF_WL_MASK;
    841 			reg |= odt_static[dram_info->cs_ena][cs];
    842 
    843 			/* 0x15D0 - DDR3 MR1 Register */
    844 			reg_write(REG_DDR3_MR1_ADDR, reg);
    845 			/* Issue MRS Command to current cs */
    846 			reg = REG_SDRAM_OPERATION_CMD_MR1 &
    847 				~(1 << (REG_SDRAM_OPERATION_CS_OFFS + cs));
    848 			/*
    849 			 * [3-0] = 0x4 - MR1 Command, [11-8] -
    850 			 * enable current cs
    851 			 */
    852 			/* 0x1418 - SDRAM Operation Register */
    853 			reg_write(REG_SDRAM_OPERATION_ADDR, reg);
    854 
    855 			udelay(MRS_DELAY);
    856 		}
    857 	}
    858 
    859 #ifdef MV88F67XX
    860 	/* Dynamic pad issue (BTS669) during WL */
    861 	if (dpde_flag) {
    862 		reg = reg_read(REG_DUNIT_CTRL_LOW_ADDR) |
    863 			(1 << REG_DUNIT_CTRL_LOW_DPDE_OFFS);
    864 		reg_write(REG_DUNIT_CTRL_LOW_ADDR, reg);
    865 	}
    866 #endif
    867 	DEBUG_WL_FULL_S("DDR3 - Write Leveling - Finished WL procedure for all Cs\n");
    868 
    869 	return MV_OK;
    870 }
    871 
    872 #if !defined(MV88F672X)
    873 /*
    874  * Name:     ddr3_write_leveling_sw
    875  * Desc:     Execute Write leveling phase by SW
    876  * Args:     freq        - current sequence frequency
    877  *           dram_info   - main struct
    878  * Notes:
    879  * Returns:  MV_OK if success, MV_FAIL if fail.
    880  */
    881 int ddr3_write_leveling_sw_reg_dimm(u32 freq, int ratio_2to1,
    882 				    MV_DRAM_INFO *dram_info)
    883 {
    884 	u32 reg, cs, cnt, pup;
    885 	u32 res[MAX_CS];
    886 	__maybe_unused int dpde_flag = 0;
    887 
    888 	/* Debug message - Start Write leveling procedure */
    889 	DEBUG_WL_S("DDR3 - Write Leveling - Starting SW WL procedure\n");
    890 
    891 #ifdef MV88F67XX
    892 	/* Dynamic pad issue (BTS669) during WL */
    893 	reg = reg_read(REG_DUNIT_CTRL_LOW_ADDR);
    894 	if (reg & (1 << REG_DUNIT_CTRL_LOW_DPDE_OFFS)) {
    895 		dpde_flag = 1;
    896 		reg_write(REG_DUNIT_CTRL_LOW_ADDR,
    897 			  reg & ~(1 << REG_DUNIT_CTRL_LOW_DPDE_OFFS));
    898 	}
    899 #endif
    900 
    901 	/* If target freq = 400 move clock start point */
    902 	/* Write to control PUP to Control Deskew Regs */
    903 	if (freq <= DDR_400) {
    904 		for (pup = 0; pup <= dram_info->num_of_total_pups; pup++) {
    905 			/* PUP_DELAY_MASK 0x1F */
    906 			/* reg = 0x0C10001F + (uj << 16); */
    907 			ddr3_write_ctrl_pup_reg(1, pup, CNTRL_PUP_DESKEW + pup,
    908 						0x1F);
    909 		}
    910 	}
    911 
    912 	/* Set Output buffer-off to all CS and correct ODT values */
    913 	for (cs = 0; cs < MAX_CS; cs++) {
    914 		if (dram_info->cs_ena & (1 << cs)) {
    915 			reg = reg_read(REG_DDR3_MR1_ADDR) &
    916 				REG_DDR3_MR1_ODT_MASK;
    917 			reg |= odt_static[dram_info->cs_ena][cs];
    918 			reg |= (1 << REG_DDR3_MR1_OUTBUF_DIS_OFFS);
    919 
    920 			/* 0x15D0 - DDR3 MR0 Register */
    921 			reg_write(REG_DDR3_MR1_ADDR, reg);
    922 			/* Issue MRS Command to current cs */
    923 			reg = REG_SDRAM_OPERATION_CMD_MR1 &
    924 				~(1 << (REG_SDRAM_OPERATION_CS_OFFS + cs));
    925 			/*
    926 			 * [3-0] = 0x4 - MR1 Command, [11-8] -
    927 			 * enable current cs
    928 			 */
    929 			/* 0x1418 - SDRAM Operation Register */
    930 			reg_write(REG_SDRAM_OPERATION_ADDR, reg);
    931 
    932 			udelay(MRS_DELAY);
    933 		}
    934 	}
    935 
    936 	DEBUG_WL_FULL_S("DDR3 - Write Leveling - Qoff and RTT Values are set for all Cs\n");
    937 
    938 	/* Enable SW override */
    939 	reg = reg_read(REG_DRAM_TRAINING_2_ADDR) |
    940 		(1 << REG_DRAM_TRAINING_2_SW_OVRD_OFFS);
    941 	/* [0] = 1 - Enable SW override  */
    942 	/* 0x15B8 - Training SW 2 Register */
    943 	reg_write(REG_DRAM_TRAINING_2_ADDR, reg);
    944 	DEBUG_WL_FULL_S("DDR3 - Write Leveling - SW Override Enabled\n");
    945 
    946 	/* Enable PHY write leveling mode */
    947 	reg = reg_read(REG_DRAM_TRAINING_2_ADDR) &
    948 		~(1 << REG_DRAM_TRAINING_2_WL_MODE_OFFS);
    949 	/* [2] = 0 - TrnWLMode - Enable */
    950 	/* 0x15B8 - Training SW 2 Register */
    951 	reg_write(REG_DRAM_TRAINING_2_ADDR, reg);
    952 
    953 	/* Loop for each cs */
    954 	for (cs = 0; cs < MAX_CS; cs++) {
    955 		if (dram_info->cs_ena & (1 << cs)) {
    956 			DEBUG_WL_FULL_C("DDR3 - Write Leveling - Starting working with Cs - ",
    957 					(u32) cs, 1);
    958 
    959 			/* Refresh X9 current cs */
    960 			DEBUG_WL_FULL_S("DDR3 - Write Leveling - Refresh X9\n");
    961 			for (cnt = 0; cnt < COUNT_WL_RFRS; cnt++) {
    962 				reg =
    963 				    REG_SDRAM_OPERATION_CMD_RFRS & ~(1 <<
    964 								     (REG_SDRAM_OPERATION_CS_OFFS
    965 								      + cs));
    966 				/* [3-0] = 0x2 - refresh, [11-8] - enable current cs */
    967 				reg_write(REG_SDRAM_OPERATION_ADDR, reg);	/* 0x1418 - SDRAM Operation Register */
    968 
    969 				do {
    970 					reg =
    971 					    ((reg_read
    972 					      (REG_SDRAM_OPERATION_ADDR)) &
    973 					     REG_SDRAM_OPERATION_CMD_RFRS_DONE);
    974 				} while (reg);	/* Wait for '0' */
    975 			}
    976 
    977 			/*
    978 			 * Configure MR1 in Cs[CsNum] - write leveling on,
    979 			 * output buffer on
    980 			 */
    981 			DEBUG_WL_FULL_S("DDR3 - Write Leveling - Configure MR1 for current Cs: WL-on,OB-on\n");
    982 			reg = reg_read(REG_DDR3_MR1_ADDR) &
    983 				REG_DDR3_MR1_OUTBUF_WL_MASK;
    984 			/* Set ODT Values */
    985 			reg &= REG_DDR3_MR1_ODT_MASK;
    986 			reg |= odt_static[dram_info->cs_ena][cs];
    987 			/* Enable WL MODE */
    988 			reg |= (1 << REG_DDR3_MR1_WL_ENA_OFFS);
    989 			/*
    990 			 * [7]=1, [12]=0 - Output Buffer and write leveling
    991 			 * enabled
    992 			 */
    993 			/* 0x15D4 - DDR3 MR1 Register */
    994 			reg_write(REG_DDR3_MR1_ADDR, reg);
    995 			/* Issue MRS Command to current cs */
    996 			reg = REG_SDRAM_OPERATION_CMD_MR1 &
    997 				~(1 << (REG_SDRAM_OPERATION_CS_OFFS + cs));
    998 			/*
    999 			 * [3-0] = 0x4 - MR1 Command, [11-8] -
   1000 			 * enable current cs
   1001 			 */
   1002 			/* 0x1418 - SDRAM Operation Register */
   1003 			reg_write(REG_SDRAM_OPERATION_ADDR, reg);
   1004 
   1005 			udelay(MRS_DELAY);
   1006 
   1007 			/* Write leveling  cs[cs] */
   1008 			if (MV_OK !=
   1009 			    ddr3_write_leveling_single_cs(cs, freq, ratio_2to1,
   1010 							  (u32 *)(res + cs),
   1011 							  dram_info)) {
   1012 				DEBUG_WL_FULL_C("DDR3 - Write Leveling single Cs - FAILED -  Cs - ",
   1013 						(u32) cs, 1);
   1014 				return MV_FAIL;
   1015 			}
   1016 
   1017 			/* Set TrnWLDeUpd - After each CS is done */
   1018 			reg = reg_read(REG_TRAINING_WL_ADDR) |
   1019 				(1 << REG_TRAINING_WL_CS_DONE_OFFS);
   1020 			/* 0x16AC - Training Write leveling register */
   1021 			reg_write(REG_TRAINING_WL_ADDR, reg);
   1022 
   1023 			/*
   1024 			 * Debug message - Finished Write leveling cs[cs] -
   1025 			 * each PUP Fail/Success
   1026 			 */
   1027 			DEBUG_WL_FULL_C("DDR3 - Write Leveling - Finished Cs - ", (u32) cs,
   1028 					1);
   1029 			DEBUG_WL_FULL_C("DDR3 - Write Leveling - The Results: 1-PUP locked, 0-PUP failed -",
   1030 					(u32) res[cs], 3);
   1031 
   1032 			/* Configure MR1 in cs[cs] - write leveling off (0), output buffer off (1) */
   1033 			reg = reg_read(REG_DDR3_MR1_ADDR) &
   1034 				REG_DDR3_MR1_OUTBUF_WL_MASK;
   1035 			reg |= (1 << REG_DDR3_MR1_OUTBUF_DIS_OFFS);
   1036 			/* No need to sort ODT since it is same CS */
   1037 			/* 0x15D4 - DDR3 MR1 Register */
   1038 			reg_write(REG_DDR3_MR1_ADDR, reg);
   1039 			/* Issue MRS Command to current cs */
   1040 			reg = REG_SDRAM_OPERATION_CMD_MR1 &
   1041 				~(1 << (REG_SDRAM_OPERATION_CS_OFFS + cs));
   1042 			/*
   1043 			 * [3-0] = 0x4 - MR1 Command, [11-8] -
   1044 			 * enable current cs
   1045 			 */
   1046 			/* 0x1418 - SDRAM Operation Register */
   1047 			reg_write(REG_SDRAM_OPERATION_ADDR, reg);
   1048 
   1049 			udelay(MRS_DELAY);
   1050 		}
   1051 	}
   1052 
   1053 	/* Disable WL Mode */
   1054 	/* [2]=1 - TrnWLMode - Disable */
   1055 	reg = reg_read(REG_DRAM_TRAINING_2_ADDR);
   1056 	reg |= (1 << REG_DRAM_TRAINING_2_WL_MODE_OFFS);
   1057 	/* 0x15B8 - Training SW 2 Register */
   1058 	reg_write(REG_DRAM_TRAINING_2_ADDR, reg);
   1059 
   1060 	/* Disable SW override - Must be in a different stage */
   1061 	/* [0]=0 - Enable SW override  */
   1062 	reg = reg_read(REG_DRAM_TRAINING_2_ADDR);
   1063 	reg &= ~(1 << REG_DRAM_TRAINING_2_SW_OVRD_OFFS);
   1064 	/* 0x15B8 - Training SW 2 Register */
   1065 	reg_write(REG_DRAM_TRAINING_2_ADDR, reg);
   1066 
   1067 	/* Set Output buffer-on to all CS and correct ODT values */
   1068 	for (cs = 0; cs < MAX_CS; cs++) {
   1069 		if (dram_info->cs_ena & (1 << cs)) {
   1070 			reg = reg_read(REG_DDR3_MR1_ADDR) &
   1071 				REG_DDR3_MR1_ODT_MASK;
   1072 			reg &= REG_DDR3_MR1_OUTBUF_WL_MASK;
   1073 			reg |= odt_static[dram_info->cs_ena][cs];
   1074 
   1075 			/* 0x15D0 - DDR3 MR1 Register */
   1076 			reg_write(REG_DDR3_MR1_ADDR, reg);
   1077 			/* Issue MRS Command to current cs */
   1078 			reg = REG_SDRAM_OPERATION_CMD_MR1 &
   1079 				~(1 << (REG_SDRAM_OPERATION_CS_OFFS + cs));
   1080 			/*
   1081 			 * [3-0] = 0x4 - MR1 Command, [11-8] -
   1082 			 * enable current cs
   1083 			 */
   1084 			/* 0x1418 - SDRAM Operation Register */
   1085 			reg_write(REG_SDRAM_OPERATION_ADDR, reg);
   1086 
   1087 			udelay(MRS_DELAY);
   1088 		}
   1089 	}
   1090 
   1091 #ifdef MV88F67XX
   1092 	/* Dynamic pad issue (BTS669) during WL */
   1093 	if (dpde_flag) {
   1094 		reg = reg_read(REG_DUNIT_CTRL_LOW_ADDR) |
   1095 			(1 << REG_DUNIT_CTRL_LOW_DPDE_OFFS);
   1096 		reg_write(REG_DUNIT_CTRL_LOW_ADDR, reg);
   1097 	}
   1098 #endif
   1099 
   1100 	/* If target freq = 400 move clock back */
   1101 	/* Write to control PUP to Control Deskew Regs */
   1102 	if (freq <= DDR_400) {
   1103 		for (pup = 0; pup <= dram_info->num_of_total_pups; pup++) {
   1104 			ddr3_write_ctrl_pup_reg(1, pup, CNTRL_PUP_DESKEW + pup,
   1105 						0);
   1106 		}
   1107 	}
   1108 
   1109 	DEBUG_WL_FULL_S("DDR3 - Write Leveling - Finished WL procedure for all Cs\n");
   1110 	return MV_OK;
   1111 }
   1112 #endif
   1113 
   1114 /*
   1115  * Name:     ddr3_write_leveling_single_cs
   1116  * Desc:     Execute Write leveling for single Chip select
   1117  * Args:     cs          - current chip select
   1118  *           freq        - current sequence frequency
   1119  *           result      - res array
   1120  *           dram_info   - main struct
   1121  * Notes:
   1122  * Returns:  MV_OK if success, MV_FAIL if fail.
   1123  */
   1124 static int ddr3_write_leveling_single_cs(u32 cs, u32 freq, int ratio_2to1,
   1125 					 u32 *result, MV_DRAM_INFO *dram_info)
   1126 {
   1127 	u32 reg, pup_num, delay, phase, phaseMax, max_pup_num, pup,
   1128 		max_pup_mask;
   1129 
   1130 	max_pup_num = dram_info->num_of_total_pups;
   1131 	*result = 0;
   1132 	u32 flag[MAX_PUP_NUM] = { 0 };
   1133 
   1134 	DEBUG_WL_FULL_C("DDR3 - Write Leveling Single Cs - WL for Cs - ",
   1135 			(u32) cs, 1);
   1136 
   1137 	switch (max_pup_num) {
   1138 	case 2:
   1139 		max_pup_mask = 0x3;
   1140 		break;
   1141 	case 4:
   1142 		max_pup_mask = 0xf;
   1143 		DEBUG_WL_C("max_pup_mask =  ", max_pup_mask, 3);
   1144 		break;
   1145 	case 5:
   1146 		max_pup_mask = 0x1f;
   1147 		DEBUG_WL_C("max_pup_mask =  ", max_pup_mask, 3);
   1148 		break;
   1149 	case 8:
   1150 		max_pup_mask = 0xff;
   1151 		DEBUG_WL_C("max_pup_mask =  ", max_pup_mask, 3);
   1152 		break;
   1153 	case 9:
   1154 		max_pup_mask = 0x1ff;
   1155 		DEBUG_WL_C("max_pup_mask =  ", max_pup_mask, 3);
   1156 		break;
   1157 	default:
   1158 		DEBUG_WL_C("ddr3_write_leveling_single_cs wrong max_pup_num =  ",
   1159 			   max_pup_num, 3);
   1160 		return MV_FAIL;
   1161 	}
   1162 
   1163 	/* CS ODT Override */
   1164 	reg = reg_read(REG_SDRAM_ODT_CTRL_HIGH_ADDR) &
   1165 		REG_SDRAM_ODT_CTRL_HIGH_OVRD_MASK;
   1166 	reg |= (REG_SDRAM_ODT_CTRL_HIGH_OVRD_ENA << (2 * cs));
   1167 	/* Set 0x3 - Enable ODT on the curent cs and disable on other cs */
   1168 	/* 0x1498 - SDRAM ODT Control high */
   1169 	reg_write(REG_SDRAM_ODT_CTRL_HIGH_ADDR, reg);
   1170 
   1171 	DEBUG_WL_FULL_S("DDR3 - Write Leveling Single Cs - ODT Asserted for current Cs\n");
   1172 
   1173 	/* tWLMRD Delay */
   1174 	/* Delay of minimum 40 Dram clock cycles - 20 Tclk cycles */
   1175 	udelay(1);
   1176 
   1177 	/* [1:0] - current cs number */
   1178 	reg = (reg_read(REG_TRAINING_WL_ADDR) & REG_TRAINING_WL_CS_MASK) | cs;
   1179 	reg |= (1 << REG_TRAINING_WL_UPD_OFFS);	/* [2] - trnWLCsUpd */
   1180 	/* 0x16AC - Training Write leveling register */
   1181 	reg_write(REG_TRAINING_WL_ADDR, reg);
   1182 
   1183 	/* Broadcast to all PUPs: Reset DQS phase, reset leveling delay */
   1184 	ddr3_write_pup_reg(PUP_WL_MODE, cs, PUP_BC, 0, 0);
   1185 
   1186 	/* Seek Edge */
   1187 	DEBUG_WL_FULL_S("DDR3 - Write Leveling Single Cs - Seek Edge - Current Cs\n");
   1188 
   1189 	/* Drive DQS high for one cycle - All data PUPs */
   1190 	DEBUG_WL_FULL_S("DDR3 - Write Leveling Single Cs - Seek Edge - Driving DQS high for one cycle\n");
   1191 	if (!ratio_2to1) {
   1192 		reg = (reg_read(REG_TRAINING_WL_ADDR) &
   1193 		       REG_TRAINING_WL_RATIO_MASK) | REG_TRAINING_WL_1TO1;
   1194 	} else {
   1195 		reg = (reg_read(REG_TRAINING_WL_ADDR) &
   1196 		       REG_TRAINING_WL_RATIO_MASK) | REG_TRAINING_WL_2TO1;
   1197 	}
   1198 	/* 0x16AC - Training Write leveling register */
   1199 	reg_write(REG_TRAINING_WL_ADDR, reg);
   1200 
   1201 	/* Wait tWLdelay */
   1202 	do {
   1203 		/* [29] - trnWLDelayExp */
   1204 		reg = (reg_read(REG_TRAINING_WL_ADDR)) &
   1205 			REG_TRAINING_WL_DELAYEXP_MASK;
   1206 	} while (reg == 0x0);	/* Wait for '1' */
   1207 
   1208 	/* Read WL res */
   1209 	reg = (reg_read(REG_TRAINING_WL_ADDR) >> REG_TRAINING_WL_RESULTS_OFFS) &
   1210 		REG_TRAINING_WL_RESULTS_MASK;
   1211 	/* [28:20] - TrnWLResult */
   1212 
   1213 	if (!ratio_2to1) /* Different phase options for 2:1 or 1:1 modes */
   1214 		phaseMax = MAX_PHASE_1TO1;
   1215 	else
   1216 		phaseMax = MAX_PHASE_2TO1;
   1217 
   1218 	DEBUG_WL_FULL_S("DDR3 - Write Leveling Single Cs - Seek Edge - Shift DQS + Octet Leveling\n");
   1219 
   1220 	/* Shift DQS + Octet leveling */
   1221 	for (phase = 0; phase < phaseMax; phase++) {
   1222 		for (delay = 0; delay < MAX_DELAY; delay++) {
   1223 			/*  Broadcast to all PUPs: DQS phase,leveling delay */
   1224 			ddr3_write_pup_reg(PUP_WL_MODE, cs, PUP_BC, phase,
   1225 					   delay);
   1226 
   1227 			udelay(1);	/* Delay of  3 Tclk cycles */
   1228 
   1229 			DEBUG_WL_FULL_S("DDR3 - Write Leveling Single Cs - Seek Edge: Phase = ");
   1230 			DEBUG_WL_FULL_D((u32) phase, 1);
   1231 			DEBUG_WL_FULL_S(", Delay = ");
   1232 			DEBUG_WL_FULL_D((u32) delay, 1);
   1233 			DEBUG_WL_FULL_S("\n");
   1234 
   1235 			/* Drive DQS high for one cycle - All data PUPs */
   1236 			if (!ratio_2to1) {
   1237 				reg = (reg_read(REG_TRAINING_WL_ADDR) &
   1238 				       REG_TRAINING_WL_RATIO_MASK) |
   1239 					REG_TRAINING_WL_1TO1;
   1240 			} else {
   1241 				reg = (reg_read(REG_TRAINING_WL_ADDR) &
   1242 				       REG_TRAINING_WL_RATIO_MASK) |
   1243 					REG_TRAINING_WL_2TO1;
   1244 			}
   1245 			reg_write(REG_TRAINING_WL_ADDR, reg);	/* 0x16AC  */
   1246 
   1247 			/* Wait tWLdelay */
   1248 			do {
   1249 				reg = (reg_read(REG_TRAINING_WL_ADDR)) &
   1250 					REG_TRAINING_WL_DELAYEXP_MASK;
   1251 			} while (reg == 0x0);	/* [29] Wait for '1' */
   1252 
   1253 			/* Read WL res */
   1254 			reg = reg_read(REG_TRAINING_WL_ADDR);
   1255 			reg = (reg >> REG_TRAINING_WL_RESULTS_OFFS) &
   1256 				REG_TRAINING_WL_RESULTS_MASK;	/* [28:20] */
   1257 
   1258 			DEBUG_WL_FULL_C("DDR3 - Write Leveling Single Cs - Seek Edge: Results =  ",
   1259 					(u32) reg, 3);
   1260 
   1261 			/* Update State machine */
   1262 			for (pup = 0; pup < (max_pup_num); pup++) {
   1263 				/* ECC support - bit 8 */
   1264 				pup_num = (pup == dram_info->num_of_std_pups) ?
   1265 					ECC_BIT : pup;
   1266 				if (dram_info->wl_val[cs][pup][S] == 0) {
   1267 					/* Update phase to PUP */
   1268 					dram_info->wl_val[cs][pup][P] = phase;
   1269 					/* Update delay to PUP */
   1270 					dram_info->wl_val[cs][pup][D] = delay;
   1271 				}
   1272 
   1273 				if (((reg >> pup_num) & 0x1) == 0)
   1274 					flag[pup_num] = 1;
   1275 
   1276 				if (((reg >> pup_num) & 0x1)
   1277 				    && (flag[pup_num] == 1)
   1278 				    && (dram_info->wl_val[cs][pup][S] == 0)) {
   1279 					/*
   1280 					 * If the PUP is locked now and in last
   1281 					 * counter states
   1282 					 */
   1283 					/* Go to next state */
   1284 					dram_info->wl_val[cs][pup][S] = 1;
   1285 					/* Set res */
   1286 					*result = *result | (1 << pup_num);
   1287 				}
   1288 			}
   1289 
   1290 			/* If all locked - Break the loops - Finished */
   1291 			if (*result == max_pup_mask) {
   1292 				phase = phaseMax;
   1293 				delay = MAX_DELAY;
   1294 				DEBUG_WL_S("DDR3 - Write Leveling Single Cs - Seek Edge: All Locked\n");
   1295 			}
   1296 		}
   1297 	}
   1298 
   1299 	/* Debug message - Print res for cs[i]: cs,PUP,Phase,Delay */
   1300 	DEBUG_WL_C("DDR3 - Write Leveling - Results for CS - ", (u32) cs, 1);
   1301 	for (pup = 0; pup < (max_pup_num); pup++) {
   1302 		DEBUG_WL_S("DDR3 - Write Leveling - PUP: ");
   1303 		DEBUG_WL_D((u32) pup, 1);
   1304 		DEBUG_WL_S(", Phase: ");
   1305 		DEBUG_WL_D((u32) dram_info->wl_val[cs][pup][P], 1);
   1306 		DEBUG_WL_S(", Delay: ");
   1307 		DEBUG_WL_D((u32) dram_info->wl_val[cs][pup][D], 2);
   1308 		DEBUG_WL_S("\n");
   1309 	}
   1310 
   1311 	/* Check if some not locked and return error */
   1312 	if (*result != max_pup_mask) {
   1313 		DEBUG_WL_S("DDR3 - Write Leveling - ERROR - not all PUPS were locked\n");
   1314 		return MV_FAIL;
   1315 	}
   1316 
   1317 	/* Configure Each PUP with locked leveling settings */
   1318 	for (pup = 0; pup < (max_pup_num); pup++) {
   1319 		/* ECC support - bit 8 */
   1320 		pup_num = (pup == dram_info->num_of_std_pups) ? ECC_BIT : pup;
   1321 		phase = dram_info->wl_val[cs][pup][P];
   1322 		delay = dram_info->wl_val[cs][pup][D];
   1323 		ddr3_write_pup_reg(PUP_WL_MODE, cs, pup_num, phase, delay);
   1324 	}
   1325 
   1326 	/* CS ODT Override */
   1327 	reg =  reg_read(REG_SDRAM_ODT_CTRL_HIGH_ADDR) &
   1328 		REG_SDRAM_ODT_CTRL_HIGH_OVRD_MASK;
   1329 	/* 0x1498 - SDRAM ODT Control high */
   1330 	reg_write(REG_SDRAM_ODT_CTRL_HIGH_ADDR, reg);
   1331 
   1332 	return MV_OK;
   1333 }
   1334 
   1335 /*
   1336  * Perform DDR3 Control PUP Indirect Write
   1337  */
   1338 static void ddr3_write_ctrl_pup_reg(int bc_acc, u32 pup, u32 reg_addr, u32 data)
   1339 {
   1340 	u32 reg = 0;
   1341 
   1342 	/* Store value for write */
   1343 	reg = (data & 0xFFFF);
   1344 
   1345 	/* Set bit 26 for control PHY access */
   1346 	reg |= (1 << REG_PHY_CNTRL_OFFS);
   1347 
   1348 	/* Configure BC or UC access to PHYs */
   1349 	if (bc_acc == 1)
   1350 		reg |= (1 << REG_PHY_BC_OFFS);
   1351 	else
   1352 		reg |= (pup << REG_PHY_PUP_OFFS);
   1353 
   1354 	/* Set PHY register address to write to */
   1355 	reg |= (reg_addr << REG_PHY_CS_OFFS);
   1356 
   1357 	reg_write(REG_PHY_REGISTRY_FILE_ACCESS_ADDR, reg);	/* 0x16A0 */
   1358 	reg |= REG_PHY_REGISTRY_FILE_ACCESS_OP_WR;
   1359 	reg_write(REG_PHY_REGISTRY_FILE_ACCESS_ADDR, reg);	/* 0x16A0 */
   1360 
   1361 	do {
   1362 		reg = (reg_read(REG_PHY_REGISTRY_FILE_ACCESS_ADDR)) &
   1363 			REG_PHY_REGISTRY_FILE_ACCESS_OP_DONE;
   1364 	} while (reg);		/* Wait for '0' to mark the end of the transaction */
   1365 }
   1366