ba899592f88a46a8c7d5af920cd8ee3b2ef46bfc
[oweals/u-boot.git] / drivers / ddr / marvell / axp / ddr3_dfs.c
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 }