blob: 4763403c127886bcbae83a66811b638360418d2c [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0
Stefan Roeseae6223d2015-01-19 11:33:40 +01002/*
3 * Copyright (C) Marvell International Ltd. and its affiliates
Stefan Roeseae6223d2015-01-19 11:33:40 +01004 */
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
Wolfgang Denk62fb2b42021-09-27 17:42:39 +020049#define SPD_MODULE_SDRAM_DEV_WIDTH_OFF 0
Stefan Roeseae6223d2015-01-19 11:33:40 +010050#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. */
113enum 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. */
123enum 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 */
135enum memory_type {
136 MEM_TYPE_SDRAM,
137 MEM_TYPE_DDR1,
138 MEM_TYPE_DDR2,
139 MEM_TYPE_DDR3
140};
141
142/* DIMM information structure */
143typedef 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
182static int ddr3_spd_sum_init(MV_DIMM_INFO *info, MV_DIMM_INFO *sum_info,
183 u32 dimm);
184static u32 ddr3_get_max_val(u32 spd_val, u32 dimm_num, u32 static_val);
185static u32 ddr3_get_min_val(u32 spd_val, u32 dimm_num, u32 static_val);
186static int ddr3_spd_init(MV_DIMM_INFO *info, u32 dimm_addr, u32 dimm_width);
187static u32 ddr3_div(u32 val, u32 divider, u32 sub);
188
189extern u8 spd_data[SPD_SIZE];
190extern u32 odt_config[ODT_OPT];
191extern u16 odt_static[ODT_OPT][MAX_CS];
192extern 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 */
202static 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--) {
Stefan Roese11c66932021-11-18 09:19:38 +0100212 struct udevice *udev;
213
Stefan Roeseae6223d2015-01-19 11:33:40 +0100214 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
Stefan Roese11c66932021-11-18 09:19:38 +0100220 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);
Stefan Roeseae6223d2015-01-19 11:33:40 +0100225 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 */
245int 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) {
Stefan Roese11c66932021-11-18 09:19:38 +0100254 struct udevice *udev;
255
Stefan Roeseae6223d2015-01-19 11:33:40 +0100256 memset(spd_data, 0, SPD_SIZE * sizeof(u8));
257
Stefan Roese11c66932021-11-18 09:19:38 +0100258 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);
Stefan Roeseae6223d2015-01-19 11:33:40 +0100263 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 */
518int 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 */
586int 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 */
1262u32 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 */
1274u32 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 */
1297u32 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