Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
CTCaer
GitHub Repository: CTCaer/hekate
Path: blob/master/modules/hekate_libsys_minerva/sys_sdrammtc.c
1476 views
1
/*
2
* Minerva Training Cell
3
* DRAM Training for Tegra X1 SoC. Supports LPDDR4.
4
*
5
* Copyright (c) 2018-2022 CTCaer <[email protected]>
6
*
7
* This program is free software; you can redistribute it and/or modify it
8
* under the terms and conditions of the GNU General Public License,
9
* version 2, as published by the Free Software Foundation.
10
*
11
* This program is distributed in the hope it will be useful, but WITHOUT
12
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14
* more details.
15
*
16
* You should have received a copy of the GNU General Public License
17
* along with this program. If not, see <http://www.gnu.org/licenses/>.
18
*/
19
20
#include <string.h>
21
#include <stdlib.h>
22
#include "mtc.h"
23
#include "mtc_mc_emc_regs.h"
24
#include "mtc_switch_tables.h"
25
#include "types.h"
26
#include <module.h>
27
28
#define EPRINTF(...)
29
#define EPRINTFARGS(...)
30
31
#define MAX_FREQ_T210 1600000
32
//#define OVERCLOCK_FREQ 1862400
33
//#define OVERCLOCK_VOLTAGE 1200000 // Default is 1100mV and in HOS 1125mV.
34
35
#define PERF_HACK
36
37
bool train_ram_patterns;
38
39
/*
40
* REF: PLL Input reference (OSC_FREQ).
41
* DIVN: PLL feedback divider.
42
* DIVM: PLL input divider.
43
* DIVP: PLL post divider.
44
* PLL_OUT = (REF / DIVM) * DIVN / DIVP
45
*
46
* DIVP | DIVP
47
* Encoded | Real
48
* ----------------------
49
* 0 | 1 (DIVP off)
50
* 1 | 2
51
* 2 | 3
52
* 3 | 4
53
* 4 | 5
54
* 5 | 6
55
* 6 | 8
56
* 7 | 10
57
* 8 | 12
58
* 9 | 16
59
* 10 | 12
60
* 11 | 16
61
* 12 | 20
62
* 13 | 24
63
* 14 | 32
64
*/
65
static pllm_clk_config_t pllm_clk_config_table[] =
66
{
67
// pll_osc_in, pll_out, pll_feedback_div, pll_input_div, pll_post_div.
68
// f_in, f_out, n, m, p.
69
// f_out = ((f_in / m) * n) / p. Example: 1600000 = (38400 / 2) * 97.
70
{38400, 297600, 93, 4, 2},
71
{38400, 400000, 125, 4, 2},
72
{38400, 408000, 85, 4, 1},
73
{38400, 532800, 111, 4, 1},
74
{38400, 665600, 104, 3, 1},
75
{38400, 800000, 125, 3, 1},
76
{38400, 931200, 97, 4, 0},
77
{38400, 1065600, 111, 4, 0},
78
{38400, 1200000, 125, 4, 0},
79
{38400, 1331200, 104, 3, 0},
80
{38400, 1459200, 76, 2, 0},
81
{38400, 1600000, 125, 3, 0},
82
{38400, 1728000, 90, 2, 0}, // Custom. Normalized 1733 MHz.
83
{38400, 1795200, 187, 4, 0}, // Custom. Normalized 1800 MHz.
84
{38400, 1862400, 97, 2, 0}, // JEDEC Standard. (T210 official max).
85
{38400, 1894400, 148, 3, 0}, // Custom. Normalized 1900 MHz.
86
{38400, 1932800, 151, 3, 0}, // Custom. Normalized 1933 MHz.
87
{38400, 1958400, 102, 2, 0}, // Custom. Normalized 1966 MHz.
88
{38400, 1996800, 104, 2, 0}, // Custom. Normalized 2000 MHz.
89
{38400, 2035200, 106, 2, 0}, // Custom. Normalized 2033 MHz.
90
{38400, 2064000, 215, 4, 0}, // Custom. Normalized 2066 MHz.
91
{38400, 2099200, 164, 3, 0}, // Custom. Normalized 2100 MHz.
92
{38400, 2131200, 111, 2, 0}, // JEDEC Standard. (T210B01 official max).
93
{38400, 2163200, 169, 3, 0}, // Custom. Normalized 2166 MHz.
94
{38400, 2188800, 114, 2, 0}, // Custom. Normalized 2200 MHz.
95
{38400, 2227200, 116, 2, 0}, // Custom. Normalized 2233 MHz.
96
{38400, 2265600, 118, 2, 0}, // Custom. Normalized 2266 MHz.
97
{38400, 2291200, 179, 3, 0}, // Custom. Normalized 2300 MHz.
98
{38400, 2329600, 182, 3, 0}, // Custom. Normalized 2333 MHz.
99
{38400, 2361600, 123, 2, 0}, // Custom. Normalized 2366 MHz.
100
{0, 0, 0, 0, 0}
101
};
102
103
static const u32 burst_regs_emc_addr_table[221] = {
104
EMC_RC,
105
EMC_RFC,
106
EMC_RFCPB,
107
EMC_REFCTRL2,
108
EMC_RFC_SLR,
109
EMC_RAS,
110
EMC_RP,
111
EMC_R2W,
112
EMC_W2R,
113
EMC_R2P,
114
EMC_W2P,
115
EMC_R2R,
116
EMC_TPPD,
117
EMC_CCDMW,
118
EMC_RD_RCD,
119
EMC_WR_RCD,
120
EMC_RRD,
121
EMC_REXT,
122
EMC_WEXT,
123
EMC_WDV_CHK,
124
EMC_WDV,
125
EMC_WSV,
126
EMC_WEV,
127
EMC_WDV_MASK,
128
EMC_WS_DURATION,
129
EMC_WE_DURATION,
130
EMC_QUSE,
131
EMC_QUSE_WIDTH,
132
EMC_IBDLY,
133
EMC_OBDLY,
134
EMC_EINPUT,
135
EMC_MRW6,
136
EMC_EINPUT_DURATION,
137
EMC_PUTERM_EXTRA,
138
EMC_PUTERM_WIDTH,
139
EMC_QRST,
140
EMC_QSAFE,
141
EMC_RDV,
142
EMC_RDV_MASK,
143
EMC_RDV_EARLY,
144
EMC_RDV_EARLY_MASK,
145
EMC_REFRESH,
146
EMC_BURST_REFRESH_NUM,
147
EMC_PRE_REFRESH_REQ_CNT,
148
EMC_PDEX2WR,
149
EMC_PDEX2RD,
150
EMC_PCHG2PDEN,
151
EMC_ACT2PDEN,
152
EMC_AR2PDEN,
153
EMC_RW2PDEN,
154
EMC_CKE2PDEN,
155
EMC_PDEX2CKE,
156
EMC_PDEX2MRR,
157
EMC_TXSR,
158
EMC_TXSRDLL,
159
EMC_TCKE,
160
EMC_TCKESR,
161
EMC_TPD,
162
EMC_TFAW,
163
EMC_TRPAB,
164
EMC_TCLKSTABLE,
165
EMC_TCLKSTOP,
166
EMC_MRW7,
167
EMC_TREFBW,
168
EMC_ODT_WRITE,
169
EMC_FBIO_CFG5,
170
EMC_FBIO_CFG7,
171
EMC_CFG_DIG_DLL,
172
EMC_CFG_DIG_DLL_PERIOD,
173
EMC_PMACRO_IB_RXRT,
174
EMC_CFG_PIPE_1,
175
EMC_CFG_PIPE_2,
176
EMC_PMACRO_QUSE_DDLL_RANK0_4,
177
EMC_PMACRO_QUSE_DDLL_RANK0_5,
178
EMC_PMACRO_QUSE_DDLL_RANK1_4,
179
EMC_PMACRO_QUSE_DDLL_RANK1_5,
180
EMC_MRW8,
181
EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_4,
182
EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_5,
183
EMC_PMACRO_OB_DDLL_LONG_DQS_RANK0_0,
184
EMC_PMACRO_OB_DDLL_LONG_DQS_RANK0_1,
185
EMC_PMACRO_OB_DDLL_LONG_DQS_RANK0_2,
186
EMC_PMACRO_OB_DDLL_LONG_DQS_RANK0_3,
187
EMC_PMACRO_OB_DDLL_LONG_DQS_RANK0_4,
188
EMC_PMACRO_OB_DDLL_LONG_DQS_RANK0_5,
189
EMC_PMACRO_OB_DDLL_LONG_DQS_RANK1_0,
190
EMC_PMACRO_OB_DDLL_LONG_DQS_RANK1_1,
191
EMC_PMACRO_OB_DDLL_LONG_DQS_RANK1_2,
192
EMC_PMACRO_OB_DDLL_LONG_DQS_RANK1_3,
193
EMC_PMACRO_OB_DDLL_LONG_DQS_RANK1_4,
194
EMC_PMACRO_OB_DDLL_LONG_DQS_RANK1_5,
195
EMC_PMACRO_DDLL_LONG_CMD_0,
196
EMC_PMACRO_DDLL_LONG_CMD_1,
197
EMC_PMACRO_DDLL_LONG_CMD_2,
198
EMC_PMACRO_DDLL_LONG_CMD_3,
199
EMC_PMACRO_DDLL_LONG_CMD_4,
200
EMC_PMACRO_DDLL_SHORT_CMD_0,
201
EMC_PMACRO_DDLL_SHORT_CMD_1,
202
EMC_PMACRO_DDLL_SHORT_CMD_2,
203
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE0_3,
204
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE1_3,
205
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE2_3,
206
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE3_3,
207
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE4_3,
208
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE5_3,
209
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE6_3,
210
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE7_3,
211
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD0_3,
212
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD1_3,
213
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD2_3,
214
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD3_3,
215
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE0_3,
216
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE1_3,
217
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE2_3,
218
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE3_3,
219
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE4_3,
220
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE5_3,
221
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE6_3,
222
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE7_3,
223
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD0_0,
224
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD0_1,
225
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD0_2,
226
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD0_3,
227
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD1_0,
228
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD1_1,
229
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD1_2,
230
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD1_3,
231
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD2_0,
232
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD2_1,
233
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD2_2,
234
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD2_3,
235
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD3_0,
236
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD3_1,
237
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD3_2,
238
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_CMD3_3,
239
EMC_TXDSRVTTGEN,
240
EMC_FDPD_CTRL_DQ,
241
EMC_FDPD_CTRL_CMD,
242
EMC_FBIO_SPARE,
243
EMC_ZCAL_INTERVAL,
244
EMC_ZCAL_WAIT_CNT,
245
EMC_MRS_WAIT_CNT,
246
EMC_MRS_WAIT_CNT2,
247
EMC_AUTO_CAL_CHANNEL,
248
EMC_DLL_CFG_0,
249
EMC_DLL_CFG_1,
250
EMC_PMACRO_AUTOCAL_CFG_COMMON,
251
EMC_PMACRO_ZCTRL,
252
EMC_CFG,
253
EMC_CFG_PIPE,
254
EMC_DYN_SELF_REF_CONTROL,
255
EMC_QPOP,
256
EMC_DQS_BRLSHFT_0,
257
EMC_DQS_BRLSHFT_1,
258
EMC_CMD_BRLSHFT_2,
259
EMC_CMD_BRLSHFT_3,
260
EMC_PMACRO_PAD_CFG_CTRL,
261
EMC_PMACRO_DATA_PAD_RX_CTRL,
262
EMC_PMACRO_CMD_PAD_RX_CTRL,
263
EMC_PMACRO_DATA_RX_TERM_MODE,
264
EMC_PMACRO_CMD_RX_TERM_MODE,
265
EMC_PMACRO_CMD_PAD_TX_CTRL,
266
EMC_PMACRO_DATA_PAD_TX_CTRL,
267
EMC_PMACRO_COMMON_PAD_TX_CTRL,
268
EMC_PMACRO_VTTGEN_CTRL_0,
269
EMC_PMACRO_VTTGEN_CTRL_1,
270
EMC_PMACRO_VTTGEN_CTRL_2,
271
EMC_PMACRO_BRICK_CTRL_RFU1,
272
EMC_PMACRO_CMD_BRICK_CTRL_FDPD,
273
EMC_PMACRO_BRICK_CTRL_RFU2,
274
EMC_PMACRO_DATA_BRICK_CTRL_FDPD,
275
EMC_PMACRO_BG_BIAS_CTRL_0,
276
EMC_CFG_3,
277
EMC_PMACRO_TX_PWRD_0,
278
EMC_PMACRO_TX_PWRD_1,
279
EMC_PMACRO_TX_PWRD_2,
280
EMC_PMACRO_TX_PWRD_3,
281
EMC_PMACRO_TX_PWRD_4,
282
EMC_PMACRO_TX_PWRD_5,
283
EMC_CONFIG_SAMPLE_DELAY,
284
EMC_PMACRO_TX_SEL_CLK_SRC_0,
285
EMC_PMACRO_TX_SEL_CLK_SRC_1,
286
EMC_PMACRO_TX_SEL_CLK_SRC_2,
287
EMC_PMACRO_TX_SEL_CLK_SRC_3,
288
EMC_PMACRO_TX_SEL_CLK_SRC_4,
289
EMC_PMACRO_TX_SEL_CLK_SRC_5,
290
EMC_PMACRO_DDLL_BYPASS,
291
EMC_PMACRO_DDLL_PWRD_0,
292
EMC_PMACRO_DDLL_PWRD_1,
293
EMC_PMACRO_DDLL_PWRD_2,
294
EMC_PMACRO_CMD_CTRL_0,
295
EMC_PMACRO_CMD_CTRL_1,
296
EMC_PMACRO_CMD_CTRL_2,
297
EMC_TR_TIMING_0,
298
EMC_TR_DVFS,
299
EMC_TR_CTRL_1,
300
EMC_TR_RDV,
301
EMC_TR_QPOP,
302
EMC_TR_RDV_MASK,
303
EMC_MRW14,
304
EMC_TR_QSAFE,
305
EMC_TR_QRST,
306
EMC_TRAINING_CTRL,
307
EMC_TRAINING_SETTLE,
308
EMC_TRAINING_VREF_SETTLE,
309
EMC_TRAINING_CA_FINE_CTRL,
310
EMC_TRAINING_CA_CTRL_MISC,
311
EMC_TRAINING_CA_CTRL_MISC1,
312
EMC_TRAINING_CA_VREF_CTRL,
313
EMC_TRAINING_QUSE_CORS_CTRL,
314
EMC_TRAINING_QUSE_FINE_CTRL,
315
EMC_TRAINING_QUSE_CTRL_MISC,
316
EMC_TRAINING_QUSE_VREF_CTRL,
317
EMC_TRAINING_READ_FINE_CTRL,
318
EMC_TRAINING_READ_CTRL_MISC,
319
EMC_TRAINING_READ_VREF_CTRL,
320
EMC_TRAINING_WRITE_FINE_CTRL,
321
EMC_TRAINING_WRITE_CTRL_MISC,
322
EMC_TRAINING_WRITE_VREF_CTRL,
323
EMC_TRAINING_MPC,
324
EMC_MRW15
325
};
326
327
static const u32 burst_reg_per_ch_emc01_addr_table[8] = {
328
EMC0_MRW10,
329
EMC1_MRW10,
330
EMC0_MRW11,
331
EMC1_MRW11,
332
EMC0_MRW12,
333
EMC1_MRW12,
334
EMC0_MRW13,
335
EMC1_MRW13
336
};
337
338
static const u32 vref_perch_regs_emc01_addr_table[4] = {
339
EMC0_TRAINING_OPT_DQS_IB_VREF_RANK0,
340
EMC1_TRAINING_OPT_DQS_IB_VREF_RANK0,
341
EMC0_TRAINING_OPT_DQS_IB_VREF_RANK1,
342
EMC1_TRAINING_OPT_DQS_IB_VREF_RANK1
343
};
344
345
static const u32 training_mod_regs_emc01_addr_table[20] = {
346
EMC0_TRAINING_RW_OFFSET_IB_BYTE0,
347
EMC1_TRAINING_RW_OFFSET_IB_BYTE0,
348
EMC0_TRAINING_RW_OFFSET_IB_BYTE1,
349
EMC1_TRAINING_RW_OFFSET_IB_BYTE1,
350
EMC0_TRAINING_RW_OFFSET_IB_BYTE2,
351
EMC1_TRAINING_RW_OFFSET_IB_BYTE2,
352
EMC0_TRAINING_RW_OFFSET_IB_BYTE3,
353
EMC1_TRAINING_RW_OFFSET_IB_BYTE3,
354
EMC0_TRAINING_RW_OFFSET_IB_MISC,
355
EMC1_TRAINING_RW_OFFSET_IB_MISC,
356
EMC0_TRAINING_RW_OFFSET_OB_BYTE0,
357
EMC1_TRAINING_RW_OFFSET_OB_BYTE0,
358
EMC0_TRAINING_RW_OFFSET_OB_BYTE1,
359
EMC1_TRAINING_RW_OFFSET_OB_BYTE1,
360
EMC0_TRAINING_RW_OFFSET_OB_BYTE2,
361
EMC1_TRAINING_RW_OFFSET_OB_BYTE2,
362
EMC0_TRAINING_RW_OFFSET_OB_BYTE3,
363
EMC1_TRAINING_RW_OFFSET_OB_BYTE3,
364
EMC0_TRAINING_RW_OFFSET_OB_MISC,
365
EMC1_TRAINING_RW_OFFSET_OB_MISC
366
};
367
368
static const u32 trim_regs_emc_addr_table[138] = {
369
EMC_PMACRO_IB_DDLL_LONG_DQS_RANK0_0,
370
EMC_PMACRO_IB_DDLL_LONG_DQS_RANK0_1,
371
EMC_PMACRO_IB_DDLL_LONG_DQS_RANK0_2,
372
EMC_PMACRO_IB_DDLL_LONG_DQS_RANK0_3,
373
EMC_PMACRO_IB_DDLL_LONG_DQS_RANK1_0,
374
EMC_PMACRO_IB_DDLL_LONG_DQS_RANK1_1,
375
EMC_PMACRO_IB_DDLL_LONG_DQS_RANK1_2,
376
EMC_PMACRO_IB_DDLL_LONG_DQS_RANK1_3,
377
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE0_0,
378
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE0_1,
379
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE0_2,
380
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE1_0,
381
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE1_1,
382
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE1_2,
383
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE2_0,
384
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE2_1,
385
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE2_2,
386
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE3_0,
387
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE3_1,
388
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE3_2,
389
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE4_0,
390
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE4_1,
391
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE4_2,
392
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE5_0,
393
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE5_1,
394
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE5_2,
395
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE6_0,
396
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE6_1,
397
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE6_2,
398
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE7_0,
399
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE7_1,
400
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE7_2,
401
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE0_0,
402
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE0_1,
403
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE0_2,
404
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE1_0,
405
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE1_1,
406
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE1_2,
407
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE2_0,
408
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE2_1,
409
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE2_2,
410
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE3_0,
411
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE3_1,
412
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE3_2,
413
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE4_0,
414
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE4_1,
415
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE4_2,
416
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE5_0,
417
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE5_1,
418
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE5_2,
419
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE6_0,
420
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE6_1,
421
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE6_2,
422
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE7_0,
423
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE7_1,
424
EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE7_2,
425
EMC_PMACRO_IB_VREF_DQS_0,
426
EMC_PMACRO_IB_VREF_DQS_1,
427
EMC_PMACRO_IB_VREF_DQ_0,
428
EMC_PMACRO_IB_VREF_DQ_1,
429
EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_0,
430
EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_1,
431
EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_2,
432
EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_3,
433
EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_4,
434
EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_5,
435
EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_0,
436
EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_1,
437
EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_2,
438
EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_3,
439
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE0_0,
440
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE0_1,
441
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE0_2,
442
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE1_0,
443
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE1_1,
444
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE1_2,
445
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE2_0,
446
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE2_1,
447
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE2_2,
448
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE3_0,
449
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE3_1,
450
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE3_2,
451
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE4_0,
452
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE4_1,
453
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE4_2,
454
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE5_0,
455
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE5_1,
456
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE5_2,
457
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE6_0,
458
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE6_1,
459
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE6_2,
460
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE7_0,
461
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE7_1,
462
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE7_2,
463
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD0_0,
464
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD0_1,
465
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD0_2,
466
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD1_0,
467
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD1_1,
468
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD1_2,
469
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD2_0,
470
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD2_1,
471
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD2_2,
472
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD3_0,
473
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD3_1,
474
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD3_2,
475
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE0_0,
476
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE0_1,
477
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE0_2,
478
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE1_0,
479
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE1_1,
480
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE1_2,
481
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE2_0,
482
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE2_1,
483
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE2_2,
484
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE3_0,
485
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE3_1,
486
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE3_2,
487
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE4_0,
488
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE4_1,
489
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE4_2,
490
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE5_0,
491
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE5_1,
492
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE5_2,
493
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE6_0,
494
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE6_1,
495
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE6_2,
496
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE7_0,
497
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE7_1,
498
EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE7_2,
499
EMC_PMACRO_QUSE_DDLL_RANK0_0,
500
EMC_PMACRO_QUSE_DDLL_RANK0_1,
501
EMC_PMACRO_QUSE_DDLL_RANK0_2,
502
EMC_PMACRO_QUSE_DDLL_RANK0_3,
503
EMC_PMACRO_QUSE_DDLL_RANK1_0,
504
EMC_PMACRO_QUSE_DDLL_RANK1_1,
505
EMC_PMACRO_QUSE_DDLL_RANK1_2,
506
EMC_PMACRO_QUSE_DDLL_RANK1_3
507
};
508
509
static const u32 trim_perch_regs_emc01_addr_table[10] = {
510
EMC0_CMD_BRLSHFT_0,
511
EMC1_CMD_BRLSHFT_1,
512
EMC0_DATA_BRLSHFT_0,
513
EMC1_DATA_BRLSHFT_0,
514
EMC0_DATA_BRLSHFT_1,
515
EMC1_DATA_BRLSHFT_1,
516
EMC0_QUSE_BRLSHFT_0,
517
EMC1_QUSE_BRLSHFT_1,
518
EMC0_QUSE_BRLSHFT_2,
519
EMC1_QUSE_BRLSHFT_3
520
};
521
522
static const u32 burst_mc_regs_addr_table[33] = {
523
MC_EMEM_ARB_CFG,
524
MC_EMEM_ARB_OUTSTANDING_REQ,
525
MC_EMEM_ARB_REFPB_HP_CTRL,
526
MC_EMEM_ARB_REFPB_BANK_CTRL,
527
MC_EMEM_ARB_TIMING_RCD,
528
MC_EMEM_ARB_TIMING_RP,
529
MC_EMEM_ARB_TIMING_RC,
530
MC_EMEM_ARB_TIMING_RAS,
531
MC_EMEM_ARB_TIMING_FAW,
532
MC_EMEM_ARB_TIMING_RRD,
533
MC_EMEM_ARB_TIMING_RAP2PRE,
534
MC_EMEM_ARB_TIMING_WAP2PRE,
535
MC_EMEM_ARB_TIMING_R2R,
536
MC_EMEM_ARB_TIMING_W2W,
537
MC_EMEM_ARB_TIMING_R2W,
538
MC_EMEM_ARB_TIMING_CCDMW,
539
MC_EMEM_ARB_TIMING_W2R,
540
MC_EMEM_ARB_TIMING_RFCPB,
541
MC_EMEM_ARB_DA_TURNS,
542
MC_EMEM_ARB_DA_COVERS,
543
MC_EMEM_ARB_MISC0,
544
MC_EMEM_ARB_MISC1,
545
MC_EMEM_ARB_MISC2,
546
MC_EMEM_ARB_RING1_THROTTLE,
547
MC_EMEM_ARB_DHYST_CTRL,
548
MC_EMEM_ARB_DHYST_TIMEOUT_UTIL_0,
549
MC_EMEM_ARB_DHYST_TIMEOUT_UTIL_1,
550
MC_EMEM_ARB_DHYST_TIMEOUT_UTIL_2,
551
MC_EMEM_ARB_DHYST_TIMEOUT_UTIL_3,
552
MC_EMEM_ARB_DHYST_TIMEOUT_UTIL_4,
553
MC_EMEM_ARB_DHYST_TIMEOUT_UTIL_5,
554
MC_EMEM_ARB_DHYST_TIMEOUT_UTIL_6,
555
MC_EMEM_ARB_DHYST_TIMEOUT_UTIL_7
556
};
557
558
static const u32 la_scale_regs_mc_addr_table[24] = {
559
MC_MLL_MPCORER_PTSA_RATE,
560
MC_FTOP_PTSA_RATE,
561
MC_PTSA_GRANT_DECREMENT,
562
MC_LATENCY_ALLOWANCE_XUSB_0,
563
MC_LATENCY_ALLOWANCE_XUSB_1,
564
MC_LATENCY_ALLOWANCE_TSEC_0,
565
MC_LATENCY_ALLOWANCE_SDMMCA_0,
566
MC_LATENCY_ALLOWANCE_SDMMCAA_0,
567
MC_LATENCY_ALLOWANCE_SDMMC_0,
568
MC_LATENCY_ALLOWANCE_SDMMCAB_0,
569
MC_LATENCY_ALLOWANCE_PPCS_0,
570
MC_LATENCY_ALLOWANCE_PPCS_1,
571
MC_LATENCY_ALLOWANCE_MPCORE_0,
572
MC_LATENCY_ALLOWANCE_HC_0,
573
MC_LATENCY_ALLOWANCE_HC_1,
574
MC_LATENCY_ALLOWANCE_AVPC_0,
575
MC_LATENCY_ALLOWANCE_GPU_0,
576
MC_LATENCY_ALLOWANCE_GPU2_0,
577
MC_LATENCY_ALLOWANCE_NVENC_0,
578
MC_LATENCY_ALLOWANCE_NVDEC_0,
579
MC_LATENCY_ALLOWANCE_VIC_0,
580
MC_LATENCY_ALLOWANCE_VI2_0,
581
MC_LATENCY_ALLOWANCE_ISP2_0,
582
MC_LATENCY_ALLOWANCE_ISP2_1
583
};
584
585
static const u32 periodic_training_addr[10] =
586
{
587
EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_0,
588
EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_1,
589
EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_2,
590
EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_3,
591
EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_0,
592
EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_1,
593
EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_2,
594
EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_3,
595
EMC_DATA_BRLSHFT_0,
596
EMC_DATA_BRLSHFT_1
597
};
598
599
static const u32 ram_pattern_dq_table[0x500] = {
600
/* DQ RAM Patterns Table 0 */
601
0x18181818, 0x61616161, 0x85858585, 0x14141414, 0x51515151,
602
0x47474747, 0x1E1E1E1E, 0x79797979, 0xE5E5E5E5, 0x94949494,
603
0x51515151, 0x46464646, 0x19191919, 0x67676767, 0x9C9C9C9C,
604
0x71717171, 0xC5C5C5C5, 0x17171717, 0x5F5F5F5F, 0x7E7E7E7E,
605
0xFBFBFBFB, 0xEDEDEDED, 0xB4B4B4B4, 0xD2D2D2D2, 0x48484848,
606
0x21212121, 0x85858585, 0x16161616, 0x59595959, 0x66666666,
607
0x9A9A9A9A, 0x69696969, 0xA4A4A4A4, 0x93939393, 0x4F4F4F4F,
608
0x3F3F3F3F, 0xFCFCFCFC, 0xF3F3F3F3, 0xCDCDCDCD, 0x37373737,
609
0xDCDCDCDC, 0x70707070, 0xC3C3C3C3, 0x0F0F0F0F, 0x3E3E3E3E,
610
0xFAFAFAFA, 0xEBEBEBEB, 0xACACACAC, 0xB3B3B3B3, 0xCCCCCCCC,
611
0x31313131, 0xC5C5C5C5, 0x15151515, 0x57575757, 0x5F5F5F5F,
612
0x7F7F7F7F, 0xFDFDFDFD, 0xF4F4F4F4, 0xD0D0D0D0, 0x42424242,
613
0x08080808, 0x23232323, 0x8F8F8F8F, 0x3F3F3F3F, 0x18181818,
614
0x61616161, 0x85858585, 0x14141414, 0x51515151, 0x47474747,
615
0x1E1E1E1E, 0x79797979, 0xE5E5E5E5, 0x94949494, 0x51515151,
616
0x46464646, 0x19191919, 0x67676767, 0x9C9C9C9C, 0x71717171,
617
0xC5C5C5C5, 0x17171717, 0x5F5F5F5F, 0x7E7E7E7E, 0xFBFBFBFB,
618
0xEDEDEDED, 0xB4B4B4B4, 0xD2D2D2D2, 0x48484848, 0x21212121,
619
0x85858585, 0x16161616, 0x59595959, 0x66666666, 0x9A9A9A9A,
620
0x69696969, 0xA4A4A4A4, 0x93939393, 0x4F4F4F4F, 0x3F3F3F3F,
621
0xFCFCFCFC, 0xF3F3F3F3, 0xCDCDCDCD, 0x37373737, 0xDCDCDCDC,
622
0x70707070, 0xC3C3C3C3, 0x0F0F0F0F, 0x3E3E3E3E, 0xFAFAFAFA,
623
0xEBEBEBEB, 0xACACACAC, 0xB3B3B3B3, 0xCCCCCCCC, 0x31313131,
624
0xC5C5C5C5, 0x15151515, 0x57575757, 0x5F5F5F5F, 0x7F7F7F7F,
625
0xFDFDFDFD, 0xF4F4F4F4, 0xD0D0D0D0, 0x42424242, 0x08080808,
626
0x23232323, 0x8F8F8F8F, 0x3F3F3F3F, 0x06060606, 0x18181818,
627
0x21212121, 0x05050505, 0x14141414, 0x11111111, 0x07070707,
628
0x1E1E1E1E, 0x39393939, 0x25252525, 0x14141414, 0x11111111,
629
0x06060606, 0x19191919, 0x27272727, 0x1C1C1C1C, 0x31313131,
630
0x05050505, 0x17171717, 0x1F1F1F1F, 0x3E3E3E3E, 0x3B3B3B3B,
631
0x2D2D2D2D, 0x34343434, 0x12121212, 0x08080808, 0x21212121,
632
0x05050505, 0x16161616, 0x19191919, 0x26262626, 0x1A1A1A1A,
633
0x29292929, 0x24242424, 0x13131313, 0x0F0F0F0F, 0x3F3F3F3F,
634
0x3C3C3C3C, 0x33333333, 0x0D0D0D0D, 0x37373737, 0x1C1C1C1C,
635
0x30303030, 0x03030303, 0x0F0F0F0F, 0x3E3E3E3E, 0x3A3A3A3A,
636
0x2B2B2B2B, 0x2C2C2C2C, 0x33333333, 0x0C0C0C0C, 0x31313131,
637
0x05050505, 0x15151515, 0x17171717, 0x1F1F1F1F, 0x3F3F3F3F,
638
0x3D3D3D3D, 0x34343434, 0x10101010, 0x02020202, 0x08080808,
639
0x23232323, 0x0F0F0F0F, 0x06060606, 0x18181818, 0x21212121,
640
0x05050505, 0x14141414, 0x11111111, 0x07070707, 0x1E1E1E1E,
641
0x39393939, 0x25252525, 0x14141414, 0x11111111, 0x06060606,
642
0x19191919, 0x27272727, 0x1C1C1C1C, 0x31313131, 0x05050505,
643
0x17171717, 0x1F1F1F1F, 0x3E3E3E3E, 0x3B3B3B3B, 0x2D2D2D2D,
644
0x34343434, 0x12121212, 0x08080808, 0x21212121, 0x05050505,
645
0x16161616, 0x19191919, 0x26262626, 0x1A1A1A1A, 0x29292929,
646
0x24242424, 0x13131313, 0x0F0F0F0F, 0x3F3F3F3F, 0x3C3C3C3C,
647
0x33333333, 0x0D0D0D0D, 0x37373737, 0x1C1C1C1C, 0x30303030,
648
0x03030303, 0x0F0F0F0F, 0x3E3E3E3E, 0x3A3A3A3A, 0x2B2B2B2B,
649
0x2C2C2C2C, 0x33333333, 0x0C0C0C0C, 0x31313131, 0x05050505,
650
0x15151515, 0x17171717, 0x1F1F1F1F, 0x3F3F3F3F, 0x3D3D3D3D,
651
0x34343434, 0x10101010, 0x02020202, 0x08080808, 0x23232323,
652
0x0F0F0F0F,
653
654
/* DQ RAM Patterns Table 1 */
655
0x00000000, 0x00000000, 0xFFFFFFFF, 0x00000000, 0x00000000,
656
0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF,
657
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF,
658
0x00000000, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000,
659
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000,
660
0x00000000, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000,
661
0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000,
662
0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000,
663
0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000, 0x00000000,
664
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
665
0x00000000, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000,
666
0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000,
667
0x00000000, 0x00000000, 0xFFFFFFFF, 0x00000000, 0x00000000,
668
0x00000000, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000,
669
0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000,
670
0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0x00000000,
671
0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF,
672
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000,
673
0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF,
674
0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000,
675
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF,
676
0x00000000, 0xFFFFFFFF, 0x00000000, 0x00000000, 0xFFFFFFFF,
677
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000,
678
0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
679
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000,
680
0x00000000, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000,
681
0x3F3F3F3F, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
682
0x00000000, 0x3F3F3F3F, 0x3F3F3F3F, 0x00000000, 0x00000000,
683
0x00000000, 0x00000000, 0x3F3F3F3F, 0x00000000, 0x3F3F3F3F,
684
0x00000000, 0x00000000, 0x00000000, 0x3F3F3F3F, 0x3F3F3F3F,
685
0x3F3F3F3F, 0x3F3F3F3F, 0x00000000, 0x00000000, 0x3F3F3F3F,
686
0x00000000, 0x00000000, 0x00000000, 0x3F3F3F3F, 0x00000000,
687
0x3F3F3F3F, 0x3F3F3F3F, 0x00000000, 0x00000000, 0x3F3F3F3F,
688
0x3F3F3F3F, 0x3F3F3F3F, 0x00000000, 0x3F3F3F3F, 0x00000000,
689
0x3F3F3F3F, 0x00000000, 0x00000000, 0x3F3F3F3F, 0x3F3F3F3F,
690
0x3F3F3F3F, 0x3F3F3F3F, 0x3F3F3F3F, 0x00000000, 0x3F3F3F3F,
691
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x3F3F3F3F,
692
0x3F3F3F3F, 0x3F3F3F3F, 0x00000000, 0x00000000, 0x00000000,
693
0x3F3F3F3F, 0x00000000, 0x00000000, 0x00000000, 0x3F3F3F3F,
694
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
695
0x3F3F3F3F, 0x3F3F3F3F, 0x00000000, 0x00000000, 0x00000000,
696
0x00000000, 0x3F3F3F3F, 0x00000000, 0x3F3F3F3F, 0x00000000,
697
0x00000000, 0x00000000, 0x3F3F3F3F, 0x3F3F3F3F, 0x3F3F3F3F,
698
0x3F3F3F3F, 0x00000000, 0x00000000, 0x3F3F3F3F, 0x00000000,
699
0x00000000, 0x00000000, 0x3F3F3F3F, 0x00000000, 0x3F3F3F3F,
700
0x3F3F3F3F, 0x00000000, 0x00000000, 0x3F3F3F3F, 0x3F3F3F3F,
701
0x3F3F3F3F, 0x00000000, 0x3F3F3F3F, 0x00000000, 0x3F3F3F3F,
702
0x00000000, 0x00000000, 0x3F3F3F3F, 0x3F3F3F3F, 0x3F3F3F3F,
703
0x3F3F3F3F, 0x3F3F3F3F, 0x00000000, 0x3F3F3F3F, 0x00000000,
704
0x00000000, 0x00000000, 0x00000000, 0x3F3F3F3F, 0x3F3F3F3F,
705
0x3F3F3F3F, 0x00000000, 0x00000000, 0x00000000, 0x3F3F3F3F,
706
0x00000000,
707
708
/* DQ RAM Patterns Table 2 */
709
0x00000000, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000,
710
0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF,
711
0x00000000, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000,
712
0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF,
713
0x00000000, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000,
714
0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF,
715
0x00000000, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000,
716
0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF,
717
0x00000000, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000,
718
0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF,
719
0x00000000, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000,
720
0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF,
721
0x00000000, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000,
722
0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF,
723
0x00000000, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000,
724
0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF,
725
0x00000000, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000,
726
0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF,
727
0x00000000, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000,
728
0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF,
729
0x00000000, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000,
730
0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF,
731
0x00000000, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000,
732
0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF,
733
0x00000000, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000,
734
0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000, 0x3F3F3F3F,
735
0x00000000, 0x3F3F3F3F, 0x00000000, 0x3F3F3F3F, 0x00000000,
736
0x3F3F3F3F, 0x00000000, 0x3F3F3F3F, 0x00000000, 0x3F3F3F3F,
737
0x00000000, 0x3F3F3F3F, 0x00000000, 0x3F3F3F3F, 0x00000000,
738
0x3F3F3F3F, 0x00000000, 0x3F3F3F3F, 0x00000000, 0x3F3F3F3F,
739
0x00000000, 0x3F3F3F3F, 0x00000000, 0x3F3F3F3F, 0x00000000,
740
0x3F3F3F3F, 0x00000000, 0x3F3F3F3F, 0x00000000, 0x3F3F3F3F,
741
0x00000000, 0x3F3F3F3F, 0x00000000, 0x3F3F3F3F, 0x00000000,
742
0x3F3F3F3F, 0x00000000, 0x3F3F3F3F, 0x00000000, 0x3F3F3F3F,
743
0x00000000, 0x3F3F3F3F, 0x00000000, 0x3F3F3F3F, 0x00000000,
744
0x3F3F3F3F, 0x00000000, 0x3F3F3F3F, 0x00000000, 0x3F3F3F3F,
745
0x00000000, 0x3F3F3F3F, 0x00000000, 0x3F3F3F3F, 0x00000000,
746
0x3F3F3F3F, 0x00000000, 0x3F3F3F3F, 0x00000000, 0x3F3F3F3F,
747
0x00000000, 0x3F3F3F3F, 0x00000000, 0x3F3F3F3F, 0x00000000,
748
0x3F3F3F3F, 0x00000000, 0x3F3F3F3F, 0x00000000, 0x3F3F3F3F,
749
0x00000000, 0x3F3F3F3F, 0x00000000, 0x3F3F3F3F, 0x00000000,
750
0x3F3F3F3F, 0x00000000, 0x3F3F3F3F, 0x00000000, 0x3F3F3F3F,
751
0x00000000, 0x3F3F3F3F, 0x00000000, 0x3F3F3F3F, 0x00000000,
752
0x3F3F3F3F, 0x00000000, 0x3F3F3F3F, 0x00000000, 0x3F3F3F3F,
753
0x00000000, 0x3F3F3F3F, 0x00000000, 0x3F3F3F3F, 0x00000000,
754
0x3F3F3F3F, 0x00000000, 0x3F3F3F3F, 0x00000000, 0x3F3F3F3F,
755
0x00000000, 0x3F3F3F3F, 0x00000000, 0x3F3F3F3F, 0x00000000,
756
0x3F3F3F3F, 0x00000000, 0x3F3F3F3F, 0x00000000, 0x3F3F3F3F,
757
0x00000000, 0x3F3F3F3F, 0x00000000, 0x3F3F3F3F, 0x00000000,
758
0x3F3F3F3F, 0x00000000, 0x3F3F3F3F, 0x00000000, 0x3F3F3F3F,
759
0x00000000, 0x3F3F3F3F, 0x00000000, 0x3F3F3F3F, 0x00000000,
760
0x3F3F3F3F,
761
762
/* DQ RAM Patterns Table 3 */
763
0x80808080, 0x00000000, 0x80808080, 0x00000000, 0x80808080,
764
0x00000000, 0x80808080, 0x40404040, 0x00000000, 0x40404040,
765
0x00000000, 0x40404040, 0x00000000, 0x40404040, 0x20202020,
766
0x00000000, 0x20202020, 0x00000000, 0x20202020, 0x00000000,
767
0x20202020, 0x10101010, 0x00000000, 0x10101010, 0x00000000,
768
0x10101010, 0x00000000, 0x10101010, 0x08080808, 0x00000000,
769
0x08080808, 0x00000000, 0x08080808, 0x00000000, 0x08080808,
770
0x04040404, 0x00000000, 0x04040404, 0x00000000, 0x04040404,
771
0x00000000, 0x04040404, 0x02020202, 0x00000000, 0x02020202,
772
0x00000000, 0x02020202, 0x00000000, 0x02020202, 0x01010101,
773
0x00000000, 0x01010101, 0x00000000, 0x01010101, 0x00000000,
774
0x01010101, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
775
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x80808080,
776
0x00000000, 0x80808080, 0x00000000, 0x80808080, 0x00000000,
777
0x80808080, 0x40404040, 0x00000000, 0x40404040, 0x00000000,
778
0x40404040, 0x00000000, 0x40404040, 0x20202020, 0x00000000,
779
0x20202020, 0x00000000, 0x20202020, 0x00000000, 0x20202020,
780
0x10101010, 0x00000000, 0x10101010, 0x00000000, 0x10101010,
781
0x00000000, 0x10101010, 0x08080808, 0x00000000, 0x08080808,
782
0x00000000, 0x08080808, 0x00000000, 0x08080808, 0x04040404,
783
0x00000000, 0x04040404, 0x00000000, 0x04040404, 0x00000000,
784
0x04040404, 0x02020202, 0x00000000, 0x02020202, 0x00000000,
785
0x02020202, 0x00000000, 0x02020202, 0x01010101, 0x00000000,
786
0x01010101, 0x00000000, 0x01010101, 0x00000000, 0x01010101,
787
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
788
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x20202020,
789
0x00000000, 0x20202020, 0x00000000, 0x20202020, 0x00000000,
790
0x20202020, 0x00000000, 0x20202020, 0x00000000, 0x10101010,
791
0x00000000, 0x10101010, 0x00000000, 0x10101010, 0x00000000,
792
0x10101010, 0x00000000, 0x10101010, 0x00000000, 0x08080808,
793
0x00000000, 0x08080808, 0x00000000, 0x08080808, 0x00000000,
794
0x08080808, 0x00000000, 0x08080808, 0x00000000, 0x04040404,
795
0x00000000, 0x04040404, 0x00000000, 0x04040404, 0x00000000,
796
0x04040404, 0x00000000, 0x04040404, 0x00000000, 0x02020202,
797
0x00000000, 0x02020202, 0x00000000, 0x02020202, 0x00000000,
798
0x02020202, 0x00000000, 0x02020202, 0x00000000, 0x01010101,
799
0x00000000, 0x01010101, 0x00000000, 0x01010101, 0x00000000,
800
0x01010101, 0x00000000, 0x01010101, 0x00000000, 0x00000000,
801
0x00000000, 0x00000000, 0x00000000, 0x20202020, 0x00000000,
802
0x20202020, 0x00000000, 0x20202020, 0x00000000, 0x20202020,
803
0x00000000, 0x20202020, 0x00000000, 0x10101010, 0x00000000,
804
0x10101010, 0x00000000, 0x10101010, 0x00000000, 0x10101010,
805
0x00000000, 0x10101010, 0x00000000, 0x08080808, 0x00000000,
806
0x08080808, 0x00000000, 0x08080808, 0x00000000, 0x08080808,
807
0x00000000, 0x08080808, 0x00000000, 0x04040404, 0x00000000,
808
0x04040404, 0x00000000, 0x04040404, 0x00000000, 0x04040404,
809
0x00000000, 0x04040404, 0x00000000, 0x02020202, 0x00000000,
810
0x02020202, 0x00000000, 0x02020202, 0x00000000, 0x02020202,
811
0x00000000, 0x02020202, 0x00000000, 0x01010101, 0x00000000,
812
0x01010101, 0x00000000, 0x01010101, 0x00000000, 0x01010101,
813
0x00000000, 0x01010101, 0x00000000, 0x00000000, 0x00000000,
814
0x00000000,
815
816
/* DQ RAM Patterns Table 4 */
817
0xAAAAAAAA, 0x55555555, 0xCCCCCCCC, 0x33333333, 0xAAAAAAAA,
818
0x55555555, 0xCCCCCCCC, 0x33333333, 0xAAAAAAAA, 0x55555555,
819
0xCCCCCCCC, 0x33333333, 0xAAAAAAAA, 0x55555555, 0xCCCCCCCC,
820
0x33333333, 0xAAAAAAAA, 0x55555555, 0xCCCCCCCC, 0x33333333,
821
0xAAAAAAAA, 0x55555555, 0xCCCCCCCC, 0x33333333, 0xAAAAAAAA,
822
0x55555555, 0xCCCCCCCC, 0x33333333, 0xAAAAAAAA, 0x55555555,
823
0xCCCCCCCC, 0x33333333, 0xAAAAAAAA, 0x55555555, 0xCCCCCCCC,
824
0x33333333, 0xAAAAAAAA, 0x55555555, 0xCCCCCCCC, 0x33333333,
825
0xAAAAAAAA, 0x55555555, 0xCCCCCCCC, 0x33333333, 0xAAAAAAAA,
826
0x55555555, 0xCCCCCCCC, 0x33333333, 0xAAAAAAAA, 0x55555555,
827
0xCCCCCCCC, 0x33333333, 0xAAAAAAAA, 0x55555555, 0xCCCCCCCC,
828
0x33333333, 0xAAAAAAAA, 0x55555555, 0xCCCCCCCC, 0x33333333,
829
0xAAAAAAAA, 0x55555555, 0xCCCCCCCC, 0x33333333, 0xAAAAAAAA,
830
0x55555555, 0xCCCCCCCC, 0x33333333, 0xAAAAAAAA, 0x55555555,
831
0xCCCCCCCC, 0x33333333, 0xAAAAAAAA, 0x55555555, 0xCCCCCCCC,
832
0x33333333, 0xAAAAAAAA, 0x55555555, 0xCCCCCCCC, 0x33333333,
833
0xAAAAAAAA, 0x55555555, 0xCCCCCCCC, 0x33333333, 0xAAAAAAAA,
834
0x55555555, 0xCCCCCCCC, 0x33333333, 0xAAAAAAAA, 0x55555555,
835
0xCCCCCCCC, 0x33333333, 0xAAAAAAAA, 0x55555555, 0xCCCCCCCC,
836
0x33333333, 0xAAAAAAAA, 0x55555555, 0xCCCCCCCC, 0x33333333,
837
0xAAAAAAAA, 0x55555555, 0xCCCCCCCC, 0x33333333, 0xAAAAAAAA,
838
0x55555555, 0xCCCCCCCC, 0x33333333, 0xAAAAAAAA, 0x55555555,
839
0xCCCCCCCC, 0x33333333, 0xAAAAAAAA, 0x55555555, 0xCCCCCCCC,
840
0x33333333, 0xAAAAAAAA, 0x55555555, 0xCCCCCCCC, 0x33333333,
841
0xAAAAAAAA, 0x55555555, 0xCCCCCCCC, 0x33333333, 0xAAAAAAAA,
842
0x55555555, 0xCCCCCCCC, 0x33333333, 0xAAAAAAAA, 0x55555555,
843
0xCCCCCCCC, 0x33333333, 0xAAAAAAAA, 0x55555555, 0xCCCCCCCC,
844
0x33333333, 0xAAAAAAAA, 0x55555555, 0xCCCCCCCC, 0x33333333,
845
0xAAAAAAAA, 0x55555555, 0xCCCCCCCC, 0x33333333, 0xAAAAAAAA,
846
0x55555555, 0xCCCCCCCC, 0x33333333, 0xAAAAAAAA, 0x55555555,
847
0xCCCCCCCC, 0x33333333, 0xAAAAAAAA, 0x55555555, 0xCCCCCCCC,
848
0x33333333, 0xAAAAAAAA, 0x55555555, 0xCCCCCCCC, 0x33333333,
849
0xAAAAAAAA, 0x55555555, 0xCCCCCCCC, 0x33333333, 0xAAAAAAAA,
850
0x55555555, 0xCCCCCCCC, 0x33333333, 0xAAAAAAAA, 0x55555555,
851
0xCCCCCCCC, 0x33333333, 0xAAAAAAAA, 0x55555555, 0xCCCCCCCC,
852
0x33333333, 0xAAAAAAAA, 0x55555555, 0xCCCCCCCC, 0x33333333,
853
0xAAAAAAAA, 0x55555555, 0xCCCCCCCC, 0x33333333, 0xAAAAAAAA,
854
0x55555555, 0xCCCCCCCC, 0x33333333, 0xAAAAAAAA, 0x55555555,
855
0xCCCCCCCC, 0x33333333, 0xAAAAAAAA, 0x55555555, 0xCCCCCCCC,
856
0x33333333, 0xAAAAAAAA, 0x55555555, 0xCCCCCCCC, 0x33333333,
857
0xAAAAAAAA, 0x55555555, 0xCCCCCCCC, 0x33333333, 0xAAAAAAAA,
858
0x55555555, 0xCCCCCCCC, 0x33333333, 0xAAAAAAAA, 0x55555555,
859
0xCCCCCCCC, 0x33333333, 0xAAAAAAAA, 0x55555555, 0xCCCCCCCC,
860
0x33333333, 0xAAAAAAAA, 0x55555555, 0xCCCCCCCC, 0x33333333,
861
0xAAAAAAAA, 0x55555555, 0xCCCCCCCC, 0x33333333, 0xAAAAAAAA,
862
0x55555555, 0xCCCCCCCC, 0x33333333, 0xAAAAAAAA, 0x55555555,
863
0xCCCCCCCC, 0x33333333, 0xAAAAAAAA, 0x55555555, 0xCCCCCCCC,
864
0x33333333, 0xAAAAAAAA, 0x55555555, 0xCCCCCCCC, 0x33333333,
865
0xAAAAAAAA, 0x55555555, 0xCCCCCCCC, 0x33333333, 0xAAAAAAAA,
866
0x55555555, 0xCCCCCCCC, 0x33333333, 0xAAAAAAAA, 0x55555555,
867
0xCCCCCCCC, 0x33333333, 0xAAAAAAAA, 0x55555555, 0xCCCCCCCC,
868
0x33333333
869
};
870
871
static const u32 ram_pattern_dmi_table[0x500] = {
872
/* DMI RAM Patterns Table 0 */
873
0xF, 0xF, 0x0, 0xF, 0xF, 0x0, 0xF, 0xF,
874
0x0, 0xF, 0x0, 0xF, 0xF, 0x0, 0xF, 0xF,
875
0xF, 0xF, 0x0, 0xF, 0xF, 0x0, 0x0, 0x0,
876
0xF, 0xF, 0x0, 0xF, 0x0, 0x0, 0xF, 0x0,
877
0xF, 0xF, 0xF, 0x0, 0xF, 0xF, 0xF, 0x0,
878
0x0, 0xF, 0xF, 0x0, 0x0, 0xF, 0x0, 0xF,
879
0x0, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF,
880
0x0, 0x0, 0x0, 0x0, 0xF, 0xF, 0xF, 0x0,
881
0xF, 0xF, 0x0, 0xF, 0xF, 0x0, 0xF, 0xF,
882
0x0, 0xF, 0x0, 0xF, 0xF, 0x0, 0xF, 0xF,
883
0xF, 0xF, 0x0, 0xF, 0xF, 0x0, 0x0, 0x0,
884
0xF, 0xF, 0x0, 0xF, 0x0, 0x0, 0xF, 0x0,
885
0xF, 0xF, 0xF, 0x0, 0xF, 0xF, 0xF, 0x0,
886
0x0, 0xF, 0xF, 0x0, 0x0, 0xF, 0x0, 0xF,
887
0x0, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF,
888
0x0, 0x0, 0x0, 0x0, 0xF, 0xF, 0xF, 0x0,
889
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
890
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
891
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
892
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
893
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
894
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
895
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
896
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
897
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
898
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
899
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
900
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
901
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
902
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
903
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
904
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
905
906
/* DMI RAM Patterns Table 1 */
907
0x0, 0x0, 0xF, 0x0, 0x0, 0x0, 0x0, 0x0,
908
0xF, 0xF, 0x0, 0x0, 0x0, 0x0, 0xF, 0x0,
909
0xF, 0x0, 0x0, 0x0, 0xF, 0xF, 0xF, 0xF,
910
0x0, 0x0, 0xF, 0x0, 0x0, 0x0, 0xF, 0x0,
911
0xF, 0xF, 0x0, 0x0, 0xF, 0xF, 0xF, 0x0,
912
0xF, 0x0, 0xF, 0x0, 0x0, 0xF, 0xF, 0xF,
913
0xF, 0xF, 0x0, 0xF, 0x0, 0x0, 0x0, 0x0,
914
0xF, 0xF, 0xF, 0x0, 0x0, 0x0, 0xF, 0x0,
915
0x0, 0x0, 0xF, 0x0, 0x0, 0x0, 0x0, 0x0,
916
0xF, 0xF, 0x0, 0x0, 0x0, 0x0, 0xF, 0x0,
917
0xF, 0x0, 0x0, 0x0, 0xF, 0xF, 0xF, 0xF,
918
0x0, 0x0, 0xF, 0x0, 0x0, 0x0, 0xF, 0x0,
919
0xF, 0xF, 0x0, 0x0, 0xF, 0xF, 0xF, 0x0,
920
0xF, 0x0, 0xF, 0x0, 0x0, 0xF, 0xF, 0xF,
921
0xF, 0xF, 0x0, 0xF, 0x0, 0x0, 0x0, 0x0,
922
0xF, 0xF, 0xF, 0x0, 0x0, 0x0, 0xF, 0x0,
923
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
924
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
925
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
926
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
927
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
928
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
929
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
930
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
931
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
932
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
933
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
934
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
935
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
936
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
937
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
938
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
939
940
/* DMI RAM Patterns Table 2 */
941
0x0, 0xF, 0x0, 0xF, 0x0, 0xF, 0x0, 0xF,
942
0x0, 0xF, 0x0, 0xF, 0x0, 0xF, 0x0, 0xF,
943
0x0, 0xF, 0x0, 0xF, 0x0, 0xF, 0x0, 0xF,
944
0x0, 0xF, 0x0, 0xF, 0x0, 0xF, 0x0, 0xF,
945
0x0, 0xF, 0x0, 0xF, 0x0, 0xF, 0x0, 0xF,
946
0x0, 0xF, 0x0, 0xF, 0x0, 0xF, 0x0, 0xF,
947
0x0, 0xF, 0x0, 0xF, 0x0, 0xF, 0x0, 0xF,
948
0x0, 0xF, 0x0, 0xF, 0x0, 0xF, 0x0, 0xF,
949
0x0, 0xF, 0x0, 0xF, 0x0, 0xF, 0x0, 0xF,
950
0x0, 0xF, 0x0, 0xF, 0x0, 0xF, 0x0, 0xF,
951
0x0, 0xF, 0x0, 0xF, 0x0, 0xF, 0x0, 0xF,
952
0x0, 0xF, 0x0, 0xF, 0x0, 0xF, 0x0, 0xF,
953
0x0, 0xF, 0x0, 0xF, 0x0, 0xF, 0x0, 0xF,
954
0x0, 0xF, 0x0, 0xF, 0x0, 0xF, 0x0, 0xF,
955
0x0, 0xF, 0x0, 0xF, 0x0, 0xF, 0x0, 0xF,
956
0x0, 0xF, 0x0, 0xF, 0x0, 0xF, 0x0, 0xF,
957
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
958
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
959
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
960
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
961
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
962
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
963
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
964
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
965
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
966
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
967
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
968
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
969
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
970
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
971
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
972
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
973
974
/* DMI RAM Patterns Table 3 */
975
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
976
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
977
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
978
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
979
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
980
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
981
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
982
0xF, 0x0, 0xF, 0x0, 0xF, 0x0, 0xF, 0x0,
983
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
984
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
985
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
986
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
987
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
988
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
989
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
990
0xF, 0x0, 0xF, 0x0, 0xF, 0x0, 0xF, 0x0,
991
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
992
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
993
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
994
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
995
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
996
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
997
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
998
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
999
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
1000
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
1001
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
1002
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
1003
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
1004
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
1005
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
1006
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
1007
1008
/* DMI RAM Patterns Table 4 */
1009
0xA, 0x5, 0xC, 0x3, 0xA, 0x5, 0xC, 0x3,
1010
0xA, 0x5, 0xC, 0x3, 0xA, 0x5, 0xC, 0x3,
1011
0xA, 0x5, 0xC, 0x3, 0xA, 0x5, 0xC, 0x3,
1012
0xA, 0x5, 0xC, 0x3, 0xA, 0x5, 0xC, 0x3,
1013
0xA, 0x5, 0xC, 0x3, 0xA, 0x5, 0xC, 0x3,
1014
0xA, 0x5, 0xC, 0x3, 0xA, 0x5, 0xC, 0x3,
1015
0xA, 0x5, 0xC, 0x3, 0xA, 0x5, 0xC, 0x3,
1016
0xA, 0x5, 0xC, 0x3, 0xA, 0x5, 0xC, 0x3,
1017
0xA, 0x5, 0xC, 0x3, 0xA, 0x5, 0xC, 0x3,
1018
0xA, 0x5, 0xC, 0x3, 0xA, 0x5, 0xC, 0x3,
1019
0xA, 0x5, 0xC, 0x3, 0xA, 0x5, 0xC, 0x3,
1020
0xA, 0x5, 0xC, 0x3, 0xA, 0x5, 0xC, 0x3,
1021
0xA, 0x5, 0xC, 0x3, 0xA, 0x5, 0xC, 0x3,
1022
0xA, 0x5, 0xC, 0x3, 0xA, 0x5, 0xC, 0x3,
1023
0xA, 0x5, 0xC, 0x3, 0xA, 0x5, 0xC, 0x3,
1024
0xA, 0x5, 0xC, 0x3, 0xA, 0x5, 0xC, 0x3,
1025
0xA, 0x5, 0xC, 0x3, 0xA, 0x5, 0xC, 0x3,
1026
0xA, 0x5, 0xC, 0x3, 0xA, 0x5, 0xC, 0x3,
1027
0xA, 0x5, 0xC, 0x3, 0xA, 0x5, 0xC, 0x3,
1028
0xA, 0x5, 0xC, 0x3, 0xA, 0x5, 0xC, 0x3,
1029
0xA, 0x5, 0xC, 0x3, 0xA, 0x5, 0xC, 0x3,
1030
0xA, 0x5, 0xC, 0x3, 0xA, 0x5, 0xC, 0x3,
1031
0xA, 0x5, 0xC, 0x3, 0xA, 0x5, 0xC, 0x3,
1032
0xA, 0x5, 0xC, 0x3, 0xA, 0x5, 0xC, 0x3,
1033
0xA, 0x5, 0xC, 0x3, 0xA, 0x5, 0xC, 0x3,
1034
0xA, 0x5, 0xC, 0x3, 0xA, 0x5, 0xC, 0x3,
1035
0xA, 0x5, 0xC, 0x3, 0xA, 0x5, 0xC, 0x3,
1036
0xA, 0x5, 0xC, 0x3, 0xA, 0x5, 0xC, 0x3,
1037
0xA, 0x5, 0xC, 0x3, 0xA, 0x5, 0xC, 0x3,
1038
0xA, 0x5, 0xC, 0x3, 0xA, 0x5, 0xC, 0x3,
1039
0xA, 0x5, 0xC, 0x3, 0xA, 0x5, 0xC, 0x3,
1040
0xA, 0x5, 0xC, 0x3, 0xA, 0x5, 0xC, 0x3
1041
};
1042
1043
static void _usleep(u32 microseconds)
1044
{
1045
u32 start = TMR(0x10);
1046
while ((u32)(TMR(0x10) - start) <= microseconds)
1047
;
1048
}
1049
1050
static u32 div_o3(u32 a, u32 b)
1051
{
1052
u32 result = a / b;
1053
1054
if ((b * result) < a)
1055
return result + 1;
1056
else
1057
return result;
1058
}
1059
1060
static u32 _actual_osc_clocks(u32 in)
1061
{
1062
u32 actual_clock;
1063
1064
actual_clock = 16 * in;
1065
if (in > 63)
1066
{
1067
actual_clock = 2048;
1068
if (in > 127)
1069
{
1070
if (in >= 192)
1071
actual_clock = 8192;
1072
else
1073
actual_clock = 4096;
1074
}
1075
}
1076
1077
return actual_clock;
1078
}
1079
1080
static void _ccfifo_write(u32 addr, u32 data_val, u32 delay) //addr and delay are u16
1081
{
1082
EMC(EMC_CCFIFO_DATA) = data_val;
1083
EMC(EMC_CCFIFO_ADDR) = (addr & 0xffff) | ((delay & 0x7FFF) << 16) | (1 << 31);
1084
}
1085
1086
static bool _wait_emc_status(u32 reg_offset, u32 bit_mask, bool updated_state, u32 emc_channel)
1087
{
1088
bool err = true;
1089
1090
for (u32 i = 0; i < EMC_STATUS_UPDATE_TIMEOUT; i++)
1091
{
1092
if (emc_channel)
1093
{
1094
if (emc_channel != 1)
1095
goto done;
1096
1097
if (((EMC_CH1(reg_offset) & bit_mask) != 0) == updated_state)
1098
{
1099
err = false;
1100
break;
1101
}
1102
}
1103
else if (((EMC(reg_offset) & bit_mask) != 0) == updated_state)
1104
{
1105
err = false;
1106
break;
1107
}
1108
_usleep(1);
1109
}
1110
1111
done:
1112
return err;
1113
}
1114
1115
static void _request_mmr_data(u32 data, bool dual_channel)
1116
{
1117
EMC(EMC_MRR) = data;
1118
_wait_emc_status(EMC_EMC_STATUS, MRR_DIVLD, true, EMC_CHANNEL0);
1119
if (dual_channel)
1120
_wait_emc_status(EMC_EMC_STATUS, MRR_DIVLD, true, EMC_CHANNEL1);
1121
}
1122
1123
static void _start_periodic_compensation()
1124
{
1125
EMC(EMC_MPC) = 0x4B;
1126
(void)EMC(EMC_MPC);
1127
}
1128
1129
static bool _timing_update(u32 dual_channel)
1130
{
1131
bool err = 0;
1132
1133
EMC(EMC_TIMING_CONTROL) = 1;
1134
err = _wait_emc_status(EMC_EMC_STATUS, TIMING_UPDATE_STALLED, false, EMC_CHANNEL0);
1135
if (dual_channel)
1136
err |= _wait_emc_status(EMC_EMC_STATUS, TIMING_UPDATE_STALLED, false, EMC_CHANNEL1);
1137
1138
return err;
1139
}
1140
1141
static u32 _get_dram_temperature()
1142
{
1143
u32 mr4_0 = 0;
1144
u32 mr4_1 = 0;
1145
1146
bool channel1_enabled = (EMC(EMC_FBIO_CFG7) >> 2) & 1;
1147
u32 emc_cfg_o = EMC(EMC_CFG);
1148
1149
_wait_emc_status(EMC_EMC_STATUS, MRR_DIVLD, false, EMC_CHANNEL0);
1150
1151
if (emc_cfg_o & 0x20000000)
1152
{
1153
EMC(EMC_CFG) = emc_cfg_o & 0xDFFFFFFF;
1154
_timing_update(channel1_enabled);
1155
}
1156
1157
_request_mmr_data(0x80040000, EMC_CHANNEL0);
1158
mr4_0 = EMC(EMC_MRR) & 0xFFFF;
1159
1160
if (mr4_0 < 0xF001)
1161
mr4_0 &= 0x7;
1162
else
1163
{
1164
mr4_0 = -1;
1165
goto out;
1166
}
1167
1168
if (channel1_enabled)
1169
{
1170
_request_mmr_data(0x40040000, EMC_CHANNEL1);
1171
mr4_1 = EMC(EMC_MRR) & 0xFFFF;
1172
1173
if (mr4_1 < 0xF001)
1174
mr4_1 &= 0x7;
1175
else
1176
goto out;
1177
1178
if (mr4_1 > mr4_0)
1179
mr4_0 = mr4_1;
1180
}
1181
1182
out:
1183
if (emc_cfg_o & 0x20000000)
1184
{
1185
EMC(EMC_CFG) = emc_cfg_o;
1186
_timing_update(channel1_enabled);
1187
}
1188
1189
return mr4_0;
1190
}
1191
1192
static u32 _pllm_clk_base_cfg(u32 rate_KHz, u32 clk_src_emc, bool new_src_is_PLLMB)
1193
{
1194
u32 dividers = 0;
1195
u32 i = 0;
1196
u32 pll_ref = 38400; // Only 38.4MHz crystal is supported for T210.
1197
1198
pllm_clk_config_t *pllm_clk_config = NULL;
1199
1200
for (i = 0; pllm_clk_config_table[i].pll_osc_in; i++)
1201
{
1202
if (pllm_clk_config_table[i].pll_osc_in == pll_ref && (pllm_clk_config_table[i].pll_out - 19200) <= rate_KHz)
1203
pllm_clk_config = &pllm_clk_config_table[i];
1204
}
1205
1206
if (pllm_clk_config && pllm_clk_config->pll_osc_in)
1207
{
1208
dividers = pllm_clk_config->pll_input_div | (pllm_clk_config->pll_feedback_div << 8) | ((pllm_clk_config->pll_post_div & 0x1F) << 20);
1209
if (new_src_is_PLLMB)
1210
{
1211
CLOCK(CLK_RST_CONTROLLER_PLLMB_BASE) = dividers;
1212
CLOCK(CLK_RST_CONTROLLER_PLLMB_BASE) |= PLLM_ENABLE;
1213
1214
if ((clk_src_emc >> EMC_2X_CLK_SRC_SHIFT) == PLLM_UD)
1215
clk_src_emc = (clk_src_emc & 0x1FFFFFFF) | (PLLMB_UD << EMC_2X_CLK_SRC_SHIFT);
1216
else if (!(clk_src_emc >> EMC_2X_CLK_SRC_SHIFT))
1217
clk_src_emc |= (PLLMB_OUT0 << EMC_2X_CLK_SRC_SHIFT);
1218
1219
while (!(CLOCK(CLK_RST_CONTROLLER_PLLMB_BASE) & PLLM_LOCK))
1220
;
1221
}
1222
else
1223
{
1224
CLOCK(CLK_RST_CONTROLLER_PLLM_BASE) = dividers;
1225
CLOCK(CLK_RST_CONTROLLER_PLLM_MISC2) |= PLLM_EN_LCKDET;
1226
CLOCK(CLK_RST_CONTROLLER_PLLM_BASE) |= PLLM_ENABLE;
1227
1228
if ((clk_src_emc >> EMC_2X_CLK_SRC_SHIFT) == PLLM_UD)
1229
clk_src_emc = (clk_src_emc & 0x1FFFFFFF) | (PLLM_UD << EMC_2X_CLK_SRC_SHIFT);
1230
while (!(CLOCK(CLK_RST_CONTROLLER_PLLM_BASE) & PLLM_LOCK))
1231
;
1232
}
1233
}
1234
return clk_src_emc;
1235
}
1236
1237
static void _change_dll_src(emc_table_t *mtc_table_entry, u32 clk_src_emc)
1238
{
1239
u32 emc_2x_clk_src = clk_src_emc >> EMC_2X_CLK_SRC_SHIFT;
1240
1241
u32 dll_setting = ((((mtc_table_entry->dll_clk_src & 0x1FFFFFFF)
1242
| (emc_2x_clk_src << EMC_2X_CLK_SRC_SHIFT)) & 0xFFFFFF00)
1243
| (clk_src_emc & 0xFF)) & 0xFFFFF3FF;
1244
1245
if (emc_2x_clk_src == PLLMB_UD)
1246
dll_setting |= EMC_DLL_PLLM_VCOB;
1247
else if (emc_2x_clk_src != PLLM_UD)
1248
dll_setting |= EMC_DLL_SWITCH_OUT;
1249
1250
CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_EMC_DLL) = dll_setting;
1251
1252
// Commit clock write.
1253
(void)CLOCK(CLK_RST_CONTROLLER_CLK_OUT_ENB_X);
1254
_usleep(2);
1255
1256
// Enable/Disable EMC DLL.
1257
if (mtc_table_entry->clk_out_enb_x_0_clk_enb_emc_dll)
1258
CLOCK(CLK_RST_CONTROLLER_CLK_ENB_X_SET) = (1 << 14);
1259
else
1260
CLOCK(CLK_RST_CONTROLLER_CLK_ENB_X_CLR) = (1 << 14);
1261
1262
// Commit clock write.
1263
(void)CLOCK(CLK_RST_CONTROLLER_CLK_OUT_ENB_X);
1264
_usleep(2);
1265
}
1266
1267
static u32 _digital_dll_prelock(emc_table_t *mtc_table_entry, u32 needs_tristate_training, u32 selected_clk_src_emc)
1268
{
1269
u32 dual_channel = (EMC(EMC_FBIO_CFG7) >> 1) & ((EMC(EMC_FBIO_CFG7) >> 2) & 1);
1270
1271
EMC(EMC_CFG_DIG_DLL) = (EMC(EMC_CFG_DIG_DLL) & 0xFFFFF824) | 0x3C8;
1272
1273
_timing_update(dual_channel);
1274
1275
while (EMC(EMC_CFG_DIG_DLL) & 1)
1276
;
1277
if (dual_channel)
1278
while (EMC_CH1(EMC_CFG_DIG_DLL) & 1)
1279
;
1280
1281
EMC(EMC_DLL_CFG_0) = mtc_table_entry->burst_regs.emc_dll_cfg_0;
1282
EMC(EMC_DLL_CFG_1) = mtc_table_entry->burst_regs.emc_dll_cfg_1;
1283
1284
_change_dll_src(mtc_table_entry, selected_clk_src_emc);
1285
1286
EMC(EMC_CFG_DIG_DLL) |= 1;
1287
1288
_timing_update(dual_channel);
1289
1290
while (!(EMC(EMC_CFG_DIG_DLL) & 1))
1291
;
1292
if (dual_channel)
1293
while (!(EMC_CH1(EMC_CFG_DIG_DLL) & 1))
1294
;
1295
1296
while ((((EMC(EMC_DIG_DLL_STATUS) >> 17) & 1) ^ 1) | (((EMC(EMC_DIG_DLL_STATUS) >> 15) & 1) ^ 1))
1297
;
1298
1299
if (needs_tristate_training)
1300
{
1301
EMC(EMC_DBG) |= 2u;
1302
EMC(EMC_CFG_DIG_DLL) &= 0xFFFFFFFE; //Disable CFG_DLL_EN: [PMC] Enable digital DLL.
1303
EMC(EMC_DBG) &= 0xFFFFFFFD;
1304
1305
while (EMC(EMC_CFG_DIG_DLL) & 1)
1306
;
1307
if (dual_channel)
1308
while (EMC_CH1(EMC_CFG_DIG_DLL) & 1)
1309
;
1310
}
1311
1312
return EMC(EMC_DIG_DLL_STATUS) & 0x7FF;
1313
}
1314
1315
static void _digital_dll_disable()
1316
{
1317
bool dual_channel = (EMC(EMC_FBIO_CFG7) >> 1) & ((EMC(EMC_FBIO_CFG7) >> 2) & 1);
1318
1319
EMC(EMC_CFG_DIG_DLL) &= 0xFFFFFFFE;
1320
1321
_timing_update(dual_channel);
1322
1323
while (EMC(EMC_CFG_DIG_DLL) & 1)
1324
;
1325
if (dual_channel)
1326
while (EMC_CH1(EMC_CFG_DIG_DLL) & 1)
1327
;
1328
}
1329
1330
static void _digital_dll_enable_rs(u32 channel1_enabled)
1331
{
1332
EMC(EMC_CFG_DIG_DLL) = (EMC(EMC_CFG_DIG_DLL) & 0xFFFFFF24) | 0x89;
1333
1334
_timing_update(channel1_enabled);
1335
1336
while (!(EMC(EMC_CFG_DIG_DLL) & 1))
1337
;
1338
if (channel1_enabled)
1339
while (!(EMC_CH1(EMC_CFG_DIG_DLL) & 1))
1340
;
1341
}
1342
1343
static u32 _dvfs_power_ramp_down(bool flip_backward, emc_table_t *src_emc_table_entry, emc_table_t *dst_emc_table_entry, u32 src_clock_period)
1344
{
1345
u32 pmacro_cmd_pad;
1346
u32 pmacro_rfu1;
1347
u32 pmacro_cfg5;
1348
u32 pmacro_common_tx;
1349
u32 pmacro_dq_pad;
1350
1351
u32 src_clk_per_pc = (100000 / src_clock_period) + 1;
1352
1353
if (flip_backward)
1354
{
1355
pmacro_cmd_pad = dst_emc_table_entry->burst_regs.emc_pmacro_cmd_pad_tx_ctrl;
1356
pmacro_dq_pad = dst_emc_table_entry->burst_regs.emc_pmacro_data_pad_tx_ctrl;
1357
pmacro_rfu1 = dst_emc_table_entry->burst_regs.emc_pmacro_brick_ctrl_rfu1;
1358
pmacro_cfg5 = dst_emc_table_entry->burst_regs.emc_fbio_cfg5;
1359
pmacro_common_tx = dst_emc_table_entry->burst_regs.emc_pmacro_common_pad_tx_ctrl;
1360
}
1361
else
1362
{
1363
pmacro_cmd_pad = src_emc_table_entry->burst_regs.emc_pmacro_cmd_pad_tx_ctrl;
1364
pmacro_dq_pad = (dst_emc_table_entry->burst_regs.emc_pmacro_data_pad_tx_ctrl & 0x101) | src_emc_table_entry->burst_regs.emc_pmacro_data_pad_tx_ctrl;
1365
pmacro_rfu1 = src_emc_table_entry->burst_regs.emc_pmacro_brick_ctrl_rfu1;
1366
pmacro_cfg5 = src_emc_table_entry->burst_regs.emc_fbio_cfg5;
1367
pmacro_common_tx = src_emc_table_entry->burst_regs.emc_pmacro_common_pad_tx_ctrl;
1368
}
1369
1370
u32 pmacro_cmd_pad_drvforceon = pmacro_cmd_pad | 0x4000000;
1371
1372
u32 ramp_down_wait = src_clock_period * 12;
1373
1374
_ccfifo_write(EMC_PMACRO_CMD_PAD_TX_CTRL, pmacro_cmd_pad_drvforceon, 0);
1375
_ccfifo_write(EMC_FBIO_CFG5, pmacro_cfg5 | 0x100, 12);
1376
1377
if (src_clock_period >= 1000) // Dvfs high speed threshold.
1378
{
1379
_ccfifo_write(EMC_PMACRO_BRICK_CTRL_RFU1, pmacro_rfu1 & 0xF800F800, (u32)(src_clk_per_pc + 19));
1380
ramp_down_wait += 100000 + (src_clock_period * 20);
1381
}
1382
else
1383
{
1384
if (src_clock_period >= 416) // Iobrick dcc threshold.
1385
_ccfifo_write(EMC_PMACRO_BRICK_CTRL_RFU1, pmacro_rfu1 & 0xFEEDFEED, (u32)src_clk_per_pc);
1386
else
1387
{
1388
pmacro_dq_pad = (pmacro_dq_pad & 0xFEFEFDFD) | 0x10200;
1389
pmacro_cmd_pad_drvforceon = (pmacro_cmd_pad & 0xFAFEFDFD) | 0x4010200;
1390
_ccfifo_write(EMC_PMACRO_CMD_PAD_TX_CTRL, pmacro_cmd_pad_drvforceon, (u32)src_clk_per_pc);
1391
_ccfifo_write(EMC_PMACRO_DATA_PAD_TX_CTRL, pmacro_dq_pad, 0);
1392
_ccfifo_write(EMC_PMACRO_BRICK_CTRL_RFU1, pmacro_rfu1 & 0xFEEDFEED, 0);
1393
}
1394
ramp_down_wait += 300000;
1395
_ccfifo_write(EMC_PMACRO_BRICK_CTRL_RFU1, pmacro_rfu1 & 0xFE40FE40, (u32)src_clk_per_pc);
1396
1397
if (src_clock_period >= 416) // Iobrick dcc threshold.
1398
_ccfifo_write(EMC_PMACRO_BRICK_CTRL_RFU1, pmacro_rfu1 & 0xF800F800, (u32)src_clk_per_pc);
1399
else
1400
{
1401
_ccfifo_write(EMC_PMACRO_CMD_PAD_TX_CTRL, pmacro_cmd_pad_drvforceon & 0xFEFEFDFD, (u32)src_clk_per_pc);
1402
_ccfifo_write(EMC_PMACRO_DATA_PAD_TX_CTRL, pmacro_dq_pad & 0xFEFEFDFD, 0);
1403
_ccfifo_write(EMC_PMACRO_BRICK_CTRL_RFU1, pmacro_rfu1 & 0xF800F800, 0);
1404
}
1405
}
1406
1407
if (src_clock_period >= 1666) // Dvfs mid speed threshold.
1408
_ccfifo_write(EMC_PMACRO_COMMON_PAD_TX_CTRL, pmacro_common_tx & 0xFFFFFFF0, (u32)src_clk_per_pc);
1409
else
1410
{
1411
ramp_down_wait += 400000;
1412
_ccfifo_write(EMC_PMACRO_COMMON_PAD_TX_CTRL, pmacro_common_tx & 0xFFFFFFFA, (u32)src_clk_per_pc);
1413
_ccfifo_write(EMC_PMACRO_COMMON_PAD_TX_CTRL, pmacro_common_tx & 0xFFFFFFF0, (u32)src_clk_per_pc);
1414
_ccfifo_write(EMC_INTSTATUS, 0, (u32)src_clk_per_pc);
1415
}
1416
1417
return ramp_down_wait;
1418
}
1419
1420
static u32 _dvfs_power_ramp_up(bool flip_backward, emc_table_t *src_emc_table_entry, emc_table_t *dst_emc_table_entry, u32 needs_training, u32 dst_clock_period)
1421
{
1422
u32 pmacro_cmd_pad;
1423
u32 pmacro_dq_pad;
1424
u32 pmacro_rfu1;
1425
u32 pmacro_cfg5;
1426
u32 pmacro_common_tx;
1427
u32 pmacro_cmd_pad_data;
1428
u32 ramp_up_wait = 0;
1429
1430
u32 dst_clk_per_pc = (100000 / dst_clock_period) + 1;
1431
1432
if (flip_backward)
1433
{
1434
pmacro_cmd_pad = src_emc_table_entry->burst_regs.emc_pmacro_cmd_pad_tx_ctrl;
1435
pmacro_dq_pad = src_emc_table_entry->burst_regs.emc_pmacro_data_pad_tx_ctrl;
1436
pmacro_rfu1 = src_emc_table_entry->burst_regs.emc_pmacro_brick_ctrl_rfu1;
1437
pmacro_cfg5 = src_emc_table_entry->burst_regs.emc_fbio_cfg5;
1438
pmacro_common_tx = src_emc_table_entry->burst_regs.emc_pmacro_common_pad_tx_ctrl;
1439
}
1440
else if (needs_training & NEEDS_TRAINING_CA_COMBO)
1441
{
1442
pmacro_cmd_pad = dst_emc_table_entry->shadow_regs_ca_train.emc_pmacro_cmd_pad_tx_ctrl;
1443
pmacro_dq_pad = dst_emc_table_entry->shadow_regs_ca_train.emc_pmacro_data_pad_tx_ctrl;
1444
pmacro_rfu1 = dst_emc_table_entry->shadow_regs_ca_train.emc_pmacro_brick_ctrl_rfu1;
1445
pmacro_cfg5 = dst_emc_table_entry->shadow_regs_ca_train.emc_fbio_cfg5;
1446
pmacro_common_tx = dst_emc_table_entry->shadow_regs_ca_train.emc_pmacro_common_pad_tx_ctrl;
1447
}
1448
else if (needs_training & NEEDS_TRAINING_QUSE_COMBO)
1449
{
1450
pmacro_cmd_pad = dst_emc_table_entry->shadow_regs_quse_train.emc_pmacro_cmd_pad_tx_ctrl;
1451
pmacro_dq_pad = dst_emc_table_entry->shadow_regs_quse_train.emc_pmacro_data_pad_tx_ctrl;
1452
pmacro_rfu1 = dst_emc_table_entry->shadow_regs_quse_train.emc_pmacro_brick_ctrl_rfu1;
1453
pmacro_cfg5 = dst_emc_table_entry->shadow_regs_quse_train.emc_fbio_cfg5;
1454
pmacro_common_tx = dst_emc_table_entry->shadow_regs_quse_train.emc_pmacro_common_pad_tx_ctrl;
1455
}
1456
else if (needs_training & (NEEDS_TRAINING_WR_COMBO | NEEDS_TRAINING_RD_COMBO))
1457
{
1458
pmacro_cmd_pad = dst_emc_table_entry->shadow_regs_rdwr_train.emc_pmacro_cmd_pad_tx_ctrl;
1459
pmacro_dq_pad = dst_emc_table_entry->shadow_regs_rdwr_train.emc_pmacro_data_pad_tx_ctrl;
1460
pmacro_rfu1 = dst_emc_table_entry->shadow_regs_rdwr_train.emc_pmacro_brick_ctrl_rfu1;
1461
pmacro_cfg5 = dst_emc_table_entry->shadow_regs_rdwr_train.emc_fbio_cfg5;
1462
pmacro_common_tx = dst_emc_table_entry->shadow_regs_rdwr_train.emc_pmacro_common_pad_tx_ctrl;
1463
}
1464
else
1465
{
1466
pmacro_cmd_pad = dst_emc_table_entry->burst_regs.emc_pmacro_cmd_pad_tx_ctrl;
1467
pmacro_dq_pad = dst_emc_table_entry->burst_regs.emc_pmacro_data_pad_tx_ctrl;
1468
pmacro_rfu1 = dst_emc_table_entry->burst_regs.emc_pmacro_brick_ctrl_rfu1;
1469
pmacro_cfg5 = dst_emc_table_entry->burst_regs.emc_fbio_cfg5;
1470
pmacro_common_tx = dst_emc_table_entry->burst_regs.emc_pmacro_common_pad_tx_ctrl;
1471
}
1472
1473
pmacro_cmd_pad_data = (pmacro_cmd_pad & 0xFAFEFDFD) | 0x4000000;
1474
1475
if (dst_clock_period >= 1666) // Dvfs mid speed threshold.
1476
{
1477
_ccfifo_write(EMC_PMACRO_COMMON_PAD_TX_CTRL, pmacro_common_tx | 8, 0);
1478
1479
_ccfifo_write(EMC_PMACRO_BRICK_CTRL_RFU1, pmacro_rfu1 | 0x600, 0);
1480
_ccfifo_write(EMC_FBIO_CFG5, pmacro_cfg5 & 0xFFFFFEFF, 12);
1481
1482
ramp_up_wait = (dst_clock_period * 12) + 0;
1483
}
1484
else
1485
{
1486
_ccfifo_write(EMC_PMACRO_COMMON_PAD_TX_CTRL, pmacro_common_tx & 0xA, 0);
1487
_ccfifo_write(EMC_PMACRO_COMMON_PAD_TX_CTRL, pmacro_common_tx & 0xF, dst_clk_per_pc);
1488
1489
if (dst_clock_period < 1000) // Dvfs high speed threshold.
1490
{
1491
if (dst_clock_period >= 416) // Iobrick dcc threshold.
1492
_ccfifo_write(EMC_PMACRO_BRICK_CTRL_RFU1, pmacro_rfu1 & 0xFE40FE40, dst_clk_per_pc);
1493
else
1494
{
1495
_ccfifo_write(EMC_PMACRO_CMD_PAD_TX_CTRL, (pmacro_cmd_pad & 0xFAFEFDFD) | 0x4010200, dst_clk_per_pc);
1496
_ccfifo_write(EMC_PMACRO_DATA_PAD_TX_CTRL, (pmacro_dq_pad & 0xFEFEFDFD) | 0x10200, 0);
1497
_ccfifo_write(EMC_PMACRO_BRICK_CTRL_RFU1, pmacro_rfu1 & 0xFE40FE40, 0);
1498
}
1499
1500
_ccfifo_write(EMC_PMACRO_BRICK_CTRL_RFU1, pmacro_rfu1 & 0xFEEDFEED, dst_clk_per_pc);
1501
1502
if (dst_clock_period >= 416) // Iobrick dcc threshold.
1503
_ccfifo_write(EMC_PMACRO_BRICK_CTRL_RFU1, pmacro_rfu1, dst_clk_per_pc);
1504
else
1505
{
1506
pmacro_cmd_pad_data = pmacro_cmd_pad | 0x5010202;
1507
_ccfifo_write(EMC_PMACRO_CMD_PAD_TX_CTRL, pmacro_cmd_pad_data, dst_clk_per_pc);
1508
_ccfifo_write(EMC_PMACRO_DATA_PAD_TX_CTRL, pmacro_dq_pad | 0x1010202, 0);
1509
_ccfifo_write(EMC_PMACRO_BRICK_CTRL_RFU1, pmacro_rfu1, 0);
1510
}
1511
1512
ramp_up_wait = 500000 + (dst_clock_period * 10);
1513
}
1514
else // 1000 > dst_clock_period < 1666.
1515
{
1516
_ccfifo_write(EMC_PMACRO_BRICK_CTRL_RFU1, pmacro_rfu1 | 0x6000600, dst_clk_per_pc);
1517
1518
ramp_up_wait = 200000 + (dst_clock_period * 10);
1519
}
1520
1521
_ccfifo_write(EMC_FBIO_CFG5, pmacro_cfg5 & 0xFFFFFEFF, dst_clk_per_pc + 9);
1522
}
1523
1524
_ccfifo_write(EMC_PMACRO_CMD_PAD_TX_CTRL, pmacro_cmd_pad_data & 0xFBFFFFFF, 5);
1525
1526
return ramp_up_wait;
1527
}
1528
1529
static u32 _minerva_update_clock_tree_delay(emc_table_t *src_emc_entry, emc_table_t *dst_emc_entry, u32 dram_dev_num, u32 channel1_enabled, enum tree_update_mode_t update_type)
1530
{
1531
u32 cval = 0;
1532
u32 adelta = 0;
1533
s32 tdelta = 0;
1534
1535
u32 temp_ch0_0 = 0;
1536
u32 temp_ch0_1 = 0;
1537
u32 temp_ch1_0 = 0;
1538
u32 temp_ch1_1 = 0;
1539
1540
u32 upd_type_bits = 1 << update_type;
1541
u32 dst_rate_mhz = dst_emc_entry->rate_khz / 1000;
1542
u32 src_rate_mhz = src_emc_entry->rate_khz / 1000;
1543
1544
u32 tval = 1000000 * _actual_osc_clocks(src_emc_entry->run_clocks) / 2;
1545
1546
if (update_type > PERIODIC_TRAINING_UPDATE)
1547
return 0;
1548
1549
if (upd_type_bits & 0x5400)
1550
{
1551
_request_mmr_data(0x80130000, channel1_enabled); // Dev0 MRR 19.
1552
u32 mrr = EMC(EMC_MRR);
1553
temp_ch0_0 = (mrr & 0xFF) << 8;
1554
temp_ch0_1 = mrr & 0xFF00;
1555
if (channel1_enabled)
1556
{
1557
mrr = EMC_CH1(EMC_MRR);
1558
temp_ch1_0 = (mrr & 0xFF) << 8;
1559
temp_ch1_1 = mrr & 0xFF00;
1560
}
1561
1562
_request_mmr_data(0x80120000, channel1_enabled); // Dev0 MRR 18.
1563
mrr = EMC(EMC_MRR);
1564
temp_ch0_0 |= mrr & 0xFF;
1565
temp_ch0_1 |= (mrr & 0xFF00) >> 8;
1566
if (channel1_enabled)
1567
{
1568
mrr = EMC_CH1(EMC_MRR);
1569
temp_ch1_0 |= mrr & 0xFF;
1570
temp_ch1_1 |= (mrr & 0xFF00) >> 8;
1571
}
1572
}
1573
1574
cval = tval / (src_rate_mhz * temp_ch0_0);
1575
switch (update_type)
1576
{
1577
case DVFS_PT1:
1578
case TRAINING_PT1:
1579
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d0u0 += 100 * cval;
1580
if (update_type > PERIODIC_TRAINING_UPDATE || !(upd_type_bits & 0x6800))
1581
goto calc_td0_0;
1582
break;
1583
case DVFS_UPDATE:
1584
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d0u0 =
1585
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d0u0 / dst_emc_entry->ptfv_list.ptfv_dvfs_samples;
1586
break;
1587
case TRAINING_UPDATE:
1588
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d0u0 =
1589
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d0u0 / dst_emc_entry->ptfv_list.ptfv_write_samples;
1590
break;
1591
case PERIODIC_TRAINING_UPDATE:
1592
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d0u0 =
1593
(100 * cval + dst_emc_entry->ptfv_list.ptfv_movavg_weight * dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d0u0)
1594
/ (dst_emc_entry->ptfv_list.ptfv_movavg_weight + 1);
1595
break;
1596
default:
1597
if (update_type > PERIODIC_TRAINING_UPDATE || !(upd_type_bits & 0x6800))
1598
goto calc_td0_0;
1599
break;
1600
}
1601
1602
tdelta = dst_emc_entry->current_dram_clktree_c0d0u0 - (dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d0u0 / 100);
1603
if (tdelta < 0)
1604
tdelta *= -1;
1605
adelta = tdelta;
1606
if (update_type == TRAINING_UPDATE || ((dst_rate_mhz * tdelta * 128) / 1000000) > dst_emc_entry->tree_margin)
1607
dst_emc_entry->current_dram_clktree_c0d0u0 = dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d0u0 / 100;
1608
1609
calc_td0_0:
1610
cval = tval / (src_rate_mhz * temp_ch0_1);
1611
switch (update_type)
1612
{
1613
case DVFS_PT1:
1614
case TRAINING_PT1:
1615
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d0u1 += 100 * cval;
1616
if (update_type > PERIODIC_TRAINING_UPDATE || !(upd_type_bits & 0x6800))
1617
goto calc_td1_0;
1618
break;
1619
case DVFS_UPDATE:
1620
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d0u1 =
1621
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d0u1 / dst_emc_entry->ptfv_list.ptfv_dvfs_samples;
1622
break;
1623
case TRAINING_UPDATE:
1624
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d0u1 =
1625
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d0u1 / dst_emc_entry->ptfv_list.ptfv_write_samples;
1626
break;
1627
case PERIODIC_TRAINING_UPDATE:
1628
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d0u1 =
1629
(100 * cval + dst_emc_entry->ptfv_list.ptfv_movavg_weight * dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d0u1)
1630
/ (dst_emc_entry->ptfv_list.ptfv_movavg_weight + 1);
1631
break;
1632
default:
1633
if (update_type > PERIODIC_TRAINING_UPDATE || !(upd_type_bits & 0x6800))
1634
goto calc_td1_0;
1635
break;
1636
}
1637
1638
tdelta = dst_emc_entry->current_dram_clktree_c0d0u1 - (dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d0u1 / 100);
1639
if (tdelta < 0)
1640
tdelta *= -1;
1641
if ((u32)tdelta > adelta)
1642
adelta = tdelta;
1643
if (update_type == TRAINING_UPDATE || ((dst_rate_mhz * tdelta * 128) / 1000000) > dst_emc_entry->tree_margin)
1644
dst_emc_entry->current_dram_clktree_c0d0u1 = dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d0u1 / 100;
1645
1646
calc_td1_0:
1647
if (channel1_enabled)
1648
{
1649
cval = tval / (src_rate_mhz * temp_ch1_0);
1650
switch (update_type)
1651
{
1652
case DVFS_PT1:
1653
case TRAINING_PT1:
1654
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d0u0 += 100 * cval;
1655
if (update_type > PERIODIC_TRAINING_UPDATE || !(upd_type_bits & 0x6800))
1656
goto calc_td1_1;
1657
break;
1658
case DVFS_UPDATE:
1659
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d0u0 =
1660
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d0u0 / dst_emc_entry->ptfv_list.ptfv_dvfs_samples;
1661
break;
1662
case TRAINING_UPDATE:
1663
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d0u0 =
1664
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d0u0 / dst_emc_entry->ptfv_list.ptfv_write_samples;
1665
break;
1666
case PERIODIC_TRAINING_UPDATE:
1667
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d0u0 =
1668
(100 * cval + dst_emc_entry->ptfv_list.ptfv_movavg_weight * dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d0u0)
1669
/ (dst_emc_entry->ptfv_list.ptfv_movavg_weight + 1);
1670
break;
1671
default:
1672
if (update_type > PERIODIC_TRAINING_UPDATE || !(upd_type_bits & 0x6800))
1673
goto calc_td1_1;
1674
break;
1675
}
1676
1677
tdelta = dst_emc_entry->current_dram_clktree_c1d0u0 - (dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d0u0 / 100);
1678
if (tdelta < 0)
1679
tdelta *= -1;
1680
if ((u32)tdelta > adelta)
1681
adelta = tdelta;
1682
if (update_type == TRAINING_UPDATE || ((dst_rate_mhz * tdelta * 128) / 1000000) > dst_emc_entry->tree_margin)
1683
dst_emc_entry->current_dram_clktree_c1d0u0 = dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d0u0 / 100;
1684
1685
calc_td1_1:
1686
cval = tval / (src_rate_mhz * temp_ch1_1);
1687
switch (update_type)
1688
{
1689
case DVFS_PT1:
1690
case TRAINING_PT1:
1691
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d0u1 += 100 * cval;
1692
if (update_type > PERIODIC_TRAINING_UPDATE || !(upd_type_bits & 0x6800))
1693
goto calc_dev2;
1694
break;
1695
case DVFS_UPDATE:
1696
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d0u1 =
1697
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d0u1 / dst_emc_entry->ptfv_list.ptfv_dvfs_samples;
1698
break;
1699
case TRAINING_UPDATE:
1700
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d0u1 =
1701
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d0u1 / dst_emc_entry->ptfv_list.ptfv_write_samples;
1702
break;
1703
case PERIODIC_TRAINING_UPDATE:
1704
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d0u1 =
1705
(100 * cval + dst_emc_entry->ptfv_list.ptfv_movavg_weight * dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d0u1)
1706
/ (dst_emc_entry->ptfv_list.ptfv_movavg_weight + 1);
1707
break;
1708
default:
1709
if (update_type > PERIODIC_TRAINING_UPDATE || !(upd_type_bits & 0x6800))
1710
goto calc_dev2;
1711
break;
1712
}
1713
1714
tdelta = dst_emc_entry->current_dram_clktree_c1d0u1 - (dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d0u1 / 100);
1715
if (tdelta < 0)
1716
tdelta *= -1;
1717
if ((u32)tdelta > adelta)
1718
adelta = tdelta;
1719
if (update_type == TRAINING_UPDATE || ((dst_rate_mhz * tdelta * 128) / 1000000) > dst_emc_entry->tree_margin)
1720
dst_emc_entry->current_dram_clktree_c1d0u1 = dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d0u1 / 100;
1721
}
1722
1723
calc_dev2:
1724
if (dram_dev_num != TWO_RANK)
1725
goto out;
1726
1727
if (update_type <= PERIODIC_TRAINING_UPDATE && upd_type_bits & 0x5400)
1728
{
1729
_request_mmr_data(0x40130000, channel1_enabled); // Dev1 MRR 19.
1730
u32 mrr = EMC(EMC_MRR);
1731
temp_ch0_0 = (mrr& 0xFF) << 8;
1732
temp_ch0_1 = mrr & 0xFF00;
1733
if (channel1_enabled)
1734
{
1735
mrr = EMC_CH1(EMC_MRR);
1736
temp_ch1_0 = (mrr & 0xFF) << 8;
1737
temp_ch1_1 = mrr & 0xFF00;
1738
}
1739
1740
_request_mmr_data(0x40120000, channel1_enabled); // Dev1 MRR 18
1741
mrr = EMC(EMC_MRR);
1742
temp_ch0_0 |= mrr & 0xFF;
1743
temp_ch0_1 |= ((mrr & 0xFF00) >> 8);
1744
if (channel1_enabled)
1745
{
1746
mrr = EMC_CH1(EMC_MRR);
1747
temp_ch1_0 |= mrr & 0xFF;
1748
temp_ch1_1 |= (mrr & 0xFF00) >> 8;
1749
}
1750
}
1751
1752
cval = tval / (src_rate_mhz * temp_ch0_0);
1753
switch (update_type )
1754
{
1755
case DVFS_PT1:
1756
case TRAINING_PT1:
1757
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d1u0 += 100 * cval;
1758
if (update_type > PERIODIC_TRAINING_UPDATE || !(upd_type_bits & 0x6800))
1759
goto calc_tmp_td0_1;
1760
break;
1761
case DVFS_UPDATE:
1762
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d1u0 =
1763
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d1u0 / dst_emc_entry->ptfv_list.ptfv_dvfs_samples;
1764
break;
1765
case TRAINING_UPDATE:
1766
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d1u0 =
1767
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d1u0 / dst_emc_entry->ptfv_list.ptfv_write_samples;
1768
break;
1769
case PERIODIC_TRAINING_UPDATE:
1770
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d1u0 =
1771
(100 * cval + dst_emc_entry->ptfv_list.ptfv_movavg_weight * dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d1u0)
1772
/ (dst_emc_entry->ptfv_list.ptfv_movavg_weight + 1);
1773
break;
1774
default:
1775
if (update_type > PERIODIC_TRAINING_UPDATE || !(upd_type_bits & 0x6800))
1776
goto calc_tmp_td0_1;
1777
break;
1778
}
1779
1780
tdelta = dst_emc_entry->current_dram_clktree_c0d1u0 - (dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d1u0 / 100);
1781
if (tdelta < 0)
1782
tdelta *= -1;
1783
if ((u32)tdelta > adelta)
1784
adelta = tdelta;
1785
if (update_type == TRAINING_UPDATE || ((dst_rate_mhz * tdelta * 128) / 1000000) > dst_emc_entry->tree_margin)
1786
dst_emc_entry->current_dram_clktree_c0d1u0 = dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d1u0 / 100;
1787
1788
calc_tmp_td0_1:
1789
cval = tval / (src_rate_mhz * temp_ch0_1);
1790
switch (update_type)
1791
{
1792
case DVFS_PT1:
1793
case TRAINING_PT1:
1794
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d1u1 += 100 * cval;
1795
if (update_type > PERIODIC_TRAINING_UPDATE || !(upd_type_bits & 0x6800))
1796
goto calc_tmp_td1_0;
1797
break;
1798
case DVFS_UPDATE:
1799
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d1u1 =
1800
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d1u1 / dst_emc_entry->ptfv_list.ptfv_dvfs_samples;
1801
break;
1802
case TRAINING_UPDATE:
1803
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d1u1 =
1804
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d1u1 / dst_emc_entry->ptfv_list.ptfv_write_samples;
1805
break;
1806
case PERIODIC_TRAINING_UPDATE:
1807
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d1u1 =
1808
(100 * cval + dst_emc_entry->ptfv_list.ptfv_movavg_weight * dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d1u1)
1809
/ (dst_emc_entry->ptfv_list.ptfv_movavg_weight + 1);
1810
break;
1811
default:
1812
if (update_type > PERIODIC_TRAINING_UPDATE || !(upd_type_bits & 0x6800))
1813
goto calc_tmp_td1_0;
1814
break;
1815
}
1816
1817
tdelta = dst_emc_entry->current_dram_clktree_c0d1u1 - (dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d1u1 / 100);
1818
if (tdelta < 0)
1819
tdelta *= -1;
1820
if ((u32)tdelta > adelta)
1821
adelta = tdelta;
1822
if (update_type == TRAINING_UPDATE || ((dst_rate_mhz * tdelta * 128) / 1000000) > dst_emc_entry->tree_margin)
1823
dst_emc_entry->current_dram_clktree_c0d1u1 = dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d1u1 / 100;
1824
1825
calc_tmp_td1_0:
1826
if (channel1_enabled)
1827
{
1828
cval = tval / (src_rate_mhz * temp_ch1_0);
1829
switch (update_type)
1830
{
1831
case DVFS_PT1:
1832
case TRAINING_PT1:
1833
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d1u0 += 100 * cval;
1834
if (update_type > PERIODIC_TRAINING_UPDATE || !(upd_type_bits & 0x6800))
1835
goto calc_tmp_td1_1;
1836
break;
1837
case DVFS_UPDATE:
1838
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d1u0 =
1839
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d1u0 / dst_emc_entry->ptfv_list.ptfv_dvfs_samples;
1840
break;
1841
case TRAINING_UPDATE:
1842
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d1u0 =
1843
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d1u0 / dst_emc_entry->ptfv_list.ptfv_write_samples;
1844
break;
1845
case PERIODIC_TRAINING_UPDATE:
1846
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d1u0 =
1847
(100 * cval + dst_emc_entry->ptfv_list.ptfv_movavg_weight * dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d1u0)
1848
/ (dst_emc_entry->ptfv_list.ptfv_movavg_weight + 1);
1849
break;
1850
default:
1851
if (update_type > PERIODIC_TRAINING_UPDATE || !(upd_type_bits & 0x6800))
1852
goto calc_tmp_td1_1;
1853
break;
1854
}
1855
1856
tdelta = dst_emc_entry->current_dram_clktree_c1d1u0 - (dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d1u0 / 100);
1857
if (tdelta < 0)
1858
tdelta *= -1;
1859
if ((u32)tdelta > adelta)
1860
adelta = tdelta;
1861
if (update_type == TRAINING_UPDATE || ((dst_rate_mhz * tdelta * 128) / 1000000) > dst_emc_entry->tree_margin)
1862
dst_emc_entry->current_dram_clktree_c1d1u0 = dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d1u0 / 100;
1863
1864
calc_tmp_td1_1:
1865
cval = tval / (src_rate_mhz * temp_ch1_1);
1866
switch (update_type)
1867
{
1868
case DVFS_PT1:
1869
case TRAINING_PT1:
1870
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d1u1 += 100 * cval;
1871
if (update_type > PERIODIC_TRAINING_UPDATE || !(upd_type_bits & 0x6800))
1872
goto out;
1873
break;
1874
case DVFS_UPDATE:
1875
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d1u1 =
1876
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d1u1 / dst_emc_entry->ptfv_list.ptfv_dvfs_samples;
1877
break;
1878
case TRAINING_UPDATE:
1879
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d1u1 =
1880
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d1u1 / dst_emc_entry->ptfv_list.ptfv_write_samples;
1881
break;
1882
case PERIODIC_TRAINING_UPDATE:
1883
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d1u1 =
1884
(100 * cval + dst_emc_entry->ptfv_list.ptfv_movavg_weight * dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d1u1)
1885
/ (dst_emc_entry->ptfv_list.ptfv_movavg_weight + 1);
1886
break;
1887
default:
1888
if (update_type > PERIODIC_TRAINING_UPDATE || !(upd_type_bits & 0x6800))
1889
goto out;
1890
break;
1891
}
1892
1893
tdelta = dst_emc_entry->current_dram_clktree_c1d1u1 - (dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d1u1 / 100);
1894
if (tdelta < 0)
1895
tdelta *= -1;
1896
if ((u32)tdelta > adelta)
1897
adelta = tdelta;
1898
if (update_type == TRAINING_UPDATE || ((dst_rate_mhz * tdelta * 128) / 1000000) > dst_emc_entry->tree_margin)
1899
dst_emc_entry->current_dram_clktree_c1d1u1 = dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d1u1 / 100;
1900
}
1901
1902
out:
1903
if (update_type == TRAINING_UPDATE)
1904
{
1905
dst_emc_entry->trained_dram_clktree_c0d0u0 = dst_emc_entry->current_dram_clktree_c0d0u0;
1906
dst_emc_entry->trained_dram_clktree_c0d0u1 = dst_emc_entry->current_dram_clktree_c0d0u1;
1907
dst_emc_entry->trained_dram_clktree_c0d1u0 = dst_emc_entry->current_dram_clktree_c0d1u0;
1908
dst_emc_entry->trained_dram_clktree_c0d1u1 = dst_emc_entry->current_dram_clktree_c0d1u1;
1909
dst_emc_entry->trained_dram_clktree_c1d0u0 = dst_emc_entry->current_dram_clktree_c1d0u0;
1910
dst_emc_entry->trained_dram_clktree_c1d0u1 = dst_emc_entry->current_dram_clktree_c1d0u1;
1911
dst_emc_entry->trained_dram_clktree_c1d1u0 = dst_emc_entry->current_dram_clktree_c1d1u0;
1912
dst_emc_entry->trained_dram_clktree_c1d1u1 = dst_emc_entry->current_dram_clktree_c1d1u1;
1913
}
1914
1915
return (u32)adelta;
1916
}
1917
1918
static u32 _minerva_periodic_compensation_handler(emc_table_t *src_emc_entry, emc_table_t *dst_emc_entry, u32 dram_dev_num, u32 channel1_enabled, enum comp_seq_t seq_type)
1919
{
1920
if (!dst_emc_entry->periodic_training)
1921
return 0;
1922
1923
u32 delay = 1000 * _actual_osc_clocks(src_emc_entry->run_clocks) / src_emc_entry->rate_khz + 2;
1924
1925
if (seq_type == DVFS_SEQUENCE)
1926
{
1927
if (src_emc_entry->periodic_training && dst_emc_entry->ptfv_list.ptfv_config_ctrl & 1)
1928
{
1929
u32 samples = dst_emc_entry->ptfv_list.ptfv_dvfs_samples;
1930
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d0u0 = src_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d0u0 * samples;
1931
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d0u1 = src_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d0u1 * samples;
1932
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d0u0 = src_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d0u0 * samples;
1933
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d0u1 = src_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d0u1 * samples;
1934
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d1u0 = src_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d1u0 * samples;
1935
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d1u1 = src_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d1u1 * samples;
1936
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d1u0 = src_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d1u0 * samples;
1937
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d1u1 = src_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d1u1 * samples;
1938
}
1939
else
1940
{
1941
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d0u0 = 0;
1942
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d0u1 = 0;
1943
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d0u0 = 0;
1944
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d0u1 = 0;
1945
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d1u0 = 0;
1946
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d1u1 = 0;
1947
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d1u0 = 0;
1948
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d1u1 = 0;
1949
1950
for (u32 i = 0; i < dst_emc_entry->ptfv_list.ptfv_dvfs_samples; i++)
1951
{
1952
_start_periodic_compensation();
1953
_usleep(delay);
1954
_minerva_update_clock_tree_delay(src_emc_entry, dst_emc_entry, dram_dev_num, channel1_enabled, DVFS_PT1);
1955
}
1956
}
1957
1958
return _minerva_update_clock_tree_delay(src_emc_entry, dst_emc_entry, dram_dev_num, channel1_enabled, DVFS_UPDATE);
1959
}
1960
else if (seq_type == WRITE_TRAINING_SEQUENCE)
1961
{
1962
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d0u0 = 0;
1963
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d0u1 = 0;
1964
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d0u0 = 0;
1965
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d0u1 = 0;
1966
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d1u0 = 0;
1967
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c0d1u1 = 0;
1968
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d1u0 = 0;
1969
dst_emc_entry->ptfv_list.ptfv_dqsosc_movavg_c1d1u1 = 0;
1970
1971
for (u32 i = 0; i < dst_emc_entry->ptfv_list.ptfv_write_samples; i++)
1972
{
1973
_start_periodic_compensation();
1974
_usleep(delay);
1975
_minerva_update_clock_tree_delay(src_emc_entry, dst_emc_entry, dram_dev_num, channel1_enabled, TRAINING_PT1);
1976
}
1977
1978
return _minerva_update_clock_tree_delay(src_emc_entry, dst_emc_entry, dram_dev_num, channel1_enabled, TRAINING_UPDATE);
1979
}
1980
else if (seq_type == PERIODIC_TRAINING_SEQUENCE)
1981
{
1982
_start_periodic_compensation();
1983
_usleep(delay);
1984
return _minerva_update_clock_tree_delay(src_emc_entry, dst_emc_entry, dram_dev_num, channel1_enabled, PERIODIC_TRAINING_UPDATE);
1985
}
1986
1987
return seq_type;
1988
}
1989
1990
#define STORE_TRIM_VAL(chan, rank, reg, byte) \
1991
((mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_long_dq_rank##rank##_##reg >> \
1992
EMC_PMACRO_OB_DDLL_LONG_DQ_BYTE##byte##_SHIFT) & 0x7FF) \
1993
+ \
1994
(((mtc_table_entry->trim_perch_regs.emc##chan##_data_brlshft_##rank >> \
1995
EMC_DATA_BRLSHFT_##rank##_RANK##rank##_BYTE##byte##_DATA_BRLSHFT_SHIFT) & 0x7) << 6)
1996
1997
static u32 _minerva_apply_periodic_compensation_trimmer(emc_table_t *mtc_table_entry, u32 trim_emc_reg_addr)
1998
{
1999
u32 trimmer = 0;
2000
s32 tree_delta[4] = {0};
2001
s32 tree_delta_taps[4] = {0};
2002
s32 new_trim[] = {
2003
// chan, rank, reg, byte.
2004
STORE_TRIM_VAL(0, 0, 0, 0),
2005
STORE_TRIM_VAL(0, 0, 0, 1),
2006
STORE_TRIM_VAL(0, 0, 1, 2),
2007
STORE_TRIM_VAL(0, 0, 1, 3),
2008
2009
STORE_TRIM_VAL(1, 0, 2, 4),
2010
STORE_TRIM_VAL(1, 0, 2, 5),
2011
STORE_TRIM_VAL(1, 0, 3, 6),
2012
STORE_TRIM_VAL(1, 0, 3, 7),
2013
2014
STORE_TRIM_VAL(0, 1, 0, 0),
2015
STORE_TRIM_VAL(0, 1, 0, 1),
2016
STORE_TRIM_VAL(0, 1, 1, 2),
2017
STORE_TRIM_VAL(0, 1, 1, 3),
2018
2019
STORE_TRIM_VAL(1, 1, 2, 4),
2020
STORE_TRIM_VAL(1, 1, 2, 5),
2021
STORE_TRIM_VAL(1, 1, 3, 6),
2022
STORE_TRIM_VAL(1, 1, 3, 7)
2023
};
2024
2025
u32 dst_rate_mhz = mtc_table_entry->rate_khz / 1000;
2026
2027
switch (trim_emc_reg_addr)
2028
{
2029
case EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_0:
2030
case EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_1:
2031
case EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_2:
2032
case EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_3:
2033
case EMC_DATA_BRLSHFT_0:
2034
tree_delta[0] = (mtc_table_entry->current_dram_clktree_c0d0u0 - mtc_table_entry->trained_dram_clktree_c0d0u0) * 128;
2035
tree_delta[1] = (mtc_table_entry->current_dram_clktree_c0d0u1 - mtc_table_entry->trained_dram_clktree_c0d0u1) * 128;
2036
tree_delta[2] = (mtc_table_entry->current_dram_clktree_c1d0u0 - mtc_table_entry->trained_dram_clktree_c1d0u0) * 128;
2037
tree_delta[3] = (mtc_table_entry->current_dram_clktree_c1d0u1 - mtc_table_entry->trained_dram_clktree_c1d0u1) * 128;
2038
tree_delta_taps[0] = (tree_delta[0] * (s32)dst_rate_mhz) / 1000000;
2039
tree_delta_taps[1] = (tree_delta[1] * (s32)dst_rate_mhz) / 1000000;
2040
tree_delta_taps[2] = (tree_delta[2] * (s32)dst_rate_mhz) / 1000000;
2041
tree_delta_taps[3] = (tree_delta[3] * (s32)dst_rate_mhz) / 1000000;
2042
for (u32 i = 0; i < 4; i++)
2043
{
2044
// Check if tap exceeds margins and apply it.
2045
if ((tree_delta_taps[i] > (s32)mtc_table_entry->tree_margin) || (tree_delta_taps[i] < (-1 * (s32)mtc_table_entry->tree_margin)))
2046
{
2047
new_trim[i * 2] += tree_delta_taps[i];
2048
new_trim[i * 2 + 1] += tree_delta_taps[i];
2049
}
2050
}
2051
if (trim_emc_reg_addr == EMC_DATA_BRLSHFT_0)
2052
{
2053
for (u32 i = 0; i < 8; i++)
2054
new_trim[i] /= 64;
2055
}
2056
else
2057
{
2058
for (u32 i = 0; i < 8; i++)
2059
new_trim[i] %= 64;
2060
}
2061
break;
2062
case EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_0:
2063
case EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_1:
2064
case EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_2:
2065
case EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_3:
2066
case EMC_DATA_BRLSHFT_1:
2067
tree_delta[0] = (mtc_table_entry->current_dram_clktree_c0d1u0 - mtc_table_entry->trained_dram_clktree_c0d1u0) * 128;
2068
tree_delta[1] = (mtc_table_entry->current_dram_clktree_c0d1u1 - mtc_table_entry->trained_dram_clktree_c0d1u1) * 128;
2069
tree_delta[2] = (mtc_table_entry->current_dram_clktree_c1d1u0 - mtc_table_entry->trained_dram_clktree_c1d1u0) * 128;
2070
tree_delta[3] = (mtc_table_entry->current_dram_clktree_c1d1u1 - mtc_table_entry->trained_dram_clktree_c1d1u1) * 128;
2071
tree_delta_taps[0] = (tree_delta[0] * (s32)dst_rate_mhz) / 1000000;
2072
tree_delta_taps[1] = (tree_delta[1] * (s32)dst_rate_mhz) / 1000000;
2073
tree_delta_taps[2] = (tree_delta[2] * (s32)dst_rate_mhz) / 1000000;
2074
tree_delta_taps[3] = (tree_delta[3] * (s32)dst_rate_mhz) / 1000000;
2075
for (u32 i = 0; i < 4; i++)
2076
{
2077
// Check if tap exceeds margins and apply it.
2078
if ((tree_delta_taps[i] > (s32)mtc_table_entry->tree_margin) || (tree_delta_taps[i] < (-1 * (s32)mtc_table_entry->tree_margin)))
2079
{
2080
new_trim[8 + i * 2] += tree_delta_taps[i];
2081
new_trim[8 + i * 2 + 1] += tree_delta_taps[i];
2082
}
2083
}
2084
if (trim_emc_reg_addr == EMC_DATA_BRLSHFT_1)
2085
{
2086
for (u32 i = 0; i < 8; i++)
2087
new_trim[i + 8] /= 64;
2088
}
2089
else
2090
{
2091
for (u32 i = 0; i < 8; i++)
2092
new_trim[i + 8] %= 64;
2093
}
2094
break;
2095
default:
2096
break;
2097
}
2098
2099
switch (trim_emc_reg_addr)
2100
{
2101
case EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_0:
2102
trimmer = (new_trim[0] & 0x7FF) | ((new_trim[1] & 0x7FF) << 16);
2103
break;
2104
case EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_1:
2105
trimmer = (new_trim[2] & 0x7FF) | ((new_trim[3] & 0x7FF) << 16);
2106
break;
2107
case EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_2:
2108
trimmer = (new_trim[4] & 0x7FF) | ((new_trim[5] & 0x7FF) << 16);
2109
break;
2110
case EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_3:
2111
trimmer = (new_trim[6] & 0x7FF) | ((new_trim[7] & 0x7FF) << 16);
2112
break;
2113
case EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_0:
2114
trimmer = (new_trim[8] & 0x7FF) | ((new_trim[9] & 0x7FF) << 16);
2115
break;
2116
case EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_1:
2117
trimmer = (new_trim[10] & 0x7FF) | ((new_trim[11] & 0x7FF) << 16);
2118
break;
2119
case EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_2:
2120
trimmer = (new_trim[12] & 0x7FF) | ((new_trim[13] & 0x7FF) << 16);
2121
break;
2122
case EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_3:
2123
trimmer = (new_trim[14] & 0x7FF) | ((new_trim[15] & 0x7FF) << 16);
2124
break;
2125
case EMC_DATA_BRLSHFT_0:
2126
trimmer = ((new_trim[0] & 7) << EMC_DATA_BRLSHFT_0_RANK0_BYTE0_DATA_BRLSHFT_SHIFT)
2127
| ((new_trim[1] & 7) << EMC_DATA_BRLSHFT_0_RANK0_BYTE1_DATA_BRLSHFT_SHIFT)
2128
| ((new_trim[2] & 7) << EMC_DATA_BRLSHFT_0_RANK0_BYTE2_DATA_BRLSHFT_SHIFT)
2129
| ((new_trim[3] & 7) << EMC_DATA_BRLSHFT_0_RANK0_BYTE3_DATA_BRLSHFT_SHIFT)
2130
| ((new_trim[4] & 7) << EMC_DATA_BRLSHFT_0_RANK0_BYTE4_DATA_BRLSHFT_SHIFT)
2131
| ((new_trim[5] & 7) << EMC_DATA_BRLSHFT_0_RANK0_BYTE5_DATA_BRLSHFT_SHIFT)
2132
| ((new_trim[6] & 7) << EMC_DATA_BRLSHFT_0_RANK0_BYTE6_DATA_BRLSHFT_SHIFT)
2133
| ((new_trim[7] & 7) << EMC_DATA_BRLSHFT_0_RANK0_BYTE7_DATA_BRLSHFT_SHIFT);
2134
break;
2135
case EMC_DATA_BRLSHFT_1:
2136
trimmer = ((new_trim[8] & 7) << EMC_DATA_BRLSHFT_1_RANK1_BYTE0_DATA_BRLSHFT_SHIFT)
2137
| ((new_trim[9] & 7) << EMC_DATA_BRLSHFT_1_RANK1_BYTE1_DATA_BRLSHFT_SHIFT)
2138
| ((new_trim[10] & 7) << EMC_DATA_BRLSHFT_1_RANK1_BYTE2_DATA_BRLSHFT_SHIFT)
2139
| ((new_trim[11] & 7) << EMC_DATA_BRLSHFT_1_RANK1_BYTE3_DATA_BRLSHFT_SHIFT)
2140
| ((new_trim[12] & 7) << EMC_DATA_BRLSHFT_1_RANK1_BYTE4_DATA_BRLSHFT_SHIFT)
2141
| ((new_trim[13] & 7) << EMC_DATA_BRLSHFT_1_RANK1_BYTE5_DATA_BRLSHFT_SHIFT)
2142
| ((new_trim[14] & 7) << EMC_DATA_BRLSHFT_1_RANK1_BYTE6_DATA_BRLSHFT_SHIFT)
2143
| ((new_trim[15] & 7) << EMC_DATA_BRLSHFT_1_RANK1_BYTE7_DATA_BRLSHFT_SHIFT);
2144
break;
2145
default:
2146
break;
2147
}
2148
2149
return trimmer;
2150
}
2151
2152
static bool _check_freq_changed(u32 dst_entry_rate_KHz, u32 dst_entry_clk_src_emc, u32 src_entry_rate_KHz, u32 src_entry_clk_src_emc)
2153
{
2154
u64 dst_div_clock;
2155
u64 src_div_clock;
2156
u32 src_end_div_clk_ratio;
2157
2158
u32 src_entry_emc_2X_clk_src = src_entry_clk_src_emc >> EMC_2X_CLK_SRC_SHIFT;
2159
u32 dst_entry_emc_2X_clk_src = dst_entry_clk_src_emc >> EMC_2X_CLK_SRC_SHIFT;
2160
u32 src_entry_emc_2X_clk_src_div = src_entry_clk_src_emc & 0xFF;
2161
u32 dst_entry_emc_2X_clk_src_div = dst_entry_clk_src_emc & 0xFF;
2162
u32 pll_post_divider = 0;
2163
2164
switch (CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_EMC) >> EMC_2X_CLK_SRC_SHIFT)
2165
{
2166
case PLLM_OUT0:
2167
case PLLM_UD:
2168
pll_post_divider = (CLOCK(CLK_RST_CONTROLLER_PLLM_BASE) >> 20) & 0x1F;
2169
break;
2170
case PLLMB_UD:
2171
case PLLMB_OUT0:
2172
pll_post_divider = (CLOCK(CLK_RST_CONTROLLER_PLLMB_BASE) >> 20) & 0x1F;
2173
break;
2174
default:
2175
break;
2176
}
2177
2178
// Hang if post div is wrong.
2179
if (pll_post_divider > 5)
2180
while (true)
2181
;
2182
2183
if (src_entry_emc_2X_clk_src <= PLLMB_UD)
2184
src_entry_emc_2X_clk_src_div = 0;
2185
if (dst_entry_emc_2X_clk_src <= PLLMB_UD)
2186
dst_entry_emc_2X_clk_src_div = 0;
2187
2188
if (dst_entry_emc_2X_clk_src != src_entry_emc_2X_clk_src
2189
&& (dst_entry_emc_2X_clk_src & 0xFFFFFFFB || src_entry_emc_2X_clk_src & 0xFFFFFFFB))
2190
return true;
2191
2192
dst_div_clock = dst_entry_rate_KHz * (pll_post_divider + 1)
2193
* ((dst_entry_emc_2X_clk_src_div >> 1) * 10 + (dst_entry_emc_2X_clk_src_div & 1) * 5 + 10) / 10; // Accounting for 7.1 div.
2194
src_div_clock = src_entry_rate_KHz * (pll_post_divider + 1)
2195
* ((src_entry_emc_2X_clk_src_div >> 1) * 10 + (src_entry_emc_2X_clk_src_div & 1) * 5 + 10) / 10; // Accounting for 7.1 div.
2196
2197
src_end_div_clk_ratio = (src_div_clock * 1000) / dst_div_clock;
2198
2199
if (src_end_div_clk_ratio > 1010 || src_end_div_clk_ratio < 990)
2200
return true;
2201
else
2202
return false;
2203
}
2204
2205
static void _save_train_results(emc_table_t *mtc_table_entry, u32 needs_training, u32 dram_dev_num, bool channel1_enabled)
2206
{
2207
bool needs_ca_training = !!(needs_training & NEEDS_TRAINING_CA);
2208
bool needs_ca_vref_training = !!(needs_training & NEEDS_TRAINING_CA_VREF);
2209
bool needs_quse_training = !!(needs_training & NEEDS_TRAINING_QUSE);
2210
bool needs_quse_vref_training = !!(needs_training & NEEDS_TRAINING_QUSE_VREF);
2211
bool needs_wr_training = !!(needs_training & NEEDS_TRAINING_WR);
2212
bool needs_wr_vref_training = !!(needs_training & NEEDS_TRAINING_WR_VREF);
2213
bool needs_rd_training = !!(needs_training & NEEDS_TRAINING_RD);
2214
bool needs_rd_vref_training = !!(needs_training & NEEDS_TRAINING_RD_VREF);
2215
bool needs_training_in_self_refresh = !!(needs_training & NEEDS_TRAINING_IN_SELF_REFRESH);
2216
2217
if (needs_ca_training)
2218
{
2219
mtc_table_entry->trim_perch_regs.emc_cmd_brlshft_0 = EMC_CH0(EMC_CMD_BRLSHFT_0);
2220
mtc_table_entry->trim_perch_regs.emc_cmd_brlshft_1 = channel1_enabled ? EMC_CH1(EMC_CMD_BRLSHFT_1) : 0;
2221
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_long_dq_rank0_4 = EMC_CH0(EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_4);
2222
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_long_dq_rank0_5 = channel1_enabled ? EMC_CH1(EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_5) : 0;
2223
2224
if (needs_training_in_self_refresh)
2225
{
2226
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank0_cmd0_0 = EMC(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD0_0);
2227
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank0_cmd0_1 = EMC(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD0_1);
2228
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank0_cmd0_2 = EMC(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD0_2);
2229
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank0_cmd1_0 = EMC(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD1_0);
2230
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank0_cmd1_1 = EMC(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD1_1);
2231
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank0_cmd1_2 = EMC(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD1_2);
2232
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank0_cmd2_0 = EMC(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD2_0);
2233
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank0_cmd2_1 = EMC(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD2_1);
2234
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank0_cmd2_2 = EMC(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD2_2);
2235
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank0_cmd3_0 = EMC(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD3_0);
2236
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank0_cmd3_1 = EMC(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD3_1);
2237
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank0_cmd3_2 = EMC(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_CMD3_2);
2238
}
2239
}
2240
2241
if (needs_ca_vref_training)
2242
{
2243
mtc_table_entry->burst_reg_per_ch.emc0_mrw10 = (EMC_CH0(EMC_TRAINING_OPT_CA_VREF) & 0xFFFF) | 0x880C0000;
2244
mtc_table_entry->burst_reg_per_ch.emc1_mrw10 = (channel1_enabled ? EMC_CH1(EMC_TRAINING_OPT_CA_VREF) & 0xFFFF : 0) | 0x880C0000;
2245
2246
u32 mrw11_dev_selectn;
2247
if (dram_dev_num == TWO_RANK)
2248
mrw11_dev_selectn = 0x480C0000;
2249
else
2250
mrw11_dev_selectn = 0xC80C0000;
2251
2252
mtc_table_entry->burst_reg_per_ch.emc0_mrw11 =
2253
((EMC_CH0(EMC_TRAINING_OPT_CA_VREF) >> 16) & 0xFF)
2254
| (EMC_CH0(EMC_TRAINING_OPT_CA_VREF) >> 24 << 8)
2255
| (mrw11_dev_selectn & 0xFFFFFF00);
2256
2257
mtc_table_entry->burst_reg_per_ch.emc1_mrw11 =
2258
(((channel1_enabled ? EMC_CH1(EMC_TRAINING_OPT_CA_VREF) : 0) >> 16) & 0xFF)
2259
| ((channel1_enabled ? EMC_CH1(EMC_TRAINING_OPT_CA_VREF) : 0) >> 24 << 8)
2260
| (mrw11_dev_selectn & 0xFFFFFF00);
2261
}
2262
2263
if (needs_quse_training || needs_rd_training)
2264
{
2265
mtc_table_entry->trim_perch_regs.emc_quse_brlshft_0 = EMC_CH0(EMC_QUSE_BRLSHFT_0);
2266
mtc_table_entry->trim_perch_regs.emc_quse_brlshft_1 = channel1_enabled ? EMC_CH1(EMC_QUSE_BRLSHFT_1) : 0;
2267
2268
mtc_table_entry->trim_regs.emc_pmacro_quse_ddll_rank0_0 = EMC_CH0(EMC_PMACRO_QUSE_DDLL_RANK0_0);
2269
mtc_table_entry->trim_regs.emc_pmacro_quse_ddll_rank0_1 = EMC_CH0(EMC_PMACRO_QUSE_DDLL_RANK0_1);
2270
mtc_table_entry->trim_regs.emc_pmacro_quse_ddll_rank0_2 = channel1_enabled ? EMC_CH1(EMC_PMACRO_QUSE_DDLL_RANK0_2) : 0;
2271
mtc_table_entry->trim_regs.emc_pmacro_quse_ddll_rank0_3 = channel1_enabled ? EMC_CH1(EMC_PMACRO_QUSE_DDLL_RANK0_3) : 0;
2272
2273
if (dram_dev_num == TWO_RANK)
2274
{
2275
mtc_table_entry->trim_perch_regs.emc_quse_brlshft_2 = EMC_CH0(EMC_QUSE_BRLSHFT_2);
2276
mtc_table_entry->trim_perch_regs.emc_quse_brlshft_3 = channel1_enabled ? EMC_CH1(EMC_QUSE_BRLSHFT_3) : 0;
2277
2278
mtc_table_entry->trim_regs.emc_pmacro_quse_ddll_rank1_0 = EMC_CH0(EMC_PMACRO_QUSE_DDLL_RANK1_0);
2279
mtc_table_entry->trim_regs.emc_pmacro_quse_ddll_rank1_1 = EMC_CH0(EMC_PMACRO_QUSE_DDLL_RANK1_1);
2280
mtc_table_entry->trim_regs.emc_pmacro_quse_ddll_rank1_2 = channel1_enabled ? EMC_CH1(EMC_PMACRO_QUSE_DDLL_RANK1_2) : 0;
2281
mtc_table_entry->trim_regs.emc_pmacro_quse_ddll_rank1_3 = channel1_enabled ? EMC_CH1(EMC_PMACRO_QUSE_DDLL_RANK1_3) : 0;
2282
}
2283
}
2284
2285
if (needs_quse_vref_training)
2286
{
2287
if (dram_dev_num == TWO_RANK)
2288
{
2289
u32 emc0_opt_dqs_array[4] = {0};
2290
u32 emc1_opt_dqs_array[4] = {0};
2291
u32 emc1_training_opt_dqs_ib_vref_rank0_val = channel1_enabled ? EMC_CH1(EMC_TRAINING_OPT_DQS_IB_VREF_RANK0) : 0;
2292
u32 emc1_training_opt_dqs_ib_vref_rank1_val = channel1_enabled ? EMC_CH1(EMC_TRAINING_OPT_DQS_IB_VREF_RANK1) : 0;
2293
2294
for (u32 i = 0; i < 4; i++)
2295
{
2296
emc0_opt_dqs_array[i] = (EMC_CH0(EMC_TRAINING_OPT_DQS_IB_VREF_RANK0) >> (8 * i)) & 0xFF;
2297
emc1_opt_dqs_array[i] = (emc1_training_opt_dqs_ib_vref_rank0_val >> (8 * i)) & 0xFF;
2298
}
2299
2300
u32 ib_vref_dqs_0 = 0;
2301
u32 ib_vref_dqs_1 = 0;
2302
for (u32 i = 0; i < 4; i++)
2303
{
2304
ib_vref_dqs_0 |= (emc0_opt_dqs_array[i] + ((EMC_CH0(EMC_TRAINING_OPT_DQS_IB_VREF_RANK1) >> (8 * i)) & 0xFF)) >> 1 << (8 * i);
2305
ib_vref_dqs_1 |= (emc1_opt_dqs_array[i] + ((emc1_training_opt_dqs_ib_vref_rank1_val >> (8 * i)) & 0xFF)) >> 1 << (8 * i);
2306
}
2307
2308
mtc_table_entry->trim_regs.emc_pmacro_ib_vref_dqs_0 = ib_vref_dqs_0;
2309
mtc_table_entry->trim_regs.emc_pmacro_ib_vref_dqs_1 = ib_vref_dqs_1;
2310
}
2311
else
2312
{
2313
mtc_table_entry->trim_regs.emc_pmacro_ib_vref_dqs_0 = EMC(EMC_PMACRO_IB_VREF_DQS_0);
2314
mtc_table_entry->trim_regs.emc_pmacro_ib_vref_dqs_1 = channel1_enabled ? EMC_CH1(EMC_PMACRO_IB_VREF_DQS_1) : 0;
2315
}
2316
}
2317
2318
if (needs_rd_training)
2319
{
2320
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_long_dqs_rank0_0 = EMC_CH0(EMC_PMACRO_IB_DDLL_LONG_DQS_RANK0_0);
2321
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_long_dqs_rank0_1 = EMC_CH0(EMC_PMACRO_IB_DDLL_LONG_DQS_RANK0_1);
2322
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_long_dqs_rank0_2 = channel1_enabled ? EMC_CH1(EMC_PMACRO_IB_DDLL_LONG_DQS_RANK0_2) : 0;
2323
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_long_dqs_rank0_3 = channel1_enabled ? EMC_CH1(EMC_PMACRO_IB_DDLL_LONG_DQS_RANK0_3) : 0;
2324
2325
if (dram_dev_num == TWO_RANK)
2326
{
2327
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_long_dqs_rank1_0 = EMC_CH0(EMC_PMACRO_IB_DDLL_LONG_DQS_RANK1_0);
2328
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_long_dqs_rank1_1 = EMC_CH0(EMC_PMACRO_IB_DDLL_LONG_DQS_RANK1_1);
2329
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_long_dqs_rank1_2 = channel1_enabled ? EMC_CH1(EMC_PMACRO_IB_DDLL_LONG_DQS_RANK1_2) : 0;
2330
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_long_dqs_rank1_3 = channel1_enabled ? EMC_CH1(EMC_PMACRO_IB_DDLL_LONG_DQS_RANK1_3) : 0;
2331
}
2332
2333
if (needs_training_in_self_refresh)
2334
{
2335
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_short_dq_rank0_byte0_0 = EMC_CH0(EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE0_0);
2336
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_short_dq_rank0_byte0_1 = EMC_CH0(EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE0_1);
2337
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_short_dq_rank0_byte0_2 = EMC_CH0(EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE0_2);
2338
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_short_dq_rank0_byte1_0 = EMC_CH0(EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE1_0);
2339
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_short_dq_rank0_byte1_1 = EMC_CH0(EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE1_1);
2340
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_short_dq_rank0_byte1_2 = EMC_CH0(EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE1_2);
2341
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_short_dq_rank0_byte2_0 = EMC_CH0(EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE2_0);
2342
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_short_dq_rank0_byte2_1 = EMC_CH0(EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE2_1);
2343
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_short_dq_rank0_byte2_2 = EMC_CH0(EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE2_2);
2344
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_short_dq_rank0_byte3_0 = EMC_CH0(EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE3_0);
2345
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_short_dq_rank0_byte3_1 = EMC_CH0(EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE3_1);
2346
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_short_dq_rank0_byte3_2 = EMC_CH0(EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE3_2);
2347
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_short_dq_rank0_byte4_0 = channel1_enabled ? EMC_CH1(EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE4_0) : 0;
2348
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_short_dq_rank0_byte4_1 = channel1_enabled ? EMC_CH1(EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE4_1) : 0;
2349
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_short_dq_rank0_byte4_2 = channel1_enabled ? EMC_CH1(EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE4_2) : 0;
2350
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_short_dq_rank0_byte5_0 = channel1_enabled ? EMC_CH1(EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE5_0) : 0;
2351
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_short_dq_rank0_byte5_1 = channel1_enabled ? EMC_CH1(EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE5_1) : 0;
2352
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_short_dq_rank0_byte5_2 = channel1_enabled ? EMC_CH1(EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE5_2) : 0;
2353
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_short_dq_rank0_byte6_0 = channel1_enabled ? EMC_CH1(EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE6_0) : 0;
2354
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_short_dq_rank0_byte6_1 = channel1_enabled ? EMC_CH1(EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE6_1) : 0;
2355
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_short_dq_rank0_byte6_2 = channel1_enabled ? EMC_CH1(EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE6_2) : 0;
2356
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_short_dq_rank0_byte7_0 = channel1_enabled ? EMC_CH1(EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE7_0) : 0;
2357
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_short_dq_rank0_byte7_1 = channel1_enabled ? EMC_CH1(EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE7_1) : 0;
2358
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_short_dq_rank0_byte7_2 = channel1_enabled ? EMC_CH1(EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK0_BYTE7_2) : 0;
2359
2360
if (dram_dev_num == TWO_RANK)
2361
{
2362
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_short_dq_rank1_byte0_0 = EMC_CH0(EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE0_0);
2363
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_short_dq_rank1_byte0_1 = EMC_CH0(EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE0_1);
2364
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_short_dq_rank1_byte0_2 = EMC_CH0(EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE0_2);
2365
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_short_dq_rank1_byte1_0 = EMC_CH0(EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE1_0);
2366
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_short_dq_rank1_byte1_1 = EMC_CH0(EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE1_1);
2367
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_short_dq_rank1_byte1_2 = EMC_CH0(EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE1_2);
2368
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_short_dq_rank1_byte2_0 = EMC_CH0(EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE2_0);
2369
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_short_dq_rank1_byte2_1 = EMC_CH0(EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE2_1);
2370
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_short_dq_rank1_byte2_2 = EMC_CH0(EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE2_2);
2371
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_short_dq_rank1_byte3_0 = EMC_CH0(EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE3_0);
2372
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_short_dq_rank1_byte3_1 = EMC_CH0(EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE3_1);
2373
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_short_dq_rank1_byte3_2 = EMC_CH0(EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE3_2);
2374
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_short_dq_rank1_byte4_0 = channel1_enabled ? EMC_CH1(EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE4_0) : 0;
2375
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_short_dq_rank1_byte4_1 = channel1_enabled ? EMC_CH1(EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE4_1) : 0;
2376
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_short_dq_rank1_byte4_2 = channel1_enabled ? EMC_CH1(EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE4_2) : 0;
2377
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_short_dq_rank1_byte5_0 = channel1_enabled ? EMC_CH1(EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE5_0) : 0;
2378
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_short_dq_rank1_byte5_1 = channel1_enabled ? EMC_CH1(EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE5_1) : 0;
2379
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_short_dq_rank1_byte5_2 = channel1_enabled ? EMC_CH1(EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE5_2) : 0;
2380
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_short_dq_rank1_byte6_0 = channel1_enabled ? EMC_CH1(EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE6_0) : 0;
2381
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_short_dq_rank1_byte6_1 = channel1_enabled ? EMC_CH1(EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE6_1) : 0;
2382
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_short_dq_rank1_byte6_2 = channel1_enabled ? EMC_CH1(EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE6_2) : 0;
2383
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_short_dq_rank1_byte7_0 = channel1_enabled ? EMC_CH1(EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE7_0) : 0;
2384
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_short_dq_rank1_byte7_1 = channel1_enabled ? EMC_CH1(EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE7_1) : 0;
2385
mtc_table_entry->trim_regs.emc_pmacro_ib_ddll_short_dq_rank1_byte7_2 = channel1_enabled ? EMC_CH1(EMC_PMACRO_IB_DDLL_SHORT_DQ_RANK1_BYTE7_2) : 0;
2386
}
2387
}
2388
2389
if (needs_rd_vref_training)
2390
{
2391
char ib_vref_dq_byte0_icr = (EMC(EMC_PMACRO_IB_VREF_DQ_0) & 0x7F) + (mtc_table_entry->save_restore_mod_regs[0] & 0x7F);
2392
if (mtc_table_entry->save_restore_mod_regs[0] & 0x80000000) // < 0 check.
2393
ib_vref_dq_byte0_icr = (EMC(EMC_PMACRO_IB_VREF_DQ_0) & 0x7F) - (mtc_table_entry->save_restore_mod_regs[0] & 0x7F);
2394
2395
char ib_vref_dq_byte1_icr = ((EMC(EMC_PMACRO_IB_VREF_DQ_0) >> 8) & 0x7F) + (mtc_table_entry->save_restore_mod_regs[1] & 0x7F);
2396
if (mtc_table_entry->save_restore_mod_regs[1] & 0x80000000)
2397
ib_vref_dq_byte1_icr = ((EMC(EMC_PMACRO_IB_VREF_DQ_0) >> 8) & 0x7F) - (mtc_table_entry->save_restore_mod_regs[1] & 0x7F);
2398
2399
char ib_vref_dq_byte2_icr = ((EMC(EMC_PMACRO_IB_VREF_DQ_0) >> 16) & 0x7F) + (mtc_table_entry->save_restore_mod_regs[2] & 0x7F);
2400
if (mtc_table_entry->save_restore_mod_regs[2] & 0x80000000)
2401
ib_vref_dq_byte2_icr = ((EMC(EMC_PMACRO_IB_VREF_DQ_0) >> 16) & 0x7F) - (mtc_table_entry->save_restore_mod_regs[2] & 0x7F);
2402
2403
char ib_vref_dq_byte3_icr = ((EMC(EMC_PMACRO_IB_VREF_DQ_0) >> 24) & 0x7F) + (mtc_table_entry->save_restore_mod_regs[3] & 0x7F);
2404
if (mtc_table_entry->save_restore_mod_regs[3] & 0x80000000)
2405
ib_vref_dq_byte3_icr = ((EMC(EMC_PMACRO_IB_VREF_DQ_0) >> 24) & 0x7F) - (mtc_table_entry->save_restore_mod_regs[3] & 0x7F);
2406
2407
mtc_table_entry->trim_regs.emc_pmacro_ib_vref_dq_0 =
2408
((ib_vref_dq_byte0_icr & 0x7F)
2409
| (ib_vref_dq_byte1_icr & 0x7F) << 8)
2410
| ((ib_vref_dq_byte2_icr & 0x7F) << 16)
2411
| ((ib_vref_dq_byte3_icr & 0x7F) << 24);
2412
2413
char ib_vref_dq_byte4_icr = (EMC(EMC_PMACRO_IB_VREF_DQ_1) & 0x7F) + (mtc_table_entry->save_restore_mod_regs[4] & 0x7F);
2414
if (mtc_table_entry->save_restore_mod_regs[4] & 0x80000000)
2415
ib_vref_dq_byte4_icr = (EMC(EMC_PMACRO_IB_VREF_DQ_1) & 0x7F) - (mtc_table_entry->save_restore_mod_regs[4] & 0x7F);
2416
2417
char ib_vref_dq_byte5_icr = ((EMC(EMC_PMACRO_IB_VREF_DQ_1) >> 8) & 0x7F) + (mtc_table_entry->save_restore_mod_regs[5] & 0x7F);
2418
if (mtc_table_entry->save_restore_mod_regs[5] & 0x80000000)
2419
ib_vref_dq_byte5_icr = ((EMC(EMC_PMACRO_IB_VREF_DQ_1) >> 8) & 0x7F) - (mtc_table_entry->save_restore_mod_regs[5] & 0x7F);
2420
2421
char ib_vref_dq_byte6_icr = ((EMC(EMC_PMACRO_IB_VREF_DQ_1) >> 16) & 0x7F) + (mtc_table_entry->save_restore_mod_regs[6] & 0x7F);
2422
if (mtc_table_entry->save_restore_mod_regs[6] & 0x80000000)
2423
ib_vref_dq_byte6_icr = ((EMC(EMC_PMACRO_IB_VREF_DQ_1) >> 16) & 0x7F) - (mtc_table_entry->save_restore_mod_regs[6] & 0x7F);
2424
2425
char ib_vref_dq_byte7_icr = ((EMC(EMC_PMACRO_IB_VREF_DQ_1) >> 24) & 0x7F) + (mtc_table_entry->save_restore_mod_regs[7] & 0x7F);
2426
if (mtc_table_entry->save_restore_mod_regs[7] & 0x80000000)
2427
ib_vref_dq_byte7_icr = ((EMC(EMC_PMACRO_IB_VREF_DQ_1) >> 24) & 0x7F) - (mtc_table_entry->save_restore_mod_regs[7] & 0x7F);
2428
2429
mtc_table_entry->trim_regs.emc_pmacro_ib_vref_dq_1 =
2430
((ib_vref_dq_byte4_icr & 0x7F)
2431
| (ib_vref_dq_byte5_icr & 0x7F) << 8)
2432
| ((ib_vref_dq_byte6_icr & 0x7F) << 16)
2433
| ((ib_vref_dq_byte7_icr & 0x7F) << 24);
2434
}
2435
}
2436
2437
if (needs_wr_training)
2438
{
2439
mtc_table_entry->trim_perch_regs.emc0_data_brlshft_0 = EMC_CH0(EMC_DATA_BRLSHFT_0);
2440
mtc_table_entry->trim_perch_regs.emc1_data_brlshft_0 = channel1_enabled ? EMC_CH1(EMC_DATA_BRLSHFT_0) : 0;
2441
2442
if (dram_dev_num == TWO_RANK)
2443
{
2444
mtc_table_entry->trim_perch_regs.emc0_data_brlshft_1 = EMC_CH0(EMC_DATA_BRLSHFT_1);
2445
mtc_table_entry->trim_perch_regs.emc1_data_brlshft_1 = channel1_enabled ? EMC_CH1(EMC_DATA_BRLSHFT_1) : 0;
2446
}
2447
2448
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_long_dq_rank0_0 = EMC_CH0(EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_0);
2449
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_long_dq_rank0_1 = EMC_CH0(EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_1);
2450
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_long_dq_rank0_2 = channel1_enabled ? EMC_CH1(EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_2) : 0;
2451
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_long_dq_rank0_3 = channel1_enabled ? EMC_CH1(EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_3) : 0;
2452
2453
if (dram_dev_num == TWO_RANK)
2454
{
2455
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_long_dq_rank1_0 = EMC_CH0(EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_0);
2456
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_long_dq_rank1_1 = EMC_CH0(EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_1);
2457
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_long_dq_rank1_2 = channel1_enabled ? EMC_CH1(EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_2) : 0;
2458
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_long_dq_rank1_3 = channel1_enabled ? EMC_CH1(EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_3) : 0;
2459
}
2460
2461
if (needs_training_in_self_refresh)
2462
{
2463
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank0_byte0_0 = EMC_CH0(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE0_0);
2464
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank0_byte0_1 = EMC_CH0(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE0_1);
2465
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank0_byte0_2 = EMC_CH0(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE0_2);
2466
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank0_byte1_0 = EMC_CH0(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE1_0);
2467
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank0_byte1_1 = EMC_CH0(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE1_1);
2468
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank0_byte1_2 = EMC_CH0(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE1_2);
2469
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank0_byte2_0 = EMC_CH0(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE2_0);
2470
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank0_byte2_1 = EMC_CH0(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE2_1);
2471
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank0_byte2_2 = EMC_CH0(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE2_2);
2472
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank0_byte3_0 = EMC_CH0(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE3_0);
2473
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank0_byte3_1 = EMC_CH0(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE3_1);
2474
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank0_byte3_2 = EMC_CH0(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE3_2);
2475
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank0_byte4_0 = channel1_enabled ? EMC_CH1(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE4_0) : 0;
2476
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank0_byte4_1 = channel1_enabled ? EMC_CH1(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE4_1) : 0;
2477
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank0_byte4_2 = channel1_enabled ? EMC_CH1(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE4_2) : 0;
2478
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank0_byte5_0 = channel1_enabled ? EMC_CH1(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE5_0) : 0;
2479
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank0_byte5_1 = channel1_enabled ? EMC_CH1(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE5_1) : 0;
2480
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank0_byte5_2 = channel1_enabled ? EMC_CH1(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE5_2) : 0;
2481
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank0_byte6_0 = channel1_enabled ? EMC_CH1(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE6_0) : 0;
2482
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank0_byte6_1 = channel1_enabled ? EMC_CH1(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE6_1) : 0;
2483
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank0_byte6_2 = channel1_enabled ? EMC_CH1(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE6_2) : 0;
2484
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank0_byte7_0 = channel1_enabled ? EMC_CH1(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE7_0) : 0;
2485
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank0_byte7_1 = channel1_enabled ? EMC_CH1(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE7_1) : 0;
2486
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank0_byte7_2 = channel1_enabled ? EMC_CH1(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK0_BYTE7_2) : 0;
2487
2488
if (dram_dev_num == TWO_RANK)
2489
{
2490
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank1_byte0_0 = EMC_CH0(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE0_0);
2491
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank1_byte0_1 = EMC_CH0(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE0_1);
2492
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank1_byte0_2 = EMC_CH0(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE0_2);
2493
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank1_byte1_0 = EMC_CH0(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE1_0);
2494
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank1_byte1_1 = EMC_CH0(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE1_1);
2495
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank1_byte1_2 = EMC_CH0(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE1_2);
2496
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank1_byte2_0 = EMC_CH0(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE2_0);
2497
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank1_byte2_1 = EMC_CH0(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE2_1);
2498
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank1_byte2_2 = EMC_CH0(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE2_2);
2499
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank1_byte3_0 = EMC_CH0(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE3_0);
2500
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank1_byte3_1 = EMC_CH0(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE3_1);
2501
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank1_byte3_2 = EMC_CH0(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE3_2);
2502
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank1_byte4_0 = channel1_enabled ? EMC_CH1(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE4_0) : 0;
2503
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank1_byte4_1 = channel1_enabled ? EMC_CH1(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE4_1) : 0;
2504
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank1_byte4_2 = channel1_enabled ? EMC_CH1(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE4_2) : 0;
2505
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank1_byte5_0 = channel1_enabled ? EMC_CH1(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE5_0) : 0;
2506
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank1_byte5_1 = channel1_enabled ? EMC_CH1(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE5_1) : 0;
2507
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank1_byte5_2 = channel1_enabled ? EMC_CH1(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE5_2) : 0;
2508
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank1_byte6_0 = channel1_enabled ? EMC_CH1(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE6_0) : 0;
2509
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank1_byte6_1 = channel1_enabled ? EMC_CH1(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE6_1) : 0;
2510
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank1_byte6_2 = channel1_enabled ? EMC_CH1(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE6_2) : 0;
2511
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank1_byte7_0 = channel1_enabled ? EMC_CH1(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE7_0) : 0;
2512
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank1_byte7_1 = channel1_enabled ? EMC_CH1(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE7_1) : 0;
2513
mtc_table_entry->trim_regs.emc_pmacro_ob_ddll_short_dq_rank1_byte7_2 = channel1_enabled ? EMC_CH1(EMC_PMACRO_OB_DDLL_SHORT_DQ_RANK1_BYTE7_2) : 0;
2514
}
2515
}
2516
2517
if (needs_wr_vref_training) // mode 12/13 (MRW).
2518
{
2519
u32 emc1_ranks_sub_partitions = 0;
2520
emc1_ranks_sub_partitions = channel1_enabled ? EMC_CH1(EMC_TRAINING_OPT_DQ_OB_VREF) : 0;
2521
2522
u8 emc0_ib_vref_dq_byte8_modded_plus = mtc_table_entry->save_restore_mod_regs[8] + EMC_CH0(EMC_TRAINING_OPT_DQ_OB_VREF);
2523
if (mtc_table_entry->save_restore_mod_regs[8] & 0x80000000) // < 0 check.
2524
emc0_ib_vref_dq_byte8_modded_plus = EMC_CH0(EMC_TRAINING_OPT_DQ_OB_VREF) - mtc_table_entry->save_restore_mod_regs[8];
2525
2526
u8 emc0_mrw12_op_sp1 = ((EMC_CH0(EMC_TRAINING_OPT_DQ_OB_VREF) & 0xFFFF) >> 8) + mtc_table_entry->save_restore_mod_regs[9];
2527
if (mtc_table_entry->save_restore_mod_regs[9] & 0x80000000)
2528
emc0_mrw12_op_sp1 = ((EMC_CH0(EMC_TRAINING_OPT_DQ_OB_VREF) & 0xFFFF) >> 8) - mtc_table_entry->save_restore_mod_regs[9];
2529
2530
u8 emc0_mrw13_op_sp0 = ((EMC_CH0(EMC_TRAINING_OPT_DQ_OB_VREF) >> 16) & 0xFF) + mtc_table_entry->save_restore_mod_regs[8];
2531
if (mtc_table_entry->save_restore_mod_regs[8] & 0x80000000)
2532
emc0_mrw13_op_sp0 = ((EMC_CH0(EMC_TRAINING_OPT_DQ_OB_VREF) >> 16) & 0xFF) - mtc_table_entry->save_restore_mod_regs[8];
2533
2534
u8 emc0_ib_vref_dq_byte9_modded_a_plus = mtc_table_entry->save_restore_mod_regs[9] + (EMC_CH0(EMC_TRAINING_OPT_DQ_OB_VREF) >> 24);
2535
if (mtc_table_entry->save_restore_mod_regs[9] & 0x80000000)
2536
emc0_ib_vref_dq_byte9_modded_a_plus = (EMC_CH0(EMC_TRAINING_OPT_DQ_OB_VREF) >> 24) - (u8)mtc_table_entry->save_restore_mod_regs[9];
2537
2538
u8 emc0_ib_vref_dq_byte10_modded_plus = emc1_ranks_sub_partitions + mtc_table_entry->save_restore_mod_regs[10];
2539
if (mtc_table_entry->save_restore_mod_regs[10] & 0x80000000)
2540
emc0_ib_vref_dq_byte10_modded_plus = emc1_ranks_sub_partitions - mtc_table_entry->save_restore_mod_regs[10];
2541
2542
u8 emc0_ib_vref_dq_byte11_modded_plus = ((emc1_ranks_sub_partitions & 0xFFFF) >> 8) + mtc_table_entry->save_restore_mod_regs[11];
2543
if (mtc_table_entry->save_restore_mod_regs[11] & 0x80000000)
2544
emc0_ib_vref_dq_byte11_modded_plus = ((emc1_ranks_sub_partitions & 0xFFFF) >> 8) - mtc_table_entry->save_restore_mod_regs[11];
2545
2546
u8 emc1_mrw13_op_sp0 = ((emc1_ranks_sub_partitions >> 16) & 0xFF) + mtc_table_entry->save_restore_mod_regs[10];
2547
if (mtc_table_entry->save_restore_mod_regs[10] & 0x80000000)
2548
emc1_mrw13_op_sp0 = ((emc1_ranks_sub_partitions >> 16) & 0xFF) - mtc_table_entry->save_restore_mod_regs[10];
2549
2550
u8 emc1_mrw13_op_sp1 = (emc1_ranks_sub_partitions >> 24) + mtc_table_entry->save_restore_mod_regs[11];
2551
if (mtc_table_entry->save_restore_mod_regs[11] & 0x80000000)
2552
emc1_mrw13_op_sp1 = (emc1_ranks_sub_partitions >> 24) - mtc_table_entry->save_restore_mod_regs[11];
2553
2554
u32 mr13_dev_ext_cnt_sp_addr = 0xC80E0000;
2555
if (dram_dev_num == TWO_RANK)
2556
mr13_dev_ext_cnt_sp_addr = 0x480E0000;
2557
2558
mtc_table_entry->burst_reg_per_ch.emc1_mrw12 = (u8)emc0_ib_vref_dq_byte10_modded_plus | 0x880E0000 | (emc0_ib_vref_dq_byte11_modded_plus << 8);
2559
mtc_table_entry->burst_reg_per_ch.emc0_mrw12 = emc0_ib_vref_dq_byte8_modded_plus | 0x880E0000 | (emc0_mrw12_op_sp1 << 8);
2560
mtc_table_entry->burst_reg_per_ch.emc0_mrw13 = emc0_ib_vref_dq_byte9_modded_a_plus << 8 | emc0_mrw13_op_sp0 | mr13_dev_ext_cnt_sp_addr;
2561
mtc_table_entry->burst_reg_per_ch.emc1_mrw13 = (emc1_mrw13_op_sp1 << 8) | emc1_mrw13_op_sp0 | mr13_dev_ext_cnt_sp_addr;
2562
}
2563
}
2564
}
2565
2566
static u32 _minerva_set_clock(emc_table_t *src_emc_entry, emc_table_t *dst_emc_entry, u32 needs_training, u32 selected_clk_src_emc)
2567
{
2568
u32 emc_dbg_o;
2569
u32 emc_pin_o;
2570
u32 emc_cfg_pipe_clk_o;
2571
u32 emc_sel_dpd_ctrl;
2572
u32 emc_cfg;
2573
u32 emc_dbg_val;
2574
u32 emc_zq_cal = 0;
2575
u32 ramp_up_wait;
2576
u32 ramp_down_wait;
2577
u32 bg_regulator_mode_change;
2578
u32 mr13_flip_fspop;
2579
u32 mr13_flip_fspwr;
2580
u32 mr13_catr_enable;
2581
2582
/* needs_training flags */
2583
/*
2584
| bit | Description |
2585
|-----|----------------------------------|
2586
| 0 | Needs CA training |
2587
| 1 | Needs CA_VREF training |
2588
| 2 | Needs QUSE training |
2589
| 3 | Needs QUSE_VREF training |
2590
| 4 | Needs WR training |
2591
| 5 | Needs WR_VREF training |
2592
| 6 | Needs RD training |
2593
| 7 | Needs RD_VREF training |
2594
| 8 | Needs SWAP_RANK training |
2595
| 9 | Needs IN_SELF_REFRESH training |
2596
*/
2597
2598
bool compensate_trimmer_applicable = false;
2599
bool needs_ca_combo_training = !!(needs_training & NEEDS_TRAINING_CA_COMBO);
2600
bool needs_tristate_training = !!(needs_training & NEEDS_TRISTATE_TRAINING);
2601
2602
bool needs_ca_training = !!(needs_training & NEEDS_TRAINING_CA);
2603
bool needs_ca_vref_training = !!(needs_training & NEEDS_TRAINING_CA_VREF);
2604
bool needs_quse_training = !!(needs_training & NEEDS_TRAINING_QUSE);
2605
bool needs_quse_vref_training = !!(needs_training & NEEDS_TRAINING_QUSE_VREF);
2606
bool needs_wr_training = !!(needs_training & NEEDS_TRAINING_WR);
2607
bool needs_wr_vref_training = !!(needs_training & NEEDS_TRAINING_WR_VREF);
2608
bool needs_rd_training = !!(needs_training & NEEDS_TRAINING_RD);
2609
bool needs_rd_vref_training = !!(needs_training & NEEDS_TRAINING_RD_VREF);
2610
bool needs_swap_rank_training = !!(needs_training & NEEDS_TRAINING_SWAP_RANK);
2611
2612
bool zcal_resistor_shared = (src_emc_entry->burst_regs.emc_zcal_wait_cnt >> 31) & 1;
2613
bool enable_bg_regulator = (dst_emc_entry->burst_regs.emc_pmacro_bg_bias_ctrl_0 & 1) ^ 1;
2614
bool channel1_enabled = (src_emc_entry->burst_regs.emc_fbio_cfg7 >> 2) & 1;
2615
u32 dram_type = EMC(EMC_FBIO_CFG5) & 3;
2616
u32 dram_dev_num = (MC(MC_EMEM_ADR_CFG) & 1) + 1;
2617
2618
u32 src_clock_period = 1000000000 / src_emc_entry->rate_khz; // In picoseconds.
2619
u32 dst_clock_period = 1000000000 / dst_emc_entry->rate_khz; // In picoseconds.
2620
2621
// Get current FSP op/write value.
2622
bool enable_fsp_opwr = !(EMC(EMC_MRW3) & 0xC0);
2623
2624
if (dram_type != DRAM_TYPE_LPDDR4)
2625
{
2626
EPRINTF("MTC Error: DRAM is not LPDDR4");
2627
return 5;
2628
}
2629
2630
u32 tFC_lpddr4 = dst_emc_entry->dram_timings.t_fc_lpddr4 * 1000;
2631
u32 tZQCAL_lpddr4 = 1000000;
2632
if (dst_clock_period <= 2000)
2633
tZQCAL_lpddr4 -= tFC_lpddr4;
2634
s32 tZQCAL_lpddr4_fc_adj = tZQCAL_lpddr4 / dst_clock_period;
2635
2636
(void)EMC(EMC_CFG);
2637
(void)EMC(EMC_AUTO_CAL_CONFIG);
2638
2639
// Step 1 - Pre DVFS SW sequence.
2640
EPRINTF("Step 1");
2641
emc_dbg_o = EMC(EMC_DBG);
2642
emc_pin_o = EMC(EMC_PIN);
2643
emc_cfg = dst_emc_entry->burst_regs.emc_cfg & 0xFFFFFFF;
2644
emc_sel_dpd_ctrl = dst_emc_entry->emc_sel_dpd_ctrl & 0xFFFFFEC3;
2645
emc_cfg_pipe_clk_o = EMC(EMC_CFG_PIPE_CLK);
2646
_digital_dll_disable();
2647
2648
// Step 1.2 - Disable AUTOCAL temporarily.
2649
EPRINTF("Step 1.2");
2650
EMC(EMC_AUTO_CAL_CONFIG) = (dst_emc_entry->emc_auto_cal_config & 0x7FFFF9FF) | 0x600;
2651
(void)EMC(EMC_AUTO_CAL_CONFIG);
2652
2653
// Step 1.3 - Disable other power features.
2654
EPRINTF("Step 1.3");
2655
EMC(EMC_DBG) = emc_dbg_o | 2;
2656
EMC(EMC_CFG) = emc_cfg;
2657
EMC(EMC_SEL_DPD_CTRL) = emc_sel_dpd_ctrl;
2658
EMC(EMC_DBG) = emc_dbg_o;
2659
2660
if (!needs_tristate_training && dst_emc_entry->periodic_training)
2661
{
2662
if (dram_dev_num == TWO_RANK)
2663
{
2664
_wait_emc_status(EMC_EMC_STATUS, IN_POWERDOWN_BOTH_MASK, false, EMC_CHANNEL0);
2665
if (channel1_enabled)
2666
_wait_emc_status(EMC_EMC_STATUS, IN_POWERDOWN_BOTH_MASK, false, EMC_CHANNEL1);
2667
}
2668
else
2669
{
2670
_wait_emc_status(EMC_EMC_STATUS, IN_POWERDOWN_1DEV_MASK, false, EMC_CHANNEL0);
2671
if (channel1_enabled)
2672
_wait_emc_status(EMC_EMC_STATUS, IN_POWERDOWN_1DEV_MASK, false, EMC_CHANNEL1);
2673
}
2674
2675
_wait_emc_status(EMC_EMC_STATUS, IN_SELF_REFRESH_MASK, false, EMC_CHANNEL0);
2676
if (channel1_enabled)
2677
_wait_emc_status(EMC_EMC_STATUS, IN_SELF_REFRESH_MASK, false, EMC_CHANNEL1);
2678
2679
// Reset clock tree delays.
2680
dst_emc_entry->current_dram_clktree_c0d0u0 = dst_emc_entry->trained_dram_clktree_c0d0u0;
2681
dst_emc_entry->current_dram_clktree_c0d0u1 = dst_emc_entry->trained_dram_clktree_c0d0u1;
2682
dst_emc_entry->current_dram_clktree_c0d1u0 = dst_emc_entry->trained_dram_clktree_c0d1u0;
2683
dst_emc_entry->current_dram_clktree_c0d1u1 = dst_emc_entry->trained_dram_clktree_c0d1u1;
2684
dst_emc_entry->current_dram_clktree_c1d0u0 = dst_emc_entry->trained_dram_clktree_c1d0u0;
2685
dst_emc_entry->current_dram_clktree_c1d0u1 = dst_emc_entry->trained_dram_clktree_c1d0u1;
2686
dst_emc_entry->current_dram_clktree_c1d1u0 = dst_emc_entry->trained_dram_clktree_c1d1u0;
2687
dst_emc_entry->current_dram_clktree_c1d1u1 = dst_emc_entry->trained_dram_clktree_c1d1u1;
2688
2689
u32 adelta = _minerva_periodic_compensation_handler(src_emc_entry, dst_emc_entry, dram_dev_num, channel1_enabled, DVFS_SEQUENCE);
2690
2691
if (((dst_emc_entry->rate_khz / 1000) * 128) * adelta / 1000000 > dst_emc_entry->tree_margin)
2692
compensate_trimmer_applicable = true;
2693
}
2694
2695
EMC(EMC_INTSTATUS) = CLKCHANGE_COMPLETE_INT;
2696
EMC(EMC_DBG) = emc_dbg_o | 2;
2697
EMC(EMC_CFG) = emc_cfg;
2698
EMC(EMC_SEL_DPD_CTRL) = emc_sel_dpd_ctrl;
2699
EMC(EMC_CFG_PIPE_CLK) = emc_cfg_pipe_clk_o | 1; // CLK_ALWAYS_ON.
2700
EMC(EMC_FDPD_CTRL_CMD_NO_RAMP) = dst_emc_entry->emc_fdpd_ctrl_cmd_no_ramp & 0xFFFFFFFE;
2701
2702
bg_regulator_mode_change = src_emc_entry->burst_regs.emc_pmacro_bg_bias_ctrl_0 ^ dst_emc_entry->burst_regs.emc_pmacro_bg_bias_ctrl_0;
2703
bg_regulator_mode_change = (bg_regulator_mode_change | (bg_regulator_mode_change >> 2)) & 1;
2704
2705
if (bg_regulator_mode_change)
2706
{
2707
EMC(EMC_DBG) = emc_dbg_o | 2;
2708
if (enable_bg_regulator)
2709
EMC(EMC_PMACRO_BG_BIAS_CTRL_0) = src_emc_entry->burst_regs.emc_pmacro_bg_bias_ctrl_0 & 0xFFFFFFFE;
2710
else
2711
EMC(EMC_PMACRO_BG_BIAS_CTRL_0) = src_emc_entry->burst_regs.emc_pmacro_bg_bias_ctrl_0 & 0xFFFFFFFB;
2712
}
2713
2714
// Check if we need to turn on VREF generator.
2715
if ((!(src_emc_entry->burst_regs.emc_pmacro_data_pad_tx_ctrl & 0x100)
2716
&& (dst_emc_entry->burst_regs.emc_pmacro_data_pad_tx_ctrl & 0x100))
2717
|| (!(src_emc_entry->burst_regs.emc_pmacro_data_pad_tx_ctrl & 1)
2718
&& (dst_emc_entry->burst_regs.emc_pmacro_data_pad_tx_ctrl & 1)))
2719
{
2720
EMC(EMC_PMACRO_DATA_PAD_TX_CTRL) =
2721
(((dst_emc_entry->burst_regs.emc_pmacro_data_pad_tx_ctrl & 1) | (src_emc_entry->burst_regs.emc_pmacro_data_pad_tx_ctrl & 0xFFFFFFFE)) & 0xFFFFFEFF)
2722
| (((dst_emc_entry->burst_regs.emc_pmacro_data_pad_tx_ctrl >> 8) & 0x1) << 8);
2723
}
2724
2725
_usleep(1);
2726
2727
EMC(EMC_DBG) = emc_dbg_o;
2728
2729
// Step 2 - Prelock the DLL.
2730
EPRINTF("Step 2");
2731
if (dst_emc_entry->burst_regs.emc_cfg_dig_dll & 1)
2732
_digital_dll_prelock(dst_emc_entry, needs_tristate_training, selected_clk_src_emc); // Prelock enabled for target frequency.
2733
else
2734
{
2735
_change_dll_src(dst_emc_entry, selected_clk_src_emc);
2736
_digital_dll_disable(); // Disabling DLL for target frequency.
2737
}
2738
2739
// Step 3 - Prepare autocal for the clock change.
2740
EPRINTF("Step 3");
2741
EMC(EMC_AUTO_CAL_CONFIG) = (dst_emc_entry->emc_auto_cal_config & 0x7FFFF9FF) | 0x600;
2742
EMC(EMC_DBG) = emc_dbg_o | 2;
2743
EMC(EMC_AUTO_CAL_CONFIG2) = dst_emc_entry->emc_auto_cal_config2;
2744
EMC(EMC_AUTO_CAL_CONFIG3) = dst_emc_entry->emc_auto_cal_config3;
2745
EMC(EMC_AUTO_CAL_CONFIG4) = dst_emc_entry->emc_auto_cal_config4;
2746
EMC(EMC_AUTO_CAL_CONFIG5) = dst_emc_entry->emc_auto_cal_config5;
2747
EMC(EMC_AUTO_CAL_CONFIG6) = dst_emc_entry->emc_auto_cal_config6;
2748
EMC(EMC_AUTO_CAL_CONFIG7) = dst_emc_entry->emc_auto_cal_config7;
2749
EMC(EMC_AUTO_CAL_CONFIG8) = dst_emc_entry->emc_auto_cal_config8;
2750
EMC(EMC_DBG) = emc_dbg_o;
2751
EMC(EMC_AUTO_CAL_CONFIG) = (dst_emc_entry->emc_auto_cal_config & 0x7FFFF9FE) | 0x601;
2752
2753
// Step 4 - Update EMC_CFG.
2754
EPRINTF("Step 4");
2755
if (src_clock_period <= 50000)
2756
EMC(EMC_CFG_2) = dst_emc_entry->emc_cfg_2;
2757
else
2758
_ccfifo_write(EMC_SELF_REF, 1, 0);
2759
2760
// Step 5 - Prepare reference variables for ZQCAL regs.
2761
EPRINTF("Step 5");
2762
// u32 zq_wait_long = 0;
2763
// u32 zq_wait_short = 0;
2764
2765
// zq_wait_long = _fceil(1000.0f / dst_clock_period);
2766
2767
// Step 7 - Bug 200024907 - Patch RP R2P.
2768
EPRINTF("Step 7");
2769
if (needs_ca_combo_training && dram_dev_num == TWO_RANK)
2770
EMC(EMC_PIN) = 0x107;
2771
2772
u32 R2P_war = 0;
2773
u32 TRPab_war = 0;
2774
u32 RP_war = 0;
2775
u32 W2P_war = 0;
2776
2777
u32 nRTP = 8; // <= 1066MHz.
2778
if ( src_clock_period < 1000000 / 266
2779
&& src_clock_period < 1000000 / 533
2780
&& src_clock_period < 1000000 / 800
2781
&& src_clock_period < 1000000 / 1066 )
2782
nRTP = 10; // 1067MHz < x <= 1333MHz.
2783
if (src_clock_period < 1000000 / 1333)
2784
nRTP = 12; // 1333MHz < x <= 1600MHz.
2785
if (src_clock_period < 1000000 / 1600)
2786
nRTP = 14; // 1600MHz < x <= 1866MHz.
2787
if (src_clock_period < 1000000 / 1866)
2788
nRTP = 16; // > 1866MHz
2789
2790
u32 tRPST = (src_emc_entry->emc_mrw >> 7) & 1;
2791
2792
u32 deltaTWATM = div_o3(7500, src_clock_period);
2793
if (deltaTWATM < 8)
2794
deltaTWATM = 8;
2795
2796
u32 tRTM = src_emc_entry->dram_timings.rl + div_o3(3600, src_clock_period) + deltaTWATM + tRPST + nRTP + 1;
2797
2798
if (tRTM <= src_emc_entry->burst_regs.emc_rp + src_emc_entry->burst_regs.emc_r2p)
2799
{
2800
TRPab_war = src_emc_entry->burst_regs.emc_trpab;
2801
R2P_war = src_emc_entry->burst_regs.emc_r2p;
2802
RP_war = src_emc_entry->burst_regs.emc_rp;
2803
}
2804
else
2805
{
2806
R2P_war = tRTM - src_emc_entry->burst_regs.emc_rp;
2807
TRPab_war = src_emc_entry->burst_regs.emc_trpab;
2808
RP_war = src_emc_entry->burst_regs.emc_rp;
2809
if (R2P_war > 63)
2810
{
2811
RP_war = tRTM - 63;
2812
R2P_war = 63;
2813
if (src_emc_entry->burst_regs.emc_trpab < tRTM - 63)
2814
TRPab_war = tRTM - 63;
2815
else
2816
TRPab_war = src_emc_entry->burst_regs.emc_trpab;
2817
}
2818
}
2819
2820
if (RP_war >= deltaTWATM)
2821
W2P_war = src_emc_entry->burst_regs.emc_w2p;
2822
else
2823
{
2824
u32 W2P_war_temp = deltaTWATM + src_emc_entry->burst_regs.emc_w2p;
2825
W2P_war = W2P_war_temp - RP_war;
2826
if (W2P_war > 63)
2827
{
2828
RP_war = W2P_war_temp - 63;
2829
W2P_war = 63;
2830
if (TRPab_war < RP_war)
2831
TRPab_war = RP_war;
2832
}
2833
}
2834
2835
if ( src_emc_entry->burst_regs.emc_w2p != W2P_war
2836
|| src_emc_entry->burst_regs.emc_rp != RP_war
2837
|| src_emc_entry->burst_regs.emc_r2p != R2P_war
2838
|| src_emc_entry->burst_regs.emc_trpab != TRPab_war)
2839
{
2840
EMC(EMC_DBG) = emc_dbg_o | 2;
2841
EMC(EMC_RP) = RP_war;
2842
EMC(EMC_R2P) = R2P_war;
2843
EMC(EMC_W2P) = W2P_war;
2844
EMC(EMC_TRPAB) = TRPab_war;
2845
EMC(EMC_DBG) = emc_dbg_o;
2846
(void)EMC(EMC_TRPAB);
2847
_usleep(1);
2848
}
2849
2850
// Step 7.2 - Program FSP reference registers and send MRWs to new FSPWR.
2851
EPRINTF("Step 7.2");
2852
if (enable_fsp_opwr)
2853
{
2854
mr13_flip_fspop = dst_emc_entry->emc_mrw3 | 0xC0;
2855
mr13_flip_fspwr = (dst_emc_entry->emc_mrw3 & 0xFFFFFF3F) | 0x40;
2856
}
2857
else
2858
{
2859
mr13_flip_fspop = dst_emc_entry->emc_mrw3 & 0xFFFFFF3F;
2860
mr13_flip_fspwr = mr13_flip_fspop | 0x80;
2861
}
2862
2863
if (dram_dev_num == TWO_RANK)
2864
{
2865
if (needs_swap_rank_training)
2866
mr13_catr_enable = (mr13_flip_fspwr & 0x3FFFFFFF) | 0x40000001;
2867
else
2868
mr13_catr_enable = (mr13_flip_fspwr & 0x3FFFFFFF) | 0x80000001;
2869
2870
if (needs_ca_combo_training)
2871
{
2872
if (needs_swap_rank_training)
2873
mr13_flip_fspop = (mr13_flip_fspop & 0x3FFFFFFF) | 0x80000000;
2874
else
2875
mr13_flip_fspop = (mr13_flip_fspop & 0x3FFFFFFF) | 0x40000000;
2876
}
2877
}
2878
else
2879
mr13_catr_enable = mr13_flip_fspwr | 1;
2880
2881
EMC(EMC_MRW3) = mr13_flip_fspwr;
2882
EMC(EMC_MRW) = dst_emc_entry->emc_mrw;
2883
EMC(EMC_MRW2) = dst_emc_entry->emc_mrw2;
2884
2885
// Step 8 - Program the shadow registers.
2886
EPRINTF("Step 8");
2887
// Writing burst_regs.
2888
u32 reg_addr = 0;
2889
u32 reg_val = 0;
2890
u32 reg_check = false;
2891
burst_regs_table_t *dst_burst_regs = (burst_regs_table_t *)&dst_emc_entry->burst_regs;
2892
2893
for (u32 i = 0; dst_emc_entry->num_burst > i; i++)
2894
{
2895
reg_check = false;
2896
reg_addr = burst_regs_emc_addr_table[i];
2897
if (needs_tristate_training)
2898
{
2899
if (needs_ca_combo_training)
2900
reg_val = dst_burst_regs->shadow_regs_ca_train[i];
2901
else if (needs_training & NEEDS_TRAINING_QUSE_COMBO)
2902
reg_val = dst_burst_regs->shadow_regs_quse_train[i];
2903
else if (needs_training & (NEEDS_TRAINING_WR_COMBO | NEEDS_TRAINING_RD_COMBO))
2904
reg_val = dst_burst_regs->shadow_regs_rdwr_train[i];
2905
else
2906
continue;
2907
}
2908
else
2909
reg_val = dst_burst_regs->burst_regs[i];
2910
2911
if ((reg_addr & 0xFFF7) != EMC_MRW6
2912
&& (reg_addr - EMC_MRW7) & 0xFFFF7
2913
//&& (reg_addr & 0xEFF7) != 0x34B4 // EMC_MRW10.
2914
&& ((reg_addr & 0xEFFF) - 0x34B8) & 0xFFF7 // EMC_MRW11.
2915
&& reg_addr != EMC_TRAINING_CTRL
2916
&& reg_addr != EMC_MRW14
2917
&& reg_addr != EMC_MRW15)
2918
{
2919
reg_check = true;
2920
}
2921
2922
if (reg_check && reg_addr == EMC_CFG)
2923
{
2924
reg_val &= 0xFFFFFFF;
2925
2926
EMC(reg_addr) = reg_val;
2927
continue;
2928
}
2929
2930
if (reg_addr != EMC_CFG)// EMC_CFG
2931
{
2932
if (reg_addr != EMC_ZCAL_INTERVAL)
2933
{
2934
switch ( reg_addr )
2935
{
2936
case EMC_PMACRO_AUTOCAL_CFG_COMMON:
2937
reg_val |= 0x10000;
2938
break;
2939
case EMC_PMACRO_DATA_PAD_TX_CTRL:
2940
reg_val &= 0xFEFEFDFD;
2941
break;
2942
case EMC_PMACRO_CMD_PAD_TX_CTRL:
2943
reg_val = (reg_val & 0xFAFEFDFD) | 0x4000000;
2944
break;
2945
case EMC_PMACRO_BRICK_CTRL_RFU1:
2946
reg_val &= 0xF800F800;
2947
break;
2948
case EMC_PMACRO_COMMON_PAD_TX_CTRL:
2949
reg_val &= 0xFFFFFFF0;
2950
break;
2951
case EMC_TRAINING_CTRL:
2952
reg_val |= needs_swap_rank_training << 14;// bit15 is TR_IN_SELF_REFRESH
2953
break;
2954
}
2955
}
2956
else
2957
reg_val = 0;
2958
}
2959
else
2960
reg_val &= 0xFFFFFFF;
2961
2962
EMC(reg_addr) = reg_val;
2963
}
2964
2965
if (needs_tristate_training)
2966
EMC(EMC_MRW) = (src_emc_entry->run_clocks & 0xFF) | 0x170000;
2967
else
2968
EMC(EMC_MRW) = (dst_emc_entry->run_clocks & 0xFF) | 0x170000;
2969
2970
// Writing burst_regs_per_ch.
2971
for (u32 i = 0; dst_emc_entry->num_burst_per_ch > i; i++)
2972
{
2973
reg_addr = burst_reg_per_ch_emc01_addr_table[i];
2974
if (reg_addr && (channel1_enabled || ((reg_addr - 0x4000) > 0xFFF)))
2975
{
2976
EMC(reg_addr) = dst_burst_regs->burst_reg_per_ch[i];
2977
}
2978
}
2979
2980
// Writing vref_regs.
2981
trim_regs_table_t *trim_regs_table = (trim_regs_table_t *)&dst_emc_entry->trim_regs;
2982
for (u32 i = 0; dst_emc_entry->vref_num > i; i++)
2983
{
2984
reg_addr = vref_perch_regs_emc01_addr_table[i];
2985
if (reg_addr && (channel1_enabled || (reg_addr - 0x4000) > 0xFFF))
2986
EMC(reg_addr) = trim_regs_table->vref_perch_regs[i];
2987
}
2988
2989
// Writing training mod regs.
2990
if (needs_tristate_training)
2991
{
2992
for (u32 i = 0; dst_emc_entry->training_mod_num > i; i++)
2993
{
2994
reg_addr = training_mod_regs_emc01_addr_table[i];
2995
if (reg_addr && (channel1_enabled || (reg_addr - 0x4000) > 0xFFF))
2996
EMC(reg_addr) = dst_emc_entry->training_mod_regs[i];
2997
}
2998
}
2999
3000
// Writing trim_regs
3001
for (u32 i = 0; dst_emc_entry->num_trim > i; i++)
3002
{
3003
reg_addr = trim_regs_emc_addr_table[i];
3004
if (reg_addr)
3005
{
3006
if (((reg_addr & 0xFFFFFFF3) == EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_0
3007
|| (reg_addr & 0xFFFFFFF3) == EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_0
3008
|| (reg_addr & 0xFFFFFFFB) == EMC_DATA_BRLSHFT_0)
3009
&& compensate_trimmer_applicable)
3010
{
3011
EMC(reg_addr) = _minerva_apply_periodic_compensation_trimmer(dst_emc_entry, reg_addr);
3012
}
3013
else
3014
EMC(reg_addr) = trim_regs_table->trim_regs[i];
3015
}
3016
}
3017
3018
// Writing trim_regs_per_ch
3019
reg_val = 0;
3020
for (u32 i = 0; dst_emc_entry->num_trim_per_ch > i; i++)
3021
{
3022
reg_addr = trim_perch_regs_emc01_addr_table[i];
3023
if (reg_addr && (channel1_enabled || reg_addr - 0x4000 > 0xFFF))
3024
{
3025
if (((reg_addr & 0xFFFFFFF3) == EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_0
3026
|| (reg_addr & 0xFFFFFFF3) == EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_0
3027
|| (reg_addr & 0xFFFFFFFB) == EMC_DATA_BRLSHFT_0)
3028
&& compensate_trimmer_applicable )
3029
{
3030
reg_val = _minerva_apply_periodic_compensation_trimmer(dst_emc_entry, reg_addr & 0xFFF);
3031
}
3032
else if (((reg_addr & 0xFFFFFFFB) == 0x3660
3033
|| (reg_addr & 0xFFFFFFDF) == 0x3648
3034
|| (reg_addr & 0xFFFFFFF7) == 0x3644
3035
|| reg_addr == 0x366C
3036
|| reg_addr == EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_0
3037
|| (reg_addr & 0xFFFFFFFB) == 0x3588)
3038
&& compensate_trimmer_applicable )
3039
{
3040
reg_val = _minerva_apply_periodic_compensation_trimmer(dst_emc_entry, reg_addr & 0xFFF);
3041
}
3042
else if (((reg_addr & 0xFFFFFFF3) == 0x4660
3043
|| (reg_addr & 0xFFFFFFF3) == 0x4640
3044
|| (reg_addr & 0xFFFFFFFB) == 0x4588)
3045
&& compensate_trimmer_applicable)
3046
{
3047
reg_val = _minerva_apply_periodic_compensation_trimmer(dst_emc_entry, reg_addr & 0xFFF);
3048
}
3049
else
3050
{
3051
reg_val = trim_regs_table->trim_perch_regs[i];
3052
}
3053
EMC(reg_addr) = reg_val;
3054
}
3055
}
3056
3057
if (needs_tristate_training)
3058
{
3059
// Check delta wrt previous values (save value if margin exceeds what is set in table).
3060
if (needs_wr_training && dst_emc_entry->periodic_training)
3061
_minerva_periodic_compensation_handler(src_emc_entry, dst_emc_entry, dram_dev_num, channel1_enabled, WRITE_TRAINING_SEQUENCE);
3062
}
3063
else
3064
{
3065
// Writing burst_mc_regs.
3066
for (u32 i = 0; dst_emc_entry->num_mc_regs > i; i++)
3067
MC(burst_mc_regs_addr_table[i]) = dst_emc_entry->burst_mc_regs[i];
3068
3069
// Writing la_scale_regs.
3070
if (dst_emc_entry->rate_khz < src_emc_entry->rate_khz)
3071
{
3072
for (u32 i = 0; dst_emc_entry->num_up_down > i; i++)
3073
MC(la_scale_regs_mc_addr_table[i]) = dst_emc_entry->la_scale_regs[i];
3074
}
3075
}
3076
3077
// Step 9 - LPDDR4.
3078
EPRINTF("Step 9");
3079
EMC(EMC_ZCAL_INTERVAL) = src_emc_entry->burst_regs.emc_zcal_interval & 0xFF000000;
3080
EMC(EMC_ZCAL_WAIT_CNT) = dst_emc_entry->burst_regs.emc_zcal_wait_cnt & 0xFFFFF800;
3081
EMC(EMC_DBG) = emc_dbg_o | 0x40000002;
3082
EMC(EMC_ZCAL_INTERVAL) = src_emc_entry->burst_regs.emc_zcal_interval & 0xFF000000;
3083
EMC(EMC_DBG) = emc_dbg_o;
3084
3085
if (needs_tristate_training)
3086
{
3087
EMC(EMC_DBG) = emc_dbg_o | 2;
3088
EMC(EMC_PMACRO_AUTOCAL_CFG_COMMON) = dst_emc_entry->burst_regs.emc_pmacro_autocal_cfg_common | 0x10000;
3089
3090
if (needs_ca_combo_training)
3091
EMC(EMC_FBIO_CFG5) = src_emc_entry->burst_regs.emc_fbio_cfg5 | 0x8000000;
3092
3093
EMC(EMC_DBG) = emc_dbg_o;
3094
3095
if (channel1_enabled)
3096
_ccfifo_write(EMC_CFG_SYNC, 0, 0);
3097
3098
_ccfifo_write(EMC_DBG, (emc_dbg_o & 0xF3FFFFFF) | 0x4000000, 0);
3099
}
3100
3101
// Step 10 - Self refresh
3102
EPRINTF("Step 10");
3103
_ccfifo_write(EMC_SELF_REF, 0x101, 0);
3104
3105
if (!needs_ca_combo_training && (dst_clock_period <= 2000))
3106
{
3107
_ccfifo_write(EMC_MRW3, mr13_flip_fspwr ^ 0x40, 0);
3108
_ccfifo_write(EMC_MRW6, (src_emc_entry->burst_regs.emc_mrw6 & 0xC0C0) | (dst_emc_entry->burst_regs.emc_mrw6 & 0xFFFF3F3F), 0);
3109
_ccfifo_write(EMC_MRW14, (src_emc_entry->burst_regs.emc_mrw14 & 0x3838) | (dst_emc_entry->burst_regs.emc_mrw14 & 0xFFFF0707), 0);
3110
if (dram_dev_num == TWO_RANK)
3111
{
3112
_ccfifo_write(EMC_MRW7, (src_emc_entry->burst_regs.emc_mrw7 & 0xC0C0) | (dst_emc_entry->burst_regs.emc_mrw7 & 0xFFFF3F3F), 0);
3113
_ccfifo_write(EMC_MRW15, (src_emc_entry->burst_regs.emc_mrw15 & 0x3838) | (dst_emc_entry->burst_regs.emc_mrw15 & 0xFFFF0707), 0);
3114
}
3115
3116
if (dram_dev_num == ONE_RANK || zcal_resistor_shared)
3117
emc_zq_cal = 0x80000001;
3118
else
3119
emc_zq_cal = 1;
3120
3121
_ccfifo_write(EMC_ZQ_CAL, emc_zq_cal, 0);
3122
}
3123
3124
emc_dbg_val = emc_dbg_o;
3125
u32 tRP_src_timing = (src_emc_entry->dram_timings.t_rp * 1000) / src_clock_period;
3126
bool in_self_refresh = false;
3127
u32 ref_delay = 0;
3128
3129
if (needs_tristate_training)
3130
{
3131
emc_dbg_val = (emc_dbg_o & 0xF3FFFFFF) | 0x44000000;
3132
_ccfifo_write(EMC_DBG, emc_dbg_val, 0);
3133
}
3134
3135
if (needs_ca_combo_training)
3136
{
3137
_ccfifo_write(EMC_PMACRO_DATA_RX_TERM_MODE, src_emc_entry->burst_regs.emc_pmacro_data_rx_term_mode & 0xFFFFFCCC, 0);
3138
3139
if (dram_dev_num == TWO_RANK && needs_swap_rank_training)
3140
{
3141
_ccfifo_write(EMC_MRW3, mr13_flip_fspop | 8, tRP_src_timing);
3142
_ccfifo_write(EMC_MRW3, mr13_catr_enable | 8, 0);
3143
}
3144
else
3145
_ccfifo_write(EMC_MRW3, mr13_catr_enable | 8, tRP_src_timing);
3146
3147
_ccfifo_write(EMC_TR_CTRL_0, 0x15A, 0);
3148
ref_delay = 1000000 / src_clock_period;
3149
}
3150
else
3151
{
3152
_ccfifo_write(EMC_MRW3, mr13_flip_fspop | 8, tRP_src_timing);
3153
ref_delay = tFC_lpddr4 / src_clock_period;
3154
}
3155
3156
_ccfifo_write(EMC_INTSTATUS, 0, ref_delay);
3157
_ccfifo_write(EMC_PIN, emc_pin_o & 0xFFFFFFF8, 30);
3158
3159
// Step 11 - Ramp down.
3160
EPRINTF("Step 11");
3161
_ccfifo_write(EMC_CFG_SYNC, 0, 0);
3162
_ccfifo_write(EMC_DBG, emc_dbg_val | 0x40000002, 0); // WRITE_MUX_ACTIVE | WRITE_ACTIVE_ONLY
3163
3164
ramp_down_wait = _dvfs_power_ramp_down(false, src_emc_entry, dst_emc_entry, src_clock_period);
3165
3166
// Step 12 - Trigger clock change.
3167
EPRINTF("Step 12");
3168
_ccfifo_write(EMC_STALL_THEN_EXE_AFTER_CLKCHANGE, 1, 0);
3169
if (!needs_tristate_training)
3170
_ccfifo_write(EMC_DBG, (emc_dbg_val & 0xBFFFFFFF) | 2, 0);
3171
3172
// Step 13 - Ramp up.
3173
EPRINTF("Step 13");
3174
ramp_up_wait = _dvfs_power_ramp_up(false, src_emc_entry, dst_emc_entry, needs_training, dst_clock_period);
3175
3176
_ccfifo_write(EMC_DBG, emc_dbg_val, 0);
3177
3178
// Step 14 - Bringup CKE pins.
3179
EPRINTF("Step 14");
3180
u32 emc_pin_val_final = 0;
3181
if (needs_ca_combo_training)
3182
{
3183
emc_pin_val_final = emc_pin_o & 0xFFFFFFF8;
3184
if (dram_dev_num == TWO_RANK)
3185
{
3186
if (needs_swap_rank_training)
3187
emc_pin_val_final |= 5;
3188
else
3189
emc_pin_val_final |= 6;
3190
}
3191
}
3192
else if (dram_dev_num == TWO_RANK)
3193
emc_pin_val_final = emc_pin_o | 7;
3194
else
3195
emc_pin_val_final = (emc_pin_o & 0xFFFFFFF8) | 1;
3196
3197
_ccfifo_write(EMC_PIN, emc_pin_val_final, 0);
3198
3199
// Step 15 - Zqlatch.
3200
EPRINTF("Step 15");
3201
if (!needs_ca_combo_training)
3202
{
3203
s32 zq_latch_dvfs_wait_time;
3204
u32 T_PDEX_timing = div_o3(dst_emc_entry->dram_timings.t_pdex * 1000, dst_clock_period);
3205
3206
if (dst_clock_period > 2000)
3207
zq_latch_dvfs_wait_time = (s32)tZQCAL_lpddr4_fc_adj - (s32)T_PDEX_timing;
3208
else
3209
zq_latch_dvfs_wait_time =
3210
(s32)tZQCAL_lpddr4_fc_adj - (ramp_up_wait + ramp_down_wait) / dst_clock_period;
3211
3212
if (dram_dev_num == ONE_RANK)
3213
{
3214
if (dst_clock_period > 2000)
3215
_ccfifo_write(EMC_ZQ_CAL, 0x80000001, T_PDEX_timing);
3216
3217
if (!needs_tristate_training)
3218
_ccfifo_write(EMC_MRW3, (mr13_flip_fspop & 0xF3FFFFF7) | 0xC000000, T_PDEX_timing);
3219
3220
emc_zq_cal = 0x80000002;
3221
}
3222
else if (zcal_resistor_shared)
3223
{
3224
if (dst_clock_period > 2000)
3225
_ccfifo_write(EMC_ZQ_CAL, 0x80000001, T_PDEX_timing);
3226
3227
s32 T_PDEX_timing_final = zq_latch_dvfs_wait_time + (s32)T_PDEX_timing;
3228
3229
if (T_PDEX_timing_final < 0)
3230
T_PDEX_timing_final = 0;
3231
3232
_ccfifo_write(EMC_ZQ_CAL, 0x80000002, T_PDEX_timing_final);
3233
_ccfifo_write(EMC_ZQ_CAL, 0x40000001, 0);
3234
3235
if (!needs_tristate_training)
3236
_ccfifo_write(EMC_MRW3, (mr13_flip_fspop & 0xF3FFFFF7) | 0xC000000, 0);
3237
3238
emc_zq_cal = 0x40000002;
3239
zq_latch_dvfs_wait_time = 1000000 / dst_clock_period;
3240
}
3241
else
3242
{
3243
if (dst_clock_period > 2000)
3244
_ccfifo_write(EMC_ZQ_CAL, 1, T_PDEX_timing);
3245
3246
if (!needs_tristate_training)
3247
_ccfifo_write(EMC_MRW3, (mr13_flip_fspop & 0xF3FFFFF7) | 0xC000000, T_PDEX_timing);
3248
3249
emc_zq_cal = 2;
3250
}
3251
3252
// Disable self-refresh.
3253
if (!needs_tristate_training)
3254
{
3255
#ifdef PERF_HACK
3256
// HACK: Setting ACTIVE_SELF_REF increases perf by 1-2%.
3257
_ccfifo_write(EMC_SELF_REF, 0x100, 0);
3258
#else
3259
_ccfifo_write(EMC_SELF_REF, 0, 0);
3260
#endif
3261
_ccfifo_write(EMC_REF, 0, 0);
3262
}
3263
3264
if (zq_latch_dvfs_wait_time < 0)
3265
zq_latch_dvfs_wait_time = 0;
3266
3267
_ccfifo_write(EMC_ZQ_CAL, emc_zq_cal, (u32)zq_latch_dvfs_wait_time);
3268
}
3269
3270
_ccfifo_write(EMC_INTSTATUS, 0, 10); // WAR: delay for zqlatch.
3271
3272
// Step 16 - LPDDR4 Conditional training kickoff.
3273
EPRINTF("Step 16");
3274
if (needs_tristate_training)
3275
{
3276
_ccfifo_write(EMC_INTSTATUS, 0, 1020000 / dst_clock_period);
3277
3278
u32 training_command = 0;
3279
3280
if (needs_ca_training)
3281
training_command |= (1 << 1); // CA: Initiates CA Training.
3282
if (needs_ca_vref_training)
3283
training_command |= (1 << 5); // CA_VREF: Initiates CA_VREF Training.
3284
if (needs_quse_training)
3285
training_command |= (1 << 4); // QUSE: Initiates QUSE Training.
3286
if (needs_quse_vref_training)
3287
training_command |= (1 << 8); // QUSE_VREF: Initiates DQS_VREF Training.
3288
if (needs_wr_training)
3289
training_command |= (1 << 3); // WR: Initiates WR Training.
3290
if (needs_wr_vref_training)
3291
training_command |= (1 << 6); // WR_VREF: Initiates OB (write) DRAM_VREF Training.
3292
if (needs_rd_training)
3293
training_command |= (1 << 2); // RD: Initiates RD Training.
3294
if (needs_rd_vref_training)
3295
training_command |= (1 << 7); // RD_VREF: Initiates IB_DQ_VREF Training.
3296
training_command |= (1 << 31); // GO: Start the Training.
3297
3298
_ccfifo_write(EMC_TRAINING_CMD, training_command, 0);
3299
3300
if (bg_regulator_mode_change)
3301
{
3302
if (enable_bg_regulator)
3303
_ccfifo_write(EMC_PMACRO_BG_BIAS_CTRL_0,
3304
src_emc_entry->burst_regs.emc_pmacro_bg_bias_ctrl_0 & 0xFFFFFFFE, 0);
3305
else
3306
_ccfifo_write(EMC_PMACRO_BG_BIAS_CTRL_0,
3307
src_emc_entry->burst_regs.emc_pmacro_bg_bias_ctrl_0 & 0xFFFFFFFB, 0);
3308
}
3309
3310
_ccfifo_write(EMC_SWITCH_BACK_CTRL, 1, 0);
3311
3312
if (!needs_ca_combo_training || needs_swap_rank_training)
3313
{
3314
_ccfifo_write(EMC_MRW3, mr13_flip_fspop ^ 0xC0, 0);
3315
_ccfifo_write(EMC_INTSTATUS, 0, 1000000 / dst_clock_period);
3316
}
3317
3318
_ccfifo_write(EMC_PIN, emc_pin_o & 0xFFFFFFF8, 0);
3319
_ccfifo_write(EMC_CFG_SYNC, 0, 0);
3320
_ccfifo_write(EMC_DBG, emc_dbg_val | 0x40000002, 0);
3321
3322
_dvfs_power_ramp_down(true, src_emc_entry, dst_emc_entry, dst_clock_period);
3323
3324
_ccfifo_write(EMC_STALL_THEN_EXE_AFTER_CLKCHANGE, 1, 0);
3325
_ccfifo_write(EMC_DBG, (emc_dbg_val & 0xBFFFFFFF) | 2, 0);
3326
3327
_dvfs_power_ramp_up(true, src_emc_entry, dst_emc_entry, needs_training, src_clock_period);
3328
3329
_ccfifo_write(EMC_DBG, emc_dbg_val, 0);
3330
3331
if (dram_dev_num == TWO_RANK)
3332
_ccfifo_write(EMC_PIN, emc_pin_o | 7, 0);
3333
else
3334
_ccfifo_write(EMC_PIN, (emc_pin_o & 0xFFFFFFF8) | 1, 0);
3335
3336
if (needs_ca_combo_training)
3337
{
3338
_ccfifo_write(EMC_TR_CTRL_0, 0x4A, 200000 / src_clock_period);
3339
_ccfifo_write(EMC_TR_CTRL_0, 0x40, 1000000 / src_clock_period);
3340
_ccfifo_write(EMC_MRW3, mr13_catr_enable & 0xFFFFFFFE, 0);
3341
_ccfifo_write(EMC_INTSTATUS, 0, 1000000 / src_clock_period);
3342
_ccfifo_write(EMC_PMACRO_DATA_RX_TERM_MODE, src_emc_entry->burst_regs.emc_pmacro_data_rx_term_mode, 0);
3343
}
3344
3345
_ccfifo_write(EMC_DBG, emc_dbg_o, 0);
3346
3347
_ccfifo_write(EMC_ZQ_CAL, 0x80000001, 0);
3348
_ccfifo_write(EMC_ZQ_CAL, 0x80000002, 1000000 / src_clock_period);
3349
3350
if ((!needs_ca_combo_training || needs_swap_rank_training) && dram_dev_num == TWO_RANK)
3351
{
3352
3353
_ccfifo_write(EMC_ZQ_CAL, 0x40000001, 0);
3354
_ccfifo_write(EMC_ZQ_CAL, 0x40000002, 1000000 / src_clock_period);
3355
}
3356
3357
if (!needs_ca_combo_training)
3358
_ccfifo_write(EMC_MRW3, (mr13_flip_fspop & 0xF3FFFFF7) ^ 0xC0000C0, 0);
3359
3360
_ccfifo_write(EMC_SELF_REF, 0, 0); // Was 0x100.
3361
}
3362
3363
// Step 19.2.
3364
EPRINTF("Step 19.2");
3365
if (bg_regulator_mode_change)
3366
{
3367
_ccfifo_write(EMC_DBG, emc_dbg_o | 2, 0);
3368
3369
u32 bg_regulator_switch_complete_wait_clks = 0;
3370
if (needs_tristate_training)
3371
{
3372
bg_regulator_switch_complete_wait_clks = 1250000 / src_clock_period;
3373
_ccfifo_write(EMC_PMACRO_BG_BIAS_CTRL_0,
3374
src_emc_entry->burst_regs.emc_pmacro_bg_bias_ctrl_0, bg_regulator_switch_complete_wait_clks);
3375
}
3376
else
3377
{
3378
if (ramp_up_wait <= 1250000)
3379
bg_regulator_switch_complete_wait_clks = (1250000 - ramp_up_wait) / dst_clock_period;
3380
_ccfifo_write(EMC_PMACRO_BG_BIAS_CTRL_0,
3381
dst_emc_entry->burst_regs.emc_pmacro_bg_bias_ctrl_0, bg_regulator_switch_complete_wait_clks);
3382
}
3383
3384
_ccfifo_write(EMC_DBG, emc_dbg_o, 0);
3385
}
3386
3387
// Step 20 - Issue ref and optional QRST.
3388
EPRINTF("Step 20");
3389
if (needs_tristate_training)
3390
_ccfifo_write(EMC_REF, 0, 0);
3391
3392
// Step 21 - Restore ZCAL and ZCAL interval.
3393
EPRINTF("Step 21");
3394
_ccfifo_write(EMC_DBG, emc_dbg_o | 2, 0);
3395
3396
if (needs_tristate_training)
3397
_ccfifo_write(EMC_ZCAL_INTERVAL, src_emc_entry->burst_regs.emc_zcal_interval, 0);
3398
3399
_ccfifo_write(EMC_CFG, dst_emc_entry->burst_regs.emc_cfg & 0xEFFFFFFF, 0);
3400
3401
// Step 22 - Restore EMC_CFG_PIPE_CLK.
3402
EPRINTF("Step 22");
3403
//if (needs_tristate_training && dram_type == DRAM_TYPE_LPDDR4)////////////////
3404
if (needs_tristate_training)
3405
_ccfifo_write(EMC_SEL_DPD_CTRL, src_emc_entry->emc_sel_dpd_ctrl, 0);
3406
3407
_ccfifo_write(EMC_DBG, emc_dbg_o, 0);
3408
_ccfifo_write(EMC_CFG_PIPE_CLK, emc_cfg_pipe_clk_o, 0);
3409
3410
if (bg_regulator_mode_change)
3411
{
3412
if (enable_bg_regulator)
3413
EMC(EMC_PMACRO_BG_BIAS_CTRL_0) = dst_emc_entry->burst_regs.emc_pmacro_bg_bias_ctrl_0 & 0xFFFFFFFB;
3414
else
3415
EMC(EMC_PMACRO_BG_BIAS_CTRL_0) = dst_emc_entry->burst_regs.emc_pmacro_bg_bias_ctrl_0 & 0xFFFFFFFE;
3416
}
3417
3418
// Step 23 - Clock Change.
3419
EPRINTF("Step 23");
3420
// During training save current clock.
3421
if (needs_tristate_training)
3422
{
3423
u32 emc_clk_src = CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_EMC);
3424
CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_EMC_SAFE) = emc_clk_src;
3425
_change_dll_src(src_emc_entry, emc_clk_src);
3426
}
3427
3428
// Set CFG_DLL_MODE to RUN_PERIODIC.
3429
EMC(EMC_CFG_DIG_DLL) = (EMC(EMC_CFG_DIG_DLL) & 0xFFFFFF24) | 0x88;
3430
(void)EMC(EMC_CFG_DIG_DLL);
3431
3432
(void)EMC(EMC_FBIO_CFG7);
3433
(void)MC(MC_EMEM_ADR_CFG);
3434
(void)EMC(EMC_INTSTATUS);
3435
3436
// Do clock change.
3437
CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_EMC) = selected_clk_src_emc;
3438
(void)CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_EMC);
3439
3440
if (_wait_emc_status(EMC_INTSTATUS, CLKCHANGE_COMPLETE_INT, true, 0))
3441
return 4; // Clkchange handshake timeout error.
3442
3443
// Step 24 - Save training results.
3444
EPRINTF("Step 24");
3445
if (needs_tristate_training)
3446
{
3447
(void)MC(MC_EMEM_ADR_CFG);
3448
emc_dbg_val = EMC(EMC_DBG);
3449
EMC(EMC_DBG) |= 1;
3450
3451
_save_train_results(dst_emc_entry, needs_training, dram_dev_num, channel1_enabled);
3452
3453
EMC(EMC_DBG) = emc_dbg_val;
3454
}
3455
3456
// Step 25 - Program MC updown regs.
3457
EPRINTF("Step 25");
3458
if ((dst_emc_entry->rate_khz > src_emc_entry->rate_khz) && !needs_tristate_training)
3459
{
3460
for (u32 i = 0; dst_emc_entry->num_up_down > i; i++)
3461
MC(la_scale_regs_mc_addr_table[i]) = dst_emc_entry->la_scale_regs[i];
3462
3463
bool dual_channel = (EMC(EMC_FBIO_CFG7) >> 1) & ((EMC(EMC_FBIO_CFG7) >> 2) & 1);
3464
if (_timing_update(dual_channel))
3465
return 4;
3466
}
3467
3468
// Step 26 - Restore ZCAL regs.
3469
EPRINTF("Step 26");
3470
if (!in_self_refresh)
3471
{
3472
EMC(EMC_DBG) = emc_dbg_o | 2;
3473
EMC(EMC_ZCAL_WAIT_CNT) = dst_emc_entry->burst_regs.emc_zcal_wait_cnt;
3474
EMC(EMC_ZCAL_INTERVAL) = dst_emc_entry->burst_regs.emc_zcal_interval;
3475
EMC(EMC_DBG) = emc_dbg_o;
3476
}
3477
3478
// Step 27 - Restore EMC_CFG, FDPD regs.
3479
EPRINTF("Step 27");
3480
EMC(EMC_DBG) = emc_dbg_o | 2;
3481
EMC(EMC_CFG) = dst_emc_entry->burst_regs.emc_cfg;
3482
EMC(EMC_DBG) = emc_dbg_o;
3483
EMC(EMC_FDPD_CTRL_CMD_NO_RAMP) = dst_emc_entry->emc_fdpd_ctrl_cmd_no_ramp;
3484
EMC(EMC_SEL_DPD_CTRL) = dst_emc_entry->emc_sel_dpd_ctrl;
3485
3486
// Step 28 - Training recover.
3487
EPRINTF("Step 28");
3488
if (needs_tristate_training)
3489
{
3490
EMC(EMC_DBG) = emc_dbg_o | 2;
3491
EMC(EMC_CFG) = dst_emc_entry->burst_regs.emc_cfg;
3492
EMC(EMC_SEL_DPD_CTRL) = dst_emc_entry->emc_sel_dpd_ctrl;
3493
EMC(EMC_ZCAL_WAIT_CNT) = src_emc_entry->burst_regs.emc_zcal_wait_cnt;
3494
EMC(EMC_ZCAL_INTERVAL) = src_emc_entry->burst_regs.emc_zcal_interval;
3495
EMC(EMC_AUTO_CAL_CONFIG2) = src_emc_entry->emc_auto_cal_config2;
3496
EMC(EMC_AUTO_CAL_CONFIG3) = src_emc_entry->emc_auto_cal_config3;
3497
EMC(EMC_AUTO_CAL_CONFIG4) = src_emc_entry->emc_auto_cal_config4;
3498
EMC(EMC_AUTO_CAL_CONFIG5) = src_emc_entry->emc_auto_cal_config5;
3499
EMC(EMC_AUTO_CAL_CONFIG6) = src_emc_entry->emc_auto_cal_config6;
3500
EMC(EMC_AUTO_CAL_CONFIG7) = src_emc_entry->emc_auto_cal_config7;
3501
EMC(EMC_AUTO_CAL_CONFIG8) = src_emc_entry->emc_auto_cal_config8;
3502
EMC(EMC_DBG) = emc_dbg_o;
3503
EMC(EMC_TR_DVFS) = dst_emc_entry->burst_regs.emc_tr_dvfs & 0xFFFFFFFE;
3504
}
3505
3506
EMC(EMC_DBG) = emc_dbg_o | 2;
3507
EMC(EMC_PMACRO_AUTOCAL_CFG_COMMON) = dst_emc_entry->burst_regs.emc_pmacro_autocal_cfg_common;
3508
EMC(EMC_DBG) = emc_dbg_o;
3509
3510
// Step 29 - Power fix WAR.
3511
EPRINTF("Step 29");
3512
EMC(EMC_PMACRO_CFG_PM_GLOBAL_0) = 0xFF0000;
3513
EMC(EMC_PMACRO_TRAINING_CTRL_0) = CH0_TRAINING_E_WRPTR;
3514
EMC(EMC_PMACRO_TRAINING_CTRL_1) = CH0_TRAINING_E_WRPTR;
3515
EMC(EMC_PMACRO_CFG_PM_GLOBAL_0) = 0;
3516
3517
// Step 30 - Re-enable autocal.
3518
EPRINTF("Step 30");
3519
if (needs_tristate_training)
3520
EMC(EMC_AUTO_CAL_CONFIG) = src_emc_entry->emc_auto_cal_config;
3521
else
3522
{
3523
if (dst_emc_entry->burst_regs.emc_cfg_dig_dll & 1)
3524
_digital_dll_enable_rs(channel1_enabled);
3525
EMC(EMC_AUTO_CAL_CONFIG) = dst_emc_entry->emc_auto_cal_config;
3526
}
3527
3528
return 0;
3529
}
3530
3531
static void _minerva_train_patterns(emc_table_t *src_emc_entry, emc_table_t *dst_emc_entry, bool switch_rate, u32 selected_clk_src_emc)
3532
{
3533
u32 needs_training_num = 0;
3534
u32 emc_cfg_dig_dll_val = 0;
3535
u32 needs_training_emc_table[8] = {0};
3536
3537
u32 needs_training = dst_emc_entry->needs_training;
3538
3539
// Must start as true.
3540
if (train_ram_patterns)
3541
{
3542
u32 train_table_off = dst_emc_entry->training_pattern * 256;
3543
for (u32 i = 0; i < 256; i++)
3544
{
3545
EMC(EMC_TRAINING_PATRAM_DQ) = ram_pattern_dq_table[train_table_off + i];
3546
EMC(EMC_TRAINING_PATRAM_DMI) = ram_pattern_dmi_table[train_table_off + i] & 0xF;
3547
EMC(EMC_TRAINING_PATRAM_CTRL) = 0x80000000 + i;
3548
}
3549
train_ram_patterns = false;
3550
}
3551
3552
if (!dst_emc_entry->trained)
3553
{
3554
if (needs_training & NEEDS_TRAINING_CA_COMBO)
3555
{
3556
needs_training_emc_table[needs_training_num++] =
3557
needs_training & (NEEDS_TRAINING_CA_COMBO | NEEDS_TRAINING_IN_SELF_REFRESH);
3558
if (MC(MC_EMEM_ADR_CFG) & 1) // if mapping W8 (1KB page).
3559
needs_training_emc_table[needs_training_num++] =
3560
needs_training & (NEEDS_TRAINING_CA_COMBO | NEEDS_TRAINING_SWAP_RANK | NEEDS_TRAINING_IN_SELF_REFRESH);
3561
}
3562
3563
if (needs_training & NEEDS_TRAINING_QUSE_COMBO)
3564
{
3565
needs_training_emc_table[needs_training_num++] =
3566
needs_training & (NEEDS_TRAINING_QUSE_COMBO | NEEDS_TRAINING_IN_SELF_REFRESH);
3567
if (MC(MC_EMEM_ADR_CFG) & 1)
3568
needs_training_emc_table[needs_training_num++] =
3569
needs_training & (NEEDS_TRAINING_QUSE | NEEDS_TRAINING_IN_SELF_REFRESH);
3570
}
3571
3572
if (needs_training & (NEEDS_TRAINING_WR_COMBO | NEEDS_TRAINING_RD_COMBO))
3573
needs_training_emc_table[needs_training_num++] =
3574
needs_training & (NEEDS_TRAINING_WR_COMBO | NEEDS_TRAINING_RD_COMBO | NEEDS_TRAINING_IN_SELF_REFRESH);
3575
3576
for (u32 i = 0; needs_training_num > i; i++) // Runs more than once for needs_training CA/QUSE/WR/RD.
3577
{
3578
_minerva_set_clock(src_emc_entry, dst_emc_entry, needs_training_emc_table[i], selected_clk_src_emc);
3579
3580
bool dual_channel = (EMC(EMC_FBIO_CFG7) >> 1) & ((EMC(EMC_FBIO_CFG7) >> 2) & 1);
3581
3582
EMC(EMC_DBG) = (EMC(EMC_DBG) & 0xF3FFFFFF) | 0x8000000;
3583
EMC(EMC_CFG_UPDATE) = (EMC(EMC_CFG_UPDATE) & 0xFFFFFFF9) | 4;
3584
_timing_update(dual_channel);
3585
3586
EMC(EMC_CFG_UPDATE) &= 0xFFFFFFF9;
3587
EMC(EMC_DBG) &= 0xF3FFFFFF;
3588
EMC(EMC_CFG_DIG_DLL) = (EMC(EMC_CFG_DIG_DLL) & 0xFFFFFF3E) | 0x80;
3589
_timing_update(dual_channel);
3590
3591
emc_cfg_dig_dll_val = EMC(EMC_CFG_DIG_DLL) & 0xFFFFFFFE;
3592
if (dst_emc_entry->burst_regs.emc_cfg_dig_dll == 1)
3593
emc_cfg_dig_dll_val = EMC(EMC_CFG_DIG_DLL) | 1;
3594
EMC(EMC_CFG_DIG_DLL) = (emc_cfg_dig_dll_val & 0xFFFFFF3F) | 0x80;
3595
_timing_update(dual_channel);
3596
3597
while (!(EMC(EMC_DIG_DLL_STATUS) & 0x8000))
3598
;
3599
3600
// Bug 200024907.
3601
EMC(EMC_RP) = src_emc_entry->burst_regs.emc_rp;
3602
EMC(EMC_R2P) = src_emc_entry->burst_regs.emc_r2p;
3603
EMC(EMC_W2P) = src_emc_entry->burst_regs.emc_w2p;
3604
EMC(EMC_TRPAB) = src_emc_entry->burst_regs.emc_trpab;
3605
3606
_timing_update(dual_channel);
3607
}
3608
3609
EPRINTF("Trained");
3610
dst_emc_entry->trained = 1;
3611
}
3612
3613
if (switch_rate)
3614
_minerva_set_clock(src_emc_entry, dst_emc_entry, 0, selected_clk_src_emc);
3615
}
3616
3617
void _minerva_do_over_temp_compensation(mtc_config_t *mtc_cfg)
3618
{
3619
u32 dram_type = EMC(EMC_FBIO_CFG5) & 3;
3620
3621
// Only LPDDR chips are supported.
3622
if (dram_type != DRAM_TYPE_LPDDR4)
3623
return;
3624
3625
s32 dram_temp = _get_dram_temperature();
3626
3627
if (dram_temp < 0 || mtc_cfg->prev_temp == (u32)dram_temp)
3628
return;
3629
3630
u32 refr = mtc_cfg->current_emc_table->burst_regs.emc_refresh;
3631
u32 pre_refr = mtc_cfg->current_emc_table->burst_regs.emc_pre_refresh_req_cnt;
3632
u32 dyn_self_ref = mtc_cfg->current_emc_table->burst_regs.emc_dyn_self_ref_control;
3633
3634
switch (dram_temp)
3635
{
3636
// Normal temp (<= 85 oC).
3637
case 0:
3638
case 1:
3639
case 2:
3640
case 3:
3641
if (mtc_cfg->prev_temp < 4)
3642
{
3643
mtc_cfg->prev_temp = (u32)dram_temp;
3644
return;
3645
}
3646
break;
3647
// Over temp (> 85 oC).
3648
case 4: // 2x refresh.
3649
refr = (refr & 0xFFFF0000) | ((refr & 0xFFFF) >> REFRESH_X2);
3650
pre_refr = (pre_refr & 0xFFFF0000) | ((pre_refr & 0xFFFF) >> REFRESH_X2);
3651
dyn_self_ref = (dyn_self_ref & 0xFFFF0000) | ((dyn_self_ref & 0xFFFF) >> REFRESH_X2);
3652
break;
3653
case 5: // 4x refresh.
3654
case 6: // Temp 6 normally needs a derating emc table.
3655
refr = (refr & 0xFFFF0000) | ((refr & 0xFFFF) >> REFRESH_X4);
3656
pre_refr = (pre_refr & 0xFFFF0000) | ((pre_refr & 0xFFFF) >> REFRESH_X4);
3657
dyn_self_ref = (dyn_self_ref & 0xFFFF0000) | ((dyn_self_ref & 0xFFFF) >> REFRESH_X4);
3658
break;
3659
default:
3660
break;
3661
}
3662
3663
mtc_cfg->prev_temp = dram_temp;
3664
3665
EMC(EMC_REFRESH) = refr;
3666
EMC(EMC_PRE_REFRESH_REQ_CNT) = pre_refr;
3667
EMC(EMC_DYN_SELF_REF_CONTROL) = dyn_self_ref;
3668
}
3669
3670
u32 _minerva_do_periodic_compensation(emc_table_t *mtc_table_entry)
3671
{
3672
if (mtc_table_entry && mtc_table_entry->periodic_training)
3673
{
3674
u32 dram_dev_num = (MC(MC_EMEM_ADR_CFG) & 1) + 1;
3675
u32 pd_mask = (dram_dev_num == TWO_RANK) ? IN_POWERDOWN_BOTH_MASK : IN_POWERDOWN_1DEV_MASK;
3676
bool channel1_enabled = (mtc_table_entry->burst_regs.emc_fbio_cfg7 >> 2) & 1;
3677
3678
(void)EMC(EMC_DBG);
3679
3680
// Safekeep current config.
3681
u32 emc_cfg_o = EMC(EMC_CFG);
3682
u32 emc_cfg_dig_dll_o = EMC(EMC_CFG_DIG_DLL);
3683
u32 emc_cfg_update_o = EMC(EMC_CFG_UPDATE);
3684
3685
// Step 1 - Disable digital DLL.
3686
EMC(EMC_CFG_DIG_DLL) = emc_cfg_dig_dll_o & 0xFFFFFFFE;
3687
3688
// Step 1.2 - Always update auto cal in clock change.
3689
EMC(EMC_CFG_UPDATE) = (emc_cfg_update_o & 0xFFFFF9FF) | 0x400;
3690
3691
// Step 1.3 - Disable other power features.
3692
EMC(EMC_CFG) = emc_cfg_o & 0xFFFFFFF;
3693
3694
// Timing update and wait for everything to power down.
3695
_timing_update(channel1_enabled);
3696
3697
_wait_emc_status(EMC_EMC_STATUS, pd_mask, 0, EMC_CHANNEL0);
3698
if (channel1_enabled)
3699
_wait_emc_status(EMC_EMC_STATUS, pd_mask, 0, EMC_CHANNEL1);
3700
3701
_wait_emc_status(EMC_EMC_STATUS, IN_SELF_REFRESH_MASK, 0, EMC_CHANNEL0);
3702
if (channel1_enabled)
3703
_wait_emc_status(EMC_EMC_STATUS, IN_SELF_REFRESH_MASK, 0, EMC_CHANNEL1);
3704
3705
_wait_emc_status(EMC_CFG_DIG_DLL, 1, 0, EMC_CHANNEL0);
3706
if (channel1_enabled)
3707
_wait_emc_status(EMC_CFG_DIG_DLL, 1, 0, EMC_CHANNEL1);
3708
3709
// Step 2 - Osc kick off - this assumes training and dvfs have set correct MR23.
3710
_start_periodic_compensation();
3711
3712
// Step 3 - Let dram capture its clock tree delays.
3713
_usleep(1000 * _actual_osc_clocks(mtc_table_entry->run_clocks) / mtc_table_entry->rate_khz + 2);
3714
3715
// Step 4 - Check delta wrt previous values (save value if margin exceeds what is set in table).
3716
u32 adelta = _minerva_update_clock_tree_delay(mtc_table_entry, mtc_table_entry, dram_dev_num, channel1_enabled, PERIODIC_TRAINING_UPDATE);
3717
3718
// Step 5 - Apply compensation w.r.t. trained values (if clock tree has drifted more than the set margin).
3719
if (adelta && ((mtc_table_entry->rate_khz / 1000) * 128) * adelta / 1000000 > mtc_table_entry->tree_margin)
3720
{
3721
for (u32 i = 0; i < 10; i++)
3722
{
3723
EMC(periodic_training_addr[i]) =
3724
_minerva_apply_periodic_compensation_trimmer(mtc_table_entry, periodic_training_addr[i]);
3725
}
3726
}
3727
3728
// Step 6 - Restore other power features.
3729
EMC(EMC_CFG) = emc_cfg_o;
3730
3731
// Step 6.1 - Restore the DLL.
3732
EMC(EMC_CFG_DIG_DLL) = emc_cfg_dig_dll_o;
3733
3734
// Step 6.2 - Timing update for applying the new trimmers.
3735
_timing_update(channel1_enabled);
3736
3737
// Step 6.3 - Restore the UPDATE_DLL_IN_UPDATE field.
3738
EMC(EMC_CFG_UPDATE) = emc_cfg_update_o;
3739
}
3740
3741
return 0;
3742
}
3743
3744
static u32 _minerva_set_rate(mtc_config_t *mtc_cfg)
3745
{
3746
u32 src_emc_entry_idx = 999;
3747
u32 dst_emc_entry_idx = 999;
3748
u32 selected_clk_src_emc;
3749
u32 emc_clk_src;
3750
bool freq_changed = false;
3751
bool src_is_pllmb;
3752
emc_table_t *src_emc_entry;
3753
emc_table_t *dst_emc_entry;
3754
3755
if (mtc_cfg->table_entries > 900)
3756
return 4;
3757
3758
for (u32 i = 0; i < mtc_cfg->table_entries; i++)
3759
{
3760
u32 table_entry_rate = mtc_cfg->mtc_table[i].rate_khz;
3761
if (mtc_cfg->rate_from == table_entry_rate)
3762
src_emc_entry_idx = i;
3763
if (mtc_cfg->rate_to == table_entry_rate)
3764
dst_emc_entry_idx = i;
3765
}
3766
3767
if (src_emc_entry_idx >= mtc_cfg->table_entries)
3768
return 4;
3769
3770
if (dst_emc_entry_idx >= mtc_cfg->table_entries)
3771
return 4;
3772
3773
src_emc_entry = (emc_table_t *)&mtc_cfg->mtc_table[src_emc_entry_idx];
3774
dst_emc_entry = (emc_table_t *)&mtc_cfg->mtc_table[dst_emc_entry_idx];
3775
3776
u32 src_rate_khz = src_emc_entry->rate_khz;
3777
u32 dst_rate_khz = dst_emc_entry->rate_khz;
3778
u32 src_clk_src_emc = src_emc_entry->clk_src_emc;
3779
u32 dst_clk_src_emc = dst_emc_entry->clk_src_emc;
3780
3781
freq_changed = _check_freq_changed(dst_rate_khz, dst_clk_src_emc, src_rate_khz, src_clk_src_emc);
3782
EPRINTFARGS("Requested freq change from %d to %d.", src_rate_khz, dst_rate_khz);
3783
3784
// Get current clock source.
3785
emc_clk_src = CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_EMC) >> EMC_2X_CLK_SRC_SHIFT;
3786
src_is_pllmb = emc_clk_src == PLLMB_UD || emc_clk_src == PLLMB_OUT0;
3787
3788
if (freq_changed)
3789
{
3790
if (emc_clk_src == PLLM_UD ||
3791
emc_clk_src == PLLM_OUT0) // Clock source is PLLM. Switch based on src_is_pllmb.
3792
{
3793
src_is_pllmb = !src_is_pllmb;
3794
}
3795
else if (emc_clk_src == PLLMB_UD ||
3796
emc_clk_src == PLLMB_OUT0) // Clock source is PLLMB. Switch to PLLM.
3797
{
3798
src_is_pllmb = false;
3799
}
3800
selected_clk_src_emc = _pllm_clk_base_cfg(dst_rate_khz, dst_clk_src_emc, src_is_pllmb);
3801
}
3802
else
3803
{
3804
selected_clk_src_emc = dst_clk_src_emc;
3805
emc_clk_src = selected_clk_src_emc >> EMC_2X_CLK_SRC_SHIFT;
3806
if (src_is_pllmb)
3807
{
3808
if (emc_clk_src == PLLM_UD || emc_clk_src == PLLMB_UD)
3809
selected_clk_src_emc = (selected_clk_src_emc & 0x1FFFFFFF) | (PLLMB_UD << EMC_2X_CLK_SRC_SHIFT);
3810
else if (emc_clk_src == PLLM_OUT0 || emc_clk_src == PLLMB_OUT0)
3811
selected_clk_src_emc = (selected_clk_src_emc & 0x1FFFFFFF) | (PLLMB_OUT0 << EMC_2X_CLK_SRC_SHIFT);
3812
}
3813
}
3814
3815
switch (mtc_cfg->train_mode)
3816
{
3817
case OP_SWITCH:
3818
_minerva_set_clock(src_emc_entry, dst_emc_entry, 0, selected_clk_src_emc);
3819
mtc_cfg->current_emc_table = dst_emc_entry;
3820
mtc_cfg->rate_from = dst_emc_entry->rate_khz;
3821
if (dst_emc_entry->periodic_training)
3822
_minerva_do_periodic_compensation(dst_emc_entry);
3823
return 0;
3824
case OP_TRAIN:
3825
_minerva_train_patterns(src_emc_entry, dst_emc_entry, false, selected_clk_src_emc);
3826
return 0;
3827
case OP_TRAIN_SWITCH:
3828
_minerva_train_patterns(src_emc_entry, dst_emc_entry, true, selected_clk_src_emc);
3829
mtc_cfg->current_emc_table = dst_emc_entry;
3830
mtc_cfg->rate_from = dst_emc_entry->rate_khz;
3831
if (dst_emc_entry->periodic_training)
3832
_minerva_do_periodic_compensation(dst_emc_entry);
3833
return 0;
3834
default:
3835
return 4;
3836
}
3837
}
3838
3839
static void _minerva_get_table(mtc_config_t *mtc_cfg)
3840
{
3841
memset(mtc_cfg->mtc_table, 0, EMC_TABLE_ENTRY_SIZE_R7 * 10);
3842
3843
switch (mtc_cfg->sdram_id)
3844
{
3845
case DRAM_4GB_HYNIX_H9HCNNNBPUMLHR_NLN:
3846
memcpy(mtc_cfg->mtc_table, nx_abca2_2_10NoCfgVersion_V9_8_7_V1_6, EMC_TABLE_SIZE_R7);
3847
break;
3848
case DRAM_4GB_SAMSUNG_K4F6E304HB_MGCH:
3849
case DRAM_4GB_MICRON_MT53B512M32D2NP_062_WT:
3850
case DRAM_4GB_COPPER_SAMSUNG:
3851
case DRAM_6GB_SAMSUNG_K4FHE3D4HM_MFCH:
3852
case DRAM_8GB_SAMSUNG_K4FBE3D4HM_MGXX:
3853
default:
3854
memcpy(mtc_cfg->mtc_table, nx_abca2_0_3_10NoCfgVersion_V9_8_7_V1_6, EMC_TABLE_SIZE_R7);
3855
if (mtc_cfg->sdram_id == DRAM_8GB_SAMSUNG_K4FBE3D4HM_MGXX)
3856
{
3857
for (u32 i = 0; i < EMC_TABLE_SIZE_R7 / EMC_TABLE_ENTRY_SIZE_R7; i++)
3858
{
3859
emc_table_t *table = &mtc_cfg->mtc_table[i];
3860
u32 period = 1000000000 / table->rate_khz;
3861
3862
table->burst_regs.emc_rfc = 280000 / period;
3863
table->shadow_regs_ca_train.emc_rfc = 280000 / period;
3864
table->shadow_regs_quse_train.emc_rfc = 280000 / period;
3865
table->shadow_regs_rdwr_train.emc_rfc = 280000 / period;
3866
3867
table->burst_regs.emc_rfcpb = 140000 / period;
3868
table->shadow_regs_ca_train.emc_rfcpb = 140000 / period;
3869
table->shadow_regs_quse_train.emc_rfcpb = 140000 / period;
3870
table->shadow_regs_rdwr_train.emc_rfcpb = 140000 / period;
3871
3872
table->burst_regs.emc_txsr = 287500 / period;
3873
table->shadow_regs_ca_train.emc_txsr = 287500 / period;
3874
table->shadow_regs_quse_train.emc_txsr = 287500 / period;
3875
table->shadow_regs_rdwr_train.emc_txsr = 287500 / period;
3876
3877
table->burst_regs.emc_txsrdll = table->burst_regs.emc_txsr;
3878
table->shadow_regs_ca_train.emc_txsrdll = table->shadow_regs_ca_train.emc_txsr;
3879
table->shadow_regs_quse_train.emc_txsrdll = table->shadow_regs_quse_train.emc_txsr;
3880
table->shadow_regs_rdwr_train.emc_txsrdll = table->shadow_regs_rdwr_train.emc_txsr;
3881
3882
table->burst_regs.emc_dyn_self_ref_control &= 0x7FFFFFFF;
3883
table->shadow_regs_ca_train.emc_dyn_self_ref_control &= 0x7FFFFFFF;
3884
table->shadow_regs_quse_train.emc_dyn_self_ref_control &= 0x7FFFFFFF;
3885
table->shadow_regs_rdwr_train.emc_dyn_self_ref_control &= 0x7FFFFFFF;
3886
3887
table->dram_timings.t_rfc = 280;
3888
}
3889
}
3890
break;
3891
}
3892
3893
mtc_cfg->table_entries = EMC_TABLE_SIZE_R7 / EMC_TABLE_ENTRY_SIZE_R7;
3894
mtc_cfg->rate_to = 0;
3895
mtc_cfg->rate_from = 0;
3896
mtc_cfg->train_mode = 0;
3897
mtc_cfg->prev_temp = 0;
3898
mtc_cfg->current_emc_table = NULL;
3899
3900
// Important!
3901
mtc_cfg->train_ram_patterns = true;
3902
mtc_cfg->init_done = MTC_INIT_MAGIC;
3903
}
3904
3905
void _minerva_init(mtc_config_t *mtc_cfg, bdkParams_t bp)
3906
{
3907
EPRINTF("-- Minerva Training Cell --");
3908
3909
train_ram_patterns = mtc_cfg->train_ram_patterns;
3910
3911
if (mtc_cfg->init_done != MTC_INIT_MAGIC)
3912
{
3913
if (mtc_cfg->init_done == MTC_NEW_MAGIC)
3914
{
3915
_minerva_get_table(mtc_cfg);
3916
#ifdef OVERCLOCK_VOLTAGE
3917
// Set SD1 regulator voltage.
3918
if ((bp->extension_magic & 0xF0FFFFFF) == IANOS_EXT0)
3919
bp->reg_voltage_set(1, OVERCLOCK_VOLTAGE);
3920
#endif
3921
}
3922
return;
3923
}
3924
3925
#ifdef OVERCLOCK_FREQ
3926
// Change max rate in table.
3927
mtc_cfg->mtc_table[mtc_cfg->table_entries - 1].rate_khz = OVERCLOCK_FREQ;
3928
3929
// Change rates for OC RAM.
3930
if (mtc_cfg->rate_from == MAX_FREQ_T210)
3931
mtc_cfg->rate_from = OVERCLOCK_FREQ;
3932
if (mtc_cfg->rate_to == MAX_FREQ_T210)
3933
mtc_cfg->rate_to = OVERCLOCK_FREQ;
3934
#endif
3935
3936
switch (mtc_cfg->train_mode)
3937
{
3938
case OP_SWITCH:
3939
EPRINTF("Switching..");
3940
_minerva_set_rate(mtc_cfg);
3941
break;
3942
case OP_TRAIN:
3943
EPRINTF("Training..");
3944
_minerva_set_rate(mtc_cfg);
3945
break;
3946
case OP_TRAIN_SWITCH:
3947
EPRINTF("Training and switching..");
3948
_minerva_set_rate(mtc_cfg);
3949
break;
3950
case OP_PERIODIC_TRAIN:
3951
EPRINTF("Periodic training..");
3952
_minerva_do_periodic_compensation(mtc_cfg->current_emc_table);
3953
break;
3954
case OP_TEMP_COMP:
3955
EPRINTF("Over temperature compensation..");
3956
_minerva_do_over_temp_compensation(mtc_cfg);
3957
break;
3958
}
3959
3960
#ifdef OVERCLOCK_FREQ
3961
// Restore rates for OC RAM.
3962
if (mtc_cfg->rate_from == OVERCLOCK_FREQ)
3963
mtc_cfg->rate_from = MAX_FREQ_T210;
3964
if (mtc_cfg->rate_to == OVERCLOCK_FREQ)
3965
mtc_cfg->rate_to = MAX_FREQ_T210;
3966
#endif
3967
3968
mtc_cfg->train_ram_patterns = train_ram_patterns;
3969
}
3970
3971