blob: e00c61580b50217c4226c08c908246665a7991d1 [file] [log] [blame]
Angel Ponsa2ee7612020-04-04 18:51:15 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Patrick Georgi40a3e322015-06-22 19:41:29 +02002
Kyösti Mälkki13f66502019-03-03 08:01:05 +02003#include <device/mmio.h>
Patrick Georgi40a3e322015-06-22 19:41:29 +02004#include <console/console.h>
5#include <delay.h>
6#include <soc/addressmap.h>
7#include <soc/clock.h>
8#include <soc/emc.h>
9#include <soc/mc.h>
10#include <soc/pmc.h>
11#include <soc/sdram.h>
Patrick Georgi40a3e322015-06-22 19:41:29 +020012#include <soc/nvidia/tegra/apbmisc.h>
13
14static void sdram_patch(uintptr_t addr, uint32_t value)
15{
16 if (addr)
17 write32((uint32_t *)addr, value);
18}
19
20static void writebits(uint32_t value, uint32_t *addr, uint32_t mask)
21{
Julius Werner55009af2019-12-02 22:03:27 -080022 clrsetbits32(addr, mask, (value & mask));
Patrick Georgi40a3e322015-06-22 19:41:29 +020023}
24
25static void sdram_trigger_emc_timing_update(struct tegra_emc_regs *regs)
26{
27 write32(&regs->timing_control, EMC_TIMING_CONTROL_TIMING_UPDATE);
28}
29
30/* PMC must be configured before clock-enable and de-reset of MC/EMC. */
31static void sdram_configure_pmc(const struct sdram_params *param,
32 struct tegra_pmc_regs *regs)
33{
34 /* VDDP Select */
35 write32(&regs->vddp_sel, param->PmcVddpSel);
36 udelay(param->PmcVddpSelWait);
37
38 /* Set DDR pad voltage */
39 writebits(param->PmcDdrPwr, &regs->ddr_pwr, PMC_DDR_PWR_VAL_MASK);
40
41 /* Turn on MEM IO Power */
42 writebits(param->PmcNoIoPower, &regs->no_iopower,
43 (PMC_NO_IOPOWER_MEM_MASK | PMC_NO_IOPOWER_MEM_COMP_MASK));
44
45 write32(&regs->reg_short, param->PmcRegShort);
46 write32(&regs->ddr_cntrl, param->PmcDdrCntrl);
47}
48
49static void sdram_set_ddr_control(const struct sdram_params *param,
50 struct tegra_pmc_regs *regs)
51{
52 u32 ddrcntrl = read32(&regs->ddr_cntrl);
53
54 /* Deassert HOLD_CKE_LOW */
55 ddrcntrl &= ~PMC_CMD_HOLD_LOW_BR00_11_MASK;
56 write32(&regs->ddr_cntrl, ddrcntrl);
57 udelay(param->PmcDdrCntrlWait);
58}
59
60static void sdram_start_clocks(const struct sdram_params *param,
61 struct tegra_emc_regs *regs)
62{
63 struct clk_rst_ctlr *clk_rst = (void *)TEGRA_CLK_RST_BASE;
64
65 u32 is_same_freq = (param->McEmemArbMisc0 &
66 MC_EMEM_ARB_MISC0_MC_EMC_SAME_FREQ_MASK) ? 1 : 0;
67 u32 clk_source_emc = param->EmcClockSource;
68
69 /* Enable the clocks for EMC and MC */
Julius Werner55009af2019-12-02 22:03:27 -080070 setbits32(&clk_rst->clk_enb_h_set, (1 << 25)); // ENB_EMC
71 setbits32(&clk_rst->clk_enb_h_set, (1 << 0)); // ENB_MC
Patrick Georgi40a3e322015-06-22 19:41:29 +020072
73 if ((clk_source_emc >> EMC_2X_CLK_SRC_SHIFT) != PLLM_UD)
Julius Werner55009af2019-12-02 22:03:27 -080074 setbits32(&clk_rst->clk_enb_x_set, CLK_ENB_EMC_DLL);
Patrick Georgi40a3e322015-06-22 19:41:29 +020075
76 /* Remove the EMC and MC controllers from reset */
Julius Werner55009af2019-12-02 22:03:27 -080077 clrbits32(&clk_rst->rst_dev_h, (1 << 25)); // SWR_EMC
78 clrbits32(&clk_rst->rst_dev_h, (1 << 0)); // SWR_MC
Patrick Georgi40a3e322015-06-22 19:41:29 +020079
80 clk_source_emc |= (is_same_freq << 16);
81
82 write32(&clk_rst->clk_src_emc, clk_source_emc);
83 write32(&clk_rst->clk_src_emc_dll, param->EmcClockSourceDll);
84
85 clock_sdram(param->PllMInputDivider, param->PllMFeedbackDivider,
86 param->PllMPostDivider, param->PllMSetupControl,
87 param->PllMKVCO, param->PllMKCP, param->PllMStableTime,
88 param->EmcClockSource, is_same_freq);
89
90 if (param->ClkRstControllerPllmMisc2OverrideEnable)
91 write32(&clk_rst->pllm_misc2,
92 param->ClkRstControllerPllmMisc2Override);
93
94 /* Wait for enough time for clk switch to take place */
95 udelay(5);
96
97 write32(&clk_rst->clk_enb_w_clr, param->ClearClk2Mc1);
98}
99
100static void sdram_set_swizzle(const struct sdram_params *param,
101 struct tegra_emc_regs *regs)
102{
103 write32(&regs->swizzle_rank0_byte0, param->EmcSwizzleRank0Byte0);
104 write32(&regs->swizzle_rank0_byte1, param->EmcSwizzleRank0Byte1);
105 write32(&regs->swizzle_rank0_byte2, param->EmcSwizzleRank0Byte2);
106 write32(&regs->swizzle_rank0_byte3, param->EmcSwizzleRank0Byte3);
107
108 write32(&regs->swizzle_rank1_byte0, param->EmcSwizzleRank1Byte0);
109 write32(&regs->swizzle_rank1_byte1, param->EmcSwizzleRank1Byte1);
110 write32(&regs->swizzle_rank1_byte2, param->EmcSwizzleRank1Byte2);
111 write32(&regs->swizzle_rank1_byte3, param->EmcSwizzleRank1Byte3);
112}
113
114static void sdram_set_pad_controls(const struct sdram_params *param,
115 struct tegra_emc_regs *regs)
116{
117 /* Program the pad controls */
118 write32(&regs->xm2comppadctrl, param->EmcXm2CompPadCtrl);
119 write32(&regs->xm2comppadctrl2, param->EmcXm2CompPadCtrl2);
120 write32(&regs->xm2comppadctrl3, param->EmcXm2CompPadCtrl3);
121}
122
123static void sdram_set_pad_macros(const struct sdram_params *param,
124 struct tegra_emc_regs *regs)
125{
126 u32 rfu_reset, rfu_mask1, rfu_mask2, rfu_step1, rfu_step2;
127 u32 cpm_reset_settings, cpm_mask1, cpm_step1;
128
129 write32(&regs->pmacro_vttgen_ctrl0, param->EmcPmacroVttgenCtrl0);
130 write32(&regs->pmacro_vttgen_ctrl1, param->EmcPmacroVttgenCtrl1);
131 write32(&regs->pmacro_vttgen_ctrl2, param->EmcPmacroVttgenCtrl2);
132 /* Trigger timing update so above writes take place */
133 sdram_trigger_emc_timing_update(regs);
134 /* Add a wait to ensure the regulators settle */
135 udelay(10);
136
137 write32(&regs->dbg,
138 param->EmcDbg | (param->EmcDbgWriteMux & WRITE_MUX_ACTIVE));
139
140 rfu_reset = EMC_PMACRO_BRICK_CTRL_RFU1_RESET_VAL;
141 rfu_mask1 = 0x01120112;
142 rfu_mask2 = 0x01BF01BF;
143
144 rfu_step1 = rfu_reset & (param->EmcPmacroBrickCtrlRfu1 | ~rfu_mask1);
145 rfu_step2 = rfu_reset & (param->EmcPmacroBrickCtrlRfu1 | ~rfu_mask2);
146
147 /* common pad macro (cpm) */
148 cpm_reset_settings = 0x0000000F;
149 cpm_mask1 = 0x00000001;
150 cpm_step1 = cpm_reset_settings;
151 cpm_step1 &= (param->EmcPmacroCommonPadTxCtrl | ~cpm_mask1);
152
153 /* Patch 2 using BCT spare variables */
154 sdram_patch(param->EmcBctSpare2, param->EmcBctSpare3);
155
156 /*
157 * Program CMD mapping. Required before brick mapping, else
Martin Roth26f97f92021-10-01 14:53:22 -0600158 * we can't guarantee CK will be differential at all times.
Patrick Georgi40a3e322015-06-22 19:41:29 +0200159 */
160 write32(&regs->fbio_cfg7, param->EmcFbioCfg7);
161
162 write32(&regs->cmd_mapping_cmd0_0, param->EmcCmdMappingCmd0_0);
163 write32(&regs->cmd_mapping_cmd0_1, param->EmcCmdMappingCmd0_1);
164 write32(&regs->cmd_mapping_cmd0_2, param->EmcCmdMappingCmd0_2);
165 write32(&regs->cmd_mapping_cmd1_0, param->EmcCmdMappingCmd1_0);
166 write32(&regs->cmd_mapping_cmd1_1, param->EmcCmdMappingCmd1_1);
167 write32(&regs->cmd_mapping_cmd1_2, param->EmcCmdMappingCmd1_2);
168 write32(&regs->cmd_mapping_cmd2_0, param->EmcCmdMappingCmd2_0);
169 write32(&regs->cmd_mapping_cmd2_1, param->EmcCmdMappingCmd2_1);
170 write32(&regs->cmd_mapping_cmd2_2, param->EmcCmdMappingCmd2_2);
171 write32(&regs->cmd_mapping_cmd3_0, param->EmcCmdMappingCmd3_0);
172 write32(&regs->cmd_mapping_cmd3_1, param->EmcCmdMappingCmd3_1);
173 write32(&regs->cmd_mapping_cmd3_2, param->EmcCmdMappingCmd3_2);
174 write32(&regs->cmd_mapping_byte, param->EmcCmdMappingByte);
175
176 /* Program brick mapping. */
177 write32(&regs->pmacro_brick_mapping0, param->EmcPmacroBrickMapping0);
178 write32(&regs->pmacro_brick_mapping1, param->EmcPmacroBrickMapping1);
179 write32(&regs->pmacro_brick_mapping2, param->EmcPmacroBrickMapping2);
180
181 write32(&regs->pmacro_brick_ctrl_rfu1, rfu_step1);
182
183 /* This is required to do any reads from the pad macros */
184 write32(&regs->config_sample_delay, param->EmcConfigSampleDelay);
185
186 write32(&regs->fbio_cfg8, param->EmcFbioCfg8);
187
188 sdram_set_swizzle(param, regs);
189
190 /* Patch 4 using BCT spare variables */
191 sdram_patch(param->EmcBctSpare6, param->EmcBctSpare7);
192
193 sdram_set_pad_controls(param, regs);
194
195 /* Program Autocal controls with shadowed register fields */
196 write32(&regs->auto_cal_config2, param->EmcAutoCalConfig2);
197 write32(&regs->auto_cal_config3, param->EmcAutoCalConfig3);
198 write32(&regs->auto_cal_config4, param->EmcAutoCalConfig4);
199 write32(&regs->auto_cal_config5, param->EmcAutoCalConfig5);
200 write32(&regs->auto_cal_config6, param->EmcAutoCalConfig6);
201 write32(&regs->auto_cal_config7, param->EmcAutoCalConfig7);
202 write32(&regs->auto_cal_config8, param->EmcAutoCalConfig8);
203
204 write32(&regs->pmacro_rx_term, param->EmcPmacroRxTerm);
205 write32(&regs->pmacro_dq_tx_drv, param->EmcPmacroDqTxDrv);
206 write32(&regs->pmacro_ca_tx_drv, param->EmcPmacroCaTxDrv);
207 write32(&regs->pmacro_cmd_tx_drv, param->EmcPmacroCmdTxDrv);
208 write32(&regs->pmacro_autocal_cfg_common,
209 param->EmcPmacroAutocalCfgCommon);
210 write32(&regs->auto_cal_channel, param->EmcAutoCalChannel);
211 write32(&regs->pmacro_zctrl, param->EmcPmacroZctrl);
212
213 write32(&regs->dll_cfg0, param->EmcDllCfg0);
214 write32(&regs->dll_cfg1, param->EmcDllCfg1);
215 write32(&regs->cfg_dig_dll_1, param->EmcCfgDigDll_1);
216
217 write32(&regs->data_brlshft_0, param->EmcDataBrlshft0);
218 write32(&regs->data_brlshft_1, param->EmcDataBrlshft1);
219 write32(&regs->dqs_brlshft_0, param->EmcDqsBrlshft0);
220 write32(&regs->dqs_brlshft_1, param->EmcDqsBrlshft1);
221 write32(&regs->cmd_brlshft_0, param->EmcCmdBrlshft0);
222 write32(&regs->cmd_brlshft_1, param->EmcCmdBrlshft1);
223 write32(&regs->cmd_brlshft_2, param->EmcCmdBrlshft2);
224 write32(&regs->cmd_brlshft_3, param->EmcCmdBrlshft3);
225 write32(&regs->quse_brlshft_0, param->EmcQuseBrlshft0);
226 write32(&regs->quse_brlshft_1, param->EmcQuseBrlshft1);
227 write32(&regs->quse_brlshft_2, param->EmcQuseBrlshft2);
228 write32(&regs->quse_brlshft_3, param->EmcQuseBrlshft3);
229
230 write32(&regs->pmacro_brick_ctrl_rfu1, rfu_step2);
231 write32(&regs->pmacro_pad_cfg_ctrl, param->EmcPmacroPadCfgCtrl);
232
233 write32(&regs->pmacro_pad_cfg_ctrl, param->EmcPmacroPadCfgCtrl);
234 write32(&regs->pmacro_cmd_brick_ctrl_fdpd,
235 param->EmcPmacroCmdBrickCtrlFdpd);
236 write32(&regs->pmacro_brick_ctrl_rfu2,
237 param->EmcPmacroBrickCtrlRfu2 & 0xFF7FFF7F);
238 write32(&regs->pmacro_data_brick_ctrl_fdpd,
239 param->EmcPmacroDataBrickCtrlFdpd);
240 write32(&regs->pmacro_bg_bias_ctrl_0, param->EmcPmacroBgBiasCtrl0);
241 write32(&regs->pmacro_data_pad_rx_ctrl, param->EmcPmacroDataPadRxCtrl);
242 write32(&regs->pmacro_cmd_pad_rx_ctrl, param->EmcPmacroCmdPadRxCtrl);
243 write32(&regs->pmacro_data_pad_tx_ctrl, param->EmcPmacroDataPadTxCtrl);
244 write32(&regs->pmacro_data_rx_term_mode,
245 param->EmcPmacroDataRxTermMode);
246 write32(&regs->pmacro_cmd_rx_term_mode, param->EmcPmacroCmdRxTermMode);
247 write32(&regs->pmacro_cmd_pad_tx_ctrl, param->EmcPmacroCmdPadTxCtrl);
248
249 write32(&regs->cfg_3, param->EmcCfg3);
250 write32(&regs->pmacro_tx_pwrd_0, param->EmcPmacroTxPwrd0);
251 write32(&regs->pmacro_tx_pwrd_1, param->EmcPmacroTxPwrd1);
252 write32(&regs->pmacro_tx_pwrd_2, param->EmcPmacroTxPwrd2);
253 write32(&regs->pmacro_tx_pwrd_3, param->EmcPmacroTxPwrd3);
254 write32(&regs->pmacro_tx_pwrd_4, param->EmcPmacroTxPwrd4);
255 write32(&regs->pmacro_tx_pwrd_5, param->EmcPmacroTxPwrd5);
256 write32(&regs->pmacro_tx_sel_clk_src_0, param->EmcPmacroTxSelClkSrc0);
257 write32(&regs->pmacro_tx_sel_clk_src_1, param->EmcPmacroTxSelClkSrc1);
258 write32(&regs->pmacro_tx_sel_clk_src_2, param->EmcPmacroTxSelClkSrc2);
259 write32(&regs->pmacro_tx_sel_clk_src_3, param->EmcPmacroTxSelClkSrc3);
260 write32(&regs->pmacro_tx_sel_clk_src_4, param->EmcPmacroTxSelClkSrc4);
261 write32(&regs->pmacro_tx_sel_clk_src_5, param->EmcPmacroTxSelClkSrc5);
262 write32(&regs->pmacro_ddll_bypass, param->EmcPmacroDdllBypass);
263 write32(&regs->pmacro_ddll_pwrd_0, param->EmcPmacroDdllPwrd0);
264 write32(&regs->pmacro_ddll_pwrd_1, param->EmcPmacroDdllPwrd1);
265 write32(&regs->pmacro_ddll_pwrd_2, param->EmcPmacroDdllPwrd2);
266 write32(&regs->pmacro_cmd_ctrl_0, param->EmcPmacroCmdCtrl0);
267 write32(&regs->pmacro_cmd_ctrl_1, param->EmcPmacroCmdCtrl1);
268 write32(&regs->pmacro_cmd_ctrl_2, param->EmcPmacroCmdCtrl2);
269 write32(&regs->pmacro_ib_vref_dq_0, param->EmcPmacroIbVrefDq_0);
270 write32(&regs->pmacro_ib_vref_dq_1, param->EmcPmacroIbVrefDq_1);
271 write32(&regs->pmacro_ib_vref_dqs_0, param->EmcPmacroIbVrefDqs_0);
272 write32(&regs->pmacro_ib_vref_dqs_1, param->EmcPmacroIbVrefDqs_1);
273 write32(&regs->pmacro_ib_rxrt, param->EmcPmacroIbRxrt);
274 write32(&regs->pmacro_quse_ddll_rank0_0,
275 param->EmcPmacroQuseDdllRank0_0);
276 write32(&regs->pmacro_quse_ddll_rank0_1,
277 param->EmcPmacroQuseDdllRank0_1);
278 write32(&regs->pmacro_quse_ddll_rank0_2,
279 param->EmcPmacroQuseDdllRank0_2);
280 write32(&regs->pmacro_quse_ddll_rank0_3,
281 param->EmcPmacroQuseDdllRank0_3);
282 write32(&regs->pmacro_quse_ddll_rank0_4,
283 param->EmcPmacroQuseDdllRank0_4);
284 write32(&regs->pmacro_quse_ddll_rank0_5,
285 param->EmcPmacroQuseDdllRank0_5);
286 write32(&regs->pmacro_quse_ddll_rank1_0,
287 param->EmcPmacroQuseDdllRank1_0);
288 write32(&regs->pmacro_quse_ddll_rank1_1,
289 param->EmcPmacroQuseDdllRank1_1);
290 write32(&regs->pmacro_quse_ddll_rank1_2,
291 param->EmcPmacroQuseDdllRank1_2);
292 write32(&regs->pmacro_quse_ddll_rank1_3,
293 param->EmcPmacroQuseDdllRank1_3);
294 write32(&regs->pmacro_quse_ddll_rank1_4,
295 param->EmcPmacroQuseDdllRank1_4);
296 write32(&regs->pmacro_quse_ddll_rank1_5,
297 param->EmcPmacroQuseDdllRank1_5);
298 write32(&regs->pmacro_brick_ctrl_rfu1, param->EmcPmacroBrickCtrlRfu1);
299 write32(&regs->pmacro_ob_ddll_long_dq_rank0_0,
300 param->EmcPmacroObDdllLongDqRank0_0);
301 write32(&regs->pmacro_ob_ddll_long_dq_rank0_1,
302 param->EmcPmacroObDdllLongDqRank0_1);
303 write32(&regs->pmacro_ob_ddll_long_dq_rank0_2,
304 param->EmcPmacroObDdllLongDqRank0_2);
305 write32(&regs->pmacro_ob_ddll_long_dq_rank0_3,
306 param->EmcPmacroObDdllLongDqRank0_3);
307 write32(&regs->pmacro_ob_ddll_long_dq_rank0_4,
308 param->EmcPmacroObDdllLongDqRank0_4);
309 write32(&regs->pmacro_ob_ddll_long_dq_rank0_5,
310 param->EmcPmacroObDdllLongDqRank0_5);
311 write32(&regs->pmacro_ob_ddll_long_dq_rank1_0,
312 param->EmcPmacroObDdllLongDqRank1_0);
313 write32(&regs->pmacro_ob_ddll_long_dq_rank1_1,
314 param->EmcPmacroObDdllLongDqRank1_1);
315 write32(&regs->pmacro_ob_ddll_long_dq_rank1_2,
316 param->EmcPmacroObDdllLongDqRank1_2);
317 write32(&regs->pmacro_ob_ddll_long_dq_rank1_3,
318 param->EmcPmacroObDdllLongDqRank1_3);
319 write32(&regs->pmacro_ob_ddll_long_dq_rank1_4,
320 param->EmcPmacroObDdllLongDqRank1_4);
321 write32(&regs->pmacro_ob_ddll_long_dq_rank1_5,
322 param->EmcPmacroObDdllLongDqRank1_5);
323
324 write32(&regs->pmacro_ob_ddll_long_dqs_rank0_0,
325 param->EmcPmacroObDdllLongDqsRank0_0);
326 write32(&regs->pmacro_ob_ddll_long_dqs_rank0_1,
327 param->EmcPmacroObDdllLongDqsRank0_1);
328 write32(&regs->pmacro_ob_ddll_long_dqs_rank0_2,
329 param->EmcPmacroObDdllLongDqsRank0_2);
330 write32(&regs->pmacro_ob_ddll_long_dqs_rank0_3,
331 param->EmcPmacroObDdllLongDqsRank0_3);
332 write32(&regs->pmacro_ob_ddll_long_dqs_rank0_4,
333 param->EmcPmacroObDdllLongDqsRank0_4);
334 write32(&regs->pmacro_ob_ddll_long_dqs_rank0_5,
335 param->EmcPmacroObDdllLongDqsRank0_5);
336 write32(&regs->pmacro_ob_ddll_long_dqs_rank1_0,
337 param->EmcPmacroObDdllLongDqsRank1_0);
338 write32(&regs->pmacro_ob_ddll_long_dqs_rank1_1,
339 param->EmcPmacroObDdllLongDqsRank1_1);
340 write32(&regs->pmacro_ob_ddll_long_dqs_rank1_2,
341 param->EmcPmacroObDdllLongDqsRank1_2);
342 write32(&regs->pmacro_ob_ddll_long_dqs_rank1_3,
343 param->EmcPmacroObDdllLongDqsRank1_3);
344 write32(&regs->pmacro_ob_ddll_long_dqs_rank1_4,
345 param->EmcPmacroObDdllLongDqsRank1_4);
346 write32(&regs->pmacro_ob_ddll_long_dqs_rank1_5,
347 param->EmcPmacroObDdllLongDqsRank1_5);
348 write32(&regs->pmacro_ib_ddll_long_dqs_rank0_0,
349 param->EmcPmacroIbDdllLongDqsRank0_0);
350 write32(&regs->pmacro_ib_ddll_long_dqs_rank0_1,
351 param->EmcPmacroIbDdllLongDqsRank0_1);
352 write32(&regs->pmacro_ib_ddll_long_dqs_rank0_2,
353 param->EmcPmacroIbDdllLongDqsRank0_2);
354 write32(&regs->pmacro_ib_ddll_long_dqs_rank0_3,
355 param->EmcPmacroIbDdllLongDqsRank0_3);
356 write32(&regs->pmacro_ib_ddll_long_dqs_rank1_0,
357 param->EmcPmacroIbDdllLongDqsRank1_0);
358 write32(&regs->pmacro_ib_ddll_long_dqs_rank1_1,
359 param->EmcPmacroIbDdllLongDqsRank1_1);
360 write32(&regs->pmacro_ib_ddll_long_dqs_rank1_2,
361 param->EmcPmacroIbDdllLongDqsRank1_2);
362 write32(&regs->pmacro_ib_ddll_long_dqs_rank1_3,
363 param->EmcPmacroIbDdllLongDqsRank1_3);
364 write32(&regs->pmacro_ddll_long_cmd_0, param->EmcPmacroDdllLongCmd_0);
365 write32(&regs->pmacro_ddll_long_cmd_1, param->EmcPmacroDdllLongCmd_1);
366 write32(&regs->pmacro_ddll_long_cmd_2, param->EmcPmacroDdllLongCmd_2);
367 write32(&regs->pmacro_ddll_long_cmd_3, param->EmcPmacroDdllLongCmd_3);
368 write32(&regs->pmacro_ddll_long_cmd_4, param->EmcPmacroDdllLongCmd_4);
369 write32(&regs->pmacro_ddll_short_cmd_0, param->EmcPmacroDdllShortCmd_0);
370 write32(&regs->pmacro_ddll_short_cmd_1, param->EmcPmacroDdllShortCmd_1);
371 write32(&regs->pmacro_ddll_short_cmd_2, param->EmcPmacroDdllShortCmd_2);
372 write32(&regs->pmacro_common_pad_tx_ctrl, cpm_step1);
373}
374
375static void sdram_setup_wpr_carveouts(const struct sdram_params *param,
376 struct tegra_mc_regs *regs)
377{
378 /* Program the 5 WPR carveouts with initial BCT settings. */
379 write32(&regs->security_carveout1_bom,
380 param->McGeneralizedCarveout1Bom);
381 write32(&regs->security_carveout1_bom_hi,
382 param->McGeneralizedCarveout1BomHi);
383 write32(&regs->security_carveout1_size_128kb,
384 param->McGeneralizedCarveout1Size128kb);
385 write32(&regs->security_carveout1_ca0,
386 param->McGeneralizedCarveout1Access0);
387 write32(&regs->security_carveout1_ca1,
388 param->McGeneralizedCarveout1Access1);
389 write32(&regs->security_carveout1_ca2,
390 param->McGeneralizedCarveout1Access2);
391 write32(&regs->security_carveout1_ca3,
392 param->McGeneralizedCarveout1Access3);
393 write32(&regs->security_carveout1_ca4,
394 param->McGeneralizedCarveout1Access4);
395 write32(&regs->security_carveout1_cfia0,
396 param->McGeneralizedCarveout1ForceInternalAccess0);
397 write32(&regs->security_carveout1_cfia1,
398 param->McGeneralizedCarveout1ForceInternalAccess1);
399 write32(&regs->security_carveout1_cfia2,
400 param->McGeneralizedCarveout1ForceInternalAccess2);
401 write32(&regs->security_carveout1_cfia3,
402 param->McGeneralizedCarveout1ForceInternalAccess3);
403 write32(&regs->security_carveout1_cfia4,
404 param->McGeneralizedCarveout1ForceInternalAccess4);
405 write32(&regs->security_carveout1_cfg0,
406 param->McGeneralizedCarveout1Cfg0);
407
408 write32(&regs->security_carveout2_bom,
409 param->McGeneralizedCarveout2Bom);
410 write32(&regs->security_carveout2_bom_hi,
411 param->McGeneralizedCarveout2BomHi);
412 write32(&regs->security_carveout2_size_128kb,
413 param->McGeneralizedCarveout2Size128kb);
414 write32(&regs->security_carveout2_ca0,
415 param->McGeneralizedCarveout2Access0);
416 write32(&regs->security_carveout2_ca1,
417 param->McGeneralizedCarveout2Access1);
418 write32(&regs->security_carveout2_ca2,
419 param->McGeneralizedCarveout2Access2);
420 write32(&regs->security_carveout2_ca3,
421 param->McGeneralizedCarveout2Access3);
422 write32(&regs->security_carveout2_ca4,
423 param->McGeneralizedCarveout2Access4);
424 write32(&regs->security_carveout2_cfia0,
425 param->McGeneralizedCarveout2ForceInternalAccess0);
426 write32(&regs->security_carveout2_cfia1,
427 param->McGeneralizedCarveout2ForceInternalAccess1);
428 write32(&regs->security_carveout2_cfia2,
429 param->McGeneralizedCarveout2ForceInternalAccess2);
430 write32(&regs->security_carveout2_cfia3,
431 param->McGeneralizedCarveout2ForceInternalAccess3);
432 write32(&regs->security_carveout2_cfia4,
433 param->McGeneralizedCarveout2ForceInternalAccess4);
434 write32(&regs->security_carveout2_cfg0,
435 param->McGeneralizedCarveout2Cfg0);
436
437 write32(&regs->security_carveout3_bom,
438 param->McGeneralizedCarveout3Bom);
439 write32(&regs->security_carveout3_bom_hi,
440 param->McGeneralizedCarveout3BomHi);
441 write32(&regs->security_carveout3_size_128kb,
442 param->McGeneralizedCarveout3Size128kb);
443 write32(&regs->security_carveout3_ca0,
444 param->McGeneralizedCarveout3Access0);
445 write32(&regs->security_carveout3_ca1,
446 param->McGeneralizedCarveout3Access1);
447 write32(&regs->security_carveout3_ca2,
448 param->McGeneralizedCarveout3Access2);
449 write32(&regs->security_carveout3_ca3,
450 param->McGeneralizedCarveout3Access3);
451 write32(&regs->security_carveout3_ca4,
452 param->McGeneralizedCarveout3Access4);
453 write32(&regs->security_carveout3_cfia0,
454 param->McGeneralizedCarveout3ForceInternalAccess0);
455 write32(&regs->security_carveout3_cfia1,
456 param->McGeneralizedCarveout3ForceInternalAccess1);
457 write32(&regs->security_carveout3_cfia2,
458 param->McGeneralizedCarveout3ForceInternalAccess2);
459 write32(&regs->security_carveout3_cfia3,
460 param->McGeneralizedCarveout3ForceInternalAccess3);
461 write32(&regs->security_carveout3_cfia4,
462 param->McGeneralizedCarveout3ForceInternalAccess4);
463 write32(&regs->security_carveout3_cfg0,
464 param->McGeneralizedCarveout3Cfg0);
465
466 write32(&regs->security_carveout4_bom,
467 param->McGeneralizedCarveout4Bom);
468 write32(&regs->security_carveout4_bom_hi,
469 param->McGeneralizedCarveout4BomHi);
470 write32(&regs->security_carveout4_size_128kb,
471 param->McGeneralizedCarveout4Size128kb);
472 write32(&regs->security_carveout4_ca0,
473 param->McGeneralizedCarveout4Access0);
474 write32(&regs->security_carveout4_ca1,
475 param->McGeneralizedCarveout4Access1);
476 write32(&regs->security_carveout4_ca2,
477 param->McGeneralizedCarveout4Access2);
478 write32(&regs->security_carveout4_ca3,
479 param->McGeneralizedCarveout4Access3);
480 write32(&regs->security_carveout4_ca4,
481 param->McGeneralizedCarveout4Access4);
482 write32(&regs->security_carveout4_cfia0,
483 param->McGeneralizedCarveout4ForceInternalAccess0);
484 write32(&regs->security_carveout4_cfia1,
485 param->McGeneralizedCarveout4ForceInternalAccess1);
486 write32(&regs->security_carveout4_cfia2,
487 param->McGeneralizedCarveout4ForceInternalAccess2);
488 write32(&regs->security_carveout4_cfia3,
489 param->McGeneralizedCarveout4ForceInternalAccess3);
490 write32(&regs->security_carveout4_cfia4,
491 param->McGeneralizedCarveout4ForceInternalAccess4);
492 write32(&regs->security_carveout4_cfg0,
493 param->McGeneralizedCarveout4Cfg0);
494
495 write32(&regs->security_carveout5_bom,
496 param->McGeneralizedCarveout5Bom);
497 write32(&regs->security_carveout5_bom_hi,
498 param->McGeneralizedCarveout5BomHi);
499 write32(&regs->security_carveout5_size_128kb,
500 param->McGeneralizedCarveout5Size128kb);
501 write32(&regs->security_carveout5_ca0,
502 param->McGeneralizedCarveout5Access0);
503 write32(&regs->security_carveout5_ca1,
504 param->McGeneralizedCarveout5Access1);
505 write32(&regs->security_carveout5_ca2,
506 param->McGeneralizedCarveout5Access2);
507 write32(&regs->security_carveout5_ca3,
508 param->McGeneralizedCarveout5Access3);
509 write32(&regs->security_carveout5_ca4,
510 param->McGeneralizedCarveout5Access4);
511 write32(&regs->security_carveout5_cfia0,
512 param->McGeneralizedCarveout5ForceInternalAccess0);
513 write32(&regs->security_carveout5_cfia1,
514 param->McGeneralizedCarveout5ForceInternalAccess1);
515 write32(&regs->security_carveout5_cfia2,
516 param->McGeneralizedCarveout5ForceInternalAccess2);
517 write32(&regs->security_carveout5_cfia3,
518 param->McGeneralizedCarveout5ForceInternalAccess3);
519 write32(&regs->security_carveout5_cfia4,
520 param->McGeneralizedCarveout5ForceInternalAccess4);
521 write32(&regs->security_carveout5_cfg0,
522 param->McGeneralizedCarveout5Cfg0);
523}
524
525static void sdram_init_mc(const struct sdram_params *param,
526 struct tegra_mc_regs *regs)
527{
528 /* Initialize MC VPR settings */
529 write32(&regs->video_protect_bom, param->McVideoProtectBom);
530 write32(&regs->video_protect_bom_adr_hi,
531 param->McVideoProtectBomAdrHi);
532 write32(&regs->video_protect_size_mb, param->McVideoProtectSizeMb);
533 write32(&regs->video_protect_vpr_override,
534 param->McVideoProtectVprOverride);
535 write32(&regs->video_protect_vpr_override1,
536 param->McVideoProtectVprOverride1);
537 write32(&regs->video_protect_gpu_override_0,
538 param->McVideoProtectGpuOverride0);
539 write32(&regs->video_protect_gpu_override_1,
540 param->McVideoProtectGpuOverride1);
541
542 /* Program SDRAM geometry paarameters */
543 write32(&regs->emem_adr_cfg, param->McEmemAdrCfg);
544 write32(&regs->emem_adr_cfg_dev0, param->McEmemAdrCfgDev0);
545 write32(&regs->emem_adr_cfg_dev1, param->McEmemAdrCfgDev1);
546 write32(&regs->emem_adr_cfg_channel_mask,
547 param->McEmemAdrCfgChannelMask);
548
549 /* Program bank swizzling */
550 write32(&regs->emem_adr_cfg_bank_mask_0, param->McEmemAdrCfgBankMask0);
551 write32(&regs->emem_adr_cfg_bank_mask_1, param->McEmemAdrCfgBankMask1);
552 write32(&regs->emem_adr_cfg_bank_mask_2, param->McEmemAdrCfgBankMask2);
553
554 /* Program external memory aperature (base and size) */
555 write32(&regs->emem_cfg, param->McEmemCfg);
556
557 /* Program SEC carveout (base and size) */
558 write32(&regs->sec_carveout_bom, param->McSecCarveoutBom);
559 write32(&regs->sec_carveout_adr_hi, param->McSecCarveoutAdrHi);
560 write32(&regs->sec_carveout_size_mb, param->McSecCarveoutSizeMb);
561
562 /* Program MTS carveout (base and size) */
563 write32(&regs->mts_carveout_bom, param->McMtsCarveoutBom);
564 write32(&regs->mts_carveout_adr_hi, param->McMtsCarveoutAdrHi);
565 write32(&regs->mts_carveout_size_mb, param->McMtsCarveoutSizeMb);
566
567 /* Initialize the WPR carveouts */
568 sdram_setup_wpr_carveouts(param, regs);
569
570 /* Program the memory arbiter */
571 write32(&regs->emem_arb_cfg, param->McEmemArbCfg);
572 write32(&regs->emem_arb_outstanding_req,
573 param->McEmemArbOutstandingReq);
574 write32(&regs->emem_arb_refpb_hp_ctrl, param->McEmemArbRefpbHpCtrl);
575 write32(&regs->emem_arb_refpb_bank_ctrl, param->McEmemArbRefpbBankCtrl);
576 write32(&regs->emem_arb_timing_rcd, param->McEmemArbTimingRcd);
577 write32(&regs->emem_arb_timing_rp, param->McEmemArbTimingRp);
578 write32(&regs->emem_arb_timing_rc, param->McEmemArbTimingRc);
579 write32(&regs->emem_arb_timing_ras, param->McEmemArbTimingRas);
580 write32(&regs->emem_arb_timing_faw, param->McEmemArbTimingFaw);
581 write32(&regs->emem_arb_timing_rrd, param->McEmemArbTimingRrd);
582 write32(&regs->emem_arb_timing_rap2pre, param->McEmemArbTimingRap2Pre);
583 write32(&regs->emem_arb_timing_wap2pre, param->McEmemArbTimingWap2Pre);
584 write32(&regs->emem_arb_timing_r2r, param->McEmemArbTimingR2R);
585 write32(&regs->emem_arb_timing_w2w, param->McEmemArbTimingW2W);
586 write32(&regs->emem_arb_timing_ccdmw, param->McEmemArbTimingCcdmw);
587 write32(&regs->emem_arb_timing_r2w, param->McEmemArbTimingR2W);
588 write32(&regs->emem_arb_timing_w2r, param->McEmemArbTimingW2R);
589 write32(&regs->emem_arb_timing_rfcpb, param->McEmemArbTimingRFCPB);
590 write32(&regs->emem_arb_da_turns, param->McEmemArbDaTurns);
591 write32(&regs->emem_arb_da_covers, param->McEmemArbDaCovers);
592 write32(&regs->emem_arb_misc0, param->McEmemArbMisc0);
593 write32(&regs->emem_arb_misc1, param->McEmemArbMisc1);
594 write32(&regs->emem_arb_misc2, param->McEmemArbMisc2);
595 write32(&regs->emem_arb_ring1_throttle, param->McEmemArbRing1Throttle);
596 write32(&regs->emem_arb_override, param->McEmemArbOverride);
597 write32(&regs->emem_arb_override_1, param->McEmemArbOverride1);
598 write32(&regs->emem_arb_rsv, param->McEmemArbRsv);
599 write32(&regs->da_config0, param->McDaCfg0);
600
601 /* Trigger MC timing update */
602 write32(&regs->timing_control, EMC_TIMING_CONTROL_TIMING_UPDATE);
603
604 /* Program second-level clock enable overrides */
605 write32(&regs->clken_override, param->McClkenOverride);
606
607 /* Program statistics gathering */
608 write32(&regs->stat_control, param->McStatControl);
609}
610
611static void sdram_init_emc(const struct sdram_params *param,
612 struct tegra_emc_regs *regs)
613{
614 /* Program SDRAM geometry parameters */
615 write32(&regs->adr_cfg, param->EmcAdrCfg);
616
617 /* Program second-level clock enable overrides */
618 write32(&regs->clken_override, param->EmcClkenOverride);
619
620 /* Program EMC pad auto calibration */
621 write32(&regs->pmacro_autocal_cfg0, param->EmcPmacroAutocalCfg0);
622 write32(&regs->pmacro_autocal_cfg1, param->EmcPmacroAutocalCfg1);
623 write32(&regs->pmacro_autocal_cfg2, param->EmcPmacroAutocalCfg2);
624
625 write32(&regs->auto_cal_vref_sel0, param->EmcAutoCalVrefSel0);
626 write32(&regs->auto_cal_vref_sel1, param->EmcAutoCalVrefSel1);
627
628 write32(&regs->auto_cal_interval, param->EmcAutoCalInterval);
629 write32(&regs->auto_cal_config, param->EmcAutoCalConfig);
630 udelay(param->EmcAutoCalWait);
631}
632
633static void sdram_set_emc_timing(const struct sdram_params *param,
634 struct tegra_emc_regs *regs)
635{
636 /* Program EMC timing configuration */
637 write32(&regs->cfg_2, param->EmcCfg2);
638 write32(&regs->cfg_pipe, param->EmcCfgPipe);
639 write32(&regs->cfg_pipe1, param->EmcCfgPipe1);
640 write32(&regs->cfg_pipe2, param->EmcCfgPipe2);
641 write32(&regs->cmdq, param->EmcCmdQ);
642 write32(&regs->mc2emcq, param->EmcMc2EmcQ);
643 write32(&regs->mrs_wait_cnt, param->EmcMrsWaitCnt);
644 write32(&regs->mrs_wait_cnt2, param->EmcMrsWaitCnt2);
645 write32(&regs->fbio_cfg5, param->EmcFbioCfg5);
646 write32(&regs->rc, param->EmcRc);
647 write32(&regs->rfc, param->EmcRfc);
648 write32(&regs->rfcpb, param->EmcRfcPb);
649 write32(&regs->refctrl2, param->EmcRefctrl2);
650 write32(&regs->rfc_slr, param->EmcRfcSlr);
651 write32(&regs->ras, param->EmcRas);
652 write32(&regs->rp, param->EmcRp);
653 write32(&regs->tppd, param->EmcTppd);
654 write32(&regs->r2r, param->EmcR2r);
655 write32(&regs->w2w, param->EmcW2w);
656 write32(&regs->r2w, param->EmcR2w);
657 write32(&regs->w2r, param->EmcW2r);
658 write32(&regs->r2p, param->EmcR2p);
659 write32(&regs->w2p, param->EmcW2p);
660 write32(&regs->ccdmw, param->EmcCcdmw);
661 write32(&regs->rd_rcd, param->EmcRdRcd);
662 write32(&regs->wr_rcd, param->EmcWrRcd);
663 write32(&regs->rrd, param->EmcRrd);
664 write32(&regs->rext, param->EmcRext);
665 write32(&regs->wext, param->EmcWext);
666 write32(&regs->wdv, param->EmcWdv);
667 write32(&regs->wdv_chk, param->EmcWdvChk);
668 write32(&regs->wsv, param->EmcWsv);
669 write32(&regs->wev, param->EmcWev);
670 write32(&regs->wdv_mask, param->EmcWdvMask);
671 write32(&regs->ws_duration, param->EmcWsDuration);
672 write32(&regs->we_duration, param->EmcWeDuration);
673 write32(&regs->quse, param->EmcQUse);
674 write32(&regs->quse_width, param->EmcQuseWidth);
675 write32(&regs->ibdly, param->EmcIbdly);
676 write32(&regs->obdly, param->EmcObdly);
677 write32(&regs->einput, param->EmcEInput);
678 write32(&regs->einput_duration, param->EmcEInputDuration);
679 write32(&regs->puterm_extra, param->EmcPutermExtra);
680 write32(&regs->puterm_width, param->EmcPutermWidth);
681
682 write32(&regs->pmacro_common_pad_tx_ctrl,
683 param->EmcPmacroCommonPadTxCtrl);
684 write32(&regs->dbg, param->EmcDbg);
685 write32(&regs->qrst, param->EmcQRst);
686 write32(&regs->issue_qrst, 1);
687 write32(&regs->issue_qrst, 0);
688 write32(&regs->qsafe, param->EmcQSafe);
689 write32(&regs->rdv, param->EmcRdv);
690 write32(&regs->rdv_mask, param->EmcRdvMask);
691 write32(&regs->rdv_early, param->EmcRdvEarly);
692 write32(&regs->rdv_early_mask, param->EmcRdvEarlyMask);
693 write32(&regs->qpop, param->EmcQpop);
694 write32(&regs->refresh, param->EmcRefresh);
695 write32(&regs->burst_refresh_num, param->EmcBurstRefreshNum);
696 write32(&regs->pre_refresh_req_cnt, param->EmcPreRefreshReqCnt);
697 write32(&regs->pdex2wr, param->EmcPdEx2Wr);
698 write32(&regs->pdex2rd, param->EmcPdEx2Rd);
699 write32(&regs->pchg2pden, param->EmcPChg2Pden);
700 write32(&regs->act2pden, param->EmcAct2Pden);
701 write32(&regs->ar2pden, param->EmcAr2Pden);
702 write32(&regs->rw2pden, param->EmcRw2Pden);
703 write32(&regs->cke2pden, param->EmcCke2Pden);
704 write32(&regs->pdex2cke, param->EmcPdex2Cke);
705 write32(&regs->pdex2mrr, param->EmcPdex2Mrr);
706 write32(&regs->txsr, param->EmcTxsr);
707 write32(&regs->txsrdll, param->EmcTxsrDll);
708 write32(&regs->tcke, param->EmcTcke);
709 write32(&regs->tckesr, param->EmcTckesr);
710 write32(&regs->tpd, param->EmcTpd);
711 write32(&regs->tfaw, param->EmcTfaw);
712 write32(&regs->trpab, param->EmcTrpab);
713 write32(&regs->tclkstable, param->EmcTClkStable);
714 write32(&regs->tclkstop, param->EmcTClkStop);
715 write32(&regs->trefbw, param->EmcTRefBw);
716 write32(&regs->odt_write, param->EmcOdtWrite);
717 write32(&regs->cfg_dig_dll, param->EmcCfgDigDll);
718 write32(&regs->cfg_dig_dll_period, param->EmcCfgDigDllPeriod);
719
720 /* Don't write CFG_ADR_EN (bit 1) here - lock bit written later */
721 write32(&regs->fbio_spare, param->EmcFbioSpare & ~CFG_ADR_EN_LOCKED);
722 write32(&regs->cfg_rsv, param->EmcCfgRsv);
723 write32(&regs->pmc_scratch1, param->EmcPmcScratch1);
724 write32(&regs->pmc_scratch2, param->EmcPmcScratch2);
725 write32(&regs->pmc_scratch3, param->EmcPmcScratch3);
726 write32(&regs->acpd_control, param->EmcAcpdControl);
727 write32(&regs->txdsrvttgen, param->EmcTxdsrvttgen);
728
729 /*
730 * Set pipe bypass enable bits before sending any DRAM commands.
731 * Note other bits in EMC_CFG must be set AFTER REFCTRL is configured.
732 */
733 writebits(param->EmcCfg, &regs->cfg,
734 (EMC_CFG_EMC2PMACRO_CFG_BYPASS_ADDRPIPE_MASK |
735 EMC_CFG_EMC2PMACRO_CFG_BYPASS_DATAPIPE1_MASK |
736 EMC_CFG_EMC2PMACRO_CFG_BYPASS_DATAPIPE2_MASK));
737}
738
739static void sdram_patch_bootrom(const struct sdram_params *param,
740 struct tegra_mc_regs *regs)
741{
742 if (param->BootRomPatchControl & BOOT_ROM_PATCH_CONTROL_ENABLE_MASK) {
743 uintptr_t addr = ((param->BootRomPatchControl &
744 BOOT_ROM_PATCH_CONTROL_OFFSET_MASK) >>
745 BOOT_ROM_PATCH_CONTROL_OFFSET_SHIFT);
746 addr = BOOT_ROM_PATCH_CONTROL_BASE_ADDRESS + (addr << 2);
747 write32((uint32_t *)addr, param->BootRomPatchData);
748 write32(&regs->timing_control,
749 EMC_TIMING_CONTROL_TIMING_UPDATE);
750 }
751}
752
753static void sdram_rel_dpd(const struct sdram_params *param,
754 struct tegra_pmc_regs *regs)
755{
756 u32 dpd3_val, dpd3_val_sel_dpd;
757
758 /* Release SEL_DPD_CMD */
759 dpd3_val = (param->EmcPmcScratch1 & 0x3FFFFFFF) | DPD_OFF;
760 dpd3_val_sel_dpd = dpd3_val & 0xCFFF0000;
761 write32(&regs->io_dpd3_req, dpd3_val_sel_dpd);
762 udelay(param->PmcIoDpd3ReqWait);
763}
764
765/* Program DPD3/DPD4 regs (coldboot path) */
766static void sdram_set_dpd(const struct sdram_params *param,
767 struct tegra_pmc_regs *regs)
768{
769 u32 dpd3_val, dpd3_val_sel_dpd;
770 u32 dpd4_val, dpd4_val_e_dpd, dpd4_val_e_dpd_vttgen;
771
772 /* Enable sel_dpd on unused pins */
773 dpd3_val = (param->EmcPmcScratch1 & 0x3FFFFFFF) | DPD_ON;
774 dpd3_val_sel_dpd = (dpd3_val ^ 0x0000FFFF) & 0xC000FFFF;
775 write32(&regs->io_dpd3_req, dpd3_val_sel_dpd);
776 udelay(param->PmcIoDpd3ReqWait);
777
778 dpd4_val = dpd3_val;
779 /* Disable e_dpd_vttgen */
780 dpd4_val_e_dpd_vttgen = (dpd4_val ^ 0x3FFF0000) & 0xFFFF0000;
781 write32(&regs->io_dpd4_req, dpd4_val_e_dpd_vttgen);
782 udelay(param->PmcIoDpd4ReqWait);
783
784 /* Disable e_dpd_bg */
785 dpd4_val_e_dpd = (dpd4_val ^ 0x0000FFFF) & 0xC000FFFF;
786 write32(&regs->io_dpd4_req, dpd4_val_e_dpd);
787 udelay(param->PmcIoDpd4ReqWait);
788
789 write32(&regs->weak_bias, 0);
790 /* Add a wait to make sure clock switch takes place */
791 udelay(1);
792}
793
794static void sdram_set_clock_enable_signal(const struct sdram_params *param,
795 struct tegra_emc_regs *regs)
796{
797 volatile uint32_t dummy = 0;
798 uint32_t val = 0;
799
800 if (param->MemoryType == NvBootMemoryType_LpDdr4) {
Patrick Georgi40a3e322015-06-22 19:41:29 +0200801 val = (param->EmcPinGpioEn << EMC_PIN_GPIOEN_SHIFT) |
802 (param->EmcPinGpio << EMC_PIN_GPIO_SHIFT);
803 write32(&regs->pin, val);
804
Julius Werner55009af2019-12-02 22:03:27 -0800805 clrbits32(&regs->pin,
806 (EMC_PIN_RESET_MASK | EMC_PIN_DQM_MASK |
807 EMC_PIN_CKE_MASK));
Patrick Georgi40a3e322015-06-22 19:41:29 +0200808 /*
809 * Assert dummy read of PIN register to ensure above write goes
810 * through. Wait an additional 200us here as per NVIDIA.
811 */
812 dummy |= read32(&regs->pin);
813 udelay(param->EmcPinExtraWait + 200);
814
815 /* Deassert reset */
Julius Werner55009af2019-12-02 22:03:27 -0800816 setbits32(&regs->pin, EMC_PIN_RESET_INACTIVE);
Patrick Georgi40a3e322015-06-22 19:41:29 +0200817
818 /*
819 * Assert dummy read of PIN register to ensure above write goes
820 * through. Wait an additional 2000us here as per NVIDIA.
821 */
822 dummy |= read32(&regs->pin);
823 udelay(param->EmcPinExtraWait + 2000);
824 }
825
826 /* Enable clock enable signal */
Julius Werner55009af2019-12-02 22:03:27 -0800827 setbits32(&regs->pin, EMC_PIN_CKE_NORMAL);
Patrick Georgi40a3e322015-06-22 19:41:29 +0200828
829 /* Dummy read of PIN register to ensure final write goes through */
830 dummy |= read32(&regs->pin);
831 udelay(param->EmcPinProgramWait);
832
833 if (!dummy)
834 die("Failed to program EMC pin.");
835
836 if (param->MemoryType != NvBootMemoryType_LpDdr4) {
Patrick Georgi40a3e322015-06-22 19:41:29 +0200837 /* Send NOP (trigger just needs to be non-zero) */
838 writebits(((1 << EMC_NOP_CMD_SHIFT) |
839 (param->EmcDevSelect << EMC_NOP_DEV_SELECTN_SHIFT)),
840 &regs->nop,
841 EMC_NOP_CMD_MASK | EMC_NOP_DEV_SELECTN_MASK);
842 }
843
844 /* On coldboot w/LPDDR2/3, wait 200 uSec after asserting CKE high */
845 if (param->MemoryType == NvBootMemoryType_LpDdr2)
846 udelay(param->EmcPinExtraWait + 200);
847}
848
849static void sdram_init_lpddr3(const struct sdram_params *param,
850 struct tegra_emc_regs *regs)
851{
852 /* Precharge all banks. DEV_SELECTN = 0 => Select all devices */
853 write32(&regs->pre,
854 ((param->EmcDevSelect << EMC_REF_DEV_SELECTN_SHIFT) | 1));
855
856 /* Send Reset MRW command */
857 write32(&regs->mrw, param->EmcMrwResetCommand);
858 udelay(param->EmcMrwResetNInitWait);
859
860 write32(&regs->mrw, param->EmcZcalInitDev0);
861 udelay(param->EmcZcalInitWait);
862
863 if ((param->EmcDevSelect & 2) == 0) {
864 write32(&regs->mrw, param->EmcZcalInitDev1);
865 udelay(param->EmcZcalInitWait);
866 }
867
868 /* Write mode registers */
869 write32(&regs->mrw2, param->EmcMrw2);
870 write32(&regs->mrw, param->EmcMrw1);
871 write32(&regs->mrw3, param->EmcMrw3);
872 write32(&regs->mrw4, param->EmcMrw4);
873
874 /* Patch 6 using BCT spare variables */
875 sdram_patch(param->EmcBctSpare10, param->EmcBctSpare11);
876
877 if (param->EmcExtraModeRegWriteEnable)
878 write32(&regs->mrw, param->EmcMrwExtra);
879}
880
881static void sdram_init_lpddr4(const struct sdram_params *param,
882 struct tegra_emc_regs *regs)
883{
884 /* Patch 6 using BCT spare variables */
885 sdram_patch(param->EmcBctSpare10, param->EmcBctSpare11);
886
887 /* Write mode registers */
888 write32(&regs->mrw2, param->EmcMrw2);
889 write32(&regs->mrw, param->EmcMrw1);
890 write32(&regs->mrw3, param->EmcMrw3);
891 write32(&regs->mrw4, param->EmcMrw4);
892 write32(&regs->mrw6, param->EmcMrw6);
893 write32(&regs->mrw14, param->EmcMrw14);
894
895 write32(&regs->mrw8, param->EmcMrw8);
896 write32(&regs->mrw12, param->EmcMrw12);
897 write32(&regs->mrw9, param->EmcMrw9);
898 write32(&regs->mrw13, param->EmcMrw13);
899
900 /* Issue ZQCAL start, device 0 */
901 write32(&regs->zq_cal, param->EmcZcalInitDev0);
902 udelay(param->EmcZcalInitWait);
903 /* Issue ZQCAL latch */
904 write32(&regs->zq_cal, (param->EmcZcalInitDev0 ^ 0x3));
905
906 if ((param->EmcDevSelect & 2) == 0) {
907 /* Same for device 1 */
908 write32(&regs->zq_cal, param->EmcZcalInitDev1);
909 udelay(param->EmcZcalInitWait);
910 write32(&regs->zq_cal, (param->EmcZcalInitDev1 ^ 0x3));
911 }
912}
913
914static void sdram_init_zq_calibration(const struct sdram_params *param,
915 struct tegra_emc_regs *regs)
916{
917 if (param->MemoryType == NvBootMemoryType_LpDdr2)
918 sdram_init_lpddr3(param, regs);
919 else if (param->MemoryType == NvBootMemoryType_LpDdr4)
920 sdram_init_lpddr4(param, regs);
921}
922
923static void sdram_set_zq_calibration(const struct sdram_params *param,
924 struct tegra_emc_regs *regs)
925{
926 if (param->EmcAutoCalInterval == 0)
927 write32(&regs->auto_cal_config,
928 param->EmcAutoCalConfig | AUTOCAL_MEASURE_STALL_ENABLE);
929
930 write32(&regs->pmacro_brick_ctrl_rfu2, param->EmcPmacroBrickCtrlRfu2);
931
932 /* ZQ CAL setup (not actually issuing ZQ CAL now) */
933 if (param->MemoryType == NvBootMemoryType_LpDdr4) {
934 write32(&regs->zcal_wait_cnt, param->EmcZcalWaitCnt);
935 write32(&regs->zcal_mrw_cmd, param->EmcZcalMrwCmd);
936 }
937
938 sdram_trigger_emc_timing_update(regs);
939 udelay(param->EmcTimingControlWait);
940}
941
942static void sdram_set_refresh(const struct sdram_params *param,
943 struct tegra_emc_regs *regs)
944{
945 /* Insert burst refresh */
946 if (param->EmcExtraRefreshNum > 0) {
947 uint32_t refresh_num = (1 << param->EmcExtraRefreshNum) - 1;
948
949 writebits((EMC_REF_CMD_REFRESH | EMC_REF_NORMAL_ENABLED |
950 (refresh_num << EMC_REF_NUM_SHIFT) |
951 (param->EmcDevSelect << EMC_REF_DEV_SELECTN_SHIFT)),
952 &regs->ref, (EMC_REF_CMD_MASK | EMC_REF_NORMAL_MASK |
953 EMC_REF_NUM_MASK |
954 EMC_REF_DEV_SELECTN_MASK));
955 }
956
957 /* Enable refresh */
958 write32(&regs->refctrl,
959 (param->EmcDevSelect | EMC_REFCTRL_REF_VALID_ENABLED));
960
961 /*
962 * NOTE: Programming CFG must happen after REFCTRL to delay
963 * active power-down to after init (DDR2 constraint).
964 */
965 write32(&regs->dyn_self_ref_control, param->EmcDynSelfRefControl);
966 write32(&regs->cfg_update, param->EmcCfgUpdate);
967 write32(&regs->cfg, param->EmcCfg);
968 write32(&regs->fdpd_ctrl_dq, param->EmcFdpdCtrlDq);
969 write32(&regs->fdpd_ctrl_cmd, param->EmcFdpdCtrlCmd);
970 write32(&regs->sel_dpd_ctrl, param->EmcSelDpdCtrl);
971
972 /* Write addr swizzle lock bit */
973 write32(&regs->fbio_spare, param->EmcFbioSpare | CFG_ADR_EN_LOCKED);
974
975 /* Re-trigger timing to latch power saving functions */
976 sdram_trigger_emc_timing_update(regs);
977
978 /* Enable EMC pipe clock gating */
979 write32(&regs->cfg_pipe_clk, param->EmcCfgPipeClk);
Martin Roth26f97f92021-10-01 14:53:22 -0600980 /* Depending on frequency, enable CMD/CLK fdpd */
Patrick Georgi40a3e322015-06-22 19:41:29 +0200981 write32(&regs->fdpd_ctrl_cmd_no_ramp, param->EmcFdpdCtrlCmdNoRamp);
982}
983
984#define AHB_ARB_XBAR_CTRL 0x6000C0E0
985
986static void sdram_enable_arbiter(const struct sdram_params *param)
987{
988 /* TODO(hungte) Move values here to standalone header file. */
989 uint32_t *ahb_arbitration_xbar_ctrl = (uint32_t *)(AHB_ARB_XBAR_CTRL);
990
Julius Werner55009af2019-12-02 22:03:27 -0800991 setbits32(ahb_arbitration_xbar_ctrl,
Patrick Georgi40a3e322015-06-22 19:41:29 +0200992 param->AhbArbitrationXbarCtrlMemInitDone << 16);
993}
994
995static void sdram_lock_carveouts(const struct sdram_params *param,
996 struct tegra_mc_regs *regs)
997{
998 /* Lock carveouts, and emem_cfg registers */
999 write32(&regs->video_protect_reg_ctrl,
1000 param->McVideoProtectWriteAccess);
1001 write32(&regs->sec_carveout_reg_ctrl,
1002 param->McSecCarveoutProtectWriteAccess);
1003 write32(&regs->mts_carveout_reg_ctrl, param->McMtsCarveoutRegCtrl);
1004
1005 /* Write this last, locks access */
1006 write32(&regs->emem_cfg_access_ctrl,
1007 MC_EMEM_CFG_ACCESS_CTRL_WRITE_ACCESS_DISABLED);
1008}
1009
1010void sdram_init(const struct sdram_params *param)
1011{
1012 struct tegra_pmc_regs *pmc = (struct tegra_pmc_regs *)TEGRA_PMC_BASE;
1013 struct tegra_mc_regs *mc = (struct tegra_mc_regs *)TEGRA_MC_BASE;
1014 struct tegra_emc_regs *emc = (struct tegra_emc_regs *)TEGRA_EMC_BASE;
1015
1016 printk(BIOS_DEBUG, "Initializing SDRAM of type %d with %dKHz\n",
1017 param->MemoryType, clock_get_pll_input_khz() *
1018 param->PllMFeedbackDivider / param->PllMInputDivider /
1019 (1 + param->PllMPostDivider));
1020 if (param->MemoryType != NvBootMemoryType_LpDdr4 &&
1021 param->MemoryType != NvBootMemoryType_LpDdr2)
1022 die("Unsupported memory type!\n");
1023
1024 sdram_configure_pmc(param, pmc);
1025 sdram_patch(param->EmcBctSpare0, param->EmcBctSpare1);
1026
1027 sdram_set_dpd(param, pmc);
1028 sdram_start_clocks(param, emc);
1029 sdram_set_pad_macros(param, emc);
1030 sdram_patch(param->EmcBctSpare4, param->EmcBctSpare5);
1031
1032 sdram_trigger_emc_timing_update(emc);
1033 sdram_init_mc(param, mc);
1034 sdram_init_emc(param, emc);
1035 sdram_patch(param->EmcBctSpare8, param->EmcBctSpare9);
1036
1037 sdram_set_emc_timing(param, emc);
1038 sdram_patch_bootrom(param, mc);
1039 sdram_rel_dpd(param, pmc);
1040 sdram_set_zq_calibration(param, emc);
1041 sdram_set_ddr_control(param, pmc);
1042 sdram_set_clock_enable_signal(param, emc);
1043
1044 sdram_init_zq_calibration(param, emc);
1045
1046 /* Set package and DPD pad control */
1047 write32(&pmc->ddr_cfg, param->PmcDdrCfg);
1048
1049 /* Start periodic ZQ calibration (LPDDRx only) */
1050 if (param->MemoryType == NvBootMemoryType_LpDdr4 ||
1051 param->MemoryType == NvBootMemoryType_LpDdr2) {
1052 write32(&emc->zcal_interval, param->EmcZcalInterval);
1053 write32(&emc->zcal_wait_cnt, param->EmcZcalWaitCnt);
1054 write32(&emc->zcal_mrw_cmd, param->EmcZcalMrwCmd);
1055 }
1056 sdram_patch(param->EmcBctSpare12, param->EmcBctSpare13);
1057
1058 sdram_trigger_emc_timing_update(emc);
1059 sdram_set_refresh(param, emc);
1060 sdram_enable_arbiter(param);
1061 sdram_lock_carveouts(param, mc);
Patrick Georgi40a3e322015-06-22 19:41:29 +02001062}