1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#include <common.h>
16#include <i2c.h>
17#include <fsl_ddr_sdram.h>
18#include <fsl_ddr.h>
19
20
21
22
23
24
25
26
27
28#ifndef CONFIG_SYS_FSL_DDR_SDRAM_BASE_PHY
29#define CONFIG_SYS_FSL_DDR_SDRAM_BASE_PHY CONFIG_SYS_DDR_SDRAM_BASE
30#endif
31
32#ifdef CONFIG_PPC
33#include <asm/fsl_law.h>
34
35void fsl_ddr_set_lawbar(
36 const common_timing_params_t *memctl_common_params,
37 unsigned int memctl_interleaved,
38 unsigned int ctrl_num);
39#endif
40
41void fsl_ddr_set_intl3r(const unsigned int granule_size);
42#if defined(SPD_EEPROM_ADDRESS) || \
43 defined(SPD_EEPROM_ADDRESS1) || defined(SPD_EEPROM_ADDRESS2) || \
44 defined(SPD_EEPROM_ADDRESS3) || defined(SPD_EEPROM_ADDRESS4)
45#if (CONFIG_NUM_DDR_CONTROLLERS == 1) && (CONFIG_DIMM_SLOTS_PER_CTLR == 1)
46u8 spd_i2c_addr[CONFIG_NUM_DDR_CONTROLLERS][CONFIG_DIMM_SLOTS_PER_CTLR] = {
47 [0][0] = SPD_EEPROM_ADDRESS,
48};
49#elif (CONFIG_NUM_DDR_CONTROLLERS == 1) && (CONFIG_DIMM_SLOTS_PER_CTLR == 2)
50u8 spd_i2c_addr[CONFIG_NUM_DDR_CONTROLLERS][CONFIG_DIMM_SLOTS_PER_CTLR] = {
51 [0][0] = SPD_EEPROM_ADDRESS1,
52 [0][1] = SPD_EEPROM_ADDRESS2,
53};
54#elif (CONFIG_NUM_DDR_CONTROLLERS == 2) && (CONFIG_DIMM_SLOTS_PER_CTLR == 1)
55u8 spd_i2c_addr[CONFIG_NUM_DDR_CONTROLLERS][CONFIG_DIMM_SLOTS_PER_CTLR] = {
56 [0][0] = SPD_EEPROM_ADDRESS1,
57 [1][0] = SPD_EEPROM_ADDRESS2,
58};
59#elif (CONFIG_NUM_DDR_CONTROLLERS == 2) && (CONFIG_DIMM_SLOTS_PER_CTLR == 2)
60u8 spd_i2c_addr[CONFIG_NUM_DDR_CONTROLLERS][CONFIG_DIMM_SLOTS_PER_CTLR] = {
61 [0][0] = SPD_EEPROM_ADDRESS1,
62 [0][1] = SPD_EEPROM_ADDRESS2,
63 [1][0] = SPD_EEPROM_ADDRESS3,
64 [1][1] = SPD_EEPROM_ADDRESS4,
65};
66#elif (CONFIG_NUM_DDR_CONTROLLERS == 3) && (CONFIG_DIMM_SLOTS_PER_CTLR == 1)
67u8 spd_i2c_addr[CONFIG_NUM_DDR_CONTROLLERS][CONFIG_DIMM_SLOTS_PER_CTLR] = {
68 [0][0] = SPD_EEPROM_ADDRESS1,
69 [1][0] = SPD_EEPROM_ADDRESS2,
70 [2][0] = SPD_EEPROM_ADDRESS3,
71};
72#elif (CONFIG_NUM_DDR_CONTROLLERS == 3) && (CONFIG_DIMM_SLOTS_PER_CTLR == 2)
73u8 spd_i2c_addr[CONFIG_NUM_DDR_CONTROLLERS][CONFIG_DIMM_SLOTS_PER_CTLR] = {
74 [0][0] = SPD_EEPROM_ADDRESS1,
75 [0][1] = SPD_EEPROM_ADDRESS2,
76 [1][0] = SPD_EEPROM_ADDRESS3,
77 [1][1] = SPD_EEPROM_ADDRESS4,
78 [2][0] = SPD_EEPROM_ADDRESS5,
79 [2][1] = SPD_EEPROM_ADDRESS6,
80};
81
82#endif
83
84#define SPD_SPA0_ADDRESS 0x36
85#define SPD_SPA1_ADDRESS 0x37
86
87static void __get_spd(generic_spd_eeprom_t *spd, u8 i2c_address)
88{
89 int ret;
90#ifdef CONFIG_SYS_FSL_DDR4
91 uint8_t dummy = 0;
92#endif
93
94 i2c_set_bus_num(CONFIG_SYS_SPD_BUS_NUM);
95
96#ifdef CONFIG_SYS_FSL_DDR4
97
98
99
100
101
102
103 i2c_write(SPD_SPA0_ADDRESS, 0, 1, &dummy, 1);
104 ret = i2c_read(i2c_address, 0, 1, (uchar *)spd, 256);
105 if (!ret) {
106 i2c_write(SPD_SPA1_ADDRESS, 0, 1, &dummy, 1);
107 ret = i2c_read(i2c_address, 0, 1,
108 (uchar *)((ulong)spd + 256),
109 min(256,
110 (int)sizeof(generic_spd_eeprom_t) - 256));
111 }
112#else
113 ret = i2c_read(i2c_address, 0, 1, (uchar *)spd,
114 sizeof(generic_spd_eeprom_t));
115#endif
116
117 if (ret) {
118 if (i2c_address ==
119#ifdef SPD_EEPROM_ADDRESS
120 SPD_EEPROM_ADDRESS
121#elif defined(SPD_EEPROM_ADDRESS1)
122 SPD_EEPROM_ADDRESS1
123#endif
124 ) {
125 printf("DDR: failed to read SPD from address %u\n",
126 i2c_address);
127 } else {
128 debug("DDR: failed to read SPD from address %u\n",
129 i2c_address);
130 }
131 memset(spd, 0, sizeof(generic_spd_eeprom_t));
132 }
133}
134
135__attribute__((weak, alias("__get_spd")))
136void get_spd(generic_spd_eeprom_t *spd, u8 i2c_address);
137
138void fsl_ddr_get_spd(generic_spd_eeprom_t *ctrl_dimms_spd,
139 unsigned int ctrl_num, unsigned int dimm_slots_per_ctrl)
140{
141 unsigned int i;
142 unsigned int i2c_address = 0;
143
144 if (ctrl_num >= CONFIG_NUM_DDR_CONTROLLERS) {
145 printf("%s unexpected ctrl_num = %u\n", __FUNCTION__, ctrl_num);
146 return;
147 }
148
149 for (i = 0; i < dimm_slots_per_ctrl; i++) {
150 i2c_address = spd_i2c_addr[ctrl_num][i];
151 get_spd(&(ctrl_dimms_spd[i]), i2c_address);
152 }
153}
154#else
155void fsl_ddr_get_spd(generic_spd_eeprom_t *ctrl_dimms_spd,
156 unsigned int ctrl_num, unsigned int dimm_slots_per_ctrl)
157{
158}
159#endif
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206const char *step_string_tbl[] = {
207 "STEP_GET_SPD",
208 "STEP_COMPUTE_DIMM_PARMS",
209 "STEP_COMPUTE_COMMON_PARMS",
210 "STEP_GATHER_OPTS",
211 "STEP_ASSIGN_ADDRESSES",
212 "STEP_COMPUTE_REGS",
213 "STEP_PROGRAM_REGS",
214 "STEP_ALL"
215};
216
217const char * step_to_string(unsigned int step) {
218
219 unsigned int s = __ilog2(step);
220
221 if ((1 << s) != step)
222 return step_string_tbl[7];
223
224 if (s >= ARRAY_SIZE(step_string_tbl)) {
225 printf("Error for the step in %s\n", __func__);
226 s = 0;
227 }
228
229 return step_string_tbl[s];
230}
231
232static unsigned long long __step_assign_addresses(fsl_ddr_info_t *pinfo,
233 unsigned int dbw_cap_adj[])
234{
235 unsigned int i, j;
236 unsigned long long total_mem, current_mem_base, total_ctlr_mem;
237 unsigned long long rank_density, ctlr_density = 0;
238 unsigned int first_ctrl = pinfo->first_ctrl;
239 unsigned int last_ctrl = first_ctrl + pinfo->num_ctrls - 1;
240
241
242
243
244
245
246
247 for (i = first_ctrl; i <= last_ctrl; i++) {
248 unsigned int found = 0;
249
250 switch (pinfo->memctl_opts[i].data_bus_width) {
251 case 2:
252
253 for (j = 0; j < CONFIG_DIMM_SLOTS_PER_CTLR; j++) {
254 unsigned int dw;
255 if (!pinfo->dimm_params[i][j].n_ranks)
256 continue;
257 dw = pinfo->dimm_params[i][j].primary_sdram_width;
258 if ((dw == 72 || dw == 64)) {
259 dbw_cap_adj[i] = 2;
260 break;
261 } else if ((dw == 40 || dw == 32)) {
262 dbw_cap_adj[i] = 1;
263 break;
264 }
265 }
266 break;
267
268 case 1:
269
270 for (j = 0; j < CONFIG_DIMM_SLOTS_PER_CTLR; j++) {
271 unsigned int dw;
272 dw = pinfo->dimm_params[i][j].data_width;
273 if (pinfo->dimm_params[i][j].n_ranks
274 && (dw == 72 || dw == 64)) {
275
276
277
278
279
280 found = 1;
281 break;
282 }
283 }
284 if (found) {
285 dbw_cap_adj[i] = 1;
286 }
287 break;
288
289 case 0:
290
291 break;
292
293 default:
294 printf("unexpected data bus width "
295 "specified controller %u\n", i);
296 return 1;
297 }
298 debug("dbw_cap_adj[%d]=%d\n", i, dbw_cap_adj[i]);
299 }
300
301 current_mem_base = pinfo->mem_base;
302 total_mem = 0;
303 if (pinfo->memctl_opts[first_ctrl].memctl_interleaving) {
304 rank_density = pinfo->dimm_params[first_ctrl][0].rank_density >>
305 dbw_cap_adj[first_ctrl];
306 switch (pinfo->memctl_opts[first_ctrl].ba_intlv_ctl &
307 FSL_DDR_CS0_CS1_CS2_CS3) {
308 case FSL_DDR_CS0_CS1_CS2_CS3:
309 ctlr_density = 4 * rank_density;
310 break;
311 case FSL_DDR_CS0_CS1:
312 case FSL_DDR_CS0_CS1_AND_CS2_CS3:
313 ctlr_density = 2 * rank_density;
314 break;
315 case FSL_DDR_CS2_CS3:
316 default:
317 ctlr_density = rank_density;
318 break;
319 }
320 debug("rank density is 0x%llx, ctlr density is 0x%llx\n",
321 rank_density, ctlr_density);
322 for (i = first_ctrl; i <= last_ctrl; i++) {
323 if (pinfo->memctl_opts[i].memctl_interleaving) {
324 switch (pinfo->memctl_opts[i].memctl_interleaving_mode) {
325 case FSL_DDR_256B_INTERLEAVING:
326 case FSL_DDR_CACHE_LINE_INTERLEAVING:
327 case FSL_DDR_PAGE_INTERLEAVING:
328 case FSL_DDR_BANK_INTERLEAVING:
329 case FSL_DDR_SUPERBANK_INTERLEAVING:
330 total_ctlr_mem = 2 * ctlr_density;
331 break;
332 case FSL_DDR_3WAY_1KB_INTERLEAVING:
333 case FSL_DDR_3WAY_4KB_INTERLEAVING:
334 case FSL_DDR_3WAY_8KB_INTERLEAVING:
335 total_ctlr_mem = 3 * ctlr_density;
336 break;
337 case FSL_DDR_4WAY_1KB_INTERLEAVING:
338 case FSL_DDR_4WAY_4KB_INTERLEAVING:
339 case FSL_DDR_4WAY_8KB_INTERLEAVING:
340 total_ctlr_mem = 4 * ctlr_density;
341 break;
342 default:
343 panic("Unknown interleaving mode");
344 }
345 pinfo->common_timing_params[i].base_address =
346 current_mem_base;
347 pinfo->common_timing_params[i].total_mem =
348 total_ctlr_mem;
349 total_mem = current_mem_base + total_ctlr_mem;
350 debug("ctrl %d base 0x%llx\n", i, current_mem_base);
351 debug("ctrl %d total 0x%llx\n", i, total_ctlr_mem);
352 } else {
353
354 current_mem_base = total_mem;
355 total_ctlr_mem = 0;
356 pinfo->common_timing_params[i].base_address =
357 current_mem_base;
358 for (j = 0; j < CONFIG_DIMM_SLOTS_PER_CTLR; j++) {
359 unsigned long long cap =
360 pinfo->dimm_params[i][j].capacity >> dbw_cap_adj[i];
361 pinfo->dimm_params[i][j].base_address =
362 current_mem_base;
363 debug("ctrl %d dimm %d base 0x%llx\n", i, j, current_mem_base);
364 current_mem_base += cap;
365 total_ctlr_mem += cap;
366 }
367 debug("ctrl %d total 0x%llx\n", i, total_ctlr_mem);
368 pinfo->common_timing_params[i].total_mem =
369 total_ctlr_mem;
370 total_mem += total_ctlr_mem;
371 }
372 }
373 } else {
374
375
376
377
378 for (i = first_ctrl; i <= last_ctrl; i++) {
379 total_ctlr_mem = 0;
380 pinfo->common_timing_params[i].base_address =
381 current_mem_base;
382 for (j = 0; j < CONFIG_DIMM_SLOTS_PER_CTLR; j++) {
383
384 unsigned long long cap =
385 pinfo->dimm_params[i][j].capacity >> dbw_cap_adj[i];
386 pinfo->dimm_params[i][j].base_address =
387 current_mem_base;
388 debug("ctrl %d dimm %d base 0x%llx\n", i, j, current_mem_base);
389 current_mem_base += cap;
390 total_ctlr_mem += cap;
391 }
392 debug("ctrl %d total 0x%llx\n", i, total_ctlr_mem);
393 pinfo->common_timing_params[i].total_mem =
394 total_ctlr_mem;
395 total_mem += total_ctlr_mem;
396 }
397 }
398 debug("Total mem by %s is 0x%llx\n", __func__, total_mem);
399
400 return total_mem;
401}
402
403
404__attribute__((weak, alias("__step_assign_addresses")))
405unsigned long long step_assign_addresses(fsl_ddr_info_t *pinfo,
406 unsigned int dbw_cap_adj[]);
407
408unsigned long long
409fsl_ddr_compute(fsl_ddr_info_t *pinfo, unsigned int start_step,
410 unsigned int size_only)
411{
412 unsigned int i, j;
413 unsigned long long total_mem = 0;
414 int assert_reset = 0;
415 unsigned int first_ctrl = pinfo->first_ctrl;
416 unsigned int last_ctrl = first_ctrl + pinfo->num_ctrls - 1;
417 __maybe_unused int retval;
418 __maybe_unused bool goodspd = false;
419 __maybe_unused int dimm_slots_per_ctrl = pinfo->dimm_slots_per_ctrl;
420
421 fsl_ddr_cfg_regs_t *ddr_reg = pinfo->fsl_ddr_config_reg;
422 common_timing_params_t *timing_params = pinfo->common_timing_params;
423 if (pinfo->board_need_mem_reset)
424 assert_reset = pinfo->board_need_mem_reset();
425
426
427 unsigned int dbw_capacity_adjust[CONFIG_NUM_DDR_CONTROLLERS];
428
429 for (i = first_ctrl; i <= last_ctrl; i++)
430 dbw_capacity_adjust[i] = 0;
431
432 debug("starting at step %u (%s)\n",
433 start_step, step_to_string(start_step));
434
435 switch (start_step) {
436 case STEP_GET_SPD:
437#if defined(CONFIG_DDR_SPD) || defined(CONFIG_SPD_EEPROM)
438
439 for (i = first_ctrl; i <= last_ctrl; i++) {
440 fsl_ddr_get_spd(pinfo->spd_installed_dimms[i], i,
441 dimm_slots_per_ctrl);
442 }
443
444 case STEP_COMPUTE_DIMM_PARMS:
445
446
447 for (i = first_ctrl; i <= last_ctrl; i++) {
448 for (j = 0; j < CONFIG_DIMM_SLOTS_PER_CTLR; j++) {
449 generic_spd_eeprom_t *spd =
450 &(pinfo->spd_installed_dimms[i][j]);
451 dimm_params_t *pdimm =
452 &(pinfo->dimm_params[i][j]);
453 retval = compute_dimm_parameters(
454 i, spd, pdimm, j);
455#ifdef CONFIG_SYS_DDR_RAW_TIMING
456 if (!j && retval) {
457 printf("SPD error on controller %d! "
458 "Trying fallback to raw timing "
459 "calculation\n", i);
460 retval = fsl_ddr_get_dimm_params(pdimm,
461 i, j);
462 }
463#else
464 if (retval == 2) {
465 printf("Error: compute_dimm_parameters"
466 " non-zero returned FATAL value "
467 "for memctl=%u dimm=%u\n", i, j);
468 return 0;
469 }
470#endif
471 if (retval) {
472 debug("Warning: compute_dimm_parameters"
473 " non-zero return value for memctl=%u "
474 "dimm=%u\n", i, j);
475 } else {
476 goodspd = true;
477 }
478 }
479 }
480 if (!goodspd) {
481
482
483
484
485
486
487 if (first_ctrl == 0)
488 printf("Error: No valid SPD detected.\n");
489
490 return 0;
491 }
492#elif defined(CONFIG_SYS_DDR_RAW_TIMING)
493 case STEP_COMPUTE_DIMM_PARMS:
494 for (i = first_ctrl; i <= last_ctrl; i++) {
495 for (j = 0; j < CONFIG_DIMM_SLOTS_PER_CTLR; j++) {
496 dimm_params_t *pdimm =
497 &(pinfo->dimm_params[i][j]);
498 fsl_ddr_get_dimm_params(pdimm, i, j);
499 }
500 }
501 debug("Filling dimm parameters from board specific file\n");
502#endif
503 case STEP_COMPUTE_COMMON_PARMS:
504
505
506
507
508 for (i = first_ctrl; i <= last_ctrl; i++) {
509 debug("Computing lowest common DIMM"
510 " parameters for memctl=%u\n", i);
511 compute_lowest_common_dimm_parameters
512 (i,
513 pinfo->dimm_params[i],
514 &timing_params[i],
515 CONFIG_DIMM_SLOTS_PER_CTLR);
516 }
517
518 case STEP_GATHER_OPTS:
519
520 for (i = first_ctrl; i <= last_ctrl; i++) {
521 debug("Reloading memory controller "
522 "configuration options for memctl=%u\n", i);
523
524
525
526
527
528
529 populate_memctl_options(
530 timing_params[i].all_dimms_registered,
531 &pinfo->memctl_opts[i],
532 pinfo->dimm_params[i], i);
533
534
535
536
537
538
539 if (timing_params[i].all_dimms_registered)
540 assert_reset = 1;
541 }
542 if (assert_reset && !size_only) {
543 if (pinfo->board_mem_reset) {
544 debug("Asserting mem reset\n");
545 pinfo->board_mem_reset();
546 } else {
547 debug("Asserting mem reset missing\n");
548 }
549 }
550
551 case STEP_ASSIGN_ADDRESSES:
552
553 check_interleaving_options(pinfo);
554 total_mem = step_assign_addresses(pinfo, dbw_capacity_adjust);
555 debug("Total mem %llu assigned\n", total_mem);
556
557 case STEP_COMPUTE_REGS:
558
559 debug("FSL Memory ctrl register computation\n");
560 for (i = first_ctrl; i <= last_ctrl; i++) {
561 if (timing_params[i].ndimms_present == 0) {
562 memset(&ddr_reg[i], 0,
563 sizeof(fsl_ddr_cfg_regs_t));
564 continue;
565 }
566
567 compute_fsl_memctl_config_regs
568 (i,
569 &pinfo->memctl_opts[i],
570 &ddr_reg[i], &timing_params[i],
571 pinfo->dimm_params[i],
572 dbw_capacity_adjust[i],
573 size_only);
574 }
575
576 default:
577 break;
578 }
579
580 {
581
582
583
584
585
586
587 unsigned int max_end = 0;
588
589 for (i = first_ctrl; i <= last_ctrl; i++) {
590 for (j = 0; j < CONFIG_CHIP_SELECTS_PER_CTRL; j++) {
591 fsl_ddr_cfg_regs_t *reg = &ddr_reg[i];
592 if (reg->cs[j].config & 0x80000000) {
593 unsigned int end;
594
595
596
597
598 if (reg->cs[j].bnds == 0xffffffff)
599 continue;
600 end = reg->cs[j].bnds & 0xffff;
601 if (end > max_end) {
602 max_end = end;
603 }
604 }
605 }
606 }
607
608 total_mem = 1 + (((unsigned long long)max_end << 24ULL) |
609 0xFFFFFFULL) - pinfo->mem_base;
610 }
611
612 return total_mem;
613}
614
615phys_size_t __fsl_ddr_sdram(fsl_ddr_info_t *pinfo)
616{
617 unsigned int i, first_ctrl, last_ctrl;
618#ifdef CONFIG_PPC
619 unsigned int law_memctl = LAW_TRGT_IF_DDR_1;
620#endif
621 unsigned long long total_memory;
622 int deassert_reset = 0;
623
624 first_ctrl = pinfo->first_ctrl;
625 last_ctrl = first_ctrl + pinfo->num_ctrls - 1;
626
627
628#ifdef CONFIG_FSL_DDR_INTERACTIVE
629 if (tstc() && (getc() == 'd')) {
630 total_memory = fsl_ddr_interactive(pinfo, 0);
631 } else if (fsl_ddr_interactive_env_var_exists()) {
632 total_memory = fsl_ddr_interactive(pinfo, 1);
633 } else
634#endif
635 total_memory = fsl_ddr_compute(pinfo, STEP_GET_SPD, 0);
636
637
638 switch (pinfo->memctl_opts[first_ctrl].memctl_interleaving_mode) {
639 case FSL_DDR_3WAY_1KB_INTERLEAVING:
640 case FSL_DDR_3WAY_4KB_INTERLEAVING:
641 case FSL_DDR_3WAY_8KB_INTERLEAVING:
642 fsl_ddr_set_intl3r(
643 pinfo->memctl_opts[first_ctrl].
644 memctl_interleaving_mode);
645 break;
646 default:
647 break;
648 }
649
650
651
652
653
654
655
656
657
658
659
660 if (pinfo->board_need_mem_reset)
661 deassert_reset = pinfo->board_need_mem_reset();
662 for (i = first_ctrl; i <= last_ctrl; i++) {
663 if (pinfo->common_timing_params[i].all_dimms_registered)
664 deassert_reset = 1;
665 }
666 for (i = first_ctrl; i <= last_ctrl; i++) {
667 debug("Programming controller %u\n", i);
668 if (pinfo->common_timing_params[i].ndimms_present == 0) {
669 debug("No dimms present on controller %u; "
670 "skipping programming\n", i);
671 continue;
672 }
673
674
675
676
677 fsl_ddr_set_memctl_regs(&(pinfo->fsl_ddr_config_reg[i]), i,
678 deassert_reset ? 1 : 0);
679 }
680 if (deassert_reset) {
681
682 if (pinfo->board_mem_de_reset) {
683 debug("Deasserting mem reset\n");
684 pinfo->board_mem_de_reset();
685 } else {
686 debug("Deasserting mem reset missing\n");
687 }
688 for (i = first_ctrl; i <= last_ctrl; i++) {
689
690 fsl_ddr_set_memctl_regs(&(pinfo->fsl_ddr_config_reg[i]),
691 i, 2);
692 }
693 }
694
695#ifdef CONFIG_FSL_DDR_SYNC_REFRESH
696 fsl_ddr_sync_memctl_refresh(first_ctrl, last_ctrl);
697#endif
698
699#ifdef CONFIG_PPC
700
701 for (i = first_ctrl; i <= last_ctrl; i++) {
702 if (pinfo->memctl_opts[i].memctl_interleaving) {
703 switch (pinfo->memctl_opts[i].
704 memctl_interleaving_mode) {
705 case FSL_DDR_CACHE_LINE_INTERLEAVING:
706 case FSL_DDR_PAGE_INTERLEAVING:
707 case FSL_DDR_BANK_INTERLEAVING:
708 case FSL_DDR_SUPERBANK_INTERLEAVING:
709 if (i % 2)
710 break;
711 if (i == 0) {
712 law_memctl = LAW_TRGT_IF_DDR_INTRLV;
713 fsl_ddr_set_lawbar(
714 &pinfo->common_timing_params[i],
715 law_memctl, i);
716 }
717#if CONFIG_NUM_DDR_CONTROLLERS > 3
718 else if (i == 2) {
719 law_memctl = LAW_TRGT_IF_DDR_INTLV_34;
720 fsl_ddr_set_lawbar(
721 &pinfo->common_timing_params[i],
722 law_memctl, i);
723 }
724#endif
725 break;
726 case FSL_DDR_3WAY_1KB_INTERLEAVING:
727 case FSL_DDR_3WAY_4KB_INTERLEAVING:
728 case FSL_DDR_3WAY_8KB_INTERLEAVING:
729 law_memctl = LAW_TRGT_IF_DDR_INTLV_123;
730 if (i == 0) {
731 fsl_ddr_set_lawbar(
732 &pinfo->common_timing_params[i],
733 law_memctl, i);
734 }
735 break;
736 case FSL_DDR_4WAY_1KB_INTERLEAVING:
737 case FSL_DDR_4WAY_4KB_INTERLEAVING:
738 case FSL_DDR_4WAY_8KB_INTERLEAVING:
739 law_memctl = LAW_TRGT_IF_DDR_INTLV_1234;
740 if (i == 0)
741 fsl_ddr_set_lawbar(
742 &pinfo->common_timing_params[i],
743 law_memctl, i);
744
745 break;
746 default:
747 break;
748 }
749 } else {
750 switch (i) {
751 case 0:
752 law_memctl = LAW_TRGT_IF_DDR_1;
753 break;
754 case 1:
755 law_memctl = LAW_TRGT_IF_DDR_2;
756 break;
757 case 2:
758 law_memctl = LAW_TRGT_IF_DDR_3;
759 break;
760 case 3:
761 law_memctl = LAW_TRGT_IF_DDR_4;
762 break;
763 default:
764 break;
765 }
766 fsl_ddr_set_lawbar(&pinfo->common_timing_params[i],
767 law_memctl, i);
768 }
769 }
770#endif
771
772 debug("total_memory by %s = %llu\n", __func__, total_memory);
773
774#if !defined(CONFIG_PHYS_64BIT)
775
776 if ((first_ctrl == 0) && (total_memory >= (1ull << 32))) {
777 puts("Detected ");
778 print_size(total_memory, " of memory\n");
779 printf(" This U-Boot only supports < 4G of DDR\n");
780 printf(" You could rebuild it with CONFIG_PHYS_64BIT\n");
781 printf(" ");
782 total_memory = CONFIG_MAX_MEM_MAPPED;
783 }
784#endif
785
786 return total_memory;
787}
788
789
790
791
792
793
794
795phys_size_t fsl_ddr_sdram(void)
796{
797 fsl_ddr_info_t info;
798
799
800 memset(&info, 0, sizeof(fsl_ddr_info_t));
801 info.mem_base = CONFIG_SYS_FSL_DDR_SDRAM_BASE_PHY;
802 info.first_ctrl = 0;
803 info.num_ctrls = CONFIG_SYS_FSL_DDR_MAIN_NUM_CTRLS;
804 info.dimm_slots_per_ctrl = CONFIG_DIMM_SLOTS_PER_CTLR;
805 info.board_need_mem_reset = board_need_mem_reset;
806 info.board_mem_reset = board_assert_mem_reset;
807 info.board_mem_de_reset = board_deassert_mem_reset;
808
809 return __fsl_ddr_sdram(&info);
810}
811
812#ifdef CONFIG_SYS_FSL_OTHER_DDR_NUM_CTRLS
813phys_size_t fsl_other_ddr_sdram(unsigned long long base,
814 unsigned int first_ctrl,
815 unsigned int num_ctrls,
816 unsigned int dimm_slots_per_ctrl,
817 int (*board_need_reset)(void),
818 void (*board_reset)(void),
819 void (*board_de_reset)(void))
820{
821 fsl_ddr_info_t info;
822
823
824 memset(&info, 0, sizeof(fsl_ddr_info_t));
825 info.mem_base = base;
826 info.first_ctrl = first_ctrl;
827 info.num_ctrls = num_ctrls;
828 info.dimm_slots_per_ctrl = dimm_slots_per_ctrl;
829 info.board_need_mem_reset = board_need_reset;
830 info.board_mem_reset = board_reset;
831 info.board_mem_de_reset = board_de_reset;
832
833 return __fsl_ddr_sdram(&info);
834}
835#endif
836
837
838
839
840
841phys_size_t
842fsl_ddr_sdram_size(void)
843{
844 fsl_ddr_info_t info;
845 unsigned long long total_memory = 0;
846
847 memset(&info, 0 , sizeof(fsl_ddr_info_t));
848 info.mem_base = CONFIG_SYS_FSL_DDR_SDRAM_BASE_PHY;
849 info.first_ctrl = 0;
850 info.num_ctrls = CONFIG_SYS_FSL_DDR_MAIN_NUM_CTRLS;
851 info.dimm_slots_per_ctrl = CONFIG_DIMM_SLOTS_PER_CTLR;
852 info.board_need_mem_reset = NULL;
853
854
855 total_memory = fsl_ddr_compute(&info, STEP_GET_SPD, 1);
856
857 return total_memory;
858}
859