uboot/drivers/ddr/marvell/axp/ddr3_dfs.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_DFS_C(s, d, l) \
  19        DEBUG_DFS_S(s); DEBUG_DFS_D(d, l); DEBUG_DFS_S("\n")
  20#define DEBUG_DFS_FULL_C(s, d, l) \
  21        DEBUG_DFS_FULL_S(s); DEBUG_DFS_FULL_D(d, l); DEBUG_DFS_FULL_S("\n")
  22
  23#ifdef MV_DEBUG_DFS
  24#define DEBUG_DFS_S(s)                  puts(s)
  25#define DEBUG_DFS_D(d, l)               printf("%x", d)
  26#else
  27#define DEBUG_DFS_S(s)
  28#define DEBUG_DFS_D(d, l)
  29#endif
  30
  31#ifdef MV_DEBUG_DFS_FULL
  32#define DEBUG_DFS_FULL_S(s)             puts(s)
  33#define DEBUG_DFS_FULL_D(d, l)          printf("%x", d)
  34#else
  35#define DEBUG_DFS_FULL_S(s)
  36#define DEBUG_DFS_FULL_D(d, l)
  37#endif
  38
  39#if defined(MV88F672X)
  40extern u8 div_ratio[CLK_VCO][CLK_DDR];
  41extern void get_target_freq(u32 freq_mode, u32 *ddr_freq, u32 *hclk_ps);
  42#else
  43extern u16 odt_dynamic[ODT_OPT][MAX_CS];
  44extern u8 div_ratio1to1[CLK_CPU][CLK_DDR];
  45extern u8 div_ratio2to1[CLK_CPU][CLK_DDR];
  46#endif
  47extern u16 odt_static[ODT_OPT][MAX_CS];
  48
  49extern u32 cpu_fab_clk_to_hclk[FAB_OPT][CLK_CPU];
  50
  51extern u32 ddr3_get_vco_freq(void);
  52
  53u32 ddr3_get_freq_parameter(u32 target_freq, int ratio_2to1);
  54
  55#ifdef MV_DEBUG_DFS
  56static inline void dfs_reg_write(u32 addr, u32 val)
  57{
  58        printf("\n write reg 0x%08x = 0x%08x", addr, val);
  59        writel(val, INTER_REGS_BASE + addr);
  60}
  61#else
  62static inline void dfs_reg_write(u32 addr, u32 val)
  63{
  64        writel(val, INTER_REGS_BASE + addr);
  65}
  66#endif
  67
  68static void wait_refresh_op_complete(void)
  69{
  70        u32 reg;
  71
  72        /* Poll - Wait for Refresh operation completion */
  73        do {
  74                reg = reg_read(REG_SDRAM_OPERATION_ADDR) &
  75                        REG_SDRAM_OPERATION_CMD_RFRS_DONE;
  76        } while (reg);          /* Wait for '0' */
  77}
  78
  79/*
  80 * Name:     ddr3_get_freq_parameter
  81 * Desc:     Finds CPU/DDR frequency ratio according to Sample@reset and table.
  82 * Args:     target_freq - target frequency
  83 * Notes:
  84 * Returns:  freq_par - the ratio parameter
  85 */
  86u32 ddr3_get_freq_parameter(u32 target_freq, int ratio_2to1)
  87{
  88        u32 ui_vco_freq, freq_par;
  89
  90        ui_vco_freq = ddr3_get_vco_freq();
  91
  92#if defined(MV88F672X)
  93        freq_par = div_ratio[ui_vco_freq][target_freq];
  94#else
  95        /* Find the ratio between PLL frequency and ddr-clk */
  96        if (ratio_2to1)
  97                freq_par = div_ratio2to1[ui_vco_freq][target_freq];
  98        else
  99                freq_par = div_ratio1to1[ui_vco_freq][target_freq];
 100#endif
 101
 102        return freq_par;
 103}
 104
 105/*
 106 * Name:     ddr3_dfs_high_2_low
 107 * Desc:
 108 * Args:     freq - target frequency
 109 * Notes:
 110 * Returns:  MV_OK - success, MV_FAIL - fail
 111 */
 112int ddr3_dfs_high_2_low(u32 freq, MV_DRAM_INFO *dram_info)
 113{
 114#if defined(MV88F78X60) || defined(MV88F672X)
 115        /* This Flow is relevant for ArmadaXP A0 */
 116        u32 reg, freq_par, tmp;
 117        u32 cs = 0;
 118
 119        DEBUG_DFS_C("DDR3 - DFS - High To Low - Starting DFS procedure to Frequency - ",
 120                    freq, 1);
 121
 122        /* target frequency - 100MHz */
 123        freq_par = ddr3_get_freq_parameter(freq, 0);
 124
 125#if defined(MV88F672X)
 126        u32 hclk;
 127        u32 cpu_freq = ddr3_get_cpu_freq();
 128        get_target_freq(cpu_freq, &tmp, &hclk);
 129#endif
 130
 131        /* Configure - DRAM DLL final state after DFS is complete - Enable */
 132        reg = reg_read(REG_DFS_ADDR);
 133        /* [0] - DfsDllNextState - Disable */
 134        reg |= (1 << REG_DFS_DLLNEXTSTATE_OFFS);
 135        dfs_reg_write(REG_DFS_ADDR, reg);       /* 0x1528 - DFS register */
 136
 137        /*
 138         * Configure - XBAR Retry response during Block to enable internal
 139         * access - Disable
 140         */
 141        reg = reg_read(REG_METAL_MASK_ADDR);
 142        /* [0] - RetryMask - Disable */
 143        reg &= ~(1 << REG_METAL_MASK_RETRY_OFFS);
 144        /* 0x14B0 - Dunit MMask Register */
 145        dfs_reg_write(REG_METAL_MASK_ADDR, reg);
 146
 147        /* Configure - Block new external transactions - Enable */
 148        reg = reg_read(REG_DFS_ADDR);
 149        reg |= (1 << REG_DFS_BLOCK_OFFS);       /* [1] - DfsBlock - Enable  */
 150        dfs_reg_write(REG_DFS_ADDR, reg);       /* 0x1528 - DFS register */
 151
 152        /* Registered DIMM support */
 153        if (dram_info->reg_dimm) {
 154                /*
 155                 * Configure - Disable Register DIMM CKE Power
 156                 * Down mode - CWA_RC
 157                 */
 158                reg = (0x9 & REG_SDRAM_OPERATION_CWA_RC_MASK) <<
 159                        REG_SDRAM_OPERATION_CWA_RC_OFFS;
 160                /*
 161                 * Configure - Disable Register DIMM CKE Power
 162                 * Down mode - CWA_DATA
 163                 */
 164                reg |= ((0 & REG_SDRAM_OPERATION_CWA_DATA_MASK) <<
 165                        REG_SDRAM_OPERATION_CWA_DATA_OFFS);
 166
 167                /*
 168                 * Configure - Disable Register DIMM CKE Power
 169                 * Down mode - Set Delay - tMRD
 170                 */
 171                reg |= (0 << REG_SDRAM_OPERATION_CWA_DELAY_SEL_OFFS);
 172
 173                /* Configure - Issue CWA command with the above parameters */
 174                reg |= (REG_SDRAM_OPERATION_CMD_CWA &
 175                        ~(0xF << REG_SDRAM_OPERATION_CS_OFFS));
 176
 177                /* 0x1418 - SDRAM Operation Register */
 178                dfs_reg_write(REG_SDRAM_OPERATION_ADDR, reg);
 179
 180                /* Poll - Wait for CWA operation completion */
 181                do {
 182                        reg = reg_read(REG_SDRAM_OPERATION_ADDR) &
 183                               (REG_SDRAM_OPERATION_CMD_MASK);
 184                } while (reg);
 185
 186                /* Configure - Disable outputs floating during Self Refresh */
 187                reg = reg_read(REG_REGISTERED_DRAM_CTRL_ADDR);
 188                /* [15] - SRFloatEn - Disable */
 189                reg &= ~(1 << REG_REGISTERED_DRAM_CTRL_SR_FLOAT_OFFS);
 190                /* 0x16D0 - DDR3 Registered DRAM Control */
 191                dfs_reg_write(REG_REGISTERED_DRAM_CTRL_ADDR, reg);
 192        }
 193
 194        /* Optional - Configure - DDR3_Rtt_nom_CS# */
 195        for (cs = 0; cs < MAX_CS; cs++) {
 196                if (dram_info->cs_ena & (1 << cs)) {
 197                        reg = reg_read(REG_DDR3_MR1_CS_ADDR +
 198                                       (cs << MR_CS_ADDR_OFFS));
 199                        reg &= REG_DDR3_MR1_RTT_MASK;
 200                        dfs_reg_write(REG_DDR3_MR1_CS_ADDR +
 201                                      (cs << MR_CS_ADDR_OFFS), reg);
 202                }
 203        }
 204
 205        /* Configure - Move DRAM into Self Refresh */
 206        reg = reg_read(REG_DFS_ADDR);
 207        reg |= (1 << REG_DFS_SR_OFFS);  /* [2] - DfsSR - Enable */
 208        dfs_reg_write(REG_DFS_ADDR, reg);       /* 0x1528 - DFS register */
 209
 210        /* Poll - Wait for Self Refresh indication */
 211        do {
 212                reg = ((reg_read(REG_DFS_ADDR)) & (1 << REG_DFS_ATSR_OFFS));
 213        } while (reg == 0x0);   /* 0x1528 [3] - DfsAtSR - Wait for '1' */
 214
 215        /* Start of clock change procedure (PLL) */
 216#if defined(MV88F672X)
 217        /* avantaLP */
 218        /* Configure    cpupll_clkdiv_reset_mask */
 219        reg = reg_read(CPU_PLL_CLOCK_DIVIDER_CNTRL0);
 220        reg &= CPU_PLL_CLOCK_DIVIDER_CNTRL0_MASK;
 221        /* 0xE8264[7:0]   0xff CPU Clock Dividers Reset mask */
 222        dfs_reg_write(CPU_PLL_CLOCK_DIVIDER_CNTRL0, (reg + 0xFF));
 223
 224        /* Configure    cpu_clkdiv_reload_smooth    */
 225        reg = reg_read(CPU_PLL_CNTRL0);
 226        reg &= CPU_PLL_CNTRL0_RELOAD_SMOOTH_MASK;
 227        /* 0xE8260   [15:8]  0x2 CPU Clock Dividers Reload Smooth enable */
 228        dfs_reg_write(CPU_PLL_CNTRL0,
 229                      (reg + (2 << CPU_PLL_CNTRL0_RELOAD_SMOOTH_OFFS)));
 230
 231        /* Configure    cpupll_clkdiv_relax_en */
 232        reg = reg_read(CPU_PLL_CNTRL0);
 233        reg &= CPU_PLL_CNTRL0_RELAX_EN_MASK;
 234        /* 0xE8260 [31:24] 0x2 Relax Enable */
 235        dfs_reg_write(CPU_PLL_CNTRL0,
 236                      (reg + (2 << CPU_PLL_CNTRL0_RELAX_EN_OFFS)));
 237
 238        /* Configure    cpupll_clkdiv_ddr_clk_ratio */
 239        reg = reg_read(CPU_PLL_CLOCK_DIVIDER_CNTRL1);
 240        /*
 241         * 0xE8268  [13:8]  N   Set Training clock:
 242         * APLL Out Clock (VCO freq) / N = 100 MHz
 243         */
 244        reg &= CPU_PLL_CLOCK_DIVIDER_CNTRL1_MASK;
 245        reg |= (freq_par << 8); /* full Integer ratio from PLL-out to ddr-clk */
 246        dfs_reg_write(CPU_PLL_CLOCK_DIVIDER_CNTRL1, reg);
 247
 248        /* Configure    cpupll_clkdiv_reload_ratio  */
 249        reg = reg_read(CPU_PLL_CLOCK_DIVIDER_CNTRL0);
 250        reg &= CPU_PLL_CLOCK_RELOAD_RATIO_MASK;
 251        /* 0xE8264 [8]=0x1 CPU Clock Dividers Reload Ratio trigger set */
 252        dfs_reg_write(CPU_PLL_CLOCK_DIVIDER_CNTRL0,
 253                      (reg + (1 << CPU_PLL_CLOCK_RELOAD_RATIO_OFFS)));
 254
 255        udelay(1);
 256
 257        /* Configure    cpupll_clkdiv_reload_ratio  */
 258        reg = reg_read(CPU_PLL_CLOCK_DIVIDER_CNTRL0);
 259        reg &= CPU_PLL_CLOCK_RELOAD_RATIO_MASK;
 260        /* 0xE8264 [8]=0x0 CPU Clock Dividers Reload Ratio trigger clear */
 261        dfs_reg_write(CPU_PLL_CLOCK_DIVIDER_CNTRL0, reg);
 262
 263        udelay(5);
 264
 265#else
 266        /*
 267         * Initial Setup - assure that the "load new ratio" is clear (bit 24)
 268         * and in the same chance, block reassertions of reset [15:8] and
 269         * force reserved bits[7:0].
 270         */
 271        reg = 0x0000FDFF;
 272        /* 0x18700 - CPU Div CLK control 0 */
 273        dfs_reg_write(REG_CPU_DIV_CLK_CTRL_0_ADDR, reg);
 274
 275        /*
 276         * RelaX whenever reset is asserted to that channel
 277         * (good for any case)
 278         */
 279        reg = 0x0000FF00;
 280        /* 0x18704 - CPU Div CLK control 0 */
 281        dfs_reg_write(REG_CPU_DIV_CLK_CTRL_1_ADDR, reg);
 282
 283        reg = reg_read(REG_CPU_DIV_CLK_CTRL_2_ADDR) &
 284                REG_CPU_DIV_CLK_CTRL_3_FREQ_MASK;
 285
 286        /* full Integer ratio from PLL-out to ddr-clk */
 287        reg |= (freq_par << REG_CPU_DIV_CLK_CTRL_3_FREQ_OFFS);
 288        /* 0x1870C - CPU Div CLK control 3 register */
 289        dfs_reg_write(REG_CPU_DIV_CLK_CTRL_2_ADDR, reg);
 290
 291        /*
 292         * Shut off clock enable to the DDRPHY clock channel (this is the "D").
 293         * All the rest are kept as is (forced, but could be read-modify-write).
 294         * This is done now by RMW above.
 295         */
 296
 297        /* Clock is not shut off gracefully - keep it running */
 298        reg = 0x000FFF02;
 299        dfs_reg_write(REG_CPU_DIV_CLK_CTRL_4_ADDR, reg);
 300
 301        /* Wait before replacing the clock on the DDR Phy Channel. */
 302        udelay(1);
 303
 304        /*
 305         * This for triggering the frequency update. Bit[24] is the
 306         * central control
 307         * bits [23:16] == which channels to change ==2 ==>
 308         *                 only DDR Phy (smooth transition)
 309         * bits [15:8] == mask reset reassertion due to clock modification
 310         *                to these channels.
 311         * bits [7:0] == not in use
 312         */
 313        reg = 0x0102FDFF;
 314        /* 0x18700 - CPU Div CLK control 0 register */
 315        dfs_reg_write(REG_CPU_DIV_CLK_CTRL_0_ADDR, reg);
 316
 317        udelay(1);              /* Wait 1usec */
 318
 319        /*
 320         * Poll Div CLK status 0 register - indication that the clocks
 321         * are active - 0x18718 [8]
 322         */
 323        do {
 324                reg = (reg_read(REG_CPU_DIV_CLK_STATUS_0_ADDR)) &
 325                        (1 << REG_CPU_DIV_CLK_ALL_STABLE_OFFS);
 326        } while (reg == 0);
 327
 328        /*
 329         * Clean the CTRL0, to be ready for next resets and next requests
 330         * of ratio modifications.
 331         */
 332        reg = 0x000000FF;
 333        /* 0x18700 - CPU Div CLK control 0 register */
 334        dfs_reg_write(REG_CPU_DIV_CLK_CTRL_0_ADDR, reg);
 335
 336        udelay(5);
 337#endif
 338        /* End of clock change procedure (PLL) */
 339
 340        /* Configure - Select normal clock for the DDR PHY - Enable */
 341        reg = reg_read(REG_DRAM_INIT_CTRL_STATUS_ADDR);
 342        /* [16] - ddr_phy_trn_clk_sel - Enable  */
 343        reg |= (1 << REG_DRAM_INIT_CTRL_TRN_CLK_OFFS);
 344        /* 0x18488 - DRAM Init control status register */
 345        dfs_reg_write(REG_DRAM_INIT_CTRL_STATUS_ADDR, reg);
 346
 347        /* Configure - Set Correct Ratio - 1:1 */
 348        /* [15] - Phy2UnitClkRatio = 0 - Set 1:1 Ratio between Dunit and Phy */
 349
 350        reg = reg_read(REG_DDR_IO_ADDR) & ~(1 << REG_DDR_IO_CLK_RATIO_OFFS);
 351        dfs_reg_write(REG_DDR_IO_ADDR, reg);    /* 0x1524 - DDR IO Register */
 352
 353        /* Configure - 2T Mode - Restore original configuration */
 354        reg = reg_read(REG_DUNIT_CTRL_LOW_ADDR);
 355        /* [3:4] 2T - 1T Mode - low freq */
 356        reg &= ~(REG_DUNIT_CTRL_LOW_2T_MASK << REG_DUNIT_CTRL_LOW_2T_OFFS);
 357        /* 0x1404 - DDR Controller Control Low Register */
 358        dfs_reg_write(REG_DUNIT_CTRL_LOW_ADDR, reg);
 359
 360        /* Configure - Restore CL and CWL - MRS Commands */
 361        reg = reg_read(REG_DFS_ADDR);
 362        reg &= ~(REG_DFS_CL_NEXT_STATE_MASK << REG_DFS_CL_NEXT_STATE_OFFS);
 363        reg &= ~(REG_DFS_CWL_NEXT_STATE_MASK << REG_DFS_CWL_NEXT_STATE_OFFS);
 364        /* [8] - DfsCLNextState - MRS CL=6 after DFS (due to DLL-off mode) */
 365        reg |= (0x4 << REG_DFS_CL_NEXT_STATE_OFFS);
 366        /* [12] - DfsCWLNextState - MRS CWL=6 after DFS (due to DLL-off mode) */
 367        reg |= (0x1 << REG_DFS_CWL_NEXT_STATE_OFFS);
 368        dfs_reg_write(REG_DFS_ADDR, reg);       /* 0x1528 - DFS register */
 369
 370        /* Poll - Wait for APLL + ADLLs lock on new frequency */
 371        do {
 372                reg = (reg_read(REG_PHY_LOCK_STATUS_ADDR)) &
 373                        REG_PHY_LOCK_APLL_ADLL_STATUS_MASK;
 374                /* 0x1674 [10:0] - Phy lock status Register */
 375        } while (reg != REG_PHY_LOCK_APLL_ADLL_STATUS_MASK);
 376
 377        /* Configure - Reset the PHY Read FIFO and Write channels - Set Reset */
 378        reg = (reg_read(REG_SDRAM_CONFIG_ADDR) & REG_SDRAM_CONFIG_MASK);
 379        /* [30:29] = 0 - Data Pup R/W path reset */
 380        /* 0x1400 - SDRAM Configuration register */
 381        dfs_reg_write(REG_SDRAM_CONFIG_ADDR, reg);
 382
 383        /*
 384         * Configure - DRAM Data PHY Read [30], Write [29] path
 385         * reset - Release Reset
 386         */
 387        reg = (reg_read(REG_SDRAM_CONFIG_ADDR) | ~REG_SDRAM_CONFIG_MASK);
 388        /* [30:29] = '11' - Data Pup R/W path reset */
 389        /* 0x1400 - SDRAM Configuration register */
 390        dfs_reg_write(REG_SDRAM_CONFIG_ADDR, reg);
 391
 392        /* Registered DIMM support */
 393        if (dram_info->reg_dimm) {
 394                /*
 395                 * Configure - Change register DRAM operating speed
 396                 * (below 400MHz) - CWA_RC
 397                 */
 398                reg = (0xA & REG_SDRAM_OPERATION_CWA_RC_MASK) <<
 399                        REG_SDRAM_OPERATION_CWA_RC_OFFS;
 400
 401                /*
 402                 * Configure - Change register DRAM operating speed
 403                 * (below 400MHz) - CWA_DATA
 404                 */
 405                reg |= ((0x0 & REG_SDRAM_OPERATION_CWA_DATA_MASK) <<
 406                        REG_SDRAM_OPERATION_CWA_DATA_OFFS);
 407
 408                /* Configure - Set Delay - tSTAB */
 409                reg |= (0x1 << REG_SDRAM_OPERATION_CWA_DELAY_SEL_OFFS);
 410
 411                /* Configure - Issue CWA command with the above parameters */
 412                reg |= (REG_SDRAM_OPERATION_CMD_CWA &
 413                        ~(0xF << REG_SDRAM_OPERATION_CS_OFFS));
 414
 415                /* 0x1418 - SDRAM Operation Register */
 416                dfs_reg_write(REG_SDRAM_OPERATION_ADDR, reg);
 417
 418                /* Poll - Wait for CWA operation completion */
 419                do {
 420                        reg = reg_read(REG_SDRAM_OPERATION_ADDR) &
 421                                (REG_SDRAM_OPERATION_CMD_MASK);
 422                } while (reg);
 423        }
 424
 425        /* Configure - Exit Self Refresh */
 426        /* [2] - DfsSR  */
 427        reg = (reg_read(REG_DFS_ADDR) & ~(1 << REG_DFS_SR_OFFS));
 428        dfs_reg_write(REG_DFS_ADDR, reg);       /* 0x1528 - DFS register */
 429
 430        /*
 431         * Poll - DFS Register - 0x1528 [3] - DfsAtSR - All DRAM devices
 432         * on all ranks are NOT in self refresh mode
 433         */
 434        do {
 435                reg = ((reg_read(REG_DFS_ADDR)) & (1 << REG_DFS_ATSR_OFFS));
 436        } while (reg);          /* Wait for '0' */
 437
 438        /* Configure - Issue Refresh command */
 439        /* [3-0] = 0x2 - Refresh Command, [11-8] - enabled Cs */
 440        reg = REG_SDRAM_OPERATION_CMD_RFRS;
 441        for (cs = 0; cs < MAX_CS; cs++) {
 442                if (dram_info->cs_ena & (1 << cs))
 443                        reg &= ~(1 << (REG_SDRAM_OPERATION_CS_OFFS + cs));
 444        }
 445
 446        /* 0x1418 - SDRAM Operation Register */
 447        dfs_reg_write(REG_SDRAM_OPERATION_ADDR, reg);
 448
 449        /* Poll - Wait for Refresh operation completion */
 450        wait_refresh_op_complete();
 451
 452        /* Configure - Block new external transactions - Disable */
 453        reg = reg_read(REG_DFS_ADDR);
 454        reg &= ~(1 << REG_DFS_BLOCK_OFFS);      /* [1] - DfsBlock - Disable  */
 455        dfs_reg_write(REG_DFS_ADDR, reg);       /* 0x1528 - DFS register */
 456
 457        /*
 458         * Configure -  XBAR Retry response during Block to enable
 459         * internal access - Disable
 460         */
 461        reg = reg_read(REG_METAL_MASK_ADDR);
 462        /* [0] - RetryMask - Enable */
 463        reg |= (1 << REG_METAL_MASK_RETRY_OFFS);
 464        /* 0x14B0 - Dunit MMask Register */
 465        dfs_reg_write(REG_METAL_MASK_ADDR, reg);
 466
 467        for (cs = 0; cs < MAX_CS; cs++) {
 468                if (dram_info->cs_ena & (1 << cs)) {
 469                        /* Configure - Set CL */
 470                        reg = reg_read(REG_DDR3_MR0_CS_ADDR +
 471                                       (cs << MR_CS_ADDR_OFFS)) &
 472                                ~REG_DDR3_MR0_CL_MASK;
 473                        tmp = 0x4;      /* CL=6 - 0x4 */
 474                        reg |= ((tmp & 0x1) << REG_DDR3_MR0_CL_OFFS);
 475                        reg |= ((tmp & 0xE) << REG_DDR3_MR0_CL_HIGH_OFFS);
 476                        dfs_reg_write(REG_DDR3_MR0_CS_ADDR +
 477                                      (cs << MR_CS_ADDR_OFFS), reg);
 478
 479                        /* Configure - Set CWL */
 480                        reg = reg_read(REG_DDR3_MR2_CS_ADDR +
 481                                       (cs << MR_CS_ADDR_OFFS))
 482                                & ~(REG_DDR3_MR2_CWL_MASK << REG_DDR3_MR2_CWL_OFFS);
 483                        /* CWL=6 - 0x1 */
 484                        reg |= ((0x1) << REG_DDR3_MR2_CWL_OFFS);
 485                        dfs_reg_write(REG_DDR3_MR2_CS_ADDR +
 486                                      (cs << MR_CS_ADDR_OFFS), reg);
 487                }
 488        }
 489
 490        DEBUG_DFS_C("DDR3 - DFS - High To Low - Ended successfuly - new Frequency - ",
 491                    freq, 1);
 492
 493        return MV_OK;
 494#else
 495        /* This Flow is relevant for Armada370 A0 and ArmadaXP Z1 */
 496
 497        u32 reg, freq_par;
 498        u32 cs = 0;
 499
 500        DEBUG_DFS_C("DDR3 - DFS - High To Low - Starting DFS procedure to Frequency - ",
 501                    freq, 1);
 502
 503        /* target frequency - 100MHz */
 504        freq_par = ddr3_get_freq_parameter(freq, 0);
 505
 506        reg = 0x0000FF00;
 507        /* 0x18700 - CPU Div CLK control 0 */
 508        dfs_reg_write(REG_CPU_DIV_CLK_CTRL_1_ADDR, reg);
 509
 510        /* 0x1600 - ODPG_CNTRL_Control */
 511        reg = reg_read(REG_ODPG_CNTRL_ADDR);
 512        /* [21] = 1 - auto refresh disable */
 513        reg |= (1 << REG_ODPG_CNTRL_OFFS);
 514        dfs_reg_write(REG_ODPG_CNTRL_ADDR, reg);
 515
 516        /* 0x1670 - PHY lock mask register */
 517        reg = reg_read(REG_PHY_LOCK_MASK_ADDR);
 518        reg &= REG_PHY_LOCK_MASK_MASK;  /* [11:0] = 0 */
 519        dfs_reg_write(REG_PHY_LOCK_MASK_ADDR, reg);
 520
 521        reg = reg_read(REG_DFS_ADDR);   /* 0x1528 - DFS register */
 522
 523        /* Disable reconfig */
 524        reg &= ~0x10;   /* [4] - Enable reconfig MR registers after DFS_ERG */
 525        reg |= 0x1;     /* [0] - DRAM DLL disabled after DFS */
 526
 527        dfs_reg_write(REG_DFS_ADDR, reg);       /* 0x1528 - DFS register */
 528
 529        reg = reg_read(REG_METAL_MASK_ADDR) & ~(1 << 0); /* [0] - disable */
 530        /* 0x14B0 - Dunit MMask Register */
 531        dfs_reg_write(REG_METAL_MASK_ADDR, reg);
 532
 533        /* [1] - DFS Block enable  */
 534        reg = reg_read(REG_DFS_ADDR) | (1 << REG_DFS_BLOCK_OFFS);
 535        dfs_reg_write(REG_DFS_ADDR, reg);       /* 0x1528 - DFS register */
 536
 537        /* [2] - DFS Self refresh enable  */
 538        reg = reg_read(REG_DFS_ADDR) | (1 << REG_DFS_SR_OFFS);
 539        dfs_reg_write(REG_DFS_ADDR, reg);       /* 0x1528 - DFS register */
 540
 541        /*
 542         * Poll DFS Register - 0x1528 [3] - DfsAtSR -
 543         * All DRAM devices on all ranks are in self refresh mode -
 544         * DFS can be executed afterwards
 545         */
 546        do {
 547                reg = reg_read(REG_DFS_ADDR) & (1 << REG_DFS_ATSR_OFFS);
 548        } while (reg == 0x0);   /* Wait for '1' */
 549
 550        /* Disable ODT on DLL-off mode */
 551        dfs_reg_write(REG_SDRAM_ODT_CTRL_HIGH_ADDR,
 552                      REG_SDRAM_ODT_CTRL_HIGH_OVRD_MASK);
 553
 554        /* [11:0] = 0 */
 555        reg = (reg_read(REG_PHY_LOCK_MASK_ADDR) & REG_PHY_LOCK_MASK_MASK);
 556        /* 0x1670 - PHY lock mask register */
 557        dfs_reg_write(REG_PHY_LOCK_MASK_ADDR, reg);
 558
 559        /* Add delay between entering SR and start ratio modification */
 560        udelay(1);
 561
 562        /*
 563         * Initial Setup - assure that the "load new ratio" is clear (bit 24)
 564         * and in the same chance, block reassertions of reset [15:8] and
 565         * force reserved bits[7:0].
 566         */
 567        reg = 0x0000FDFF;
 568        /* 0x18700 - CPU Div CLK control 0 */
 569        dfs_reg_write(REG_CPU_DIV_CLK_CTRL_0_ADDR, reg);
 570
 571        /*
 572         * RelaX whenever reset is asserted to that channel (good for any case)
 573         */
 574        reg = 0x0000FF00;
 575        /* 0x18700 - CPU Div CLK control 0 */
 576        dfs_reg_write(REG_CPU_DIV_CLK_CTRL_1_ADDR, reg);
 577
 578        reg = reg_read(REG_CPU_DIV_CLK_CTRL_3_ADDR) &
 579                REG_CPU_DIV_CLK_CTRL_3_FREQ_MASK;
 580        /* Full Integer ratio from PLL-out to ddr-clk */
 581        reg |= (freq_par << REG_CPU_DIV_CLK_CTRL_3_FREQ_OFFS);
 582        /* 0x1870C - CPU Div CLK control 3 register */
 583        dfs_reg_write(REG_CPU_DIV_CLK_CTRL_3_ADDR, reg);
 584
 585        /*
 586         * Shut off clock enable to the DDRPHY clock channel (this is the "D").
 587         * All the rest are kept as is (forced, but could be read-modify-write).
 588         * This is done now by RMW above.
 589         */
 590
 591        /* Clock is not shut off gracefully - keep it running */
 592        reg = 0x000FFF02;
 593        dfs_reg_write(REG_CPU_DIV_CLK_CTRL_4_ADDR, reg);
 594
 595        /* Wait before replacing the clock on the DDR Phy Channel. */
 596        udelay(1);
 597
 598        /*
 599         * This for triggering the frequency update. Bit[24] is the
 600         * central control
 601         * bits [23:16] == which channels to change ==2 ==> only DDR Phy
 602         *                 (smooth transition)
 603         * bits [15:8] == mask reset reassertion due to clock modification
 604         *                to these channels.
 605         * bits [7:0] == not in use
 606         */
 607        reg = 0x0102FDFF;
 608        /* 0x18700 - CPU Div CLK control 0 register */
 609        dfs_reg_write(REG_CPU_DIV_CLK_CTRL_0_ADDR, reg);
 610
 611        udelay(1);              /* Wait 1usec */
 612
 613        /*
 614         * Poll Div CLK status 0 register - indication that the clocks
 615         * are active - 0x18718 [8]
 616         */
 617        do {
 618                reg = (reg_read(REG_CPU_DIV_CLK_STATUS_0_ADDR)) &
 619                        (1 << REG_CPU_DIV_CLK_ALL_STABLE_OFFS);
 620        } while (reg == 0);
 621
 622        /*
 623         * Clean the CTRL0, to be ready for next resets and next requests of
 624         * ratio modifications.
 625         */
 626        reg = 0x000000FF;
 627        /* 0x18700 - CPU Div CLK control 0 register */
 628        dfs_reg_write(REG_CPU_DIV_CLK_CTRL_0_ADDR, reg);
 629
 630        udelay(5);
 631
 632        /* Switch HCLK Mux to training clk (100Mhz), keep DFS request bit */
 633        reg = 0x20050000;
 634        /* 0x18488 - DRAM Init control status register */
 635        dfs_reg_write(REG_DRAM_INIT_CTRL_STATUS_ADDR, reg);
 636
 637        reg = reg_read(REG_DDR_IO_ADDR) & ~(1 << REG_DDR_IO_CLK_RATIO_OFFS);
 638        /* [15] = 0 - Set 1:1 Ratio between Dunit and Phy */
 639        dfs_reg_write(REG_DDR_IO_ADDR, reg);    /* 0x1524 - DDR IO Regist */
 640
 641        reg = reg_read(REG_DRAM_PHY_CONFIG_ADDR) & REG_DRAM_PHY_CONFIG_MASK;
 642        /* [31:30]] - reset pup data ctrl ADLL */
 643        /* 0x15EC - DRAM PHY Config register */
 644        dfs_reg_write(REG_DRAM_PHY_CONFIG_ADDR, reg);
 645
 646        reg = (reg_read(REG_DRAM_PHY_CONFIG_ADDR) | ~REG_DRAM_PHY_CONFIG_MASK);
 647        /* [31:30] - normal pup data ctrl ADLL */
 648        /* 0x15EC - DRAM PHY Config register */
 649        dfs_reg_write(REG_DRAM_PHY_CONFIG_ADDR, reg);
 650
 651        udelay(1);              /* Wait 1usec */
 652
 653        /* 0x1404 */
 654        reg = (reg_read(REG_DUNIT_CTRL_LOW_ADDR) & 0xFFFFFFE7);
 655        dfs_reg_write(REG_DUNIT_CTRL_LOW_ADDR, reg);
 656
 657        /* Poll Phy lock status register - APLL lock indication - 0x1674 */
 658        do {
 659                reg = (reg_read(REG_PHY_LOCK_STATUS_ADDR)) &
 660                        REG_PHY_LOCK_STATUS_LOCK_MASK;
 661        } while (reg != REG_PHY_LOCK_STATUS_LOCK_MASK); /* Wait for '0xFFF' */
 662
 663        reg = (reg_read(REG_SDRAM_CONFIG_ADDR) & REG_SDRAM_CONFIG_MASK);
 664        /* [30:29] = 0 - Data Pup R/W path reset */
 665        /* 0x1400 - SDRAM Configuration register */
 666        dfs_reg_write(REG_SDRAM_CONFIG_ADDR, reg);
 667
 668        reg = reg_read(REG_SDRAM_CONFIG_ADDR) | ~REG_SDRAM_CONFIG_MASK;
 669        /* [30:29] = '11' - Data Pup R/W path reset */
 670        /* 0x1400 - SDRAM Configuration register */
 671        dfs_reg_write(REG_SDRAM_CONFIG_ADDR, reg);
 672
 673        udelay(1000);           /* Wait 1msec */
 674
 675        for (cs = 0; cs < MAX_CS; cs++) {
 676                if (dram_info->cs_ena & (1 << cs)) {
 677                        /* Poll - Wait for Refresh operation completion */
 678                        wait_refresh_op_complete();
 679
 680                        /* Config CL and CWL with MR0 and MR2 registers */
 681                        reg = reg_read(REG_DDR3_MR0_ADDR);
 682                        reg &= ~0x74;   /* CL [3:0]; [6:4],[2] */
 683                        reg |= (1 << 5);        /* CL = 4, CAS is 6 */
 684                        dfs_reg_write(REG_DDR3_MR0_ADDR, reg);
 685                        reg = REG_SDRAM_OPERATION_CMD_MR0 &
 686                                ~(1 << (REG_SDRAM_OPERATION_CS_OFFS + cs));
 687                        /* 0x1418 - SDRAM Operation Register */
 688                        dfs_reg_write(REG_SDRAM_OPERATION_ADDR, reg);
 689
 690                        /* Poll - Wait for Refresh operation completion */
 691                        wait_refresh_op_complete();
 692
 693                        reg = reg_read(REG_DDR3_MR2_ADDR);
 694                        reg &= ~0x38;   /* CWL [5:3] */
 695                        reg |= (1 << 3);        /* CWL = 1, CWL is 6 */
 696                        dfs_reg_write(REG_DDR3_MR2_ADDR, reg);
 697
 698                        reg = REG_SDRAM_OPERATION_CMD_MR2 &
 699                                ~(1 << (REG_SDRAM_OPERATION_CS_OFFS + cs));
 700                        /* 0x1418 - SDRAM Operation Register */
 701                        dfs_reg_write(REG_SDRAM_OPERATION_ADDR, reg);
 702
 703                        /* Poll - Wait for Refresh operation completion */
 704                        wait_refresh_op_complete();
 705
 706                        /* Set current rd_sample_delay  */
 707                        reg = reg_read(REG_READ_DATA_SAMPLE_DELAYS_ADDR);
 708                        reg &= ~(REG_READ_DATA_SAMPLE_DELAYS_MASK <<
 709                                 (REG_READ_DATA_SAMPLE_DELAYS_OFFS * cs));
 710                        reg |= (5 << (REG_READ_DATA_SAMPLE_DELAYS_OFFS * cs));
 711                        dfs_reg_write(REG_READ_DATA_SAMPLE_DELAYS_ADDR, reg);
 712
 713                        /* Set current rd_ready_delay  */
 714                        reg = reg_read(REG_READ_DATA_READY_DELAYS_ADDR);
 715                        reg &= ~(REG_READ_DATA_READY_DELAYS_MASK <<
 716                                 (REG_READ_DATA_READY_DELAYS_OFFS * cs));
 717                        reg |= ((6) << (REG_READ_DATA_READY_DELAYS_OFFS * cs));
 718                        dfs_reg_write(REG_READ_DATA_READY_DELAYS_ADDR, reg);
 719                }
 720        }
 721
 722        /* [2] - DFS Self refresh disable  */
 723        reg = reg_read(REG_DFS_ADDR) & ~(1 << REG_DFS_SR_OFFS);
 724        dfs_reg_write(REG_DFS_ADDR, reg);       /* 0x1528 - DFS register */
 725
 726        /* [1] - DFS Block enable  */
 727        reg = reg_read(REG_DFS_ADDR) & ~(1 << REG_DFS_BLOCK_OFFS);
 728        dfs_reg_write(REG_DFS_ADDR, reg);       /* 0x1528 - DFS register */
 729
 730        /*
 731         * Poll DFS Register - 0x1528 [3] - DfsAtSR -
 732         * All DRAM devices on all ranks are in self refresh mode - DFS can
 733         * be executed afterwards
 734         */
 735        do {
 736                reg = reg_read(REG_DFS_ADDR) & (1 << REG_DFS_ATSR_OFFS);
 737        } while (reg);          /* Wait for '1' */
 738
 739        reg = (reg_read(REG_METAL_MASK_ADDR) | (1 << 0));
 740        /* [0] - Enable Dunit to crossbar retry */
 741        /* 0x14B0 - Dunit MMask Register */
 742        dfs_reg_write(REG_METAL_MASK_ADDR, reg);
 743
 744        /* 0x1600 - PHY lock mask register */
 745        reg = reg_read(REG_ODPG_CNTRL_ADDR);
 746        reg &= ~(1 << REG_ODPG_CNTRL_OFFS);     /* [21] = 0 */
 747        dfs_reg_write(REG_ODPG_CNTRL_ADDR, reg);
 748
 749        /* 0x1670 - PHY lock mask register */
 750        reg = reg_read(REG_PHY_LOCK_MASK_ADDR);
 751        reg |= ~REG_PHY_LOCK_MASK_MASK; /* [11:0] = FFF */
 752        dfs_reg_write(REG_PHY_LOCK_MASK_ADDR, reg);
 753
 754        DEBUG_DFS_C("DDR3 - DFS - High To Low - Ended successfuly - new Frequency - ",
 755                    freq, 1);
 756
 757        return MV_OK;
 758#endif
 759}
 760
 761/*
 762 * Name:     ddr3_dfs_low_2_high
 763 * Desc:
 764 * Args:     freq - target frequency
 765 * Notes:
 766 * Returns:  MV_OK - success, MV_FAIL - fail
 767 */
 768int ddr3_dfs_low_2_high(u32 freq, int ratio_2to1, MV_DRAM_INFO *dram_info)
 769{
 770#if defined(MV88F78X60) || defined(MV88F672X)
 771        /* This Flow is relevant for ArmadaXP A0 */
 772        u32 reg, freq_par, tmp;
 773        u32 cs = 0;
 774
 775        DEBUG_DFS_C("DDR3 - DFS - Low To High - Starting DFS procedure to Frequency - ",
 776                    freq, 1);
 777
 778        /* target frequency - freq */
 779        freq_par = ddr3_get_freq_parameter(freq, ratio_2to1);
 780
 781#if defined(MV88F672X)
 782        u32 hclk;
 783        u32 cpu_freq = ddr3_get_cpu_freq();
 784        get_target_freq(cpu_freq, &tmp, &hclk);
 785#endif
 786
 787        /* Configure - DRAM DLL final state after DFS is complete - Enable */
 788        reg = reg_read(REG_DFS_ADDR);
 789        /* [0] - DfsDllNextState - Enable */
 790        reg &= ~(1 << REG_DFS_DLLNEXTSTATE_OFFS);
 791        dfs_reg_write(REG_DFS_ADDR, reg);       /* 0x1528 - DFS register */
 792
 793        /*
 794         * Configure -  XBAR Retry response during Block to enable
 795         * internal access - Disable
 796         */
 797        reg = reg_read(REG_METAL_MASK_ADDR);
 798        /* [0] - RetryMask - Disable */
 799        reg &= ~(1 << REG_METAL_MASK_RETRY_OFFS);
 800        /* 0x14B0 - Dunit MMask Register */
 801        dfs_reg_write(REG_METAL_MASK_ADDR, reg);
 802
 803        /* Configure - Block new external transactions - Enable */
 804        reg = reg_read(REG_DFS_ADDR);
 805        reg |= (1 << REG_DFS_BLOCK_OFFS);       /* [1] - DfsBlock - Enable  */
 806        dfs_reg_write(REG_DFS_ADDR, reg);       /* 0x1528 - DFS register */
 807
 808        /* Configure - Move DRAM into Self Refresh */
 809        reg = reg_read(REG_DFS_ADDR);
 810        reg |= (1 << REG_DFS_SR_OFFS);  /* [2] - DfsSR - Enable */
 811        dfs_reg_write(REG_DFS_ADDR, reg);       /* 0x1528 - DFS register */
 812
 813        /* Poll - Wait for Self Refresh indication */
 814        do {
 815                reg = ((reg_read(REG_DFS_ADDR)) & (1 << REG_DFS_ATSR_OFFS));
 816        } while (reg == 0x0);   /* 0x1528 [3] - DfsAtSR - Wait for '1' */
 817
 818        /* Start of clock change procedure (PLL) */
 819#if defined(MV88F672X)
 820        /* avantaLP */
 821        /* Configure    cpupll_clkdiv_reset_mask */
 822        reg = reg_read(CPU_PLL_CLOCK_DIVIDER_CNTRL0);
 823        reg &= CPU_PLL_CLOCK_DIVIDER_CNTRL0_MASK;
 824        /* 0xE8264[7:0]   0xff CPU Clock Dividers Reset mask */
 825        dfs_reg_write(CPU_PLL_CLOCK_DIVIDER_CNTRL0, (reg + 0xFF));
 826
 827        /* Configure    cpu_clkdiv_reload_smooth    */
 828        reg = reg_read(CPU_PLL_CNTRL0);
 829        reg &= CPU_PLL_CNTRL0_RELOAD_SMOOTH_MASK;
 830        /* 0xE8260   [15:8]  0x2 CPU Clock Dividers Reload Smooth enable */
 831        dfs_reg_write(CPU_PLL_CNTRL0,
 832                      reg + (2 << CPU_PLL_CNTRL0_RELOAD_SMOOTH_OFFS));
 833
 834        /* Configure    cpupll_clkdiv_relax_en */
 835        reg = reg_read(CPU_PLL_CNTRL0);
 836        reg &= CPU_PLL_CNTRL0_RELAX_EN_MASK;
 837        /* 0xE8260 [31:24] 0x2 Relax Enable */
 838        dfs_reg_write(CPU_PLL_CNTRL0,
 839                      reg + (2 << CPU_PLL_CNTRL0_RELAX_EN_OFFS));
 840
 841        /* Configure    cpupll_clkdiv_ddr_clk_ratio */
 842        reg = reg_read(CPU_PLL_CLOCK_DIVIDER_CNTRL1);
 843        /*
 844         * 0xE8268  [13:8]  N   Set Training clock:
 845         * APLL Out Clock (VCO freq) / N = 100 MHz
 846         */
 847        reg &= CPU_PLL_CLOCK_DIVIDER_CNTRL1_MASK;
 848        reg |= (freq_par << 8); /* full Integer ratio from PLL-out to ddr-clk */
 849        dfs_reg_write(CPU_PLL_CLOCK_DIVIDER_CNTRL1, reg);
 850        /* Configure    cpupll_clkdiv_reload_ratio  */
 851        reg = reg_read(CPU_PLL_CLOCK_DIVIDER_CNTRL0);
 852        reg &= CPU_PLL_CLOCK_RELOAD_RATIO_MASK;
 853        /* 0xE8264 [8]=0x1 CPU Clock Dividers Reload Ratio trigger set */
 854        dfs_reg_write(CPU_PLL_CLOCK_DIVIDER_CNTRL0,
 855                      reg + (1 << CPU_PLL_CLOCK_RELOAD_RATIO_OFFS));
 856
 857        udelay(1);
 858
 859        /* Configure    cpupll_clkdiv_reload_ratio  */
 860        reg = reg_read(CPU_PLL_CLOCK_DIVIDER_CNTRL0);
 861        reg &= CPU_PLL_CLOCK_RELOAD_RATIO_MASK;
 862        /* 0xE8264 [8]=0x0 CPU Clock Dividers Reload Ratio trigger clear */
 863        dfs_reg_write(CPU_PLL_CLOCK_DIVIDER_CNTRL0, reg);
 864
 865        udelay(5);
 866
 867#else
 868        /*
 869         * Initial Setup - assure that the "load new ratio" is clear (bit 24)
 870         * and in the same chance, block reassertions of reset [15:8]
 871         * and force reserved bits[7:0].
 872         */
 873        reg = 0x0000FFFF;
 874
 875        /* 0x18700 - CPU Div CLK control 0 */
 876        dfs_reg_write(REG_CPU_DIV_CLK_CTRL_0_ADDR, reg);
 877
 878        /*
 879         * RelaX whenever reset is asserted to that channel (good for any case)
 880         */
 881        reg = 0x0000FF00;
 882        /* 0x18704 - CPU Div CLK control 0 */
 883        dfs_reg_write(REG_CPU_DIV_CLK_CTRL_1_ADDR, reg);
 884
 885        reg = reg_read(REG_CPU_DIV_CLK_CTRL_2_ADDR) &
 886                REG_CPU_DIV_CLK_CTRL_3_FREQ_MASK;
 887        reg |= (freq_par << REG_CPU_DIV_CLK_CTRL_3_FREQ_OFFS);
 888        /* full Integer ratio from PLL-out to ddr-clk */
 889        /* 0x1870C - CPU Div CLK control 3 register */
 890        dfs_reg_write(REG_CPU_DIV_CLK_CTRL_2_ADDR, reg);
 891
 892        /*
 893         * Shut off clock enable to the DDRPHY clock channel (this is the "D").
 894         * All the rest are kept as is (forced, but could be read-modify-write).
 895         * This is done now by RMW above.
 896         */
 897        reg = 0x000FFF02;
 898        dfs_reg_write(REG_CPU_DIV_CLK_CTRL_4_ADDR, reg);
 899
 900        /* Wait before replacing the clock on the DDR Phy Channel. */
 901        udelay(1);
 902
 903        reg = 0x0102FDFF;
 904        /*
 905         * This for triggering the frequency update. Bit[24] is the
 906         * central control
 907         * bits [23:16] == which channels to change ==2 ==> only DDR Phy
 908         *                 (smooth transition)
 909         * bits [15:8] == mask reset reassertion due to clock modification
 910         *                to these channels.
 911         * bits [7:0] == not in use
 912         */
 913        /* 0x18700 - CPU Div CLK control 0 register */
 914        dfs_reg_write(REG_CPU_DIV_CLK_CTRL_0_ADDR, reg);
 915
 916        udelay(1);
 917
 918        /*
 919         * Poll Div CLK status 0 register - indication that the clocks
 920         * are active - 0x18718 [8]
 921         */
 922        do {
 923                reg = reg_read(REG_CPU_DIV_CLK_STATUS_0_ADDR) &
 924                        (1 << REG_CPU_DIV_CLK_ALL_STABLE_OFFS);
 925        } while (reg == 0);
 926
 927        reg = 0x000000FF;
 928        /*
 929         * Clean the CTRL0, to be ready for next resets and next requests
 930         * of ratio modifications.
 931         */
 932        /* 0x18700 - CPU Div CLK control 0 register */
 933        dfs_reg_write(REG_CPU_DIV_CLK_CTRL_0_ADDR, reg);
 934#endif
 935        /* End of clock change procedure (PLL) */
 936
 937        if (ratio_2to1) {
 938                /* Configure - Select normal clock for the DDR PHY - Disable */
 939                reg = reg_read(REG_DRAM_INIT_CTRL_STATUS_ADDR);
 940                /* [16] - ddr_phy_trn_clk_sel - Disable  */
 941                reg &= ~(1 << REG_DRAM_INIT_CTRL_TRN_CLK_OFFS);
 942                /* 0x18488 - DRAM Init control status register */
 943                dfs_reg_write(REG_DRAM_INIT_CTRL_STATUS_ADDR, reg);
 944        }
 945
 946        /*
 947         * Configure - Set Correct Ratio - according to target ratio
 948         * parameter - 2:1/1:1
 949         */
 950        if (ratio_2to1) {
 951                /*
 952                 * [15] - Phy2UnitClkRatio = 1 - Set 2:1 Ratio between
 953                 * Dunit and Phy
 954                 */
 955                reg = reg_read(REG_DDR_IO_ADDR) |
 956                        (1 << REG_DDR_IO_CLK_RATIO_OFFS);
 957        } else {
 958                /*
 959                 * [15] - Phy2UnitClkRatio = 0 - Set 1:1 Ratio between
 960                 * Dunit and Phy
 961                 */
 962                reg = reg_read(REG_DDR_IO_ADDR) &
 963                        ~(1 << REG_DDR_IO_CLK_RATIO_OFFS);
 964        }
 965        dfs_reg_write(REG_DDR_IO_ADDR, reg);    /* 0x1524 - DDR IO Register */
 966
 967        /* Configure - 2T Mode - Restore original configuration */
 968        reg = reg_read(REG_DUNIT_CTRL_LOW_ADDR);
 969        /* [3:4] 2T - Restore value */
 970        reg &= ~(REG_DUNIT_CTRL_LOW_2T_MASK << REG_DUNIT_CTRL_LOW_2T_OFFS);
 971        reg |= ((dram_info->mode_2t & REG_DUNIT_CTRL_LOW_2T_MASK) <<
 972                REG_DUNIT_CTRL_LOW_2T_OFFS);
 973        /* 0x1404 - DDR Controller Control Low Register */
 974        dfs_reg_write(REG_DUNIT_CTRL_LOW_ADDR, reg);
 975
 976        /* Configure - Restore CL and CWL - MRS Commands */
 977        reg = reg_read(REG_DFS_ADDR);
 978        reg &= ~(REG_DFS_CL_NEXT_STATE_MASK << REG_DFS_CL_NEXT_STATE_OFFS);
 979        reg &= ~(REG_DFS_CWL_NEXT_STATE_MASK << REG_DFS_CWL_NEXT_STATE_OFFS);
 980
 981        if (freq == DDR_400) {
 982                if (dram_info->target_frequency == 0x8)
 983                        tmp = ddr3_cl_to_valid_cl(5);
 984                else
 985                        tmp = ddr3_cl_to_valid_cl(6);
 986        } else {
 987                tmp = ddr3_cl_to_valid_cl(dram_info->cl);
 988        }
 989
 990        /* [8] - DfsCLNextState */
 991        reg |= ((tmp & REG_DFS_CL_NEXT_STATE_MASK) << REG_DFS_CL_NEXT_STATE_OFFS);
 992        if (freq == DDR_400) {
 993                /* [12] - DfsCWLNextState */
 994                reg |= (((0) & REG_DFS_CWL_NEXT_STATE_MASK) <<
 995                        REG_DFS_CWL_NEXT_STATE_OFFS);
 996        } else {
 997                /* [12] - DfsCWLNextState */
 998                reg |= (((dram_info->cwl) & REG_DFS_CWL_NEXT_STATE_MASK) <<
 999                        REG_DFS_CWL_NEXT_STATE_OFFS);
1000        }
1001        dfs_reg_write(REG_DFS_ADDR, reg);       /* 0x1528 - DFS register */
1002
1003        /* Optional - Configure - DDR3_Rtt_nom_CS# */
1004        for (cs = 0; cs < MAX_CS; cs++) {
1005                if (dram_info->cs_ena & (1 << cs)) {
1006                        reg = reg_read(REG_DDR3_MR1_CS_ADDR +
1007                                       (cs << MR_CS_ADDR_OFFS));
1008                        reg &= REG_DDR3_MR1_RTT_MASK;
1009                        reg |= odt_static[dram_info->cs_ena][cs];
1010                        dfs_reg_write(REG_DDR3_MR1_CS_ADDR +
1011                                      (cs << MR_CS_ADDR_OFFS), reg);
1012                }
1013        }
1014
1015        /* Configure - Reset ADLLs - Set Reset */
1016        reg = reg_read(REG_DRAM_PHY_CONFIG_ADDR) & REG_DRAM_PHY_CONFIG_MASK;
1017        /* [31:30]] - reset pup data ctrl ADLL */
1018        /* 0x15EC - DRAM PHY Config Register */
1019        dfs_reg_write(REG_DRAM_PHY_CONFIG_ADDR, reg);
1020
1021        /* Configure - Reset ADLLs - Release Reset */
1022        reg = reg_read(REG_DRAM_PHY_CONFIG_ADDR) | ~REG_DRAM_PHY_CONFIG_MASK;
1023        /* [31:30] - normal pup data ctrl ADLL */
1024        /* 0x15EC - DRAM PHY Config register */
1025        dfs_reg_write(REG_DRAM_PHY_CONFIG_ADDR, reg);
1026
1027        /* Poll - Wait for APLL + ADLLs lock on new frequency */
1028        do {
1029                reg = reg_read(REG_PHY_LOCK_STATUS_ADDR) &
1030                        REG_PHY_LOCK_APLL_ADLL_STATUS_MASK;
1031                /* 0x1674 [10:0] - Phy lock status Register */
1032        } while (reg != REG_PHY_LOCK_APLL_ADLL_STATUS_MASK);
1033
1034        /* Configure - Reset the PHY SDR clock divider */
1035        if (ratio_2to1) {
1036                /* Pup Reset Divider B - Set Reset */
1037                /* [28] - DataPupRdRST = 0 */
1038                reg = reg_read(REG_SDRAM_CONFIG_ADDR) &
1039                        ~(1 << REG_SDRAM_CONFIG_PUPRSTDIV_OFFS);
1040                /* [28] - DataPupRdRST = 1 */
1041                tmp = reg_read(REG_SDRAM_CONFIG_ADDR) |
1042                        (1 << REG_SDRAM_CONFIG_PUPRSTDIV_OFFS);
1043                /* 0x1400 - SDRAM Configuration register */
1044                dfs_reg_write(REG_SDRAM_CONFIG_ADDR, reg);
1045
1046                /* Pup Reset Divider B - Release Reset */
1047                /* 0x1400 - SDRAM Configuration register */
1048                dfs_reg_write(REG_SDRAM_CONFIG_ADDR, tmp);
1049        }
1050
1051        /* Configure - Reset the PHY Read FIFO and Write channels - Set Reset */
1052        reg = reg_read(REG_SDRAM_CONFIG_ADDR) & REG_SDRAM_CONFIG_MASK;
1053        /* [30:29] = 0 - Data Pup R/W path reset */
1054        /* 0x1400 - SDRAM Configuration register */
1055        dfs_reg_write(REG_SDRAM_CONFIG_ADDR, reg);
1056
1057        /*
1058         * Configure - DRAM Data PHY Read [30], Write [29] path reset -
1059         * Release Reset
1060         */
1061        reg = reg_read(REG_SDRAM_CONFIG_ADDR) | ~REG_SDRAM_CONFIG_MASK;
1062        /* [30:29] = '11' - Data Pup R/W path reset */
1063        /* 0x1400 - SDRAM Configuration register */
1064        dfs_reg_write(REG_SDRAM_CONFIG_ADDR, reg);
1065
1066        /* Registered DIMM support */
1067        if (dram_info->reg_dimm) {
1068                /*
1069                 * Configure - Change register DRAM operating speed
1070                 * (DDR3-1333 / DDR3-1600) - CWA_RC
1071                 */
1072                reg = (0xA & REG_SDRAM_OPERATION_CWA_RC_MASK) <<
1073                        REG_SDRAM_OPERATION_CWA_RC_OFFS;
1074                if (freq <= DDR_400) {
1075                        /*
1076                         * Configure - Change register DRAM operating speed
1077                         * (DDR3-800) - CWA_DATA
1078                         */
1079                        reg |= ((0x0 & REG_SDRAM_OPERATION_CWA_DATA_MASK) <<
1080                                REG_SDRAM_OPERATION_CWA_DATA_OFFS);
1081                } else if ((freq > DDR_400) && (freq <= DDR_533)) {
1082                        /*
1083                         * Configure - Change register DRAM operating speed
1084                         * (DDR3-1066) - CWA_DATA
1085                         */
1086                        reg |= ((0x1 & REG_SDRAM_OPERATION_CWA_DATA_MASK) <<
1087                                REG_SDRAM_OPERATION_CWA_DATA_OFFS);
1088                } else if ((freq > DDR_533) && (freq <= DDR_666)) {
1089                        /*
1090                         * Configure - Change register DRAM operating speed
1091                         * (DDR3-1333) - CWA_DATA
1092                         */
1093                        reg |= ((0x2 & REG_SDRAM_OPERATION_CWA_DATA_MASK) <<
1094                                REG_SDRAM_OPERATION_CWA_DATA_OFFS);
1095                } else {
1096                        /*
1097                         * Configure - Change register DRAM operating speed
1098                         * (DDR3-1600) - CWA_DATA
1099                         */
1100                        reg |= ((0x3 & REG_SDRAM_OPERATION_CWA_DATA_MASK) <<
1101                                REG_SDRAM_OPERATION_CWA_DATA_OFFS);
1102                }
1103
1104                /* Configure - Set Delay - tSTAB */
1105                reg |= (0x1 << REG_SDRAM_OPERATION_CWA_DELAY_SEL_OFFS);
1106                /* Configure - Issue CWA command with the above parameters */
1107                reg |= (REG_SDRAM_OPERATION_CMD_CWA &
1108                        ~(0xF << REG_SDRAM_OPERATION_CS_OFFS));
1109
1110                /* 0x1418 - SDRAM Operation Register */
1111                dfs_reg_write(REG_SDRAM_OPERATION_ADDR, reg);
1112
1113                /* Poll - Wait for CWA operation completion */
1114                do {
1115                        reg = reg_read(REG_SDRAM_OPERATION_ADDR) &
1116                                REG_SDRAM_OPERATION_CMD_MASK;
1117                } while (reg);
1118        }
1119
1120        /* Configure - Exit Self Refresh */
1121        /* [2] - DfsSR  */
1122        reg = reg_read(REG_DFS_ADDR) & ~(1 << REG_DFS_SR_OFFS);
1123        dfs_reg_write(REG_DFS_ADDR, reg);       /* 0x1528 - DFS register */
1124
1125        /*
1126         * Poll - DFS Register - 0x1528 [3] - DfsAtSR - All DRAM
1127         * devices on all ranks are NOT in self refresh mode
1128         */
1129        do {
1130                reg = reg_read(REG_DFS_ADDR) & (1 << REG_DFS_ATSR_OFFS);
1131        } while (reg);          /* Wait for '0' */
1132
1133        /* Configure - Issue Refresh command */
1134        /* [3-0] = 0x2 - Refresh Command, [11-8] - enabled Cs */
1135        reg = REG_SDRAM_OPERATION_CMD_RFRS;
1136        for (cs = 0; cs < MAX_CS; cs++) {
1137                if (dram_info->cs_ena & (1 << cs))
1138                        reg &= ~(1 << (REG_SDRAM_OPERATION_CS_OFFS + cs));
1139        }
1140
1141        /* 0x1418 - SDRAM Operation Register */
1142        dfs_reg_write(REG_SDRAM_OPERATION_ADDR, reg);
1143
1144        /* Poll - Wait for Refresh operation completion */
1145        wait_refresh_op_complete();
1146
1147        /* Configure - Block new external transactions - Disable */
1148        reg = reg_read(REG_DFS_ADDR);
1149        reg &= ~(1 << REG_DFS_BLOCK_OFFS);      /* [1] - DfsBlock - Disable  */
1150        dfs_reg_write(REG_DFS_ADDR, reg);       /* 0x1528 - DFS register */
1151
1152        /*
1153         * Configure -  XBAR Retry response during Block to enable
1154         * internal access - Disable
1155         */
1156        reg = reg_read(REG_METAL_MASK_ADDR);
1157        /* [0] - RetryMask - Enable */
1158        reg |= (1 << REG_METAL_MASK_RETRY_OFFS);
1159        /* 0x14B0 - Dunit MMask Register */
1160        dfs_reg_write(REG_METAL_MASK_ADDR, reg);
1161
1162        for (cs = 0; cs < MAX_CS; cs++) {
1163                if (dram_info->cs_ena & (1 << cs)) {
1164                        /* Configure - Set CL */
1165                        reg = reg_read(REG_DDR3_MR0_CS_ADDR +
1166                                       (cs << MR_CS_ADDR_OFFS)) &
1167                                ~REG_DDR3_MR0_CL_MASK;
1168                        if (freq == DDR_400)
1169                                tmp = ddr3_cl_to_valid_cl(6);
1170                        else
1171                                tmp = ddr3_cl_to_valid_cl(dram_info->cl);
1172                        reg |= ((tmp & 0x1) << REG_DDR3_MR0_CL_OFFS);
1173                        reg |= ((tmp & 0xE) << REG_DDR3_MR0_CL_HIGH_OFFS);
1174                        dfs_reg_write(REG_DDR3_MR0_CS_ADDR +
1175                                      (cs << MR_CS_ADDR_OFFS), reg);
1176
1177                        /* Configure - Set CWL */
1178                        reg = reg_read(REG_DDR3_MR2_CS_ADDR +
1179                                       (cs << MR_CS_ADDR_OFFS)) &
1180                                ~(REG_DDR3_MR2_CWL_MASK << REG_DDR3_MR2_CWL_OFFS);
1181                        if (freq == DDR_400)
1182                                reg |= ((0) << REG_DDR3_MR2_CWL_OFFS);
1183                        else
1184                                reg |= ((dram_info->cwl) << REG_DDR3_MR2_CWL_OFFS);
1185                        dfs_reg_write(REG_DDR3_MR2_CS_ADDR +
1186                                      (cs << MR_CS_ADDR_OFFS), reg);
1187                }
1188        }
1189
1190        DEBUG_DFS_C("DDR3 - DFS - Low To High - Ended successfuly - new Frequency - ",
1191                    freq, 1);
1192
1193        return MV_OK;
1194
1195#else
1196
1197        /* This Flow is relevant for Armada370 A0 and ArmadaXP Z1 */
1198
1199        u32 reg, freq_par, tmp;
1200        u32 cs = 0;
1201
1202        DEBUG_DFS_C("DDR3 - DFS - Low To High - Starting DFS procedure to Frequency - ",
1203                    freq, 1);
1204
1205        /* target frequency - freq */
1206        freq_par = ddr3_get_freq_parameter(freq, ratio_2to1);
1207
1208        reg = 0x0000FF00;
1209        dfs_reg_write(REG_CPU_DIV_CLK_CTRL_1_ADDR, reg);
1210
1211        /* 0x1600 - PHY lock mask register */
1212        reg = reg_read(REG_ODPG_CNTRL_ADDR);
1213        reg |= (1 << REG_ODPG_CNTRL_OFFS);      /* [21] = 1 */
1214        dfs_reg_write(REG_ODPG_CNTRL_ADDR, reg);
1215
1216        /* 0x1670 - PHY lock mask register */
1217        reg = reg_read(REG_PHY_LOCK_MASK_ADDR);
1218        reg &= REG_PHY_LOCK_MASK_MASK;  /* [11:0] = 0 */
1219        dfs_reg_write(REG_PHY_LOCK_MASK_ADDR, reg);
1220
1221        /* Enable reconfig MR Registers after DFS */
1222        reg = reg_read(REG_DFS_ADDR);   /* 0x1528 - DFS register */
1223        /* [4] - Disable - reconfig MR registers after DFS_ERG */
1224        reg &= ~0x11;
1225        /* [0] - Enable - DRAM DLL after DFS */
1226        dfs_reg_write(REG_DFS_ADDR, reg);       /* 0x1528 - DFS register */
1227
1228        /* Disable DRAM Controller to crossbar retry */
1229        /* [0] - disable */
1230        reg = reg_read(REG_METAL_MASK_ADDR) & ~(1 << 0);
1231        /* 0x14B0 - Dunit MMask Register */
1232        dfs_reg_write(REG_METAL_MASK_ADDR, reg);
1233
1234        /* Enable DRAM Blocking */
1235        /* [1] - DFS Block enable  */
1236        reg = reg_read(REG_DFS_ADDR) | (1 << REG_DFS_BLOCK_OFFS);
1237        dfs_reg_write(REG_DFS_ADDR, reg);       /* 0x1528 - DFS register */
1238
1239        /* Enable Self refresh */
1240        /* [2] - DFS Self refresh enable  */
1241        reg = reg_read(REG_DFS_ADDR) | (1 << REG_DFS_SR_OFFS);
1242        dfs_reg_write(REG_DFS_ADDR, reg);       /* 0x1528 - DFS register */
1243
1244        /*
1245         * Poll DFS Register - All DRAM devices on all ranks are in
1246         * self refresh mode - DFS can be executed afterwards
1247         */
1248        /* 0x1528 [3] - DfsAtSR  */
1249        do {
1250                reg = reg_read(REG_DFS_ADDR) & (1 << REG_DFS_ATSR_OFFS);
1251        } while (reg == 0x0);   /* Wait for '1' */
1252
1253        /*
1254         * Set Correct Ratio - if freq>MARGIN_FREQ use 2:1 ratio
1255         * else use 1:1 ratio
1256         */
1257        if (ratio_2to1) {
1258                /* [15] = 1 - Set 2:1 Ratio between Dunit and Phy */
1259                reg = reg_read(REG_DDR_IO_ADDR) |
1260                        (1 << REG_DDR_IO_CLK_RATIO_OFFS);
1261        } else {
1262                /* [15] = 0 - Set 1:1 Ratio between Dunit and Phy */
1263                reg = reg_read(REG_DDR_IO_ADDR) &
1264                        ~(1 << REG_DDR_IO_CLK_RATIO_OFFS);
1265        }
1266        dfs_reg_write(REG_DDR_IO_ADDR, reg);    /* 0x1524 - DDR IO Register */
1267
1268        /* Switch HCLK Mux from (100Mhz) [16]=0, keep DFS request bit */
1269        reg = 0x20040000;
1270        /*
1271         * [29] - training logic request DFS, [28:27] -
1272         * preload patterns frequency [18]
1273         */
1274
1275        /* 0x18488 - DRAM Init control status register */
1276        dfs_reg_write(REG_DRAM_INIT_CTRL_STATUS_ADDR, reg);
1277
1278        /* Add delay between entering SR and start ratio modification */
1279        udelay(1);
1280
1281        /*
1282         * Initial Setup - assure that the "load new ratio" is clear (bit 24)
1283         * and in the same chance, block reassertions of reset [15:8] and
1284         * force reserved bits[7:0].
1285         */
1286        reg = 0x0000FFFF;
1287        /* 0x18700 - CPU Div CLK control 0 */
1288        dfs_reg_write(REG_CPU_DIV_CLK_CTRL_0_ADDR, reg);
1289
1290        /*
1291         * RelaX whenever reset is asserted to that channel (good for any case)
1292         */
1293        reg = 0x0000FF00;
1294        /* 0x18704 - CPU Div CLK control 0 */
1295        dfs_reg_write(REG_CPU_DIV_CLK_CTRL_1_ADDR, reg);
1296
1297        reg = reg_read(REG_CPU_DIV_CLK_CTRL_3_ADDR) &
1298                REG_CPU_DIV_CLK_CTRL_3_FREQ_MASK;
1299        reg |= (freq_par << REG_CPU_DIV_CLK_CTRL_3_FREQ_OFFS);
1300        /* Full Integer ratio from PLL-out to ddr-clk */
1301        /* 0x1870C - CPU Div CLK control 3 register */
1302        dfs_reg_write(REG_CPU_DIV_CLK_CTRL_3_ADDR, reg);
1303
1304        /*
1305         * Shut off clock enable to the DDRPHY clock channel (this is the "D").
1306         * All the rest are kept as is (forced, but could be read-modify-write).
1307         * This is done now by RMW above.
1308         */
1309
1310        reg = 0x000FFF02;
1311
1312        dfs_reg_write(REG_CPU_DIV_CLK_CTRL_4_ADDR, reg);
1313
1314        /* Wait before replacing the clock on the DDR Phy Channel. */
1315        udelay(1);
1316
1317        reg = 0x0102FDFF;
1318        /*
1319         * This for triggering the frequency update. Bit[24] is the
1320         * central control
1321         * bits [23:16] == which channels to change ==2 ==> only DDR Phy
1322         *                 (smooth transition)
1323         * bits [15:8] == mask reset reassertion due to clock modification
1324         *                to these channels.
1325         * bits [7:0] == not in use
1326         */
1327        /* 0x18700 - CPU Div CLK control 0 register */
1328        dfs_reg_write(REG_CPU_DIV_CLK_CTRL_0_ADDR, reg);
1329
1330        udelay(1);
1331
1332        /*
1333         * Poll Div CLK status 0 register - indication that the clocks are
1334         * active - 0x18718 [8]
1335         */
1336        do {
1337                reg = reg_read(REG_CPU_DIV_CLK_STATUS_0_ADDR) &
1338                        (1 << REG_CPU_DIV_CLK_ALL_STABLE_OFFS);
1339        } while (reg == 0);
1340
1341        reg = 0x000000FF;
1342        /*
1343         * Clean the CTRL0, to be ready for next resets and next requests of
1344         * ratio modifications.
1345         */
1346        /* 0x18700 - CPU Div CLK control 0 register */
1347        dfs_reg_write(REG_CPU_DIV_CLK_CTRL_0_ADDR, reg);
1348
1349        udelay(5);
1350
1351        if (ratio_2to1) {
1352                /* Pup Reset Divider B - Set Reset */
1353                /* [28] = 0 - Pup Reset Divider B */
1354                reg = reg_read(REG_SDRAM_CONFIG_ADDR) & ~(1 << 28);
1355                /* [28] = 1 - Pup Reset Divider B */
1356                tmp = reg_read(REG_SDRAM_CONFIG_ADDR) | (1 << 28);
1357                /* 0x1400 - SDRAM Configuration register */
1358                dfs_reg_write(REG_SDRAM_CONFIG_ADDR, reg);
1359
1360                /* Pup Reset Divider B - Release Reset */
1361                /* 0x1400 - SDRAM Configuration register */
1362                dfs_reg_write(REG_SDRAM_CONFIG_ADDR, tmp);
1363        }
1364
1365        /* DRAM Data PHYs ADLL Reset - Set Reset */
1366        reg = (reg_read(REG_DRAM_PHY_CONFIG_ADDR) & REG_DRAM_PHY_CONFIG_MASK);
1367        /* [31:30]] - reset pup data ctrl ADLL */
1368        /* 0x15EC - DRAM PHY Config Register */
1369        dfs_reg_write(REG_DRAM_PHY_CONFIG_ADDR, reg);
1370
1371        udelay(25);
1372
1373        /* APLL lock indication - Poll Phy lock status Register - 0x1674 [9] */
1374        do {
1375                reg = reg_read(REG_PHY_LOCK_STATUS_ADDR) &
1376                        (1 << REG_PHY_LOCK_STATUS_LOCK_OFFS);
1377        } while (reg == 0);
1378
1379        /* DRAM Data PHYs ADLL Reset - Release Reset */
1380        reg = reg_read(REG_DRAM_PHY_CONFIG_ADDR) | ~REG_DRAM_PHY_CONFIG_MASK;
1381        /* [31:30] - normal pup data ctrl ADLL */
1382        /* 0x15EC - DRAM PHY Config register */
1383        dfs_reg_write(REG_DRAM_PHY_CONFIG_ADDR, reg);
1384
1385        udelay(10000);          /* Wait 10msec */
1386
1387        /*
1388         * APLL lock indication - Poll Phy lock status Register - 0x1674 [11:0]
1389         */
1390        do {
1391                reg = reg_read(REG_PHY_LOCK_STATUS_ADDR) &
1392                        REG_PHY_LOCK_STATUS_LOCK_MASK;
1393        } while (reg != REG_PHY_LOCK_STATUS_LOCK_MASK);
1394
1395        /* DRAM Data PHY Read [30], Write [29] path reset - Set Reset */
1396        reg = reg_read(REG_SDRAM_CONFIG_ADDR) & REG_SDRAM_CONFIG_MASK;
1397        /* [30:29] = 0 - Data Pup R/W path reset */
1398        /* 0x1400 - SDRAM Configuration register */
1399        dfs_reg_write(REG_SDRAM_CONFIG_ADDR, reg);
1400
1401        /* DRAM Data PHY Read [30], Write [29] path reset - Release Reset */
1402        reg = reg_read(REG_SDRAM_CONFIG_ADDR) | ~REG_SDRAM_CONFIG_MASK;
1403        /* [30:29] = '11' - Data Pup R/W path reset */
1404        /* 0x1400 - SDRAM Configuration register */
1405        dfs_reg_write(REG_SDRAM_CONFIG_ADDR, reg);
1406
1407        /* Disable DFS Reconfig */
1408        reg = reg_read(REG_DFS_ADDR) & ~(1 << 4);
1409        dfs_reg_write(REG_DFS_ADDR, reg);       /* 0x1528 - DFS register */
1410
1411        /* [2] - DFS Self refresh disable  */
1412        reg = reg_read(REG_DFS_ADDR) & ~(1 << REG_DFS_SR_OFFS);
1413        dfs_reg_write(REG_DFS_ADDR, reg);       /* 0x1528 - DFS register */
1414
1415        /*
1416         * Poll DFS Register - 0x1528 [3] - DfsAtSR - All DRAM devices on
1417         * all ranks are NOT in self refresh mode
1418         */
1419        do {
1420                reg = reg_read(REG_DFS_ADDR) & (1 << REG_DFS_ATSR_OFFS);
1421        } while (reg);          /* Wait for '0' */
1422
1423        /* 0x1404 */
1424        reg = (reg_read(REG_DUNIT_CTRL_LOW_ADDR) & 0xFFFFFFE7) | 0x2;
1425
1426        /* Configure - 2T Mode - Restore original configuration */
1427        /* [3:4] 2T - Restore value */
1428        reg &= ~(REG_DUNIT_CTRL_LOW_2T_MASK << REG_DUNIT_CTRL_LOW_2T_OFFS);
1429        reg |= ((dram_info->mode_2t & REG_DUNIT_CTRL_LOW_2T_MASK) <<
1430                REG_DUNIT_CTRL_LOW_2T_OFFS);
1431        dfs_reg_write(REG_DUNIT_CTRL_LOW_ADDR, reg);
1432
1433        udelay(1);              /* Wait 1us */
1434
1435        for (cs = 0; cs < MAX_CS; cs++) {
1436                if (dram_info->cs_ena & (1 << cs)) {
1437                        reg = (reg_read(REG_DDR3_MR1_ADDR));
1438                        /* DLL Enable */
1439                        reg &= ~(1 << REG_DDR3_MR1_DLL_ENA_OFFS);
1440                        dfs_reg_write(REG_DDR3_MR1_ADDR, reg);
1441
1442                        /* Issue MRS Command to current cs */
1443                        reg = REG_SDRAM_OPERATION_CMD_MR1 &
1444                                ~(1 << (REG_SDRAM_OPERATION_CS_OFFS + cs));
1445                        /*
1446                         * [3-0] = 0x4 - MR1 Command, [11-8] -
1447                         * enable current cs
1448                         */
1449                        /* 0x1418 - SDRAM Operation Register */
1450                        dfs_reg_write(REG_SDRAM_OPERATION_ADDR, reg);
1451
1452                        /* Poll - Wait for Refresh operation completion */
1453                        wait_refresh_op_complete();
1454
1455                        /* DLL Reset - MR0 */
1456                        reg = reg_read(REG_DDR3_MR0_ADDR);
1457                        dfs_reg_write(REG_DDR3_MR0_ADDR, reg);
1458
1459                        /* Issue MRS Command to current cs */
1460                        reg = REG_SDRAM_OPERATION_CMD_MR0 &
1461                                ~(1 << (REG_SDRAM_OPERATION_CS_OFFS + cs));
1462                        /*
1463                         * [3-0] = 0x4 - MR1 Command, [11-8] -
1464                         * enable current cs
1465                         */
1466                        /* 0x1418 - SDRAM Operation Register */
1467                        dfs_reg_write(REG_SDRAM_OPERATION_ADDR, reg);
1468
1469                        /* Poll - Wait for Refresh operation completion */
1470                        wait_refresh_op_complete();
1471
1472                        reg = reg_read(REG_DDR3_MR0_ADDR);
1473                        reg &= ~0x74;   /* CL [3:0]; [6:4],[2] */
1474
1475                        if (freq == DDR_400)
1476                                tmp = ddr3_cl_to_valid_cl(6) & 0xF;
1477                        else
1478                                tmp = ddr3_cl_to_valid_cl(dram_info->cl) & 0xF;
1479
1480                        reg |= ((tmp & 0x1) << 2);
1481                        reg |= ((tmp >> 1) << 4);       /* to bit 4 */
1482                        dfs_reg_write(REG_DDR3_MR0_ADDR, reg);
1483
1484                        reg = REG_SDRAM_OPERATION_CMD_MR0 &
1485                                ~(1 << (REG_SDRAM_OPERATION_CS_OFFS + cs));
1486                        /* 0x1418 - SDRAM Operation Register */
1487                        dfs_reg_write(REG_SDRAM_OPERATION_ADDR, reg);
1488
1489                        /* Poll - Wait for Refresh operation completion */
1490                        wait_refresh_op_complete();
1491
1492                        reg = reg_read(REG_DDR3_MR2_ADDR);
1493                        reg &= ~0x38;   /* CWL [5:3] */
1494                        /* CWL = 0 ,for 400 MHg is 5 */
1495                        if (freq != DDR_400)
1496                                reg |= dram_info->cwl << REG_DDR3_MR2_CWL_OFFS;
1497                        dfs_reg_write(REG_DDR3_MR2_ADDR, reg);
1498                        reg = REG_SDRAM_OPERATION_CMD_MR2 &
1499                                ~(1 << (REG_SDRAM_OPERATION_CS_OFFS + cs));
1500                        /* 0x1418 - SDRAM Operation Register */
1501                        dfs_reg_write(REG_SDRAM_OPERATION_ADDR, reg);
1502
1503                        /* Poll - Wait for Refresh operation completion */
1504                        wait_refresh_op_complete();
1505
1506                        /* Set current rd_sample_delay  */
1507                        reg = reg_read(REG_READ_DATA_SAMPLE_DELAYS_ADDR);
1508                        reg &= ~(REG_READ_DATA_SAMPLE_DELAYS_MASK <<
1509                                 (REG_READ_DATA_SAMPLE_DELAYS_OFFS * cs));
1510                        reg |= (dram_info->cl <<
1511                                (REG_READ_DATA_SAMPLE_DELAYS_OFFS * cs));
1512                        dfs_reg_write(REG_READ_DATA_SAMPLE_DELAYS_ADDR, reg);
1513
1514                        /* Set current rd_ready_delay  */
1515                        reg = reg_read(REG_READ_DATA_READY_DELAYS_ADDR);
1516                        reg &= ~(REG_READ_DATA_READY_DELAYS_MASK <<
1517                                 (REG_READ_DATA_READY_DELAYS_OFFS * cs));
1518                        reg |= ((dram_info->cl + 1) <<
1519                                (REG_READ_DATA_SAMPLE_DELAYS_OFFS * cs));
1520                        dfs_reg_write(REG_READ_DATA_READY_DELAYS_ADDR, reg);
1521                }
1522        }
1523
1524        /* Enable ODT on DLL-on mode */
1525        dfs_reg_write(REG_SDRAM_ODT_CTRL_HIGH_ADDR, 0);
1526
1527        /* [1] - DFS Block disable  */
1528        reg = reg_read(REG_DFS_ADDR) & ~(1 << REG_DFS_BLOCK_OFFS);
1529        dfs_reg_write(REG_DFS_ADDR, reg);       /* 0x1528 - DFS register */
1530
1531        /* Change DDR frequency to 100MHz procedure: */
1532        /* 0x1600 - PHY lock mask register */
1533        reg = reg_read(REG_ODPG_CNTRL_ADDR);
1534        reg &= ~(1 << REG_ODPG_CNTRL_OFFS);     /* [21] = 0 */
1535        dfs_reg_write(REG_ODPG_CNTRL_ADDR, reg);
1536
1537        /* Change DDR frequency to 100MHz procedure: */
1538        /* 0x1670 - PHY lock mask register */
1539        reg = reg_read(REG_PHY_LOCK_MASK_ADDR);
1540        reg |= ~REG_PHY_LOCK_MASK_MASK; /* [11:0] = FFF */
1541        dfs_reg_write(REG_PHY_LOCK_MASK_ADDR, reg);
1542
1543        reg = reg_read(REG_METAL_MASK_ADDR) | (1 << 0); /* [0] - disable */
1544        /* 0x14B0 - Dunit MMask Register */
1545        dfs_reg_write(REG_METAL_MASK_ADDR, reg);
1546
1547        DEBUG_DFS_C("DDR3 - DFS - Low To High - Ended successfuly - new Frequency - ",
1548                    freq, 1);
1549        return MV_OK;
1550#endif
1551}
1552