2 * (C) Copyright 2015 Google, Inc
4 * SPDX-License-Identifier: GPL-2.0+
9 #include <asm/arch/cru_rk3036.h>
10 #include <asm/arch/grf_rk3036.h>
11 #include <asm/arch/hardware.h>
12 #include <asm/arch/sdram_rk3036.h>
13 #include <asm/arch/timer.h>
14 #include <asm/arch/uart.h>
17 * we can not fit the code to access the device tree in SPL
18 * (due to 4K SRAM size limits), so these are hard-coded
20 #define CRU_BASE 0x20000000
21 #define GRF_BASE 0x20008000
22 #define DDR_PHY_BASE 0x2000a000
23 #define DDR_PCTL_BASE 0x20004000
24 #define CPU_AXI_BUS_BASE 0x10128000
26 struct rk3036_sdram_priv {
27 struct rk3036_cru *cru;
28 struct rk3036_grf *grf;
29 struct rk3036_ddr_phy *phy;
30 struct rk3036_ddr_pctl *pctl;
31 struct rk3036_service_sys *axi_bus;
34 struct rk3036_ddr_config ddr_config;
37 /* use integer mode, 396MHz dpll setting
38 * refdiv, fbdiv, postdiv1, postdiv2
40 const struct pll_div dpll_init_cfg = {1, 50, 3, 1};
42 /* 396Mhz ddr timing */
43 const struct rk3036_ddr_timing ddr_timing = {0x18c,
44 {0x18c, 0xc8, 0x1f4, 0x27, 0x4e,
45 0x4, 0x8b, 0x06, 0x03, 0x0, 0x06, 0x05, 0x0f, 0x15, 0x06, 0x04, 0x04,
46 0x06, 0x04, 0x200, 0x03, 0x0a, 0x40, 0x2710, 0x01, 0x05, 0x05, 0x03,
47 0x0c, 0x28, 0x100, 0x0, 0x04, 0x0},
48 {{0x420, 0x42, 0x0, 0x0}, 0x01, 0x60},
52 * [7:6] bank(n:n bit bank)
54 * [3] cs(0:1 cs, 1:2 cs)
55 * [2:1] bank(n:n bit bank)
58 const char ddr_cfg_2_rbc[] = {
59 ((3 << 6) | (3 << 4) | (0 << 3) | (0 << 1) | 1),
60 ((0 << 6) | (1 << 4) | (0 << 3) | (3 << 1) | 0),
61 ((0 << 6) | (2 << 4) | (0 << 3) | (3 << 1) | 0),
62 ((0 << 6) | (3 << 4) | (0 << 3) | (3 << 1) | 0),
63 ((0 << 6) | (1 << 4) | (0 << 3) | (3 << 1) | 1),
64 ((0 << 6) | (2 << 4) | (0 << 3) | (3 << 1) | 1),
65 ((0 << 6) | (3 << 4) | (0 << 3) | (3 << 1) | 1),
66 ((0 << 6) | (0 << 4) | (0 << 3) | (3 << 1) | 0),
67 ((0 << 6) | (0 << 4) | (0 << 3) | (3 << 1) | 1),
68 ((0 << 6) | (3 << 4) | (1 << 3) | (3 << 1) | 0),
69 ((0 << 6) | (3 << 4) | (1 << 3) | (3 << 1) | 1),
70 ((1 << 6) | (2 << 4) | (0 << 3) | (2 << 1) | 0),
71 ((3 << 6) | (2 << 4) | (0 << 3) | (0 << 1) | 1),
72 ((3 << 6) | (3 << 4) | (0 << 3) | (0 << 1) | 0),
82 MEMORY_SELECT_DDR3 = 0 << 6,
83 DQS_SQU_CAL_NORMAL_MODE = 0 << 1,
84 DQS_SQU_CAL_START = 1 << 0,
85 DQS_SQU_NO_CAL = 0 << 0,
88 CMD_DLL_BYPASS = 1 << 4,
89 CMD_DLL_BYPASS_DISABLE = 0 << 4,
90 HIGH_8BIT_DLL_BYPASS = 1 << 3,
91 HIGH_8BIT_DLL_BYPASS_DISABLE = 0 << 3,
92 LOW_8BIT_DLL_BYPASS = 1 << 2,
93 LOW_8BIT_DLL_BYPASS_DISABLE = 0 << 2,
96 CMD_FEEDBACK_ENABLE = 1 << 5,
97 CMD_SLAVE_DLL_INVERSE_MODE = 1 << 4,
98 CMD_SLAVE_DLL_NO_INVERSE_MODE = 0 << 4,
99 CMD_SLAVE_DLL_ENALBE = 1 << 3,
100 CMD_TX_SLAVE_DLL_DELAY_MASK = 7,
101 CMD_TX_SLAVE_DLL_DELAY_SHIFT = 0,
104 LEFT_CHN_TX_DQ_PHASE_BYPASS_90 = 1 << 4,
105 LEFT_CHN_TX_DQ_PHASE_BYPASS_0 = 0 << 4,
106 LEFT_CHN_TX_DQ_DLL_ENABLE = 1 << 3,
107 LEFT_CHN_TX_DQ_DLL_DELAY_MASK = 7,
108 LEFT_CHN_TX_DQ_DLL_DELAY_SHIFT = 0,
111 LEFT_CHN_RX_DQS_DELAY_TAP_MASK = 3,
112 LEFT_CHN_RX_DQS_DELAY_TAP_SHIFT = 0,
115 RIGHT_CHN_TX_DQ_PHASE_BYPASS_90 = 1 << 4,
116 RIGHT_CHN_TX_DQ_PHASE_BYPASS_0 = 0 << 4,
117 RIGHT_CHN_TX_DQ_DLL_ENABLE = 1 << 3,
118 RIGHT_CHN_TX_DQ_DLL_DELAY_MASK = 7,
119 RIGHT_CHN_TX_DQ_DLL_DELAY_SHIFT = 0,
122 RIGHT_CHN_RX_DQS_DELAY_TAP_MASK = 3,
123 RIGHT_CHN_RX_DQS_DELAY_TAP_SHIFT = 0,
127 HIGH_8BIT_CAL_DONE = 1 << 1,
128 LOW_8BIT_CAL_DONE = 1 << 0,
134 DFI_INIT_START = 1 << 0,
135 DFI_DATA_BYTE_DISABLE_EN = 1 << 2,
138 DFI_DRAM_CLK_SR_EN = 1 << 0,
139 DFI_DRAM_CLK_DPD_EN = 1 << 1,
142 DFI_PARITY_INTR_EN = 1 << 0,
143 DFI_PARITY_EN = 1 << 1,
146 TLP_RESP_TIME_SHIFT = 16,
151 RANK0_ODT_WRITE_SEL = 1 << 3,
152 RANK1_ODT_WRITE_SEL = 1 << 11,
154 /* PCTL_DFIODTCFG1 */
155 ODT_LEN_BL8_W_SHIFT = 16,
160 PD_EXIT_SLOW_MODE = 0 << 17,
161 PD_ACTIVE_POWER_DOWN = 1 << 16,
168 HW_EXIT_IDLE_EN_MASK = 1,
169 HW_EXIT_IDLE_EN_SHIFT = 31,
170 SR_IDLE_MASK = 0x1ff,
174 HW_LOW_POWER_EN = 1 << 0,
177 POWER_UP_START = 1 << 0,
180 POWER_UP_DONE = 1 << 0,
185 BANK_ADDR_SHIFT = 17,
186 CMD_ADDR_MASK = 0x1fff,
217 #define MSCH4_MAINDDR3 (1 << 7)
218 #define PHY_DRV_ODT_SET(n) ((n << 4) | n)
219 #define DDR3_DLL_RESET (1 << 8)
221 /* CK pull up/down driver strength control */
239 /* DQ pull up/down control */
250 PHY_RTT_144OHM = 0xa,
258 /* DQS squelch DLL delay */
260 DQS_DLL_NO_DELAY = 0,
284 /* 0: 1 chn, 1: 2 chn */
285 DDR_CHN_CNT_SHIFT = 12,
287 /* 0: 1 rank, 1: 2 rank */
288 DDR_RANK_CNT_MASK = 1,
289 DDR_RANK_CNT_SHIFT = 11,
300 /* 0: 8 bank, 1: 4 bank*/
310 DDR_CS0_ROW_MASK = 3,
311 DDR_CS0_ROW_SHIFT = 6,
312 DDR_CS1_ROW_MASK = 3,
313 DDR_CS1_ROW_SHIFT = 4,
319 * rk3036 only support 16bit
324 DDR_DIE_BW_SHIFT = 0,
327 static void rkdclk_init(struct rk3036_sdram_priv *priv)
329 struct rk3036_pll *pll = &priv->cru->pll[1];
331 /* pll enter slow-mode */
332 rk_clrsetreg(&priv->cru->cru_mode_con,
333 DPLL_MODE_MASK << DPLL_MODE_SHIFT,
334 DPLL_MODE_SLOW << DPLL_MODE_SHIFT);
336 /* use integer mode */
337 rk_clrreg(&pll->con1, 1 << PLL_DSMPD_SHIFT);
339 rk_clrsetreg(&pll->con0,
340 PLL_POSTDIV1_MASK << PLL_POSTDIV1_SHIFT | PLL_FBDIV_MASK,
341 (dpll_init_cfg.postdiv1 << PLL_POSTDIV1_SHIFT) |
342 dpll_init_cfg.fbdiv);
343 rk_clrsetreg(&pll->con1, PLL_POSTDIV2_MASK << PLL_POSTDIV2_SHIFT |
344 PLL_REFDIV_MASK << PLL_REFDIV_SHIFT,
345 (dpll_init_cfg.postdiv2 << PLL_POSTDIV2_SHIFT |
346 dpll_init_cfg.refdiv << PLL_REFDIV_SHIFT));
348 /* waiting for pll lock */
349 while (readl(&pll->con1) & (1 << PLL_LOCK_STATUS_SHIFT))
352 /* PLL enter normal-mode */
353 rk_clrsetreg(&priv->cru->cru_mode_con,
354 DPLL_MODE_MASK << DPLL_MODE_SHIFT,
355 DPLL_MODE_NORM << DPLL_MODE_SHIFT);
358 static void copy_to_reg(u32 *dest, const u32 *src, u32 n)
362 for (i = 0; i < n / sizeof(u32); i++) {
369 void phy_pctrl_reset(struct rk3036_sdram_priv *priv)
371 struct rk3036_ddr_phy *ddr_phy = priv->phy;
373 rk_clrsetreg(&priv->cru->cru_softrst_con[5], 1 << DDRCTRL_PSRST_SHIFT |
374 1 << DDRCTRL_SRST_SHIFT | 1 << DDRPHY_PSRST_SHIFT |
375 1 << DDRPHY_SRST_SHIFT,
376 1 << DDRCTRL_PSRST_SHIFT | 1 << DDRCTRL_SRST_SHIFT |
377 1 << DDRPHY_PSRST_SHIFT | 1 << DDRPHY_SRST_SHIFT);
381 rk_clrreg(&priv->cru->cru_softrst_con[5], 1 << DDRPHY_PSRST_SHIFT |
382 1 << DDRPHY_SRST_SHIFT);
385 rk_clrreg(&priv->cru->cru_softrst_con[5], 1 << DDRCTRL_PSRST_SHIFT |
386 1 << DDRCTRL_SRST_SHIFT);
389 clrsetbits_le32(&ddr_phy->ddrphy_reg1,
390 SOFT_RESET_MASK << SOFT_RESET_SHIFT,
391 0 << SOFT_RESET_SHIFT);
393 clrsetbits_le32(&ddr_phy->ddrphy_reg1,
394 SOFT_RESET_MASK << SOFT_RESET_SHIFT,
395 3 << SOFT_RESET_SHIFT);
400 void phy_dll_bypass_set(struct rk3036_sdram_priv *priv, unsigned int freq)
402 struct rk3036_ddr_phy *ddr_phy = priv->phy;
404 if (freq < ddr_timing.freq) {
405 writel(CMD_DLL_BYPASS | HIGH_8BIT_DLL_BYPASS |
406 LOW_8BIT_DLL_BYPASS, &ddr_phy->ddrphy_reg2a);
408 writel(LEFT_CHN_TX_DQ_PHASE_BYPASS_90 |
409 LEFT_CHN_TX_DQ_DLL_ENABLE |
410 (0 & LEFT_CHN_TX_DQ_DLL_DELAY_MASK) <<
411 LEFT_CHN_TX_DQ_DLL_DELAY_SHIFT, &ddr_phy->ddrphy_reg6);
413 writel(RIGHT_CHN_TX_DQ_PHASE_BYPASS_90 |
414 RIGHT_CHN_TX_DQ_DLL_ENABLE |
415 (0 & RIGHT_CHN_TX_DQ_DLL_DELAY_MASK) <<
416 RIGHT_CHN_TX_DQ_DLL_DELAY_SHIFT,
417 &ddr_phy->ddrphy_reg9);
419 writel(CMD_DLL_BYPASS_DISABLE | HIGH_8BIT_DLL_BYPASS_DISABLE |
420 LOW_8BIT_DLL_BYPASS_DISABLE, &ddr_phy->ddrphy_reg2a);
422 writel(LEFT_CHN_TX_DQ_PHASE_BYPASS_0 |
423 LEFT_CHN_TX_DQ_DLL_ENABLE |
424 (4 & LEFT_CHN_TX_DQ_DLL_DELAY_MASK) <<
425 LEFT_CHN_TX_DQ_DLL_DELAY_SHIFT,
426 &ddr_phy->ddrphy_reg6);
428 writel(RIGHT_CHN_TX_DQ_PHASE_BYPASS_0 |
429 RIGHT_CHN_TX_DQ_DLL_ENABLE |
430 (4 & RIGHT_CHN_TX_DQ_DLL_DELAY_MASK) <<
431 RIGHT_CHN_TX_DQ_DLL_DELAY_SHIFT,
432 &ddr_phy->ddrphy_reg9);
435 writel(CMD_SLAVE_DLL_NO_INVERSE_MODE | CMD_SLAVE_DLL_ENALBE |
436 (0 & CMD_TX_SLAVE_DLL_DELAY_MASK) <<
437 CMD_TX_SLAVE_DLL_DELAY_SHIFT, &ddr_phy->ddrphy_reg19);
439 /* 45 degree delay */
440 writel((DQS_DLL_45_DELAY & LEFT_CHN_RX_DQS_DELAY_TAP_MASK) <<
441 LEFT_CHN_RX_DQS_DELAY_TAP_SHIFT, &ddr_phy->ddrphy_reg8);
442 writel((DQS_DLL_45_DELAY & RIGHT_CHN_RX_DQS_DELAY_TAP_MASK) <<
443 RIGHT_CHN_RX_DQS_DELAY_TAP_SHIFT, &ddr_phy->ddrphy_reg11);
446 static void send_command(struct rk3036_ddr_pctl *pctl,
447 u32 rank, u32 cmd, u32 arg)
449 writel((START_CMD | (rank << 20) | arg | cmd), &pctl->mcmd);
451 while (readl(&pctl->mcmd) & START_CMD)
455 static void memory_init(struct rk3036_sdram_priv *priv)
457 struct rk3036_ddr_pctl *pctl = priv->pctl;
459 send_command(pctl, 3, DESELECT_CMD, 0);
461 send_command(pctl, 3, PREA_CMD, 0);
462 send_command(pctl, 3, MRS_CMD,
463 (0x02 & BANK_ADDR_MASK) << BANK_ADDR_SHIFT |
464 (ddr_timing.phy_timing.mr[2] & CMD_ADDR_MASK) <<
467 send_command(pctl, 3, MRS_CMD,
468 (0x03 & BANK_ADDR_MASK) << BANK_ADDR_SHIFT |
469 (ddr_timing.phy_timing.mr[3] & CMD_ADDR_MASK) <<
472 send_command(pctl, 3, MRS_CMD,
473 (0x01 & BANK_ADDR_MASK) << BANK_ADDR_SHIFT |
474 (ddr_timing.phy_timing.mr[1] & CMD_ADDR_MASK) <<
477 send_command(pctl, 3, MRS_CMD,
478 (0x00 & BANK_ADDR_MASK) << BANK_ADDR_SHIFT |
479 (ddr_timing.phy_timing.mr[0] & CMD_ADDR_MASK) <<
480 CMD_ADDR_SHIFT | DDR3_DLL_RESET);
482 send_command(pctl, 3, ZQCL_CMD, 0);
485 static void data_training(struct rk3036_sdram_priv *priv)
487 struct rk3036_ddr_phy *ddr_phy = priv->phy;
488 struct rk3036_ddr_pctl *pctl = priv->pctl;
491 /* disable auto refresh */
492 value = readl(&pctl->trefi),
493 writel(0, &pctl->trefi);
495 clrsetbits_le32(&ddr_phy->ddrphy_reg2, 0x03,
496 DQS_SQU_CAL_NORMAL_MODE | DQS_SQU_CAL_START);
499 while ((readl(&ddr_phy->ddrphy_reg62) & CAL_DONE_MASK) !=
500 (HIGH_8BIT_CAL_DONE | LOW_8BIT_CAL_DONE)) {
504 clrsetbits_le32(&ddr_phy->ddrphy_reg2, 0x03,
505 DQS_SQU_CAL_NORMAL_MODE | DQS_SQU_NO_CAL);
508 * since data training will take about 20us, so send some auto
509 * refresh(about 7.8us) to complement the lost time
511 send_command(pctl, 3, REF_CMD, 0);
512 send_command(pctl, 3, REF_CMD, 0);
513 send_command(pctl, 3, REF_CMD, 0);
515 writel(value, &pctl->trefi);
518 static void move_to_config_state(struct rk3036_sdram_priv *priv)
521 struct rk3036_ddr_pctl *pctl = priv->pctl;
524 state = readl(&pctl->stat) & PCTL_STAT_MASK;
527 writel(WAKEUP_STATE, &pctl->sctl);
528 while ((readl(&pctl->stat) & PCTL_STAT_MASK)
532 * If at low power state, need wakeup first, and then
533 * enter the config, so fallthrough
538 writel(CFG_STATE, &pctl->sctl);
539 while ((readl(&pctl->stat) & PCTL_STAT_MASK) != CONFIG)
550 static void move_to_access_state(struct rk3036_sdram_priv *priv)
553 struct rk3036_ddr_pctl *pctl = priv->pctl;
556 state = readl(&pctl->stat) & PCTL_STAT_MASK;
559 writel(WAKEUP_STATE, &pctl->sctl);
560 while ((readl(&pctl->stat) & PCTL_STAT_MASK) != ACCESS)
564 writel(CFG_STATE, &pctl->sctl);
565 while ((readl(&pctl->stat) & PCTL_STAT_MASK) != CONFIG)
569 writel(GO_STATE, &pctl->sctl);
570 while ((readl(&pctl->stat) & PCTL_STAT_MASK) != ACCESS)
581 static void pctl_cfg(struct rk3036_sdram_priv *priv)
583 struct rk3036_ddr_pctl *pctl = priv->pctl;
587 writel(DFI_INIT_START | DFI_DATA_BYTE_DISABLE_EN, &pctl->dfistcfg0);
588 writel(DFI_DRAM_CLK_SR_EN | DFI_DRAM_CLK_DPD_EN, &pctl->dfistcfg1);
589 writel(DFI_PARITY_INTR_EN | DFI_PARITY_EN, &pctl->dfistcfg2);
590 writel(7 << TLP_RESP_TIME_SHIFT | LP_SR_EN | LP_PD_EN,
593 writel(1, &pctl->dfitphyupdtype0);
594 writel(0x0d, &pctl->dfitphyrdlat);
596 /* cs0 and cs1 write odt enable */
597 writel((RANK0_ODT_WRITE_SEL | RANK1_ODT_WRITE_SEL),
600 /* odt write length */
601 writel(7 << ODT_LEN_BL8_W_SHIFT, &pctl->dfiodtcfg1);
603 /* phyupd and ctrlupd disabled */
604 writel(0, &pctl->dfiupdcfg);
606 if ((ddr_timing.noc_timing.burstlen << 1) == 4)
611 copy_to_reg(&pctl->togcnt1u, &ddr_timing.pctl_timing.togcnt1u,
612 sizeof(struct rk3036_pctl_timing));
613 reg = readl(&pctl->tcl);
614 writel(reg - 3, &pctl->dfitrddataen);
615 reg = readl(&pctl->tcwl);
616 writel(reg - 1, &pctl->dfitphywrlat);
618 writel(burst_len | (1 & TFAW_CFG_MASK) << TFAW_CFG_SHIFT |
619 PD_EXIT_SLOW_MODE | PD_ACTIVE_POWER_DOWN |
620 (0 & PD_IDLE_MASK) << PD_IDLE_SHIFT,
623 writel(RK_SETBITS(MSCH4_MAINDDR3), &priv->grf->soc_con2);
624 setbits_le32(&pctl->scfg, HW_LOW_POWER_EN);
627 static void phy_cfg(struct rk3036_sdram_priv *priv)
629 struct rk3036_ddr_phy *ddr_phy = priv->phy;
630 struct rk3036_service_sys *axi_bus = priv->axi_bus;
632 writel(ddr_timing.noc_timing.noc_timing, &axi_bus->ddrtiming);
633 writel(0x3f, &axi_bus->readlatency);
635 writel(MEMORY_SELECT_DDR3 | DQS_SQU_CAL_NORMAL_MODE,
636 &ddr_phy->ddrphy_reg2);
638 clrsetbits_le32(&ddr_phy->ddrphy_reg3, 1, ddr_timing.phy_timing.bl);
639 writel(ddr_timing.phy_timing.cl_al, &ddr_phy->ddrphy_reg4a);
640 writel(PHY_DRV_ODT_SET(PHY_RON_44OHM), &ddr_phy->ddrphy_reg16);
641 writel(PHY_DRV_ODT_SET(PHY_RON_44OHM), &ddr_phy->ddrphy_reg22);
642 writel(PHY_DRV_ODT_SET(PHY_RON_44OHM), &ddr_phy->ddrphy_reg25);
643 writel(PHY_DRV_ODT_SET(PHY_RON_44OHM), &ddr_phy->ddrphy_reg26);
644 writel(PHY_DRV_ODT_SET(PHY_RTT_216OHM), &ddr_phy->ddrphy_reg27);
645 writel(PHY_DRV_ODT_SET(PHY_RTT_216OHM), &ddr_phy->ddrphy_reg28);
648 void dram_cfg_rbc(struct rk3036_sdram_priv *priv)
652 struct rk3036_ddr_config config = priv->ddr_config;
653 struct rk3036_service_sys *axi_bus = priv->axi_bus;
655 move_to_config_state(priv);
657 /* 2bit in BIT1, 2 */
658 if (config.rank == 2) {
659 noc_config = (config.cs0_row - 13) << 4 | config.bank << 1 |
660 1 << 3 | (config.col - 10);
661 if (noc_config == ddr_cfg_2_rbc[9]) {
664 } else if (noc_config == ddr_cfg_2_rbc[10]) {
670 noc_config = (config.cs0_row - 13) << 4 | config.bank << 1 |
673 for (i = 0; i < sizeof(ddr_cfg_2_rbc); i++) {
674 if (noc_config == ddr_cfg_2_rbc[i])
678 /* bank: 1 bit in BIT6,7, 1bit in BIT1, 2 */
679 noc_config = 1 << 6 | (config.cs0_row - 13) << 4 |
680 2 << 1 | (config.col - 10);
681 if (noc_config == ddr_cfg_2_rbc[11]) {
686 /* bank: 2bit in BIT6,7 */
687 noc_config = (config.bank << 6) | (config.cs0_row - 13) << 4 |
690 if (noc_config == ddr_cfg_2_rbc[0])
692 else if (noc_config == ddr_cfg_2_rbc[12])
694 else if (noc_config == ddr_cfg_2_rbc[13])
697 writel(i, &axi_bus->ddrconf);
698 move_to_access_state(priv);
701 static void sdram_all_config(struct rk3036_sdram_priv *priv)
705 struct rk3036_ddr_config config = priv->ddr_config;
708 cs1_row = config.cs1_row - 13;
710 os_reg = config.ddr_type << DDR_TYPE_SHIFT |
711 0 << DDR_CHN_CNT_SHIFT |
712 (config.rank - 1) << DDR_RANK_CNT_SHIFT |
713 (config.col - 1) << DDR_COL_SHIFT |
714 (config.bank == 3 ? 0 : 1) << DDR_BANK_SHIFT |
715 (config.cs0_row - 13) << DDR_CS0_ROW_SHIFT |
716 cs1_row << DDR_CS1_ROW_SHIFT |
717 1 << DDR_BW_SHIFT | config.bw << DDR_DIE_BW_SHIFT;
718 writel(os_reg, &priv->grf->os_reg[1]);
721 size_t sdram_size(void)
723 u32 size, os_reg, cs0_row, cs1_row, col, bank, rank;
724 struct rk3036_grf *grf = (void *)GRF_BASE;
726 os_reg = readl(&grf->os_reg[1]);
728 cs0_row = 13 + ((os_reg >> DDR_CS0_ROW_SHIFT) & DDR_CS0_ROW_MASK);
729 cs1_row = 13 + ((os_reg >> DDR_CS1_ROW_SHIFT) & DDR_CS1_ROW_MASK);
730 col = 9 + ((os_reg >> DDR_COL_SHIFT) & DDR_COL_MASK);
731 bank = 3 - ((os_reg >> DDR_BANK_SHIFT) & DDR_BANK_MASK);
732 rank = 1 + ((os_reg >> DDR_RANK_CNT_SHIFT) & DDR_RANK_CNT_MASK);
734 /* row + col + bank + bw(rk3036 only support 16bit, so fix in 1) */
735 size = 1 << (cs0_row + col + bank + 1);
738 size += size >> (cs0_row - cs1_row);
743 void sdram_init(void)
745 struct rk3036_sdram_priv sdram_priv;
747 sdram_priv.cru = (void *)CRU_BASE;
748 sdram_priv.grf = (void *)GRF_BASE;
749 sdram_priv.phy = (void *)DDR_PHY_BASE;
750 sdram_priv.pctl = (void *)DDR_PCTL_BASE;
751 sdram_priv.axi_bus = (void *)CPU_AXI_BUS_BASE;
753 get_ddr_config(&sdram_priv.ddr_config);
754 sdram_all_config(&sdram_priv);
755 rkdclk_init(&sdram_priv);
756 phy_pctrl_reset(&sdram_priv);
757 phy_dll_bypass_set(&sdram_priv, ddr_timing.freq);
758 pctl_cfg(&sdram_priv);
759 phy_cfg(&sdram_priv);
760 writel(POWER_UP_START, &sdram_priv.pctl->powctl);
761 while (!(readl(&sdram_priv.pctl->powstat) & POWER_UP_DONE))
763 memory_init(&sdram_priv);
764 move_to_config_state(&sdram_priv);
765 data_training(&sdram_priv);
766 move_to_access_state(&sdram_priv);
767 dram_cfg_rbc(&sdram_priv);