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_PBS_FULL_C(s, d, l) \ 19 DEBUG_PBS_FULL_S(s); DEBUG_PBS_FULL_D(d, l); DEBUG_PBS_FULL_S("\n") 20 #define DEBUG_PBS_C(s, d, l) \ 21 DEBUG_PBS_S(s); DEBUG_PBS_D(d, l); DEBUG_PBS_S("\n") 22 23 #ifdef MV_DEBUG_PBS 24 #define DEBUG_PBS_S(s) puts(s) 25 #define DEBUG_PBS_D(d, l) printf("%x", d) 26 #else 27 #define DEBUG_PBS_S(s) 28 #define DEBUG_PBS_D(d, l) 29 #endif 30 31 #ifdef MV_DEBUG_FULL_PBS 32 #define DEBUG_PBS_FULL_S(s) puts(s) 33 #define DEBUG_PBS_FULL_D(d, l) printf("%x", d) 34 #else 35 #define DEBUG_PBS_FULL_S(s) 36 #define DEBUG_PBS_FULL_D(d, l) 37 #endif 38 39 #if defined(MV88F78X60) || defined(MV88F672X) 40 41 /* Temp array for skew data storage */ 42 static u32 skew_array[(MAX_PUP_NUM) * DQ_NUM] = { 0 }; 43 44 /* PBS locked dq (per pup) */ 45 extern u32 pbs_locked_dq[MAX_PUP_NUM][DQ_NUM]; 46 extern u32 pbs_locked_dm[MAX_PUP_NUM]; 47 extern u32 pbs_locked_value[MAX_PUP_NUM][DQ_NUM]; 48 49 #if defined(MV88F672X) 50 extern u32 pbs_pattern[2][LEN_16BIT_PBS_PATTERN]; 51 extern u32 pbs_pattern_32b[2][LEN_PBS_PATTERN]; 52 #else 53 extern u32 pbs_pattern_32b[2][LEN_PBS_PATTERN]; 54 extern u32 pbs_pattern_64b[2][LEN_PBS_PATTERN]; 55 #endif 56 57 extern u32 pbs_dq_mapping[PUP_NUM_64BIT + 1][DQ_NUM]; 58 59 static int ddr3_tx_shift_dqs_adll_step_before_fail(MV_DRAM_INFO *dram_info, 60 u32 cur_pup, u32 pbs_pattern_idx, u32 ecc); 61 static int ddr3_rx_shift_dqs_to_first_fail(MV_DRAM_INFO *dram_info, u32 cur_pup, 62 u32 pbs_pattern_idx, u32 ecc); 63 static int ddr3_pbs_per_bit(MV_DRAM_INFO *dram_info, int *start_over, int is_tx, 64 u32 *pcur_pup, u32 pbs_pattern_idx, u32 ecc); 65 static int ddr3_set_pbs_results(MV_DRAM_INFO *dram_info, int is_tx); 66 static void ddr3_pbs_write_pup_dqs_reg(u32 cs, u32 pup, u32 dqs_delay); 67 68 /* 69 * Name: ddr3_pbs_tx 70 * Desc: Execute the PBS TX phase. 71 * Args: dram_info ddr3 training information struct 72 * Notes: 73 * Returns: MV_OK if success, other error code if fail. 74 */ 75 int ddr3_pbs_tx(MV_DRAM_INFO *dram_info) 76 { 77 /* Array of Deskew results */ 78 79 /* 80 * Array to hold the total sum of skew from all iterations 81 * (for average purpose) 82 */ 83 u32 skew_sum_array[MAX_PUP_NUM][DQ_NUM] = { {0} }; 84 85 /* 86 * Array to hold the total average skew from both patterns 87 * (for average purpose) 88 */ 89 u32 pattern_skew_array[MAX_PUP_NUM][DQ_NUM] = { {0} }; 90 91 u32 pbs_rep_time = 0; /* counts number of loop in case of fail */ 92 /* bit array for unlock pups - used to repeat on the RX operation */ 93 u32 cur_pup; 94 u32 max_pup; 95 u32 pbs_retry; 96 u32 pup, dq, pups, cur_max_pup, valid_pup, reg; 97 u32 pattern_idx; 98 u32 ecc; 99 /* indicates whether we need to start the loop again */ 100 int start_over; 101 102 DEBUG_PBS_S("DDR3 - PBS TX - Starting PBS TX procedure\n"); 103 104 pups = dram_info->num_of_total_pups; 105 max_pup = dram_info->num_of_total_pups; 106 107 /* Enable SW override */ 108 reg = reg_read(REG_DRAM_TRAINING_2_ADDR) | 109 (1 << REG_DRAM_TRAINING_2_SW_OVRD_OFFS); 110 /* [0] = 1 - Enable SW override */ 111 /* 0x15B8 - Training SW 2 Register */ 112 reg_write(REG_DRAM_TRAINING_2_ADDR, reg); 113 DEBUG_PBS_S("DDR3 - PBS RX - SW Override Enabled\n"); 114 115 reg = 1 << REG_DRAM_TRAINING_AUTO_OFFS; 116 reg_write(REG_DRAM_TRAINING_ADDR, reg); /* 0x15B0 - Training Register */ 117 118 /* Running twice for 2 different patterns. each patterns - 3 times */ 119 for (pattern_idx = 0; pattern_idx < COUNT_PBS_PATTERN; pattern_idx++) { 120 DEBUG_PBS_C("DDR3 - PBS TX - Working with pattern - ", 121 pattern_idx, 1); 122 123 /* Reset sum array */ 124 for (pup = 0; pup < pups; pup++) { 125 for (dq = 0; dq < DQ_NUM; dq++) 126 skew_sum_array[pup][dq] = 0; 127 } 128 129 /* 130 * Perform PBS several of times (3 for each pattern). 131 * At the end, we'll use the average 132 */ 133 /* If there is ECC, do each PBS again with mux change */ 134 for (pbs_retry = 0; pbs_retry < COUNT_PBS_REPEAT; pbs_retry++) { 135 for (ecc = 0; ecc < (dram_info->ecc_ena + 1); ecc++) { 136 137 /* 138 * This parameter stores the current PUP 139 * num - ecc mode dependent - 4-8 / 1 pups 140 */ 141 cur_max_pup = (1 - ecc) * 142 dram_info->num_of_std_pups + ecc; 143 144 if (ecc) { 145 /* Only 1 pup in this case */ 146 valid_pup = 0x1; 147 } else if (cur_max_pup > 4) { 148 /* 64 bit - 8 pups */ 149 valid_pup = 0xFF; 150 } else if (cur_max_pup == 4) { 151 /* 32 bit - 4 pups */ 152 valid_pup = 0xF; 153 } else { 154 /* 16 bit - 2 pups */ 155 valid_pup = 0x3; 156 } 157 158 /* ECC Support - Switch ECC Mux on ecc=1 */ 159 reg = reg_read(REG_DRAM_TRAINING_2_ADDR) & 160 ~(1 << REG_DRAM_TRAINING_2_ECC_MUX_OFFS); 161 reg |= (dram_info->ecc_ena * ecc << 162 REG_DRAM_TRAINING_2_ECC_MUX_OFFS); 163 reg_write(REG_DRAM_TRAINING_2_ADDR, reg); 164 165 if (ecc) 166 DEBUG_PBS_S("DDR3 - PBS Tx - ECC Mux Enabled\n"); 167 else 168 DEBUG_PBS_S("DDR3 - PBS Tx - ECC Mux Disabled\n"); 169 170 /* Init iteration values */ 171 /* Clear the locked DQs */ 172 for (pup = 0; pup < cur_max_pup; pup++) { 173 for (dq = 0; dq < DQ_NUM; dq++) { 174 pbs_locked_dq[ 175 pup + ecc * 176 (max_pup - 1)][dq] = 177 0; 178 } 179 } 180 181 pbs_rep_time = 0; 182 cur_pup = valid_pup; 183 start_over = 0; 184 185 /* 186 * Run loop On current Pattern and current 187 * pattern iteration (just to cover the false 188 * fail problem) 189 */ 190 do { 191 DEBUG_PBS_S("DDR3 - PBS Tx - Pbs Rep Loop is "); 192 DEBUG_PBS_D(pbs_rep_time, 1); 193 DEBUG_PBS_S(", for Retry No."); 194 DEBUG_PBS_D(pbs_retry, 1); 195 DEBUG_PBS_S("\n"); 196 197 /* Set all PBS values to MIN (0) */ 198 DEBUG_PBS_S("DDR3 - PBS Tx - Set all PBS values to MIN\n"); 199 200 for (dq = 0; dq < DQ_NUM; dq++) { 201 ddr3_write_pup_reg( 202 PUP_PBS_TX + 203 pbs_dq_mapping[pup * 204 (1 - ecc) + 205 ecc * ECC_PUP] 206 [dq], CS0, (1 - ecc) * 207 PUP_BC + ecc * ECC_PUP, 0, 208 0); 209 } 210 211 /* 212 * Shift DQ ADLL right, One step before 213 * fail 214 */ 215 DEBUG_PBS_S("DDR3 - PBS Tx - ADLL shift right one phase before fail\n"); 216 217 if (MV_OK != ddr3_tx_shift_dqs_adll_step_before_fail 218 (dram_info, cur_pup, pattern_idx, 219 ecc)) 220 return MV_DDR3_TRAINING_ERR_PBS_ADLL_SHR_1PHASE; 221 222 /* PBS For each bit */ 223 DEBUG_PBS_S("DDR3 - PBS Tx - perform PBS for each bit\n"); 224 225 /* 226 * In this stage - start_over = 0 227 */ 228 if (MV_OK != ddr3_pbs_per_bit( 229 dram_info, &start_over, 1, 230 &cur_pup, pattern_idx, ecc)) 231 return MV_DDR3_TRAINING_ERR_PBS_TX_PER_BIT; 232 233 } while ((start_over == 1) && 234 (++pbs_rep_time < COUNT_PBS_STARTOVER)); 235 236 if (pbs_rep_time == COUNT_PBS_STARTOVER && 237 start_over == 1) { 238 DEBUG_PBS_S("DDR3 - PBS Tx - FAIL - Adll reach max value\n"); 239 return MV_DDR3_TRAINING_ERR_PBS_TX_MAX_VAL; 240 } 241 242 DEBUG_PBS_FULL_C("DDR3 - PBS TX - values for iteration - ", 243 pbs_retry, 1); 244 for (pup = 0; pup < cur_max_pup; pup++) { 245 /* 246 * To minimize delay elements, inc 247 * from pbs value the min pbs val 248 */ 249 DEBUG_PBS_S("DDR3 - PBS - PUP"); 250 DEBUG_PBS_D((pup + (ecc * ECC_PUP)), 1); 251 DEBUG_PBS_S(": "); 252 253 for (dq = 0; dq < DQ_NUM; dq++) { 254 /* Set skew value for all dq */ 255 /* 256 * Bit# Deskew <- Bit# Deskew - 257 * last / first failing bit 258 * Deskew For all bits (per PUP) 259 * (minimize delay elements) 260 */ 261 DEBUG_PBS_S("DQ"); 262 DEBUG_PBS_D(dq, 1); 263 DEBUG_PBS_S("-"); 264 DEBUG_PBS_D(skew_array 265 [((pup) * DQ_NUM) + 266 dq], 2); 267 DEBUG_PBS_S(", "); 268 } 269 DEBUG_PBS_S("\n"); 270 } 271 272 /* 273 * Collect the results we got on this trial 274 * of PBS 275 */ 276 for (pup = 0; pup < cur_max_pup; pup++) { 277 for (dq = 0; dq < DQ_NUM; dq++) { 278 skew_sum_array[pup + (ecc * (max_pup - 1))] 279 [dq] += skew_array 280 [((pup) * DQ_NUM) + dq]; 281 } 282 } 283 284 /* ECC Support - Disable ECC MUX */ 285 reg = reg_read(REG_DRAM_TRAINING_2_ADDR) & 286 ~(1 << REG_DRAM_TRAINING_2_ECC_MUX_OFFS); 287 reg_write(REG_DRAM_TRAINING_2_ADDR, reg); 288 } 289 } 290 291 DEBUG_PBS_C("DDR3 - PBS TX - values for current pattern - ", 292 pattern_idx, 1); 293 for (pup = 0; pup < max_pup; pup++) { 294 /* 295 * To minimize delay elements, inc from pbs value the 296 * min pbs val 297 */ 298 DEBUG_PBS_S("DDR3 - PBS - PUP"); 299 DEBUG_PBS_D(pup, 1); 300 DEBUG_PBS_S(": "); 301 302 for (dq = 0; dq < DQ_NUM; dq++) { 303 /* set skew value for all dq */ 304 /* Bit# Deskew <- Bit# Deskew - last / first failing bit Deskew For all bits (per PUP) (minimize delay elements) */ 305 DEBUG_PBS_S("DQ"); 306 DEBUG_PBS_D(dq, 1); 307 DEBUG_PBS_S("-"); 308 DEBUG_PBS_D(skew_sum_array[pup][dq] / 309 COUNT_PBS_REPEAT, 2); 310 DEBUG_PBS_S(", "); 311 } 312 DEBUG_PBS_S("\n"); 313 } 314 315 /* 316 * Calculate the average skew for current pattern for each 317 * pup and each bit 318 */ 319 DEBUG_PBS_C("DDR3 - PBS TX - Average for pattern - ", 320 pattern_idx, 1); 321 322 for (pup = 0; pup < max_pup; pup++) { 323 /* 324 * FOR ECC only :: found min and max value for current 325 * pattern skew array 326 */ 327 /* Loop for all dqs */ 328 for (dq = 0; dq < DQ_NUM; dq++) { 329 pattern_skew_array[pup][dq] += 330 (skew_sum_array[pup][dq] / 331 COUNT_PBS_REPEAT); 332 } 333 } 334 } 335 336 /* Calculate the average skew */ 337 for (pup = 0; pup < max_pup; pup++) { 338 for (dq = 0; dq < DQ_NUM; dq++) 339 skew_array[((pup) * DQ_NUM) + dq] = 340 pattern_skew_array[pup][dq] / COUNT_PBS_PATTERN; 341 } 342 343 DEBUG_PBS_S("DDR3 - PBS TX - Average for all patterns:\n"); 344 for (pup = 0; pup < max_pup; pup++) { 345 /* 346 * To minimize delay elements, inc from pbs value the min 347 * pbs val 348 */ 349 DEBUG_PBS_S("DDR3 - PBS - PUP"); 350 DEBUG_PBS_D(pup, 1); 351 DEBUG_PBS_S(": "); 352 353 for (dq = 0; dq < DQ_NUM; dq++) { 354 /* Set skew value for all dq */ 355 /* 356 * Bit# Deskew <- Bit# Deskew - last / first 357 * failing bit Deskew For all bits (per PUP) 358 * (minimize delay elements) 359 */ 360 DEBUG_PBS_S("DQ"); 361 DEBUG_PBS_D(dq, 1); 362 DEBUG_PBS_S("-"); 363 DEBUG_PBS_D(skew_array[(pup * DQ_NUM) + dq], 2); 364 DEBUG_PBS_S(", "); 365 } 366 DEBUG_PBS_S("\n"); 367 } 368 369 /* Return ADLL to default value */ 370 for (pup = 0; pup < max_pup; pup++) { 371 if (pup == (max_pup - 1) && dram_info->ecc_ena) 372 pup = ECC_PUP; 373 ddr3_pbs_write_pup_dqs_reg(CS0, pup, INIT_WL_DELAY); 374 } 375 376 /* Set averaged PBS results */ 377 ddr3_set_pbs_results(dram_info, 1); 378 379 /* Disable SW override - Must be in a different stage */ 380 /* [0]=0 - Enable SW override */ 381 reg = reg_read(REG_DRAM_TRAINING_2_ADDR); 382 reg &= ~(1 << REG_DRAM_TRAINING_2_SW_OVRD_OFFS); 383 /* 0x15B8 - Training SW 2 Register */ 384 reg_write(REG_DRAM_TRAINING_2_ADDR, reg); 385 386 reg = reg_read(REG_DRAM_TRAINING_1_ADDR) | 387 (1 << REG_DRAM_TRAINING_1_TRNBPOINT_OFFS); 388 reg_write(REG_DRAM_TRAINING_1_ADDR, reg); 389 390 DEBUG_PBS_S("DDR3 - PBS Tx - PBS TX ended successfuly\n"); 391 392 return MV_OK; 393 } 394 395 /* 396 * Name: ddr3_tx_shift_dqs_adll_step_before_fail 397 * Desc: Execute the Tx shift DQ phase. 398 * Args: dram_info ddr3 training information struct 399 * cur_pup bit array of the function active pups. 400 * pbs_pattern_idx Index of PBS pattern 401 * Notes: 402 * Returns: MV_OK if success, other error code if fail. 403 */ 404 static int ddr3_tx_shift_dqs_adll_step_before_fail(MV_DRAM_INFO *dram_info, 405 u32 cur_pup, 406 u32 pbs_pattern_idx, u32 ecc) 407 { 408 u32 unlock_pup; /* bit array of unlock pups */ 409 u32 new_lockup_pup; /* bit array of compare failed pups */ 410 u32 adll_val = 4; /* INIT_WL_DELAY */ 411 u32 cur_max_pup, pup; 412 u32 dqs_dly_set[MAX_PUP_NUM] = { 0 }; 413 u32 *pattern_ptr; 414 415 /* Choose pattern */ 416 switch (dram_info->ddr_width) { 417 #if defined(MV88F672X) 418 case 16: 419 pattern_ptr = (u32 *)&pbs_pattern[pbs_pattern_idx]; 420 break; 421 #endif 422 case 32: 423 pattern_ptr = (u32 *)&pbs_pattern_32b[pbs_pattern_idx]; 424 break; 425 #if defined(MV88F78X60) 426 case 64: 427 pattern_ptr = (u32 *)&pbs_pattern_64b[pbs_pattern_idx]; 428 break; 429 #endif 430 default: 431 return MV_FAIL; 432 } 433 434 /* Set current pup number */ 435 if (cur_pup == 0x1) /* Ecc mode */ 436 cur_max_pup = 1; 437 else 438 cur_max_pup = dram_info->num_of_std_pups; 439 440 unlock_pup = cur_pup; /* '1' for each unlocked pup */ 441 442 /* Loop on all ADLL Vaules */ 443 do { 444 /* Loop until found first fail */ 445 adll_val++; 446 447 /* 448 * Increment (Move to right - ADLL) DQ TX delay 449 * (broadcast to all Data PUPs) 450 */ 451 for (pup = 0; pup < cur_max_pup; pup++) 452 ddr3_pbs_write_pup_dqs_reg(CS0, 453 pup * (1 - ecc) + 454 ECC_PUP * ecc, adll_val); 455 456 /* 457 * Write and Read, compare results (read was already verified) 458 */ 459 /* 0 - all locked */ 460 new_lockup_pup = 0; 461 462 if (MV_OK != ddr3_sdram_compare(dram_info, unlock_pup, 463 &new_lockup_pup, 464 pattern_ptr, LEN_PBS_PATTERN, 465 SDRAM_PBS_TX_OFFS, 1, 0, 466 NULL, 467 0)) 468 return MV_FAIL; 469 470 unlock_pup &= ~new_lockup_pup; 471 472 DEBUG_PBS_FULL_S("Shift DQS by 2 steps for PUPs: "); 473 DEBUG_PBS_FULL_D(unlock_pup, 2); 474 DEBUG_PBS_FULL_C(", Set ADLL value = ", adll_val, 2); 475 476 /* If any PUP failed there is '1' to mark the PUP */ 477 if (new_lockup_pup != 0) { 478 /* 479 * Decrement (Move Back to Left two steps - ADLL) 480 * DQ TX delay for current failed pups and save 481 */ 482 for (pup = 0; pup < cur_max_pup; pup++) { 483 if (((new_lockup_pup >> pup) & 0x1) && 484 dqs_dly_set[pup] == 0) 485 dqs_dly_set[pup] = adll_val - 1; 486 } 487 } 488 } while ((unlock_pup != 0) && (adll_val != ADLL_MAX)); 489 490 if (unlock_pup != 0) { 491 DEBUG_PBS_FULL_S("DDR3 - PBS Tx - Shift DQ - Adll value reached maximum\n"); 492 493 for (pup = 0; pup < cur_max_pup; pup++) { 494 if (((unlock_pup >> pup) & 0x1) && 495 dqs_dly_set[pup] == 0) 496 dqs_dly_set[pup] = adll_val - 1; 497 } 498 } 499 500 DEBUG_PBS_FULL_C("PBS TX one step before fail last pups locked Adll ", 501 adll_val - 2, 2); 502 503 /* Set the PUP DQS DLY Values */ 504 for (pup = 0; pup < cur_max_pup; pup++) 505 ddr3_pbs_write_pup_dqs_reg(CS0, pup * (1 - ecc) + ECC_PUP * ecc, 506 dqs_dly_set[pup]); 507 508 /* Found one phase before fail */ 509 return MV_OK; 510 } 511 512 /* 513 * Name: ddr3_pbs_rx 514 * Desc: Execute the PBS RX phase. 515 * Args: dram_info ddr3 training information struct 516 * Notes: 517 * Returns: MV_OK if success, other error code if fail. 518 */ 519 int ddr3_pbs_rx(MV_DRAM_INFO *dram_info) 520 { 521 /* 522 * Array to hold the total sum of skew from all iterations 523 * (for average purpose) 524 */ 525 u32 skew_sum_array[MAX_PUP_NUM][DQ_NUM] = { {0} }; 526 527 /* 528 * Array to hold the total average skew from both patterns 529 * (for average purpose) 530 */ 531 u32 pattern_skew_array[MAX_PUP_NUM][DQ_NUM] = { {0} }; 532 533 u32 pbs_rep_time = 0; /* counts number of loop in case of fail */ 534 /* bit array for unlock pups - used to repeat on the RX operation */ 535 u32 cur_pup; 536 u32 max_pup; 537 u32 pbs_retry; 538 u32 pup, dq, pups, cur_max_pup, valid_pup, reg; 539 u32 pattern_idx; 540 u32 ecc; 541 /* indicates whether we need to start the loop again */ 542 int start_over; 543 int status; 544 545 DEBUG_PBS_S("DDR3 - PBS RX - Starting PBS RX procedure\n"); 546 547 pups = dram_info->num_of_total_pups; 548 max_pup = dram_info->num_of_total_pups; 549 550 /* Enable SW override */ 551 reg = reg_read(REG_DRAM_TRAINING_2_ADDR) | 552 (1 << REG_DRAM_TRAINING_2_SW_OVRD_OFFS); 553 /* [0] = 1 - Enable SW override */ 554 /* 0x15B8 - Training SW 2 Register */ 555 reg_write(REG_DRAM_TRAINING_2_ADDR, reg); 556 DEBUG_PBS_FULL_S("DDR3 - PBS RX - SW Override Enabled\n"); 557 558 reg = 1 << REG_DRAM_TRAINING_AUTO_OFFS; 559 reg_write(REG_DRAM_TRAINING_ADDR, reg); /* 0x15B0 - Training Register */ 560 561 /* Running twice for 2 different patterns. each patterns - 3 times */ 562 for (pattern_idx = 0; pattern_idx < COUNT_PBS_PATTERN; pattern_idx++) { 563 DEBUG_PBS_FULL_C("DDR3 - PBS RX - Working with pattern - ", 564 pattern_idx, 1); 565 566 /* Reset sum array */ 567 for (pup = 0; pup < pups; pup++) { 568 for (dq = 0; dq < DQ_NUM; dq++) 569 skew_sum_array[pup][dq] = 0; 570 } 571 572 /* 573 * Perform PBS several of times (3 for each pattern). 574 * At the end, we'll use the average 575 */ 576 /* If there is ECC, do each PBS again with mux change */ 577 for (pbs_retry = 0; pbs_retry < COUNT_PBS_REPEAT; pbs_retry++) { 578 for (ecc = 0; ecc < (dram_info->ecc_ena + 1); ecc++) { 579 /* 580 * This parameter stores the current PUP 581 * num - ecc mode dependent - 4-8 / 1 pups 582 */ 583 cur_max_pup = (1 - ecc) * 584 dram_info->num_of_std_pups + ecc; 585 586 if (ecc) { 587 /* Only 1 pup in this case */ 588 valid_pup = 0x1; 589 } else if (cur_max_pup > 4) { 590 /* 64 bit - 8 pups */ 591 valid_pup = 0xFF; 592 } else if (cur_max_pup == 4) { 593 /* 32 bit - 4 pups */ 594 valid_pup = 0xF; 595 } else { 596 /* 16 bit - 2 pups */ 597 valid_pup = 0x3; 598 } 599 600 /* ECC Support - Switch ECC Mux on ecc=1 */ 601 reg = reg_read(REG_DRAM_TRAINING_2_ADDR) & 602 ~(1 << REG_DRAM_TRAINING_2_ECC_MUX_OFFS); 603 reg |= (dram_info->ecc_ena * ecc << 604 REG_DRAM_TRAINING_2_ECC_MUX_OFFS); 605 reg_write(REG_DRAM_TRAINING_2_ADDR, reg); 606 607 if (ecc) 608 DEBUG_PBS_FULL_S("DDR3 - PBS Rx - ECC Mux Enabled\n"); 609 else 610 DEBUG_PBS_FULL_S("DDR3 - PBS Rx - ECC Mux Disabled\n"); 611 612 /* Init iteration values */ 613 /* Clear the locked DQs */ 614 for (pup = 0; pup < cur_max_pup; pup++) { 615 for (dq = 0; dq < DQ_NUM; dq++) { 616 pbs_locked_dq[ 617 pup + ecc * (max_pup - 1)][dq] = 618 0; 619 } 620 } 621 622 pbs_rep_time = 0; 623 cur_pup = valid_pup; 624 start_over = 0; 625 626 /* 627 * Run loop On current Pattern and current 628 * pattern iteration (just to cover the false 629 * fail problem 630 */ 631 do { 632 DEBUG_PBS_FULL_S("DDR3 - PBS Rx - Pbs Rep Loop is "); 633 DEBUG_PBS_FULL_D(pbs_rep_time, 1); 634 DEBUG_PBS_FULL_S(", for Retry No."); 635 DEBUG_PBS_FULL_D(pbs_retry, 1); 636 DEBUG_PBS_FULL_S("\n"); 637 638 /* Set all PBS values to MAX (31) */ 639 for (pup = 0; pup < cur_max_pup; pup++) { 640 for (dq = 0; dq < DQ_NUM; dq++) 641 ddr3_write_pup_reg( 642 PUP_PBS_RX + 643 pbs_dq_mapping[ 644 pup * (1 - ecc) 645 + ecc * ECC_PUP] 646 [dq], CS0, 647 pup + ecc * ECC_PUP, 648 0, MAX_PBS); 649 } 650 651 /* Set all DQS PBS values to MIN (0) */ 652 for (pup = 0; pup < cur_max_pup; pup++) { 653 ddr3_write_pup_reg(PUP_PBS_RX + 654 DQ_NUM, CS0, 655 pup + 656 ecc * 657 ECC_PUP, 0, 658 0); 659 } 660 661 /* Shift DQS, To first Fail */ 662 DEBUG_PBS_FULL_S("DDR3 - PBS Rx - Shift RX DQS to first fail\n"); 663 664 status = ddr3_rx_shift_dqs_to_first_fail 665 (dram_info, cur_pup, 666 pattern_idx, ecc); 667 if (MV_OK != status) { 668 DEBUG_PBS_S("DDR3 - PBS Rx - ddr3_rx_shift_dqs_to_first_fail failed.\n"); 669 DEBUG_PBS_D(status, 8); 670 DEBUG_PBS_S("\nDDR3 - PBS Rx - SKIP.\n"); 671 672 /* Reset read FIFO */ 673 reg = reg_read(REG_DRAM_TRAINING_ADDR); 674 /* Start Auto Read Leveling procedure */ 675 reg |= (1 << REG_DRAM_TRAINING_RL_OFFS); 676 /* 0x15B0 - Training Register */ 677 reg_write(REG_DRAM_TRAINING_ADDR, reg); 678 679 reg = reg_read(REG_DRAM_TRAINING_2_ADDR); 680 reg |= ((1 << REG_DRAM_TRAINING_2_FIFO_RST_OFFS) 681 + (1 << REG_DRAM_TRAINING_2_SW_OVRD_OFFS)); 682 /* [0] = 1 - Enable SW override, [4] = 1 - FIFO reset */ 683 /* 0x15B8 - Training SW 2 Register */ 684 reg_write(REG_DRAM_TRAINING_2_ADDR, reg); 685 686 do { 687 reg = (reg_read(REG_DRAM_TRAINING_2_ADDR)) 688 & (1 << REG_DRAM_TRAINING_2_FIFO_RST_OFFS); 689 } while (reg); /* Wait for '0' */ 690 691 reg = reg_read(REG_DRAM_TRAINING_ADDR); 692 /* Clear Auto Read Leveling procedure */ 693 reg &= ~(1 << REG_DRAM_TRAINING_RL_OFFS); 694 /* 0x15B0 - Training Register */ 695 reg_write(REG_DRAM_TRAINING_ADDR, reg); 696 697 /* Set ADLL to 15 */ 698 for (pup = 0; pup < max_pup; 699 pup++) { 700 ddr3_write_pup_reg 701 (PUP_DQS_RD, CS0, 702 pup + 703 (ecc * ECC_PUP), 0, 704 15); 705 } 706 707 /* Set all PBS values to MIN (0) */ 708 for (pup = 0; pup < cur_max_pup; 709 pup++) { 710 for (dq = 0; 711 dq < DQ_NUM; dq++) 712 ddr3_write_pup_reg 713 (PUP_PBS_RX + 714 pbs_dq_mapping 715 [pup * (1 - ecc) + 716 ecc * ECC_PUP] 717 [dq], CS0, 718 pup + ecc * ECC_PUP, 719 0, MIN_PBS); 720 } 721 722 return MV_OK; 723 } 724 725 /* PBS For each bit */ 726 DEBUG_PBS_FULL_S("DDR3 - PBS Rx - perform PBS for each bit\n"); 727 /* in this stage - start_over = 0; */ 728 if (MV_OK != ddr3_pbs_per_bit( 729 dram_info, &start_over, 730 0, &cur_pup, 731 pattern_idx, ecc)) { 732 DEBUG_PBS_S("DDR3 - PBS Rx - ddr3_pbs_per_bit failed."); 733 return MV_DDR3_TRAINING_ERR_PBS_RX_PER_BIT; 734 } 735 736 } while ((start_over == 1) && 737 (++pbs_rep_time < COUNT_PBS_STARTOVER)); 738 739 if (pbs_rep_time == COUNT_PBS_STARTOVER && 740 start_over == 1) { 741 DEBUG_PBS_FULL_S("DDR3 - PBS Rx - FAIL - Algorithm failed doing RX PBS\n"); 742 return MV_DDR3_TRAINING_ERR_PBS_RX_MAX_VAL; 743 } 744 745 /* Return DQS ADLL to default value - 15 */ 746 /* Set all DQS PBS values to MIN (0) */ 747 for (pup = 0; pup < cur_max_pup; pup++) 748 ddr3_write_pup_reg(PUP_DQS_RD, CS0, 749 pup + ecc * ECC_PUP, 750 0, INIT_RL_DELAY); 751 752 DEBUG_PBS_FULL_C("DDR3 - PBS RX - values for iteration - ", 753 pbs_retry, 1); 754 for (pup = 0; pup < cur_max_pup; pup++) { 755 /* 756 * To minimize delay elements, inc from 757 * pbs value the min pbs val 758 */ 759 DEBUG_PBS_FULL_S("DDR3 - PBS - PUP"); 760 DEBUG_PBS_FULL_D((pup + 761 (ecc * ECC_PUP)), 1); 762 DEBUG_PBS_FULL_S(": "); 763 764 for (dq = 0; dq < DQ_NUM; dq++) { 765 /* Set skew value for all dq */ 766 /* 767 * Bit# Deskew <- Bit# Deskew - 768 * last / first failing bit 769 * Deskew For all bits (per PUP) 770 * (minimize delay elements) 771 */ 772 DEBUG_PBS_FULL_S("DQ"); 773 DEBUG_PBS_FULL_D(dq, 1); 774 DEBUG_PBS_FULL_S("-"); 775 DEBUG_PBS_FULL_D(skew_array 776 [((pup) * 777 DQ_NUM) + 778 dq], 2); 779 DEBUG_PBS_FULL_S(", "); 780 } 781 DEBUG_PBS_FULL_S("\n"); 782 } 783 784 /* 785 * Collect the results we got on this trial 786 * of PBS 787 */ 788 for (pup = 0; pup < cur_max_pup; pup++) { 789 for (dq = 0; dq < DQ_NUM; dq++) { 790 skew_sum_array 791 [pup + (ecc * (max_pup - 1))] 792 [dq] += 793 skew_array[((pup) * DQ_NUM) + dq]; 794 } 795 } 796 797 /* ECC Support - Disable ECC MUX */ 798 reg = reg_read(REG_DRAM_TRAINING_2_ADDR) & 799 ~(1 << REG_DRAM_TRAINING_2_ECC_MUX_OFFS); 800 reg_write(REG_DRAM_TRAINING_2_ADDR, reg); 801 } 802 } 803 804 /* 805 * Calculate the average skew for current pattern for each 806 * pup and each bit 807 */ 808 DEBUG_PBS_FULL_C("DDR3 - PBS RX - Average for pattern - ", 809 pattern_idx, 1); 810 for (pup = 0; pup < max_pup; pup++) { 811 /* 812 * FOR ECC only :: found min and max value for 813 * current pattern skew array 814 */ 815 /* Loop for all dqs */ 816 for (dq = 0; dq < DQ_NUM; dq++) { 817 pattern_skew_array[pup][dq] += 818 (skew_sum_array[pup][dq] / 819 COUNT_PBS_REPEAT); 820 } 821 } 822 823 DEBUG_PBS_C("DDR3 - PBS RX - values for current pattern - ", 824 pattern_idx, 1); 825 for (pup = 0; pup < max_pup; pup++) { 826 /* 827 * To minimize delay elements, inc from pbs value the 828 * min pbs val 829 */ 830 DEBUG_PBS_S("DDR3 - PBS RX - PUP"); 831 DEBUG_PBS_D(pup, 1); 832 DEBUG_PBS_S(": "); 833 834 for (dq = 0; dq < DQ_NUM; dq++) { 835 /* Set skew value for all dq */ 836 /* 837 * Bit# Deskew <- Bit# Deskew - last / first 838 * failing bit Deskew For all bits (per PUP) 839 * (minimize delay elements) 840 */ 841 DEBUG_PBS_S("DQ"); 842 DEBUG_PBS_D(dq, 1); 843 DEBUG_PBS_S("-"); 844 DEBUG_PBS_D(skew_sum_array[pup][dq] / 845 COUNT_PBS_REPEAT, 2); 846 DEBUG_PBS_S(", "); 847 } 848 DEBUG_PBS_S("\n"); 849 } 850 } 851 852 /* Calculate the average skew */ 853 for (pup = 0; pup < max_pup; pup++) { 854 for (dq = 0; dq < DQ_NUM; dq++) 855 skew_array[((pup) * DQ_NUM) + dq] = 856 pattern_skew_array[pup][dq] / COUNT_PBS_PATTERN; 857 } 858 859 DEBUG_PBS_S("DDR3 - PBS RX - Average for all patterns:\n"); 860 for (pup = 0; pup < max_pup; pup++) { 861 /* 862 * To minimize delay elements, inc from pbs value the 863 * min pbs val 864 */ 865 DEBUG_PBS_S("DDR3 - PBS - PUP"); 866 DEBUG_PBS_D(pup, 1); 867 DEBUG_PBS_S(": "); 868 869 for (dq = 0; dq < DQ_NUM; dq++) { 870 /* Set skew value for all dq */ 871 /* 872 * Bit# Deskew <- Bit# Deskew - last / first 873 * failing bit Deskew For all bits (per PUP) 874 * (minimize delay elements) 875 */ 876 DEBUG_PBS_S("DQ"); 877 DEBUG_PBS_D(dq, 1); 878 DEBUG_PBS_S("-"); 879 DEBUG_PBS_D(skew_array[(pup * DQ_NUM) + dq], 2); 880 DEBUG_PBS_S(", "); 881 } 882 DEBUG_PBS_S("\n"); 883 } 884 885 /* Return ADLL to default value */ 886 ddr3_write_pup_reg(PUP_DQS_RD, CS0, PUP_BC, 0, INIT_RL_DELAY); 887 888 /* Set averaged PBS results */ 889 ddr3_set_pbs_results(dram_info, 0); 890 891 /* Disable SW override - Must be in a different stage */ 892 /* [0]=0 - Enable SW override */ 893 reg = reg_read(REG_DRAM_TRAINING_2_ADDR); 894 reg &= ~(1 << REG_DRAM_TRAINING_2_SW_OVRD_OFFS); 895 /* 0x15B8 - Training SW 2 Register */ 896 reg_write(REG_DRAM_TRAINING_2_ADDR, reg); 897 898 reg = reg_read(REG_DRAM_TRAINING_1_ADDR) | 899 (1 << REG_DRAM_TRAINING_1_TRNBPOINT_OFFS); 900 reg_write(REG_DRAM_TRAINING_1_ADDR, reg); 901 902 DEBUG_PBS_FULL_S("DDR3 - PBS RX - ended successfuly\n"); 903 904 return MV_OK; 905 } 906 907 /* 908 * Name: ddr3_rx_shift_dqs_to_first_fail 909 * Desc: Execute the Rx shift DQ phase. 910 * Args: dram_info ddr3 training information struct 911 * cur_pup bit array of the function active pups. 912 * pbs_pattern_idx Index of PBS pattern 913 * Notes: 914 * Returns: MV_OK if success, other error code if fail. 915 */ 916 static int ddr3_rx_shift_dqs_to_first_fail(MV_DRAM_INFO *dram_info, u32 cur_pup, 917 u32 pbs_pattern_idx, u32 ecc) 918 { 919 u32 unlock_pup; /* bit array of unlock pups */ 920 u32 new_lockup_pup; /* bit array of compare failed pups */ 921 u32 adll_val = MAX_DELAY; 922 u32 dqs_deskew_val = 0; /* current value of DQS PBS deskew */ 923 u32 cur_max_pup, pup, pass_pup; 924 u32 *pattern_ptr; 925 926 /* Choose pattern */ 927 switch (dram_info->ddr_width) { 928 #if defined(MV88F672X) 929 case 16: 930 pattern_ptr = (u32 *)&pbs_pattern[pbs_pattern_idx]; 931 break; 932 #endif 933 case 32: 934 pattern_ptr = (u32 *)&pbs_pattern_32b[pbs_pattern_idx]; 935 break; 936 #if defined(MV88F78X60) 937 case 64: 938 pattern_ptr = (u32 *)&pbs_pattern_64b[pbs_pattern_idx]; 939 break; 940 #endif 941 default: 942 return MV_FAIL; 943 } 944 945 /* Set current pup number */ 946 if (cur_pup == 0x1) /* Ecc mode */ 947 cur_max_pup = 1; 948 else 949 cur_max_pup = dram_info->num_of_std_pups; 950 951 unlock_pup = cur_pup; /* '1' for each unlocked pup */ 952 953 DEBUG_PBS_FULL_S("DDR3 - PBS RX - Shift DQS - Starting...\n"); 954 955 /* Set DQS ADLL to MAX */ 956 DEBUG_PBS_FULL_S("DDR3 - PBS RX - Shift DQS - Set DQS ADLL to Max for all PUPs\n"); 957 for (pup = 0; pup < cur_max_pup; pup++) 958 ddr3_write_pup_reg(PUP_DQS_RD, CS0, pup + ecc * ECC_PUP, 0, 959 MAX_DELAY); 960 961 /* Loop on all ADLL Vaules */ 962 do { 963 /* Loop until found fail for all pups */ 964 new_lockup_pup = 0; 965 if (MV_OK != ddr3_sdram_compare(dram_info, unlock_pup, 966 &new_lockup_pup, 967 pattern_ptr, LEN_PBS_PATTERN, 968 SDRAM_PBS_I_OFFS + 969 pbs_pattern_idx * SDRAM_PBS_NEXT_OFFS, 970 0, 0, NULL, 0)) { 971 DEBUG_PBS_S("DDR3 - PBS Rx - Shift DQS - MV_DDR3_TRAINING_ERR_PBS_SHIFT_QDS_SRAM_CMP(ddr3_sdram_compare)\n"); 972 return MV_DDR3_TRAINING_ERR_PBS_SHIFT_QDS_SRAM_CMP; 973 } 974 975 if ((new_lockup_pup != 0) && (dqs_deskew_val <= 1)) { 976 /* Fail on start with first deskew value */ 977 /* Decrement DQS ADLL */ 978 --adll_val; 979 if (adll_val == ADLL_MIN) { 980 DEBUG_PBS_S("DDR3 - PBS Rx - Shift DQS - fail on start with first deskew value\n"); 981 return MV_DDR3_TRAINING_ERR_PBS_SHIFT_QDS_SRAM_CMP; 982 } 983 ddr3_write_pup_reg(PUP_DQS_RD, CS0, pup + ecc * ECC_PUP, 984 0, adll_val); 985 continue; 986 } 987 988 /* Update all new locked pups */ 989 unlock_pup &= ~new_lockup_pup; 990 991 if ((unlock_pup == 0) || (dqs_deskew_val == MAX_PBS)) { 992 if (dqs_deskew_val == MAX_PBS) { 993 /* 994 * Reach max value of dqs deskew or get fail 995 * for all pups 996 */ 997 DEBUG_PBS_FULL_S("DDR3 - PBS RX - Shift DQS - DQS deskew reached maximum value\n"); 998 } 999 break; 1000 } 1001 1002 DEBUG_PBS_FULL_S("DDR3 - PBS RX - Shift DQS - Inc DQS deskew for PUPs: "); 1003 DEBUG_PBS_FULL_D(unlock_pup, 2); 1004 DEBUG_PBS_FULL_C(", deskew = ", dqs_deskew_val, 2); 1005 1006 /* Increment DQS deskew elements - Only for unlocked pups */ 1007 dqs_deskew_val++; 1008 for (pup = 0; pup < cur_max_pup; pup++) { 1009 if (IS_PUP_ACTIVE(unlock_pup, pup) == 1) { 1010 ddr3_write_pup_reg(PUP_PBS_RX + DQS_DQ_NUM, CS0, 1011 pup + ecc * ECC_PUP, 0, 1012 dqs_deskew_val); 1013 } 1014 } 1015 } while (1); 1016 1017 DEBUG_PBS_FULL_S("DDR3 - PBS RX - Shift DQS - ADLL shift one step before fail\n"); 1018 /* Continue to ADLL shift one step before fail */ 1019 unlock_pup = cur_pup; 1020 do { 1021 /* Loop until pass compare for all pups */ 1022 new_lockup_pup = 0; 1023 /* Read and compare results */ 1024 if (MV_OK != ddr3_sdram_compare(dram_info, unlock_pup, &new_lockup_pup, 1025 pattern_ptr, LEN_PBS_PATTERN, 1026 SDRAM_PBS_I_OFFS + 1027 pbs_pattern_idx * SDRAM_PBS_NEXT_OFFS, 1028 1, 0, NULL, 0)) { 1029 DEBUG_PBS_S("DDR3 - PBS Rx - Shift DQS - MV_DDR3_TRAINING_ERR_PBS_SHIFT_QDS_SRAM_CMP(ddr3_sdram_compare)\n"); 1030 return MV_DDR3_TRAINING_ERR_PBS_SHIFT_QDS_SRAM_CMP; 1031 } 1032 1033 /* 1034 * Get mask for pup which passed so their adll will be 1035 * changed to 2 steps before fails 1036 */ 1037 pass_pup = unlock_pup & ~new_lockup_pup; 1038 1039 DEBUG_PBS_FULL_S("Shift DQS by 2 steps for PUPs: "); 1040 DEBUG_PBS_FULL_D(pass_pup, 2); 1041 DEBUG_PBS_FULL_C(", Set ADLL value = ", (adll_val - 2), 2); 1042 1043 /* Only for pass pups */ 1044 for (pup = 0; pup < cur_max_pup; pup++) { 1045 if (IS_PUP_ACTIVE(pass_pup, pup) == 1) { 1046 ddr3_write_pup_reg(PUP_DQS_RD, CS0, 1047 pup + ecc * ECC_PUP, 0, 1048 (adll_val - 2)); 1049 } 1050 } 1051 1052 /* Locked pups that compare success */ 1053 unlock_pup &= new_lockup_pup; 1054 1055 if (unlock_pup == 0) { 1056 /* All pups locked */ 1057 break; 1058 } 1059 1060 /* Found error */ 1061 if (adll_val == 0) { 1062 DEBUG_PBS_FULL_S("DDR3 - PBS Rx - Shift DQS - Adll reach min value\n"); 1063 return MV_DDR3_TRAINING_ERR_PBS_SHIFT_QDS_MAX_VAL; 1064 } 1065 1066 /* 1067 * Decrement (Move Back to Left one phase - ADLL) dqs RX delay 1068 */ 1069 adll_val--; 1070 for (pup = 0; pup < cur_max_pup; pup++) { 1071 if (IS_PUP_ACTIVE(unlock_pup, pup) == 1) { 1072 ddr3_write_pup_reg(PUP_DQS_RD, CS0, 1073 pup + ecc * ECC_PUP, 0, 1074 adll_val); 1075 } 1076 } 1077 } while (1); 1078 1079 return MV_OK; 1080 } 1081 1082 /* 1083 * lock_pups() extracted from ddr3_pbs_per_bit(). This just got too 1084 * much indented making it hard to read / edit. 1085 */ 1086 static void lock_pups(u32 pup, u32 *pup_locked, u8 *unlock_pup_dq_array, 1087 u32 pbs_curr_val, u32 start_pbs, u32 ecc, int is_tx) 1088 { 1089 u32 dq; 1090 int idx; 1091 1092 /* Lock PBS value for all remaining PUPs bits */ 1093 DEBUG_PBS_FULL_S("DDR3 - PBS Per bit - Lock PBS value for all remaining PUPs bits, pup "); 1094 DEBUG_PBS_FULL_D(pup, 1); 1095 DEBUG_PBS_FULL_C(" pbs value ", pbs_curr_val, 2); 1096 1097 idx = pup * (1 - ecc) + ecc * ECC_PUP; 1098 *pup_locked &= ~(1 << pup); 1099 1100 for (dq = 0; dq < DQ_NUM; dq++) { 1101 if (IS_PUP_ACTIVE(unlock_pup_dq_array[dq], pup) == 1) { 1102 int offs; 1103 1104 /* Lock current dq */ 1105 unlock_pup_dq_array[dq] &= ~(1 << pup); 1106 skew_array[(pup * DQ_NUM) + dq] = pbs_curr_val; 1107 1108 if (is_tx == 1) 1109 offs = PUP_PBS_TX; 1110 else 1111 offs = PUP_PBS_RX; 1112 1113 ddr3_write_pup_reg(offs + 1114 pbs_dq_mapping[idx][dq], CS0, 1115 idx, 0, start_pbs); 1116 } 1117 } 1118 } 1119 1120 /* 1121 * Name: ddr3_pbs_per_bit 1122 * Desc: Execute the Per Bit Skew phase. 1123 * Args: start_over Return whether need to start over the algorithm 1124 * is_tx Indicate whether Rx or Tx 1125 * pcur_pup bit array of the function active pups. return the 1126 * pups that need to repeat on the PBS 1127 * pbs_pattern_idx Index of PBS pattern 1128 * 1129 * Notes: Current implementation supports double activation of this function. 1130 * i.e. in order to activate this function (using start_over) more than 1131 * twice, the implementation should change. 1132 * imlementation limitation are marked using 1133 * ' CHIP-ONLY! - Implementation Limitation ' 1134 * Returns: MV_OK if success, other error code if fail. 1135 */ 1136 static int ddr3_pbs_per_bit(MV_DRAM_INFO *dram_info, int *start_over, int is_tx, 1137 u32 *pcur_pup, u32 pbs_pattern_idx, u32 ecc) 1138 { 1139 /* 1140 * Bit array to indicate if we already get fail on bit per pup & dq bit 1141 */ 1142 u8 unlock_pup_dq_array[DQ_NUM] = { 1143 *pcur_pup, *pcur_pup, *pcur_pup, *pcur_pup, *pcur_pup, 1144 *pcur_pup, *pcur_pup, *pcur_pup 1145 }; 1146 1147 u8 cmp_unlock_pup_dq_array[COUNT_PBS_COMP_RETRY_NUM][DQ_NUM]; 1148 u32 pup, dq; 1149 /* value of pbs is according to RX or TX */ 1150 u32 start_pbs, last_pbs; 1151 u32 pbs_curr_val; 1152 /* bit array that indicates all dq of the pup locked */ 1153 u32 pup_locked; 1154 u32 first_fail[MAX_PUP_NUM] = { 0 }; /* count first fail per pup */ 1155 /* indicates whether we get first fail per pup */ 1156 int first_failed[MAX_PUP_NUM] = { 0 }; 1157 /* bit array that indicates pup already get fail */ 1158 u32 sum_pup_fail; 1159 /* use to calculate diff between curr pbs to first fail pbs */ 1160 u32 calc_pbs_diff; 1161 u32 pbs_cmp_retry; 1162 u32 max_pup; 1163 1164 /* Set init values for retry array - 8 retry */ 1165 for (pbs_cmp_retry = 0; pbs_cmp_retry < COUNT_PBS_COMP_RETRY_NUM; 1166 pbs_cmp_retry++) { 1167 for (dq = 0; dq < DQ_NUM; dq++) 1168 cmp_unlock_pup_dq_array[pbs_cmp_retry][dq] = *pcur_pup; 1169 } 1170 1171 memset(&skew_array, 0, MAX_PUP_NUM * DQ_NUM * sizeof(u32)); 1172 1173 DEBUG_PBS_FULL_S("DDR3 - PBS Per bit - Started\n"); 1174 1175 /* The pbs value depends if rx or tx */ 1176 if (is_tx == 1) { 1177 start_pbs = MIN_PBS; 1178 last_pbs = MAX_PBS; 1179 } else { 1180 start_pbs = MAX_PBS; 1181 last_pbs = MIN_PBS; 1182 } 1183 1184 pbs_curr_val = start_pbs; 1185 pup_locked = *pcur_pup; 1186 1187 /* Set current pup number */ 1188 if (pup_locked == 0x1) /* Ecc mode */ 1189 max_pup = 1; 1190 else 1191 max_pup = dram_info->num_of_std_pups; 1192 1193 do { 1194 /* Increment/ decrement PBS for un-lock bits only */ 1195 if (is_tx == 1) 1196 pbs_curr_val++; 1197 else 1198 pbs_curr_val--; 1199 1200 /* Set Current PBS delay */ 1201 for (dq = 0; dq < DQ_NUM; dq++) { 1202 /* Check DQ bits to see if locked in all pups */ 1203 if (unlock_pup_dq_array[dq] == 0) { 1204 DEBUG_PBS_FULL_S("DDR3 - PBS Per bit - All pups are locked for DQ "); 1205 DEBUG_PBS_FULL_D(dq, 1); 1206 DEBUG_PBS_FULL_S("\n"); 1207 continue; 1208 } 1209 1210 for (pup = 0; pup < max_pup; pup++) { 1211 int idx; 1212 1213 idx = pup * (1 - ecc) + ecc * ECC_PUP; 1214 1215 if (IS_PUP_ACTIVE(unlock_pup_dq_array[dq], pup) 1216 == 0) 1217 continue; 1218 1219 if (is_tx == 1) 1220 ddr3_write_pup_reg( 1221 PUP_PBS_TX + pbs_dq_mapping[idx][dq], 1222 CS0, idx, 0, pbs_curr_val); 1223 else 1224 ddr3_write_pup_reg( 1225 PUP_PBS_RX + pbs_dq_mapping[idx][dq], 1226 CS0, idx, 0, pbs_curr_val); 1227 } 1228 } 1229 1230 /* 1231 * Write Read and compare results - run the test 1232 * DDR_PBS_COMP_RETRY_NUM times 1233 */ 1234 /* Run number of read and write to verify */ 1235 for (pbs_cmp_retry = 0; 1236 pbs_cmp_retry < COUNT_PBS_COMP_RETRY_NUM; 1237 pbs_cmp_retry++) { 1238 1239 if (MV_OK != 1240 ddr3_sdram_pbs_compare(dram_info, pup_locked, is_tx, 1241 pbs_pattern_idx, 1242 pbs_curr_val, start_pbs, 1243 skew_array, 1244 cmp_unlock_pup_dq_array 1245 [pbs_cmp_retry], ecc)) 1246 return MV_FAIL; 1247 1248 for (pup = 0; pup < max_pup; pup++) { 1249 for (dq = 0; dq < DQ_NUM; dq++) { 1250 if ((IS_PUP_ACTIVE(unlock_pup_dq_array[dq], 1251 pup) == 1) 1252 && (IS_PUP_ACTIVE(cmp_unlock_pup_dq_array 1253 [pbs_cmp_retry][dq], 1254 pup) == 0)) { 1255 DEBUG_PBS_FULL_S("DDR3 - PBS Per bit - PbsCurrVal: "); 1256 DEBUG_PBS_FULL_D(pbs_curr_val, 2); 1257 DEBUG_PBS_FULL_S(" PUP: "); 1258 DEBUG_PBS_FULL_D(pup, 1); 1259 DEBUG_PBS_FULL_S(" DQ: "); 1260 DEBUG_PBS_FULL_D(dq, 1); 1261 DEBUG_PBS_FULL_S(" - failed\n"); 1262 } 1263 } 1264 } 1265 1266 for (dq = 0; dq < DQ_NUM; dq++) { 1267 unlock_pup_dq_array[dq] &= 1268 cmp_unlock_pup_dq_array[pbs_cmp_retry][dq]; 1269 } 1270 } 1271 1272 pup_locked = 0; 1273 sum_pup_fail = *pcur_pup; 1274 1275 /* Check which DQ is failed */ 1276 for (dq = 0; dq < DQ_NUM; dq++) { 1277 /* Summarize the locked pup */ 1278 pup_locked |= unlock_pup_dq_array[dq]; 1279 1280 /* Check if get fail */ 1281 sum_pup_fail &= unlock_pup_dq_array[dq]; 1282 } 1283 1284 /* If all PUPS are locked in all DQ - Break */ 1285 if (pup_locked == 0) { 1286 /* All pups are locked */ 1287 *start_over = 0; 1288 DEBUG_PBS_FULL_S("DDR3 - PBS Per bit - All bit in all pups are successfully locked\n"); 1289 break; 1290 } 1291 1292 /* PBS deskew elements reach max ? */ 1293 if (pbs_curr_val == last_pbs) { 1294 DEBUG_PBS_FULL_S("DDR3 - PBS Per bit - PBS deskew elements reach max\n"); 1295 /* CHIP-ONLY! - Implementation Limitation */ 1296 *start_over = (sum_pup_fail != 0) && (!(*start_over)); 1297 *pcur_pup = pup_locked; 1298 1299 DEBUG_PBS_FULL_S("DDR3 - PBS Per bit - StartOver: "); 1300 DEBUG_PBS_FULL_D(*start_over, 1); 1301 DEBUG_PBS_FULL_S(" pup_locked: "); 1302 DEBUG_PBS_FULL_D(pup_locked, 2); 1303 DEBUG_PBS_FULL_S(" sum_pup_fail: "); 1304 DEBUG_PBS_FULL_D(sum_pup_fail, 2); 1305 DEBUG_PBS_FULL_S("\n"); 1306 1307 /* Lock PBS value for all remaining bits */ 1308 for (pup = 0; pup < max_pup; pup++) { 1309 /* Check if current pup already received error */ 1310 if (IS_PUP_ACTIVE(pup_locked, pup) == 1) { 1311 /* Valid pup for current function */ 1312 if (IS_PUP_ACTIVE(sum_pup_fail, pup) == 1313 1 && (*start_over == 1)) { 1314 DEBUG_PBS_FULL_C("DDR3 - PBS Per bit - skipping lock of pup (first loop of pbs)", 1315 pup, 1); 1316 continue; 1317 } else 1318 if (IS_PUP_ACTIVE(sum_pup_fail, pup) 1319 == 1) { 1320 DEBUG_PBS_FULL_C("DDR3 - PBS Per bit - Locking pup %d (even though it wasn't supposed to be locked)", 1321 pup, 1); 1322 } 1323 1324 /* Already got fail on the PUP */ 1325 /* Lock PBS value for all remaining bits */ 1326 DEBUG_PBS_FULL_S("DDR3 - PBS Per bit - Locking remaning DQs for pup - "); 1327 DEBUG_PBS_FULL_D(pup, 1); 1328 DEBUG_PBS_FULL_S(": "); 1329 1330 for (dq = 0; dq < DQ_NUM; dq++) { 1331 if (IS_PUP_ACTIVE 1332 (unlock_pup_dq_array[dq], 1333 pup) == 1) { 1334 DEBUG_PBS_FULL_D(dq, 1); 1335 DEBUG_PBS_FULL_S(","); 1336 /* set current PBS */ 1337 skew_array[((pup) * 1338 DQ_NUM) + 1339 dq] = 1340 pbs_curr_val; 1341 } 1342 } 1343 1344 if (*start_over == 1) { 1345 /* 1346 * Reset this pup bit - when 1347 * restart the PBS, ignore this 1348 * pup 1349 */ 1350 *pcur_pup &= ~(1 << pup); 1351 } 1352 DEBUG_PBS_FULL_S("\n"); 1353 } else { 1354 DEBUG_PBS_FULL_S("DDR3 - PBS Per bit - Pup "); 1355 DEBUG_PBS_FULL_D(pup, 1); 1356 DEBUG_PBS_FULL_C(" is not set in puplocked - ", 1357 pup_locked, 1); 1358 } 1359 } 1360 1361 /* Need to start the PBS again */ 1362 if (*start_over == 1) { 1363 DEBUG_PBS_FULL_S("DDR3 - PBS Per bit - false fail - returning to start\n"); 1364 return MV_OK; 1365 } 1366 break; 1367 } 1368 1369 /* Diff Check */ 1370 for (pup = 0; pup < max_pup; pup++) { 1371 if (IS_PUP_ACTIVE(pup_locked, pup) == 1) { 1372 /* pup is not locked */ 1373 if (first_failed[pup] == 0) { 1374 /* No first fail until now */ 1375 if (IS_PUP_ACTIVE(sum_pup_fail, pup) == 1376 0) { 1377 /* Get first fail */ 1378 DEBUG_PBS_FULL_C("DDR3 - PBS Per bit - First fail in pup ", 1379 pup, 1); 1380 first_failed[pup] = 1; 1381 first_fail[pup] = pbs_curr_val; 1382 } 1383 } else { 1384 /* Already got first fail */ 1385 if (is_tx == 1) { 1386 /* TX - inc pbs */ 1387 calc_pbs_diff = pbs_curr_val - 1388 first_fail[pup]; 1389 } else { 1390 /* RX - dec pbs */ 1391 calc_pbs_diff = first_fail[pup] - 1392 pbs_curr_val; 1393 } 1394 1395 if (calc_pbs_diff >= PBS_DIFF_LIMIT) { 1396 lock_pups(pup, &pup_locked, 1397 unlock_pup_dq_array, 1398 pbs_curr_val, 1399 start_pbs, ecc, is_tx); 1400 } 1401 } 1402 } 1403 } 1404 } while (1); 1405 1406 return MV_OK; 1407 } 1408 1409 /* 1410 * Name: ddr3_set_pbs_results 1411 * Desc: Set to HW the PBS phase results. 1412 * Args: is_tx Indicates whether to set Tx or RX results 1413 * Notes: 1414 * Returns: MV_OK if success, other error code if fail. 1415 */ 1416 static int ddr3_set_pbs_results(MV_DRAM_INFO *dram_info, int is_tx) 1417 { 1418 u32 pup, phys_pup, dq; 1419 u32 max_pup; /* number of valid pups */ 1420 u32 pbs_min; /* minimal pbs val per pup */ 1421 u32 pbs_max; /* maximum pbs val per pup */ 1422 u32 val[9]; 1423 1424 max_pup = dram_info->num_of_total_pups; 1425 DEBUG_PBS_FULL_S("DDR3 - PBS - ddr3_set_pbs_results:\n"); 1426 1427 /* Loop for all dqs & pups */ 1428 for (pup = 0; pup < max_pup; pup++) { 1429 if (pup == (max_pup - 1) && dram_info->ecc_ena) 1430 phys_pup = ECC_PUP; 1431 else 1432 phys_pup = pup; 1433 1434 /* 1435 * To minimize delay elements, inc from pbs value the min 1436 * pbs val 1437 */ 1438 pbs_min = MAX_PBS; 1439 pbs_max = 0; 1440 for (dq = 0; dq < DQ_NUM; dq++) { 1441 if (pbs_min > skew_array[(pup * DQ_NUM) + dq]) 1442 pbs_min = skew_array[(pup * DQ_NUM) + dq]; 1443 1444 if (pbs_max < skew_array[(pup * DQ_NUM) + dq]) 1445 pbs_max = skew_array[(pup * DQ_NUM) + dq]; 1446 } 1447 1448 pbs_max -= pbs_min; 1449 1450 DEBUG_PBS_FULL_S("DDR3 - PBS - PUP"); 1451 DEBUG_PBS_FULL_D(phys_pup, 1); 1452 DEBUG_PBS_FULL_S(": Min Val = "); 1453 DEBUG_PBS_FULL_D(pbs_min, 2); 1454 DEBUG_PBS_FULL_C(", Max Val = ", pbs_max, 2); 1455 1456 val[pup] = 0; 1457 1458 for (dq = 0; dq < DQ_NUM; dq++) { 1459 int idx; 1460 int offs; 1461 1462 /* Set skew value for all dq */ 1463 /* 1464 * Bit# Deskew <- Bit# Deskew - last / first 1465 * failing bit Deskew For all bits (per PUP) 1466 * (minimize delay elements) 1467 */ 1468 1469 DEBUG_PBS_FULL_S("DQ"); 1470 DEBUG_PBS_FULL_D(dq, 1); 1471 DEBUG_PBS_FULL_S("-"); 1472 DEBUG_PBS_FULL_D((skew_array[(pup * DQ_NUM) + dq] - 1473 pbs_min), 2); 1474 DEBUG_PBS_FULL_S(", "); 1475 1476 idx = (pup * DQ_NUM) + dq; 1477 1478 if (is_tx == 1) 1479 offs = PUP_PBS_TX; 1480 else 1481 offs = PUP_PBS_RX; 1482 1483 ddr3_write_pup_reg(offs + pbs_dq_mapping[phys_pup][dq], 1484 CS0, phys_pup, 0, 1485 skew_array[idx] - pbs_min); 1486 1487 if (is_tx == 1) 1488 val[pup] += skew_array[idx] - pbs_min; 1489 } 1490 1491 DEBUG_PBS_FULL_S("\n"); 1492 1493 /* Set the DQS the half of the Max PBS of the DQs */ 1494 if (is_tx == 1) { 1495 ddr3_write_pup_reg(PUP_PBS_TX + 8, CS0, phys_pup, 0, 1496 pbs_max / 2); 1497 ddr3_write_pup_reg(PUP_PBS_TX + 0xa, CS0, phys_pup, 0, 1498 val[pup] / 8); 1499 } else 1500 ddr3_write_pup_reg(PUP_PBS_RX + 8, CS0, phys_pup, 0, 1501 pbs_max / 2); 1502 } 1503 1504 return MV_OK; 1505 } 1506 1507 static void ddr3_pbs_write_pup_dqs_reg(u32 cs, u32 pup, u32 dqs_delay) 1508 { 1509 u32 reg, delay; 1510 1511 reg = (ddr3_read_pup_reg(PUP_WL_MODE, cs, pup) & 0x3FF); 1512 delay = reg & PUP_DELAY_MASK; 1513 reg |= ((dqs_delay + delay) << REG_PHY_DQS_REF_DLY_OFFS); 1514 reg |= REG_PHY_REGISTRY_FILE_ACCESS_OP_WR; 1515 reg |= (pup << REG_PHY_PUP_OFFS); 1516 reg |= ((0x4 * cs + PUP_WL_MODE) << REG_PHY_CS_OFFS); 1517 1518 reg_write(REG_PHY_REGISTRY_FILE_ACCESS_ADDR, reg); /* 0x16A0 */ 1519 do { 1520 reg = reg_read(REG_PHY_REGISTRY_FILE_ACCESS_ADDR) & 1521 REG_PHY_REGISTRY_FILE_ACCESS_OP_DONE; 1522 } while (reg); /* Wait for '0' to mark the end of the transaction */ 1523 1524 udelay(10); 1525 } 1526 1527 /* 1528 * Set training patterns 1529 */ 1530 int ddr3_load_pbs_patterns(MV_DRAM_INFO *dram_info) 1531 { 1532 u32 cs, cs_count, cs_tmp; 1533 u32 sdram_addr; 1534 u32 *pattern_ptr0, *pattern_ptr1; 1535 1536 /* Choose pattern */ 1537 switch (dram_info->ddr_width) { 1538 #if defined(MV88F672X) 1539 case 16: 1540 pattern_ptr0 = (u32 *)&pbs_pattern[0]; 1541 pattern_ptr1 = (u32 *)&pbs_pattern[1]; 1542 break; 1543 #endif 1544 case 32: 1545 pattern_ptr0 = (u32 *)&pbs_pattern_32b[0]; 1546 pattern_ptr1 = (u32 *)&pbs_pattern_32b[1]; 1547 break; 1548 #if defined(MV88F78X60) 1549 case 64: 1550 pattern_ptr0 = (u32 *)&pbs_pattern_64b[0]; 1551 pattern_ptr1 = (u32 *)&pbs_pattern_64b[1]; 1552 break; 1553 #endif 1554 default: 1555 return MV_FAIL; 1556 } 1557 1558 /* Loop for each CS */ 1559 for (cs = 0; cs < MAX_CS; cs++) { 1560 if (dram_info->cs_ena & (1 << cs)) { 1561 cs_count = 0; 1562 for (cs_tmp = 0; cs_tmp < cs; cs_tmp++) { 1563 if (dram_info->cs_ena & (1 << cs_tmp)) 1564 cs_count++; 1565 } 1566 1567 /* Init PBS I pattern */ 1568 sdram_addr = (cs_count * (SDRAM_CS_SIZE + 1) + 1569 SDRAM_PBS_I_OFFS); 1570 if (MV_OK != 1571 ddr3_sdram_compare(dram_info, (u32) NULL, NULL, 1572 pattern_ptr0, LEN_STD_PATTERN, 1573 sdram_addr, 1, 0, NULL, 1574 0)) 1575 return MV_FAIL; 1576 1577 /* Init PBS II pattern */ 1578 sdram_addr = (cs_count * (SDRAM_CS_SIZE + 1) + 1579 SDRAM_PBS_II_OFFS); 1580 if (MV_OK != 1581 ddr3_sdram_compare(dram_info, (u32) NULL, NULL, 1582 pattern_ptr1, LEN_STD_PATTERN, 1583 sdram_addr, 1, 0, NULL, 1584 0)) 1585 return MV_FAIL; 1586 } 1587 } 1588 1589 return MV_OK; 1590 } 1591 #endif 1592