1
2
3
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
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
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
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
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
135enum memory_type {
136 MEM_TYPE_SDRAM,
137 MEM_TYPE_DDR1,
138 MEM_TYPE_DDR2,
139 MEM_TYPE_DDR3
140};
141
142
143typedef struct dimm_info {
144
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;
160 u32 type_info;
161
162
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;
170 u32 min_write_to_read_cmd_delay;
171 u32 min_read_to_prech_cmd_delay;
172 u32 min_active_to_precharge;
173 u32 min_refresh_recovery;
174 u32 min_cas_lat_time;
175 u32 min_four_active_win_delay;
176 u8 dimm_rc[SPD_RDIMM_RC_NUM];
177
178
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
197
198
199
200
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
210 for (dimm_cur_addr = MAX_DIMM_ADDR; dimm_cur_addr > MIN_DIMM_ADDR;
211 dimm_cur_addr--) {
212 data[SPD_DEV_TYPE_BYTE] = 0;
213
214
215 if ((dimm_num == 0) && (dimm_cur_addr < FAR_END_DIMM_ADDR))
216 return 0;
217
218 ret = i2c_read(dimm_cur_addr, 0, 1, (uchar *)data, 3);
219 if (!ret) {
220 if (data[SPD_DEV_TYPE_BYTE] == SPD_MEM_TYPE_DDR3) {
221 dimm_addr[dimm_num] = dimm_cur_addr;
222 dimm_num++;
223 }
224 }
225 }
226
227 return dimm_num;
228}
229#endif
230
231
232
233
234
235
236
237
238
239int ddr3_spd_init(MV_DIMM_INFO *info, u32 dimm_addr, u32 dimm_width)
240{
241 u32 tmp;
242 u32 time_base;
243 int ret;
244 __maybe_unused u32 rc;
245 __maybe_unused u8 vendor_high, vendor_low;
246
247 if (dimm_addr != 0) {
248 memset(spd_data, 0, SPD_SIZE * sizeof(u8));
249
250 ret = i2c_read(dimm_addr, 0, 1, (uchar *)spd_data, SPD_SIZE);
251 if (ret)
252 return MV_DDR3_TRAINING_ERR_TWSI_FAIL;
253 }
254
255
256 if (spd_data[SPD_DEV_TYPE_BYTE] != SPD_MEM_TYPE_DDR3)
257 return MV_DDR3_TRAINING_ERR_TWSI_BAD_TYPE;
258
259
260
261 info->err_check_type = 0;
262
263
264 if ((spd_data[SPD_BUS_WIDTH_BYTE] & 0x18) >> 3)
265 info->err_check_type = 1;
266
267 DEBUG_INIT_FULL_C("DRAM err_check_type ", info->err_check_type, 1);
268 switch (spd_data[SPD_MODULE_TYPE_BYTE]) {
269 case 1:
270
271 info->type_info = SPD_MODULE_TYPE_RDIMM;
272 break;
273 case 2:
274
275 info->type_info = SPD_MODULE_TYPE_UDIMM;
276 break;
277 case 11:
278 default:
279 info->type_info = (spd_data[SPD_MODULE_TYPE_BYTE]);
280 break;
281 }
282
283
284
285
286 info->num_of_row_addr =
287 (spd_data[SPD_ROW_NUM_BYTE] & SPD_ROW_NUM_MASK) >>
288 SPD_ROW_NUM_OFF;
289 info->num_of_row_addr += SPD_ROW_NUM_MIN;
290 DEBUG_INIT_FULL_C("DRAM num_of_row_addr ", info->num_of_row_addr, 2);
291
292
293 info->num_of_col_addr =
294 (spd_data[SPD_COL_NUM_BYTE] & SPD_COL_NUM_MASK) >>
295 SPD_COL_NUM_OFF;
296 info->num_of_col_addr += SPD_COL_NUM_MIN;
297 DEBUG_INIT_FULL_C("DRAM num_of_col_addr ", info->num_of_col_addr, 1);
298
299
300 info->num_of_module_ranks =
301 (spd_data[SPD_MODULE_ORG_BYTE] & SPD_MODULE_BANK_NUM_MASK) >>
302 SPD_MODULE_BANK_NUM_OFF;
303 info->num_of_module_ranks += SPD_MODULE_BANK_NUM_MIN;
304 DEBUG_INIT_FULL_C("DRAM numOfModuleBanks ", info->num_of_module_ranks,
305 1);
306
307
308 info->data_width =
309 1 << (3 + (spd_data[SPD_BUS_WIDTH_BYTE] & SPD_BUS_WIDTH_MASK));
310 DEBUG_INIT_FULL_C("DRAM data_width ", info->data_width, 1);
311
312
313 info->num_of_banks_on_each_device =
314 1 << (3 + ((spd_data[SPD_DEV_DENSITY_BYTE] >> 4) & 0x7));
315 DEBUG_INIT_FULL_C("DRAM num_of_banks_on_each_device ",
316 info->num_of_banks_on_each_device, 1);
317
318
319 info->sdram_capacity =
320 spd_data[SPD_DEV_DENSITY_BYTE] & SPD_DEV_DENSITY_MASK;
321
322
323 info->sdram_width = 1 << (2 + (spd_data[SPD_MODULE_ORG_BYTE] &
324 SPD_MODULE_SDRAM_DEV_WIDTH_MASK));
325 DEBUG_INIT_FULL_C("DRAM sdram_width ", info->sdram_width, 1);
326
327
328
329
330
331
332
333 if (dimm_width == 32) {
334 info->rank_capacity =
335 ((1 << info->sdram_capacity) * 256 *
336 (info->data_width / info->sdram_width)) << 16;
337
338 } else {
339 info->rank_capacity =
340 ((1 << info->sdram_capacity) * 256 *
341 (info->data_width / info->sdram_width) * 0x2) << 16;
342
343 }
344 DEBUG_INIT_FULL_C("DRAM rank_capacity[31] ", info->rank_capacity, 1);
345
346
347 info->num_of_devices =
348 ((info->data_width / info->sdram_width) *
349 info->num_of_module_ranks) + info->err_check_type;
350 DEBUG_INIT_FULL_C("DRAM num_of_devices ", info->num_of_devices, 1);
351
352
353 info->addr_mirroring =
354 spd_data[SPD_ADDR_MAP_BYTE] & (1 << SPD_ADDR_MAP_MIRROR_OFFS);
355
356
357
358 time_base = (1000 * spd_data[SPD_MTB_DIVIDEND_BYTE]) /
359 spd_data[SPD_MTB_DIVISOR_BYTE];
360
361
362 info->min_cycle_time = spd_data[SPD_TCK_BYTE] * time_base;
363 DEBUG_INIT_FULL_C("DRAM tCKmin ", info->min_cycle_time, 1);
364
365
366
367
368
369
370
371 info->refresh_interval = 7800000;
372 DEBUG_INIT_FULL_C("DRAM refresh_interval ", info->refresh_interval, 1);
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388 info->supported_cas_latencies =
389 (spd_data[SPD_SUP_CAS_LAT_MSB_BYTE] << 8) |
390 spd_data[SPD_SUP_CAS_LAT_LSB_BYTE];
391 DEBUG_INIT_FULL_C("DRAM supported_cas_latencies ",
392 info->supported_cas_latencies, 1);
393
394
395 info->min_cas_lat_time = (spd_data[SPD_TAA_BYTE] * time_base);
396
397
398
399
400
401
402
403
404
405 info->min_write_recovery_time = spd_data[SPD_TWR_BYTE] * time_base;
406 DEBUG_INIT_FULL_C("DRAM min_write_recovery_time ",
407 info->min_write_recovery_time, 1);
408
409
410 info->min_ras_to_cas_delay = spd_data[SPD_TRCD_BYTE] * time_base;
411 DEBUG_INIT_FULL_C("DRAM min_ras_to_cas_delay ",
412 info->min_ras_to_cas_delay, 1);
413
414
415 info->min_row_active_to_row_active =
416 spd_data[SPD_TRRD_BYTE] * time_base;
417 DEBUG_INIT_FULL_C("DRAM min_row_active_to_row_active ",
418 info->min_row_active_to_row_active, 1);
419
420
421 info->min_row_precharge_time = spd_data[SPD_TRP_BYTE] * time_base;
422 DEBUG_INIT_FULL_C("DRAM min_row_precharge_time ",
423 info->min_row_precharge_time, 1);
424
425
426 info->min_active_to_precharge =
427 (spd_data[SPD_TRAS_MSB_BYTE] & SPD_TRAS_MSB_MASK) << 8;
428 info->min_active_to_precharge |= spd_data[SPD_TRAS_LSB_BYTE];
429 info->min_active_to_precharge *= time_base;
430 DEBUG_INIT_FULL_C("DRAM min_active_to_precharge ",
431 info->min_active_to_precharge, 1);
432
433
434 info->min_refresh_recovery = spd_data[SPD_TRFC_MSB_BYTE] << 8;
435 info->min_refresh_recovery |= spd_data[SPD_TRFC_LSB_BYTE];
436 info->min_refresh_recovery *= time_base;
437 DEBUG_INIT_FULL_C("DRAM min_refresh_recovery ",
438 info->min_refresh_recovery, 1);
439
440
441
442
443
444 info->min_write_to_read_cmd_delay = spd_data[SPD_TWTR_BYTE] * time_base;
445 DEBUG_INIT_FULL_C("DRAM min_write_to_read_cmd_delay ",
446 info->min_write_to_read_cmd_delay, 1);
447
448
449
450
451
452 info->min_read_to_prech_cmd_delay = spd_data[SPD_TRTP_BYTE] * time_base;
453 DEBUG_INIT_FULL_C("DRAM min_read_to_prech_cmd_delay ",
454 info->min_read_to_prech_cmd_delay, 1);
455
456
457
458
459
460 tmp = ((spd_data[SPD_TFAW_MSB_BYTE] & SPD_TFAW_MSB_MASK) << 8) |
461 spd_data[SPD_TFAW_LSB_BYTE];
462 info->min_four_active_win_delay = tmp * time_base;
463 DEBUG_INIT_FULL_C("DRAM min_four_active_win_delay ",
464 info->min_four_active_win_delay, 1);
465
466#if defined(MV88F78X60) || defined(MV88F672X)
467
468 if (info->type_info == SPD_MODULE_TYPE_RDIMM) {
469 for (rc = 2; rc < 6; rc += 2) {
470 tmp = spd_data[SPD_RDIMM_RC_BYTE + rc / 2];
471 info->dimm_rc[rc] =
472 spd_data[SPD_RDIMM_RC_BYTE + rc / 2] &
473 SPD_RDIMM_RC_NIBBLE_MASK;
474 info->dimm_rc[rc + 1] =
475 (spd_data[SPD_RDIMM_RC_BYTE + rc / 2] >> 4) &
476 SPD_RDIMM_RC_NIBBLE_MASK;
477 }
478
479 vendor_low = spd_data[66];
480 vendor_high = spd_data[65];
481 info->vendor = (vendor_high << 8) + vendor_low;
482 DEBUG_INIT_C("DDR3 Training Sequence - Registered DIMM vendor ID 0x",
483 info->vendor, 4);
484
485 info->dimm_rc[0] = RDIMM_RC0;
486 info->dimm_rc[1] = RDIMM_RC1;
487 info->dimm_rc[2] = RDIMM_RC2;
488 info->dimm_rc[8] = RDIMM_RC8;
489 info->dimm_rc[9] = RDIMM_RC9;
490 info->dimm_rc[10] = RDIMM_RC10;
491 info->dimm_rc[11] = RDIMM_RC11;
492 }
493#endif
494
495 return MV_OK;
496}
497
498
499
500
501
502
503
504
505
506int ddr3_spd_sum_init(MV_DIMM_INFO *info, MV_DIMM_INFO *sum_info, u32 dimm)
507{
508 if (dimm == 0) {
509 memcpy(sum_info, info, sizeof(MV_DIMM_INFO));
510 return MV_OK;
511 }
512 if (sum_info->type_info != info->type_info) {
513 DEBUG_INIT_S("DDR3 Dimm Compare - DIMM type does not match - FAIL\n");
514 return MV_DDR3_TRAINING_ERR_DIMM_TYPE_NO_MATCH;
515 }
516 if (sum_info->err_check_type > info->err_check_type) {
517 sum_info->err_check_type = info->err_check_type;
518 DEBUG_INIT_S("DDR3 Dimm Compare - ECC does not match. ECC is disabled\n");
519 }
520 if (sum_info->data_width != info->data_width) {
521 DEBUG_INIT_S("DDR3 Dimm Compare - DRAM bus width does not match - FAIL\n");
522 return MV_DDR3_TRAINING_ERR_BUS_WIDTH_NOT_MATCH;
523 }
524 if (sum_info->min_cycle_time < info->min_cycle_time)
525 sum_info->min_cycle_time = info->min_cycle_time;
526 if (sum_info->refresh_interval < info->refresh_interval)
527 sum_info->refresh_interval = info->refresh_interval;
528 sum_info->supported_cas_latencies &= info->supported_cas_latencies;
529 if (sum_info->min_cas_lat_time < info->min_cas_lat_time)
530 sum_info->min_cas_lat_time = info->min_cas_lat_time;
531 if (sum_info->min_write_recovery_time < info->min_write_recovery_time)
532 sum_info->min_write_recovery_time =
533 info->min_write_recovery_time;
534 if (sum_info->min_ras_to_cas_delay < info->min_ras_to_cas_delay)
535 sum_info->min_ras_to_cas_delay = info->min_ras_to_cas_delay;
536 if (sum_info->min_row_active_to_row_active <
537 info->min_row_active_to_row_active)
538 sum_info->min_row_active_to_row_active =
539 info->min_row_active_to_row_active;
540 if (sum_info->min_row_precharge_time < info->min_row_precharge_time)
541 sum_info->min_row_precharge_time = info->min_row_precharge_time;
542 if (sum_info->min_active_to_precharge < info->min_active_to_precharge)
543 sum_info->min_active_to_precharge =
544 info->min_active_to_precharge;
545 if (sum_info->min_refresh_recovery < info->min_refresh_recovery)
546 sum_info->min_refresh_recovery = info->min_refresh_recovery;
547 if (sum_info->min_write_to_read_cmd_delay <
548 info->min_write_to_read_cmd_delay)
549 sum_info->min_write_to_read_cmd_delay =
550 info->min_write_to_read_cmd_delay;
551 if (sum_info->min_read_to_prech_cmd_delay <
552 info->min_read_to_prech_cmd_delay)
553 sum_info->min_read_to_prech_cmd_delay =
554 info->min_read_to_prech_cmd_delay;
555 if (sum_info->min_four_active_win_delay <
556 info->min_four_active_win_delay)
557 sum_info->min_four_active_win_delay =
558 info->min_four_active_win_delay;
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
564 return MV_OK;
565}
566
567
568
569
570
571
572
573
574int ddr3_dunit_setup(u32 ecc_ena, u32 hclk_time, u32 *ddr_width)
575{
576 u32 reg, tmp, cwl;
577 u32 ddr_clk_time;
578 MV_DIMM_INFO dimm_info[2];
579 MV_DIMM_INFO sum_info;
580 u32 stat_val, spd_val;
581 u32 cs, cl, cs_num, cs_ena;
582 u32 dimm_num = 0;
583 int status;
584 u32 rc;
585 __maybe_unused u32 dimm_cnt, cs_count, dimm;
586 __maybe_unused u32 dimm_addr[2] = { 0, 0 };
587
588#if defined(DB_88F6710) || defined(DB_88F6710_PCAC) || defined(RD_88F6710)
589
590
591
592
593
594
595
596
597
598 status = ddr3_spd_init(&dimm_info[0], 0, *ddr_width);
599 if (MV_OK != status)
600 return status;
601
602 dimm_num = 1;
603
604 if (!ddr3_check_config(EEPROM_MODULE_ADDR, CONFIG_MULTI_CS))
605 dimm_info[0].num_of_module_ranks = 1;
606 status = ddr3_spd_sum_init(&dimm_info[0], &sum_info, 0);
607 if (MV_OK != status)
608 return status;
609#else
610
611#ifdef DUNIT_SPD
612 dimm_num = ddr3_get_dimm_num(dimm_addr);
613 if (dimm_num == 0) {
614#ifdef MIXED_DIMM_STATIC
615 DEBUG_INIT_S("DDR3 Training Sequence - No DIMMs detected\n");
616#else
617 DEBUG_INIT_S("DDR3 Training Sequence - FAILED (Wrong DIMMs Setup)\n");
618 return MV_DDR3_TRAINING_ERR_BAD_DIMM_SETUP;
619#endif
620 } else {
621 DEBUG_INIT_C("DDR3 Training Sequence - Number of DIMMs detected: ",
622 dimm_num, 1);
623 }
624
625 for (dimm = 0; dimm < dimm_num; dimm++) {
626 status = ddr3_spd_init(&dimm_info[dimm], dimm_addr[dimm],
627 *ddr_width);
628 if (MV_OK != status)
629 return status;
630 status = ddr3_spd_sum_init(&dimm_info[dimm], &sum_info, dimm);
631 if (MV_OK != status)
632 return status;
633 }
634#endif
635#endif
636
637
638 cs_num = 0;
639#ifdef DUNIT_STATIC
640 cs_num = ddr3_get_cs_num_from_reg();
641#endif
642#ifdef DUNIT_SPD
643 for (dimm = 0; dimm < dimm_num; dimm++)
644 cs_num += dimm_info[dimm].num_of_module_ranks;
645#endif
646 if (cs_num > MAX_CS) {
647 DEBUG_INIT_C("DDR3 Training Sequence - Number of CS exceed limit - ",
648 MAX_CS, 1);
649 return MV_DDR3_TRAINING_ERR_MAX_CS_LIMIT;
650 }
651
652
653 cs_ena = 0;
654#ifdef DUNIT_STATIC
655 cs_ena = ddr3_get_cs_ena_from_reg();
656#endif
657#ifdef DUNIT_SPD
658 dimm = 0;
659
660 if (dimm_num) {
661 for (cs = 0; cs < MAX_CS; cs += 2) {
662 if (((1 << cs) & DIMM_CS_BITMAP) &&
663 !(cs_ena & (1 << cs))) {
664 if (dimm_info[dimm].num_of_module_ranks == 1)
665 cs_ena |= (0x1 << cs);
666 else if (dimm_info[dimm].num_of_module_ranks == 2)
667 cs_ena |= (0x3 << cs);
668 else if (dimm_info[dimm].num_of_module_ranks == 3)
669 cs_ena |= (0x7 << cs);
670 else if (dimm_info[dimm].num_of_module_ranks == 4)
671 cs_ena |= (0xF << cs);
672
673 dimm++;
674 if (dimm == dimm_num)
675 break;
676 }
677 }
678 }
679#endif
680
681 if (cs_ena > 0xF) {
682 DEBUG_INIT_C("DDR3 Training Sequence - Number of enabled CS exceed limit - ",
683 MAX_CS, 1);
684 return MV_DDR3_TRAINING_ERR_MAX_ENA_CS_LIMIT;
685 }
686
687 DEBUG_INIT_FULL_C("DDR3 - DUNIT-SET - Number of CS = ", cs_num, 1);
688
689
690 if (reg_read(REG_DDR_IO_ADDR) & (1 << REG_DDR_IO_CLK_RATIO_OFFS))
691 ddr_clk_time = hclk_time / 2;
692 else
693 ddr_clk_time = hclk_time;
694
695#ifdef DUNIT_STATIC
696
697 reg = (reg_read(REG_DDR3_MR0_ADDR) >> 2);
698 reg = ((((reg >> 1) & 0xE)) | (reg & 0x1)) & 0xF;
699
700 cl = ddr3_get_max_val(ddr3_div(sum_info.min_cas_lat_time,
701 ddr_clk_time, 0),
702 dimm_num, ddr3_valid_cl_to_cl(reg));
703#else
704 cl = ddr3_div(sum_info.min_cas_lat_time, ddr_clk_time, 0);
705#endif
706 if (cl < 5)
707 cl = 5;
708
709 DEBUG_INIT_FULL_C("DDR3 - DUNIT-SET - Cas Latency = ", cl, 1);
710
711
712 reg = 0x73004000;
713 stat_val = ddr3_get_static_mc_value(
714 REG_SDRAM_CONFIG_ADDR, REG_SDRAM_CONFIG_ECC_OFFS, 0x1, 0, 0);
715 if (ecc_ena && ddr3_get_min_val(sum_info.err_check_type, dimm_num,
716 stat_val)) {
717 reg |= (1 << REG_SDRAM_CONFIG_ECC_OFFS);
718 reg |= (1 << REG_SDRAM_CONFIG_IERR_OFFS);
719 DEBUG_INIT_FULL_S("DDR3 - DUNIT-SET - ECC Enabled\n");
720 } else {
721 DEBUG_INIT_FULL_S("DDR3 - DUNIT-SET - ECC Disabled\n");
722 }
723
724 if (sum_info.type_info == SPD_MODULE_TYPE_RDIMM) {
725#ifdef DUNIT_STATIC
726 DEBUG_INIT_S("DDR3 Training Sequence - FAIL - Illegal R-DIMM setup\n");
727 return MV_DDR3_TRAINING_ERR_BAD_R_DIMM_SETUP;
728#endif
729 reg |= (1 << REG_SDRAM_CONFIG_REGDIMM_OFFS);
730 DEBUG_INIT_FULL_S("DDR3 - DUNIT-SET - R-DIMM\n");
731 } else {
732 DEBUG_INIT_FULL_S("DDR3 - DUNIT-SET - U-DIMM\n");
733 }
734
735#ifndef MV88F67XX
736#ifdef DUNIT_STATIC
737 if (ddr3_get_min_val(sum_info.data_width, dimm_num, BUS_WIDTH) == 64) {
738#else
739 if (*ddr_width == 64) {
740#endif
741 reg |= (1 << REG_SDRAM_CONFIG_WIDTH_OFFS);
742 DEBUG_INIT_FULL_S("DDR3 - DUNIT-SET - Datawidth - 64Bits\n");
743 } else {
744 DEBUG_INIT_FULL_S("DDR3 - DUNIT-SET - Datawidth - 32Bits\n");
745 }
746#else
747 DEBUG_INIT_FULL_S("DDR3 - DUNIT-SET - Datawidth - 16Bits\n");
748#endif
749
750#if defined(MV88F672X)
751 if (*ddr_width == 32) {
752 reg |= (1 << REG_SDRAM_CONFIG_WIDTH_OFFS);
753 DEBUG_INIT_FULL_S("DDR3 - DUNIT-SET - Datawidth - 32Bits\n");
754 } else {
755 DEBUG_INIT_FULL_S("DDR3 - DUNIT-SET - Datawidth - 16Bits\n");
756 }
757#endif
758 stat_val = ddr3_get_static_mc_value(REG_SDRAM_CONFIG_ADDR, 0,
759 REG_SDRAM_CONFIG_RFRS_MASK, 0, 0);
760 tmp = ddr3_get_min_val(sum_info.refresh_interval / hclk_time,
761 dimm_num, stat_val);
762
763#ifdef TREFI_USER_EN
764 tmp = min(TREFI_USER / hclk_time, tmp);
765#endif
766
767 DEBUG_INIT_FULL_C("DDR3 - DUNIT-SET - RefreshInterval/Hclk = ", tmp, 4);
768 reg |= tmp;
769
770 if (cl != 3)
771 reg |= (1 << 16);
772
773#if defined(MV88F672X)
774 reg |= (1 << 27);
775#endif
776 reg_write(REG_SDRAM_CONFIG_ADDR, reg);
777
778
779 reg = 0x3630B800;
780#ifdef DUNIT_SPD
781 reg |= (DRAM_2T << REG_DUNIT_CTRL_LOW_2T_OFFS);
782#endif
783 reg_write(REG_DUNIT_CTRL_LOW_ADDR, reg);
784
785
786 reg = 0x0;
787
788
789 spd_val = ddr3_div(sum_info.min_active_to_precharge,
790 ddr_clk_time, 1);
791 stat_val = ddr3_get_static_mc_value(REG_SDRAM_TIMING_LOW_ADDR,
792 0, 0xF, 16, 0x10);
793 tmp = ddr3_get_max_val(spd_val, dimm_num, stat_val);
794 DEBUG_INIT_FULL_C("DDR3 - DUNIT-SET - tRAS-1 = ", tmp, 1);
795 reg |= (tmp & 0xF);
796 reg |= ((tmp & 0x10) << 16);
797
798
799 spd_val = ddr3_div(sum_info.min_ras_to_cas_delay, ddr_clk_time, 1);
800 stat_val = ddr3_get_static_mc_value(REG_SDRAM_TIMING_LOW_ADDR,
801 4, 0xF, 0, 0);
802 tmp = ddr3_get_max_val(spd_val, dimm_num, stat_val);
803 DEBUG_INIT_FULL_C("DDR3 - DUNIT-SET - tRCD-1 = ", tmp, 1);
804 reg |= ((tmp & 0xF) << 4);
805
806
807 spd_val = ddr3_div(sum_info.min_row_precharge_time, ddr_clk_time, 1);
808 stat_val = ddr3_get_static_mc_value(REG_SDRAM_TIMING_LOW_ADDR,
809 8, 0xF, 0, 0);
810 tmp = ddr3_get_max_val(spd_val, dimm_num, stat_val);
811 DEBUG_INIT_FULL_C("DDR3 - DUNIT-SET - tRP-1 = ", tmp, 1);
812 reg |= ((tmp & 0xF) << 8);
813
814
815 spd_val = ddr3_div(sum_info.min_write_recovery_time, ddr_clk_time, 1);
816 stat_val = ddr3_get_static_mc_value(REG_SDRAM_TIMING_LOW_ADDR,
817 12, 0xF, 0, 0);
818 tmp = ddr3_get_max_val(spd_val, dimm_num, stat_val);
819 DEBUG_INIT_FULL_C("DDR3 - DUNIT-SET - tWR-1 = ", tmp, 1);
820 reg |= ((tmp & 0xF) << 12);
821
822
823 spd_val = ddr3_div(sum_info.min_write_to_read_cmd_delay, ddr_clk_time, 1);
824 stat_val = ddr3_get_static_mc_value(REG_SDRAM_TIMING_LOW_ADDR,
825 16, 0xF, 0, 0);
826 tmp = ddr3_get_max_val(spd_val, dimm_num, stat_val);
827 DEBUG_INIT_FULL_C("DDR3 - DUNIT-SET - tWTR-1 = ", tmp, 1);
828 reg |= ((tmp & 0xF) << 16);
829
830
831 spd_val = ddr3_div(sum_info.min_row_active_to_row_active, ddr_clk_time, 1);
832 stat_val = ddr3_get_static_mc_value(REG_SDRAM_TIMING_LOW_ADDR,
833 24, 0xF, 0, 0);
834 tmp = ddr3_get_max_val(spd_val, dimm_num, stat_val);
835 DEBUG_INIT_FULL_C("DDR3 - DUNIT-SET - tRRD-1 = ", tmp, 1);
836 reg |= ((tmp & 0xF) << 24);
837
838
839 spd_val = ddr3_div(sum_info.min_read_to_prech_cmd_delay, ddr_clk_time, 1);
840 stat_val = ddr3_get_static_mc_value(REG_SDRAM_TIMING_LOW_ADDR,
841 28, 0xF, 0, 0);
842 tmp = ddr3_get_max_val(spd_val, dimm_num, stat_val);
843 DEBUG_INIT_FULL_C("DDR3 - DUNIT-SET - tRTP-1 = ", tmp, 1);
844 reg |= ((tmp & 0xF) << 28);
845
846 if (cl < 7)
847 reg = 0x33137663;
848
849 reg_write(REG_SDRAM_TIMING_LOW_ADDR, reg);
850
851
852
853 reg = 0x39F8FF80;
854
855
856 spd_val = ddr3_div(sum_info.min_refresh_recovery, ddr_clk_time, 1);
857 stat_val = ddr3_get_static_mc_value(REG_SDRAM_TIMING_HIGH_ADDR,
858 0, 0x7F, 9, 0x380);
859 tmp = ddr3_get_max_val(spd_val, dimm_num, stat_val);
860 DEBUG_INIT_FULL_C("DDR3 - DUNIT-SET - tRFC-1 = ", tmp, 1);
861 reg |= (tmp & 0x7F);
862 reg |= ((tmp & 0x380) << 9);
863 reg_write(REG_SDRAM_TIMING_HIGH_ADDR, reg);
864
865
866 reg = 0x000F0000;
867
868
869#if (defined(MV88F78X60) || defined(MV88F672X))
870 tmp = sum_info.min_four_active_win_delay;
871 spd_val = ddr3_div(tmp, ddr_clk_time, 0);
872 stat_val = ddr3_get_static_mc_value(REG_SDRAM_ADDRESS_CTRL_ADDR,
873 24, 0x3F, 0, 0);
874 tmp = ddr3_get_max_val(spd_val, dimm_num, stat_val);
875 DEBUG_INIT_FULL_C("DDR3 - DUNIT-SET - tFAW = ", tmp, 1);
876 reg |= ((tmp & 0x3F) << 24);
877#else
878 tmp = sum_info.min_four_active_win_delay -
879 4 * (sum_info.min_row_active_to_row_active);
880 spd_val = ddr3_div(tmp, ddr_clk_time, 0);
881 stat_val = ddr3_get_static_mc_value(REG_SDRAM_ADDRESS_CTRL_ADDR,
882 24, 0x1F, 0, 0);
883 tmp = ddr3_get_max_val(spd_val, dimm_num, stat_val);
884 DEBUG_INIT_FULL_C("DDR3 - DUNIT-SET - tFAW-4*tRRD = ", tmp, 1);
885 reg |= ((tmp & 0x1F) << 24);
886#endif
887
888
889#ifdef DUNIT_STATIC
890 reg |= (reg_read(REG_SDRAM_ADDRESS_CTRL_ADDR) & 0xF0FFFF);
891#endif
892
893#ifdef DUNIT_SPD
894 cs_count = 0;
895 dimm_cnt = 0;
896 for (cs = 0; cs < MAX_CS; cs++) {
897 if (cs_ena & (1 << cs) & DIMM_CS_BITMAP) {
898 if (dimm_info[dimm_cnt].num_of_module_ranks == cs_count) {
899 dimm_cnt++;
900 cs_count = 0;
901 }
902 cs_count++;
903 if (dimm_info[dimm_cnt].sdram_capacity < 0x3) {
904 reg |= ((dimm_info[dimm_cnt].sdram_capacity + 1) <<
905 (REG_SDRAM_ADDRESS_SIZE_OFFS +
906 (REG_SDRAM_ADDRESS_CTRL_STRUCT_OFFS * cs)));
907 } else if (dimm_info[dimm_cnt].sdram_capacity > 0x3) {
908 reg |= ((dimm_info[dimm_cnt].sdram_capacity & 0x3) <<
909 (REG_SDRAM_ADDRESS_SIZE_OFFS +
910 (REG_SDRAM_ADDRESS_CTRL_STRUCT_OFFS * cs)));
911 reg |= ((dimm_info[dimm_cnt].sdram_capacity & 0x4) <<
912 (REG_SDRAM_ADDRESS_SIZE_HIGH_OFFS + cs));
913 }
914 }
915 }
916
917
918 cs_count = 0;
919 dimm_cnt = 0;
920 for (cs = 0; cs < MAX_CS; cs++) {
921 if (cs_ena & (1 << cs) & DIMM_CS_BITMAP) {
922 if (dimm_info[dimm_cnt].num_of_module_ranks == cs_count) {
923 dimm_cnt++;
924 cs_count = 0;
925 }
926 cs_count++;
927 if (dimm_info[dimm_cnt].sdram_width == 16)
928 reg |= (1 << (REG_SDRAM_ADDRESS_CTRL_STRUCT_OFFS * cs));
929 }
930 }
931#endif
932 reg_write(REG_SDRAM_ADDRESS_CTRL_ADDR, reg);
933
934
935 reg = 0xF00;
936 for (cs = 0; cs < MAX_CS; cs++) {
937 if (cs_ena & (1 << cs))
938 reg &= ~(1 << (cs + REG_SDRAM_OPERATION_CS_OFFS));
939 }
940 reg_write(REG_SDRAM_OPERATION_ADDR, reg);
941
942
943 reg = 0x00000004;
944 reg_write(REG_SDRAM_EXT_MODE_ADDR, reg);
945
946
947#if (defined(MV88F78X60) || defined(MV88F672X))
948 reg = 0x0000D3FF;
949#else
950 reg = 0x0100D1FF;
951#endif
952 reg_write(REG_DDR_CONT_HIGH_ADDR, reg);
953
954
955 reg = 0x014C2F38;
956#if defined(MV88F78X60) || defined(MV88F672X)
957 reg = 0x1FEC2F38;
958#endif
959 reg_write(0x142C, reg);
960
961
962#ifdef MV88F67XX
963 if (reg_read(REG_DDR_IO_ADDR) & (1 << REG_DDR_IO_CLK_RATIO_OFFS))
964 reg_write(REG_MBUS_CPU_BLOCK_ADDR, 0x0000E907);
965#endif
966
967
968
969
970
971
972 reg = odt_config[cs_ena];
973 reg_write(REG_SDRAM_ODT_CTRL_LOW_ADDR, reg);
974
975
976 reg = 0x00000000;
977 reg_write(REG_SDRAM_ODT_CTRL_HIGH_ADDR, reg);
978
979
980 reg = cs_ena;
981 reg_write(REG_DUNIT_ODT_CTRL_ADDR, reg);
982
983
984#if defined(MV88F672X)
985 reg = 0x000006A9;
986 reg_write(REG_DRAM_FIFO_CTRL_ADDR, reg);
987#endif
988
989
990 reg_write(REG_DRAM_ADDR_CTRL_DRIVE_STRENGTH_ADDR, 0x192435e9);
991
992
993 reg_write(REG_DRAM_DATA_DQS_DRIVE_STRENGTH_ADDR, 0xB2C35E9);
994
995#if (defined(MV88F78X60) || defined(MV88F672X))
996
997 reg = reg_read(REG_DRAM_MAIN_PADS_CAL_ADDR);
998 reg_write(REG_DRAM_MAIN_PADS_CAL_ADDR, reg | (1 << 0));
999#endif
1000
1001#if defined(MV88F672X)
1002
1003
1004 reg = reg_read(REG_DRAM_MAIN_PADS_CAL_ADDR);
1005 reg &= 0xFFFFFFE7;
1006 reg |= (1 << 3);
1007 reg_write(REG_DRAM_MAIN_PADS_CAL_ADDR, reg);
1008#endif
1009
1010#ifdef DUNIT_SPD
1011 cs_count = 0;
1012 dimm_cnt = 0;
1013 for (cs = 0; cs < MAX_CS; cs++) {
1014 if ((1 << cs) & DIMM_CS_BITMAP) {
1015 if ((1 << cs) & cs_ena) {
1016 if (dimm_info[dimm_cnt].num_of_module_ranks ==
1017 cs_count) {
1018 dimm_cnt++;
1019 cs_count = 0;
1020 }
1021 cs_count++;
1022 reg_write(REG_CS_SIZE_SCRATCH_ADDR + (cs * 0x8),
1023 dimm_info[dimm_cnt].rank_capacity - 1);
1024 } else {
1025 reg_write(REG_CS_SIZE_SCRATCH_ADDR + (cs * 0x8), 0);
1026 }
1027 }
1028 }
1029#endif
1030
1031
1032 reg_write(REG_FASTPATH_WIN_0_CTRL_ADDR, 0);
1033
1034
1035 reg = 0;
1036 for (cs = 0; cs < MAX_CS; cs++) {
1037 if (cs_ena & (1 << cs))
1038 reg |= (cl << (REG_READ_DATA_SAMPLE_DELAYS_OFFS * cs));
1039 }
1040
1041 reg_write(REG_READ_DATA_SAMPLE_DELAYS_ADDR, reg);
1042 DEBUG_INIT_FULL_C("DDR3 - SPD-SET - Read Data Sample Delays = ", reg,
1043 1);
1044
1045
1046 reg = 0;
1047 for (cs = 0; cs < MAX_CS; cs++) {
1048 if (cs_ena & (1 << cs)) {
1049 reg |= ((cl + 2) <<
1050 (REG_READ_DATA_READY_DELAYS_OFFS * cs));
1051 }
1052 }
1053 reg_write(REG_READ_DATA_READY_DELAYS_ADDR, reg);
1054 DEBUG_INIT_FULL_C("DDR3 - SPD-SET - Read Data Ready Delays = ", reg, 1);
1055
1056
1057
1058 reg = 0x00000600;
1059 tmp = ddr3_cl_to_valid_cl(cl);
1060 reg |= ((tmp & 0x1) << 2);
1061 reg |= ((tmp & 0xE) << 3);
1062 for (cs = 0; cs < MAX_CS; cs++) {
1063 if (cs_ena & (1 << cs)) {
1064 reg_write(REG_DDR3_MR0_CS_ADDR +
1065 (cs << MR_CS_ADDR_OFFS), reg);
1066 }
1067 }
1068
1069
1070 reg = 0x00000044 & REG_DDR3_MR1_ODT_MASK;
1071 if (cs_num > 1)
1072 reg = 0x00000046 & REG_DDR3_MR1_ODT_MASK;
1073
1074 for (cs = 0; cs < MAX_CS; cs++) {
1075 if (cs_ena & (1 << cs)) {
1076 reg |= odt_static[cs_ena][cs];
1077 reg_write(REG_DDR3_MR1_CS_ADDR +
1078 (cs << MR_CS_ADDR_OFFS), reg);
1079 }
1080 }
1081
1082
1083 if (reg_read(REG_DDR_IO_ADDR) & (1 << REG_DDR_IO_CLK_RATIO_OFFS))
1084 tmp = hclk_time / 2;
1085 else
1086 tmp = hclk_time;
1087
1088 if (tmp >= 2500)
1089 cwl = 5;
1090 else if (tmp >= 1875 && tmp < 2500)
1091 cwl = 6;
1092 else if (tmp >= 1500 && tmp < 1875)
1093 cwl = 7;
1094 else if (tmp >= 1250 && tmp < 1500)
1095 cwl = 8;
1096 else if (tmp >= 1070 && tmp < 1250)
1097 cwl = 9;
1098 else if (tmp >= 935 && tmp < 1070)
1099 cwl = 10;
1100 else if (tmp >= 833 && tmp < 935)
1101 cwl = 11;
1102 else if (tmp >= 750 && tmp < 833)
1103 cwl = 12;
1104 else {
1105 cwl = 12;
1106 printf("Unsupported hclk %d MHz\n", tmp);
1107 }
1108
1109 reg = ((cwl - 5) << REG_DDR3_MR2_CWL_OFFS);
1110
1111 for (cs = 0; cs < MAX_CS; cs++) {
1112 if (cs_ena & (1 << cs)) {
1113 reg &= REG_DDR3_MR2_ODT_MASK;
1114 reg |= odt_dynamic[cs_ena][cs];
1115 reg_write(REG_DDR3_MR2_CS_ADDR +
1116 (cs << MR_CS_ADDR_OFFS), reg);
1117 }
1118 }
1119
1120
1121 reg = 0x00000000;
1122 for (cs = 0; cs < MAX_CS; cs++) {
1123 if (cs_ena & (1 << cs)) {
1124 reg_write(REG_DDR3_MR3_CS_ADDR +
1125 (cs << MR_CS_ADDR_OFFS), reg);
1126 }
1127 }
1128
1129
1130 reg = 0;
1131 reg |= (((cl - cwl + 1) & 0xF) << 4);
1132 reg |= (((cl - cwl + 6) & 0xF) << 8);
1133 reg |= ((((cl - cwl + 6) >> 4) & 0x1) << 21);
1134 reg |= (((cl - 1) & 0xF) << 12);
1135 reg |= (((cl + 6) & 0x1F) << 16);
1136 reg_write(REG_ODT_TIME_LOW_ADDR, reg);
1137
1138
1139 reg = 0x00000071;
1140 reg |= ((cwl - 1) << 8);
1141 reg |= ((cwl + 5) << 12);
1142 reg_write(REG_ODT_TIME_HIGH_ADDR, reg);
1143
1144#ifdef DUNIT_SPD
1145
1146 reg = cs_ena;
1147 cs_count = 0;
1148 dimm_cnt = 0;
1149 for (cs = 0; cs < MAX_CS; cs++) {
1150 if (cs_ena & (1 << cs) & DIMM_CS_BITMAP) {
1151 if (dimm_info[dimm_cnt].num_of_module_ranks == cs_count) {
1152 dimm_cnt++;
1153 cs_count = 0;
1154 }
1155 cs_count++;
1156
1157 if (dimm_info[dimm_cnt].addr_mirroring &&
1158 (cs == 1 || cs == 3) &&
1159 (sum_info.type_info != SPD_MODULE_TYPE_RDIMM)) {
1160 reg |= (1 << (REG_DDR3_RANK_CTRL_MIRROR_OFFS + cs));
1161 DEBUG_INIT_FULL_C("DDR3 - SPD-SET - Setting Address Mirroring for CS = ",
1162 cs, 1);
1163 }
1164 }
1165 }
1166 reg_write(REG_DDR3_RANK_CTRL_ADDR, reg);
1167#endif
1168
1169
1170 reg = 0x00203c18;
1171 reg_write(REG_ZQC_CONF_ADDR, reg);
1172
1173
1174#if defined(MV88F78X60)
1175 reg = 0xF800AAA5;
1176 if (mv_ctrl_rev_get() == MV_78XX0_B0_REV)
1177 reg = 0xF800A225;
1178#else
1179 reg = 0xDE000025;
1180#if defined(MV88F672X)
1181 reg = 0xF800A225;
1182#endif
1183#endif
1184 reg_write(REG_DRAM_PHY_CONFIG_ADDR, reg);
1185
1186#if (defined(MV88F78X60) || defined(MV88F672X))
1187
1188
1189
1190
1191
1192
1193 if (sum_info.type_info == SPD_MODULE_TYPE_RDIMM) {
1194 DEBUG_INIT_S("DDR3 Training Sequence - Registered DIMM detected\n");
1195
1196
1197 reg = reg_read(REG_REGISTERED_DRAM_CTRL_ADDR);
1198 reg &= ~REG_REGISTERED_DRAM_CTRL_PARITY_MASK;
1199 reg |= 0x8;
1200 reg_write(REG_REGISTERED_DRAM_CTRL_ADDR, reg);
1201
1202
1203 reg_write(REG_SDRAM_INIT_CTRL_ADDR,
1204 1 << REG_SDRAM_INIT_CKE_ASSERT_OFFS);
1205 do {
1206 reg = (reg_read(REG_SDRAM_INIT_CTRL_ADDR)) &
1207 (1 << REG_SDRAM_INIT_CKE_ASSERT_OFFS);
1208 } while (reg);
1209
1210 for (rc = 0; rc < SPD_RDIMM_RC_NUM; rc++) {
1211 if (rc != 6 && rc != 7) {
1212
1213 reg = (REG_SDRAM_OPERATION_CMD_CWA &
1214 ~(0xF << REG_SDRAM_OPERATION_CS_OFFS));
1215 reg |= ((dimm_info[0].dimm_rc[rc] &
1216 REG_SDRAM_OPERATION_CWA_DATA_MASK) <<
1217 REG_SDRAM_OPERATION_CWA_DATA_OFFS);
1218 reg |= rc << REG_SDRAM_OPERATION_CWA_RC_OFFS;
1219
1220 if (rc == 2 || rc == 10)
1221 reg |= (0x1 << REG_SDRAM_OPERATION_CWA_DELAY_SEL_OFFS);
1222
1223 reg_write(REG_SDRAM_OPERATION_ADDR, reg);
1224
1225
1226
1227
1228
1229 do {
1230 reg = reg_read(REG_SDRAM_OPERATION_ADDR) &
1231 (REG_SDRAM_OPERATION_CMD_MASK);
1232 } while (reg);
1233 }
1234 }
1235 }
1236#endif
1237
1238 return MV_OK;
1239}
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250u32 ddr3_div(u32 val, u32 divider, u32 sub)
1251{
1252 return val / divider + (val % divider > 0 ? 1 : 0) - sub;
1253}
1254
1255
1256
1257
1258
1259
1260
1261
1262u32 ddr3_get_max_val(u32 spd_val, u32 dimm_num, u32 static_val)
1263{
1264#ifdef DUNIT_STATIC
1265 if (dimm_num > 0) {
1266 if (spd_val >= static_val)
1267 return spd_val;
1268 else
1269 return static_val;
1270 } else {
1271 return static_val;
1272 }
1273#else
1274 return spd_val;
1275#endif
1276}
1277
1278
1279
1280
1281
1282
1283
1284
1285u32 ddr3_get_min_val(u32 spd_val, u32 dimm_num, u32 static_val)
1286{
1287#ifdef DUNIT_STATIC
1288 if (dimm_num > 0) {
1289 if (spd_val <= static_val)
1290 return spd_val;
1291 else
1292 return static_val;
1293 } else
1294 return static_val;
1295#else
1296 return spd_val;
1297#endif
1298}
1299#endif
1300