arm: mvebu: axp: ddr: Switch to using DM I2C API
[platform/kernel/u-boot.git] / drivers / ddr / marvell / axp / ddr3_spd.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
15 #if defined(MV88F78X60)
16 #include "ddr3_axp_config.h"
17 #elif defined(MV88F67XX)
18 #include "ddr3_a370_config.h"
19 #endif
20
21 #if defined(MV88F672X)
22 #include "ddr3_a375_config.h"
23 #endif
24
25 #ifdef DUNIT_SPD
26
27 /* DIMM SPD offsets */
28 #define SPD_DEV_TYPE_BYTE               2
29
30 #define SPD_MODULE_TYPE_BYTE            3
31 #define SPD_MODULE_MASK                 0xf
32 #define SPD_MODULE_TYPE_RDIMM           1
33 #define SPD_MODULE_TYPE_UDIMM           2
34
35 #define SPD_DEV_DENSITY_BYTE            4
36 #define SPD_DEV_DENSITY_MASK            0xf
37
38 #define SPD_ROW_NUM_BYTE                5
39 #define SPD_ROW_NUM_MIN                 12
40 #define SPD_ROW_NUM_OFF                 3
41 #define SPD_ROW_NUM_MASK                (7 << SPD_ROW_NUM_OFF)
42
43 #define SPD_COL_NUM_BYTE                5
44 #define SPD_COL_NUM_MIN                 9
45 #define SPD_COL_NUM_OFF                 0
46 #define SPD_COL_NUM_MASK                (7 << SPD_COL_NUM_OFF)
47
48 #define SPD_MODULE_ORG_BYTE             7
49 #define SPD_MODULE_SDRAM_DEV_WIDTH_OFF  0
50 #define SPD_MODULE_SDRAM_DEV_WIDTH_MASK (7 << SPD_MODULE_SDRAM_DEV_WIDTH_OFF)
51 #define SPD_MODULE_BANK_NUM_MIN         1
52 #define SPD_MODULE_BANK_NUM_OFF         3
53 #define SPD_MODULE_BANK_NUM_MASK        (7 << SPD_MODULE_BANK_NUM_OFF)
54
55 #define SPD_BUS_WIDTH_BYTE              8
56 #define SPD_BUS_WIDTH_OFF               0
57 #define SPD_BUS_WIDTH_MASK              (7 << SPD_BUS_WIDTH_OFF)
58 #define SPD_BUS_ECC_OFF                 3
59 #define SPD_BUS_ECC_MASK                (3 << SPD_BUS_ECC_OFF)
60
61 #define SPD_MTB_DIVIDEND_BYTE           10
62 #define SPD_MTB_DIVISOR_BYTE            11
63 #define SPD_TCK_BYTE                    12
64 #define SPD_SUP_CAS_LAT_LSB_BYTE        14
65 #define SPD_SUP_CAS_LAT_MSB_BYTE        15
66 #define SPD_TAA_BYTE                    16
67 #define SPD_TWR_BYTE                    17
68 #define SPD_TRCD_BYTE                   18
69 #define SPD_TRRD_BYTE                   19
70 #define SPD_TRP_BYTE                    20
71
72 #define SPD_TRAS_MSB_BYTE               21
73 #define SPD_TRAS_MSB_MASK               0xf
74
75 #define SPD_TRC_MSB_BYTE                21
76 #define SPD_TRC_MSB_MASK                0xf0
77
78 #define SPD_TRAS_LSB_BYTE               22
79 #define SPD_TRC_LSB_BYTE                23
80 #define SPD_TRFC_LSB_BYTE               24
81 #define SPD_TRFC_MSB_BYTE               25
82 #define SPD_TWTR_BYTE                   26
83 #define SPD_TRTP_BYTE                   27
84
85 #define SPD_TFAW_MSB_BYTE               28
86 #define SPD_TFAW_MSB_MASK               0xf
87
88 #define SPD_TFAW_LSB_BYTE               29
89 #define SPD_OPT_FEATURES_BYTE           30
90 #define SPD_THERMAL_REFRESH_OPT_BYTE    31
91
92 #define SPD_ADDR_MAP_BYTE               63
93 #define SPD_ADDR_MAP_MIRROR_OFFS        0
94
95 #define SPD_RDIMM_RC_BYTE               69
96 #define SPD_RDIMM_RC_NIBBLE_MASK        0xF
97 #define SPD_RDIMM_RC_NUM                16
98
99 /* Dimm Memory Type values */
100 #define SPD_MEM_TYPE_SDRAM              0x4
101 #define SPD_MEM_TYPE_DDR1               0x7
102 #define SPD_MEM_TYPE_DDR2               0x8
103 #define SPD_MEM_TYPE_DDR3               0xB
104
105 #define DIMM_MODULE_MANU_OFFS           64
106 #define DIMM_MODULE_MANU_SIZE           8
107 #define DIMM_MODULE_VEN_OFFS            73
108 #define DIMM_MODULE_VEN_SIZE            25
109 #define DIMM_MODULE_ID_OFFS             99
110 #define DIMM_MODULE_ID_SIZE             18
111
112 /* enumeration for voltage levels. */
113 enum dimm_volt_if {
114         TTL_5V_TOLERANT,
115         LVTTL,
116         HSTL_1_5V,
117         SSTL_3_3V,
118         SSTL_2_5V,
119         VOLTAGE_UNKNOWN,
120 };
121
122 /* enumaration for SDRAM CAS Latencies. */
123 enum dimm_sdram_cas {
124         SD_CL_1 = 1,
125         SD_CL_2,
126         SD_CL_3,
127         SD_CL_4,
128         SD_CL_5,
129         SD_CL_6,
130         SD_CL_7,
131         SD_FAULT
132 };
133
134 /* enumeration for memory types */
135 enum memory_type {
136         MEM_TYPE_SDRAM,
137         MEM_TYPE_DDR1,
138         MEM_TYPE_DDR2,
139         MEM_TYPE_DDR3
140 };
141
142 /* DIMM information structure */
143 typedef struct dimm_info {
144         /* DIMM dimensions */
145         u32 num_of_module_ranks;
146         u32 data_width;
147         u32 rank_capacity;
148         u32 num_of_devices;
149
150         u32 sdram_width;
151         u32 num_of_banks_on_each_device;
152         u32 sdram_capacity;
153
154         u32 num_of_row_addr;
155         u32 num_of_col_addr;
156
157         u32 addr_mirroring;
158
159         u32 err_check_type;                     /* ECC , PARITY.. */
160         u32 type_info;                          /* DDR2 only */
161
162         /* DIMM timing parameters */
163         u32 supported_cas_latencies;
164         u32 refresh_interval;
165         u32 min_cycle_time;
166         u32 min_row_precharge_time;
167         u32 min_row_active_to_row_active;
168         u32 min_ras_to_cas_delay;
169         u32 min_write_recovery_time;            /* DDR3/2 only */
170         u32 min_write_to_read_cmd_delay;        /* DDR3/2 only */
171         u32 min_read_to_prech_cmd_delay;        /* DDR3/2 only */
172         u32 min_active_to_precharge;
173         u32 min_refresh_recovery;               /* DDR3/2 only */
174         u32 min_cas_lat_time;
175         u32 min_four_active_win_delay;
176         u8 dimm_rc[SPD_RDIMM_RC_NUM];
177
178         /* DIMM vendor ID */
179         u32 vendor;
180 } MV_DIMM_INFO;
181
182 static int ddr3_spd_sum_init(MV_DIMM_INFO *info, MV_DIMM_INFO *sum_info,
183                              u32 dimm);
184 static u32 ddr3_get_max_val(u32 spd_val, u32 dimm_num, u32 static_val);
185 static u32 ddr3_get_min_val(u32 spd_val, u32 dimm_num, u32 static_val);
186 static int ddr3_spd_init(MV_DIMM_INFO *info, u32 dimm_addr, u32 dimm_width);
187 static u32 ddr3_div(u32 val, u32 divider, u32 sub);
188
189 extern u8 spd_data[SPD_SIZE];
190 extern u32 odt_config[ODT_OPT];
191 extern u16 odt_static[ODT_OPT][MAX_CS];
192 extern u16 odt_dynamic[ODT_OPT][MAX_CS];
193
194 #if !(defined(DB_88F6710) || defined(DB_88F6710_PCAC) || defined(RD_88F6710))
195 /*
196  * Name:     ddr3_get_dimm_num - Find number of dimms and their addresses
197  * Desc:
198  * Args:     dimm_addr - array of dimm addresses
199  * Notes:
200  * Returns:  None.
201  */
202 static u32 ddr3_get_dimm_num(u32 *dimm_addr)
203 {
204         u32 dimm_cur_addr;
205         u8 data[3];
206         u32 dimm_num = 0;
207         int ret;
208
209         /* Read the dimm eeprom */
210         for (dimm_cur_addr = MAX_DIMM_ADDR; dimm_cur_addr > MIN_DIMM_ADDR;
211              dimm_cur_addr--) {
212                 struct udevice *udev;
213
214                 data[SPD_DEV_TYPE_BYTE] = 0;
215
216                 /* Far-End DIMM must be connected */
217                 if ((dimm_num == 0) && (dimm_cur_addr < FAR_END_DIMM_ADDR))
218                         return 0;
219
220                 ret = i2c_get_chip_for_busnum(0, dimm_cur_addr, 1, &udev);
221                 if (ret)
222                         continue;
223
224                 ret = dm_i2c_read(udev, 0, data, 3);
225                 if (!ret) {
226                         if (data[SPD_DEV_TYPE_BYTE] == SPD_MEM_TYPE_DDR3) {
227                                 dimm_addr[dimm_num] = dimm_cur_addr;
228                                 dimm_num++;
229                         }
230                 }
231         }
232
233         return dimm_num;
234 }
235 #endif
236
237 /*
238  * Name:     dimmSpdInit - Get the SPD parameters.
239  * Desc:     Read the DIMM SPD parameters into given struct parameter.
240  * Args:     dimmNum - DIMM number. See MV_BOARD_DIMM_NUM enumerator.
241  *           info - DIMM information structure.
242  * Notes:
243  * Returns:  MV_OK if function could read DIMM parameters, 0 otherwise.
244  */
245 int ddr3_spd_init(MV_DIMM_INFO *info, u32 dimm_addr, u32 dimm_width)
246 {
247         u32 tmp;
248         u32 time_base;
249         int ret;
250         __maybe_unused u32 rc;
251         __maybe_unused u8 vendor_high, vendor_low;
252
253         if (dimm_addr != 0) {
254                 struct udevice *udev;
255
256                 memset(spd_data, 0, SPD_SIZE * sizeof(u8));
257
258                 ret = i2c_get_chip_for_busnum(0, dimm_addr, 1, &udev);
259                 if (ret)
260                         return MV_DDR3_TRAINING_ERR_TWSI_FAIL;
261
262                 ret = dm_i2c_read(udev, 0, spd_data, SPD_SIZE);
263                 if (ret)
264                         return MV_DDR3_TRAINING_ERR_TWSI_FAIL;
265         }
266
267         /* Check if DDR3 */
268         if (spd_data[SPD_DEV_TYPE_BYTE] != SPD_MEM_TYPE_DDR3)
269                 return MV_DDR3_TRAINING_ERR_TWSI_BAD_TYPE;
270
271         /* Error Check Type */
272         /* No byte for error check in DDR3 SPD, use DDR2 convention */
273         info->err_check_type = 0;
274
275         /* Check if ECC */
276         if ((spd_data[SPD_BUS_WIDTH_BYTE] & 0x18) >> 3)
277                 info->err_check_type = 1;
278
279         DEBUG_INIT_FULL_C("DRAM err_check_type ", info->err_check_type, 1);
280         switch (spd_data[SPD_MODULE_TYPE_BYTE]) {
281         case 1:
282                 /* support RDIMM */
283                 info->type_info = SPD_MODULE_TYPE_RDIMM;
284                 break;
285         case 2:
286                 /* support UDIMM */
287                 info->type_info = SPD_MODULE_TYPE_UDIMM;
288                 break;
289         case 11:                /* LRDIMM current not supported */
290         default:
291                 info->type_info = (spd_data[SPD_MODULE_TYPE_BYTE]);
292                 break;
293         }
294
295         /* Size Calculations: */
296
297         /* Number Of Row Addresses - 12/13/14/15/16 */
298         info->num_of_row_addr =
299                 (spd_data[SPD_ROW_NUM_BYTE] & SPD_ROW_NUM_MASK) >>
300                 SPD_ROW_NUM_OFF;
301         info->num_of_row_addr += SPD_ROW_NUM_MIN;
302         DEBUG_INIT_FULL_C("DRAM num_of_row_addr ", info->num_of_row_addr, 2);
303
304         /* Number Of Column Addresses - 9/10/11/12 */
305         info->num_of_col_addr =
306                 (spd_data[SPD_COL_NUM_BYTE] & SPD_COL_NUM_MASK) >>
307                 SPD_COL_NUM_OFF;
308         info->num_of_col_addr += SPD_COL_NUM_MIN;
309         DEBUG_INIT_FULL_C("DRAM num_of_col_addr ", info->num_of_col_addr, 1);
310
311         /* Number Of Ranks = number of CS on Dimm - 1/2/3/4 Ranks */
312         info->num_of_module_ranks =
313                 (spd_data[SPD_MODULE_ORG_BYTE] & SPD_MODULE_BANK_NUM_MASK) >>
314                 SPD_MODULE_BANK_NUM_OFF;
315         info->num_of_module_ranks += SPD_MODULE_BANK_NUM_MIN;
316         DEBUG_INIT_FULL_C("DRAM numOfModuleBanks ", info->num_of_module_ranks,
317                           1);
318
319         /* Data Width - 8/16/32/64 bits */
320         info->data_width =
321                 1 << (3 + (spd_data[SPD_BUS_WIDTH_BYTE] & SPD_BUS_WIDTH_MASK));
322         DEBUG_INIT_FULL_C("DRAM data_width ", info->data_width, 1);
323
324         /* Number Of Banks On Each Device - 8/16/32/64 banks */
325         info->num_of_banks_on_each_device =
326                 1 << (3 + ((spd_data[SPD_DEV_DENSITY_BYTE] >> 4) & 0x7));
327         DEBUG_INIT_FULL_C("DRAM num_of_banks_on_each_device ",
328                           info->num_of_banks_on_each_device, 1);
329
330         /* Total SDRAM capacity - 256Mb/512Mb/1Gb/2Gb/4Gb/8Gb/16Gb - MegaBits */
331         info->sdram_capacity =
332                 spd_data[SPD_DEV_DENSITY_BYTE] & SPD_DEV_DENSITY_MASK;
333
334         /* Sdram Width - 4/8/16/32 bits */
335         info->sdram_width = 1 << (2 + (spd_data[SPD_MODULE_ORG_BYTE] &
336                                        SPD_MODULE_SDRAM_DEV_WIDTH_MASK));
337         DEBUG_INIT_FULL_C("DRAM sdram_width ", info->sdram_width, 1);
338
339         /* CS (Rank) Capacity - MB */
340         /*
341          * DDR3 device uiDensity val are: (device capacity/8) *
342          * (Module_width/Device_width)
343          */
344         /* Jedec SPD DDR3 - page 7, Save spd_data in Mb  - 2048=2GB */
345         if (dimm_width == 32) {
346                 info->rank_capacity =
347                         ((1 << info->sdram_capacity) * 256 *
348                          (info->data_width / info->sdram_width)) << 16;
349                 /* CS size = CS size / 2  */
350         } else {
351                 info->rank_capacity =
352                         ((1 << info->sdram_capacity) * 256 *
353                          (info->data_width / info->sdram_width) * 0x2) << 16;
354                 /* 0x2 =>  0x100000-1Mbit / 8-bit->byte / 0x10000  */
355         }
356         DEBUG_INIT_FULL_C("DRAM rank_capacity[31] ", info->rank_capacity, 1);
357
358         /* Number of devices includeing Error correction */
359         info->num_of_devices =
360                 ((info->data_width / info->sdram_width) *
361                  info->num_of_module_ranks) + info->err_check_type;
362         DEBUG_INIT_FULL_C("DRAM num_of_devices  ", info->num_of_devices, 1);
363
364         /* Address Mapping from Edge connector to DRAM - mirroring option */
365         info->addr_mirroring =
366                 spd_data[SPD_ADDR_MAP_BYTE] & (1 << SPD_ADDR_MAP_MIRROR_OFFS);
367
368         /* Timings - All in ps */
369
370         time_base = (1000 * spd_data[SPD_MTB_DIVIDEND_BYTE]) /
371                 spd_data[SPD_MTB_DIVISOR_BYTE];
372
373         /* Minimum Cycle Time At Max CasLatancy */
374         info->min_cycle_time = spd_data[SPD_TCK_BYTE] * time_base;
375         DEBUG_INIT_FULL_C("DRAM tCKmin ", info->min_cycle_time, 1);
376
377         /* Refresh Interval */
378         /* No byte for refresh interval in DDR3 SPD, use DDR2 convention */
379         /*
380          * JEDEC param are 0 <= Tcase <= 85: 7.8uSec, 85 <= Tcase
381          * <= 95: 3.9uSec
382          */
383         info->refresh_interval = 7800000;       /* Set to 7.8uSec */
384         DEBUG_INIT_FULL_C("DRAM refresh_interval ", info->refresh_interval, 1);
385
386         /* Suported Cas Latencies -  DDR 3: */
387
388         /*
389          *         bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 *
390          *******-******-******-******-******-******-******-*******-*******
391          CAS =      11  |  10  |  9   |  8   |  7   |  6   |  5   |  4   *
392          *********************************************************-*******
393          *******-******-******-******-******-******-******-*******-*******
394          *        bit15 |bit14 |bit13 |bit12 |bit11 |bit10 | bit9 | bit8 *
395          *******-******-******-******-******-******-******-*******-*******
396          CAS =     TBD  |  18  |  17  |  16  |  15  |  14  |  13  |  12  *
397         */
398
399         /* DDR3 include 2 byte of CAS support */
400         info->supported_cas_latencies =
401                 (spd_data[SPD_SUP_CAS_LAT_MSB_BYTE] << 8) |
402                 spd_data[SPD_SUP_CAS_LAT_LSB_BYTE];
403         DEBUG_INIT_FULL_C("DRAM supported_cas_latencies ",
404                           info->supported_cas_latencies, 1);
405
406         /* Minimum Cycle Time At Max CasLatancy */
407         info->min_cas_lat_time = (spd_data[SPD_TAA_BYTE] * time_base);
408         /*
409          * This field divided by the cycleTime will give us the CAS latency
410          * to config
411          */
412
413         /*
414          * For DDR3 and DDR2 includes Write Recovery Time field.
415          * Other SDRAM ignore
416          */
417         info->min_write_recovery_time = spd_data[SPD_TWR_BYTE] * time_base;
418         DEBUG_INIT_FULL_C("DRAM min_write_recovery_time ",
419                           info->min_write_recovery_time, 1);
420
421         /* Mininmum Ras to Cas Delay */
422         info->min_ras_to_cas_delay = spd_data[SPD_TRCD_BYTE] * time_base;
423         DEBUG_INIT_FULL_C("DRAM min_ras_to_cas_delay ",
424                           info->min_ras_to_cas_delay, 1);
425
426         /* Minimum Row Active to Row Active Time */
427         info->min_row_active_to_row_active =
428             spd_data[SPD_TRRD_BYTE] * time_base;
429         DEBUG_INIT_FULL_C("DRAM min_row_active_to_row_active ",
430                           info->min_row_active_to_row_active, 1);
431
432         /* Minimum Row Precharge Delay Time */
433         info->min_row_precharge_time = spd_data[SPD_TRP_BYTE] * time_base;
434         DEBUG_INIT_FULL_C("DRAM min_row_precharge_time ",
435                           info->min_row_precharge_time, 1);
436
437         /* Minimum Active to Precharge Delay Time - tRAS   ps */
438         info->min_active_to_precharge =
439                 (spd_data[SPD_TRAS_MSB_BYTE] & SPD_TRAS_MSB_MASK) << 8;
440         info->min_active_to_precharge |= spd_data[SPD_TRAS_LSB_BYTE];
441         info->min_active_to_precharge *= time_base;
442         DEBUG_INIT_FULL_C("DRAM min_active_to_precharge ",
443                           info->min_active_to_precharge, 1);
444
445         /* Minimum Refresh Recovery Delay Time - tRFC  ps */
446         info->min_refresh_recovery = spd_data[SPD_TRFC_MSB_BYTE] << 8;
447         info->min_refresh_recovery |= spd_data[SPD_TRFC_LSB_BYTE];
448         info->min_refresh_recovery *= time_base;
449         DEBUG_INIT_FULL_C("DRAM min_refresh_recovery ",
450                           info->min_refresh_recovery, 1);
451
452         /*
453          * For DDR3 and DDR2 includes Internal Write To Read Command Delay
454          * field.
455          */
456         info->min_write_to_read_cmd_delay = spd_data[SPD_TWTR_BYTE] * time_base;
457         DEBUG_INIT_FULL_C("DRAM min_write_to_read_cmd_delay ",
458                           info->min_write_to_read_cmd_delay, 1);
459
460         /*
461          * For DDR3 and DDR2 includes Internal Read To Precharge Command Delay
462          * field.
463          */
464         info->min_read_to_prech_cmd_delay = spd_data[SPD_TRTP_BYTE] * time_base;
465         DEBUG_INIT_FULL_C("DRAM min_read_to_prech_cmd_delay ",
466                           info->min_read_to_prech_cmd_delay, 1);
467
468         /*
469          * For DDR3 includes Minimum Activate to Activate/Refresh Command
470          * field
471          */
472         tmp = ((spd_data[SPD_TFAW_MSB_BYTE] & SPD_TFAW_MSB_MASK) << 8) |
473                 spd_data[SPD_TFAW_LSB_BYTE];
474         info->min_four_active_win_delay = tmp * time_base;
475         DEBUG_INIT_FULL_C("DRAM min_four_active_win_delay ",
476                           info->min_four_active_win_delay, 1);
477
478 #if defined(MV88F78X60) || defined(MV88F672X)
479         /* Registered DIMM support */
480         if (info->type_info == SPD_MODULE_TYPE_RDIMM) {
481                 for (rc = 2; rc < 6; rc += 2) {
482                         tmp = spd_data[SPD_RDIMM_RC_BYTE + rc / 2];
483                         info->dimm_rc[rc] =
484                                 spd_data[SPD_RDIMM_RC_BYTE + rc / 2] &
485                                 SPD_RDIMM_RC_NIBBLE_MASK;
486                         info->dimm_rc[rc + 1] =
487                                 (spd_data[SPD_RDIMM_RC_BYTE + rc / 2] >> 4) &
488                                 SPD_RDIMM_RC_NIBBLE_MASK;
489                 }
490
491                 vendor_low = spd_data[66];
492                 vendor_high = spd_data[65];
493                 info->vendor = (vendor_high << 8) + vendor_low;
494                 DEBUG_INIT_C("DDR3 Training Sequence - Registered DIMM vendor ID 0x",
495                              info->vendor, 4);
496
497                 info->dimm_rc[0] = RDIMM_RC0;
498                 info->dimm_rc[1] = RDIMM_RC1;
499                 info->dimm_rc[2] = RDIMM_RC2;
500                 info->dimm_rc[8] = RDIMM_RC8;
501                 info->dimm_rc[9] = RDIMM_RC9;
502                 info->dimm_rc[10] = RDIMM_RC10;
503                 info->dimm_rc[11] = RDIMM_RC11;
504         }
505 #endif
506
507         return MV_OK;
508 }
509
510 /*
511  * Name:     ddr3_spd_sum_init - Get the SPD parameters.
512  * Desc:     Read the DIMM SPD parameters into given struct parameter.
513  * Args:     dimmNum - DIMM number. See MV_BOARD_DIMM_NUM enumerator.
514  *           info - DIMM information structure.
515  * Notes:
516  * Returns:  MV_OK if function could read DIMM parameters, 0 otherwise.
517  */
518 int ddr3_spd_sum_init(MV_DIMM_INFO *info, MV_DIMM_INFO *sum_info, u32 dimm)
519 {
520         if (dimm == 0) {
521                 memcpy(sum_info, info, sizeof(MV_DIMM_INFO));
522                 return MV_OK;
523         }
524         if (sum_info->type_info != info->type_info) {
525                 DEBUG_INIT_S("DDR3 Dimm Compare - DIMM type does not match - FAIL\n");
526                 return MV_DDR3_TRAINING_ERR_DIMM_TYPE_NO_MATCH;
527         }
528         if (sum_info->err_check_type > info->err_check_type) {
529                 sum_info->err_check_type = info->err_check_type;
530                 DEBUG_INIT_S("DDR3 Dimm Compare - ECC does not match. ECC is disabled\n");
531         }
532         if (sum_info->data_width != info->data_width) {
533                 DEBUG_INIT_S("DDR3 Dimm Compare - DRAM bus width does not match - FAIL\n");
534                 return MV_DDR3_TRAINING_ERR_BUS_WIDTH_NOT_MATCH;
535         }
536         if (sum_info->min_cycle_time < info->min_cycle_time)
537                 sum_info->min_cycle_time = info->min_cycle_time;
538         if (sum_info->refresh_interval < info->refresh_interval)
539                 sum_info->refresh_interval = info->refresh_interval;
540         sum_info->supported_cas_latencies &= info->supported_cas_latencies;
541         if (sum_info->min_cas_lat_time < info->min_cas_lat_time)
542                 sum_info->min_cas_lat_time = info->min_cas_lat_time;
543         if (sum_info->min_write_recovery_time < info->min_write_recovery_time)
544                 sum_info->min_write_recovery_time =
545                     info->min_write_recovery_time;
546         if (sum_info->min_ras_to_cas_delay < info->min_ras_to_cas_delay)
547                 sum_info->min_ras_to_cas_delay = info->min_ras_to_cas_delay;
548         if (sum_info->min_row_active_to_row_active <
549             info->min_row_active_to_row_active)
550                 sum_info->min_row_active_to_row_active =
551                     info->min_row_active_to_row_active;
552         if (sum_info->min_row_precharge_time < info->min_row_precharge_time)
553                 sum_info->min_row_precharge_time = info->min_row_precharge_time;
554         if (sum_info->min_active_to_precharge < info->min_active_to_precharge)
555                 sum_info->min_active_to_precharge =
556                     info->min_active_to_precharge;
557         if (sum_info->min_refresh_recovery < info->min_refresh_recovery)
558                 sum_info->min_refresh_recovery = info->min_refresh_recovery;
559         if (sum_info->min_write_to_read_cmd_delay <
560             info->min_write_to_read_cmd_delay)
561                 sum_info->min_write_to_read_cmd_delay =
562                     info->min_write_to_read_cmd_delay;
563         if (sum_info->min_read_to_prech_cmd_delay <
564             info->min_read_to_prech_cmd_delay)
565                 sum_info->min_read_to_prech_cmd_delay =
566                     info->min_read_to_prech_cmd_delay;
567         if (sum_info->min_four_active_win_delay <
568             info->min_four_active_win_delay)
569                 sum_info->min_four_active_win_delay =
570                     info->min_four_active_win_delay;
571         if (sum_info->min_write_to_read_cmd_delay <
572             info->min_write_to_read_cmd_delay)
573                 sum_info->min_write_to_read_cmd_delay =
574                         info->min_write_to_read_cmd_delay;
575
576         return MV_OK;
577 }
578
579 /*
580  * Name:     ddr3_dunit_setup
581  * Desc:     Set the controller with the timing values.
582  * Args:     ecc_ena - User ECC setup
583  * Notes:
584  * Returns:
585  */
586 int ddr3_dunit_setup(u32 ecc_ena, u32 hclk_time, u32 *ddr_width)
587 {
588         u32 reg, tmp, cwl;
589         u32 ddr_clk_time;
590         MV_DIMM_INFO dimm_info[2];
591         MV_DIMM_INFO sum_info;
592         u32 stat_val, spd_val;
593         u32 cs, cl, cs_num, cs_ena;
594         u32 dimm_num = 0;
595         int status;
596         u32 rc;
597         __maybe_unused u32 dimm_cnt, cs_count, dimm;
598         __maybe_unused u32 dimm_addr[2] = { 0, 0 };
599
600 #if defined(DB_88F6710) || defined(DB_88F6710_PCAC) || defined(RD_88F6710)
601         /* Armada 370 - SPD is not available on DIMM */
602         /*
603          * Set MC registers according to Static SPD values Values -
604          * must be set manually
605          */
606         /*
607          * We only have one optional DIMM for the DB and we already got the
608          * SPD matching values
609          */
610         status = ddr3_spd_init(&dimm_info[0], 0, *ddr_width);
611         if (MV_OK != status)
612                 return status;
613
614         dimm_num = 1;
615         /* Use JP8 to enable multiCS support for Armada 370 DB */
616         if (!ddr3_check_config(EEPROM_MODULE_ADDR, CONFIG_MULTI_CS))
617                 dimm_info[0].num_of_module_ranks = 1;
618         status = ddr3_spd_sum_init(&dimm_info[0], &sum_info, 0);
619         if (MV_OK != status)
620                 return status;
621 #else
622         /* Dynamic D-Unit Setup - Read SPD values */
623 #ifdef DUNIT_SPD
624         dimm_num = ddr3_get_dimm_num(dimm_addr);
625         if (dimm_num == 0) {
626 #ifdef MIXED_DIMM_STATIC
627                 DEBUG_INIT_S("DDR3 Training Sequence - No DIMMs detected\n");
628 #else
629                 DEBUG_INIT_S("DDR3 Training Sequence - FAILED (Wrong DIMMs Setup)\n");
630                 return MV_DDR3_TRAINING_ERR_BAD_DIMM_SETUP;
631 #endif
632         } else {
633                 DEBUG_INIT_C("DDR3 Training Sequence - Number of DIMMs detected: ",
634                              dimm_num, 1);
635         }
636
637         for (dimm = 0; dimm < dimm_num; dimm++) {
638                 status = ddr3_spd_init(&dimm_info[dimm], dimm_addr[dimm],
639                                        *ddr_width);
640                 if (MV_OK != status)
641                         return status;
642                 status = ddr3_spd_sum_init(&dimm_info[dimm], &sum_info, dimm);
643                 if (MV_OK != status)
644                         return status;
645         }
646 #endif
647 #endif
648
649         /* Set number of enabled CS */
650         cs_num = 0;
651 #ifdef DUNIT_STATIC
652         cs_num = ddr3_get_cs_num_from_reg();
653 #endif
654 #ifdef DUNIT_SPD
655         for (dimm = 0; dimm < dimm_num; dimm++)
656                 cs_num += dimm_info[dimm].num_of_module_ranks;
657 #endif
658         if (cs_num > MAX_CS) {
659                 DEBUG_INIT_C("DDR3 Training Sequence - Number of CS exceed limit -  ",
660                              MAX_CS, 1);
661                 return MV_DDR3_TRAINING_ERR_MAX_CS_LIMIT;
662         }
663
664         /* Set bitmap of enabled CS */
665         cs_ena = 0;
666 #ifdef DUNIT_STATIC
667         cs_ena = ddr3_get_cs_ena_from_reg();
668 #endif
669 #ifdef DUNIT_SPD
670         dimm = 0;
671
672         if (dimm_num) {
673                 for (cs = 0; cs < MAX_CS; cs += 2) {
674                         if (((1 << cs) & DIMM_CS_BITMAP) &&
675                             !(cs_ena & (1 << cs))) {
676                                 if (dimm_info[dimm].num_of_module_ranks == 1)
677                                         cs_ena |= (0x1 << cs);
678                                 else if (dimm_info[dimm].num_of_module_ranks == 2)
679                                         cs_ena |= (0x3 << cs);
680                                 else if (dimm_info[dimm].num_of_module_ranks == 3)
681                                         cs_ena |= (0x7 << cs);
682                                 else if (dimm_info[dimm].num_of_module_ranks == 4)
683                                         cs_ena |= (0xF << cs);
684
685                                 dimm++;
686                                 if (dimm == dimm_num)
687                                         break;
688                         }
689                 }
690         }
691 #endif
692
693         if (cs_ena > 0xF) {
694                 DEBUG_INIT_C("DDR3 Training Sequence - Number of enabled CS exceed limit -  ",
695                              MAX_CS, 1);
696                 return MV_DDR3_TRAINING_ERR_MAX_ENA_CS_LIMIT;
697         }
698
699         DEBUG_INIT_FULL_C("DDR3 - DUNIT-SET - Number of CS = ", cs_num, 1);
700
701         /* Check Ratio - '1' - 2:1, '0' - 1:1 */
702         if (reg_read(REG_DDR_IO_ADDR) & (1 << REG_DDR_IO_CLK_RATIO_OFFS))
703                 ddr_clk_time = hclk_time / 2;
704         else
705                 ddr_clk_time = hclk_time;
706
707 #ifdef DUNIT_STATIC
708         /* Get target CL value from set register */
709         reg = (reg_read(REG_DDR3_MR0_ADDR) >> 2);
710         reg = ((((reg >> 1) & 0xE)) | (reg & 0x1)) & 0xF;
711
712         cl = ddr3_get_max_val(ddr3_div(sum_info.min_cas_lat_time,
713                                        ddr_clk_time, 0),
714                               dimm_num, ddr3_valid_cl_to_cl(reg));
715 #else
716         cl = ddr3_div(sum_info.min_cas_lat_time, ddr_clk_time, 0);
717 #endif
718         if (cl < 5)
719                 cl = 5;
720
721         DEBUG_INIT_FULL_C("DDR3 - DUNIT-SET - Cas Latency = ", cl, 1);
722
723         /* {0x00001400} -   DDR SDRAM Configuration Register */
724         reg = 0x73004000;
725         stat_val = ddr3_get_static_mc_value(
726                 REG_SDRAM_CONFIG_ADDR, REG_SDRAM_CONFIG_ECC_OFFS, 0x1, 0, 0);
727         if (ecc_ena && ddr3_get_min_val(sum_info.err_check_type, dimm_num,
728                                         stat_val)) {
729                 reg |= (1 << REG_SDRAM_CONFIG_ECC_OFFS);
730                 reg |= (1 << REG_SDRAM_CONFIG_IERR_OFFS);
731                 DEBUG_INIT_FULL_S("DDR3 - DUNIT-SET - ECC Enabled\n");
732         } else {
733                 DEBUG_INIT_FULL_S("DDR3 - DUNIT-SET - ECC Disabled\n");
734         }
735
736         if (sum_info.type_info == SPD_MODULE_TYPE_RDIMM) {
737 #ifdef DUNIT_STATIC
738                 DEBUG_INIT_S("DDR3 Training Sequence - FAIL - Illegal R-DIMM setup\n");
739                 return MV_DDR3_TRAINING_ERR_BAD_R_DIMM_SETUP;
740 #endif
741                 reg |= (1 << REG_SDRAM_CONFIG_REGDIMM_OFFS);
742                 DEBUG_INIT_FULL_S("DDR3 - DUNIT-SET - R-DIMM\n");
743         } else {
744                 DEBUG_INIT_FULL_S("DDR3 - DUNIT-SET - U-DIMM\n");
745         }
746
747 #ifndef MV88F67XX
748 #ifdef DUNIT_STATIC
749         if (ddr3_get_min_val(sum_info.data_width, dimm_num, BUS_WIDTH) == 64) {
750 #else
751         if (*ddr_width == 64) {
752 #endif
753                 reg |= (1 << REG_SDRAM_CONFIG_WIDTH_OFFS);
754                 DEBUG_INIT_FULL_S("DDR3 - DUNIT-SET - Datawidth - 64Bits\n");
755         } else {
756                 DEBUG_INIT_FULL_S("DDR3 - DUNIT-SET - Datawidth - 32Bits\n");
757         }
758 #else
759         DEBUG_INIT_FULL_S("DDR3 - DUNIT-SET - Datawidth - 16Bits\n");
760 #endif
761
762 #if defined(MV88F672X)
763         if (*ddr_width == 32) {
764                 reg |= (1 << REG_SDRAM_CONFIG_WIDTH_OFFS);
765                 DEBUG_INIT_FULL_S("DDR3 - DUNIT-SET - Datawidth - 32Bits\n");
766         } else {
767                 DEBUG_INIT_FULL_S("DDR3 - DUNIT-SET - Datawidth - 16Bits\n");
768         }
769 #endif
770         stat_val = ddr3_get_static_mc_value(REG_SDRAM_CONFIG_ADDR, 0,
771                                                REG_SDRAM_CONFIG_RFRS_MASK, 0, 0);
772         tmp = ddr3_get_min_val(sum_info.refresh_interval / hclk_time,
773                                dimm_num, stat_val);
774
775 #ifdef TREFI_USER_EN
776         tmp = min(TREFI_USER / hclk_time, tmp);
777 #endif
778
779         DEBUG_INIT_FULL_C("DDR3 - DUNIT-SET - RefreshInterval/Hclk = ", tmp, 4);
780         reg |= tmp;
781
782         if (cl != 3)
783                 reg |= (1 << 16);       /*  If 2:1 need to set P2DWr */
784
785 #if defined(MV88F672X)
786         reg |= (1 << 27);       /* PhyRfRST = Disable */
787 #endif
788         reg_write(REG_SDRAM_CONFIG_ADDR, reg);
789
790         /*{0x00001404}  -   DDR SDRAM Configuration Register */
791         reg = 0x3630B800;
792 #ifdef DUNIT_SPD
793         reg |= (DRAM_2T << REG_DUNIT_CTRL_LOW_2T_OFFS);
794 #endif
795         reg_write(REG_DUNIT_CTRL_LOW_ADDR, reg);
796
797         /* {0x00001408}  -   DDR SDRAM Timing (Low) Register */
798         reg = 0x0;
799
800         /* tRAS - (0:3,20) */
801         spd_val = ddr3_div(sum_info.min_active_to_precharge,
802                             ddr_clk_time, 1);
803         stat_val = ddr3_get_static_mc_value(REG_SDRAM_TIMING_LOW_ADDR,
804                                             0, 0xF, 16, 0x10);
805         tmp = ddr3_get_max_val(spd_val, dimm_num, stat_val);
806         DEBUG_INIT_FULL_C("DDR3 - DUNIT-SET - tRAS-1 = ", tmp, 1);
807         reg |= (tmp & 0xF);
808         reg |= ((tmp & 0x10) << 16);    /* to bit 20 */
809
810         /* tRCD - (4:7) */
811         spd_val = ddr3_div(sum_info.min_ras_to_cas_delay, ddr_clk_time, 1);
812         stat_val = ddr3_get_static_mc_value(REG_SDRAM_TIMING_LOW_ADDR,
813                                             4, 0xF, 0, 0);
814         tmp = ddr3_get_max_val(spd_val, dimm_num, stat_val);
815         DEBUG_INIT_FULL_C("DDR3 - DUNIT-SET - tRCD-1 = ", tmp, 1);
816         reg |= ((tmp & 0xF) << 4);
817
818         /* tRP - (8:11) */
819         spd_val = ddr3_div(sum_info.min_row_precharge_time, ddr_clk_time, 1);
820         stat_val = ddr3_get_static_mc_value(REG_SDRAM_TIMING_LOW_ADDR,
821                                             8, 0xF, 0, 0);
822         tmp = ddr3_get_max_val(spd_val, dimm_num, stat_val);
823         DEBUG_INIT_FULL_C("DDR3 - DUNIT-SET - tRP-1 = ", tmp, 1);
824         reg |= ((tmp & 0xF) << 8);
825
826         /* tWR - (12:15) */
827         spd_val = ddr3_div(sum_info.min_write_recovery_time, ddr_clk_time, 1);
828         stat_val = ddr3_get_static_mc_value(REG_SDRAM_TIMING_LOW_ADDR,
829                                             12, 0xF, 0, 0);
830         tmp = ddr3_get_max_val(spd_val, dimm_num, stat_val);
831         DEBUG_INIT_FULL_C("DDR3 - DUNIT-SET - tWR-1 = ", tmp, 1);
832         reg |= ((tmp & 0xF) << 12);
833
834         /* tWTR - (16:19) */
835         spd_val = ddr3_div(sum_info.min_write_to_read_cmd_delay, ddr_clk_time, 1);
836         stat_val = ddr3_get_static_mc_value(REG_SDRAM_TIMING_LOW_ADDR,
837                                             16, 0xF, 0, 0);
838         tmp = ddr3_get_max_val(spd_val, dimm_num, stat_val);
839         DEBUG_INIT_FULL_C("DDR3 - DUNIT-SET - tWTR-1 = ", tmp, 1);
840         reg |= ((tmp & 0xF) << 16);
841
842         /* tRRD - (24:27) */
843         spd_val = ddr3_div(sum_info.min_row_active_to_row_active, ddr_clk_time, 1);
844         stat_val = ddr3_get_static_mc_value(REG_SDRAM_TIMING_LOW_ADDR,
845                                             24, 0xF, 0, 0);
846         tmp = ddr3_get_max_val(spd_val, dimm_num, stat_val);
847         DEBUG_INIT_FULL_C("DDR3 - DUNIT-SET - tRRD-1 = ", tmp, 1);
848         reg |= ((tmp & 0xF) << 24);
849
850         /* tRTP - (28:31) */
851         spd_val = ddr3_div(sum_info.min_read_to_prech_cmd_delay, ddr_clk_time, 1);
852         stat_val = ddr3_get_static_mc_value(REG_SDRAM_TIMING_LOW_ADDR,
853                                             28, 0xF, 0, 0);
854         tmp = ddr3_get_max_val(spd_val, dimm_num, stat_val);
855         DEBUG_INIT_FULL_C("DDR3 - DUNIT-SET - tRTP-1 = ", tmp, 1);
856         reg |= ((tmp & 0xF) << 28);
857
858         if (cl < 7)
859                 reg = 0x33137663;
860
861         reg_write(REG_SDRAM_TIMING_LOW_ADDR, reg);
862
863         /*{0x0000140C}  -   DDR SDRAM Timing (High) Register */
864         /* Add cycles to R2R W2W */
865         reg = 0x39F8FF80;
866
867         /* tRFC - (0:6,16:18) */
868         spd_val = ddr3_div(sum_info.min_refresh_recovery, ddr_clk_time, 1);
869         stat_val = ddr3_get_static_mc_value(REG_SDRAM_TIMING_HIGH_ADDR,
870                                             0, 0x7F, 9, 0x380);
871         tmp = ddr3_get_max_val(spd_val, dimm_num, stat_val);
872         DEBUG_INIT_FULL_C("DDR3 - DUNIT-SET - tRFC-1 = ", tmp, 1);
873         reg |= (tmp & 0x7F);
874         reg |= ((tmp & 0x380) << 9);    /* to bit 16 */
875         reg_write(REG_SDRAM_TIMING_HIGH_ADDR, reg);
876
877         /*{0x00001410}  -   DDR SDRAM Address Control Register */
878         reg = 0x000F0000;
879
880         /* tFAW - (24:28)  */
881 #if (defined(MV88F78X60) || defined(MV88F672X))
882         tmp = sum_info.min_four_active_win_delay;
883         spd_val = ddr3_div(tmp, ddr_clk_time, 0);
884         stat_val = ddr3_get_static_mc_value(REG_SDRAM_ADDRESS_CTRL_ADDR,
885                                             24, 0x3F, 0, 0);
886         tmp = ddr3_get_max_val(spd_val, dimm_num, stat_val);
887         DEBUG_INIT_FULL_C("DDR3 - DUNIT-SET - tFAW = ", tmp, 1);
888         reg |= ((tmp & 0x3F) << 24);
889 #else
890         tmp = sum_info.min_four_active_win_delay -
891                 4 * (sum_info.min_row_active_to_row_active);
892         spd_val = ddr3_div(tmp, ddr_clk_time, 0);
893         stat_val = ddr3_get_static_mc_value(REG_SDRAM_ADDRESS_CTRL_ADDR,
894                                             24, 0x1F, 0, 0);
895         tmp = ddr3_get_max_val(spd_val, dimm_num, stat_val);
896         DEBUG_INIT_FULL_C("DDR3 - DUNIT-SET - tFAW-4*tRRD = ", tmp, 1);
897         reg |= ((tmp & 0x1F) << 24);
898 #endif
899
900         /* SDRAM device capacity */
901 #ifdef DUNIT_STATIC
902         reg |= (reg_read(REG_SDRAM_ADDRESS_CTRL_ADDR) & 0xF0FFFF);
903 #endif
904
905 #ifdef DUNIT_SPD
906         cs_count = 0;
907         dimm_cnt = 0;
908         for (cs = 0; cs < MAX_CS; cs++) {
909                 if (cs_ena & (1 << cs) & DIMM_CS_BITMAP) {
910                         if (dimm_info[dimm_cnt].num_of_module_ranks == cs_count) {
911                                 dimm_cnt++;
912                                 cs_count = 0;
913                         }
914                         cs_count++;
915                         if (dimm_info[dimm_cnt].sdram_capacity < 0x3) {
916                                 reg |= ((dimm_info[dimm_cnt].sdram_capacity + 1) <<
917                                         (REG_SDRAM_ADDRESS_SIZE_OFFS +
918                                          (REG_SDRAM_ADDRESS_CTRL_STRUCT_OFFS * cs)));
919                         } else if (dimm_info[dimm_cnt].sdram_capacity > 0x3) {
920                                 reg |= ((dimm_info[dimm_cnt].sdram_capacity & 0x3) <<
921                                         (REG_SDRAM_ADDRESS_SIZE_OFFS +
922                                          (REG_SDRAM_ADDRESS_CTRL_STRUCT_OFFS * cs)));
923                                 reg |= ((dimm_info[dimm_cnt].sdram_capacity & 0x4) <<
924                                         (REG_SDRAM_ADDRESS_SIZE_HIGH_OFFS + cs));
925                         }
926                 }
927         }
928
929         /* SDRAM device structure */
930         cs_count = 0;
931         dimm_cnt = 0;
932         for (cs = 0; cs < MAX_CS; cs++) {
933                 if (cs_ena & (1 << cs) & DIMM_CS_BITMAP) {
934                         if (dimm_info[dimm_cnt].num_of_module_ranks == cs_count) {
935                                 dimm_cnt++;
936                                 cs_count = 0;
937                         }
938                         cs_count++;
939                         if (dimm_info[dimm_cnt].sdram_width == 16)
940                                 reg |= (1 << (REG_SDRAM_ADDRESS_CTRL_STRUCT_OFFS * cs));
941                 }
942         }
943 #endif
944         reg_write(REG_SDRAM_ADDRESS_CTRL_ADDR, reg);
945
946         /*{0x00001418}  -   DDR SDRAM Operation Register */
947         reg = 0xF00;
948         for (cs = 0; cs < MAX_CS; cs++) {
949                 if (cs_ena & (1 << cs))
950                         reg &= ~(1 << (cs + REG_SDRAM_OPERATION_CS_OFFS));
951         }
952         reg_write(REG_SDRAM_OPERATION_ADDR, reg);
953
954         /*{0x00001420}  -   DDR SDRAM Extended Mode Register */
955         reg = 0x00000004;
956         reg_write(REG_SDRAM_EXT_MODE_ADDR, reg);
957
958         /*{0x00001424}  -   DDR Controller Control (High) Register */
959 #if (defined(MV88F78X60) || defined(MV88F672X))
960         reg = 0x0000D3FF;
961 #else
962         reg = 0x0100D1FF;
963 #endif
964         reg_write(REG_DDR_CONT_HIGH_ADDR, reg);
965
966         /*{0x0000142C}  -   DDR3 Timing Register */
967         reg = 0x014C2F38;
968 #if defined(MV88F78X60) || defined(MV88F672X)
969         reg = 0x1FEC2F38;
970 #endif
971         reg_write(0x142C, reg);
972
973         /*{0x00001484}  - MBus CPU Block Register */
974 #ifdef MV88F67XX
975         if (reg_read(REG_DDR_IO_ADDR) & (1 << REG_DDR_IO_CLK_RATIO_OFFS))
976                 reg_write(REG_MBUS_CPU_BLOCK_ADDR, 0x0000E907);
977 #endif
978
979         /*
980          * In case of mixed dimm and on-board devices setup paramters will
981          * be taken statically
982          */
983         /*{0x00001494}  -   DDR SDRAM ODT Control (Low) Register */
984         reg = odt_config[cs_ena];
985         reg_write(REG_SDRAM_ODT_CTRL_LOW_ADDR, reg);
986
987         /*{0x00001498}  -   DDR SDRAM ODT Control (High) Register */
988         reg = 0x00000000;
989         reg_write(REG_SDRAM_ODT_CTRL_HIGH_ADDR, reg);
990
991         /*{0x0000149C}  -   DDR Dunit ODT Control Register */
992         reg = cs_ena;
993         reg_write(REG_DUNIT_ODT_CTRL_ADDR, reg);
994
995         /*{0x000014A0}  -   DDR Dunit ODT Control Register */
996 #if defined(MV88F672X)
997         reg = 0x000006A9;
998         reg_write(REG_DRAM_FIFO_CTRL_ADDR, reg);
999 #endif
1000
1001         /*{0x000014C0}  -   DRAM address and Control Driving Strenght */
1002         reg_write(REG_DRAM_ADDR_CTRL_DRIVE_STRENGTH_ADDR, 0x192435e9);
1003
1004         /*{0x000014C4}  -   DRAM Data and DQS Driving Strenght */
1005         reg_write(REG_DRAM_DATA_DQS_DRIVE_STRENGTH_ADDR, 0xB2C35E9);
1006
1007 #if (defined(MV88F78X60) || defined(MV88F672X))
1008         /*{0x000014CC}  -   DRAM Main Pads Calibration Machine Control Register */
1009         reg = reg_read(REG_DRAM_MAIN_PADS_CAL_ADDR);
1010         reg_write(REG_DRAM_MAIN_PADS_CAL_ADDR, reg | (1 << 0));
1011 #endif
1012
1013 #if defined(MV88F672X)
1014         /* DRAM Main Pads Calibration Machine Control Register */
1015         /* 0x14CC[4:3] - CalUpdateControl = IntOnly */
1016         reg = reg_read(REG_DRAM_MAIN_PADS_CAL_ADDR);
1017         reg &= 0xFFFFFFE7;
1018         reg |= (1 << 3);
1019         reg_write(REG_DRAM_MAIN_PADS_CAL_ADDR, reg);
1020 #endif
1021
1022 #ifdef DUNIT_SPD
1023         cs_count = 0;
1024         dimm_cnt = 0;
1025         for (cs = 0; cs < MAX_CS; cs++) {
1026                 if ((1 << cs) & DIMM_CS_BITMAP) {
1027                         if ((1 << cs) & cs_ena) {
1028                                 if (dimm_info[dimm_cnt].num_of_module_ranks ==
1029                                     cs_count) {
1030                                         dimm_cnt++;
1031                                         cs_count = 0;
1032                                 }
1033                                 cs_count++;
1034                                 reg_write(REG_CS_SIZE_SCRATCH_ADDR + (cs * 0x8),
1035                                           dimm_info[dimm_cnt].rank_capacity - 1);
1036                         } else {
1037                                 reg_write(REG_CS_SIZE_SCRATCH_ADDR + (cs * 0x8), 0);
1038                         }
1039                 }
1040         }
1041 #endif
1042
1043         /*{0x00020184}  -   Close FastPath - 2G */
1044         reg_write(REG_FASTPATH_WIN_0_CTRL_ADDR, 0);
1045
1046         /*{0x00001538}  -    Read Data Sample Delays Register */
1047         reg = 0;
1048         for (cs = 0; cs < MAX_CS; cs++) {
1049                 if (cs_ena & (1 << cs))
1050                         reg |= (cl << (REG_READ_DATA_SAMPLE_DELAYS_OFFS * cs));
1051         }
1052
1053         reg_write(REG_READ_DATA_SAMPLE_DELAYS_ADDR, reg);
1054         DEBUG_INIT_FULL_C("DDR3 - SPD-SET - Read Data Sample Delays = ", reg,
1055                           1);
1056
1057         /*{0x0000153C}  -   Read Data Ready Delay Register */
1058         reg = 0;
1059         for (cs = 0; cs < MAX_CS; cs++) {
1060                 if (cs_ena & (1 << cs)) {
1061                         reg |= ((cl + 2) <<
1062                                 (REG_READ_DATA_READY_DELAYS_OFFS * cs));
1063                 }
1064         }
1065         reg_write(REG_READ_DATA_READY_DELAYS_ADDR, reg);
1066         DEBUG_INIT_FULL_C("DDR3 - SPD-SET - Read Data Ready Delays = ", reg, 1);
1067
1068         /* Set MR registers */
1069         /* MR0 */
1070         reg = 0x00000600;
1071         tmp = ddr3_cl_to_valid_cl(cl);
1072         reg |= ((tmp & 0x1) << 2);
1073         reg |= ((tmp & 0xE) << 3);      /* to bit 4 */
1074         for (cs = 0; cs < MAX_CS; cs++) {
1075                 if (cs_ena & (1 << cs)) {
1076                         reg_write(REG_DDR3_MR0_CS_ADDR +
1077                                   (cs << MR_CS_ADDR_OFFS), reg);
1078                 }
1079         }
1080
1081         /* MR1 */
1082         reg = 0x00000044 & REG_DDR3_MR1_ODT_MASK;
1083         if (cs_num > 1)
1084                 reg = 0x00000046 & REG_DDR3_MR1_ODT_MASK;
1085
1086         for (cs = 0; cs < MAX_CS; cs++) {
1087                 if (cs_ena & (1 << cs)) {
1088                         reg |= odt_static[cs_ena][cs];
1089                         reg_write(REG_DDR3_MR1_CS_ADDR +
1090                                   (cs << MR_CS_ADDR_OFFS), reg);
1091                 }
1092         }
1093
1094         /* MR2 */
1095         if (reg_read(REG_DDR_IO_ADDR) & (1 << REG_DDR_IO_CLK_RATIO_OFFS))
1096                 tmp = hclk_time / 2;
1097         else
1098                 tmp = hclk_time;
1099
1100         if (tmp >= 2500)
1101                 cwl = 5;        /* CWL = 5 */
1102         else if (tmp >= 1875 && tmp < 2500)
1103                 cwl = 6;        /* CWL = 6 */
1104         else if (tmp >= 1500 && tmp < 1875)
1105                 cwl = 7;        /* CWL = 7 */
1106         else if (tmp >= 1250 && tmp < 1500)
1107                 cwl = 8;        /* CWL = 8 */
1108         else if (tmp >= 1070 && tmp < 1250)
1109                 cwl = 9;        /* CWL = 9 */
1110         else if (tmp >= 935 && tmp < 1070)
1111                 cwl = 10;       /* CWL = 10 */
1112         else if (tmp >= 833 && tmp < 935)
1113                 cwl = 11;       /* CWL = 11 */
1114         else if (tmp >= 750 && tmp < 833)
1115                 cwl = 12;       /* CWL = 12 */
1116         else {
1117                 cwl = 12;       /* CWL = 12 */
1118                 printf("Unsupported hclk %d MHz\n", tmp);
1119         }
1120
1121         reg = ((cwl - 5) << REG_DDR3_MR2_CWL_OFFS);
1122
1123         for (cs = 0; cs < MAX_CS; cs++) {
1124                 if (cs_ena & (1 << cs)) {
1125                         reg &= REG_DDR3_MR2_ODT_MASK;
1126                         reg |= odt_dynamic[cs_ena][cs];
1127                         reg_write(REG_DDR3_MR2_CS_ADDR +
1128                                   (cs << MR_CS_ADDR_OFFS), reg);
1129                 }
1130         }
1131
1132         /* MR3 */
1133         reg = 0x00000000;
1134         for (cs = 0; cs < MAX_CS; cs++) {
1135                 if (cs_ena & (1 << cs)) {
1136                         reg_write(REG_DDR3_MR3_CS_ADDR +
1137                                   (cs << MR_CS_ADDR_OFFS), reg);
1138                 }
1139         }
1140
1141         /* {0x00001428}  -   DDR ODT Timing (Low) Register */
1142         reg = 0;
1143         reg |= (((cl - cwl + 1) & 0xF) << 4);
1144         reg |= (((cl - cwl + 6) & 0xF) << 8);
1145         reg |= ((((cl - cwl + 6) >> 4) & 0x1) << 21);
1146         reg |= (((cl - 1) & 0xF) << 12);
1147         reg |= (((cl + 6) & 0x1F) << 16);
1148         reg_write(REG_ODT_TIME_LOW_ADDR, reg);
1149
1150         /* {0x0000147C}  -   DDR ODT Timing (High) Register */
1151         reg = 0x00000071;
1152         reg |= ((cwl - 1) << 8);
1153         reg |= ((cwl + 5) << 12);
1154         reg_write(REG_ODT_TIME_HIGH_ADDR, reg);
1155
1156 #ifdef DUNIT_SPD
1157         /*{0x000015E0} - DDR3 Rank Control Register */
1158         reg = cs_ena;
1159         cs_count = 0;
1160         dimm_cnt = 0;
1161         for (cs = 0; cs < MAX_CS; cs++) {
1162                 if (cs_ena & (1 << cs) & DIMM_CS_BITMAP) {
1163                         if (dimm_info[dimm_cnt].num_of_module_ranks == cs_count) {
1164                                 dimm_cnt++;
1165                                 cs_count = 0;
1166                         }
1167                         cs_count++;
1168
1169                         if (dimm_info[dimm_cnt].addr_mirroring &&
1170                             (cs == 1 || cs == 3) &&
1171                             (sum_info.type_info != SPD_MODULE_TYPE_RDIMM)) {
1172                                 reg |= (1 << (REG_DDR3_RANK_CTRL_MIRROR_OFFS + cs));
1173                                 DEBUG_INIT_FULL_C("DDR3 - SPD-SET - Setting Address Mirroring for CS = ",
1174                                                   cs, 1);
1175                         }
1176                 }
1177         }
1178         reg_write(REG_DDR3_RANK_CTRL_ADDR, reg);
1179 #endif
1180
1181         /*{0xD00015E4}  -   ZQDS Configuration Register */
1182         reg = 0x00203c18;
1183         reg_write(REG_ZQC_CONF_ADDR, reg);
1184
1185         /* {0x00015EC}  -   DDR PHY */
1186 #if defined(MV88F78X60)
1187         reg = 0xF800AAA5;
1188         if (mv_ctrl_rev_get() == MV_78XX0_B0_REV)
1189                 reg = 0xF800A225;
1190 #else
1191         reg = 0xDE000025;
1192 #if defined(MV88F672X)
1193         reg = 0xF800A225;
1194 #endif
1195 #endif
1196         reg_write(REG_DRAM_PHY_CONFIG_ADDR, reg);
1197
1198 #if (defined(MV88F78X60) || defined(MV88F672X))
1199         /* Registered DIMM support - supported only in AXP A0 devices */
1200         /* Currently supported for SPD detection only */
1201         /*
1202          * Flow is according to the Registered DIMM chapter in the
1203          * Functional Spec
1204          */
1205         if (sum_info.type_info == SPD_MODULE_TYPE_RDIMM) {
1206                 DEBUG_INIT_S("DDR3 Training Sequence - Registered DIMM detected\n");
1207
1208                 /* Set commands parity completion */
1209                 reg = reg_read(REG_REGISTERED_DRAM_CTRL_ADDR);
1210                 reg &= ~REG_REGISTERED_DRAM_CTRL_PARITY_MASK;
1211                 reg |= 0x8;
1212                 reg_write(REG_REGISTERED_DRAM_CTRL_ADDR, reg);
1213
1214                 /* De-assert M_RESETn and assert M_CKE */
1215                 reg_write(REG_SDRAM_INIT_CTRL_ADDR,
1216                           1 << REG_SDRAM_INIT_CKE_ASSERT_OFFS);
1217                 do {
1218                         reg = (reg_read(REG_SDRAM_INIT_CTRL_ADDR)) &
1219                                 (1 << REG_SDRAM_INIT_CKE_ASSERT_OFFS);
1220                 } while (reg);
1221
1222                 for (rc = 0; rc < SPD_RDIMM_RC_NUM; rc++) {
1223                         if (rc != 6 && rc != 7) {
1224                                 /* Set CWA Command */
1225                                 reg = (REG_SDRAM_OPERATION_CMD_CWA &
1226                                        ~(0xF << REG_SDRAM_OPERATION_CS_OFFS));
1227                                 reg |= ((dimm_info[0].dimm_rc[rc] &
1228                                          REG_SDRAM_OPERATION_CWA_DATA_MASK) <<
1229                                         REG_SDRAM_OPERATION_CWA_DATA_OFFS);
1230                                 reg |= rc << REG_SDRAM_OPERATION_CWA_RC_OFFS;
1231                                 /* Configure - Set Delay - tSTAB/tMRD */
1232                                 if (rc == 2 || rc == 10)
1233                                         reg |= (0x1 << REG_SDRAM_OPERATION_CWA_DELAY_SEL_OFFS);
1234                                 /* 0x1418 - SDRAM Operation Register */
1235                                 reg_write(REG_SDRAM_OPERATION_ADDR, reg);
1236
1237                                 /*
1238                                  * Poll the "cmd" field in the SDRAM OP
1239                                  * register for 0x0
1240                                  */
1241                                 do {
1242                                         reg = reg_read(REG_SDRAM_OPERATION_ADDR) &
1243                                                 (REG_SDRAM_OPERATION_CMD_MASK);
1244                                 } while (reg);
1245                         }
1246                 }
1247         }
1248 #endif
1249
1250         return MV_OK;
1251 }
1252
1253 /*
1254  * Name:     ddr3_div - this function divides integers
1255  * Desc:
1256  * Args:     val - the value
1257  *           divider - the divider
1258  *           sub - substruction value
1259  * Notes:
1260  * Returns:  required value
1261  */
1262 u32 ddr3_div(u32 val, u32 divider, u32 sub)
1263 {
1264         return val / divider + (val % divider > 0 ? 1 : 0) - sub;
1265 }
1266
1267 /*
1268  * Name:     ddr3_get_max_val
1269  * Desc:
1270  * Args:
1271  * Notes:
1272  * Returns:
1273  */
1274 u32 ddr3_get_max_val(u32 spd_val, u32 dimm_num, u32 static_val)
1275 {
1276 #ifdef DUNIT_STATIC
1277         if (dimm_num > 0) {
1278                 if (spd_val >= static_val)
1279                         return spd_val;
1280                 else
1281                         return static_val;
1282         } else {
1283                 return static_val;
1284         }
1285 #else
1286         return spd_val;
1287 #endif
1288 }
1289
1290 /*
1291  * Name:     ddr3_get_min_val
1292  * Desc:
1293  * Args:
1294  * Notes:
1295  * Returns:
1296  */
1297 u32 ddr3_get_min_val(u32 spd_val, u32 dimm_num, u32 static_val)
1298 {
1299 #ifdef DUNIT_STATIC
1300         if (dimm_num > 0) {
1301                 if (spd_val <= static_val)
1302                         return spd_val;
1303                 else
1304                         return static_val;
1305         } else
1306                 return static_val;
1307 #else
1308         return spd_val;
1309 #endif
1310 }
1311 #endif