19ffa7a35SPurna Chandra Mandal /*
29ffa7a35SPurna Chandra Mandal * (c) 2015 Paul Thacker <paul.thacker@microchip.com>
39ffa7a35SPurna Chandra Mandal *
49ffa7a35SPurna Chandra Mandal * SPDX-License-Identifier: GPL-2.0+
59ffa7a35SPurna Chandra Mandal *
69ffa7a35SPurna Chandra Mandal */
79ffa7a35SPurna Chandra Mandal #include <common.h>
89ffa7a35SPurna Chandra Mandal #include <wait_bit.h>
99ffa7a35SPurna Chandra Mandal #include <linux/kernel.h>
109ffa7a35SPurna Chandra Mandal #include <linux/bitops.h>
119ffa7a35SPurna Chandra Mandal #include <mach/pic32.h>
129ffa7a35SPurna Chandra Mandal #include <mach/ddr.h>
139ffa7a35SPurna Chandra Mandal
149ffa7a35SPurna Chandra Mandal #include "ddr2_regs.h"
159ffa7a35SPurna Chandra Mandal #include "ddr2_timing.h"
169ffa7a35SPurna Chandra Mandal
179ffa7a35SPurna Chandra Mandal /* init DDR2 Phy */
ddr2_phy_init(void)189ffa7a35SPurna Chandra Mandal void ddr2_phy_init(void)
199ffa7a35SPurna Chandra Mandal {
209ffa7a35SPurna Chandra Mandal struct ddr2_phy_regs *ddr2_phy;
219ffa7a35SPurna Chandra Mandal u32 pad_ctl;
229ffa7a35SPurna Chandra Mandal
239ffa7a35SPurna Chandra Mandal ddr2_phy = ioremap(PIC32_DDR2P_BASE, sizeof(*ddr2_phy));
249ffa7a35SPurna Chandra Mandal
259ffa7a35SPurna Chandra Mandal /* PHY_DLL_RECALIB */
269ffa7a35SPurna Chandra Mandal writel(DELAY_START_VAL(3) | DISABLE_RECALIB(0) |
279ffa7a35SPurna Chandra Mandal RECALIB_CNT(0x10), &ddr2_phy->dll_recalib);
289ffa7a35SPurna Chandra Mandal
299ffa7a35SPurna Chandra Mandal /* PHY_PAD_CTRL */
309ffa7a35SPurna Chandra Mandal pad_ctl = ODT_SEL | ODT_EN | DRIVE_SEL(0) |
319ffa7a35SPurna Chandra Mandal ODT_PULLDOWN(2) | ODT_PULLUP(3) |
329ffa7a35SPurna Chandra Mandal EXTRA_OEN_CLK(0) | NOEXT_DLL |
339ffa7a35SPurna Chandra Mandal DLR_DFT_WRCMD | HALF_RATE |
349ffa7a35SPurna Chandra Mandal DRVSTR_PFET(0xe) | DRVSTR_NFET(0xe) |
359ffa7a35SPurna Chandra Mandal RCVR_EN | PREAMBLE_DLY(2);
369ffa7a35SPurna Chandra Mandal writel(pad_ctl, &ddr2_phy->pad_ctrl);
379ffa7a35SPurna Chandra Mandal
389ffa7a35SPurna Chandra Mandal /* SCL_CONFIG_0 */
399ffa7a35SPurna Chandra Mandal writel(SCL_BURST8 | SCL_DDR_CONNECTED | SCL_RCAS_LAT(RL) |
409ffa7a35SPurna Chandra Mandal SCL_ODTCSWW, &ddr2_phy->scl_config_1);
419ffa7a35SPurna Chandra Mandal
429ffa7a35SPurna Chandra Mandal /* SCL_CONFIG_1 */
439ffa7a35SPurna Chandra Mandal writel(SCL_CSEN | SCL_WCAS_LAT(WL), &ddr2_phy->scl_config_2);
449ffa7a35SPurna Chandra Mandal
459ffa7a35SPurna Chandra Mandal /* SCL_LAT */
469ffa7a35SPurna Chandra Mandal writel(SCL_CAPCLKDLY(3) | SCL_DDRCLKDLY(4), &ddr2_phy->scl_latency);
479ffa7a35SPurna Chandra Mandal }
489ffa7a35SPurna Chandra Mandal
499ffa7a35SPurna Chandra Mandal /* start phy self calibration logic */
ddr2_phy_calib_start(void)509ffa7a35SPurna Chandra Mandal static int ddr2_phy_calib_start(void)
519ffa7a35SPurna Chandra Mandal {
529ffa7a35SPurna Chandra Mandal struct ddr2_phy_regs *ddr2_phy;
539ffa7a35SPurna Chandra Mandal
549ffa7a35SPurna Chandra Mandal ddr2_phy = ioremap(PIC32_DDR2P_BASE, sizeof(*ddr2_phy));
559ffa7a35SPurna Chandra Mandal
569ffa7a35SPurna Chandra Mandal /* DDR Phy SCL Start */
579ffa7a35SPurna Chandra Mandal writel(SCL_START | SCL_EN, &ddr2_phy->scl_start);
589ffa7a35SPurna Chandra Mandal
599ffa7a35SPurna Chandra Mandal /* Wait for SCL for data byte to pass */
60*b491b498SJon Lin return wait_for_bit_le32(&ddr2_phy->scl_start, SCL_LUBPASS,
619ffa7a35SPurna Chandra Mandal true, CONFIG_SYS_HZ, false);
629ffa7a35SPurna Chandra Mandal }
639ffa7a35SPurna Chandra Mandal
649ffa7a35SPurna Chandra Mandal /* DDR2 Controller initialization */
659ffa7a35SPurna Chandra Mandal
669ffa7a35SPurna Chandra Mandal /* Target Agent Arbiter */
ddr_set_arbiter(struct ddr2_ctrl_regs * ctrl,const struct ddr2_arbiter_params * const param)679ffa7a35SPurna Chandra Mandal static void ddr_set_arbiter(struct ddr2_ctrl_regs *ctrl,
689ffa7a35SPurna Chandra Mandal const struct ddr2_arbiter_params *const param)
699ffa7a35SPurna Chandra Mandal {
709ffa7a35SPurna Chandra Mandal int i;
719ffa7a35SPurna Chandra Mandal
729ffa7a35SPurna Chandra Mandal for (i = 0; i < NUM_AGENTS; i++) {
739ffa7a35SPurna Chandra Mandal /* set min burst size */
749ffa7a35SPurna Chandra Mandal writel(i * MIN_LIM_WIDTH, &ctrl->tsel);
759ffa7a35SPurna Chandra Mandal writel(param->min_limit, &ctrl->minlim);
769ffa7a35SPurna Chandra Mandal
779ffa7a35SPurna Chandra Mandal /* set request period (4 * req_period clocks) */
789ffa7a35SPurna Chandra Mandal writel(i * RQST_PERIOD_WIDTH, &ctrl->tsel);
799ffa7a35SPurna Chandra Mandal writel(param->req_period, &ctrl->reqprd);
809ffa7a35SPurna Chandra Mandal
819ffa7a35SPurna Chandra Mandal /* set number of burst accepted */
829ffa7a35SPurna Chandra Mandal writel(i * MIN_CMDACPT_WIDTH, &ctrl->tsel);
839ffa7a35SPurna Chandra Mandal writel(param->min_cmd_acpt, &ctrl->mincmd);
849ffa7a35SPurna Chandra Mandal }
859ffa7a35SPurna Chandra Mandal }
869ffa7a35SPurna Chandra Mandal
board_get_ddr_arbiter_params(void)879ffa7a35SPurna Chandra Mandal const struct ddr2_arbiter_params *__weak board_get_ddr_arbiter_params(void)
889ffa7a35SPurna Chandra Mandal {
899ffa7a35SPurna Chandra Mandal /* default arbiter parameters */
909ffa7a35SPurna Chandra Mandal static const struct ddr2_arbiter_params arb_params[] = {
919ffa7a35SPurna Chandra Mandal { .min_limit = 0x1f, .req_period = 0xff, .min_cmd_acpt = 0x04,},
929ffa7a35SPurna Chandra Mandal { .min_limit = 0x1f, .req_period = 0xff, .min_cmd_acpt = 0x10,},
939ffa7a35SPurna Chandra Mandal { .min_limit = 0x1f, .req_period = 0xff, .min_cmd_acpt = 0x10,},
949ffa7a35SPurna Chandra Mandal { .min_limit = 0x04, .req_period = 0xff, .min_cmd_acpt = 0x04,},
959ffa7a35SPurna Chandra Mandal { .min_limit = 0x04, .req_period = 0xff, .min_cmd_acpt = 0x04,},
969ffa7a35SPurna Chandra Mandal };
979ffa7a35SPurna Chandra Mandal
989ffa7a35SPurna Chandra Mandal return &arb_params[0];
999ffa7a35SPurna Chandra Mandal }
1009ffa7a35SPurna Chandra Mandal
host_load_cmd(struct ddr2_ctrl_regs * ctrl,u32 cmd_idx,u32 hostcmd2,u32 hostcmd1,u32 delay)1019ffa7a35SPurna Chandra Mandal static void host_load_cmd(struct ddr2_ctrl_regs *ctrl, u32 cmd_idx,
1029ffa7a35SPurna Chandra Mandal u32 hostcmd2, u32 hostcmd1, u32 delay)
1039ffa7a35SPurna Chandra Mandal {
1049ffa7a35SPurna Chandra Mandal u32 hc_delay;
1059ffa7a35SPurna Chandra Mandal
1069ffa7a35SPurna Chandra Mandal hc_delay = max_t(u32, DIV_ROUND_UP(delay, T_CK), 2) - 2;
1079ffa7a35SPurna Chandra Mandal writel(hostcmd1, &ctrl->cmd10[cmd_idx]);
1089ffa7a35SPurna Chandra Mandal writel((hostcmd2 & 0x7ff) | (hc_delay << 11), &ctrl->cmd20[cmd_idx]);
1099ffa7a35SPurna Chandra Mandal }
1109ffa7a35SPurna Chandra Mandal
1119ffa7a35SPurna Chandra Mandal /* init DDR2 Controller */
ddr2_ctrl_init(void)1129ffa7a35SPurna Chandra Mandal void ddr2_ctrl_init(void)
1139ffa7a35SPurna Chandra Mandal {
1149ffa7a35SPurna Chandra Mandal u32 wr2prech, rd2prech, wr2rd, wr2rd_cs;
1159ffa7a35SPurna Chandra Mandal u32 ras2ras, ras2cas, prech2ras, temp;
1169ffa7a35SPurna Chandra Mandal const struct ddr2_arbiter_params *arb_params;
1179ffa7a35SPurna Chandra Mandal struct ddr2_ctrl_regs *ctrl;
1189ffa7a35SPurna Chandra Mandal
1199ffa7a35SPurna Chandra Mandal ctrl = ioremap(PIC32_DDR2C_BASE, sizeof(*ctrl));
1209ffa7a35SPurna Chandra Mandal
1219ffa7a35SPurna Chandra Mandal /* PIC32 DDR2 controller always work in HALF_RATE */
1229ffa7a35SPurna Chandra Mandal writel(HALF_RATE_MODE, &ctrl->memwidth);
1239ffa7a35SPurna Chandra Mandal
1249ffa7a35SPurna Chandra Mandal /* Set arbiter configuration per target */
1259ffa7a35SPurna Chandra Mandal arb_params = board_get_ddr_arbiter_params();
1269ffa7a35SPurna Chandra Mandal ddr_set_arbiter(ctrl, arb_params);
1279ffa7a35SPurna Chandra Mandal
1289ffa7a35SPurna Chandra Mandal /* Address Configuration, model {CS, ROW, BA, COL} */
1299ffa7a35SPurna Chandra Mandal writel((ROW_ADDR_RSHIFT | (BA_RSHFT << 8) | (CS_ADDR_RSHIFT << 16) |
1309ffa7a35SPurna Chandra Mandal (COL_HI_RSHFT << 24) | (SB_PRI << 29) |
1319ffa7a35SPurna Chandra Mandal (EN_AUTO_PRECH << 30)), &ctrl->memcfg0);
1329ffa7a35SPurna Chandra Mandal
1339ffa7a35SPurna Chandra Mandal writel(ROW_ADDR_MASK, &ctrl->memcfg1);
1349ffa7a35SPurna Chandra Mandal writel(COL_HI_MASK, &ctrl->memcfg2);
1359ffa7a35SPurna Chandra Mandal writel(COL_LO_MASK, &ctrl->memcfg3);
1369ffa7a35SPurna Chandra Mandal writel(BA_MASK | (CS_ADDR_MASK << 8), &ctrl->memcfg4);
1379ffa7a35SPurna Chandra Mandal
1389ffa7a35SPurna Chandra Mandal /* Refresh Config */
1399ffa7a35SPurna Chandra Mandal writel(REFCNT_CLK(DIV_ROUND_UP(T_RFI, T_CK_CTRL) - 2) |
1409ffa7a35SPurna Chandra Mandal REFDLY_CLK(DIV_ROUND_UP(T_RFC_MIN, T_CK_CTRL) - 2) |
1419ffa7a35SPurna Chandra Mandal MAX_PEND_REF(7),
1429ffa7a35SPurna Chandra Mandal &ctrl->refcfg);
1439ffa7a35SPurna Chandra Mandal
1449ffa7a35SPurna Chandra Mandal /* Power Config */
1459ffa7a35SPurna Chandra Mandal writel(ECC_EN(0) | ERR_CORR_EN(0) | EN_AUTO_PWR_DN(0) |
1469ffa7a35SPurna Chandra Mandal EN_AUTO_SELF_REF(3) | PWR_DN_DLY(8) |
1479ffa7a35SPurna Chandra Mandal SELF_REF_DLY(17) | PRECH_PWR_DN_ONLY(0),
1489ffa7a35SPurna Chandra Mandal &ctrl->pwrcfg);
1499ffa7a35SPurna Chandra Mandal
1509ffa7a35SPurna Chandra Mandal /* Delay Config */
1519ffa7a35SPurna Chandra Mandal wr2rd = max_t(u32, DIV_ROUND_UP(T_WTR, T_CK_CTRL),
1529ffa7a35SPurna Chandra Mandal DIV_ROUND_UP(T_WTR_TCK, 2)) + WL + BL;
1539ffa7a35SPurna Chandra Mandal wr2rd_cs = max_t(u32, wr2rd - 1, 3);
1549ffa7a35SPurna Chandra Mandal wr2prech = DIV_ROUND_UP(T_WR, T_CK_CTRL) + WL + BL;
1559ffa7a35SPurna Chandra Mandal rd2prech = max_t(u32, DIV_ROUND_UP(T_RTP, T_CK_CTRL),
1569ffa7a35SPurna Chandra Mandal DIV_ROUND_UP(T_RTP_TCK, 2)) + BL - 2;
1579ffa7a35SPurna Chandra Mandal ras2ras = max_t(u32, DIV_ROUND_UP(T_RRD, T_CK_CTRL),
1589ffa7a35SPurna Chandra Mandal DIV_ROUND_UP(T_RRD_TCK, 2)) - 1;
1599ffa7a35SPurna Chandra Mandal ras2cas = DIV_ROUND_UP(T_RCD, T_CK_CTRL) - 1;
1609ffa7a35SPurna Chandra Mandal prech2ras = DIV_ROUND_UP(T_RP, T_CK_CTRL) - 1;
1619ffa7a35SPurna Chandra Mandal
1629ffa7a35SPurna Chandra Mandal writel(((wr2rd & 0x0f) |
1639ffa7a35SPurna Chandra Mandal ((wr2rd_cs & 0x0f) << 4) |
1649ffa7a35SPurna Chandra Mandal ((BL - 1) << 8) |
1659ffa7a35SPurna Chandra Mandal (BL << 12) |
1669ffa7a35SPurna Chandra Mandal ((BL - 1) << 16) |
1679ffa7a35SPurna Chandra Mandal ((BL - 1) << 20) |
1689ffa7a35SPurna Chandra Mandal ((BL + 2) << 24) |
1699ffa7a35SPurna Chandra Mandal ((RL - WL + 3) << 28)), &ctrl->dlycfg0);
1709ffa7a35SPurna Chandra Mandal
1719ffa7a35SPurna Chandra Mandal writel(((T_CKE_TCK - 1) |
1729ffa7a35SPurna Chandra Mandal (((DIV_ROUND_UP(T_DLLK, 2) - 2) & 0xff) << 8) |
1739ffa7a35SPurna Chandra Mandal ((T_CKE_TCK - 1) << 16) |
1749ffa7a35SPurna Chandra Mandal ((max_t(u32, T_XP_TCK, T_CKE_TCK) - 1) << 20) |
1759ffa7a35SPurna Chandra Mandal ((wr2prech >> 4) << 26) |
1769ffa7a35SPurna Chandra Mandal ((wr2rd >> 4) << 27) |
1779ffa7a35SPurna Chandra Mandal ((wr2rd_cs >> 4) << 28) |
1789ffa7a35SPurna Chandra Mandal (((RL + 5) >> 4) << 29) |
1799ffa7a35SPurna Chandra Mandal ((DIV_ROUND_UP(T_DLLK, 2) >> 8) << 30)), &ctrl->dlycfg1);
1809ffa7a35SPurna Chandra Mandal
1819ffa7a35SPurna Chandra Mandal writel((DIV_ROUND_UP(T_RP, T_CK_CTRL) |
1829ffa7a35SPurna Chandra Mandal (rd2prech << 8) |
1839ffa7a35SPurna Chandra Mandal ((wr2prech & 0x0f) << 12) |
1849ffa7a35SPurna Chandra Mandal (ras2ras << 16) |
1859ffa7a35SPurna Chandra Mandal (ras2cas << 20) |
1869ffa7a35SPurna Chandra Mandal (prech2ras << 24) |
1879ffa7a35SPurna Chandra Mandal ((RL + 3) << 28)), &ctrl->dlycfg2);
1889ffa7a35SPurna Chandra Mandal
1899ffa7a35SPurna Chandra Mandal writel(((DIV_ROUND_UP(T_RAS_MIN, T_CK_CTRL) - 1) |
1909ffa7a35SPurna Chandra Mandal ((DIV_ROUND_UP(T_RC, T_CK_CTRL) - 1) << 8) |
1919ffa7a35SPurna Chandra Mandal ((DIV_ROUND_UP(T_FAW, T_CK_CTRL) - 1) << 16)),
1929ffa7a35SPurna Chandra Mandal &ctrl->dlycfg3);
1939ffa7a35SPurna Chandra Mandal
1949ffa7a35SPurna Chandra Mandal /* ODT Config */
1959ffa7a35SPurna Chandra Mandal writel(0x0, &ctrl->odtcfg);
1969ffa7a35SPurna Chandra Mandal writel(BIT(16), &ctrl->odtencfg);
1979ffa7a35SPurna Chandra Mandal writel(ODTRDLY(RL - 3) | ODTWDLY(WL - 3) | ODTRLEN(2) | ODTWLEN(3),
1989ffa7a35SPurna Chandra Mandal &ctrl->odtcfg);
1999ffa7a35SPurna Chandra Mandal
2009ffa7a35SPurna Chandra Mandal /* Transfer Configuration */
2019ffa7a35SPurna Chandra Mandal writel(NXTDATRQDLY(2) | NXDATAVDLY(4) | RDATENDLY(2) |
2029ffa7a35SPurna Chandra Mandal MAX_BURST(3) | (7 << 28) | BIG_ENDIAN(0),
2039ffa7a35SPurna Chandra Mandal &ctrl->xfercfg);
2049ffa7a35SPurna Chandra Mandal
2059ffa7a35SPurna Chandra Mandal /* DRAM Initialization */
2069ffa7a35SPurna Chandra Mandal /* CKE high after reset and wait 400 nsec */
2079ffa7a35SPurna Chandra Mandal host_load_cmd(ctrl, 0, 0, IDLE_NOP, 400000);
2089ffa7a35SPurna Chandra Mandal
2099ffa7a35SPurna Chandra Mandal /* issue precharge all command */
2109ffa7a35SPurna Chandra Mandal host_load_cmd(ctrl, 1, 0x04, PRECH_ALL_CMD, T_RP + T_CK);
2119ffa7a35SPurna Chandra Mandal
2129ffa7a35SPurna Chandra Mandal /* initialize EMR2 */
2139ffa7a35SPurna Chandra Mandal host_load_cmd(ctrl, 2, 0x200, LOAD_MODE_CMD, T_MRD_TCK * T_CK);
2149ffa7a35SPurna Chandra Mandal
2159ffa7a35SPurna Chandra Mandal /* initialize EMR3 */
2169ffa7a35SPurna Chandra Mandal host_load_cmd(ctrl, 3, 0x300, LOAD_MODE_CMD, T_MRD_TCK * T_CK);
2179ffa7a35SPurna Chandra Mandal
2189ffa7a35SPurna Chandra Mandal /*
2199ffa7a35SPurna Chandra Mandal * RDQS disable, DQSB enable, OCD exit, 150 ohm termination,
2209ffa7a35SPurna Chandra Mandal * AL=0, DLL enable
2219ffa7a35SPurna Chandra Mandal */
2229ffa7a35SPurna Chandra Mandal host_load_cmd(ctrl, 4, 0x100,
2239ffa7a35SPurna Chandra Mandal LOAD_MODE_CMD | (0x40 << 24), T_MRD_TCK * T_CK);
2249ffa7a35SPurna Chandra Mandal /*
2259ffa7a35SPurna Chandra Mandal * PD fast exit, WR REC = T_WR in clocks -1,
2269ffa7a35SPurna Chandra Mandal * DLL reset, CAS = RL, burst = 4
2279ffa7a35SPurna Chandra Mandal */
2289ffa7a35SPurna Chandra Mandal temp = ((DIV_ROUND_UP(T_WR, T_CK) - 1) << 1) | 1;
2299ffa7a35SPurna Chandra Mandal host_load_cmd(ctrl, 5, temp, LOAD_MODE_CMD | (RL << 28) | (2 << 24),
2309ffa7a35SPurna Chandra Mandal T_MRD_TCK * T_CK);
2319ffa7a35SPurna Chandra Mandal
2329ffa7a35SPurna Chandra Mandal /* issue precharge all command */
2339ffa7a35SPurna Chandra Mandal host_load_cmd(ctrl, 6, 4, PRECH_ALL_CMD, T_RP + T_CK);
2349ffa7a35SPurna Chandra Mandal
2359ffa7a35SPurna Chandra Mandal /* issue refresh command */
2369ffa7a35SPurna Chandra Mandal host_load_cmd(ctrl, 7, 0, REF_CMD, T_RFC_MIN);
2379ffa7a35SPurna Chandra Mandal
2389ffa7a35SPurna Chandra Mandal /* issue refresh command */
2399ffa7a35SPurna Chandra Mandal host_load_cmd(ctrl, 8, 0, REF_CMD, T_RFC_MIN);
2409ffa7a35SPurna Chandra Mandal
2419ffa7a35SPurna Chandra Mandal /* Mode register programming as before without DLL reset */
2429ffa7a35SPurna Chandra Mandal host_load_cmd(ctrl, 9, temp, LOAD_MODE_CMD | (RL << 28) | (3 << 24),
2439ffa7a35SPurna Chandra Mandal T_MRD_TCK * T_CK);
2449ffa7a35SPurna Chandra Mandal
2459ffa7a35SPurna Chandra Mandal /* extended mode register same as before with OCD default */
2469ffa7a35SPurna Chandra Mandal host_load_cmd(ctrl, 10, 0x103, LOAD_MODE_CMD | (0xc << 24),
2479ffa7a35SPurna Chandra Mandal T_MRD_TCK * T_CK);
2489ffa7a35SPurna Chandra Mandal
2499ffa7a35SPurna Chandra Mandal /* extended mode register same as before with OCD exit */
2509ffa7a35SPurna Chandra Mandal host_load_cmd(ctrl, 11, 0x100, LOAD_MODE_CMD | (0x4 << 28),
2519ffa7a35SPurna Chandra Mandal 140 * T_CK);
2529ffa7a35SPurna Chandra Mandal
2539ffa7a35SPurna Chandra Mandal writel(CMD_VALID | NUMHOSTCMD(11), &ctrl->cmdissue);
2549ffa7a35SPurna Chandra Mandal
2559ffa7a35SPurna Chandra Mandal /* start memory initialization */
2569ffa7a35SPurna Chandra Mandal writel(INIT_START, &ctrl->memcon);
2579ffa7a35SPurna Chandra Mandal
2589ffa7a35SPurna Chandra Mandal /* wait for all host cmds to be transmitted */
259*b491b498SJon Lin wait_for_bit_le32(&ctrl->cmdissue, CMD_VALID, false,
2609ffa7a35SPurna Chandra Mandal CONFIG_SYS_HZ, false);
2619ffa7a35SPurna Chandra Mandal
2629ffa7a35SPurna Chandra Mandal /* inform all cmds issued, ready for normal operation */
2639ffa7a35SPurna Chandra Mandal writel(INIT_START | INIT_DONE, &ctrl->memcon);
2649ffa7a35SPurna Chandra Mandal
2659ffa7a35SPurna Chandra Mandal /* perform phy caliberation */
2669ffa7a35SPurna Chandra Mandal if (ddr2_phy_calib_start())
2679ffa7a35SPurna Chandra Mandal printf("ddr2: phy calib failed\n");
2689ffa7a35SPurna Chandra Mandal }
2699ffa7a35SPurna Chandra Mandal
ddr2_calculate_size(void)2709ffa7a35SPurna Chandra Mandal phys_size_t ddr2_calculate_size(void)
2719ffa7a35SPurna Chandra Mandal {
2729ffa7a35SPurna Chandra Mandal u32 temp;
2739ffa7a35SPurna Chandra Mandal
2749ffa7a35SPurna Chandra Mandal temp = 1 << (COL_BITS + BA_BITS + ROW_BITS);
2759ffa7a35SPurna Chandra Mandal /* 16-bit data width between controller and DIMM */
2769ffa7a35SPurna Chandra Mandal temp = temp * CS_BITS * (16 / 8);
2779ffa7a35SPurna Chandra Mandal return (phys_size_t)temp;
2789ffa7a35SPurna Chandra Mandal }
279