2
* Copyright 2008-2014 Freescale Semiconductor, Inc.
4
* SPDX-License-Identifier: GPL-2.0+
8
* Generic driver for Freescale DDR/DDR2/DDR3 memory controller.
9
* Based on code from spd_sdram.c
10
* Author: James Yang [at freescale.com]
14
#include <fsl_ddr_sdram.h>
17
#include <fsl_immap.h>
20
unsigned int picos_to_mclk(unsigned int picos);
23
* Determine Rtt value.
25
* This should likely be either board or controller specific.
27
* Rtt(nominal) - DDR2:
32
* Rtt(nominal) - DDR3:
40
* FIXME: Apparently 8641 needs a value of 2
41
* FIXME: Old code seys if 667 MHz or higher, use 3 on 8572
43
* FIXME: There was some effort down this line earlier:
46
* for (i = 0; i < CONFIG_CHIP_SELECTS_PER_CTRL/2; i++) {
47
* if (popts->dimmslot[i].num_valid_cs
48
* && (popts->cs_local_opts[2*i].odt_rd_cfg
49
* || popts->cs_local_opts[2*i].odt_wr_cfg)) {
55
static inline int fsl_ddr_get_rtt(void)
59
#if defined(CONFIG_SYS_FSL_DDR1)
61
#elif defined(CONFIG_SYS_FSL_DDR2)
70
#ifdef CONFIG_SYS_FSL_DDR4
72
* compute CAS write latency according to DDR4 spec
73
* CWL = 9 for <= 1600MT/s
81
static inline unsigned int compute_cas_write_latency(void)
84
const unsigned int mclk_ps = get_memory_clk_period_ps();
87
else if (mclk_ps >= 1070)
89
else if (mclk_ps >= 935)
91
else if (mclk_ps >= 833)
93
else if (mclk_ps >= 750)
95
else if (mclk_ps >= 681)
104
* compute the CAS write latency according to DDR3 spec
105
* CWL = 5 if tCK >= 2.5ns
106
* 6 if 2.5ns > tCK >= 1.875ns
107
* 7 if 1.875ns > tCK >= 1.5ns
108
* 8 if 1.5ns > tCK >= 1.25ns
109
* 9 if 1.25ns > tCK >= 1.07ns
110
* 10 if 1.07ns > tCK >= 0.935ns
111
* 11 if 0.935ns > tCK >= 0.833ns
112
* 12 if 0.833ns > tCK >= 0.75ns
114
static inline unsigned int compute_cas_write_latency(void)
117
const unsigned int mclk_ps = get_memory_clk_period_ps();
121
else if (mclk_ps >= 1875)
123
else if (mclk_ps >= 1500)
125
else if (mclk_ps >= 1250)
127
else if (mclk_ps >= 1070)
129
else if (mclk_ps >= 935)
131
else if (mclk_ps >= 833)
133
else if (mclk_ps >= 750)
137
printf("Warning: CWL is out of range\n");
143
/* Chip Select Configuration (CSn_CONFIG) */
144
static void set_csn_config(int dimm_number, int i, fsl_ddr_cfg_regs_t *ddr,
145
const memctl_options_t *popts,
146
const dimm_params_t *dimm_params)
148
unsigned int cs_n_en = 0; /* Chip Select enable */
149
unsigned int intlv_en = 0; /* Memory controller interleave enable */
150
unsigned int intlv_ctl = 0; /* Interleaving control */
151
unsigned int ap_n_en = 0; /* Chip select n auto-precharge enable */
152
unsigned int odt_rd_cfg = 0; /* ODT for reads configuration */
153
unsigned int odt_wr_cfg = 0; /* ODT for writes configuration */
154
unsigned int ba_bits_cs_n = 0; /* Num of bank bits for SDRAM on CSn */
155
unsigned int row_bits_cs_n = 0; /* Num of row bits for SDRAM on CSn */
156
unsigned int col_bits_cs_n = 0; /* Num of ocl bits for SDRAM on CSn */
158
#ifdef CONFIG_SYS_FSL_DDR4
159
unsigned int bg_bits_cs_n = 0; /* Num of bank group bits */
161
unsigned int n_banks_per_sdram_device;
164
/* Compute CS_CONFIG only for existing ranks of each DIMM. */
167
if (dimm_params[dimm_number].n_ranks > 0) {
169
/* These fields only available in CS0_CONFIG */
170
if (!popts->memctl_interleaving)
172
switch (popts->memctl_interleaving_mode) {
173
case FSL_DDR_256B_INTERLEAVING:
174
case FSL_DDR_CACHE_LINE_INTERLEAVING:
175
case FSL_DDR_PAGE_INTERLEAVING:
176
case FSL_DDR_BANK_INTERLEAVING:
177
case FSL_DDR_SUPERBANK_INTERLEAVING:
178
intlv_en = popts->memctl_interleaving;
179
intlv_ctl = popts->memctl_interleaving_mode;
187
if ((dimm_number == 0 && dimm_params[0].n_ranks > 1) || \
188
(dimm_number == 1 && dimm_params[1].n_ranks > 0))
192
if ((dimm_number == 0 && dimm_params[0].n_ranks > 2) || \
193
(dimm_number >= 1 && dimm_params[dimm_number].n_ranks > 0))
197
if ((dimm_number == 0 && dimm_params[0].n_ranks > 3) || \
198
(dimm_number == 1 && dimm_params[1].n_ranks > 1) || \
199
(dimm_number == 3 && dimm_params[3].n_ranks > 0))
207
ap_n_en = popts->cs_local_opts[i].auto_precharge;
208
odt_rd_cfg = popts->cs_local_opts[i].odt_rd_cfg;
209
odt_wr_cfg = popts->cs_local_opts[i].odt_wr_cfg;
210
#ifdef CONFIG_SYS_FSL_DDR4
211
ba_bits_cs_n = dimm_params[dimm_number].bank_addr_bits;
212
bg_bits_cs_n = dimm_params[dimm_number].bank_group_bits;
214
n_banks_per_sdram_device
215
= dimm_params[dimm_number].n_banks_per_sdram_device;
216
ba_bits_cs_n = __ilog2(n_banks_per_sdram_device) - 2;
218
row_bits_cs_n = dimm_params[dimm_number].n_row_addr - 12;
219
col_bits_cs_n = dimm_params[dimm_number].n_col_addr - 8;
221
ddr->cs[i].config = (0
222
| ((cs_n_en & 0x1) << 31)
223
| ((intlv_en & 0x3) << 29)
224
| ((intlv_ctl & 0xf) << 24)
225
| ((ap_n_en & 0x1) << 23)
227
/* XXX: some implementation only have 1 bit starting at left */
228
| ((odt_rd_cfg & 0x7) << 20)
230
/* XXX: Some implementation only have 1 bit starting at left */
231
| ((odt_wr_cfg & 0x7) << 16)
233
| ((ba_bits_cs_n & 0x3) << 14)
234
| ((row_bits_cs_n & 0x7) << 8)
235
#ifdef CONFIG_SYS_FSL_DDR4
236
| ((bg_bits_cs_n & 0x3) << 4)
238
| ((col_bits_cs_n & 0x7) << 0)
240
debug("FSLDDR: cs[%d]_config = 0x%08x\n", i,ddr->cs[i].config);
243
/* Chip Select Configuration 2 (CSn_CONFIG_2) */
245
static void set_csn_config_2(int i, fsl_ddr_cfg_regs_t *ddr)
247
unsigned int pasr_cfg = 0; /* Partial array self refresh config */
249
ddr->cs[i].config_2 = ((pasr_cfg & 7) << 24);
250
debug("FSLDDR: cs[%d]_config_2 = 0x%08x\n", i, ddr->cs[i].config_2);
253
/* -3E = 667 CL5, -25 = CL6 800, -25E = CL5 800 */
255
#if !defined(CONFIG_SYS_FSL_DDR1)
256
static inline int avoid_odt_overlap(const dimm_params_t *dimm_params)
258
#if CONFIG_DIMM_SLOTS_PER_CTLR == 1
259
if (dimm_params[0].n_ranks == 4)
263
#if CONFIG_DIMM_SLOTS_PER_CTLR == 2
264
if ((dimm_params[0].n_ranks == 2) &&
265
(dimm_params[1].n_ranks == 2))
268
#ifdef CONFIG_FSL_DDR_FIRST_SLOT_QUAD_CAPABLE
269
if (dimm_params[0].n_ranks == 4)
277
* DDR SDRAM Timing Configuration 0 (TIMING_CFG_0)
279
* Avoid writing for DDR I. The new PQ38 DDR controller
280
* dreams up non-zero default values to be backwards compatible.
282
static void set_timing_cfg_0(fsl_ddr_cfg_regs_t *ddr,
283
const memctl_options_t *popts,
284
const dimm_params_t *dimm_params)
286
unsigned char trwt_mclk = 0; /* Read-to-write turnaround */
287
unsigned char twrt_mclk = 0; /* Write-to-read turnaround */
288
/* 7.5 ns on -3E; 0 means WL - CL + BL/2 + 1 */
289
unsigned char trrt_mclk = 0; /* Read-to-read turnaround */
290
unsigned char twwt_mclk = 0; /* Write-to-write turnaround */
292
/* Active powerdown exit timing (tXARD and tXARDS). */
293
unsigned char act_pd_exit_mclk;
294
/* Precharge powerdown exit timing (tXP). */
295
unsigned char pre_pd_exit_mclk;
296
/* ODT powerdown exit timing (tAXPD). */
297
unsigned char taxpd_mclk = 0;
298
/* Mode register set cycle time (tMRD). */
299
unsigned char tmrd_mclk;
301
#ifdef CONFIG_SYS_FSL_DDR4
302
/* tXP=max(4nCK, 6ns) */
303
int txp = max((get_memory_clk_period_ps() * 4), 6000); /* unit=ps */
306
act_pd_exit_mclk = picos_to_mclk(txp);
307
pre_pd_exit_mclk = act_pd_exit_mclk;
309
* MRS_CYC = max(tMRD, tMOD)
310
* tMRD = 8nCK, tMOD = max(24nCK, 15ns)
312
tmrd_mclk = max(24, picos_to_mclk(15000));
313
#elif defined(CONFIG_SYS_FSL_DDR3)
315
* (tXARD and tXARDS). Empirical?
316
* The DDR3 spec has not tXARD,
317
* we use the tXP instead of it.
318
* tXP=max(3nCK, 7.5ns) for DDR3.
319
* spec has not the tAXPD, we use
320
* tAXPD=1, need design to confirm.
322
int txp = max((get_memory_clk_period_ps() * 3), 7500); /* unit=ps */
323
unsigned int data_rate = get_ddr_freq(0);
325
/* set the turnaround time */
328
* for single quad-rank DIMM and two dual-rank DIMMs
329
* to avoid ODT overlap
331
if (avoid_odt_overlap(dimm_params)) {
335
/* for faster clock, need more time for data setup */
336
trwt_mclk = (data_rate/1000000 > 1800) ? 2 : 1;
338
if ((data_rate/1000000 > 1150) || (popts->memctl_interleaving))
341
if (popts->dynamic_power == 0) { /* powerdown is not used */
342
act_pd_exit_mclk = 1;
343
pre_pd_exit_mclk = 1;
346
/* act_pd_exit_mclk = tXARD, see above */
347
act_pd_exit_mclk = picos_to_mclk(txp);
348
/* Mode register MR0[A12] is '1' - fast exit */
349
pre_pd_exit_mclk = act_pd_exit_mclk;
352
#else /* CONFIG_SYS_FSL_DDR2 */
354
* (tXARD and tXARDS). Empirical?
359
act_pd_exit_mclk = 2;
360
pre_pd_exit_mclk = 2;
365
if (popts->trwt_override)
366
trwt_mclk = popts->trwt;
368
ddr->timing_cfg_0 = (0
369
| ((trwt_mclk & 0x3) << 30) /* RWT */
370
| ((twrt_mclk & 0x3) << 28) /* WRT */
371
| ((trrt_mclk & 0x3) << 26) /* RRT */
372
| ((twwt_mclk & 0x3) << 24) /* WWT */
373
| ((act_pd_exit_mclk & 0xf) << 20) /* ACT_PD_EXIT */
374
| ((pre_pd_exit_mclk & 0xF) << 16) /* PRE_PD_EXIT */
375
| ((taxpd_mclk & 0xf) << 8) /* ODT_PD_EXIT */
376
| ((tmrd_mclk & 0x1f) << 0) /* MRS_CYC */
378
debug("FSLDDR: timing_cfg_0 = 0x%08x\n", ddr->timing_cfg_0);
380
#endif /* defined(CONFIG_SYS_FSL_DDR2) */
382
/* DDR SDRAM Timing Configuration 3 (TIMING_CFG_3) */
383
static void set_timing_cfg_3(fsl_ddr_cfg_regs_t *ddr,
384
const memctl_options_t *popts,
385
const common_timing_params_t *common_dimm,
386
unsigned int cas_latency,
387
unsigned int additive_latency)
389
/* Extended precharge to activate interval (tRP) */
390
unsigned int ext_pretoact = 0;
391
/* Extended Activate to precharge interval (tRAS) */
392
unsigned int ext_acttopre = 0;
393
/* Extended activate to read/write interval (tRCD) */
394
unsigned int ext_acttorw = 0;
395
/* Extended refresh recovery time (tRFC) */
396
unsigned int ext_refrec;
397
/* Extended MCAS latency from READ cmd */
398
unsigned int ext_caslat = 0;
399
/* Extended additive latency */
400
unsigned int ext_add_lat = 0;
401
/* Extended last data to precharge interval (tWR) */
402
unsigned int ext_wrrec = 0;
404
unsigned int cntl_adj = 0;
406
ext_pretoact = picos_to_mclk(common_dimm->trp_ps) >> 4;
407
ext_acttopre = picos_to_mclk(common_dimm->tras_ps) >> 4;
408
ext_acttorw = picos_to_mclk(common_dimm->trcd_ps) >> 4;
409
ext_caslat = (2 * cas_latency - 1) >> 4;
410
ext_add_lat = additive_latency >> 4;
411
#ifdef CONFIG_SYS_FSL_DDR4
412
ext_refrec = (picos_to_mclk(common_dimm->trfc1_ps) - 8) >> 4;
414
ext_refrec = (picos_to_mclk(common_dimm->trfc_ps) - 8) >> 4;
415
/* ext_wrrec only deals with 16 clock and above, or 14 with OTF */
417
ext_wrrec = (picos_to_mclk(common_dimm->twr_ps) +
418
(popts->otf_burst_chop_en ? 2 : 0)) >> 4;
420
ddr->timing_cfg_3 = (0
421
| ((ext_pretoact & 0x1) << 28)
422
| ((ext_acttopre & 0x3) << 24)
423
| ((ext_acttorw & 0x1) << 22)
424
| ((ext_refrec & 0x1F) << 16)
425
| ((ext_caslat & 0x3) << 12)
426
| ((ext_add_lat & 0x1) << 10)
427
| ((ext_wrrec & 0x1) << 8)
428
| ((cntl_adj & 0x7) << 0)
430
debug("FSLDDR: timing_cfg_3 = 0x%08x\n", ddr->timing_cfg_3);
433
/* DDR SDRAM Timing Configuration 1 (TIMING_CFG_1) */
434
static void set_timing_cfg_1(fsl_ddr_cfg_regs_t *ddr,
435
const memctl_options_t *popts,
436
const common_timing_params_t *common_dimm,
437
unsigned int cas_latency)
439
/* Precharge-to-activate interval (tRP) */
440
unsigned char pretoact_mclk;
441
/* Activate to precharge interval (tRAS) */
442
unsigned char acttopre_mclk;
443
/* Activate to read/write interval (tRCD) */
444
unsigned char acttorw_mclk;
446
unsigned char caslat_ctrl;
447
/* Refresh recovery time (tRFC) ; trfc_low */
448
unsigned char refrec_ctrl;
449
/* Last data to precharge minimum interval (tWR) */
450
unsigned char wrrec_mclk;
451
/* Activate-to-activate interval (tRRD) */
452
unsigned char acttoact_mclk;
453
/* Last write data pair to read command issue interval (tWTR) */
454
unsigned char wrtord_mclk;
455
#ifdef CONFIG_SYS_FSL_DDR4
456
/* DDR4 supports 10, 12, 14, 16, 18, 20, 24 */
457
static const u8 wrrec_table[] = {
464
/* DDR_SDRAM_MODE doesn't support 9,11,13,15 */
465
static const u8 wrrec_table[] = {
466
1, 2, 3, 4, 5, 6, 7, 8, 10, 10, 12, 12, 14, 14, 0, 0};
469
pretoact_mclk = picos_to_mclk(common_dimm->trp_ps);
470
acttopre_mclk = picos_to_mclk(common_dimm->tras_ps);
471
acttorw_mclk = picos_to_mclk(common_dimm->trcd_ps);
474
* Translate CAS Latency to a DDR controller field value:
476
* CAS Lat DDR I DDR II Ctrl
477
* Clocks SPD Bit SPD Bit Value
478
* ------- ------- ------- -----
489
#if defined(CONFIG_SYS_FSL_DDR1)
490
caslat_ctrl = (cas_latency + 1) & 0x07;
491
#elif defined(CONFIG_SYS_FSL_DDR2)
492
caslat_ctrl = 2 * cas_latency - 1;
495
* if the CAS latency more than 8 cycle,
496
* we need set extend bit for it at
497
* TIMING_CFG_3[EXT_CASLAT]
499
if (fsl_ddr_get_version() <= 0x40400)
500
caslat_ctrl = 2 * cas_latency - 1;
502
caslat_ctrl = (cas_latency - 1) << 1;
505
#ifdef CONFIG_SYS_FSL_DDR4
506
refrec_ctrl = picos_to_mclk(common_dimm->trfc1_ps) - 8;
507
wrrec_mclk = picos_to_mclk(common_dimm->twr_ps);
508
acttoact_mclk = max(picos_to_mclk(common_dimm->trrds_ps), 4);
509
wrtord_mclk = max(2, picos_to_mclk(2500));
510
if ((wrrec_mclk < 1) || (wrrec_mclk > 24))
511
printf("Error: WRREC doesn't support %d clocks\n", wrrec_mclk);
513
wrrec_mclk = wrrec_table[wrrec_mclk - 1];
515
refrec_ctrl = picos_to_mclk(common_dimm->trfc_ps) - 8;
516
wrrec_mclk = picos_to_mclk(common_dimm->twr_ps);
517
acttoact_mclk = picos_to_mclk(common_dimm->trrd_ps);
518
wrtord_mclk = picos_to_mclk(common_dimm->twtr_ps);
519
if ((wrrec_mclk < 1) || (wrrec_mclk > 16))
520
printf("Error: WRREC doesn't support %d clocks\n", wrrec_mclk);
522
wrrec_mclk = wrrec_table[wrrec_mclk - 1];
524
if (popts->otf_burst_chop_en)
528
* JEDEC has min requirement for tRRD
530
#if defined(CONFIG_SYS_FSL_DDR3)
531
if (acttoact_mclk < 4)
535
* JEDEC has some min requirements for tWTR
537
#if defined(CONFIG_SYS_FSL_DDR2)
540
#elif defined(CONFIG_SYS_FSL_DDR3)
544
if (popts->otf_burst_chop_en)
547
ddr->timing_cfg_1 = (0
548
| ((pretoact_mclk & 0x0F) << 28)
549
| ((acttopre_mclk & 0x0F) << 24)
550
| ((acttorw_mclk & 0xF) << 20)
551
| ((caslat_ctrl & 0xF) << 16)
552
| ((refrec_ctrl & 0xF) << 12)
553
| ((wrrec_mclk & 0x0F) << 8)
554
| ((acttoact_mclk & 0x0F) << 4)
555
| ((wrtord_mclk & 0x0F) << 0)
557
debug("FSLDDR: timing_cfg_1 = 0x%08x\n", ddr->timing_cfg_1);
560
/* DDR SDRAM Timing Configuration 2 (TIMING_CFG_2) */
561
static void set_timing_cfg_2(fsl_ddr_cfg_regs_t *ddr,
562
const memctl_options_t *popts,
563
const common_timing_params_t *common_dimm,
564
unsigned int cas_latency,
565
unsigned int additive_latency)
567
/* Additive latency */
568
unsigned char add_lat_mclk;
569
/* CAS-to-preamble override */
572
unsigned char wr_lat;
573
/* Read to precharge (tRTP) */
574
unsigned char rd_to_pre;
575
/* Write command to write data strobe timing adjustment */
576
unsigned char wr_data_delay;
577
/* Minimum CKE pulse width (tCKE) */
578
unsigned char cke_pls;
579
/* Window for four activates (tFAW) */
580
unsigned short four_act;
582
/* FIXME add check that this must be less than acttorw_mclk */
583
add_lat_mclk = additive_latency;
584
cpo = popts->cpo_override;
586
#if defined(CONFIG_SYS_FSL_DDR1)
588
* This is a lie. It should really be 1, but if it is
589
* set to 1, bits overlap into the old controller's
590
* otherwise unused ACSM field. If we leave it 0, then
591
* the HW will magically treat it as 1 for DDR 1. Oh Yea.
594
#elif defined(CONFIG_SYS_FSL_DDR2)
595
wr_lat = cas_latency - 1;
597
wr_lat = compute_cas_write_latency();
600
#ifdef CONFIG_SYS_FSL_DDR4
601
rd_to_pre = picos_to_mclk(7500);
603
rd_to_pre = picos_to_mclk(common_dimm->trtp_ps);
606
* JEDEC has some min requirements for tRTP
608
#if defined(CONFIG_SYS_FSL_DDR2)
611
#elif defined(CONFIG_SYS_FSL_DDR3) || defined(CONFIG_SYS_FSL_DDR4)
615
if (popts->otf_burst_chop_en)
616
rd_to_pre += 2; /* according to UM */
618
wr_data_delay = popts->write_data_delay;
619
#ifdef CONFIG_SYS_FSL_DDR4
621
cke_pls = max(3, picos_to_mclk(5000));
623
cke_pls = picos_to_mclk(popts->tcke_clock_pulse_width_ps);
626
four_act = picos_to_mclk(popts->tfaw_window_four_activates_ps);
628
ddr->timing_cfg_2 = (0
629
| ((add_lat_mclk & 0xf) << 28)
630
| ((cpo & 0x1f) << 23)
631
| ((wr_lat & 0xf) << 19)
632
| ((wr_lat & 0x10) << 14)
633
| ((rd_to_pre & RD_TO_PRE_MASK) << RD_TO_PRE_SHIFT)
634
| ((wr_data_delay & WR_DATA_DELAY_MASK) << WR_DATA_DELAY_SHIFT)
635
| ((cke_pls & 0x7) << 6)
636
| ((four_act & 0x3f) << 0)
638
debug("FSLDDR: timing_cfg_2 = 0x%08x\n", ddr->timing_cfg_2);
641
/* DDR SDRAM Register Control Word */
642
static void set_ddr_sdram_rcw(fsl_ddr_cfg_regs_t *ddr,
643
const memctl_options_t *popts,
644
const common_timing_params_t *common_dimm)
646
if (common_dimm->all_dimms_registered &&
647
!common_dimm->all_dimms_unbuffered) {
648
if (popts->rcw_override) {
649
ddr->ddr_sdram_rcw_1 = popts->rcw_1;
650
ddr->ddr_sdram_rcw_2 = popts->rcw_2;
652
ddr->ddr_sdram_rcw_1 =
653
common_dimm->rcw[0] << 28 | \
654
common_dimm->rcw[1] << 24 | \
655
common_dimm->rcw[2] << 20 | \
656
common_dimm->rcw[3] << 16 | \
657
common_dimm->rcw[4] << 12 | \
658
common_dimm->rcw[5] << 8 | \
659
common_dimm->rcw[6] << 4 | \
661
ddr->ddr_sdram_rcw_2 =
662
common_dimm->rcw[8] << 28 | \
663
common_dimm->rcw[9] << 24 | \
664
common_dimm->rcw[10] << 20 | \
665
common_dimm->rcw[11] << 16 | \
666
common_dimm->rcw[12] << 12 | \
667
common_dimm->rcw[13] << 8 | \
668
common_dimm->rcw[14] << 4 | \
669
common_dimm->rcw[15];
671
debug("FSLDDR: ddr_sdram_rcw_1 = 0x%08x\n", ddr->ddr_sdram_rcw_1);
672
debug("FSLDDR: ddr_sdram_rcw_2 = 0x%08x\n", ddr->ddr_sdram_rcw_2);
676
/* DDR SDRAM control configuration (DDR_SDRAM_CFG) */
677
static void set_ddr_sdram_cfg(fsl_ddr_cfg_regs_t *ddr,
678
const memctl_options_t *popts,
679
const common_timing_params_t *common_dimm)
681
unsigned int mem_en; /* DDR SDRAM interface logic enable */
682
unsigned int sren; /* Self refresh enable (during sleep) */
683
unsigned int ecc_en; /* ECC enable. */
684
unsigned int rd_en; /* Registered DIMM enable */
685
unsigned int sdram_type; /* Type of SDRAM */
686
unsigned int dyn_pwr; /* Dynamic power management mode */
687
unsigned int dbw; /* DRAM dta bus width */
688
unsigned int eight_be = 0; /* 8-beat burst enable, DDR2 is zero */
689
unsigned int ncap = 0; /* Non-concurrent auto-precharge */
690
unsigned int threet_en; /* Enable 3T timing */
691
unsigned int twot_en; /* Enable 2T timing */
692
unsigned int ba_intlv_ctl; /* Bank (CS) interleaving control */
693
unsigned int x32_en = 0; /* x32 enable */
694
unsigned int pchb8 = 0; /* precharge bit 8 enable */
695
unsigned int hse; /* Global half strength override */
696
unsigned int mem_halt = 0; /* memory controller halt */
697
unsigned int bi = 0; /* Bypass initialization */
700
sren = popts->self_refresh_in_sleep;
701
if (common_dimm->all_dimms_ecc_capable) {
702
/* Allow setting of ECC only if all DIMMs are ECC. */
703
ecc_en = popts->ecc_mode;
708
if (common_dimm->all_dimms_registered &&
709
!common_dimm->all_dimms_unbuffered) {
714
twot_en = popts->twot_en;
717
sdram_type = CONFIG_FSL_SDRAM_TYPE;
719
dyn_pwr = popts->dynamic_power;
720
dbw = popts->data_bus_width;
721
/* 8-beat burst enable DDR-III case
722
* we must clear it when use the on-the-fly mode,
723
* must set it when use the 32-bits bus mode.
725
if ((sdram_type == SDRAM_TYPE_DDR3) ||
726
(sdram_type == SDRAM_TYPE_DDR4)) {
727
if (popts->burst_length == DDR_BL8)
729
if (popts->burst_length == DDR_OTF)
735
threet_en = popts->threet_en;
736
ba_intlv_ctl = popts->ba_intlv_ctl;
737
hse = popts->half_strength_driver_enable;
739
ddr->ddr_sdram_cfg = (0
740
| ((mem_en & 0x1) << 31)
741
| ((sren & 0x1) << 30)
742
| ((ecc_en & 0x1) << 29)
743
| ((rd_en & 0x1) << 28)
744
| ((sdram_type & 0x7) << 24)
745
| ((dyn_pwr & 0x1) << 21)
746
| ((dbw & 0x3) << 19)
747
| ((eight_be & 0x1) << 18)
748
| ((ncap & 0x1) << 17)
749
| ((threet_en & 0x1) << 16)
750
| ((twot_en & 0x1) << 15)
751
| ((ba_intlv_ctl & 0x7F) << 8)
752
| ((x32_en & 0x1) << 5)
753
| ((pchb8 & 0x1) << 4)
755
| ((mem_halt & 0x1) << 1)
758
debug("FSLDDR: ddr_sdram_cfg = 0x%08x\n", ddr->ddr_sdram_cfg);
761
/* DDR SDRAM control configuration 2 (DDR_SDRAM_CFG_2) */
762
static void set_ddr_sdram_cfg_2(fsl_ddr_cfg_regs_t *ddr,
763
const memctl_options_t *popts,
764
const unsigned int unq_mrs_en)
766
unsigned int frc_sr = 0; /* Force self refresh */
767
unsigned int sr_ie = 0; /* Self-refresh interrupt enable */
768
unsigned int odt_cfg = 0; /* ODT configuration */
769
unsigned int num_pr; /* Number of posted refreshes */
770
unsigned int slow = 0; /* DDR will be run less than 1250 */
771
unsigned int x4_en = 0; /* x4 DRAM enable */
772
unsigned int obc_cfg; /* On-The-Fly Burst Chop Cfg */
773
unsigned int ap_en; /* Address Parity Enable */
774
unsigned int d_init; /* DRAM data initialization */
775
unsigned int rcw_en = 0; /* Register Control Word Enable */
776
unsigned int md_en = 0; /* Mirrored DIMM Enable */
777
unsigned int qd_en = 0; /* quad-rank DIMM Enable */
779
#ifndef CONFIG_SYS_FSL_DDR4
780
unsigned int dll_rst_dis = 1; /* DLL reset disable */
781
unsigned int dqs_cfg; /* DQS configuration */
783
dqs_cfg = popts->dqs_config;
785
for (i = 0; i < CONFIG_CHIP_SELECTS_PER_CTRL; i++) {
786
if (popts->cs_local_opts[i].odt_rd_cfg
787
|| popts->cs_local_opts[i].odt_wr_cfg) {
788
odt_cfg = SDRAM_CFG2_ODT_ONLY_READ;
793
num_pr = 1; /* Make this configurable */
797
* {TIMING_CFG_1[PRETOACT]
798
* + [DDR_SDRAM_CFG_2[NUM_PR]
799
* * ({EXT_REFREC || REFREC} + 8 + 2)]}
800
* << DDR_SDRAM_INTERVAL[REFINT]
802
#if defined(CONFIG_SYS_FSL_DDR3) || defined(CONFIG_SYS_FSL_DDR4)
803
obc_cfg = popts->otf_burst_chop_en;
808
#if (CONFIG_SYS_FSL_DDR_VER >= FSL_DDR_VER_4_7)
809
slow = get_ddr_freq(0) < 1249000000;
812
if (popts->registered_dimm_en) {
814
ap_en = popts->ap_en;
819
x4_en = popts->x4_en ? 1 : 0;
821
#if defined(CONFIG_ECC_INIT_VIA_DDRCONTROLLER)
822
/* Use the DDR controller to auto initialize memory. */
823
d_init = popts->ecc_init_using_memctl;
824
ddr->ddr_data_init = CONFIG_MEM_INIT_VALUE;
825
debug("DDR: ddr_data_init = 0x%08x\n", ddr->ddr_data_init);
827
/* Memory will be initialized via DMA, or not at all. */
831
#if defined(CONFIG_SYS_FSL_DDR3) || defined(CONFIG_SYS_FSL_DDR4)
832
md_en = popts->mirrored_dimm;
834
qd_en = popts->quad_rank_present ? 1 : 0;
835
ddr->ddr_sdram_cfg_2 = (0
836
| ((frc_sr & 0x1) << 31)
837
| ((sr_ie & 0x1) << 30)
838
#ifndef CONFIG_SYS_FSL_DDR4
839
| ((dll_rst_dis & 0x1) << 29)
840
| ((dqs_cfg & 0x3) << 26)
842
| ((odt_cfg & 0x3) << 21)
843
| ((num_pr & 0xf) << 12)
848
| ((obc_cfg & 0x1) << 6)
849
| ((ap_en & 0x1) << 5)
850
| ((d_init & 0x1) << 4)
851
| ((rcw_en & 0x1) << 2)
852
| ((md_en & 0x1) << 0)
854
debug("FSLDDR: ddr_sdram_cfg_2 = 0x%08x\n", ddr->ddr_sdram_cfg_2);
857
#ifdef CONFIG_SYS_FSL_DDR4
858
/* DDR SDRAM Mode configuration 2 (DDR_SDRAM_MODE_2) */
859
static void set_ddr_sdram_mode_2(fsl_ddr_cfg_regs_t *ddr,
860
const memctl_options_t *popts,
861
const common_timing_params_t *common_dimm,
862
const unsigned int unq_mrs_en)
864
unsigned short esdmode2 = 0; /* Extended SDRAM mode 2 */
865
unsigned short esdmode3 = 0; /* Extended SDRAM mode 3 */
867
unsigned int wr_crc = 0; /* Disable */
868
unsigned int rtt_wr = 0; /* Rtt_WR - dynamic ODT off */
869
unsigned int srt = 0; /* self-refresh temerature, normal range */
870
unsigned int cwl = compute_cas_write_latency() - 9;
871
unsigned int mpr = 0; /* serial */
873
const unsigned int mclk_ps = get_memory_clk_period_ps();
875
if (popts->rtt_override)
876
rtt_wr = popts->rtt_wr_override_value;
878
rtt_wr = popts->cs_local_opts[0].odt_rtt_wr;
880
if (common_dimm->extended_op_srt)
881
srt = common_dimm->extended_op_srt;
884
| ((wr_crc & 0x1) << 12)
885
| ((rtt_wr & 0x3) << 9)
887
| ((cwl & 0x7) << 3));
891
else if (mclk_ps >= 833)
897
| ((mpr & 0x3) << 11)
898
| ((wc_lat & 0x3) << 9));
900
ddr->ddr_sdram_mode_2 = (0
901
| ((esdmode2 & 0xFFFF) << 16)
902
| ((esdmode3 & 0xFFFF) << 0)
904
debug("FSLDDR: ddr_sdram_mode_2 = 0x%08x\n", ddr->ddr_sdram_mode_2);
906
if (unq_mrs_en) { /* unique mode registers are supported */
907
for (i = 1; i < CONFIG_CHIP_SELECTS_PER_CTRL; i++) {
908
if (popts->rtt_override)
909
rtt_wr = popts->rtt_wr_override_value;
911
rtt_wr = popts->cs_local_opts[i].odt_rtt_wr;
913
esdmode2 &= 0xF9FF; /* clear bit 10, 9 */
914
esdmode2 |= (rtt_wr & 0x3) << 9;
917
ddr->ddr_sdram_mode_4 = (0
918
| ((esdmode2 & 0xFFFF) << 16)
919
| ((esdmode3 & 0xFFFF) << 0)
923
ddr->ddr_sdram_mode_6 = (0
924
| ((esdmode2 & 0xFFFF) << 16)
925
| ((esdmode3 & 0xFFFF) << 0)
929
ddr->ddr_sdram_mode_8 = (0
930
| ((esdmode2 & 0xFFFF) << 16)
931
| ((esdmode3 & 0xFFFF) << 0)
936
debug("FSLDDR: ddr_sdram_mode_4 = 0x%08x\n",
937
ddr->ddr_sdram_mode_4);
938
debug("FSLDDR: ddr_sdram_mode_6 = 0x%08x\n",
939
ddr->ddr_sdram_mode_6);
940
debug("FSLDDR: ddr_sdram_mode_8 = 0x%08x\n",
941
ddr->ddr_sdram_mode_8);
944
#elif defined(CONFIG_SYS_FSL_DDR3)
945
/* DDR SDRAM Mode configuration 2 (DDR_SDRAM_MODE_2) */
946
static void set_ddr_sdram_mode_2(fsl_ddr_cfg_regs_t *ddr,
947
const memctl_options_t *popts,
948
const common_timing_params_t *common_dimm,
949
const unsigned int unq_mrs_en)
951
unsigned short esdmode2 = 0; /* Extended SDRAM mode 2 */
952
unsigned short esdmode3 = 0; /* Extended SDRAM mode 3 */
954
unsigned int rtt_wr = 0; /* Rtt_WR - dynamic ODT off */
955
unsigned int srt = 0; /* self-refresh temerature, normal range */
956
unsigned int asr = 0; /* auto self-refresh disable */
957
unsigned int cwl = compute_cas_write_latency() - 5;
958
unsigned int pasr = 0; /* partial array self refresh disable */
960
if (popts->rtt_override)
961
rtt_wr = popts->rtt_wr_override_value;
963
rtt_wr = popts->cs_local_opts[0].odt_rtt_wr;
965
if (common_dimm->extended_op_srt)
966
srt = common_dimm->extended_op_srt;
969
| ((rtt_wr & 0x3) << 9)
973
| ((pasr & 0x7) << 0));
974
ddr->ddr_sdram_mode_2 = (0
975
| ((esdmode2 & 0xFFFF) << 16)
976
| ((esdmode3 & 0xFFFF) << 0)
978
debug("FSLDDR: ddr_sdram_mode_2 = 0x%08x\n", ddr->ddr_sdram_mode_2);
980
if (unq_mrs_en) { /* unique mode registers are supported */
981
for (i = 1; i < CONFIG_CHIP_SELECTS_PER_CTRL; i++) {
982
if (popts->rtt_override)
983
rtt_wr = popts->rtt_wr_override_value;
985
rtt_wr = popts->cs_local_opts[i].odt_rtt_wr;
987
esdmode2 &= 0xF9FF; /* clear bit 10, 9 */
988
esdmode2 |= (rtt_wr & 0x3) << 9;
991
ddr->ddr_sdram_mode_4 = (0
992
| ((esdmode2 & 0xFFFF) << 16)
993
| ((esdmode3 & 0xFFFF) << 0)
997
ddr->ddr_sdram_mode_6 = (0
998
| ((esdmode2 & 0xFFFF) << 16)
999
| ((esdmode3 & 0xFFFF) << 0)
1003
ddr->ddr_sdram_mode_8 = (0
1004
| ((esdmode2 & 0xFFFF) << 16)
1005
| ((esdmode3 & 0xFFFF) << 0)
1010
debug("FSLDDR: ddr_sdram_mode_4 = 0x%08x\n",
1011
ddr->ddr_sdram_mode_4);
1012
debug("FSLDDR: ddr_sdram_mode_6 = 0x%08x\n",
1013
ddr->ddr_sdram_mode_6);
1014
debug("FSLDDR: ddr_sdram_mode_8 = 0x%08x\n",
1015
ddr->ddr_sdram_mode_8);
1019
#else /* for DDR2 and DDR1 */
1020
/* DDR SDRAM Mode configuration 2 (DDR_SDRAM_MODE_2) */
1021
static void set_ddr_sdram_mode_2(fsl_ddr_cfg_regs_t *ddr,
1022
const memctl_options_t *popts,
1023
const common_timing_params_t *common_dimm,
1024
const unsigned int unq_mrs_en)
1026
unsigned short esdmode2 = 0; /* Extended SDRAM mode 2 */
1027
unsigned short esdmode3 = 0; /* Extended SDRAM mode 3 */
1029
ddr->ddr_sdram_mode_2 = (0
1030
| ((esdmode2 & 0xFFFF) << 16)
1031
| ((esdmode3 & 0xFFFF) << 0)
1033
debug("FSLDDR: ddr_sdram_mode_2 = 0x%08x\n", ddr->ddr_sdram_mode_2);
1037
#ifdef CONFIG_SYS_FSL_DDR4
1038
/* DDR SDRAM Mode configuration 9 (DDR_SDRAM_MODE_9) */
1039
static void set_ddr_sdram_mode_9(fsl_ddr_cfg_regs_t *ddr,
1040
const memctl_options_t *popts,
1041
const common_timing_params_t *common_dimm,
1042
const unsigned int unq_mrs_en)
1045
unsigned short esdmode4 = 0; /* Extended SDRAM mode 4 */
1046
unsigned short esdmode5; /* Extended SDRAM mode 5 */
1048
esdmode5 = 0x00000400; /* Data mask enabled */
1050
ddr->ddr_sdram_mode_9 = (0
1051
| ((esdmode4 & 0xffff) << 16)
1052
| ((esdmode5 & 0xffff) << 0)
1054
debug("FSLDDR: ddr_sdram_mode_9) = 0x%08x\n", ddr->ddr_sdram_mode_9);
1055
if (unq_mrs_en) { /* unique mode registers are supported */
1056
for (i = 1; i < CONFIG_CHIP_SELECTS_PER_CTRL; i++) {
1059
ddr->ddr_sdram_mode_11 = (0
1060
| ((esdmode4 & 0xFFFF) << 16)
1061
| ((esdmode5 & 0xFFFF) << 0)
1065
ddr->ddr_sdram_mode_13 = (0
1066
| ((esdmode4 & 0xFFFF) << 16)
1067
| ((esdmode5 & 0xFFFF) << 0)
1071
ddr->ddr_sdram_mode_15 = (0
1072
| ((esdmode4 & 0xFFFF) << 16)
1073
| ((esdmode5 & 0xFFFF) << 0)
1078
debug("FSLDDR: ddr_sdram_mode_11 = 0x%08x\n",
1079
ddr->ddr_sdram_mode_11);
1080
debug("FSLDDR: ddr_sdram_mode_13 = 0x%08x\n",
1081
ddr->ddr_sdram_mode_13);
1082
debug("FSLDDR: ddr_sdram_mode_15 = 0x%08x\n",
1083
ddr->ddr_sdram_mode_15);
1087
/* DDR SDRAM Mode configuration 10 (DDR_SDRAM_MODE_10) */
1088
static void set_ddr_sdram_mode_10(fsl_ddr_cfg_regs_t *ddr,
1089
const memctl_options_t *popts,
1090
const common_timing_params_t *common_dimm,
1091
const unsigned int unq_mrs_en)
1094
unsigned short esdmode6 = 0; /* Extended SDRAM mode 6 */
1095
unsigned short esdmode7 = 0; /* Extended SDRAM mode 7 */
1096
unsigned int tccdl_min = picos_to_mclk(common_dimm->tccdl_ps);
1098
esdmode6 = ((tccdl_min - 4) & 0x7) << 10;
1100
ddr->ddr_sdram_mode_10 = (0
1101
| ((esdmode6 & 0xffff) << 16)
1102
| ((esdmode7 & 0xffff) << 0)
1104
debug("FSLDDR: ddr_sdram_mode_10) = 0x%08x\n", ddr->ddr_sdram_mode_10);
1105
if (unq_mrs_en) { /* unique mode registers are supported */
1106
for (i = 1; i < CONFIG_CHIP_SELECTS_PER_CTRL; i++) {
1109
ddr->ddr_sdram_mode_12 = (0
1110
| ((esdmode6 & 0xFFFF) << 16)
1111
| ((esdmode7 & 0xFFFF) << 0)
1115
ddr->ddr_sdram_mode_14 = (0
1116
| ((esdmode6 & 0xFFFF) << 16)
1117
| ((esdmode7 & 0xFFFF) << 0)
1121
ddr->ddr_sdram_mode_16 = (0
1122
| ((esdmode6 & 0xFFFF) << 16)
1123
| ((esdmode7 & 0xFFFF) << 0)
1128
debug("FSLDDR: ddr_sdram_mode_12 = 0x%08x\n",
1129
ddr->ddr_sdram_mode_12);
1130
debug("FSLDDR: ddr_sdram_mode_14 = 0x%08x\n",
1131
ddr->ddr_sdram_mode_14);
1132
debug("FSLDDR: ddr_sdram_mode_16 = 0x%08x\n",
1133
ddr->ddr_sdram_mode_16);
1139
/* DDR SDRAM Interval Configuration (DDR_SDRAM_INTERVAL) */
1140
static void set_ddr_sdram_interval(fsl_ddr_cfg_regs_t *ddr,
1141
const memctl_options_t *popts,
1142
const common_timing_params_t *common_dimm)
1144
unsigned int refint; /* Refresh interval */
1145
unsigned int bstopre; /* Precharge interval */
1147
refint = picos_to_mclk(common_dimm->refresh_rate_ps);
1149
bstopre = popts->bstopre;
1151
/* refint field used 0x3FFF in earlier controllers */
1152
ddr->ddr_sdram_interval = (0
1153
| ((refint & 0xFFFF) << 16)
1154
| ((bstopre & 0x3FFF) << 0)
1156
debug("FSLDDR: ddr_sdram_interval = 0x%08x\n", ddr->ddr_sdram_interval);
1159
#ifdef CONFIG_SYS_FSL_DDR4
1160
/* DDR SDRAM Mode configuration set (DDR_SDRAM_MODE) */
1161
static void set_ddr_sdram_mode(fsl_ddr_cfg_regs_t *ddr,
1162
const memctl_options_t *popts,
1163
const common_timing_params_t *common_dimm,
1164
unsigned int cas_latency,
1165
unsigned int additive_latency,
1166
const unsigned int unq_mrs_en)
1169
unsigned short esdmode; /* Extended SDRAM mode */
1170
unsigned short sdmode; /* SDRAM mode */
1172
/* Mode Register - MR1 */
1173
unsigned int qoff = 0; /* Output buffer enable 0=yes, 1=no */
1174
unsigned int tdqs_en = 0; /* TDQS Enable: 0=no, 1=yes */
1176
unsigned int wrlvl_en = 0; /* Write level enable: 0=no, 1=yes */
1177
unsigned int al = 0; /* Posted CAS# additive latency (AL) */
1178
unsigned int dic = 0; /* Output driver impedance, 40ohm */
1179
unsigned int dll_en = 1; /* DLL Enable 1=Enable (Normal),
1180
0=Disable (Test/Debug) */
1182
/* Mode Register - MR0 */
1183
unsigned int wr = 0; /* Write Recovery */
1184
unsigned int dll_rst; /* DLL Reset */
1185
unsigned int mode; /* Normal=0 or Test=1 */
1186
unsigned int caslat = 4;/* CAS# latency, default set as 6 cycles */
1187
/* BT: Burst Type (0=Nibble Sequential, 1=Interleaved) */
1189
unsigned int bl; /* BL: Burst Length */
1191
unsigned int wr_mclk;
1192
/* DDR4 support WR 10, 12, 14, 16, 18, 20, 24 */
1193
static const u8 wr_table[] = {
1194
0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 6};
1195
/* DDR4 support CAS 9, 10, 11, 12, 13, 14, 15, 16, 18, 20, 22, 24 */
1196
static const u8 cas_latency_table[] = {
1197
0, 1, 2, 3, 4, 5, 6, 7, 8, 8,
1198
9, 9, 10, 10, 11, 11};
1200
if (popts->rtt_override)
1201
rtt = popts->rtt_override_value;
1203
rtt = popts->cs_local_opts[0].odt_rtt_norm;
1205
if (additive_latency == (cas_latency - 1))
1207
if (additive_latency == (cas_latency - 2))
1210
if (popts->quad_rank_present)
1211
dic = 1; /* output driver impedance 240/7 ohm */
1214
* The esdmode value will also be used for writing
1215
* MR1 during write leveling for DDR3, although the
1216
* bits specifically related to the write leveling
1217
* scheme will be handled automatically by the DDR
1218
* controller. so we set the wrlvl_en = 0 here.
1221
| ((qoff & 0x1) << 12)
1222
| ((tdqs_en & 0x1) << 11)
1223
| ((rtt & 0x7) << 8)
1224
| ((wrlvl_en & 0x1) << 7)
1226
| ((dic & 0x3) << 1) /* DIC field is split */
1227
| ((dll_en & 0x1) << 0)
1231
* DLL control for precharge PD
1232
* 0=slow exit DLL off (tXPDLL)
1233
* 1=fast exit DLL on (tXP)
1236
wr_mclk = picos_to_mclk(common_dimm->twr_ps);
1237
if (wr_mclk <= 24) {
1238
wr = wr_table[wr_mclk - 10];
1240
printf("Error: unsupported write recovery for mode register wr_mclk = %d\n",
1244
dll_rst = 0; /* dll no reset */
1245
mode = 0; /* normal mode */
1247
/* look up table to get the cas latency bits */
1248
if (cas_latency >= 9 && cas_latency <= 24)
1249
caslat = cas_latency_table[cas_latency - 9];
1251
printf("Error: unsupported cas latency for mode register\n");
1253
bt = 0; /* Nibble sequential */
1255
switch (popts->burst_length) {
1266
printf("Error: invalid burst length of %u specified. ",
1267
popts->burst_length);
1268
puts("Defaulting to on-the-fly BC4 or BL8 beats.\n");
1275
| ((dll_rst & 0x1) << 8)
1276
| ((mode & 0x1) << 7)
1277
| (((caslat >> 1) & 0x7) << 4)
1279
| ((caslat & 1) << 2)
1283
ddr->ddr_sdram_mode = (0
1284
| ((esdmode & 0xFFFF) << 16)
1285
| ((sdmode & 0xFFFF) << 0)
1288
debug("FSLDDR: ddr_sdram_mode = 0x%08x\n", ddr->ddr_sdram_mode);
1290
if (unq_mrs_en) { /* unique mode registers are supported */
1291
for (i = 1; i < CONFIG_CHIP_SELECTS_PER_CTRL; i++) {
1292
if (popts->rtt_override)
1293
rtt = popts->rtt_override_value;
1295
rtt = popts->cs_local_opts[i].odt_rtt_norm;
1297
esdmode &= 0xF8FF; /* clear bit 10,9,8 for rtt */
1298
esdmode |= (rtt & 0x7) << 8;
1301
ddr->ddr_sdram_mode_3 = (0
1302
| ((esdmode & 0xFFFF) << 16)
1303
| ((sdmode & 0xFFFF) << 0)
1307
ddr->ddr_sdram_mode_5 = (0
1308
| ((esdmode & 0xFFFF) << 16)
1309
| ((sdmode & 0xFFFF) << 0)
1313
ddr->ddr_sdram_mode_7 = (0
1314
| ((esdmode & 0xFFFF) << 16)
1315
| ((sdmode & 0xFFFF) << 0)
1320
debug("FSLDDR: ddr_sdram_mode_3 = 0x%08x\n",
1321
ddr->ddr_sdram_mode_3);
1322
debug("FSLDDR: ddr_sdram_mode_5 = 0x%08x\n",
1323
ddr->ddr_sdram_mode_5);
1324
debug("FSLDDR: ddr_sdram_mode_5 = 0x%08x\n",
1325
ddr->ddr_sdram_mode_5);
1329
#elif defined(CONFIG_SYS_FSL_DDR3)
1330
/* DDR SDRAM Mode configuration set (DDR_SDRAM_MODE) */
1331
static void set_ddr_sdram_mode(fsl_ddr_cfg_regs_t *ddr,
1332
const memctl_options_t *popts,
1333
const common_timing_params_t *common_dimm,
1334
unsigned int cas_latency,
1335
unsigned int additive_latency,
1336
const unsigned int unq_mrs_en)
1339
unsigned short esdmode; /* Extended SDRAM mode */
1340
unsigned short sdmode; /* SDRAM mode */
1342
/* Mode Register - MR1 */
1343
unsigned int qoff = 0; /* Output buffer enable 0=yes, 1=no */
1344
unsigned int tdqs_en = 0; /* TDQS Enable: 0=no, 1=yes */
1346
unsigned int wrlvl_en = 0; /* Write level enable: 0=no, 1=yes */
1347
unsigned int al = 0; /* Posted CAS# additive latency (AL) */
1348
unsigned int dic = 0; /* Output driver impedance, 40ohm */
1349
unsigned int dll_en = 0; /* DLL Enable 0=Enable (Normal),
1350
1=Disable (Test/Debug) */
1352
/* Mode Register - MR0 */
1353
unsigned int dll_on; /* DLL control for precharge PD, 0=off, 1=on */
1354
unsigned int wr = 0; /* Write Recovery */
1355
unsigned int dll_rst; /* DLL Reset */
1356
unsigned int mode; /* Normal=0 or Test=1 */
1357
unsigned int caslat = 4;/* CAS# latency, default set as 6 cycles */
1358
/* BT: Burst Type (0=Nibble Sequential, 1=Interleaved) */
1360
unsigned int bl; /* BL: Burst Length */
1362
unsigned int wr_mclk;
1364
* DDR_SDRAM_MODE doesn't support 9,11,13,15
1365
* Please refer JEDEC Standard No. 79-3E for Mode Register MR0
1368
static const u8 wr_table[] = {1, 2, 3, 4, 5, 5, 6, 6, 7, 7, 0, 0};
1370
if (popts->rtt_override)
1371
rtt = popts->rtt_override_value;
1373
rtt = popts->cs_local_opts[0].odt_rtt_norm;
1375
if (additive_latency == (cas_latency - 1))
1377
if (additive_latency == (cas_latency - 2))
1380
if (popts->quad_rank_present)
1381
dic = 1; /* output driver impedance 240/7 ohm */
1384
* The esdmode value will also be used for writing
1385
* MR1 during write leveling for DDR3, although the
1386
* bits specifically related to the write leveling
1387
* scheme will be handled automatically by the DDR
1388
* controller. so we set the wrlvl_en = 0 here.
1391
| ((qoff & 0x1) << 12)
1392
| ((tdqs_en & 0x1) << 11)
1393
| ((rtt & 0x4) << 7) /* rtt field is split */
1394
| ((wrlvl_en & 0x1) << 7)
1395
| ((rtt & 0x2) << 5) /* rtt field is split */
1396
| ((dic & 0x2) << 4) /* DIC field is split */
1398
| ((rtt & 0x1) << 2) /* rtt field is split */
1399
| ((dic & 0x1) << 1) /* DIC field is split */
1400
| ((dll_en & 0x1) << 0)
1404
* DLL control for precharge PD
1405
* 0=slow exit DLL off (tXPDLL)
1406
* 1=fast exit DLL on (tXP)
1410
wr_mclk = picos_to_mclk(common_dimm->twr_ps);
1411
if (wr_mclk <= 16) {
1412
wr = wr_table[wr_mclk - 5];
1414
printf("Error: unsupported write recovery for mode register "
1415
"wr_mclk = %d\n", wr_mclk);
1418
dll_rst = 0; /* dll no reset */
1419
mode = 0; /* normal mode */
1421
/* look up table to get the cas latency bits */
1422
if (cas_latency >= 5 && cas_latency <= 16) {
1423
unsigned char cas_latency_table[] = {
1429
0xc, /* 10 clocks */
1430
0xe, /* 11 clocks */
1431
0x1, /* 12 clocks */
1432
0x3, /* 13 clocks */
1433
0x5, /* 14 clocks */
1434
0x7, /* 15 clocks */
1435
0x9, /* 16 clocks */
1437
caslat = cas_latency_table[cas_latency - 5];
1439
printf("Error: unsupported cas latency for mode register\n");
1442
bt = 0; /* Nibble sequential */
1444
switch (popts->burst_length) {
1455
printf("Error: invalid burst length of %u specified. "
1456
" Defaulting to on-the-fly BC4 or BL8 beats.\n",
1457
popts->burst_length);
1463
| ((dll_on & 0x1) << 12)
1465
| ((dll_rst & 0x1) << 8)
1466
| ((mode & 0x1) << 7)
1467
| (((caslat >> 1) & 0x7) << 4)
1469
| ((caslat & 1) << 2)
1473
ddr->ddr_sdram_mode = (0
1474
| ((esdmode & 0xFFFF) << 16)
1475
| ((sdmode & 0xFFFF) << 0)
1478
debug("FSLDDR: ddr_sdram_mode = 0x%08x\n", ddr->ddr_sdram_mode);
1480
if (unq_mrs_en) { /* unique mode registers are supported */
1481
for (i = 1; i < CONFIG_CHIP_SELECTS_PER_CTRL; i++) {
1482
if (popts->rtt_override)
1483
rtt = popts->rtt_override_value;
1485
rtt = popts->cs_local_opts[i].odt_rtt_norm;
1487
esdmode &= 0xFDBB; /* clear bit 9,6,2 */
1489
| ((rtt & 0x4) << 7) /* rtt field is split */
1490
| ((rtt & 0x2) << 5) /* rtt field is split */
1491
| ((rtt & 0x1) << 2) /* rtt field is split */
1495
ddr->ddr_sdram_mode_3 = (0
1496
| ((esdmode & 0xFFFF) << 16)
1497
| ((sdmode & 0xFFFF) << 0)
1501
ddr->ddr_sdram_mode_5 = (0
1502
| ((esdmode & 0xFFFF) << 16)
1503
| ((sdmode & 0xFFFF) << 0)
1507
ddr->ddr_sdram_mode_7 = (0
1508
| ((esdmode & 0xFFFF) << 16)
1509
| ((sdmode & 0xFFFF) << 0)
1514
debug("FSLDDR: ddr_sdram_mode_3 = 0x%08x\n",
1515
ddr->ddr_sdram_mode_3);
1516
debug("FSLDDR: ddr_sdram_mode_5 = 0x%08x\n",
1517
ddr->ddr_sdram_mode_5);
1518
debug("FSLDDR: ddr_sdram_mode_5 = 0x%08x\n",
1519
ddr->ddr_sdram_mode_5);
1523
#else /* !CONFIG_SYS_FSL_DDR3 */
1525
/* DDR SDRAM Mode configuration set (DDR_SDRAM_MODE) */
1526
static void set_ddr_sdram_mode(fsl_ddr_cfg_regs_t *ddr,
1527
const memctl_options_t *popts,
1528
const common_timing_params_t *common_dimm,
1529
unsigned int cas_latency,
1530
unsigned int additive_latency,
1531
const unsigned int unq_mrs_en)
1533
unsigned short esdmode; /* Extended SDRAM mode */
1534
unsigned short sdmode; /* SDRAM mode */
1537
* FIXME: This ought to be pre-calculated in a
1538
* technology-specific routine,
1539
* e.g. compute_DDR2_mode_register(), and then the
1540
* sdmode and esdmode passed in as part of common_dimm.
1543
/* Extended Mode Register */
1544
unsigned int mrs = 0; /* Mode Register Set */
1545
unsigned int outputs = 0; /* 0=Enabled, 1=Disabled */
1546
unsigned int rdqs_en = 0; /* RDQS Enable: 0=no, 1=yes */
1547
unsigned int dqs_en = 0; /* DQS# Enable: 0=enable, 1=disable */
1548
unsigned int ocd = 0; /* 0x0=OCD not supported,
1549
0x7=OCD default state */
1551
unsigned int al; /* Posted CAS# additive latency (AL) */
1552
unsigned int ods = 0; /* Output Drive Strength:
1553
0 = Full strength (18ohm)
1554
1 = Reduced strength (4ohm) */
1555
unsigned int dll_en = 0; /* DLL Enable 0=Enable (Normal),
1556
1=Disable (Test/Debug) */
1558
/* Mode Register (MR) */
1559
unsigned int mr; /* Mode Register Definition */
1560
unsigned int pd; /* Power-Down Mode */
1561
unsigned int wr; /* Write Recovery */
1562
unsigned int dll_res; /* DLL Reset */
1563
unsigned int mode; /* Normal=0 or Test=1 */
1564
unsigned int caslat = 0;/* CAS# latency */
1565
/* BT: Burst Type (0=Sequential, 1=Interleaved) */
1567
unsigned int bl; /* BL: Burst Length */
1569
dqs_en = !popts->dqs_config;
1570
rtt = fsl_ddr_get_rtt();
1572
al = additive_latency;
1575
| ((mrs & 0x3) << 14)
1576
| ((outputs & 0x1) << 12)
1577
| ((rdqs_en & 0x1) << 11)
1578
| ((dqs_en & 0x1) << 10)
1579
| ((ocd & 0x7) << 7)
1580
| ((rtt & 0x2) << 5) /* rtt field is split */
1582
| ((rtt & 0x1) << 2) /* rtt field is split */
1583
| ((ods & 0x1) << 1)
1584
| ((dll_en & 0x1) << 0)
1587
mr = 0; /* FIXME: CHECKME */
1590
* 0 = Fast Exit (Normal)
1591
* 1 = Slow Exit (Low Power)
1595
#if defined(CONFIG_SYS_FSL_DDR1)
1596
wr = 0; /* Historical */
1597
#elif defined(CONFIG_SYS_FSL_DDR2)
1598
wr = picos_to_mclk(common_dimm->twr_ps);
1603
#if defined(CONFIG_SYS_FSL_DDR1)
1604
if (1 <= cas_latency && cas_latency <= 4) {
1605
unsigned char mode_caslat_table[4] = {
1606
0x5, /* 1.5 clocks */
1607
0x2, /* 2.0 clocks */
1608
0x6, /* 2.5 clocks */
1609
0x3 /* 3.0 clocks */
1611
caslat = mode_caslat_table[cas_latency - 1];
1613
printf("Warning: unknown cas_latency %d\n", cas_latency);
1615
#elif defined(CONFIG_SYS_FSL_DDR2)
1616
caslat = cas_latency;
1620
switch (popts->burst_length) {
1628
printf("Error: invalid burst length of %u specified. "
1629
" Defaulting to 4 beats.\n",
1630
popts->burst_length);
1636
| ((mr & 0x3) << 14)
1637
| ((pd & 0x1) << 12)
1639
| ((dll_res & 0x1) << 8)
1640
| ((mode & 0x1) << 7)
1641
| ((caslat & 0x7) << 4)
1646
ddr->ddr_sdram_mode = (0
1647
| ((esdmode & 0xFFFF) << 16)
1648
| ((sdmode & 0xFFFF) << 0)
1650
debug("FSLDDR: ddr_sdram_mode = 0x%08x\n", ddr->ddr_sdram_mode);
1654
/* DDR SDRAM Data Initialization (DDR_DATA_INIT) */
1655
static void set_ddr_data_init(fsl_ddr_cfg_regs_t *ddr)
1657
unsigned int init_value; /* Initialization value */
1659
#ifdef CONFIG_MEM_INIT_VALUE
1660
init_value = CONFIG_MEM_INIT_VALUE;
1662
init_value = 0xDEADBEEF;
1664
ddr->ddr_data_init = init_value;
1668
* DDR SDRAM Clock Control (DDR_SDRAM_CLK_CNTL)
1669
* The old controller on the 8540/60 doesn't have this register.
1670
* Hope it's OK to set it (to 0) anyway.
1672
static void set_ddr_sdram_clk_cntl(fsl_ddr_cfg_regs_t *ddr,
1673
const memctl_options_t *popts)
1675
unsigned int clk_adjust; /* Clock adjust */
1677
clk_adjust = popts->clk_adjust;
1678
ddr->ddr_sdram_clk_cntl = (clk_adjust & 0xF) << 23;
1679
debug("FSLDDR: clk_cntl = 0x%08x\n", ddr->ddr_sdram_clk_cntl);
1682
/* DDR Initialization Address (DDR_INIT_ADDR) */
1683
static void set_ddr_init_addr(fsl_ddr_cfg_regs_t *ddr)
1685
unsigned int init_addr = 0; /* Initialization address */
1687
ddr->ddr_init_addr = init_addr;
1690
/* DDR Initialization Address (DDR_INIT_EXT_ADDR) */
1691
static void set_ddr_init_ext_addr(fsl_ddr_cfg_regs_t *ddr)
1693
unsigned int uia = 0; /* Use initialization address */
1694
unsigned int init_ext_addr = 0; /* Initialization address */
1696
ddr->ddr_init_ext_addr = (0
1697
| ((uia & 0x1) << 31)
1698
| (init_ext_addr & 0xF)
1702
/* DDR SDRAM Timing Configuration 4 (TIMING_CFG_4) */
1703
static void set_timing_cfg_4(fsl_ddr_cfg_regs_t *ddr,
1704
const memctl_options_t *popts)
1706
unsigned int rwt = 0; /* Read-to-write turnaround for same CS */
1707
unsigned int wrt = 0; /* Write-to-read turnaround for same CS */
1708
unsigned int rrt = 0; /* Read-to-read turnaround for same CS */
1709
unsigned int wwt = 0; /* Write-to-write turnaround for same CS */
1710
unsigned int dll_lock = 0; /* DDR SDRAM DLL Lock Time */
1712
#if defined(CONFIG_SYS_FSL_DDR3) || defined(CONFIG_SYS_FSL_DDR4)
1713
if (popts->burst_length == DDR_BL8) {
1714
/* We set BL/2 for fixed BL8 */
1715
rrt = 0; /* BL/2 clocks */
1716
wwt = 0; /* BL/2 clocks */
1718
/* We need to set BL/2 + 2 to BC4 and OTF */
1719
rrt = 2; /* BL/2 + 2 clocks */
1720
wwt = 2; /* BL/2 + 2 clocks */
1724
#ifdef CONFIG_SYS_FSL_DDR4
1725
dll_lock = 2; /* tDLLK = 1024 clocks */
1726
#elif defined(CONFIG_SYS_FSL_DDR3)
1727
dll_lock = 1; /* tDLLK = 512 clocks from spec */
1729
ddr->timing_cfg_4 = (0
1730
| ((rwt & 0xf) << 28)
1731
| ((wrt & 0xf) << 24)
1732
| ((rrt & 0xf) << 20)
1733
| ((wwt & 0xf) << 16)
1736
debug("FSLDDR: timing_cfg_4 = 0x%08x\n", ddr->timing_cfg_4);
1739
/* DDR SDRAM Timing Configuration 5 (TIMING_CFG_5) */
1740
static void set_timing_cfg_5(fsl_ddr_cfg_regs_t *ddr, unsigned int cas_latency)
1742
unsigned int rodt_on = 0; /* Read to ODT on */
1743
unsigned int rodt_off = 0; /* Read to ODT off */
1744
unsigned int wodt_on = 0; /* Write to ODT on */
1745
unsigned int wodt_off = 0; /* Write to ODT off */
1747
#if defined(CONFIG_SYS_FSL_DDR3) || defined(CONFIG_SYS_FSL_DDR4)
1748
unsigned int wr_lat = ((ddr->timing_cfg_2 & 0x00780000) >> 19) +
1749
((ddr->timing_cfg_2 & 0x00040000) >> 14);
1750
/* rodt_on = timing_cfg_1[caslat] - timing_cfg_2[wrlat] + 1 */
1751
if (cas_latency >= wr_lat)
1752
rodt_on = cas_latency - wr_lat + 1;
1753
rodt_off = 4; /* 4 clocks */
1754
wodt_on = 1; /* 1 clocks */
1755
wodt_off = 4; /* 4 clocks */
1758
ddr->timing_cfg_5 = (0
1759
| ((rodt_on & 0x1f) << 24)
1760
| ((rodt_off & 0x7) << 20)
1761
| ((wodt_on & 0x1f) << 12)
1762
| ((wodt_off & 0x7) << 8)
1764
debug("FSLDDR: timing_cfg_5 = 0x%08x\n", ddr->timing_cfg_5);
1767
#ifdef CONFIG_SYS_FSL_DDR4
1768
static void set_timing_cfg_6(fsl_ddr_cfg_regs_t *ddr)
1770
unsigned int hs_caslat = 0;
1771
unsigned int hs_wrlat = 0;
1772
unsigned int hs_wrrec = 0;
1773
unsigned int hs_clkadj = 0;
1774
unsigned int hs_wrlvl_start = 0;
1776
ddr->timing_cfg_6 = (0
1777
| ((hs_caslat & 0x1f) << 24)
1778
| ((hs_wrlat & 0x1f) << 19)
1779
| ((hs_wrrec & 0x1f) << 12)
1780
| ((hs_clkadj & 0x1f) << 6)
1781
| ((hs_wrlvl_start & 0x1f) << 0)
1783
debug("FSLDDR: timing_cfg_6 = 0x%08x\n", ddr->timing_cfg_6);
1786
static void set_timing_cfg_7(fsl_ddr_cfg_regs_t *ddr,
1787
const common_timing_params_t *common_dimm)
1789
unsigned int txpr, tcksre, tcksrx;
1790
unsigned int cke_rst, cksre, cksrx, par_lat, cs_to_cmd;
1792
txpr = max(5, picos_to_mclk(common_dimm->trfc1_ps + 10000));
1793
tcksre = max(5, picos_to_mclk(10000));
1794
tcksrx = max(5, picos_to_mclk(10000));
1800
else if (txpr <= 256)
1802
else if (txpr <= 512)
1817
ddr->timing_cfg_7 = (0
1818
| ((cke_rst & 0x3) << 28)
1819
| ((cksre & 0xf) << 24)
1820
| ((cksrx & 0xf) << 20)
1821
| ((par_lat & 0xf) << 16)
1822
| ((cs_to_cmd & 0xf) << 4)
1824
debug("FSLDDR: timing_cfg_7 = 0x%08x\n", ddr->timing_cfg_7);
1827
static void set_timing_cfg_8(fsl_ddr_cfg_regs_t *ddr,
1828
const memctl_options_t *popts,
1829
const common_timing_params_t *common_dimm,
1830
unsigned int cas_latency)
1832
unsigned int rwt_bg, wrt_bg, rrt_bg, wwt_bg;
1833
unsigned int acttoact_bg, wrtord_bg, pre_all_rec;
1834
unsigned int tccdl = picos_to_mclk(common_dimm->tccdl_ps);
1835
unsigned int wr_lat = ((ddr->timing_cfg_2 & 0x00780000) >> 19) +
1836
((ddr->timing_cfg_2 & 0x00040000) >> 14);
1838
rwt_bg = cas_latency + 2 + 4 - wr_lat;
1840
rwt_bg = tccdl - rwt_bg;
1844
wrt_bg = wr_lat + 4 + 1 - cas_latency;
1846
wrt_bg = tccdl - wrt_bg;
1850
if (popts->burst_length == DDR_BL8) {
1858
acttoact_bg = picos_to_mclk(common_dimm->trrdl_ps);
1859
wrtord_bg = max(4, picos_to_mclk(7500));
1862
ddr->timing_cfg_8 = (0
1863
| ((rwt_bg & 0xf) << 28)
1864
| ((wrt_bg & 0xf) << 24)
1865
| ((rrt_bg & 0xf) << 20)
1866
| ((wwt_bg & 0xf) << 16)
1867
| ((acttoact_bg & 0xf) << 12)
1868
| ((wrtord_bg & 0xf) << 8)
1869
| ((pre_all_rec & 0x1f) << 0)
1872
debug("FSLDDR: timing_cfg_8 = 0x%08x\n", ddr->timing_cfg_8);
1875
static void set_timing_cfg_9(fsl_ddr_cfg_regs_t *ddr)
1877
ddr->timing_cfg_9 = 0;
1878
debug("FSLDDR: timing_cfg_9 = 0x%08x\n", ddr->timing_cfg_9);
1881
static void set_ddr_dq_mapping(fsl_ddr_cfg_regs_t *ddr,
1882
const dimm_params_t *dimm_params)
1884
ddr->dq_map_0 = ((dimm_params->dq_mapping[0] & 0x3F) << 26) |
1885
((dimm_params->dq_mapping[1] & 0x3F) << 20) |
1886
((dimm_params->dq_mapping[2] & 0x3F) << 14) |
1887
((dimm_params->dq_mapping[3] & 0x3F) << 8) |
1888
((dimm_params->dq_mapping[4] & 0x3F) << 2);
1890
ddr->dq_map_1 = ((dimm_params->dq_mapping[5] & 0x3F) << 26) |
1891
((dimm_params->dq_mapping[6] & 0x3F) << 20) |
1892
((dimm_params->dq_mapping[7] & 0x3F) << 14) |
1893
((dimm_params->dq_mapping[10] & 0x3F) << 8) |
1894
((dimm_params->dq_mapping[11] & 0x3F) << 2);
1896
ddr->dq_map_2 = ((dimm_params->dq_mapping[12] & 0x3F) << 26) |
1897
((dimm_params->dq_mapping[13] & 0x3F) << 20) |
1898
((dimm_params->dq_mapping[14] & 0x3F) << 14) |
1899
((dimm_params->dq_mapping[15] & 0x3F) << 8) |
1900
((dimm_params->dq_mapping[16] & 0x3F) << 2);
1902
ddr->dq_map_3 = ((dimm_params->dq_mapping[17] & 0x3F) << 26) |
1903
((dimm_params->dq_mapping[8] & 0x3F) << 20) |
1904
((dimm_params->dq_mapping[9] & 0x3F) << 14) |
1905
dimm_params->dq_mapping_ors;
1907
debug("FSLDDR: dq_map_0 = 0x%08x\n", ddr->dq_map_0);
1908
debug("FSLDDR: dq_map_1 = 0x%08x\n", ddr->dq_map_1);
1909
debug("FSLDDR: dq_map_2 = 0x%08x\n", ddr->dq_map_2);
1910
debug("FSLDDR: dq_map_3 = 0x%08x\n", ddr->dq_map_3);
1912
static void set_ddr_sdram_cfg_3(fsl_ddr_cfg_regs_t *ddr,
1913
const memctl_options_t *popts)
1917
rd_pre = popts->quad_rank_present ? 1 : 0;
1919
ddr->ddr_sdram_cfg_3 = (rd_pre & 0x1) << 16;
1921
debug("FSLDDR: ddr_sdram_cfg_3 = 0x%08x\n", ddr->ddr_sdram_cfg_3);
1923
#endif /* CONFIG_SYS_FSL_DDR4 */
1925
/* DDR ZQ Calibration Control (DDR_ZQ_CNTL) */
1926
static void set_ddr_zq_cntl(fsl_ddr_cfg_regs_t *ddr, unsigned int zq_en)
1928
unsigned int zqinit = 0;/* POR ZQ Calibration Time (tZQinit) */
1929
/* Normal Operation Full Calibration Time (tZQoper) */
1930
unsigned int zqoper = 0;
1931
/* Normal Operation Short Calibration Time (tZQCS) */
1932
unsigned int zqcs = 0;
1933
#ifdef CONFIG_SYS_FSL_DDR4
1934
unsigned int zqcs_init;
1938
#ifdef CONFIG_SYS_FSL_DDR4
1939
zqinit = 10; /* 1024 clocks */
1940
zqoper = 9; /* 512 clocks */
1941
zqcs = 7; /* 128 clocks */
1942
zqcs_init = 5; /* 1024 refresh sequences */
1944
zqinit = 9; /* 512 clocks */
1945
zqoper = 8; /* 256 clocks */
1946
zqcs = 6; /* 64 clocks */
1950
ddr->ddr_zq_cntl = (0
1951
| ((zq_en & 0x1) << 31)
1952
| ((zqinit & 0xF) << 24)
1953
| ((zqoper & 0xF) << 16)
1954
| ((zqcs & 0xF) << 8)
1955
#ifdef CONFIG_SYS_FSL_DDR4
1956
| ((zqcs_init & 0xF) << 0)
1959
debug("FSLDDR: zq_cntl = 0x%08x\n", ddr->ddr_zq_cntl);
1962
/* DDR Write Leveling Control (DDR_WRLVL_CNTL) */
1963
static void set_ddr_wrlvl_cntl(fsl_ddr_cfg_regs_t *ddr, unsigned int wrlvl_en,
1964
const memctl_options_t *popts)
1967
* First DQS pulse rising edge after margining mode
1968
* is programmed (tWL_MRD)
1970
unsigned int wrlvl_mrd = 0;
1971
/* ODT delay after margining mode is programmed (tWL_ODTEN) */
1972
unsigned int wrlvl_odten = 0;
1973
/* DQS/DQS_ delay after margining mode is programmed (tWL_DQSEN) */
1974
unsigned int wrlvl_dqsen = 0;
1975
/* WRLVL_SMPL: Write leveling sample time */
1976
unsigned int wrlvl_smpl = 0;
1977
/* WRLVL_WLR: Write leveling repeition time */
1978
unsigned int wrlvl_wlr = 0;
1979
/* WRLVL_START: Write leveling start time */
1980
unsigned int wrlvl_start = 0;
1982
/* suggest enable write leveling for DDR3 due to fly-by topology */
1984
/* tWL_MRD min = 40 nCK, we set it 64 */
1988
/* tWL_DQSEN min = 25 nCK, we set it 32 */
1991
* Write leveling sample time at least need 6 clocks
1992
* higher than tWLO to allow enough time for progagation
1993
* delay and sampling the prime data bits.
1997
* Write leveling repetition time
1998
* at least tWLO + 6 clocks clocks
2003
* Write leveling start time
2004
* The value use for the DQS_ADJUST for the first sample
2005
* when write leveling is enabled. It probably needs to be
2006
* overriden per platform.
2010
* Override the write leveling sample and start time
2011
* according to specific board
2013
if (popts->wrlvl_override) {
2014
wrlvl_smpl = popts->wrlvl_sample;
2015
wrlvl_start = popts->wrlvl_start;
2019
ddr->ddr_wrlvl_cntl = (0
2020
| ((wrlvl_en & 0x1) << 31)
2021
| ((wrlvl_mrd & 0x7) << 24)
2022
| ((wrlvl_odten & 0x7) << 20)
2023
| ((wrlvl_dqsen & 0x7) << 16)
2024
| ((wrlvl_smpl & 0xf) << 12)
2025
| ((wrlvl_wlr & 0x7) << 8)
2026
| ((wrlvl_start & 0x1F) << 0)
2028
debug("FSLDDR: wrlvl_cntl = 0x%08x\n", ddr->ddr_wrlvl_cntl);
2029
ddr->ddr_wrlvl_cntl_2 = popts->wrlvl_ctl_2;
2030
debug("FSLDDR: wrlvl_cntl_2 = 0x%08x\n", ddr->ddr_wrlvl_cntl_2);
2031
ddr->ddr_wrlvl_cntl_3 = popts->wrlvl_ctl_3;
2032
debug("FSLDDR: wrlvl_cntl_3 = 0x%08x\n", ddr->ddr_wrlvl_cntl_3);
2036
/* DDR Self Refresh Counter (DDR_SR_CNTR) */
2037
static void set_ddr_sr_cntr(fsl_ddr_cfg_regs_t *ddr, unsigned int sr_it)
2039
/* Self Refresh Idle Threshold */
2040
ddr->ddr_sr_cntr = (sr_it & 0xF) << 16;
2043
static void set_ddr_eor(fsl_ddr_cfg_regs_t *ddr, const memctl_options_t *popts)
2045
if (popts->addr_hash) {
2046
ddr->ddr_eor = 0x40000000; /* address hash enable */
2047
puts("Address hashing enabled.\n");
2051
static void set_ddr_cdr1(fsl_ddr_cfg_regs_t *ddr, const memctl_options_t *popts)
2053
ddr->ddr_cdr1 = popts->ddr_cdr1;
2054
debug("FSLDDR: ddr_cdr1 = 0x%08x\n", ddr->ddr_cdr1);
2057
static void set_ddr_cdr2(fsl_ddr_cfg_regs_t *ddr, const memctl_options_t *popts)
2059
ddr->ddr_cdr2 = popts->ddr_cdr2;
2060
debug("FSLDDR: ddr_cdr2 = 0x%08x\n", ddr->ddr_cdr2);
2064
check_fsl_memctl_config_regs(const fsl_ddr_cfg_regs_t *ddr)
2066
unsigned int res = 0;
2069
* Check that DDR_SDRAM_CFG[RD_EN] and DDR_SDRAM_CFG[2T_EN] are
2070
* not set at the same time.
2072
if (ddr->ddr_sdram_cfg & 0x10000000
2073
&& ddr->ddr_sdram_cfg & 0x00008000) {
2074
printf("Error: DDR_SDRAM_CFG[RD_EN] and DDR_SDRAM_CFG[2T_EN] "
2075
" should not be set at the same time.\n");
2083
compute_fsl_memctl_config_regs(const memctl_options_t *popts,
2084
fsl_ddr_cfg_regs_t *ddr,
2085
const common_timing_params_t *common_dimm,
2086
const dimm_params_t *dimm_params,
2087
unsigned int dbw_cap_adj,
2088
unsigned int size_only)
2091
unsigned int cas_latency;
2092
unsigned int additive_latency;
2095
unsigned int wrlvl_en;
2096
unsigned int ip_rev = 0;
2097
unsigned int unq_mrs_en = 0;
2100
memset(ddr, 0, sizeof(fsl_ddr_cfg_regs_t));
2102
if (common_dimm == NULL) {
2103
printf("Error: subset DIMM params struct null pointer\n");
2108
* Process overrides first.
2110
* FIXME: somehow add dereated caslat to this
2112
cas_latency = (popts->cas_latency_override)
2113
? popts->cas_latency_override_value
2114
: common_dimm->lowest_common_spd_caslat;
2116
additive_latency = (popts->additive_latency_override)
2117
? popts->additive_latency_override_value
2118
: common_dimm->additive_latency;
2120
sr_it = (popts->auto_self_refresh_en)
2123
/* ZQ calibration */
2124
zq_en = (popts->zq_en) ? 1 : 0;
2125
/* write leveling */
2126
wrlvl_en = (popts->wrlvl_en) ? 1 : 0;
2128
/* Chip Select Memory Bounds (CSn_BNDS) */
2129
for (i = 0; i < CONFIG_CHIP_SELECTS_PER_CTRL; i++) {
2130
unsigned long long ea, sa;
2131
unsigned int cs_per_dimm
2132
= CONFIG_CHIP_SELECTS_PER_CTRL / CONFIG_DIMM_SLOTS_PER_CTLR;
2133
unsigned int dimm_number
2135
unsigned long long rank_density
2136
= dimm_params[dimm_number].rank_density >> dbw_cap_adj;
2138
if (dimm_params[dimm_number].n_ranks == 0) {
2139
debug("Skipping setup of CS%u "
2140
"because n_ranks on DIMM %u is 0\n", i, dimm_number);
2143
if (popts->memctl_interleaving) {
2144
switch (popts->ba_intlv_ctl & FSL_DDR_CS0_CS1_CS2_CS3) {
2145
case FSL_DDR_CS0_CS1_CS2_CS3:
2147
case FSL_DDR_CS0_CS1:
2148
case FSL_DDR_CS0_CS1_AND_CS2_CS3:
2152
case FSL_DDR_CS2_CS3:
2158
sa = common_dimm->base_address;
2159
ea = sa + common_dimm->total_mem - 1;
2160
} else if (!popts->memctl_interleaving) {
2162
* If memory interleaving between controllers is NOT
2163
* enabled, the starting address for each memory
2164
* controller is distinct. However, because rank
2165
* interleaving is enabled, the starting and ending
2166
* addresses of the total memory on that memory
2167
* controller needs to be programmed into its
2168
* respective CS0_BNDS.
2170
switch (popts->ba_intlv_ctl & FSL_DDR_CS0_CS1_CS2_CS3) {
2171
case FSL_DDR_CS0_CS1_CS2_CS3:
2172
sa = common_dimm->base_address;
2173
ea = sa + common_dimm->total_mem - 1;
2175
case FSL_DDR_CS0_CS1_AND_CS2_CS3:
2176
if ((i >= 2) && (dimm_number == 0)) {
2177
sa = dimm_params[dimm_number].base_address +
2179
ea = sa + 2 * rank_density - 1;
2181
sa = dimm_params[dimm_number].base_address;
2182
ea = sa + 2 * rank_density - 1;
2185
case FSL_DDR_CS0_CS1:
2186
if (dimm_params[dimm_number].n_ranks > (i % cs_per_dimm)) {
2187
sa = dimm_params[dimm_number].base_address;
2188
ea = sa + rank_density - 1;
2190
sa += (i % cs_per_dimm) * rank_density;
2191
ea += (i % cs_per_dimm) * rank_density;
2199
case FSL_DDR_CS2_CS3:
2200
if (dimm_params[dimm_number].n_ranks > (i % cs_per_dimm)) {
2201
sa = dimm_params[dimm_number].base_address;
2202
ea = sa + rank_density - 1;
2204
sa += (i % cs_per_dimm) * rank_density;
2205
ea += (i % cs_per_dimm) * rank_density;
2211
ea += (rank_density >> dbw_cap_adj);
2213
default: /* No bank(chip-select) interleaving */
2214
sa = dimm_params[dimm_number].base_address;
2215
ea = sa + rank_density - 1;
2216
if (dimm_params[dimm_number].n_ranks > (i % cs_per_dimm)) {
2217
sa += (i % cs_per_dimm) * rank_density;
2218
ea += (i % cs_per_dimm) * rank_density;
2231
ddr->cs[i].bnds = (0
2232
| ((sa & 0xffff) << 16) /* starting address */
2233
| ((ea & 0xffff) << 0) /* ending address */
2236
/* setting bnds to 0xffffffff for inactive CS */
2237
ddr->cs[i].bnds = 0xffffffff;
2240
debug("FSLDDR: cs[%d]_bnds = 0x%08x\n", i, ddr->cs[i].bnds);
2241
set_csn_config(dimm_number, i, ddr, popts, dimm_params);
2242
set_csn_config_2(i, ddr);
2246
* In the case we only need to compute the ddr sdram size, we only need
2247
* to set csn registers, so return from here.
2252
set_ddr_eor(ddr, popts);
2254
#if !defined(CONFIG_SYS_FSL_DDR1)
2255
set_timing_cfg_0(ddr, popts, dimm_params);
2258
set_timing_cfg_3(ddr, popts, common_dimm, cas_latency,
2260
set_timing_cfg_1(ddr, popts, common_dimm, cas_latency);
2261
set_timing_cfg_2(ddr, popts, common_dimm,
2262
cas_latency, additive_latency);
2264
set_ddr_cdr1(ddr, popts);
2265
set_ddr_cdr2(ddr, popts);
2266
set_ddr_sdram_cfg(ddr, popts, common_dimm);
2267
ip_rev = fsl_ddr_get_version();
2268
if (ip_rev > 0x40400)
2271
set_ddr_sdram_cfg_2(ddr, popts, unq_mrs_en);
2272
set_ddr_sdram_mode(ddr, popts, common_dimm,
2273
cas_latency, additive_latency, unq_mrs_en);
2274
set_ddr_sdram_mode_2(ddr, popts, common_dimm, unq_mrs_en);
2275
#ifdef CONFIG_SYS_FSL_DDR4
2276
set_ddr_sdram_mode_9(ddr, popts, common_dimm, unq_mrs_en);
2277
set_ddr_sdram_mode_10(ddr, popts, common_dimm, unq_mrs_en);
2279
set_ddr_sdram_interval(ddr, popts, common_dimm);
2280
set_ddr_data_init(ddr);
2281
set_ddr_sdram_clk_cntl(ddr, popts);
2282
set_ddr_init_addr(ddr);
2283
set_ddr_init_ext_addr(ddr);
2284
set_timing_cfg_4(ddr, popts);
2285
set_timing_cfg_5(ddr, cas_latency);
2286
#ifdef CONFIG_SYS_FSL_DDR4
2287
set_ddr_sdram_cfg_3(ddr, popts);
2288
set_timing_cfg_6(ddr);
2289
set_timing_cfg_7(ddr, common_dimm);
2290
set_timing_cfg_8(ddr, popts, common_dimm, cas_latency);
2291
set_timing_cfg_9(ddr);
2292
set_ddr_dq_mapping(ddr, dimm_params);
2295
set_ddr_zq_cntl(ddr, zq_en);
2296
set_ddr_wrlvl_cntl(ddr, wrlvl_en, popts);
2298
set_ddr_sr_cntr(ddr, sr_it);
2300
set_ddr_sdram_rcw(ddr, popts, common_dimm);
2302
#ifdef CONFIG_SYS_FSL_DDR_EMU
2303
/* disble DDR training for emulator */
2304
ddr->debug[2] = 0x00000400;
2305
ddr->debug[4] = 0xff800000;
2307
return check_fsl_memctl_config_regs(ddr);