blob: 68b52fd3000d48a4e0618636ea9549ff15821ffb [file] [log] [blame]
Angel Ponsa2ee7612020-04-04 18:51:15 +02001/* SPDX-License-Identifier: GPL-2.0-only */
2/* This file is part of the coreboot project. */
Tom Warren64982c502014-01-23 13:37:50 -07003
4#include <arch/cache.h>
5#include <console/console.h>
Tom Warren64982c502014-01-23 13:37:50 -07006#include <soc/addressmap.h>
Julius Wernerf0d21ff32014-10-20 13:24:14 -07007#include <soc/clk_rst.h>
8#include <soc/pmc.h>
9#include <soc/sdram.h>
Tom Warren64982c502014-01-23 13:37:50 -070010
11/*
Elyes HAOUAS809aeee2018-08-07 12:14:33 +020012 * This function reads SDRAM parameters (and a few CLK_RST register values) from
Tom Warren64982c502014-01-23 13:37:50 -070013 * the common BCT format and writes them into PMC scratch registers (where the
14 * BootROM expects them on LP0 resume). Since those store the same values in a
15 * different format, we follow a "translation table" taken from Nvidia's U-Boot
16 * implementation to shift bits into the right position.
17 *
18 * Contrary to U-Boot, we transform the same macros directly into hardcoded
19 * assignments (without any pesky function calls or volatile qualifiers) to give
20 * the compiler as much room for optimization as possible. For that reason, we
Tom Warren64982c502014-01-23 13:37:50 -070021 * that PMC scratch register accesses should not have side effects and can be
22 * arbitrarily reordered. For the few accesses that do have side-effects, the
23 * code must contain explicit memory barriers.
24 */
25void sdram_lp0_save_params(const struct sdram_params *sdram)
26{
27 struct tegra_pmc_regs * pmc = (void *)TEGRA_PMC_BASE;
28 struct clk_rst_ctlr * clk_rst = (void *)TEGRA_CLK_RST_BASE;
29
30#define pack(src, src_bits, dst, dst_bits) { \
31 _Static_assert((1 ? src_bits) >= (0 ? src_bits) && (1 ? dst_bits) >= \
Elyes HAOUASa342f392018-10-17 10:56:26 +020032 (0 ? dst_bits), "byte range flipped (must be MSB:LSB)"); \
Tom Warren64982c502014-01-23 13:37:50 -070033 _Static_assert((1 ? src_bits) - (0 ? src_bits) == (1 ? dst_bits) - \
Elyes HAOUASa342f392018-10-17 10:56:26 +020034 (0 ? dst_bits), "src and dst byte range lengths differ"); \
Tom Warren64982c502014-01-23 13:37:50 -070035 u32 mask = 0xffffffff >> (31 - ((1 ? src_bits) - (0 ? src_bits))); \
36 dst &= ~(mask << (0 ? dst_bits)); \
37 dst |= ((src >> (0 ? src_bits)) & mask) << (0 ? dst_bits); \
38}
39
40#define s(param, src_bits, pmcreg, dst_bits) \
41 pack(sdram->param, src_bits, pmc->pmcreg, dst_bits)
42
43#define m(clkreg, src_bits, pmcreg, dst_bits) \
44 pack(clk_rst->clkreg, src_bits, pmc->pmcreg, dst_bits)
45
46#define c(value, pmcreg, dst_bits) \
47 pack(value, (1 ? dst_bits) - (0 ? dst_bits) : 0, pmc->pmcreg, dst_bits)
48
49 s(EmcClockSource, 7:0, scratch6, 15:8);
50 s(EmcClockSource, 31:29, scratch6, 18:16);
51 s(EmcClockSource, 26:26, scratch6, 19:19);
52 s(EmcOdtWrite, 5:0, scratch6, 25:20);
53 s(EmcOdtWrite, 11:8, scratch6, 29:26);
54 s(EmcOdtWrite, 30:30, scratch6, 30:30);
55 s(EmcOdtWrite, 31:31, scratch6, 31:31);
56 s(EmcXm2DqPadCtrl2, 18:16, scratch7, 22:20);
57 s(EmcXm2DqPadCtrl2, 22:20, scratch7, 25:23);
58 s(EmcXm2DqPadCtrl2, 26:24, scratch7, 28:26);
59 s(EmcXm2DqPadCtrl2, 30:28, scratch7, 31:29);
60 s(EmcXm2DqPadCtrl3, 18:16, scratch8, 22:20);
61 s(EmcXm2DqPadCtrl3, 22:20, scratch8, 25:23);
62 s(EmcXm2DqPadCtrl3, 26:24, scratch8, 28:26);
63 s(EmcXm2DqPadCtrl3, 30:28, scratch8, 31:29);
64 s(EmcTxsrDll, 11:0, scratch9, 31:20);
65 c(0, scratch10, 31:0);
66 s(EmcDsrVttgenDrv, 5:0, scratch10, 25:20);
67 s(EmcDsrVttgenDrv, 18:16, scratch10, 28:26);
68 s(EmcDsrVttgenDrv, 26:24, scratch10, 31:29);
69 s(EmcFbioSpare, 31:24, scratch11, 7:0);
70 s(EmcFbioSpare, 23:16, scratch11, 15:8);
71 s(EmcFbioSpare, 15:8, scratch11, 23:16);
72 s(EmcFbioSpare, 7:0, scratch11, 31:24);
73 s(EmcCfgRsv, 31:0, scratch12, 31:0);
74 s(EmcCdbCntl2, 31:0, scratch13, 31:0);
75 s(McEmemArbDaTurns, 31:0, scratch14, 31:0);
76 s(EmcCfgDigDll, 0:0, scratch17, 0:0);
77 s(EmcCfgDigDll, 25:2, scratch17, 24:1);
78 s(EmcCfgDigDll, 31:27, scratch17, 29:25);
79 s(EmcCdbCntl1, 29:0, scratch18, 29:0);
80 s(McEmemArbMisc0, 14:0, scratch19, 14:0);
81 s(McEmemArbMisc0, 30:16, scratch19, 29:15);
82 s(EmcXm2DqsPadCtrl, 4:0, scratch22, 4:0);
83 s(EmcXm2DqsPadCtrl, 12:8, scratch22, 9:5);
84 s(EmcXm2DqsPadCtrl, 31:14, scratch22, 27:10);
85 s(EmcRrd, 3:0, scratch22, 31:28);
86 s(EmcXm2DqPadCtrl, 31:4, scratch23, 27:0);
87 s(EmcRext, 3:0, scratch23, 31:28);
88 s(EmcXm2CompPadCtrl, 16:0, scratch24, 16:0);
89 s(EmcXm2CompPadCtrl, 24:20, scratch24, 21:17);
90 s(EmcXm2CompPadCtrl, 27:27, scratch24, 22:22);
91 s(EmcXm2CompPadCtrl, 31:28, scratch24, 26:23);
92 s(EmcR2w, 4:0, scratch24, 31:27);
93 s(EmcCfg, 9:1, scratch25, 8:0);
94 s(EmcCfg, 26:16, scratch25, 19:9);
95 s(EmcCfg, 31:28, scratch25, 23:20);
96 s(EmcXm2VttGenPadCtrl, 0:0, scratch25, 24:24);
97 s(EmcXm2VttGenPadCtrl, 2:2, scratch25, 25:25);
98 s(EmcXm2VttGenPadCtrl, 18:16, scratch25, 28:26);
99 s(EmcXm2VttGenPadCtrl, 26:24, scratch25, 31:29);
100 s(EmcZcalInterval, 23:10, scratch26, 13:0);
101 s(EmcZcalInterval, 9:0, scratch26, 23:14);
102 s(EmcSelDpdCtrl, 5:2, scratch26, 27:24);
103 s(EmcSelDpdCtrl, 8:8, scratch26, 28:28);
104 s(EmcSelDpdCtrl, 18:16, scratch26, 31:29);
105 s(EmcXm2VttGenPadCtrl3, 22:0, scratch27, 22:0);
106 s(EmcXm2VttGenPadCtrl3, 24:24, scratch27, 23:23);
107 s(EmcSwizzleRank0ByteCfg, 1:0, scratch27, 25:24);
108 s(EmcSwizzleRank0ByteCfg, 5:4, scratch27, 27:26);
109 s(EmcSwizzleRank0ByteCfg, 9:8, scratch27, 29:28);
110 s(EmcSwizzleRank0ByteCfg, 13:12, scratch27, 31:30);
111 s(EmcXm2ClkPadCtrl2, 5:0, scratch28, 5:0);
112 s(EmcXm2ClkPadCtrl2, 13:8, scratch28, 11:6);
113 s(EmcXm2ClkPadCtrl2, 20:16, scratch28, 16:12);
114 s(EmcXm2ClkPadCtrl2, 23:23, scratch28, 17:17);
115 s(EmcXm2ClkPadCtrl2, 28:24, scratch28, 22:18);
116 s(EmcXm2ClkPadCtrl2, 31:31, scratch28, 23:23);
117 s(EmcSwizzleRank1ByteCfg, 1:0, scratch28, 25:24);
118 s(EmcSwizzleRank1ByteCfg, 5:4, scratch28, 27:26);
119 s(EmcSwizzleRank1ByteCfg, 9:8, scratch28, 29:28);
120 s(EmcSwizzleRank1ByteCfg, 13:12, scratch28, 31:30);
121 s(McEmemArbDaCovers, 23:0, scratch29, 23:0);
122 s(McEmemArbRsv, 7:0, scratch29, 31:24);
123 s(EmcAutoCalConfig, 4:0, scratch30, 4:0);
124 s(EmcAutoCalConfig, 12:8, scratch30, 9:5);
125 s(EmcAutoCalConfig, 18:16, scratch30, 12:10);
126 s(EmcAutoCalConfig, 25:20, scratch30, 18:13);
127 s(EmcAutoCalConfig, 31:28, scratch30, 22:19);
128 s(EmcRfc, 8:0, scratch30, 31:23);
129 s(EmcXm2DqsPadCtrl2, 21:0, scratch31, 21:0);
130 s(EmcXm2DqsPadCtrl2, 24:24, scratch31, 22:22);
131 s(EmcAr2Pden, 8:0, scratch31, 31:23);
132 s(EmcXm2ClkPadCtrl, 0:0, scratch32, 0:0);
133 s(EmcXm2ClkPadCtrl, 4:2, scratch32, 3:1);
134 s(EmcXm2ClkPadCtrl, 7:7, scratch32, 4:4);
135 s(EmcXm2ClkPadCtrl, 31:14, scratch32, 22:5);
136 s(EmcRfcSlr, 8:0, scratch32, 31:23);
137 s(EmcXm2DqsPadCtrl3, 0:0, scratch33, 0:0);
138 s(EmcXm2DqsPadCtrl3, 5:5, scratch33, 1:1);
139 s(EmcXm2DqsPadCtrl3, 12:8, scratch33, 6:2);
140 s(EmcXm2DqsPadCtrl3, 18:14, scratch33, 11:7);
141 s(EmcXm2DqsPadCtrl3, 24:20, scratch33, 16:12);
142 s(EmcXm2DqsPadCtrl3, 30:26, scratch33, 21:17);
143 s(EmcTxsr, 9:0, scratch33, 31:22);
144 s(McEmemArbCfg, 8:0, scratch40, 8:0);
145 s(McEmemArbCfg, 20:16, scratch40, 13:9);
146 s(McEmemArbCfg, 27:24, scratch40, 17:14);
147 s(McEmemArbCfg, 31:28, scratch40, 21:18);
148 s(EmcMc2EmcQ, 2:0, scratch40, 24:22);
149 s(EmcMc2EmcQ, 10:8, scratch40, 27:25);
150 s(EmcMc2EmcQ, 27:24, scratch40, 31:28);
151 s(EmcAutoCalInterval, 20:0, scratch42, 20:0);
152 s(McEmemArbOutstandingReq, 8:0, scratch42, 29:21);
153 s(McEmemArbOutstandingReq, 31:30, scratch42, 31:30);
154 s(EmcMrsWaitCnt2, 9:0, scratch44, 9:0);
155 s(EmcMrsWaitCnt2, 25:16, scratch44, 19:10);
156 s(EmcTxdsrvttgen, 11:0, scratch44, 31:20);
157 s(EmcMrsWaitCnt, 9:0, scratch45, 9:0);
158 s(EmcMrsWaitCnt, 25:16, scratch45, 19:10);
159 s(EmcCfgPipe, 1:0, scratch45, 21:20);
160 s(EmcCfgPipe, 9:4, scratch45, 27:22);
161 s(EmcCfgPipe, 15:12, scratch45, 31:28);
162 s(EmcXm2DqsPadCtrl4, 22:18, scratch46, 4:0);
163 s(EmcXm2DqsPadCtrl4, 16:12, scratch46, 9:5);
164 s(EmcXm2DqsPadCtrl4, 10:6, scratch46, 14:10);
165 s(EmcXm2DqsPadCtrl4, 4:0, scratch46, 19:15);
166 s(EmcZcalWaitCnt, 9:0, scratch46, 29:20);
167 s(EmcXm2DqsPadCtrl5, 22:18, scratch47, 4:0);
168 s(EmcXm2DqsPadCtrl5, 16:12, scratch47, 9:5);
169 s(EmcXm2DqsPadCtrl5, 10:6, scratch47, 14:10);
170 s(EmcXm2DqsPadCtrl5, 4:0, scratch47, 19:15);
171 s(EmcXm2VttGenPadCtrl2, 5:0, scratch47, 25:20);
172 s(EmcXm2VttGenPadCtrl2, 31:28, scratch47, 29:26);
173 s(EmcXm2DqsPadCtrl6, 12:8, scratch48, 4:0);
174 s(EmcXm2DqsPadCtrl6, 18:14, scratch48, 9:5);
175 s(EmcXm2DqsPadCtrl6, 24:20, scratch48, 14:10);
176 s(EmcXm2DqsPadCtrl6, 30:26, scratch48, 19:15);
177 s(EmcAutoCalConfig3, 4:0, scratch48, 24:20);
178 s(EmcAutoCalConfig3, 12:8, scratch48, 29:25);
179 s(EmcFbioCfg5, 1:0, scratch48, 31:30);
180 s(EmcDllXformQUse8, 4:0, scratch50, 4:0);
181 s(EmcDllXformQUse8, 22:8, scratch50, 19:5);
182 s(McEmemArbRing1Throttle, 4:0, scratch50, 24:20);
183 s(McEmemArbRing1Throttle, 20:16, scratch50, 29:25);
184 s(EmcFbioCfg5, 3:2, scratch50, 31:30);
185 s(EmcDllXformQUse9, 4:0, scratch51, 4:0);
186 s(EmcDllXformQUse9, 22:8, scratch51, 19:5);
187 s(EmcCttTermCtrl, 2:0, scratch51, 22:20);
188 s(EmcCttTermCtrl, 12:8, scratch51, 27:23);
189 s(EmcCttTermCtrl, 31:31, scratch51, 28:28);
190 s(EmcFbioCfg6, 2:0, scratch51, 31:29);
191 s(EmcDllXformQUse10, 4:0, scratch56, 4:0);
192 s(EmcDllXformQUse10, 22:8, scratch56, 19:5);
193 s(EmcXm2CmdPadCtrl, 10:3, scratch56, 27:20);
194 s(EmcXm2CmdPadCtrl, 28:28, scratch56, 28:28);
195 s(EmcPutermAdj, 1:0, scratch56, 30:29);
196 s(EmcPutermAdj, 7:7, scratch56, 31:31);
197 s(EmcDllXformQUse11, 4:0, scratch57, 4:0);
198 s(EmcDllXformQUse11, 22:8, scratch57, 19:5);
199 s(EmcWdv, 3:0, scratch57, 31:28);
200 s(EmcDllXformQUse12, 4:0, scratch58, 4:0);
201 s(EmcDllXformQUse12, 22:8, scratch58, 19:5);
202 s(EmcBurstRefreshNum, 3:0, scratch58, 31:28);
203 s(EmcDllXformQUse13, 4:0, scratch59, 4:0);
204 s(EmcDllXformQUse13, 22:8, scratch59, 19:5);
205 s(EmcWext, 3:0, scratch59, 31:28);
206 s(EmcDllXformQUse14, 4:0, scratch60, 4:0);
207 s(EmcDllXformQUse14, 22:8, scratch60, 19:5);
208 s(EmcClkenOverride, 3:1, scratch60, 30:28);
209 s(EmcClkenOverride, 6:6, scratch60, 31:31);
210 s(EmcDllXformQUse15, 4:0, scratch61, 4:0);
211 s(EmcDllXformQUse15, 22:8, scratch61, 19:5);
212 s(EmcR2r, 3:0, scratch61, 31:28);
213 s(EmcDllXformDq4, 4:0, scratch62, 4:0);
214 s(EmcDllXformDq4, 22:8, scratch62, 19:5);
215 s(EmcRc, 6:0, scratch62, 26:20);
216 s(EmcW2r, 4:0, scratch62, 31:27);
217 s(EmcDllXformDq5, 4:0, scratch63, 4:0);
218 s(EmcDllXformDq5, 22:8, scratch63, 19:5);
219 s(EmcTfaw, 6:0, scratch63, 26:20);
220 s(EmcR2p, 4:0, scratch63, 31:27);
221 s(EmcDllXformDq6, 4:0, scratch64, 4:0);
222 s(EmcDllXformDq6, 22:8, scratch64, 19:5);
223 s(EmcDliTrimTxDqs0, 6:0, scratch64, 26:20);
224 s(EmcQSafe, 4:0, scratch64, 31:27);
225 s(EmcDllXformDq7, 4:0, scratch65, 4:0);
226 s(EmcDllXformDq7, 22:8, scratch65, 19:5);
227 s(EmcDliTrimTxDqs1, 6:0, scratch65, 26:20);
228 s(EmcTClkStable, 4:0, scratch65, 31:27);
229 s(EmcAutoCalConfig2, 4:0, scratch66, 4:0);
230 s(EmcAutoCalConfig2, 12:8, scratch66, 9:5);
231 s(EmcAutoCalConfig2, 20:16, scratch66, 14:10);
232 s(EmcAutoCalConfig2, 28:24, scratch66, 19:15);
233 s(EmcDliTrimTxDqs2, 6:0, scratch66, 26:20);
234 s(EmcTClkStop, 4:0, scratch66, 31:27);
235 s(McEmemArbMisc1, 1:0, scratch67, 1:0);
236 s(McEmemArbMisc1, 12:4, scratch67, 10:2);
237 s(McEmemArbMisc1, 25:21, scratch67, 15:11);
238 s(McEmemArbMisc1, 31:28, scratch67, 19:16);
239 s(EmcDliTrimTxDqs3, 6:0, scratch67, 26:20);
240 s(EmcEInputDuration, 4:0, scratch67, 31:27);
241 s(EmcZcalMrwCmd, 7:0, scratch68, 7:0);
242 s(EmcZcalMrwCmd, 23:16, scratch68, 15:8);
243 s(EmcZcalMrwCmd, 31:30, scratch68, 17:16);
244 s(EmcTRefBw, 13:0, scratch68, 31:18);
245 s(EmcXm2CmdPadCtrl2, 31:14, scratch69, 17:0);
246 s(EmcDliTrimTxDqs4, 6:0, scratch69, 24:18);
247 s(EmcDliTrimTxDqs5, 6:0, scratch69, 31:25);
248 s(EmcXm2CmdPadCtrl3, 31:14, scratch70, 17:0);
249 s(EmcDliTrimTxDqs6, 6:0, scratch70, 24:18);
250 s(EmcDliTrimTxDqs7, 6:0, scratch70, 31:25);
251 s(EmcXm2CmdPadCtrl5, 2:0, scratch71, 2:0);
252 s(EmcXm2CmdPadCtrl5, 6:4, scratch71, 5:3);
253 s(EmcXm2CmdPadCtrl5, 10:8, scratch71, 8:6);
254 s(EmcXm2CmdPadCtrl5, 14:12, scratch71, 11:9);
255 s(EmcXm2CmdPadCtrl5, 18:16, scratch71, 14:12);
256 s(EmcXm2CmdPadCtrl5, 22:20, scratch71, 17:15);
257 s(EmcDliTrimTxDqs8, 6:0, scratch71, 24:18);
258 s(EmcDliTrimTxDqs9, 6:0, scratch71, 31:25);
259 s(EmcCdbCntl3, 17:0, scratch72, 17:0);
260 s(EmcDliTrimTxDqs10, 6:0, scratch72, 24:18);
261 s(EmcDliTrimTxDqs11, 6:0, scratch72, 31:25);
262 s(EmcSwizzleRank0Byte0, 2:0, scratch73, 2:0);
263 s(EmcSwizzleRank0Byte0, 6:4, scratch73, 5:3);
264 s(EmcSwizzleRank0Byte0, 10:8, scratch73, 8:6);
265 s(EmcSwizzleRank0Byte0, 14:12, scratch73, 11:9);
266 s(EmcSwizzleRank0Byte0, 18:16, scratch73, 14:12);
267 s(EmcSwizzleRank0Byte0, 22:20, scratch73, 17:15);
268 s(EmcDliTrimTxDqs12, 6:0, scratch73, 24:18);
269 s(EmcDliTrimTxDqs13, 6:0, scratch73, 31:25);
270 s(EmcSwizzleRank0Byte1, 2:0, scratch74, 2:0);
271 s(EmcSwizzleRank0Byte1, 6:4, scratch74, 5:3);
272 s(EmcSwizzleRank0Byte1, 10:8, scratch74, 8:6);
273 s(EmcSwizzleRank0Byte1, 14:12, scratch74, 11:9);
274 s(EmcSwizzleRank0Byte1, 18:16, scratch74, 14:12);
275 s(EmcSwizzleRank0Byte1, 22:20, scratch74, 17:15);
276 s(EmcDliTrimTxDqs14, 6:0, scratch74, 24:18);
277 s(EmcDliTrimTxDqs15, 6:0, scratch74, 31:25);
278 s(EmcSwizzleRank0Byte2, 2:0, scratch75, 2:0);
279 s(EmcSwizzleRank0Byte2, 6:4, scratch75, 5:3);
280 s(EmcSwizzleRank0Byte2, 10:8, scratch75, 8:6);
281 s(EmcSwizzleRank0Byte2, 14:12, scratch75, 11:9);
282 s(EmcSwizzleRank0Byte2, 18:16, scratch75, 14:12);
283 s(EmcSwizzleRank0Byte2, 22:20, scratch75, 17:15);
284 s(McEmemArbTimingRp, 6:0, scratch75, 24:18);
285 s(McEmemArbTimingRc, 6:0, scratch75, 31:25);
286 s(EmcSwizzleRank0Byte3, 2:0, scratch76, 2:0);
287 s(EmcSwizzleRank0Byte3, 6:4, scratch76, 5:3);
288 s(EmcSwizzleRank0Byte3, 10:8, scratch76, 8:6);
289 s(EmcSwizzleRank0Byte3, 14:12, scratch76, 11:9);
290 s(EmcSwizzleRank0Byte3, 18:16, scratch76, 14:12);
291 s(EmcSwizzleRank0Byte3, 22:20, scratch76, 17:15);
292 s(McEmemArbTimingFaw, 6:0, scratch76, 24:18);
293 s(McEmemArbTimingWap2Pre, 6:0, scratch76, 31:25);
294 s(EmcSwizzleRank1Byte0, 2:0, scratch77, 2:0);
295 s(EmcSwizzleRank1Byte0, 6:4, scratch77, 5:3);
296 s(EmcSwizzleRank1Byte0, 10:8, scratch77, 8:6);
297 s(EmcSwizzleRank1Byte0, 14:12, scratch77, 11:9);
298 s(EmcSwizzleRank1Byte0, 18:16, scratch77, 14:12);
299 s(EmcSwizzleRank1Byte0, 22:20, scratch77, 17:15);
300 s(EmcRas, 5:0, scratch77, 23:18);
301 s(EmcRp, 5:0, scratch77, 29:24);
302 s(EmcCfg2, 9:8, scratch77, 31:30);
303 s(EmcSwizzleRank1Byte1, 2:0, scratch78, 2:0);
304 s(EmcSwizzleRank1Byte1, 6:4, scratch78, 5:3);
305 s(EmcSwizzleRank1Byte1, 10:8, scratch78, 8:6);
306 s(EmcSwizzleRank1Byte1, 14:12, scratch78, 11:9);
307 s(EmcSwizzleRank1Byte1, 18:16, scratch78, 14:12);
308 s(EmcSwizzleRank1Byte1, 22:20, scratch78, 17:15);
309 s(EmcW2p, 5:0, scratch78, 23:18);
310 s(EmcRdRcd, 5:0, scratch78, 29:24);
311 s(EmcCfg2, 27:26, scratch78, 31:30);
312 s(EmcSwizzleRank1Byte2, 2:0, scratch79, 2:0);
313 s(EmcSwizzleRank1Byte2, 6:4, scratch79, 5:3);
314 s(EmcSwizzleRank1Byte2, 10:8, scratch79, 8:6);
315 s(EmcSwizzleRank1Byte2, 14:12, scratch79, 11:9);
316 s(EmcSwizzleRank1Byte2, 18:16, scratch79, 14:12);
317 s(EmcSwizzleRank1Byte2, 22:20, scratch79, 17:15);
318 s(EmcWrRcd, 5:0, scratch79, 23:18);
319 s(EmcQUse, 5:0, scratch79, 29:24);
320 s(EmcFbioCfg5, 4:4, scratch79, 31:31);
321 s(EmcSwizzleRank1Byte3, 2:0, scratch80, 2:0);
322 s(EmcSwizzleRank1Byte3, 6:4, scratch80, 5:3);
323 s(EmcSwizzleRank1Byte3, 10:8, scratch80, 8:6);
324 s(EmcSwizzleRank1Byte3, 14:12, scratch80, 11:9);
325 s(EmcSwizzleRank1Byte3, 18:16, scratch80, 14:12);
326 s(EmcSwizzleRank1Byte3, 22:20, scratch80, 17:15);
327 s(EmcQRst, 5:0, scratch80, 23:18);
328 s(EmcRdv, 5:0, scratch80, 29:24);
329 s(EmcFbioCfg5, 6:5, scratch80, 31:30);
330 s(EmcDynSelfRefControl, 15:0, scratch81, 15:0);
331 s(EmcDynSelfRefControl, 31:31, scratch81, 16:16);
332 s(EmcPdEx2Wr, 5:0, scratch81, 22:17);
333 s(EmcPdEx2Rd, 5:0, scratch81, 28:23);
334 s(EmcRefresh, 5:0, scratch82, 5:0);
335 s(EmcRefresh, 15:6, scratch82, 15:6);
336 s(EmcCmdQ, 4:0, scratch82, 20:16);
337 s(EmcCmdQ, 10:8, scratch82, 23:21);
338 s(EmcCmdQ, 14:12, scratch82, 26:24);
339 s(EmcCmdQ, 28:24, scratch82, 31:27);
340 s(EmcAcpdControl, 15:0, scratch83, 15:0);
341 s(EmcCfgDigDllPeriod, 15:0, scratch83, 31:16);
342 s(EmcDllXformDqs0, 4:0, scratch84, 4:0);
343 s(EmcDllXformDqs0, 22:12, scratch84, 15:5);
344 s(EmcDllXformDqs1, 4:0, scratch84, 20:16);
345 s(EmcDllXformDqs1, 22:12, scratch84, 31:21);
346 s(EmcDllXformDqs2, 4:0, scratch85, 4:0);
347 s(EmcDllXformDqs2, 22:12, scratch85, 15:5);
348 s(EmcDllXformDqs3, 4:0, scratch85, 20:16);
349 s(EmcDllXformDqs3, 22:12, scratch85, 31:21);
350 s(EmcDllXformDqs4, 4:0, scratch86, 4:0);
351 s(EmcDllXformDqs4, 22:12, scratch86, 15:5);
352 s(EmcDllXformDqs5, 4:0, scratch86, 20:16);
353 s(EmcDllXformDqs5, 22:12, scratch86, 31:21);
354 s(EmcDllXformDqs6, 4:0, scratch87, 4:0);
355 s(EmcDllXformDqs6, 22:12, scratch87, 15:5);
356 s(EmcDllXformDqs7, 4:0, scratch87, 20:16);
357 s(EmcDllXformDqs7, 22:12, scratch87, 31:21);
358 s(EmcDllXformDqs8, 4:0, scratch88, 4:0);
359 s(EmcDllXformDqs8, 22:12, scratch88, 15:5);
360 s(EmcDllXformDqs9, 4:0, scratch88, 20:16);
361 s(EmcDllXformDqs9, 22:12, scratch88, 31:21);
362 s(EmcDllXformDqs10, 4:0, scratch89, 4:0);
363 s(EmcDllXformDqs10, 22:12, scratch89, 15:5);
364 s(EmcDllXformDqs11, 4:0, scratch89, 20:16);
365 s(EmcDllXformDqs11, 22:12, scratch89, 31:21);
366 s(EmcDllXformDqs12, 4:0, scratch90, 4:0);
367 s(EmcDllXformDqs12, 22:12, scratch90, 15:5);
368 s(EmcDllXformDqs13, 4:0, scratch90, 20:16);
369 s(EmcDllXformDqs13, 22:12, scratch90, 31:21);
370 s(EmcDllXformDqs14, 4:0, scratch91, 4:0);
371 s(EmcDllXformDqs14, 22:12, scratch91, 15:5);
372 s(EmcDllXformDqs15, 4:0, scratch91, 20:16);
373 s(EmcDllXformDqs15, 22:12, scratch91, 31:21);
374 s(EmcDllXformQUse0, 4:0, scratch92, 4:0);
375 s(EmcDllXformQUse0, 22:12, scratch92, 15:5);
376 s(EmcDllXformQUse1, 4:0, scratch92, 20:16);
377 s(EmcDllXformQUse1, 22:12, scratch92, 31:21);
378 s(EmcDllXformQUse2, 4:0, scratch93, 4:0);
379 s(EmcDllXformQUse2, 22:12, scratch93, 15:5);
380 s(EmcDllXformQUse3, 4:0, scratch93, 20:16);
381 s(EmcDllXformQUse3, 22:12, scratch93, 31:21);
382 s(EmcDllXformQUse4, 4:0, scratch94, 4:0);
383 s(EmcDllXformQUse4, 22:12, scratch94, 15:5);
384 s(EmcDllXformQUse5, 4:0, scratch94, 20:16);
385 s(EmcDllXformQUse5, 22:12, scratch94, 31:21);
386 s(EmcDllXformQUse6, 4:0, scratch95, 4:0);
387 s(EmcDllXformQUse6, 22:12, scratch95, 15:5);
388 s(EmcDllXformQUse7, 4:0, scratch95, 20:16);
389 s(EmcDllXformQUse7, 22:12, scratch95, 31:21);
390 s(EmcDllXformDq0, 4:0, scratch96, 4:0);
391 s(EmcDllXformDq0, 22:12, scratch96, 15:5);
392 s(EmcDllXformDq1, 4:0, scratch96, 20:16);
393 s(EmcDllXformDq1, 22:12, scratch96, 31:21);
394 s(EmcDllXformDq2, 4:0, scratch97, 4:0);
395 s(EmcDllXformDq2, 22:12, scratch97, 15:5);
396 s(EmcDllXformDq3, 4:0, scratch97, 20:16);
397 s(EmcDllXformDq3, 22:12, scratch97, 31:21);
398 s(EmcPreRefreshReqCnt, 15:0, scratch98, 15:0);
399 s(EmcDllXformAddr0, 4:0, scratch98, 20:16);
400 s(EmcDllXformAddr0, 22:12, scratch98, 31:21);
401 s(EmcDllXformAddr1, 4:0, scratch99, 4:0);
402 s(EmcDllXformAddr1, 22:12, scratch99, 15:5);
403 s(EmcDllXformAddr2, 4:0, scratch99, 20:16);
404 s(EmcDllXformAddr2, 22:12, scratch99, 31:21);
405 s(EmcDllXformAddr3, 4:0, scratch100, 4:0);
406 s(EmcDllXformAddr3, 22:12, scratch100, 15:5);
407 s(EmcDllXformAddr4, 4:0, scratch100, 20:16);
408 s(EmcDllXformAddr4, 22:12, scratch100, 31:21);
409 s(EmcDllXformAddr5, 4:0, scratch101, 4:0);
410 s(EmcDllXformAddr5, 22:12, scratch101, 15:5);
411 s(EmcPChg2Pden, 5:0, scratch102, 5:0);
412 s(EmcAct2Pden, 5:0, scratch102, 11:6);
413 s(EmcRw2Pden, 5:0, scratch102, 17:12);
414 s(EmcTcke, 5:0, scratch102, 23:18);
415 s(EmcTrpab, 5:0, scratch102, 29:24);
416 s(EmcFbioCfg5, 8:7, scratch102, 31:30);
417 s(EmcCtt, 5:0, scratch103, 5:0);
418 s(EmcEInput, 5:0, scratch103, 11:6);
419 s(EmcPutermExtra, 21:16, scratch103, 17:12);
420 s(EmcTckesr, 5:0, scratch103, 23:18);
421 s(EmcTpd, 5:0, scratch103, 29:24);
422 s(EmcFbioCfg5, 10:9, scratch103, 31:30);
423 s(EmcRdvMask, 5:0, scratch104, 5:0);
424 s(EmcXm2CmdPadCtrl4, 0:0, scratch104, 6:6);
425 s(EmcXm2CmdPadCtrl4, 2:2, scratch104, 7:7);
426 s(EmcXm2CmdPadCtrl4, 4:4, scratch104, 8:8);
427 s(EmcXm2CmdPadCtrl4, 6:6, scratch104, 9:9);
428 s(EmcXm2CmdPadCtrl4, 8:8, scratch104, 10:10);
429 s(EmcXm2CmdPadCtrl4, 10:10, scratch104, 11:11);
430 s(EmcQpop, 5:0, scratch104, 17:12);
431 s(McEmemArbTimingRcd, 5:0, scratch104, 23:18);
432 s(McEmemArbTimingRas, 5:0, scratch104, 29:24);
433 s(EmcFbioCfg5, 12:11, scratch104, 31:30);
434 s(McEmemArbTimingRap2Pre, 5:0, scratch105, 5:0);
435 s(McEmemArbTimingR2W, 5:0, scratch105, 11:6);
436 s(McEmemArbTimingW2R, 5:0, scratch105, 17:12);
437 s(EmcIbdly, 4:0, scratch105, 22:18);
438 s(McEmemArbTimingR2R, 4:0, scratch105, 27:23);
439 s(EmcW2w, 3:0, scratch105, 31:28);
440 s(McEmemArbTimingW2W, 4:0, scratch106, 4:0);
441 s(McEmemArbOverride, 27:27, scratch106, 5:5);
442 s(McEmemArbOverride, 26:26, scratch106, 6:6);
443 s(McEmemArbOverride, 16:16, scratch106, 7:7);
444 s(McEmemArbOverride, 10:10, scratch106, 8:8);
445 s(McEmemArbOverride, 4:4, scratch106, 9:9);
446 s(EmcWdvMask, 3:0, scratch106, 13:10);
447 s(EmcCttDuration, 3:0, scratch106, 17:14);
448 s(EmcQuseWidth, 3:0, scratch106, 21:18);
449 s(EmcPutermWidth, 3:0, scratch106, 25:22);
450 s(EmcBgbiasCtl0, 3:0, scratch106, 29:26);
451 s(EmcFbioCfg5, 25:24, scratch106, 31:30);
452 s(McEmemArbTimingRrd, 3:0, scratch107, 3:0);
453 s(EmcFbioCfg5, 23:20, scratch107, 10:7);
454 s(EmcFbioCfg5, 15:13, scratch107, 13:11);
455 s(EmcCfg2, 5:3, scratch107, 16:14);
456 s(EmcFbioCfg5, 26:26, scratch107, 17:17);
457 s(EmcFbioCfg5, 28:28, scratch107, 18:18);
458 s(EmcCfg2, 2:0, scratch107, 21:19);
459 s(EmcCfg2, 7:6, scratch107, 23:22);
460 s(EmcCfg2, 15:10, scratch107, 29:24);
461 s(EmcCfg2, 23:22, scratch107, 31:30);
462 s(EmcCfg2, 25:24, scratch108, 1:0);
463 s(EmcCfg2, 31:28, scratch108, 5:2);
464 s(BootRomPatchData, 31:0, scratch15, 31:0);
465 s(BootRomPatchControl, 31:0, scratch16, 31:0);
466 s(EmcDevSelect, 1:0, scratch17, 31:30);
467 s(EmcZcalWarmColdBootEnables, 1:0, scratch18, 31:30);
468 s(EmcCfgDigDllPeriodWarmBoot, 1:0, scratch19, 31:30);
469 s(EmcWarmBootExtraModeRegWriteEnable, 0:0, scratch46, 30:30);
470 s(McClkenOverrideAllWarmBoot, 0:0, scratch46, 31:31);
471 s(EmcClkenOverrideAllWarmBoot, 0:0, scratch47, 30:30);
472 s(EmcMrsWarmBootEnable, 0:0, scratch47, 31:31);
473 s(EmcTimingControlWait, 7:0, scratch57, 27:20);
474 s(EmcZcalWarmBootWait, 7:0, scratch58, 27:20);
475 s(EmcAutoCalWait, 7:0, scratch59, 27:20);
476 s(WarmBootWait, 7:0, scratch60, 27:20);
477 s(EmcPinProgramWait, 7:0, scratch61, 27:20);
478 s(AhbArbitrationXbarCtrlMemInitDone, 0:0, scratch79, 30:30);
479 s(EmcExtraRefreshNum, 2:0, scratch81, 31:29);
480 s(SwizzleRankByteEncode, 15:0, scratch101, 31:16);
481 s(MemoryType, 2:0, scratch107, 6:4);
482
483 switch (sdram->MemoryType) {
484 case NvBootMemoryType_LpDdr2:
485 s(EmcMrwLpddr2ZcalWarmBoot, 23:16, scratch5, 7:0);
486 s(EmcMrwLpddr2ZcalWarmBoot, 7:0, scratch5, 15:8);
487 s(EmcWarmBootMrwExtra, 23:16, scratch5, 23:16);
488 s(EmcWarmBootMrwExtra, 7:0, scratch5, 31:24);
489 s(EmcMrwLpddr2ZcalWarmBoot, 31:30, scratch6, 1:0);
490 s(EmcWarmBootMrwExtra, 31:30, scratch6, 3:2);
491 s(EmcMrwLpddr2ZcalWarmBoot, 27:26, scratch6, 5:4);
492 s(EmcWarmBootMrwExtra, 27:26, scratch6, 7:6);
493 s(EmcMrw1, 7:0, scratch7, 7:0);
494 s(EmcMrw1, 23:16, scratch7, 15:8);
495 s(EmcMrw1, 27:26, scratch7, 17:16);
496 s(EmcMrw1, 31:30, scratch7, 19:18);
497 s(EmcMrw2, 7:0, scratch8, 7:0);
498 s(EmcMrw2, 23:16, scratch8, 15:8);
499 s(EmcMrw2, 27:26, scratch8, 17:16);
500 s(EmcMrw2, 31:30, scratch8, 19:18);
501 s(EmcMrw3, 7:0, scratch9, 7:0);
502 s(EmcMrw3, 23:16, scratch9, 15:8);
503 s(EmcMrw3, 27:26, scratch9, 17:16);
504 s(EmcMrw3, 31:30, scratch9, 19:18);
505 s(EmcMrw4, 7:0, scratch10, 7:0);
506 s(EmcMrw4, 23:16, scratch10, 15:8);
507 s(EmcMrw4, 27:26, scratch10, 17:16);
508 s(EmcMrw4, 31:30, scratch10, 19:18);
509 break;
510 case NvBootMemoryType_Ddr3:
511 s(EmcMrs, 13:0, scratch5, 13:0);
512 s(EmcEmrs, 13:0, scratch5, 27:14);
513 s(EmcMrs, 21:20, scratch5, 29:28);
514 s(EmcMrs, 31:30, scratch5, 31:30);
515 s(EmcEmrs2, 13:0, scratch7, 13:0);
516 s(EmcEmrs, 21:20, scratch7, 15:14);
517 s(EmcEmrs, 31:30, scratch7, 17:16);
518 s(EmcEmrs2, 21:20, scratch7, 19:18);
519 s(EmcEmrs3, 13:0, scratch8, 13:0);
520 s(EmcEmrs2, 31:30, scratch8, 15:14);
521 s(EmcEmrs3, 21:20, scratch8, 17:16);
522 s(EmcEmrs3, 31:30, scratch8, 19:18);
523 s(EmcWarmBootMrsExtra, 13:0, scratch9, 13:0);
524 s(EmcWarmBootMrsExtra, 31:30, scratch9, 15:14);
525 s(EmcWarmBootMrsExtra, 21:20, scratch9, 17:16);
526 s(EmcZqCalDdr3WarmBoot, 31:30, scratch9, 19:18);
527 s(EmcMrs, 27:26, scratch10, 1:0);
528 s(EmcEmrs, 27:26, scratch10, 3:2);
529 s(EmcEmrs2, 27:26, scratch10, 5:4);
530 s(EmcEmrs3, 27:26, scratch10, 7:6);
531 s(EmcWarmBootMrsExtra, 27:27, scratch10, 8:8);
532 s(EmcWarmBootMrsExtra, 26:26, scratch10, 9:9);
533 s(EmcZqCalDdr3WarmBoot, 0:0, scratch10, 10:10);
534 s(EmcZqCalDdr3WarmBoot, 4:4, scratch10, 11:11);
535 c(0, scratch116, 31:0);
536 c(0, scratch117, 31:0);
537 break;
538 default:
539 printk(BIOS_CRIT, "ERROR: %s() unrecognized MemoryType %d!\n",
540 __func__, sdram->MemoryType);
541 }
542
543 s(McVideoProtectGpuOverride0, 31:0, secure_scratch8, 31:0);
544 s(McVideoProtectVprOverride, 3:0, secure_scratch9, 3:0);
545 s(McVideoProtectVprOverride, 11:6, secure_scratch9, 9:4);
546 s(McVideoProtectVprOverride, 23:14, secure_scratch9, 19:10);
547 s(McVideoProtectVprOverride, 26:26, secure_scratch9, 20:20);
548 s(McVideoProtectVprOverride, 31:29, secure_scratch9, 23:21);
549 s(EmcFbioCfg5, 19:16, secure_scratch9, 27:24);
550 s(McDisplaySnapRing, 1:0, secure_scratch9, 29:28);
551 s(McDisplaySnapRing, 31:31, secure_scratch9, 30:30);
552 s(EmcAdrCfg, 0:0, secure_scratch9, 31:31);
553 s(McVideoProtectGpuOverride1, 15:0, secure_scratch10, 15:0);
554 s(McEmemAdrCfgBankMask0, 15:0, secure_scratch10, 31:16);
555 s(McEmemAdrCfgBankMask1, 15:0, secure_scratch11, 15:0);
556 s(McEmemAdrCfgBankMask2, 15:0, secure_scratch11, 31:16);
557 s(McEmemCfg, 13:0, secure_scratch12, 13:0);
558 s(McEmemCfg, 31:31, secure_scratch12, 14:14);
559 s(McVideoProtectBom, 31:20, secure_scratch12, 26:15);
560 s(McVideoProtectVprOverride1, 1:0, secure_scratch12, 28:27);
561 s(McVideoProtectVprOverride1, 4:4, secure_scratch12, 29:29);
562 s(McVideoProtectBomAdrHi, 1:0, secure_scratch12, 31:30);
563 s(McVideoProtectSizeMb, 11:0, secure_scratch13, 11:0);
564 s(McSecCarveoutBom, 31:20, secure_scratch13, 23:12);
565 s(McEmemAdrCfgBankSwizzle3, 2:0, secure_scratch13, 26:24);
566 s(McVideoProtectWriteAccess, 1:0, secure_scratch13, 28:27);
567 s(McSecCarveoutAdrHi, 1:0, secure_scratch13, 30:29);
568 s(McEmemAdrCfg, 0:0, secure_scratch13, 31:31);
569 s(McSecCarveoutSizeMb, 11:0, secure_scratch14, 11:0);
570 s(McMtsCarveoutBom, 31:20, secure_scratch14, 23:12);
571 s(McMtsCarveoutAdrHi, 1:0, secure_scratch14, 25:24);
572 s(McSecCarveoutProtectWriteAccess, 0:0, secure_scratch14, 26:26);
573 s(McMtsCarveoutRegCtrl, 0:0, secure_scratch14, 27:27);
574 s(McMtsCarveoutSizeMb, 11:0, secure_scratch15, 11:0);
575 s(McEmemAdrCfgDev0, 2:0, secure_scratch15, 14:12);
576 s(McEmemAdrCfgDev0, 9:8, secure_scratch15, 16:15);
577 s(McEmemAdrCfgDev0, 19:16, secure_scratch15, 20:17);
578 s(McEmemAdrCfgDev1, 2:0, secure_scratch15, 23:21);
579 s(McEmemAdrCfgDev1, 9:8, secure_scratch15, 25:24);
580 s(McEmemAdrCfgDev1, 19:16, secure_scratch15, 29:26);
581
582 /* Make sure all writes complete before we lock the secure_scratchs. */
583 dmb();
584 c(0x1555555, sec_disable2, 25:0);
585 c(0xff, sec_disable, 19:12);
586
587 c(0, scratch2, 31:0);
588 m(pllm_base, 15:0, scratch2, 15:0);
589 m(pllm_base, 20:20, scratch2, 16:16);
590 m(pllm_misc2, 2:0, scratch2, 19:17);
591 c(0, scratch35, 31:0);
592 m(pllm_misc1, 23:0, scratch35, 23:0);
593 m(pllm_misc1, 30:28, scratch35, 30:28);
594 c(0, scratch3, 31:0);
595 s(PllMInputDivider, 7:0, scratch3, 7:0);
596 c(0x3e, scratch3, 15:8);
597 c(0, scratch3, 19:16);
598 s(PllMKVCO, 0:0, scratch3, 20:20);
599 s(PllMKCP, 1:0, scratch3, 22:21);
600 c(0, scratch36, 31:0);
601 s(PllMSetupControl, 23:0, scratch36, 23:0);
602 c(0, scratch4, 31:0);
603 s(PllMStableTime, 9:0, scratch4, 9:0);
604 s(PllMStableTime, 9:0, scratch4, 19:10);
605
606 s(PllMSelectDiv2, 0:0, pllm_wb0_override2, 27:27);
607 s(PllMKVCO, 0:0, pllm_wb0_override2, 26:26);
608 s(PllMKCP, 1:0, pllm_wb0_override2, 25:24);
609 s(PllMSetupControl, 23:0, pllm_wb0_override2, 23:0);
610 s(PllMFeedbackDivider, 7:0, pllm_wb0_override_freq, 15:8);
611 s(PllMInputDivider, 7:0, pllm_wb0_override_freq, 7:0);
612
613 /* Need to ensure override params are written before we activate it. */
614 dmb();
615 c(3, pllp_wb0_override, 12:11);
616}