arm: mach-k3: Enable dcache in SPL
[oweals/u-boot.git] / drivers / ddr / marvell / axp / ddr3_hw_training.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_init.h"
14 #include "ddr3_hw_training.h"
15 #include "xor.h"
16
17 #ifdef MV88F78X60
18 #include "ddr3_patterns_64bit.h"
19 #else
20 #include "ddr3_patterns_16bit.h"
21 #if defined(MV88F672X)
22 #include "ddr3_patterns_16bit.h"
23 #endif
24 #endif
25
26 /*
27  * Debug
28  */
29
30 #define DEBUG_MAIN_C(s, d, l) \
31         DEBUG_MAIN_S(s); DEBUG_MAIN_D(d, l); DEBUG_MAIN_S("\n")
32 #define DEBUG_MAIN_FULL_C(s, d, l) \
33         DEBUG_MAIN_FULL_S(s); DEBUG_MAIN_FULL_D(d, l); DEBUG_MAIN_FULL_S("\n")
34
35 #ifdef MV_DEBUG_MAIN
36 #define DEBUG_MAIN_S(s)                 puts(s)
37 #define DEBUG_MAIN_D(d, l)              printf("%x", d)
38 #else
39 #define DEBUG_MAIN_S(s)
40 #define DEBUG_MAIN_D(d, l)
41 #endif
42
43 #ifdef MV_DEBUG_MAIN_FULL
44 #define DEBUG_MAIN_FULL_S(s)            puts(s)
45 #define DEBUG_MAIN_FULL_D(d, l)         printf("%x", d)
46 #else
47 #define DEBUG_MAIN_FULL_S(s)
48 #define DEBUG_MAIN_FULL_D(d, l)
49 #endif
50
51 #ifdef MV_DEBUG_SUSPEND_RESUME
52 #define DEBUG_SUSPEND_RESUME_S(s)       puts(s)
53 #define DEBUG_SUSPEND_RESUME_D(d, l)    printf("%x", d)
54 #else
55 #define DEBUG_SUSPEND_RESUME_S(s)
56 #define DEBUG_SUSPEND_RESUME_D(d, l)
57 #endif
58
59 static u32 ddr3_sw_wl_rl_debug;
60 static u32 ddr3_run_pbs = 1;
61
62 void ddr3_print_version(void)
63 {
64         puts("DDR3 Training Sequence - Ver 5.7.");
65 }
66
67 void ddr3_set_sw_wl_rl_debug(u32 val)
68 {
69         ddr3_sw_wl_rl_debug = val;
70 }
71
72 void ddr3_set_pbs(u32 val)
73 {
74         ddr3_run_pbs = val;
75 }
76
77 int ddr3_hw_training(u32 target_freq, u32 ddr_width, int xor_bypass,
78                      u32 scrub_offs, u32 scrub_size, int dqs_clk_aligned,
79                      int debug_mode, int reg_dimm_skip_wl)
80 {
81         /* A370 has no PBS mechanism */
82         __maybe_unused u32 first_loop_flag = 0;
83         u32 freq, reg;
84         MV_DRAM_INFO dram_info;
85         int ratio_2to1 = 0;
86         int tmp_ratio = 1;
87         int status;
88
89         if (debug_mode)
90                 DEBUG_MAIN_S("DDR3 Training Sequence - DEBUG - 1\n");
91
92         memset(&dram_info, 0, sizeof(dram_info));
93         dram_info.num_cs = ddr3_get_cs_num_from_reg();
94         dram_info.cs_ena = ddr3_get_cs_ena_from_reg();
95         dram_info.target_frequency = target_freq;
96         dram_info.ddr_width = ddr_width;
97         dram_info.num_of_std_pups = ddr_width / PUP_SIZE;
98         dram_info.rl400_bug = 0;
99         dram_info.multi_cs_mr_support = 0;
100 #ifdef MV88F67XX
101         dram_info.rl400_bug = 1;
102 #endif
103
104         /* Ignore ECC errors - if ECC is enabled */
105         reg = reg_read(REG_SDRAM_CONFIG_ADDR);
106         if (reg & (1 << REG_SDRAM_CONFIG_ECC_OFFS)) {
107                 dram_info.ecc_ena = 1;
108                 reg |= (1 << REG_SDRAM_CONFIG_IERR_OFFS);
109                 reg_write(REG_SDRAM_CONFIG_ADDR, reg);
110         } else {
111                 dram_info.ecc_ena = 0;
112         }
113
114         reg = reg_read(REG_SDRAM_CONFIG_ADDR);
115         if (reg & (1 << REG_SDRAM_CONFIG_REGDIMM_OFFS))
116                 dram_info.reg_dimm = 1;
117         else
118                 dram_info.reg_dimm = 0;
119
120         dram_info.num_of_total_pups = ddr_width / PUP_SIZE + dram_info.ecc_ena;
121
122         /* Get target 2T value */
123         reg = reg_read(REG_DUNIT_CTRL_LOW_ADDR);
124         dram_info.mode_2t = (reg >> REG_DUNIT_CTRL_LOW_2T_OFFS) &
125                 REG_DUNIT_CTRL_LOW_2T_MASK;
126
127         /* Get target CL value */
128 #ifdef MV88F67XX
129         reg = reg_read(REG_DDR3_MR0_ADDR) >> 2;
130 #else
131         reg = reg_read(REG_DDR3_MR0_CS_ADDR) >> 2;
132 #endif
133
134         reg = (((reg >> 1) & 0xE) | (reg & 0x1)) & 0xF;
135         dram_info.cl = ddr3_valid_cl_to_cl(reg);
136
137         /* Get target CWL value */
138 #ifdef MV88F67XX
139         reg = reg_read(REG_DDR3_MR2_ADDR) >> REG_DDR3_MR2_CWL_OFFS;
140 #else
141         reg = reg_read(REG_DDR3_MR2_CS_ADDR) >> REG_DDR3_MR2_CWL_OFFS;
142 #endif
143
144         reg &= REG_DDR3_MR2_CWL_MASK;
145         dram_info.cwl = reg;
146 #if !defined(MV88F67XX)
147         /* A370 has no PBS mechanism */
148 #if defined(MV88F78X60)
149         if ((dram_info.target_frequency > DDR_400) && (ddr3_run_pbs))
150                 first_loop_flag = 1;
151 #else
152         /* first_loop_flag = 1; skip mid freq at ALP/A375 */
153         if ((dram_info.target_frequency > DDR_400) && (ddr3_run_pbs) &&
154             (mv_ctrl_revision_get() >= UMC_A0))
155                 first_loop_flag = 1;
156         else
157                 first_loop_flag = 0;
158 #endif
159 #endif
160
161         freq = dram_info.target_frequency;
162
163         /* Set ODT to always on */
164         ddr3_odt_activate(1);
165
166         /* Init XOR */
167         mv_sys_xor_init(&dram_info);
168
169         /* Get DRAM/HCLK ratio */
170         if (reg_read(REG_DDR_IO_ADDR) & (1 << REG_DDR_IO_CLK_RATIO_OFFS))
171                 ratio_2to1 = 1;
172
173         /*
174          * Xor Bypass - ECC support in AXP is currently available for 1:1
175          * modes frequency modes.
176          * Not all frequency modes support the ddr3 training sequence
177          * (Only 1200/300).
178          * Xor Bypass allows using the Xor initializations and scrubbing
179          * inside the ddr3 training sequence without running the training
180          * itself.
181          */
182         if (xor_bypass == 0) {
183                 if (ddr3_run_pbs) {
184                         DEBUG_MAIN_S("DDR3 Training Sequence - Run with PBS.\n");
185                 } else {
186                         DEBUG_MAIN_S("DDR3 Training Sequence - Run without PBS.\n");
187                 }
188
189                 if (dram_info.target_frequency > DFS_MARGIN) {
190                         tmp_ratio = 0;
191                         freq = DDR_100;
192
193                         if (dram_info.reg_dimm == 1)
194                                 freq = DDR_300;
195
196                         if (MV_OK != ddr3_dfs_high_2_low(freq, &dram_info)) {
197                                 /* Set low - 100Mhz DDR Frequency by HW */
198                                 DEBUG_MAIN_S("DDR3 Training Sequence - FAILED (Dfs High2Low)\n");
199                                 return MV_DDR3_TRAINING_ERR_DFS_H2L;
200                         }
201
202                         if ((dram_info.reg_dimm == 1) &&
203                             (reg_dimm_skip_wl == 0)) {
204                                 if (MV_OK !=
205                                     ddr3_write_leveling_hw_reg_dimm(freq,
206                                                                     &dram_info))
207                                         DEBUG_MAIN_S("DDR3 Training Sequence - Registered DIMM Low WL - SKIP\n");
208                         }
209
210                         if (ddr3_get_log_level() >= MV_LOG_LEVEL_1)
211                                 ddr3_print_freq(freq);
212
213                         if (debug_mode)
214                                 DEBUG_MAIN_S("DDR3 Training Sequence - DEBUG - 2\n");
215                 } else {
216                         if (!dqs_clk_aligned) {
217 #ifdef MV88F67XX
218                                 /*
219                                  * If running training sequence without DFS,
220                                  * we must run Write leveling before writing
221                                  * the patterns
222                                  */
223
224                                 /*
225                                  * ODT - Multi CS system use SW WL,
226                                  * Single CS System use HW WL
227                                  */
228                                 if (dram_info.cs_ena > 1) {
229                                         if (MV_OK !=
230                                             ddr3_write_leveling_sw(
231                                                     freq, tmp_ratio,
232                                                     &dram_info)) {
233                                                 DEBUG_MAIN_S("DDR3 Training Sequence - FAILED (Write Leveling Sw)\n");
234                                                 return MV_DDR3_TRAINING_ERR_WR_LVL_SW;
235                                         }
236                                 } else {
237                                         if (MV_OK !=
238                                             ddr3_write_leveling_hw(freq,
239                                                                    &dram_info)) {
240                                                 DEBUG_MAIN_S("DDR3 Training Sequence - FAILED (Write Leveling Hw)\n");
241                                                 return MV_DDR3_TRAINING_ERR_WR_LVL_HW;
242                                         }
243                                 }
244 #else
245                                 if (MV_OK != ddr3_write_leveling_hw(
246                                             freq, &dram_info)) {
247                                         DEBUG_MAIN_S("DDR3 Training Sequence - FAILED (Write Leveling Hw)\n");
248                                         if (ddr3_sw_wl_rl_debug) {
249                                                 if (MV_OK !=
250                                                     ddr3_write_leveling_sw(
251                                                             freq, tmp_ratio,
252                                                             &dram_info)) {
253                                                         DEBUG_MAIN_S("DDR3 Training Sequence - FAILED (Write Leveling Sw)\n");
254                                                         return MV_DDR3_TRAINING_ERR_WR_LVL_SW;
255                                                 }
256                                         } else {
257                                                 return MV_DDR3_TRAINING_ERR_WR_LVL_HW;
258                                         }
259                                 }
260 #endif
261                         }
262
263                         if (debug_mode)
264                                 DEBUG_MAIN_S("DDR3 Training Sequence - DEBUG - 3\n");
265                 }
266
267                 if (MV_OK != ddr3_load_patterns(&dram_info, 0)) {
268                         DEBUG_MAIN_S("DDR3 Training Sequence - FAILED (Loading Patterns)\n");
269                         return MV_DDR3_TRAINING_ERR_LOAD_PATTERNS;
270                 }
271
272                 /*
273                  * TODO:
274                  * The mainline U-Boot port of the bin_hdr DDR training code
275                  * needs a delay of minimum 20ms here (10ms is a bit too short
276                  * and the CPU hangs). The bin_hdr code doesn't have this delay.
277                  * To be save here, lets add a delay of 50ms here.
278                  *
279                  * Tested on the Marvell DB-MV784MP-GP board
280                  */
281                 mdelay(50);
282
283                 do {
284                         freq = dram_info.target_frequency;
285                         tmp_ratio = ratio_2to1;
286                         DEBUG_MAIN_FULL_S("DDR3 Training Sequence - DEBUG - 4\n");
287
288 #if defined(MV88F78X60)
289                         /*
290                          * There is a difference on the DFS frequency at the
291                          * first iteration of this loop
292                          */
293                         if (first_loop_flag) {
294                                 freq = DDR_400;
295                                 tmp_ratio = 0;
296                         }
297 #endif
298
299                         if (MV_OK != ddr3_dfs_low_2_high(freq, tmp_ratio,
300                                                          &dram_info)) {
301                                 DEBUG_MAIN_S("DDR3 Training Sequence - FAILED (Dfs Low2High)\n");
302                                 return MV_DDR3_TRAINING_ERR_DFS_H2L;
303                         }
304
305                         if (ddr3_get_log_level() >= MV_LOG_LEVEL_1) {
306                                 ddr3_print_freq(freq);
307                         }
308
309                         if (debug_mode)
310                                 DEBUG_MAIN_S("DDR3 Training Sequence - DEBUG - 5\n");
311
312                         /* Write leveling */
313                         if (!dqs_clk_aligned) {
314 #ifdef MV88F67XX
315                                 /*
316                                  * ODT - Multi CS system that not support Multi
317                                  * CS MRS commands must use SW WL
318                                  */
319                                 if (dram_info.cs_ena > 1) {
320                                         if (MV_OK != ddr3_write_leveling_sw(
321                                                     freq, tmp_ratio, &dram_info)) {
322                                                 DEBUG_MAIN_S("DDR3 Training Sequence - FAILED (Write Leveling Sw)\n");
323                                                 return MV_DDR3_TRAINING_ERR_WR_LVL_SW;
324                                         }
325                                 } else {
326                                         if (MV_OK != ddr3_write_leveling_hw(
327                                                     freq, &dram_info)) {
328                                                 DEBUG_MAIN_S("DDR3 Training Sequence - FAILED (Write Leveling Hw)\n");
329                                                 return MV_DDR3_TRAINING_ERR_WR_LVL_HW;
330                                         }
331                                 }
332 #else
333                                 if ((dram_info.reg_dimm == 1) &&
334                                     (freq == DDR_400)) {
335                                         if (reg_dimm_skip_wl == 0) {
336                                                 if (MV_OK != ddr3_write_leveling_hw_reg_dimm(
337                                                             freq, &dram_info))
338                                                         DEBUG_MAIN_S("DDR3 Training Sequence - Registered DIMM WL - SKIP\n");
339                                         }
340                                 } else {
341                                         if (MV_OK != ddr3_write_leveling_hw(
342                                                     freq, &dram_info)) {
343                                                 DEBUG_MAIN_S("DDR3 Training Sequence - FAILED (Write Leveling Hw)\n");
344                                                 if (ddr3_sw_wl_rl_debug) {
345                                                         if (MV_OK != ddr3_write_leveling_sw(
346                                                                     freq, tmp_ratio, &dram_info)) {
347                                                                 DEBUG_MAIN_S("DDR3 Training Sequence - FAILED (Write Leveling Sw)\n");
348                                                                 return MV_DDR3_TRAINING_ERR_WR_LVL_SW;
349                                                         }
350                                                 } else {
351                                                         return MV_DDR3_TRAINING_ERR_WR_LVL_HW;
352                                                 }
353                                         }
354                                 }
355 #endif
356                                 if (debug_mode)
357                                         DEBUG_MAIN_S
358                                             ("DDR3 Training Sequence - DEBUG - 6\n");
359                         }
360
361                         /* Read Leveling */
362                         /*
363                          * Armada 370 - Support for HCLK @ 400MHZ - must use
364                          * SW read leveling
365                          */
366                         if (freq == DDR_400 && dram_info.rl400_bug) {
367                                 status = ddr3_read_leveling_sw(freq, tmp_ratio,
368                                                        &dram_info);
369                                 if (MV_OK != status) {
370                                         DEBUG_MAIN_S
371                                             ("DDR3 Training Sequence - FAILED (Read Leveling Sw)\n");
372                                         return status;
373                                 }
374                         } else {
375                                 if (MV_OK != ddr3_read_leveling_hw(
376                                             freq, &dram_info)) {
377                                         DEBUG_MAIN_S("DDR3 Training Sequence - FAILED (Read Leveling Hw)\n");
378                                         if (ddr3_sw_wl_rl_debug) {
379                                                 if (MV_OK != ddr3_read_leveling_sw(
380                                                             freq, tmp_ratio,
381                                                             &dram_info)) {
382                                                         DEBUG_MAIN_S("DDR3 Training Sequence - FAILED (Read Leveling Sw)\n");
383                                                         return MV_DDR3_TRAINING_ERR_WR_LVL_SW;
384                                                 }
385                                         } else {
386                                                 return MV_DDR3_TRAINING_ERR_WR_LVL_HW;
387                                         }
388                                 }
389                         }
390
391                         if (debug_mode)
392                                 DEBUG_MAIN_S("DDR3 Training Sequence - DEBUG - 7\n");
393
394                         if (MV_OK != ddr3_wl_supplement(&dram_info)) {
395                                 DEBUG_MAIN_S("DDR3 Training Sequence - FAILED (Write Leveling Hi-Freq Sup)\n");
396                                 return MV_DDR3_TRAINING_ERR_WR_LVL_HI_FREQ;
397                         }
398
399                         if (debug_mode)
400                                 DEBUG_MAIN_S("DDR3 Training Sequence - DEBUG - 8\n");
401 #if !defined(MV88F67XX)
402                         /* A370 has no PBS mechanism */
403 #if defined(MV88F78X60) || defined(MV88F672X)
404                         if (first_loop_flag == 1) {
405                                 first_loop_flag = 0;
406
407                                 status = MV_OK;
408                                 status = ddr3_pbs_rx(&dram_info);
409                                 if (MV_OK != status) {
410                                         DEBUG_MAIN_S("DDR3 Training Sequence - FAILED (PBS RX)\n");
411                                         return status;
412                                 }
413
414                                 if (debug_mode)
415                                         DEBUG_MAIN_S("DDR3 Training Sequence - DEBUG - 9\n");
416
417                                 status = ddr3_pbs_tx(&dram_info);
418                                 if (MV_OK != status) {
419                                         DEBUG_MAIN_S("DDR3 Training Sequence - FAILED (PBS TX)\n");
420                                         return status;
421                                 }
422
423                                 if (debug_mode)
424                                         DEBUG_MAIN_S("DDR3 Training Sequence - DEBUG - 10\n");
425                         }
426 #endif
427 #endif
428                 } while (freq != dram_info.target_frequency);
429
430                 status = ddr3_dqs_centralization_rx(&dram_info);
431                 if (MV_OK != status) {
432                         DEBUG_MAIN_S("DDR3 Training Sequence - FAILED (DQS Centralization RX)\n");
433                         return status;
434                 }
435
436                 if (debug_mode)
437                         DEBUG_MAIN_S("DDR3 Training Sequence - DEBUG - 11\n");
438
439                 status = ddr3_dqs_centralization_tx(&dram_info);
440                 if (MV_OK != status) {
441                         DEBUG_MAIN_S("DDR3 Training Sequence - FAILED (DQS Centralization TX)\n");
442                         return status;
443                 }
444
445                 if (debug_mode)
446                         DEBUG_MAIN_S("DDR3 Training Sequence - DEBUG - 12\n");
447         }
448
449         ddr3_set_performance_params(&dram_info);
450
451         if (dram_info.ecc_ena) {
452                 /* Need to SCRUB the DRAM memory area to load U-Boot */
453                 mv_sys_xor_finish();
454                 dram_info.num_cs = 1;
455                 dram_info.cs_ena = 1;
456                 mv_sys_xor_init(&dram_info);
457                 mv_xor_mem_init(0, scrub_offs, scrub_size, 0xdeadbeef,
458                                 0xdeadbeef);
459
460                 /* Wait for previous transfer completion */
461                 while (mv_xor_state_get(0) != MV_IDLE)
462                         ;
463
464                 if (debug_mode)
465                         DEBUG_MAIN_S("DDR3 Training Sequence - DEBUG - 13\n");
466         }
467
468         /* Return XOR State */
469         mv_sys_xor_finish();
470
471 #if defined(MV88F78X60)
472         /* Save training results in memeory for resume state */
473         ddr3_save_training(&dram_info);
474 #endif
475         /* Clear ODT always on */
476         ddr3_odt_activate(0);
477
478         /* Configure Dynamic read ODT */
479         ddr3_odt_read_dynamic_config(&dram_info);
480
481         return MV_OK;
482 }
483
484 void ddr3_set_performance_params(MV_DRAM_INFO *dram_info)
485 {
486         u32 twr2wr, trd2rd, trd2wr_wr2rd;
487         u32 tmp1, tmp2, reg;
488
489         DEBUG_MAIN_FULL_C("Max WL Phase: ", dram_info->wl_max_phase, 2);
490         DEBUG_MAIN_FULL_C("Min WL Phase: ", dram_info->wl_min_phase, 2);
491         DEBUG_MAIN_FULL_C("Max RL Phase: ", dram_info->rl_max_phase, 2);
492         DEBUG_MAIN_FULL_C("Min RL Phase: ", dram_info->rl_min_phase, 2);
493
494         if (dram_info->wl_max_phase < 2)
495                 twr2wr = 0x2;
496         else
497                 twr2wr = 0x3;
498
499         trd2rd = 0x1 + (dram_info->rl_max_phase + 1) / 2 +
500                 (dram_info->rl_max_phase + 1) % 2;
501
502         tmp1 = (dram_info->rl_max_phase - dram_info->wl_min_phase) / 2 +
503                 (((dram_info->rl_max_phase - dram_info->wl_min_phase) % 2) >
504                  0 ? 1 : 0);
505         tmp2 = (dram_info->wl_max_phase - dram_info->rl_min_phase) / 2 +
506                 ((dram_info->wl_max_phase - dram_info->rl_min_phase) % 2 >
507                  0 ? 1 : 0);
508         trd2wr_wr2rd = (tmp1 >= tmp2) ? tmp1 : tmp2;
509
510         trd2wr_wr2rd += 2;
511         trd2rd += 2;
512         twr2wr += 2;
513
514         DEBUG_MAIN_FULL_C("WR 2 WR: ", twr2wr, 2);
515         DEBUG_MAIN_FULL_C("RD 2 RD: ", trd2rd, 2);
516         DEBUG_MAIN_FULL_C("RD 2 WR / WR 2 RD: ", trd2wr_wr2rd, 2);
517
518         reg = reg_read(REG_SDRAM_TIMING_HIGH_ADDR);
519
520         reg &= ~(REG_SDRAM_TIMING_H_W2W_MASK << REG_SDRAM_TIMING_H_W2W_OFFS);
521         reg |= ((twr2wr & REG_SDRAM_TIMING_H_W2W_MASK) <<
522                 REG_SDRAM_TIMING_H_W2W_OFFS);
523
524         reg &= ~(REG_SDRAM_TIMING_H_R2R_MASK << REG_SDRAM_TIMING_H_R2R_OFFS);
525         reg &= ~(REG_SDRAM_TIMING_H_R2R_H_MASK <<
526                  REG_SDRAM_TIMING_H_R2R_H_OFFS);
527         reg |= ((trd2rd & REG_SDRAM_TIMING_H_R2R_MASK) <<
528                 REG_SDRAM_TIMING_H_R2R_OFFS);
529         reg |= (((trd2rd >> 2) & REG_SDRAM_TIMING_H_R2R_H_MASK) <<
530                 REG_SDRAM_TIMING_H_R2R_H_OFFS);
531
532         reg &= ~(REG_SDRAM_TIMING_H_R2W_W2R_MASK <<
533                  REG_SDRAM_TIMING_H_R2W_W2R_OFFS);
534         reg &= ~(REG_SDRAM_TIMING_H_R2W_W2R_H_MASK <<
535                  REG_SDRAM_TIMING_H_R2W_W2R_H_OFFS);
536         reg |= ((trd2wr_wr2rd & REG_SDRAM_TIMING_H_R2W_W2R_MASK) <<
537                 REG_SDRAM_TIMING_H_R2W_W2R_OFFS);
538         reg |= (((trd2wr_wr2rd >> 2) & REG_SDRAM_TIMING_H_R2W_W2R_H_MASK) <<
539                 REG_SDRAM_TIMING_H_R2W_W2R_H_OFFS);
540
541         reg_write(REG_SDRAM_TIMING_HIGH_ADDR, reg);
542 }
543
544 /*
545  * Perform DDR3 PUP Indirect Write
546  */
547 void ddr3_write_pup_reg(u32 mode, u32 cs, u32 pup, u32 phase, u32 delay)
548 {
549         u32 reg = 0;
550
551         if (pup == PUP_BC)
552                 reg |= (1 << REG_PHY_BC_OFFS);
553         else
554                 reg |= (pup << REG_PHY_PUP_OFFS);
555
556         reg |= ((0x4 * cs + mode) << REG_PHY_CS_OFFS);
557         reg |= (phase << REG_PHY_PHASE_OFFS) | delay;
558
559         if (mode == PUP_WL_MODE)
560                 reg |= ((INIT_WL_DELAY + delay) << REG_PHY_DQS_REF_DLY_OFFS);
561
562         reg_write(REG_PHY_REGISTRY_FILE_ACCESS_ADDR, reg);      /* 0x16A0 */
563         reg |= REG_PHY_REGISTRY_FILE_ACCESS_OP_WR;
564         reg_write(REG_PHY_REGISTRY_FILE_ACCESS_ADDR, reg);      /* 0x16A0 */
565
566         do {
567                 reg = reg_read(REG_PHY_REGISTRY_FILE_ACCESS_ADDR) &
568                         REG_PHY_REGISTRY_FILE_ACCESS_OP_DONE;
569         } while (reg);  /* Wait for '0' to mark the end of the transaction */
570
571         /* If read Leveling mode - need to write to register 3 separetly */
572         if (mode == PUP_RL_MODE) {
573                 reg = 0;
574
575                 if (pup == PUP_BC)
576                         reg |= (1 << REG_PHY_BC_OFFS);
577                 else
578                         reg |= (pup << REG_PHY_PUP_OFFS);
579
580                 reg |= ((0x4 * cs + mode + 1) << REG_PHY_CS_OFFS);
581                 reg |= (INIT_RL_DELAY);
582
583                 reg_write(REG_PHY_REGISTRY_FILE_ACCESS_ADDR, reg); /* 0x16A0 */
584                 reg |= REG_PHY_REGISTRY_FILE_ACCESS_OP_WR;
585                 reg_write(REG_PHY_REGISTRY_FILE_ACCESS_ADDR, reg); /* 0x16A0 */
586
587                 do {
588                         reg = reg_read(REG_PHY_REGISTRY_FILE_ACCESS_ADDR) &
589                                 REG_PHY_REGISTRY_FILE_ACCESS_OP_DONE;
590                 } while (reg);
591         }
592 }
593
594 /*
595  * Perform DDR3 PUP Indirect Read
596  */
597 u32 ddr3_read_pup_reg(u32 mode, u32 cs, u32 pup)
598 {
599         u32 reg;
600
601         reg = (pup << REG_PHY_PUP_OFFS) |
602                 ((0x4 * cs + mode) << REG_PHY_CS_OFFS);
603         reg_write(REG_PHY_REGISTRY_FILE_ACCESS_ADDR, reg);      /* 0x16A0 */
604
605         reg |= REG_PHY_REGISTRY_FILE_ACCESS_OP_RD;
606         reg_write(REG_PHY_REGISTRY_FILE_ACCESS_ADDR, reg);      /* 0x16A0 */
607
608         do {
609                 reg = reg_read(REG_PHY_REGISTRY_FILE_ACCESS_ADDR) &
610                         REG_PHY_REGISTRY_FILE_ACCESS_OP_DONE;
611         } while (reg);  /* Wait for '0' to mark the end of the transaction */
612
613         return reg_read(REG_PHY_REGISTRY_FILE_ACCESS_ADDR);     /* 0x16A0 */
614 }
615
616 /*
617  * Set training patterns
618  */
619 int ddr3_load_patterns(MV_DRAM_INFO *dram_info, int resume)
620 {
621         u32 reg;
622
623         /* Enable SW override - Required for the ECC Pup */
624         reg = reg_read(REG_DRAM_TRAINING_2_ADDR) |
625                 (1 << REG_DRAM_TRAINING_2_SW_OVRD_OFFS);
626
627         /* [0] = 1 - Enable SW override  */
628         /* 0x15B8 - Training SW 2 Register */
629         reg_write(REG_DRAM_TRAINING_2_ADDR, reg);
630
631         reg = (1 << REG_DRAM_TRAINING_AUTO_OFFS);
632         reg_write(REG_DRAM_TRAINING_ADDR, reg); /* 0x15B0 - Training Register */
633
634         if (resume == 0) {
635 #if defined(MV88F78X60) || defined(MV88F672X)
636                 ddr3_load_pbs_patterns(dram_info);
637 #endif
638                 ddr3_load_dqs_patterns(dram_info);
639         }
640
641         /* Disable SW override - Must be in a different stage */
642         /* [0]=0 - Enable SW override  */
643         reg = reg_read(REG_DRAM_TRAINING_2_ADDR);
644         reg &= ~(1 << REG_DRAM_TRAINING_2_SW_OVRD_OFFS);
645         /* 0x15B8 - Training SW 2 Register */
646         reg_write(REG_DRAM_TRAINING_2_ADDR, reg);
647
648         reg = reg_read(REG_DRAM_TRAINING_1_ADDR) |
649                 (1 << REG_DRAM_TRAINING_1_TRNBPOINT_OFFS);
650         reg_write(REG_DRAM_TRAINING_1_ADDR, reg);
651
652         /* Set Base Addr */
653 #if defined(MV88F67XX)
654         reg_write(REG_DRAM_TRAINING_PATTERN_BASE_ADDR, 0);
655 #else
656         if (resume == 0)
657                 reg_write(REG_DRAM_TRAINING_PATTERN_BASE_ADDR, 0);
658         else
659                 reg_write(REG_DRAM_TRAINING_PATTERN_BASE_ADDR,
660                           RESUME_RL_PATTERNS_ADDR);
661 #endif
662
663         /* Set Patterns */
664         if (resume == 0) {
665                 reg = (dram_info->cs_ena << REG_DRAM_TRAINING_CS_OFFS) |
666                         (1 << REG_DRAM_TRAINING_PATTERNS_OFFS);
667         } else {
668                 reg = (0x1 << REG_DRAM_TRAINING_CS_OFFS) |
669                         (1 << REG_DRAM_TRAINING_PATTERNS_OFFS);
670         }
671
672         reg |= (1 << REG_DRAM_TRAINING_AUTO_OFFS);
673
674         reg_write(REG_DRAM_TRAINING_ADDR, reg);
675
676         udelay(100);
677
678         /* Check if Successful */
679         if (reg_read(REG_DRAM_TRAINING_ADDR) &
680             (1 << REG_DRAM_TRAINING_ERROR_OFFS))
681                 return MV_OK;
682         else
683                 return MV_FAIL;
684 }
685
686 #if !defined(MV88F67XX)
687 /*
688  * Name:     ddr3_save_training(MV_DRAM_INFO *dram_info)
689  * Desc:     saves the training results to memeory (RL,WL,PBS,Rx/Tx
690  *           Centeralization)
691  * Args:     MV_DRAM_INFO *dram_info
692  * Notes:
693  * Returns:  None.
694  */
695 void ddr3_save_training(MV_DRAM_INFO *dram_info)
696 {
697         u32 val, pup, tmp_cs, cs, i, dq;
698         u32 crc = 0;
699         u32 regs = 0;
700         u32 *sdram_offset = (u32 *)RESUME_TRAINING_VALUES_ADDR;
701         u32 mode_config[MAX_TRAINING_MODE];
702
703         mode_config[DQS_WR_MODE] = PUP_DQS_WR;
704         mode_config[WL_MODE_] = PUP_WL_MODE;
705         mode_config[RL_MODE_] = PUP_RL_MODE;
706         mode_config[DQS_RD_MODE] = PUP_DQS_RD;
707         mode_config[PBS_TX_DM_MODE] = PUP_PBS_TX_DM;
708         mode_config[PBS_TX_MODE] = PUP_PBS_TX;
709         mode_config[PBS_RX_MODE] = PUP_PBS_RX;
710
711         /* num of training modes */
712         for (i = 0; i < MAX_TRAINING_MODE; i++) {
713                 tmp_cs = dram_info->cs_ena;
714                 /* num of CS */
715                 for (cs = 0; cs < MAX_CS; cs++) {
716                         if (tmp_cs & (1 << cs)) {
717                                 /* num of PUPs */
718                                 for (pup = 0; pup < dram_info->num_of_total_pups;
719                                      pup++) {
720                                         if (pup == dram_info->num_of_std_pups &&
721                                             dram_info->ecc_ena)
722                                                 pup = ECC_PUP;
723                                         if (i == PBS_TX_DM_MODE) {
724                                                 /*
725                                                  * Change CS bitmask because
726                                                  * PBS works only with CS0
727                                                  */
728                                                 tmp_cs = 0x1;
729                                                 val = ddr3_read_pup_reg(
730                                                         mode_config[i], CS0, pup);
731                                         } else if (i == PBS_TX_MODE ||
732                                                    i == PBS_RX_MODE) {
733                                                 /*
734                                                  * Change CS bitmask because
735                                                  * PBS works only with CS0
736                                                  */
737                                                 tmp_cs = 0x1;
738                                                 for (dq = 0; dq <= DQ_NUM;
739                                                      dq++) {
740                                                         val = ddr3_read_pup_reg(
741                                                                 mode_config[i] + dq,
742                                                                 CS0,
743                                                                 pup);
744                                                         (*sdram_offset) = val;
745                                                         crc += *sdram_offset;
746                                                         sdram_offset++;
747                                                         regs++;
748                                                 }
749                                                 continue;
750                                         } else {
751                                                 val = ddr3_read_pup_reg(
752                                                         mode_config[i], cs, pup);
753                                         }
754
755                                         *sdram_offset = val;
756                                         crc += *sdram_offset;
757                                         sdram_offset++;
758                                         regs++;
759                                 }
760                         }
761                 }
762         }
763
764         *sdram_offset = reg_read(REG_READ_DATA_SAMPLE_DELAYS_ADDR);
765         crc += *sdram_offset;
766         sdram_offset++;
767         regs++;
768         *sdram_offset = reg_read(REG_READ_DATA_READY_DELAYS_ADDR);
769         crc += *sdram_offset;
770         sdram_offset++;
771         regs++;
772         sdram_offset = (u32 *)NUM_OF_REGISTER_ADDR;
773         *sdram_offset = regs;
774         DEBUG_SUSPEND_RESUME_S("Training Results CheckSum write= ");
775         DEBUG_SUSPEND_RESUME_D(crc, 8);
776         DEBUG_SUSPEND_RESUME_S("\n");
777         sdram_offset = (u32 *)CHECKSUM_RESULT_ADDR;
778         *sdram_offset = crc;
779 }
780
781 /*
782  * Name:     ddr3_read_training_results()
783  * Desc:     Reads the training results from memeory (RL,WL,PBS,Rx/Tx
784  *           Centeralization)
785  *           and writes them to the relevant registers
786  * Args:     MV_DRAM_INFO *dram_info
787  * Notes:
788  * Returns:  None.
789  */
790 int ddr3_read_training_results(void)
791 {
792         u32 val, reg, idx, dqs_wr_idx = 0, crc = 0;
793         u32 *sdram_offset = (u32 *)RESUME_TRAINING_VALUES_ADDR;
794         u32 training_val[RESUME_TRAINING_VALUES_MAX] = { 0 };
795         u32 regs = *((u32 *)NUM_OF_REGISTER_ADDR);
796
797         /*
798          * Read Training results & Dunit registers from memory and write
799          * it to an array
800          */
801         for (idx = 0; idx < regs; idx++) {
802                 training_val[idx] = *sdram_offset;
803                 crc += *sdram_offset;
804                 sdram_offset++;
805         }
806
807         sdram_offset = (u32 *)CHECKSUM_RESULT_ADDR;
808
809         if ((*sdram_offset) == crc) {
810                 DEBUG_SUSPEND_RESUME_S("Training Results CheckSum read PASS= ");
811                 DEBUG_SUSPEND_RESUME_D(crc, 8);
812                 DEBUG_SUSPEND_RESUME_S("\n");
813         } else {
814                 DEBUG_MAIN_S("Wrong Training Results CheckSum\n");
815                 return MV_FAIL;
816         }
817
818         /*
819          * We iterate through all the registers except for the last 2 since
820          * they are Dunit registers (and not PHY registers)
821          */
822         for (idx = 0; idx < (regs - 2); idx++) {
823                 val = training_val[idx];
824                 reg = (val >> REG_PHY_CS_OFFS) & 0x3F; /*read the phy address */
825
826                 /* Check if the values belongs to the DQS WR */
827                 if (reg == PUP_WL_MODE) {
828                         /* bit[5:0] in DQS_WR are delay */
829                         val = (training_val[dqs_wr_idx++] & 0x3F);
830                         /*
831                          * bit[15:10] are DQS_WR delay & bit[9:0] are
832                          * WL phase & delay
833                          */
834                         val = (val << REG_PHY_DQS_REF_DLY_OFFS) |
835                                 (training_val[idx] & 0x3C003FF);
836                         /* Add Request pending and write operation bits */
837                         val |= REG_PHY_REGISTRY_FILE_ACCESS_OP_WR;
838                 } else if (reg == PUP_DQS_WR) {
839                         /*
840                          * Do nothing since DQS_WR will be done in PUP_WL_MODE
841                          */
842                         continue;
843                 }
844
845                 val |= REG_PHY_REGISTRY_FILE_ACCESS_OP_WR;
846                 reg_write(REG_PHY_REGISTRY_FILE_ACCESS_ADDR, val);
847                 do {
848                         val = (reg_read(REG_PHY_REGISTRY_FILE_ACCESS_ADDR)) &
849                                 REG_PHY_REGISTRY_FILE_ACCESS_OP_DONE;
850                 } while (val);  /* Wait for '0' to mark the end of the transaction */
851         }
852
853         /* write last 2 Dunit configurations */
854         val = training_val[idx];
855         reg_write(REG_READ_DATA_SAMPLE_DELAYS_ADDR, val);       /* reg 0x1538 */
856         val = training_val[idx + 1];
857         reg_write(REG_READ_DATA_READY_DELAYS_ADDR, val);        /* reg 0x153c */
858
859         return MV_OK;
860 }
861
862 /*
863  * Name:     ddr3_check_if_resume_mode()
864  * Desc:     Reads the address (0x3000) of the Resume Magic word (0xDEADB002)
865  * Args:     MV_DRAM_INFO *dram_info
866  * Notes:
867  * Returns:  return (magic_word == SUSPEND_MAGIC_WORD)
868  */
869 int ddr3_check_if_resume_mode(MV_DRAM_INFO *dram_info, u32 freq)
870 {
871         u32 magic_word;
872         u32 *sdram_offset = (u32 *)BOOT_INFO_ADDR;
873
874         if (dram_info->reg_dimm != 1) {
875                 /*
876                  * Perform write levleling in order initiate the phy with
877                  * low frequency
878                  */
879                 if (MV_OK != ddr3_write_leveling_hw(freq, dram_info)) {
880                         DEBUG_MAIN_S("DDR3 Training Sequence - FAILED (Write Leveling Hw)\n");
881                         return MV_DDR3_TRAINING_ERR_WR_LVL_HW;
882                 }
883         }
884
885         if (MV_OK != ddr3_load_patterns(dram_info, 1)) {
886                 DEBUG_MAIN_S("DDR3 Training Sequence - FAILED (Loading Patterns)\n");
887                 return MV_DDR3_TRAINING_ERR_LOAD_PATTERNS;
888         }
889
890         /* Enable CS0 only for RL */
891         dram_info->cs_ena = 0x1;
892
893         /* Perform Read levleling in order to get stable memory */
894         if (MV_OK != ddr3_read_leveling_hw(freq, dram_info)) {
895                 DEBUG_MAIN_S("DDR3 Training Sequence - FAILED (Read Leveling Hw)\n");
896                 return MV_DDR3_TRAINING_ERR_WR_LVL_HW;
897         }
898
899         /* Back to relevant CS */
900         dram_info->cs_ena = ddr3_get_cs_ena_from_reg();
901
902         magic_word = *sdram_offset;
903         return magic_word == SUSPEND_MAGIC_WORD;
904 }
905
906 /*
907  * Name:     ddr3_training_suspend_resume()
908  * Desc:     Execute the Resume state
909  * Args:     MV_DRAM_INFO *dram_info
910  * Notes:
911  * Returns:  return (magic_word == SUSPEND_MAGIC_WORD)
912  */
913 int ddr3_training_suspend_resume(MV_DRAM_INFO *dram_info)
914 {
915         u32 freq, reg;
916         int tmp_ratio;
917
918         /* Configure DDR */
919         if (MV_OK != ddr3_read_training_results())
920                 return MV_FAIL;
921
922         /* Reset read FIFO */
923         reg = reg_read(REG_DRAM_TRAINING_ADDR);
924
925         /* Start Auto Read Leveling procedure */
926         reg |= (1 << REG_DRAM_TRAINING_RL_OFFS);
927         reg_write(REG_DRAM_TRAINING_ADDR, reg); /* 0x15B0 - Training Register */
928
929         reg = reg_read(REG_DRAM_TRAINING_2_ADDR);
930         reg |= ((1 << REG_DRAM_TRAINING_2_FIFO_RST_OFFS) +
931                 (1 << REG_DRAM_TRAINING_2_SW_OVRD_OFFS));
932
933         /* [0] = 1 - Enable SW override, [4] = 1 - FIFO reset  */
934         /* 0x15B8 - Training SW 2 Register */
935         reg_write(REG_DRAM_TRAINING_2_ADDR, reg);
936
937         udelay(2);
938
939         reg = reg_read(REG_DRAM_TRAINING_ADDR);
940         /* Clear Auto Read Leveling procedure */
941         reg &= ~(1 << REG_DRAM_TRAINING_RL_OFFS);
942         reg_write(REG_DRAM_TRAINING_ADDR, reg); /* 0x15B0 - Training Register */
943
944         /* Return to target frequency */
945         freq = dram_info->target_frequency;
946         tmp_ratio = 1;
947         if (MV_OK != ddr3_dfs_low_2_high(freq, tmp_ratio, dram_info)) {
948                 DEBUG_MAIN_S("DDR3 Training Sequence - FAILED (Dfs Low2High)\n");
949                 return MV_DDR3_TRAINING_ERR_DFS_H2L;
950         }
951
952         if (dram_info->ecc_ena) {
953                 /* Scabbling the RL area pattern and the training area */
954                 mv_sys_xor_finish();
955                 dram_info->num_cs = 1;
956                 dram_info->cs_ena = 1;
957                 mv_sys_xor_init(dram_info);
958                 mv_xor_mem_init(0, RESUME_RL_PATTERNS_ADDR,
959                                 RESUME_RL_PATTERNS_SIZE, 0xFFFFFFFF, 0xFFFFFFFF);
960
961                 /* Wait for previous transfer completion */
962
963                 while (mv_xor_state_get(0) != MV_IDLE)
964                         ;
965
966                 /* Return XOR State */
967                 mv_sys_xor_finish();
968         }
969
970         return MV_OK;
971 }
972 #endif
973
974 void ddr3_print_freq(u32 freq)
975 {
976         u32 tmp_freq;
977
978         switch (freq) {
979         case 0:
980                 tmp_freq = 100;
981                 break;
982         case 1:
983                 tmp_freq = 300;
984                 break;
985         case 2:
986                 tmp_freq = 360;
987                 break;
988         case 3:
989                 tmp_freq = 400;
990                 break;
991         case 4:
992                 tmp_freq = 444;
993                 break;
994         case 5:
995                 tmp_freq = 500;
996                 break;
997         case 6:
998                 tmp_freq = 533;
999                 break;
1000         case 7:
1001                 tmp_freq = 600;
1002                 break;
1003         case 8:
1004                 tmp_freq = 666;
1005                 break;
1006         case 9:
1007                 tmp_freq = 720;
1008                 break;
1009         case 10:
1010                 tmp_freq = 800;
1011                 break;
1012         default:
1013                 tmp_freq = 100;
1014         }
1015
1016         printf("Current frequency is: %dMHz\n", tmp_freq);
1017 }
1018
1019 int ddr3_get_min_max_read_sample_delay(u32 cs_enable, u32 reg, u32 *min,
1020                                        u32 *max, u32 *cs_max)
1021 {
1022         u32 cs, delay;
1023
1024         *min = 0xFFFFFFFF;
1025         *max = 0x0;
1026
1027         for (cs = 0; cs < MAX_CS; cs++) {
1028                 if ((cs_enable & (1 << cs)) == 0)
1029                         continue;
1030
1031                 delay = ((reg >> (cs * 8)) & 0x1F);
1032
1033                 if (delay < *min)
1034                         *min = delay;
1035
1036                 if (delay > *max) {
1037                         *max = delay;
1038                         *cs_max = cs;
1039                 }
1040         }
1041
1042         return MV_OK;
1043 }
1044
1045 int ddr3_get_min_max_rl_phase(MV_DRAM_INFO *dram_info, u32 *min, u32 *max,
1046                               u32 cs)
1047 {
1048         u32 pup, reg, phase;
1049
1050         *min = 0xFFFFFFFF;
1051         *max = 0x0;
1052
1053         for (pup = 0; pup < dram_info->num_of_total_pups; pup++) {
1054                 reg = ddr3_read_pup_reg(PUP_RL_MODE, cs, pup);
1055                 phase = ((reg >> 8) & 0x7);
1056
1057                 if (phase < *min)
1058                         *min = phase;
1059
1060                 if (phase > *max)
1061                         *max = phase;
1062         }
1063
1064         return MV_OK;
1065 }
1066
1067 int ddr3_odt_activate(int activate)
1068 {
1069         u32 reg, mask;
1070
1071         mask = (1 << REG_DUNIT_ODT_CTRL_OVRD_OFFS) |
1072                 (1 << REG_DUNIT_ODT_CTRL_OVRD_VAL_OFFS);
1073         /* {0x0000149C}  -   DDR Dunit ODT Control Register */
1074         reg = reg_read(REG_DUNIT_ODT_CTRL_ADDR);
1075         if (activate)
1076                 reg |= mask;
1077         else
1078                 reg &= ~mask;
1079
1080         reg_write(REG_DUNIT_ODT_CTRL_ADDR, reg);
1081
1082         return MV_OK;
1083 }
1084
1085 int ddr3_odt_read_dynamic_config(MV_DRAM_INFO *dram_info)
1086 {
1087         u32 min_read_sample_delay, max_read_sample_delay, max_rl_phase;
1088         u32 min, max, cs_max;
1089         u32 cs_ena, reg;
1090
1091         reg = reg_read(REG_READ_DATA_SAMPLE_DELAYS_ADDR);
1092         cs_ena = ddr3_get_cs_ena_from_reg();
1093
1094         /* Get minimum and maximum of read sample delay of all CS */
1095         ddr3_get_min_max_read_sample_delay(cs_ena, reg, &min_read_sample_delay,
1096                                            &max_read_sample_delay, &cs_max);
1097
1098         /*
1099          * Get minimum and maximum read leveling phase which belongs to the
1100          * maximal read sample delay
1101          */
1102         ddr3_get_min_max_rl_phase(dram_info, &min, &max, cs_max);
1103         max_rl_phase = max;
1104
1105         /* DDR ODT Timing (Low) Register calculation */
1106         reg = reg_read(REG_ODT_TIME_LOW_ADDR);
1107         reg &= ~(0x1FF << REG_ODT_ON_CTL_RD_OFFS);
1108         reg |= (((min_read_sample_delay - 1) & 0xF) << REG_ODT_ON_CTL_RD_OFFS);
1109         reg |= (((max_read_sample_delay + 4 + (((max_rl_phase + 1) / 2) + 1)) &
1110                  0x1F) << REG_ODT_OFF_CTL_RD_OFFS);
1111         reg_write(REG_ODT_TIME_LOW_ADDR, reg);
1112
1113         return MV_OK;
1114 }