uboot/drivers/ddr/marvell/axp/ddr3_read_leveling.c
<<
>>
Prefs
   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
  41extern u32 rl_pattern[LEN_STD_PATTERN];
  42
  43#ifdef RL_MODE
  44static 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
  48static 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 */
  61int 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 */
 179int 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 */
 335static 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 */
 399static 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 */
 751static 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