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