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) 40 extern u8 div_ratio[CLK_VCO][CLK_DDR]; 41 extern void get_target_freq(u32 freq_mode, u32 *ddr_freq, u32 *hclk_ps); 42 #else 43 extern u16 odt_dynamic[ODT_OPT][MAX_CS]; 44 extern u8 div_ratio1to1[CLK_CPU][CLK_DDR]; 45 extern u8 div_ratio2to1[CLK_CPU][CLK_DDR]; 46 #endif 47 extern u16 odt_static[ODT_OPT][MAX_CS]; 48 49 extern u32 cpu_fab_clk_to_hclk[FAB_OPT][CLK_CPU]; 50 51 extern u32 ddr3_get_vco_freq(void); 52 53 u32 ddr3_get_freq_parameter(u32 target_freq, int ratio_2to1); 54 55 #ifdef MV_DEBUG_DFS 56 static 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 62 static inline void dfs_reg_write(u32 addr, u32 val) 63 { 64 writel(val, INTER_REGS_BASE + addr); 65 } 66 #endif 67 68 static 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 */ 86 u32 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 */ 112 int 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 */ 768 int 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