coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
dmc_init_ddr3.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 /* DDR3 mem setup file for SMDK5250 board based on EXYNOS5 */
4 
5 #include <device/mmio.h>
6 #include <console/console.h>
7 #include <delay.h>
8 #include <soc/clk.h>
9 #include <soc/cpu.h>
10 #include <soc/dmc.h>
11 #include <soc/setup.h>
12 
13 #define RDLVL_COMPLETE_TIMEOUT 10000
14 
15 static void reset_phy_ctrl(void)
16 {
21 
22  udelay(500);
23 }
24 
25 int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long mem_iv_size,
26  int mem_reset)
27 {
28  unsigned int val;
29  int i;
30 
31  if (mem_reset)
33 
34  /* Set Impedance Output Driver */
35  val = (mem->impedance << CA_CK_DRVR_DS_OFFSET) |
41 
42  /* Set Read Latency and Burst Length for PHY0 and PHY1 */
47 
48  /* ZQ Calibration */
50  printk(BIOS_EMERG, "DRAM ZQ CALIBRATION FAILURE\n");
52  }
53 
54  /* DQ Signal */
57 
61 
63 
64  /* DQS Signal */
67 
70 
73 
80 
81  /* Start DLL locking */
86 
88 
91 
92  /* Memory Channel Inteleaving Size */
94 
95  /* Set DMC MEMCONTROL register */
98 
103 
104  /* Precharge Configuration */
107 
108  /* Power Down mode Configuration */
112 
113  /* TimingRow, TimingData, TimingPower and Timingaref
114  * values as per Memory AC parameters
115  */
120 
121  /* Send PALL command */
123 
124  if (mem_reset) {
125  /* Send NOP, MRS and ZQINIT commands.
126  * Sending MRS command will reset the DRAM. We should not be
127  * resetting the DRAM after resume, this will lead to memory
128  * corruption as DRAM content is lost after DRAM reset
129  */
131  }
132 
133  if (mem->gate_leveling_enable) {
135  val |= P0_CMD_EN;
138 
140  val |= INIT_DESKEW_EN;
143 
145  val |= P0_CMD_EN;
146  val |= BYTE_RDLVL_EN;
149 
150  val = (mem->ctrl_start_point <<
158 
160  val |= INIT_DESKEW_EN;
161  val |= RDLVL_GATE_EN;
164 
166  val |= P0_CMD_EN;
167  val |= BYTE_RDLVL_EN;
168  val |= CTRL_SHGATE;
171 
176 
179  while ((read32(&exynos_dmc->phystatus) &
181  (RDLVL_COMPLETE_CHO | RDLVL_COMPLETE_CH1) && i > 0) {
182  /*
183  * TODO(waihong): Comment on how long this take to
184  * timeout
185  */
186  udelay(1);
187  i--;
188  }
189  if (!i){
190  printk(BIOS_EMERG, "Timeout on RDLVL. No DRAM.\n");
192  }
194 
197 
198  val = (mem->ctrl_start_point <<
207 
209  }
210 
211  /* Send PALL command */
213 
215 
216  /* Set DMC Concontrol and enable auto-refresh counter */
220  return 0;
221 }
static void write32(void *addr, uint32_t val)
Definition: mmio.h:40
static uint32_t read32(const void *addr)
Definition: mmio.h:22
#define printk(level,...)
Definition: stdlib.h:16
void update_reset_dll(struct exynos5_dmc *dmc, enum ddr_mode mode)
Definition: dmc_common.c:72
void dmc_config_mrs(struct mem_timings *mem, struct exynos5_dmc *dmc)
Definition: dmc_common.c:92
int dmc_config_zq(struct mem_timings *mem, struct exynos5_phy_control *phy0_ctrl, struct exynos5_phy_control *phy1_ctrl)
Definition: dmc_common.c:14
void dmc_config_prech(struct mem_timings *mem, struct exynos5_dmc *dmc)
Definition: dmc_common.c:139
int ddr3_mem_ctrl_init(struct mem_timings *mem, unsigned long mem_iv_size, int mem_reset)
Definition: dmc_init_ddr3.c:25
static void reset_phy_ctrl(void)
Definition: dmc_init_ddr3.c:15
#define RDLVL_COMPLETE_TIMEOUT
Definition: dmc_init_ddr3.c:13
static struct exynos5_clock *const exynos_clock
Definition: clk.h:446
#define PHY_CON12_CTRL_START_POINT_SHIFT
Definition: dmc.h:220
static struct exynos5_phy_control *const exynos_phy0_control
Definition: dmc.h:155
static struct exynos5_phy_control *const exynos_phy1_control
Definition: dmc.h:157
#define PHY_CON12_CTRL_START_SHIFT
Definition: dmc.h:223
#define PHY_CON42_CTRL_RDLAT_SHIFT
Definition: dmc.h:242
#define CONCONTROL_AREF_EN_SHIFT
Definition: dmc.h:202
#define PWRDNCONFIG_DSREF_CYC_SHIFT
Definition: dmc.h:209
#define PHY_CON12_CTRL_INC_SHIFT
Definition: dmc.h:221
#define PWRDNCONFIG_DPWRDN_CYC_SHIFT
Definition: dmc.h:208
static struct exynos5_dmc *const exynos_dmc
Definition: dmc.h:105
#define PRECHCONFIG_TP_CNT_SHIFT
Definition: dmc.h:205
#define CONCONTROL_DFI_INIT_START_SHIFT
Definition: dmc.h:199
#define PHY_CON12_CTRL_REF_SHIFT
Definition: dmc.h:227
@ DDR_MODE_DDR3
Definition: dmc.h:162
#define PHY_CON42_CTRL_BSTLEN_SHIFT
Definition: dmc.h:239
#define CONCONTROL_RD_FETCH_SHIFT
Definition: dmc.h:200
#define PHY_CON12_CTRL_DLL_ON_SHIFT
Definition: dmc.h:225
#define PHY_CON12_CTRL_FORCE_SHIFT
Definition: dmc.h:222
#define BYTE_RDLVL_EN
Definition: setup.h:616
#define INIT_DESKEW_EN
Definition: setup.h:623
#define RDLVL_COMPLETE_CH1
Definition: setup.h:119
#define LPDDR3PHY_CTRL_PHY_RESET_DISABLE
Definition: setup.h:611
#define RDLVL_GATE_EN
Definition: setup.h:624
#define PHY_CON1_RESET_VAL
Definition: setup.h:619
#define CTRL_SHGATE
Definition: setup.h:617
#define CTRL_GATEDURADJ_MASK
Definition: setup.h:620
#define CA_ADR_DRVR_DS_OFFSET
Definition: setup.h:656
#define CTRL_RDLVL_GATE_DISABLE
Definition: setup.h:634
#define CA_CKE_DRVR_DS_OFFSET
Definition: setup.h:654
#define P0_CMD_EN
Definition: setup.h:615
#define DMC_MEMCONTROL_DSREF_ENABLE
Definition: setup.h:68
#define LPDDR3PHY_CTRL_PHY_RESET_ENABLE
Definition: setup.h:612
#define CA_CS_DRVR_DS_OFFSET
Definition: setup.h:655
#define CTRL_RDLVL_GATE_ENABLE
Definition: setup.h:633
#define CA_CK_DRVR_DS_OFFSET
Definition: setup.h:653
#define PHY_CON2_RESET_VAL
Definition: setup.h:622
@ SETUP_ERR_RDLV_COMPLETE_TIMEOUT
Definition: setup.h:666
@ SETUP_ERR_ZQ_CALIBRATION_FAILURE
Definition: setup.h:667
#define RDLVL_COMPLETE_CHO
Definition: setup.h:118
#define PHY_CON0_RESET_VAL
Definition: setup.h:614
#define BIOS_EMERG
BIOS_EMERG - Emergency / Fatal.
Definition: loglevel.h:25
unsigned int lpddr3phy_ctrl
Definition: clk.h:438
unsigned int memconfig0
Definition: dmc.h:13
unsigned int timingrow
Definition: dmc.h:22
unsigned int membaseconfig1
Definition: dmc.h:71
unsigned int timingdata
Definition: dmc.h:23
unsigned int prechconfig
Definition: dmc.h:16
unsigned int memconfig1
Definition: dmc.h:14
unsigned int pwrdnconfig
Definition: dmc.h:19
unsigned int membaseconfig0
Definition: dmc.h:70
unsigned int timingpower
Definition: dmc.h:24
unsigned int memcontrol
Definition: dmc.h:12
unsigned int concontrol
Definition: dmc.h:11
unsigned int phystatus
Definition: dmc.h:25
unsigned int ivcontrol
Definition: dmc.h:64
unsigned int rdlvl_config
Definition: dmc.h:66
unsigned int timingref
Definition: dmc.h:21
unsigned int phy_con14
Definition: dmc.h:122
unsigned int phy_con4
Definition: dmc.h:112
unsigned int phy_con2
Definition: dmc.h:110
unsigned int phy_con12
Definition: dmc.h:120
unsigned int phy_con0
Definition: dmc.h:108
unsigned int phy_con42
Definition: dmc.h:151
unsigned int phy_con1
Definition: dmc.h:109
unsigned int phy_con6
Definition: dmc.h:114
unsigned int phy_con10
Definition: dmc.h:118
unsigned int phy_con39
Definition: dmc.h:148
unsigned int membaseconfig0
Definition: dmc.h:317
uint8_t dfi_init_start
Definition: dmc.h:305
unsigned int membaseconfig1
Definition: dmc.h:318
unsigned int phy1_dq
Definition: dmc.h:286
uint8_t gate_leveling_enable
Definition: dmc.h:329
unsigned int prechconfig_tp_cnt
Definition: dmc.h:319
unsigned int memcontrol
Definition: dmc.h:314
uint8_t phy0_pulld_dqs
Definition: dmc.h:289
uint8_t phy0_tFS
Definition: dmc.h:287
uint8_t ctrl_rdlat
Definition: dmc.h:300
uint8_t ctrl_bstlen
Definition: dmc.h:301
uint8_t ctrl_inc
Definition: dmc.h:294
unsigned int phy0_dqs
Definition: dmc.h:283
unsigned int impedance
Definition: dmc.h:328
unsigned int memconfig
Definition: dmc.h:315
uint8_t ctrl_dll_on
Definition: dmc.h:296
uint8_t aref_en
Definition: dmc.h:306
unsigned int timing_power
Definition: dmc.h:280
unsigned int dpwrdn_cyc
Definition: dmc.h:320
uint8_t ctrl_start_point
Definition: dmc.h:293
unsigned int timing_data
Definition: dmc.h:279
uint8_t ctrl_start
Definition: dmc.h:295
unsigned int phy0_dq
Definition: dmc.h:285
uint8_t phy1_pulld_dqs
Definition: dmc.h:290
uint8_t ctrl_ref
Definition: dmc.h:297
unsigned int timing_ref
Definition: dmc.h:277
unsigned int phy1_dqs
Definition: dmc.h:284
uint8_t rd_fetch
Definition: dmc.h:308
uint8_t phy1_tFS
Definition: dmc.h:288
unsigned int concontrol
Definition: dmc.h:322
uint8_t ctrl_force
Definition: dmc.h:299
unsigned int dsref_cyc
Definition: dmc.h:321
unsigned int timing_row
Definition: dmc.h:278
uint8_t iv_size
Definition: dmc.h:304
u8 val
Definition: sys.c:300
void udelay(uint32_t us)
Definition: udelay.c:15