Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
CTCaer
GitHub Repository: CTCaer/hekate
Path: blob/master/bdk/mem/sdram.c
1476 views
1
/*
2
* Copyright (c) 2018 naehrwert
3
* Copyright (c) 2018 balika011
4
* Copyright (c) 2019-2023 CTCaer
5
*
6
* This program is free software; you can redistribute it and/or modify it
7
* under the terms and conditions of the GNU General Public License,
8
* version 2, as published by the Free Software Foundation.
9
*
10
* This program is distributed in the hope it will be useful, but WITHOUT
11
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
13
* more details.
14
*
15
* You should have received a copy of the GNU General Public License
16
* along with this program. If not, see <http://www.gnu.org/licenses/>.
17
*/
18
19
#include <string.h>
20
21
#include <mem/mc.h>
22
#include <mem/emc.h>
23
#include <mem/sdram.h>
24
#include <mem/sdram_param_t210.h>
25
#include <mem/sdram_param_t210b01.h>
26
#include <memory_map.h>
27
#include <power/max77620.h>
28
#include <power/max7762x.h>
29
#include <soc/clock.h>
30
#include <soc/fuse.h>
31
#include <soc/hw_init.h>
32
#include <soc/i2c.h>
33
#include <soc/pmc.h>
34
#include <soc/timer.h>
35
#include <soc/t210.h>
36
37
#define DRAM_ID(x) BIT(x)
38
#define DRAM_CC(x) BIT(x)
39
40
typedef struct _sdram_vendor_patch_t
41
{
42
u32 val;
43
u32 dramcf:16;
44
u32 offset:16;
45
} sdram_vendor_patch_t;
46
47
static const u8 dram_encoding_t210b01[] = {
48
/* 00 */ LPDDR4X_UNUSED,
49
/* 01 */ LPDDR4X_UNUSED,
50
/* 02 */ LPDDR4X_UNUSED,
51
/* 03 */ LPDDR4X_4GB_HYNIX_H9HCNNNBKMMLXR_NEE,
52
/* 04 */ LPDDR4X_UNUSED,
53
/* 05 */ LPDDR4X_4GB_HYNIX_H9HCNNNBKMMLXR_NEE,
54
/* 06 */ LPDDR4X_4GB_HYNIX_H9HCNNNBKMMLXR_NEE,
55
/* 07 */ LPDDR4X_UNUSED,
56
/* 08 */ LPDDR4X_NO_PATCH,
57
/* 09 */ LPDDR4X_8GB_SAMSUNG_K4UBE3D4AM_MGCJ,
58
/* 10 */ LPDDR4X_NO_PATCH,
59
/* 11 */ LPDDR4X_4GB_MICRON_MT53E512M32D2NP_046_WTE,
60
/* 12 */ LPDDR4X_NO_PATCH,
61
/* 13 */ LPDDR4X_8GB_SAMSUNG_K4UBE3D4AM_MGCJ,
62
/* 14 */ LPDDR4X_NO_PATCH,
63
/* 15 */ LPDDR4X_4GB_MICRON_MT53E512M32D2NP_046_WTE,
64
/* 16 */ LPDDR4X_UNUSED,
65
/* 17 */ LPDDR4X_4GB_SAMSUNG_K4U6E3S4AA_MGCL,
66
/* 18 */ LPDDR4X_8GB_SAMSUNG_K4UBE3D4AA_MGCL,
67
/* 19 */ LPDDR4X_4GB_SAMSUNG_K4U6E3S4AA_MGCL,
68
/* 20 */ LPDDR4X_4GB_SAMSUNG_K4U6E3S4AB_MGCL,
69
/* 21 */ LPDDR4X_4GB_SAMSUNG_K4U6E3S4AB_MGCL,
70
/* 22 */ LPDDR4X_4GB_SAMSUNG_K4U6E3S4AB_MGCL,
71
/* 23 */ LPDDR4X_8GB_SAMSUNG_K4UBE3D4AA_MGCL,
72
/* 24 */ LPDDR4X_4GB_SAMSUNG_K4U6E3S4AA_MGCL,
73
/* 25 */ LPDDR4X_4GB_MICRON_MT53E512M32D2NP_046_WTF,
74
/* 26 */ LPDDR4X_4GB_MICRON_MT53E512M32D2NP_046_WTF,
75
/* 27 */ LPDDR4X_4GB_MICRON_MT53E512M32D2NP_046_WTF,
76
/* 28 */ LPDDR4X_8GB_SAMSUNG_K4UBE3D4AA_MGCL,
77
/* 29 */ LPDDR4X_4GB_HYNIX_H54G46CYRBX267,
78
/* 30 */ LPDDR4X_4GB_HYNIX_H54G46CYRBX267,
79
/* 31 */ LPDDR4X_4GB_HYNIX_H54G46CYRBX267,
80
/* 32 */ LPDDR4X_4GB_MICRON_MT53E512M32D1NP_046_WTB,
81
/* 33 */ LPDDR4X_4GB_MICRON_MT53E512M32D1NP_046_WTB,
82
/* 34 */ LPDDR4X_4GB_MICRON_MT53E512M32D1NP_046_WTB,
83
};
84
85
#include "sdram_config.inl"
86
#include "sdram_config_t210b01.inl"
87
88
static bool _sdram_wait_emc_status(u32 reg_offset, u32 bit_mask, bool updated_state, s32 emc_channel)
89
{
90
bool err = true;
91
92
for (s32 i = 0; i < EMC_STATUS_UPDATE_TIMEOUT; i++)
93
{
94
if (emc_channel)
95
{
96
if (emc_channel != 1)
97
goto done;
98
99
if (((EMC_CH1(reg_offset) & bit_mask) != 0) == updated_state)
100
{
101
err = false;
102
break;
103
}
104
}
105
else if (((EMC(reg_offset) & bit_mask) != 0) == updated_state)
106
{
107
err = false;
108
break;
109
}
110
usleep(1);
111
}
112
113
done:
114
return err;
115
}
116
117
static void _sdram_req_mrr_data(u32 data, bool dual_channel)
118
{
119
EMC(EMC_MRR) = data;
120
_sdram_wait_emc_status(EMC_EMC_STATUS, EMC_STATUS_MRR_DIVLD, true, EMC_CHAN0);
121
if (dual_channel)
122
_sdram_wait_emc_status(EMC_EMC_STATUS, EMC_STATUS_MRR_DIVLD, true, EMC_CHAN1);
123
}
124
125
emc_mr_data_t sdram_read_mrx(emc_mr_t mrx)
126
{
127
emc_mr_data_t data;
128
u32 mrr;
129
bool dual_rank = EMC(EMC_ADR_CFG) & 1;
130
bool dual_channel = (EMC(EMC_FBIO_CFG7) >> 2) & 1; // Each EMC channel is a RAM chip module.
131
132
// Clear left overs.
133
for (u32 i = 0; i < 16; i++)
134
{
135
(void)EMC(EMC_MRR);
136
usleep(1);
137
}
138
139
memset(&data, 0xFF, sizeof(emc_mr_data_t));
140
141
/*
142
* When a dram chip has only one rank, then the info from the 2 ranks differs.
143
* Info not matching is only allowed on different channels.
144
*/
145
146
// Get Device 0 (Rank 0) info from both dram chips (channels).
147
_sdram_req_mrr_data((2u << 30) | (mrx << 16), dual_channel);
148
149
// Ram module 0 info.
150
mrr = EMC_CH0(EMC_MRR);
151
data.chip0.rank0_ch0 = mrr & 0xFF;
152
data.chip0.rank0_ch1 = (mrr & 0xFF00 >> 8);
153
154
// Ram module 1 info.
155
if (dual_channel)
156
{
157
mrr = EMC_CH1(EMC_MRR);
158
data.chip1.rank0_ch0 = mrr & 0xFF;
159
data.chip1.rank0_ch1 = (mrr & 0xFF00 >> 8);
160
}
161
162
// If Rank 1 exists, get info.
163
if (dual_rank)
164
{
165
// Get Device 1 (Rank 1) info from both dram chips (channels).
166
_sdram_req_mrr_data((1u << 30) | (mrx << 16), dual_channel);
167
168
// Ram module 0 info.
169
mrr = EMC_CH0(EMC_MRR);
170
data.chip0.rank1_ch0 = mrr & 0xFF;
171
data.chip0.rank1_ch1 = (mrr & 0xFF00 >> 8);
172
173
// Ram module 1 info.
174
if (dual_channel)
175
{
176
mrr = EMC_CH1(EMC_MRR);
177
data.chip1.rank1_ch0 = mrr & 0xFF;
178
data.chip1.rank1_ch1 = (mrr & 0xFF00 >> 8);
179
}
180
}
181
182
return data;
183
}
184
185
void sdram_src_pllc(bool enable)
186
{
187
static bool enabled = false;
188
189
if (hw_get_chip_id() == GP_HIDREV_MAJOR_T210 || enable == enabled)
190
return;
191
192
enabled = enable;
193
194
// Clear CC interrupt.
195
EMC(EMC_INTSTATUS) = BIT(4);
196
(void)EMC(EMC_INTSTATUS);
197
198
u32 clk_src_emc = _dram_cfg_08_10_12_14_samsung_hynix_4gb.emc_clock_source;
199
200
if (enable)
201
{
202
// Check if clock source is not the expected one.
203
if (CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_EMC) != clk_src_emc)
204
return;
205
206
// Set source as PLLC_OUT0.
207
CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_EMC) = 0x20188004;
208
}
209
else
210
{
211
// Restore MC/EMC clock.
212
CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_EMC) = clk_src_emc;
213
}
214
215
// Wait for CC interrupt.
216
while (!(EMC(EMC_INTSTATUS) & BIT(4)))
217
usleep(1);
218
}
219
220
static void _sdram_config_t210(const sdram_params_t210_t *params)
221
{
222
// VDDP Select.
223
PMC(APBDEV_PMC_VDDP_SEL) = params->pmc_vddp_sel;
224
usleep(params->pmc_vddp_sel_wait);
225
226
// Set DDR pad voltage.
227
PMC(APBDEV_PMC_DDR_PWR) = PMC(APBDEV_PMC_DDR_PWR); // Normally params->pmc_ddr_pwr.
228
229
// Turn on MEM IO Power.
230
PMC(APBDEV_PMC_NO_IOPOWER) &= PMC_NO_IOPOWER_SDMMC1; // Only keep SDMMC1 state. (Was params->pmc_no_io_power).
231
PMC(APBDEV_PMC_REG_SHORT) = params->pmc_reg_short;
232
233
PMC(APBDEV_PMC_DDR_CNTRL) = params->pmc_ddr_ctrl;
234
235
// Patch 1 using BCT spare variables
236
if (params->emc_bct_spare0)
237
*(vu32 *)params->emc_bct_spare0 = params->emc_bct_spare1;
238
239
// Program DPD3/DPD4 regs (coldboot path).
240
// Enable sel_dpd on unused pins.
241
u32 dpd_req = (params->emc_pmc_scratch1 & 0x3FFFFFFF) | PMC_IO_DPD_REQ_DPD_ON;
242
PMC(APBDEV_PMC_IO_DPD3_REQ) = (dpd_req ^ 0xFFFF) & 0xC000FFFF;
243
usleep(params->pmc_io_dpd3_req_wait);
244
245
// Disable e_dpd_vttgen.
246
dpd_req = (params->emc_pmc_scratch2 & 0x3FFFFFFF) | PMC_IO_DPD_REQ_DPD_ON;
247
PMC(APBDEV_PMC_IO_DPD4_REQ) = (dpd_req & 0xFFFF0000) ^ 0x3FFF0000;
248
usleep(params->pmc_io_dpd4_req_wait);
249
250
// Disable e_dpd_bg.
251
PMC(APBDEV_PMC_IO_DPD4_REQ) = (dpd_req ^ 0xFFFF) & 0xC000FFFF;
252
usleep(params->pmc_io_dpd4_req_wait);
253
254
PMC(APBDEV_PMC_WEAK_BIAS) = 0;
255
usleep(1);
256
257
// Start PLLM.
258
CLOCK(CLK_RST_CONTROLLER_PLLM_MISC1) = params->pllm_setup_control;
259
CLOCK(CLK_RST_CONTROLLER_PLLM_MISC2) = 0;
260
261
u32 pllm_div = (params->pllm_feedback_divider << 8) | params->pllm_input_divider | ((params->pllm_post_divider & 0xFFFF) << 20);
262
CLOCK(CLK_RST_CONTROLLER_PLLM_BASE) = pllm_div;
263
CLOCK(CLK_RST_CONTROLLER_PLLM_BASE) = pllm_div | PLLCX_BASE_ENABLE;
264
265
u32 wait_end = get_tmr_us() + 300;
266
while (!(CLOCK(CLK_RST_CONTROLLER_PLLM_BASE) & BIT(27)))
267
{
268
if (get_tmr_us() >= wait_end)
269
goto lock_timeout;
270
}
271
usleep(10);
272
273
lock_timeout:
274
// Set clock sources.
275
CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_EMC) = ((params->mc_emem_arb_misc0 >> 11) & 0x10000) | (params->emc_clock_source & 0xFFFEFFFF);
276
if (params->emc_clock_source_dll)
277
CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_EMC_DLL) = params->emc_clock_source_dll;
278
if (params->clear_clock2_mc1)
279
CLOCK(CLK_RST_CONTROLLER_CLK_ENB_W_CLR) = BIT(CLK_W_MC1); // Clear Reset to MC1.
280
281
// Enable and clear reset for memory clocks.
282
CLOCK(CLK_RST_CONTROLLER_CLK_ENB_H_SET) = BIT(CLK_H_EMC) | BIT(CLK_H_MEM);
283
CLOCK(CLK_RST_CONTROLLER_CLK_ENB_X_SET) = BIT(CLK_X_EMC_DLL);
284
CLOCK(CLK_RST_CONTROLLER_RST_DEV_H_CLR) = BIT(CLK_H_EMC) | BIT(CLK_H_MEM);
285
286
// Set pad vtt levels.
287
EMC(EMC_PMACRO_VTTGEN_CTRL_0) = params->emc_pmacro_vttgen_ctrl0;
288
EMC(EMC_PMACRO_VTTGEN_CTRL_1) = params->emc_pmacro_vttgen_ctrl1;
289
EMC(EMC_PMACRO_VTTGEN_CTRL_2) = params->emc_pmacro_vttgen_ctrl2;
290
291
// Trigger timing update so above writes take place.
292
EMC(EMC_TIMING_CONTROL) = 1;
293
usleep(10); // Ensure the regulators settle.
294
295
// Select EMC write mux.
296
EMC(EMC_DBG) = (params->emc_dbg_write_mux << 1) | params->emc_dbg;
297
298
// Patch 2 using BCT spare variables.
299
if (params->emc_bct_spare2)
300
*(vu32 *)params->emc_bct_spare2 = params->emc_bct_spare3;
301
302
// Program CMD mapping. Required before brick mapping, else
303
// we can't guarantee CK will be differential at all times.
304
EMC(EMC_FBIO_CFG7) = params->emc_fbio_cfg7;
305
EMC(EMC_CMD_MAPPING_CMD0_0) = params->emc_cmd_mapping_cmd0_0;
306
EMC(EMC_CMD_MAPPING_CMD0_1) = params->emc_cmd_mapping_cmd0_1;
307
EMC(EMC_CMD_MAPPING_CMD0_2) = params->emc_cmd_mapping_cmd0_2;
308
EMC(EMC_CMD_MAPPING_CMD1_0) = params->emc_cmd_mapping_cmd1_0;
309
EMC(EMC_CMD_MAPPING_CMD1_1) = params->emc_cmd_mapping_cmd1_1;
310
EMC(EMC_CMD_MAPPING_CMD1_2) = params->emc_cmd_mapping_cmd1_2;
311
EMC(EMC_CMD_MAPPING_CMD2_0) = params->emc_cmd_mapping_cmd2_0;
312
EMC(EMC_CMD_MAPPING_CMD2_1) = params->emc_cmd_mapping_cmd2_1;
313
EMC(EMC_CMD_MAPPING_CMD2_2) = params->emc_cmd_mapping_cmd2_2;
314
EMC(EMC_CMD_MAPPING_CMD3_0) = params->emc_cmd_mapping_cmd3_0;
315
EMC(EMC_CMD_MAPPING_CMD3_1) = params->emc_cmd_mapping_cmd3_1;
316
EMC(EMC_CMD_MAPPING_CMD3_2) = params->emc_cmd_mapping_cmd3_2;
317
EMC(EMC_CMD_MAPPING_BYTE) = params->emc_cmd_mapping_byte;
318
319
// Program brick mapping.
320
EMC(EMC_PMACRO_BRICK_MAPPING_0) = params->emc_pmacro_brick_mapping0;
321
EMC(EMC_PMACRO_BRICK_MAPPING_1) = params->emc_pmacro_brick_mapping1;
322
EMC(EMC_PMACRO_BRICK_MAPPING_2) = params->emc_pmacro_brick_mapping2;
323
324
EMC(EMC_PMACRO_BRICK_CTRL_RFU1) = (params->emc_pmacro_brick_ctrl_rfu1 & 0x1120112) | 0x1EED1EED;
325
326
// This is required to do any reads from the pad macros.
327
EMC(EMC_CONFIG_SAMPLE_DELAY) = params->emc_config_sample_delay;
328
329
// Set data pipes mode.
330
EMC(EMC_FBIO_CFG8) = params->emc_fbio_cfg8;
331
332
// Set swizzle for Rank 0.
333
EMC(EMC_SWIZZLE_RANK0_BYTE0) = params->emc_swizzle_rank0_byte0;
334
EMC(EMC_SWIZZLE_RANK0_BYTE1) = params->emc_swizzle_rank0_byte1;
335
EMC(EMC_SWIZZLE_RANK0_BYTE2) = params->emc_swizzle_rank0_byte2;
336
EMC(EMC_SWIZZLE_RANK0_BYTE3) = params->emc_swizzle_rank0_byte3;
337
// Set swizzle for Rank 1.
338
EMC(EMC_SWIZZLE_RANK1_BYTE0) = params->emc_swizzle_rank1_byte0;
339
EMC(EMC_SWIZZLE_RANK1_BYTE1) = params->emc_swizzle_rank1_byte1;
340
EMC(EMC_SWIZZLE_RANK1_BYTE2) = params->emc_swizzle_rank1_byte2;
341
EMC(EMC_SWIZZLE_RANK1_BYTE3) = params->emc_swizzle_rank1_byte3;
342
343
// Patch 3 using BCT spare variables.
344
if (params->emc_bct_spare6)
345
*(vu32 *)params->emc_bct_spare6 = params->emc_bct_spare7;
346
347
// Program calibration impedance.
348
EMC(EMC_XM2COMPPADCTRL) = params->emc_xm2_comp_pad_ctrl;
349
EMC(EMC_XM2COMPPADCTRL2) = params->emc_xm2_comp_pad_ctrl2;
350
EMC(EMC_XM2COMPPADCTRL3) = params->emc_xm2_comp_pad_ctrl3;
351
352
// Program Autocal controls.
353
EMC(EMC_AUTO_CAL_CONFIG2) = params->emc_auto_cal_config2;
354
EMC(EMC_AUTO_CAL_CONFIG3) = params->emc_auto_cal_config3;
355
EMC(EMC_AUTO_CAL_CONFIG4) = params->emc_auto_cal_config4;
356
EMC(EMC_AUTO_CAL_CONFIG5) = params->emc_auto_cal_config5;
357
EMC(EMC_AUTO_CAL_CONFIG6) = params->emc_auto_cal_config6;
358
EMC(EMC_AUTO_CAL_CONFIG7) = params->emc_auto_cal_config7;
359
EMC(EMC_AUTO_CAL_CONFIG8) = params->emc_auto_cal_config8;
360
361
// Program termination and drive strength
362
EMC(EMC_PMACRO_RX_TERM) = params->emc_pmacro_rx_term;
363
EMC(EMC_PMACRO_DQ_TX_DRV) = params->emc_pmacro_dq_tx_drive;
364
EMC(EMC_PMACRO_CA_TX_DRV) = params->emc_pmacro_ca_tx_drive;
365
EMC(EMC_PMACRO_CMD_TX_DRV) = params->emc_pmacro_cmd_tx_drive;
366
EMC(EMC_PMACRO_AUTOCAL_CFG_COMMON) = params->emc_pmacro_auto_cal_common;
367
EMC(EMC_AUTO_CAL_CHANNEL) = params->emc_auto_cal_channel;
368
EMC(EMC_PMACRO_ZCTRL) = params->emc_pmacro_zcrtl;
369
370
// Program dll config.
371
EMC(EMC_DLL_CFG_0) = params->emc_dll_cfg0;
372
EMC(EMC_DLL_CFG_1) = params->emc_dll_cfg1;
373
EMC(EMC_CFG_DIG_DLL_1) = params->emc_cfg_dig_dll_1;
374
375
// Program barrelshift.
376
EMC(EMC_DATA_BRLSHFT_0) = params->emc_data_brlshft0;
377
EMC(EMC_DATA_BRLSHFT_1) = params->emc_data_brlshft1;
378
EMC(EMC_DQS_BRLSHFT_0) = params->emc_dqs_brlshft0;
379
EMC(EMC_DQS_BRLSHFT_1) = params->emc_dqs_brlshft1;
380
EMC(EMC_CMD_BRLSHFT_0) = params->emc_cmd_brlshft0;
381
EMC(EMC_CMD_BRLSHFT_1) = params->emc_cmd_brlshft1;
382
EMC(EMC_CMD_BRLSHFT_2) = params->emc_cmd_brlshft2;
383
EMC(EMC_CMD_BRLSHFT_3) = params->emc_cmd_brlshft3;
384
EMC(EMC_QUSE_BRLSHFT_0) = params->emc_quse_brlshft0;
385
EMC(EMC_QUSE_BRLSHFT_1) = params->emc_quse_brlshft1;
386
EMC(EMC_QUSE_BRLSHFT_2) = params->emc_quse_brlshft2;
387
EMC(EMC_QUSE_BRLSHFT_3) = params->emc_quse_brlshft3;
388
389
// Program pad macros controls and termination.
390
EMC(EMC_PMACRO_BRICK_CTRL_RFU1) = (params->emc_pmacro_brick_ctrl_rfu1 & 0x1BF01BF) | 0x1E401E40;
391
EMC(EMC_PMACRO_PAD_CFG_CTRL) = params->emc_pmacro_pad_cfg_ctrl;
392
393
EMC(EMC_PMACRO_CMD_BRICK_CTRL_FDPD) = params->emc_pmacro_cmd_brick_ctrl_fdpd;
394
EMC(EMC_PMACRO_BRICK_CTRL_RFU2) = params->emc_pmacro_brick_ctrl_rfu2 & 0xFF7FFF7F;
395
EMC(EMC_PMACRO_DATA_BRICK_CTRL_FDPD) = params->emc_pmacro_data_brick_ctrl_fdpd;
396
EMC(EMC_PMACRO_BG_BIAS_CTRL_0) = params->emc_pmacro_bg_bias_ctrl0;
397
EMC(EMC_PMACRO_DATA_PAD_RX_CTRL) = params->emc_pmacro_data_pad_rx_ctrl;
398
EMC(EMC_PMACRO_CMD_PAD_RX_CTRL) = params->emc_pmacro_cmd_pad_rx_ctrl;
399
EMC(EMC_PMACRO_DATA_PAD_TX_CTRL) = params->emc_pmacro_data_pad_tx_ctrl;
400
EMC(EMC_PMACRO_DATA_RX_TERM_MODE) = params->emc_pmacro_data_rx_term_mode;
401
EMC(EMC_PMACRO_CMD_RX_TERM_MODE) = params->emc_pmacro_cmd_rx_term_mode;
402
EMC(EMC_PMACRO_CMD_PAD_TX_CTRL) = params->emc_pmacro_cmd_pad_tx_ctrl;
403
404
// Program pad macro pins/bytes.
405
EMC(EMC_CFG_3) = params->emc_cfg3;
406
EMC(EMC_PMACRO_TX_PWRD_0) = params->emc_pmacro_tx_pwrd0;
407
EMC(EMC_PMACRO_TX_PWRD_1) = params->emc_pmacro_tx_pwrd1;
408
EMC(EMC_PMACRO_TX_PWRD_2) = params->emc_pmacro_tx_pwrd2;
409
EMC(EMC_PMACRO_TX_PWRD_3) = params->emc_pmacro_tx_pwrd3;
410
EMC(EMC_PMACRO_TX_PWRD_4) = params->emc_pmacro_tx_pwrd4;
411
EMC(EMC_PMACRO_TX_PWRD_5) = params->emc_pmacro_tx_pwrd5;
412
EMC(EMC_PMACRO_TX_SEL_CLK_SRC_0) = params->emc_pmacro_tx_sel_clk_src0;
413
EMC(EMC_PMACRO_TX_SEL_CLK_SRC_1) = params->emc_pmacro_tx_sel_clk_src1;
414
EMC(EMC_PMACRO_TX_SEL_CLK_SRC_2) = params->emc_pmacro_tx_sel_clk_src2;
415
EMC(EMC_PMACRO_TX_SEL_CLK_SRC_3) = params->emc_pmacro_tx_sel_clk_src3;
416
EMC(EMC_PMACRO_TX_SEL_CLK_SRC_4) = params->emc_pmacro_tx_sel_clk_src4;
417
EMC(EMC_PMACRO_TX_SEL_CLK_SRC_5) = params->emc_pmacro_tx_sel_clk_src5;
418
EMC(EMC_PMACRO_DDLL_BYPASS) = params->emc_pmacro_ddll_bypass;
419
EMC(EMC_PMACRO_DDLL_PWRD_0) = params->emc_pmacro_ddll_pwrd0;
420
EMC(EMC_PMACRO_DDLL_PWRD_1) = params->emc_pmacro_ddll_pwrd1;
421
EMC(EMC_PMACRO_DDLL_PWRD_2) = params->emc_pmacro_ddll_pwrd2;
422
EMC(EMC_PMACRO_CMD_CTRL_0) = params->emc_pmacro_cmd_ctrl0;
423
EMC(EMC_PMACRO_CMD_CTRL_1) = params->emc_pmacro_cmd_ctrl1;
424
EMC(EMC_PMACRO_CMD_CTRL_2) = params->emc_pmacro_cmd_ctrl2;
425
426
// Program inbound vref setting.
427
EMC(EMC_PMACRO_IB_VREF_DQ_0) = params->emc_pmacro_ib_vref_dq_0;
428
EMC(EMC_PMACRO_IB_VREF_DQ_1) = params->emc_pmacro_ib_vref_dq_1;
429
EMC(EMC_PMACRO_IB_VREF_DQS_0) = params->emc_pmacro_ib_vref_dqs_0;
430
EMC(EMC_PMACRO_IB_VREF_DQS_1) = params->emc_pmacro_ib_vref_dqs_1;
431
EMC(EMC_PMACRO_IB_RXRT) = params->emc_pmacro_ib_rxrt;
432
433
// Program quse trimmers.
434
EMC(EMC_PMACRO_QUSE_DDLL_RANK0_0) = params->emc_pmacro_quse_ddll_rank0_0;
435
EMC(EMC_PMACRO_QUSE_DDLL_RANK0_1) = params->emc_pmacro_quse_ddll_rank0_1;
436
EMC(EMC_PMACRO_QUSE_DDLL_RANK0_2) = params->emc_pmacro_quse_ddll_rank0_2;
437
EMC(EMC_PMACRO_QUSE_DDLL_RANK0_3) = params->emc_pmacro_quse_ddll_rank0_3;
438
EMC(EMC_PMACRO_QUSE_DDLL_RANK0_4) = params->emc_pmacro_quse_ddll_rank0_4;
439
EMC(EMC_PMACRO_QUSE_DDLL_RANK0_5) = params->emc_pmacro_quse_ddll_rank0_5;
440
EMC(EMC_PMACRO_QUSE_DDLL_RANK1_0) = params->emc_pmacro_quse_ddll_rank1_0;
441
EMC(EMC_PMACRO_QUSE_DDLL_RANK1_1) = params->emc_pmacro_quse_ddll_rank1_1;
442
EMC(EMC_PMACRO_QUSE_DDLL_RANK1_2) = params->emc_pmacro_quse_ddll_rank1_2;
443
EMC(EMC_PMACRO_QUSE_DDLL_RANK1_3) = params->emc_pmacro_quse_ddll_rank1_3;
444
EMC(EMC_PMACRO_QUSE_DDLL_RANK1_4) = params->emc_pmacro_quse_ddll_rank1_4;
445
EMC(EMC_PMACRO_QUSE_DDLL_RANK1_5) = params->emc_pmacro_quse_ddll_rank1_5;
446
EMC(EMC_PMACRO_BRICK_CTRL_RFU1) = params->emc_pmacro_brick_ctrl_rfu1;
447
448
// Program outbound trimmers.
449
EMC(EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_0) = params->emc_pmacro_ob_ddll_long_dq_rank0_0;
450
EMC(EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_1) = params->emc_pmacro_ob_ddll_long_dq_rank0_1;
451
EMC(EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_2) = params->emc_pmacro_ob_ddll_long_dq_rank0_2;
452
EMC(EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_3) = params->emc_pmacro_ob_ddll_long_dq_rank0_3;
453
EMC(EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_4) = params->emc_pmacro_ob_ddll_long_dq_rank0_4;
454
EMC(EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_5) = params->emc_pmacro_ob_ddll_long_dq_rank0_5;
455
EMC(EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_0) = params->emc_pmacro_ob_ddll_long_dq_rank1_0;
456
EMC(EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_1) = params->emc_pmacro_ob_ddll_long_dq_rank1_1;
457
EMC(EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_2) = params->emc_pmacro_ob_ddll_long_dq_rank1_2;
458
EMC(EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_3) = params->emc_pmacro_ob_ddll_long_dq_rank1_3;
459
EMC(EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_4) = params->emc_pmacro_ob_ddll_long_dq_rank1_4;
460
EMC(EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_5) = params->emc_pmacro_ob_ddll_long_dq_rank1_5;
461
462
EMC(EMC_PMACRO_OB_DDLL_LONG_DQS_RANK0_0) = params->emc_pmacro_ob_ddll_long_dqs_rank0_0;
463
EMC(EMC_PMACRO_OB_DDLL_LONG_DQS_RANK0_1) = params->emc_pmacro_ob_ddll_long_dqs_rank0_1;
464
EMC(EMC_PMACRO_OB_DDLL_LONG_DQS_RANK0_2) = params->emc_pmacro_ob_ddll_long_dqs_rank0_2;
465
EMC(EMC_PMACRO_OB_DDLL_LONG_DQS_RANK0_3) = params->emc_pmacro_ob_ddll_long_dqs_rank0_3;
466
EMC(EMC_PMACRO_OB_DDLL_LONG_DQS_RANK0_4) = params->emc_pmacro_ob_ddll_long_dqs_rank0_4;
467
EMC(EMC_PMACRO_OB_DDLL_LONG_DQS_RANK0_5) = params->emc_pmacro_ob_ddll_long_dqs_rank0_5;
468
EMC(EMC_PMACRO_OB_DDLL_LONG_DQS_RANK1_0) = params->emc_pmacro_ob_ddll_long_dqs_rank1_0;
469
EMC(EMC_PMACRO_OB_DDLL_LONG_DQS_RANK1_1) = params->emc_pmacro_ob_ddll_long_dqs_rank1_1;
470
EMC(EMC_PMACRO_OB_DDLL_LONG_DQS_RANK1_2) = params->emc_pmacro_ob_ddll_long_dqs_rank1_2;
471
EMC(EMC_PMACRO_OB_DDLL_LONG_DQS_RANK1_3) = params->emc_pmacro_ob_ddll_long_dqs_rank1_3;
472
EMC(EMC_PMACRO_OB_DDLL_LONG_DQS_RANK1_4) = params->emc_pmacro_ob_ddll_long_dqs_rank1_4;
473
EMC(EMC_PMACRO_OB_DDLL_LONG_DQS_RANK1_5) = params->emc_pmacro_ob_ddll_long_dqs_rank1_5;
474
EMC(EMC_PMACRO_IB_DDLL_LONG_DQS_RANK0_0) = params->emc_pmacro_ib_ddll_long_dqs_rank0_0;
475
EMC(EMC_PMACRO_IB_DDLL_LONG_DQS_RANK0_1) = params->emc_pmacro_ib_ddll_long_dqs_rank0_1;
476
EMC(EMC_PMACRO_IB_DDLL_LONG_DQS_RANK0_2) = params->emc_pmacro_ib_ddll_long_dqs_rank0_2;
477
EMC(EMC_PMACRO_IB_DDLL_LONG_DQS_RANK0_3) = params->emc_pmacro_ib_ddll_long_dqs_rank0_3;
478
EMC(EMC_PMACRO_IB_DDLL_LONG_DQS_RANK1_0) = params->emc_pmacro_ib_ddll_long_dqs_rank1_0;
479
EMC(EMC_PMACRO_IB_DDLL_LONG_DQS_RANK1_1) = params->emc_pmacro_ib_ddll_long_dqs_rank1_1;
480
EMC(EMC_PMACRO_IB_DDLL_LONG_DQS_RANK1_2) = params->emc_pmacro_ib_ddll_long_dqs_rank1_2;
481
EMC(EMC_PMACRO_IB_DDLL_LONG_DQS_RANK1_3) = params->emc_pmacro_ib_ddll_long_dqs_rank1_3;
482
483
// Program clock trimmers.
484
EMC(EMC_PMACRO_DDLL_LONG_CMD_0) = params->emc_pmacro_ddll_long_cmd_0;
485
EMC(EMC_PMACRO_DDLL_LONG_CMD_1) = params->emc_pmacro_ddll_long_cmd_1;
486
EMC(EMC_PMACRO_DDLL_LONG_CMD_2) = params->emc_pmacro_ddll_long_cmd_2;
487
EMC(EMC_PMACRO_DDLL_LONG_CMD_3) = params->emc_pmacro_ddll_long_cmd_3;
488
EMC(EMC_PMACRO_DDLL_LONG_CMD_4) = params->emc_pmacro_ddll_long_cmd_4;
489
EMC(EMC_PMACRO_DDLL_SHORT_CMD_0) = params->emc_pmacro_ddll_short_cmd_0;
490
EMC(EMC_PMACRO_DDLL_SHORT_CMD_1) = params->emc_pmacro_ddll_short_cmd_1;
491
EMC(EMC_PMACRO_DDLL_SHORT_CMD_2) = params->emc_pmacro_ddll_short_cmd_2;
492
493
// Common pad macro (cpm).
494
EMC(EMC_PMACRO_COMMON_PAD_TX_CTRL) = (params->emc_pmacro_common_pad_tx_ctrl & 1) | 0xE;
495
496
// Patch 4 using BCT spare variables.
497
if (params->emc_bct_spare4)
498
*(vu32 *)params->emc_bct_spare4 = params->emc_bct_spare5;
499
500
// Trigger timing update so above writes take place.
501
EMC(EMC_TIMING_CONTROL) = 1;
502
503
// Initialize MC VPR settings.
504
MC(MC_VIDEO_PROTECT_BOM) = params->mc_video_protect_bom;
505
MC(MC_VIDEO_PROTECT_BOM_ADR_HI) = params->mc_video_protect_bom_adr_hi;
506
MC(MC_VIDEO_PROTECT_SIZE_MB) = params->mc_video_protect_size_mb;
507
MC(MC_VIDEO_PROTECT_VPR_OVERRIDE) = params->mc_video_protect_vpr_override;
508
MC(MC_VIDEO_PROTECT_VPR_OVERRIDE1) = params->mc_video_protect_vpr_override1;
509
MC(MC_VIDEO_PROTECT_GPU_OVERRIDE_0) = params->mc_video_protect_gpu_override0;
510
MC(MC_VIDEO_PROTECT_GPU_OVERRIDE_1) = params->mc_video_protect_gpu_override1;
511
512
// Program SDRAM geometry parameters.
513
MC(MC_EMEM_ADR_CFG) = params->mc_emem_adr_cfg;
514
MC(MC_EMEM_ADR_CFG_DEV0) = params->mc_emem_adr_cfg_dev0;
515
MC(MC_EMEM_ADR_CFG_DEV1) = params->mc_emem_adr_cfg_dev1;
516
MC(MC_EMEM_ADR_CFG_CHANNEL_MASK) = params->mc_emem_adr_cfg_channel_mask;
517
518
// Program bank swizzling.
519
MC(MC_EMEM_ADR_CFG_BANK_MASK_0) = params->mc_emem_adr_cfg_bank_mask0;
520
MC(MC_EMEM_ADR_CFG_BANK_MASK_1) = params->mc_emem_adr_cfg_bank_mask1;
521
MC(MC_EMEM_ADR_CFG_BANK_MASK_2) = params->mc_emem_adr_cfg_bank_mask2;
522
523
// Program external memory aperture (base and size).
524
MC(MC_EMEM_CFG) = params->mc_emem_cfg;
525
526
// Program SEC carveout (base and size).
527
MC(MC_SEC_CARVEOUT_BOM) = params->mc_sec_carveout_bom;
528
MC(MC_SEC_CARVEOUT_ADR_HI) = params->mc_sec_carveout_adr_hi;
529
MC(MC_SEC_CARVEOUT_SIZE_MB) = params->mc_sec_carveout_size_mb;
530
531
// Program MTS carveout (base and size).
532
MC(MC_MTS_CARVEOUT_BOM) = params->mc_mts_carveout_bom;
533
MC(MC_MTS_CARVEOUT_ADR_HI) = params->mc_mts_carveout_adr_hi;
534
MC(MC_MTS_CARVEOUT_SIZE_MB) = params->mc_mts_carveout_size_mb;
535
536
// Program the memory arbiter.
537
MC(MC_EMEM_ARB_CFG) = params->mc_emem_arb_cfg;
538
MC(MC_EMEM_ARB_OUTSTANDING_REQ) = params->mc_emem_arb_outstanding_req;
539
MC(MC_EMEM_ARB_REFPB_HP_CTRL) = params->emc_emem_arb_refpb_hp_ctrl;
540
MC(MC_EMEM_ARB_REFPB_BANK_CTRL) = params->emc_emem_arb_refpb_bank_ctrl;
541
MC(MC_EMEM_ARB_TIMING_RCD) = params->mc_emem_arb_timing_rcd;
542
MC(MC_EMEM_ARB_TIMING_RP) = params->mc_emem_arb_timing_rp;
543
MC(MC_EMEM_ARB_TIMING_RC) = params->mc_emem_arb_timing_rc;
544
MC(MC_EMEM_ARB_TIMING_RAS) = params->mc_emem_arb_timing_ras;
545
MC(MC_EMEM_ARB_TIMING_FAW) = params->mc_emem_arb_timing_faw;
546
MC(MC_EMEM_ARB_TIMING_RRD) = params->mc_emem_arb_timing_rrd;
547
MC(MC_EMEM_ARB_TIMING_RAP2PRE) = params->mc_emem_arb_timing_rap2pre;
548
MC(MC_EMEM_ARB_TIMING_WAP2PRE) = params->mc_emem_arb_timing_wap2pre;
549
MC(MC_EMEM_ARB_TIMING_R2R) = params->mc_emem_arb_timing_r2r;
550
MC(MC_EMEM_ARB_TIMING_W2W) = params->mc_emem_arb_timing_w2w;
551
MC(MC_EMEM_ARB_TIMING_CCDMW) = params->mc_emem_arb_timing_ccdmw;
552
MC(MC_EMEM_ARB_TIMING_R2W) = params->mc_emem_arb_timing_r2w;
553
MC(MC_EMEM_ARB_TIMING_W2R) = params->mc_emem_arb_timing_w2r;
554
MC(MC_EMEM_ARB_TIMING_RFCPB) = params->mc_emem_arb_timing_rfcpb;
555
MC(MC_EMEM_ARB_DA_TURNS) = params->mc_emem_arb_da_turns;
556
MC(MC_EMEM_ARB_DA_COVERS) = params->mc_emem_arb_da_covers;
557
MC(MC_EMEM_ARB_MISC0) = params->mc_emem_arb_misc0;
558
MC(MC_EMEM_ARB_MISC1) = params->mc_emem_arb_misc1;
559
MC(MC_EMEM_ARB_MISC2) = params->mc_emem_arb_misc2;
560
MC(MC_EMEM_ARB_RING1_THROTTLE) = params->mc_emem_arb_ring1_throttle;
561
MC(MC_EMEM_ARB_OVERRIDE) = params->mc_emem_arb_override;
562
MC(MC_EMEM_ARB_OVERRIDE_1) = params->mc_emem_arb_override1;
563
MC(MC_EMEM_ARB_RSV) = params->mc_emem_arb_rsv;
564
MC(MC_DA_CONFIG0) = params->mc_da_cfg0;
565
566
// Trigger MC timing update.
567
MC(MC_TIMING_CONTROL) = 1;
568
569
// Program second-level clock enable overrides.
570
MC(MC_CLKEN_OVERRIDE) = params->mc_clken_override;
571
572
// Program statistics gathering.
573
MC(MC_STAT_CONTROL) = params->mc_stat_control;
574
575
// Program SDRAM geometry parameters.
576
EMC(EMC_ADR_CFG) = params->emc_adr_cfg;
577
578
// Program second-level clock enable overrides.
579
EMC(EMC_CLKEN_OVERRIDE) = params->emc_clken_override;
580
581
// Program EMC pad auto calibration.
582
EMC(EMC_PMACRO_AUTOCAL_CFG_0) = params->emc_pmacro_auto_cal_cfg0;
583
EMC(EMC_PMACRO_AUTOCAL_CFG_1) = params->emc_pmacro_auto_cal_cfg1;
584
EMC(EMC_PMACRO_AUTOCAL_CFG_2) = params->emc_pmacro_auto_cal_cfg2;
585
586
EMC(EMC_AUTO_CAL_VREF_SEL_0) = params->emc_auto_cal_vref_sel0;
587
EMC(EMC_AUTO_CAL_VREF_SEL_1) = params->emc_auto_cal_vref_sel1;
588
589
// Program/Start auto calibration.
590
EMC(EMC_AUTO_CAL_INTERVAL) = params->emc_auto_cal_interval;
591
EMC(EMC_AUTO_CAL_CONFIG) = params->emc_auto_cal_config;
592
usleep(params->emc_auto_cal_wait);
593
594
// Patch 5 using BCT spare variables.
595
if (params->emc_bct_spare8)
596
*(vu32 *)params->emc_bct_spare8 = params->emc_bct_spare9;
597
598
// Program EMC timing configuration.
599
EMC(EMC_CFG_2) = params->emc_cfg2;
600
EMC(EMC_CFG_PIPE) = params->emc_cfg_pipe;
601
EMC(EMC_CFG_PIPE_1) = params->emc_cfg_pipe1;
602
EMC(EMC_CFG_PIPE_2) = params->emc_cfg_pipe2;
603
EMC(EMC_CMDQ) = params->emc_cmd_q;
604
EMC(EMC_MC2EMCQ) = params->emc_mc2emc_q;
605
EMC(EMC_MRS_WAIT_CNT) = params->emc_mrs_wait_cnt;
606
EMC(EMC_MRS_WAIT_CNT2) = params->emc_mrs_wait_cnt2;
607
EMC(EMC_FBIO_CFG5) = params->emc_fbio_cfg5;
608
EMC(EMC_RC) = params->emc_rc;
609
EMC(EMC_RFC) = params->emc_rfc;
610
EMC(EMC_RFCPB) = params->emc_rfc_pb;
611
EMC(EMC_REFCTRL2) = params->emc_ref_ctrl2;
612
EMC(EMC_RFC_SLR) = params->emc_rfc_slr;
613
EMC(EMC_RAS) = params->emc_ras;
614
EMC(EMC_RP) = params->emc_rp;
615
EMC(EMC_TPPD) = params->emc_tppd;
616
EMC(EMC_R2R) = params->emc_r2r;
617
EMC(EMC_W2W) = params->emc_w2w;
618
EMC(EMC_R2W) = params->emc_r2w;
619
EMC(EMC_W2R) = params->emc_w2r;
620
EMC(EMC_R2P) = params->emc_r2p;
621
EMC(EMC_W2P) = params->emc_w2p;
622
EMC(EMC_CCDMW) = params->emc_ccdmw;
623
EMC(EMC_RD_RCD) = params->emc_rd_rcd;
624
EMC(EMC_WR_RCD) = params->emc_wr_rcd;
625
EMC(EMC_RRD) = params->emc_rrd;
626
EMC(EMC_REXT) = params->emc_rext;
627
EMC(EMC_WEXT) = params->emc_wext;
628
EMC(EMC_WDV) = params->emc_wdv;
629
EMC(EMC_WDV_CHK) = params->emc_wdv_chk;
630
EMC(EMC_WSV) = params->emc_wsv;
631
EMC(EMC_WEV) = params->emc_wev;
632
EMC(EMC_WDV_MASK) = params->emc_wdv_mask;
633
EMC(EMC_WS_DURATION) = params->emc_ws_duration;
634
EMC(EMC_WE_DURATION) = params->emc_we_duration;
635
EMC(EMC_QUSE) = params->emc_quse;
636
EMC(EMC_QUSE_WIDTH) = params->emc_quse_width;
637
EMC(EMC_IBDLY) = params->emc_ibdly;
638
EMC(EMC_OBDLY) = params->emc_obdly;
639
EMC(EMC_EINPUT) = params->emc_einput;
640
EMC(EMC_EINPUT_DURATION) = params->emc_einput_duration;
641
EMC(EMC_PUTERM_EXTRA) = params->emc_puterm_extra;
642
EMC(EMC_PUTERM_WIDTH) = params->emc_puterm_width;
643
644
EMC(EMC_PMACRO_COMMON_PAD_TX_CTRL) = params->emc_pmacro_common_pad_tx_ctrl;
645
EMC(EMC_DBG) = params->emc_dbg;
646
647
// Clear read fifo.
648
EMC(EMC_QRST) = params->emc_qrst;
649
EMC(EMC_ISSUE_QRST) = 1;
650
EMC(EMC_ISSUE_QRST) = 0;
651
652
// Program the rest of EMC timing configuration.
653
EMC(EMC_QSAFE) = params->emc_qsafe;
654
EMC(EMC_RDV) = params->emc_rdv;
655
EMC(EMC_RDV_MASK) = params->emc_rdv_mask;
656
EMC(EMC_RDV_EARLY) = params->emc_rdv_early;
657
EMC(EMC_RDV_EARLY_MASK) = params->emc_rdv_early_mask;
658
EMC(EMC_QPOP) = params->emc_qpop;
659
EMC(EMC_REFRESH) = params->emc_refresh;
660
EMC(EMC_BURST_REFRESH_NUM) = params->emc_burst_refresh_num;
661
EMC(EMC_PRE_REFRESH_REQ_CNT) = params->emc_prerefresh_req_cnt;
662
EMC(EMC_PDEX2WR) = params->emc_pdex2wr;
663
EMC(EMC_PDEX2RD) = params->emc_pdex2rd;
664
EMC(EMC_PCHG2PDEN) = params->emc_pchg2pden;
665
EMC(EMC_ACT2PDEN) = params->emc_act2pden;
666
EMC(EMC_AR2PDEN) = params->emc_ar2pden;
667
EMC(EMC_RW2PDEN) = params->emc_rw2pden;
668
EMC(EMC_CKE2PDEN) = params->emc_cke2pden;
669
EMC(EMC_PDEX2CKE) = params->emc_pdex2che;
670
EMC(EMC_PDEX2MRR) = params->emc_pdex2mrr;
671
EMC(EMC_TXSR) = params->emc_txsr;
672
EMC(EMC_TXSRDLL) = params->emc_txsr_dll;
673
EMC(EMC_TCKE) = params->emc_tcke;
674
EMC(EMC_TCKESR) = params->emc_tckesr;
675
EMC(EMC_TPD) = params->emc_tpd;
676
EMC(EMC_TFAW) = params->emc_tfaw;
677
EMC(EMC_TRPAB) = params->emc_trpab;
678
EMC(EMC_TCLKSTABLE) = params->emc_tclkstable;
679
EMC(EMC_TCLKSTOP) = params->emc_tclkstop;
680
EMC(EMC_TREFBW) = params->emc_trefbw;
681
EMC(EMC_ODT_WRITE) = params->emc_odt_write;
682
EMC(EMC_CFG_DIG_DLL) = params->emc_cfg_dig_dll;
683
EMC(EMC_CFG_DIG_DLL_PERIOD) = params->emc_cfg_dig_dll_period;
684
685
// Don't write CFG_ADR_EN (bit 1) here - lock bit written later.
686
EMC(EMC_FBIO_SPARE) = params->emc_fbio_spare & 0xFFFFFFFD;
687
EMC(EMC_CFG_RSV) = params->emc_cfg_rsv;
688
EMC(EMC_PMC_SCRATCH1) = params->emc_pmc_scratch1;
689
EMC(EMC_PMC_SCRATCH2) = params->emc_pmc_scratch2;
690
EMC(EMC_PMC_SCRATCH3) = params->emc_pmc_scratch3;
691
EMC(EMC_ACPD_CONTROL) = params->emc_acpd_control;
692
EMC(EMC_TXDSRVTTGEN) = params->emc_txdsrvttgen;
693
694
// Set pipe bypass enable bits before sending any DRAM commands.
695
EMC(EMC_CFG) = (params->emc_cfg & 0xE) | 0x3C00000;
696
697
// Patch BootROM.
698
if (params->boot_rom_patch_control & BIT(31))
699
{
700
*(vu32 *)(APB_MISC_BASE + params->boot_rom_patch_control * 4) = params->boot_rom_patch_data;
701
702
// Trigger MC timing update.
703
MC(MC_TIMING_CONTROL) = 1;
704
}
705
706
// Release SEL_DPD_CMD.
707
PMC(APBDEV_PMC_IO_DPD3_REQ) = (params->emc_pmc_scratch1 & 0xFFF0000) | PMC_IO_DPD_REQ_DPD_OFF;
708
usleep(params->pmc_io_dpd3_req_wait);
709
710
// Stall auto call measurements if periodic calibration is disabled.
711
if (!params->emc_auto_cal_interval)
712
EMC(EMC_AUTO_CAL_CONFIG) = params->emc_auto_cal_config | 0x200;
713
714
EMC(EMC_PMACRO_BRICK_CTRL_RFU2) = params->emc_pmacro_brick_ctrl_rfu2;
715
716
// ZQ CAL setup (not actually issuing ZQ CAL now).
717
if (params->emc_zcal_warm_cold_boot_enables & 1)
718
{
719
EMC(EMC_ZCAL_WAIT_CNT) = params->emc_zcal_wait_cnt;
720
EMC(EMC_ZCAL_MRW_CMD) = params->emc_zcal_mrw_cmd;
721
}
722
723
// Trigger timing update so above writes take place.
724
EMC(EMC_TIMING_CONTROL) = 1;
725
usleep(params->emc_timing_control_wait);
726
727
// Deassert HOLD_CKE_LOW.
728
PMC(APBDEV_PMC_DDR_CNTRL) &= 0xFFF8007F;
729
usleep(params->pmc_ddr_ctrl_wait);
730
731
// Set clock enable signal.
732
u32 pin_gpio_cfg = (params->emc_pin_gpio_enable << 16) | (params->emc_pin_gpio << 12);
733
EMC(EMC_PIN) = pin_gpio_cfg;
734
(void)EMC(EMC_PIN);
735
usleep(params->emc_pin_extra_wait + 200);
736
EMC(EMC_PIN) = pin_gpio_cfg | 0x100;
737
(void)EMC(EMC_PIN);
738
739
usleep(params->emc_pin_extra_wait + 2000);
740
741
// Enable clock enable signal.
742
EMC(EMC_PIN) = pin_gpio_cfg | 0x101;
743
(void)EMC(EMC_PIN);
744
usleep(params->emc_pin_program_wait);
745
746
// Init zq calibration,
747
// Patch 6 using BCT spare variables.
748
if (params->emc_bct_spare10)
749
*(vu32 *)params->emc_bct_spare10 = params->emc_bct_spare11;
750
751
// Write mode registers.
752
EMC(EMC_MRW2) = params->emc_mrw2;
753
EMC(EMC_MRW) = params->emc_mrw1;
754
EMC(EMC_MRW3) = params->emc_mrw3;
755
EMC(EMC_MRW4) = params->emc_mrw4;
756
EMC(EMC_MRW6) = params->emc_mrw6;
757
EMC(EMC_MRW14) = params->emc_mrw14;
758
759
EMC(EMC_MRW8) = params->emc_mrw8;
760
EMC(EMC_MRW12) = params->emc_mrw12;
761
EMC(EMC_MRW9) = params->emc_mrw9;
762
EMC(EMC_MRW13) = params->emc_mrw13;
763
764
if (params->emc_zcal_warm_cold_boot_enables & 1)
765
{
766
// Issue ZQCAL start, device 0.
767
EMC(EMC_ZQ_CAL) = params->emc_zcal_init_dev0;
768
usleep(params->emc_zcal_init_wait);
769
770
// Issue ZQCAL latch.
771
EMC(EMC_ZQ_CAL) = params->emc_zcal_init_dev0 ^ 3;
772
// Same for device 1.
773
if (!(params->emc_dev_select & 2))
774
{
775
EMC(EMC_ZQ_CAL) = params->emc_zcal_init_dev1;
776
usleep(params->emc_zcal_init_wait);
777
EMC(EMC_ZQ_CAL) = params->emc_zcal_init_dev1 ^ 3;
778
}
779
}
780
781
// Set package and DPD pad control.
782
PMC(APBDEV_PMC_DDR_CFG) = params->pmc_ddr_cfg;
783
784
// Start periodic ZQ calibration (LPDDRx only).
785
EMC(EMC_ZCAL_INTERVAL) = params->emc_zcal_interval;
786
EMC(EMC_ZCAL_WAIT_CNT) = params->emc_zcal_wait_cnt;
787
EMC(EMC_ZCAL_MRW_CMD) = params->emc_zcal_mrw_cmd;
788
789
// Patch 7 using BCT spare variables.
790
if (params->emc_bct_spare12)
791
*(vu32 *)params->emc_bct_spare12 = params->emc_bct_spare13;
792
793
// Trigger timing update so above writes take place.
794
EMC(EMC_TIMING_CONTROL) = 1;
795
796
if (params->emc_extra_refresh_num)
797
EMC(EMC_REF) = (((1 << params->emc_extra_refresh_num) - 1) << 8) | (params->emc_dev_select << 30) | 3;
798
799
// Enable refresh.
800
EMC(EMC_REFCTRL) = params->emc_dev_select | BIT(31);
801
802
EMC(EMC_DYN_SELF_REF_CONTROL) = params->emc_dyn_self_ref_control;
803
EMC(EMC_CFG_UPDATE) = params->emc_cfg_update;
804
EMC(EMC_CFG) = params->emc_cfg;
805
EMC(EMC_FDPD_CTRL_DQ) = params->emc_fdpd_ctrl_dq;
806
EMC(EMC_FDPD_CTRL_CMD) = params->emc_fdpd_ctrl_cmd;
807
EMC(EMC_SEL_DPD_CTRL) = params->emc_sel_dpd_ctrl;
808
809
// Write addr swizzle lock bit.
810
EMC(EMC_FBIO_SPARE) = params->emc_fbio_spare | BIT(1);
811
812
// Re-trigger timing to latch power saving functions.
813
EMC(EMC_TIMING_CONTROL) = 1;
814
815
// Enable EMC pipe clock gating.
816
EMC(EMC_CFG_PIPE_CLK) = params->emc_cfg_pipe_clk;
817
818
// Depending on freqency, enable CMD/CLK fdpd.
819
EMC(EMC_FDPD_CTRL_CMD_NO_RAMP) = params->emc_fdpd_ctrl_cmd_no_ramp;
820
821
// Enable arbiter.
822
SYSREG(AHB_ARBITRATION_XBAR_CTRL) = (SYSREG(AHB_ARBITRATION_XBAR_CTRL) & 0xFFFEFFFF) | (params->ahb_arbitration_xbar_ctrl_meminit_done << 16);
823
824
// Lock carveouts per BCT cfg.
825
MC(MC_VIDEO_PROTECT_REG_CTRL) = params->mc_video_protect_write_access;
826
MC(MC_SEC_CARVEOUT_REG_CTRL) = params->mc_sec_carveout_protect_write_access;
827
MC(MC_MTS_CARVEOUT_REG_CTRL) = params->mc_mts_carveout_reg_ctrl;
828
829
// Disable write access to a bunch of EMC registers.
830
MC(MC_EMEM_CFG_ACCESS_CTRL) = 1;
831
}
832
833
static void _sdram_config_t210b01(const sdram_params_t210b01_t *params)
834
{
835
// VDDP Select.
836
PMC(APBDEV_PMC_VDDP_SEL) = params->pmc_vddp_sel;
837
usleep(params->pmc_vddp_sel_wait);
838
839
// Turn on MEM IO Power.
840
PMC(APBDEV_PMC_NO_IOPOWER) &= PMC_NO_IOPOWER_SDMMC1; // Only keep SDMMC1 state. (Was params->pmc_no_io_power).
841
PMC(APBDEV_PMC_REG_SHORT) = params->pmc_reg_short;
842
843
PMC(APBDEV_PMC_DDR_CNTRL) = params->pmc_ddr_ctrl;
844
845
// Patch 1 using BCT spare variables
846
if (params->emc_bct_spare0)
847
*(vu32 *)params->emc_bct_spare0 = params->emc_bct_spare1;
848
849
// Override HW FSM if needed.
850
if (params->clk_rst_pllm_misc20_override_enable)
851
CLOCK(CLK_RST_CONTROLLER_PLLM_MISC2) = params->clk_rst_pllm_misc20_override;
852
853
// Program DPD3/DPD4 regs (coldboot path).
854
// Enable sel_dpd on unused pins.
855
u32 pmc_scratch1 = ~params->emc_pmc_scratch1;
856
PMC(APBDEV_PMC_WEAK_BIAS) = (pmc_scratch1 & 0x1000) << 19 | (pmc_scratch1 & 0xFFF) << 18 | (pmc_scratch1 & 0x8000) << 15;
857
PMC(APBDEV_PMC_IO_DPD3_REQ) = (pmc_scratch1 & 0x9FFF) | PMC_IO_DPD_REQ_DPD_ON;
858
usleep(params->pmc_io_dpd3_req_wait);
859
860
// Disable e_dpd_vttgen.
861
u32 pmc_scratch2 = ~params->emc_pmc_scratch2;
862
PMC(APBDEV_PMC_IO_DPD4_REQ) = (pmc_scratch2 & 0x3FFF0000) | PMC_IO_DPD_REQ_DPD_ON;
863
usleep(params->pmc_io_dpd4_req_wait);
864
865
// Disable e_dpd_bg.
866
PMC(APBDEV_PMC_IO_DPD4_REQ) = (pmc_scratch2 & 0x1FFF) | PMC_IO_DPD_REQ_DPD_ON;
867
usleep(1);
868
869
// Program CMD mapping. Required before brick mapping, else
870
// we can't guarantee CK will be differential at all times.
871
EMC(EMC_FBIO_CFG7) = params->emc_fbio_cfg7;
872
EMC(EMC_CMD_MAPPING_CMD0_0) = params->emc_cmd_mapping_cmd0_0;
873
EMC(EMC_CMD_MAPPING_CMD0_1) = params->emc_cmd_mapping_cmd0_1;
874
EMC(EMC_CMD_MAPPING_CMD0_2) = params->emc_cmd_mapping_cmd0_2;
875
EMC(EMC_CMD_MAPPING_CMD1_0) = params->emc_cmd_mapping_cmd1_0;
876
EMC(EMC_CMD_MAPPING_CMD1_1) = params->emc_cmd_mapping_cmd1_1;
877
EMC(EMC_CMD_MAPPING_CMD1_2) = params->emc_cmd_mapping_cmd1_2;
878
EMC(EMC_CMD_MAPPING_CMD2_0) = params->emc_cmd_mapping_cmd2_0;
879
EMC(EMC_CMD_MAPPING_CMD2_1) = params->emc_cmd_mapping_cmd2_1;
880
EMC(EMC_CMD_MAPPING_CMD2_2) = params->emc_cmd_mapping_cmd2_2;
881
EMC(EMC_CMD_MAPPING_CMD3_0) = params->emc_cmd_mapping_cmd3_0;
882
EMC(EMC_CMD_MAPPING_CMD3_1) = params->emc_cmd_mapping_cmd3_1;
883
EMC(EMC_CMD_MAPPING_CMD3_2) = params->emc_cmd_mapping_cmd3_2;
884
EMC(EMC_CMD_MAPPING_BYTE) = params->emc_cmd_mapping_byte;
885
886
// Program brick mapping.
887
EMC(EMC_PMACRO_BRICK_MAPPING_0) = params->emc_pmacro_brick_mapping0;
888
EMC(EMC_PMACRO_BRICK_MAPPING_1) = params->emc_pmacro_brick_mapping1;
889
EMC(EMC_PMACRO_BRICK_MAPPING_2) = params->emc_pmacro_brick_mapping2;
890
891
// Set pad macros.
892
EMC(EMC_PMACRO_VTTGEN_CTRL_0) = params->emc_pmacro_vttgen_ctrl0;
893
EMC(EMC_PMACRO_VTTGEN_CTRL_1) = params->emc_pmacro_vttgen_ctrl1;
894
EMC(EMC_PMACRO_VTTGEN_CTRL_2) = params->emc_pmacro_vttgen_ctrl2;
895
896
// Set pad macros bias.
897
EMC(EMC_PMACRO_BG_BIAS_CTRL_0) = params->emc_pmacro_bg_bias_ctrl0;
898
899
// Patch 1 to 3 using BCT spare secure variables.
900
if (params->emc_bct_spare_secure0)
901
*(vu32 *)params->emc_bct_spare_secure0 = params->emc_bct_spare_secure1;
902
if (params->emc_bct_spare_secure2)
903
*(vu32 *)params->emc_bct_spare_secure2 = params->emc_bct_spare_secure3;
904
if (params->emc_bct_spare_secure4)
905
*(vu32 *)params->emc_bct_spare_secure4 = params->emc_bct_spare_secure5;
906
907
// Trigger timing update so above writes take place.
908
EMC(EMC_TIMING_CONTROL) = 1;
909
usleep(params->pmc_vddp_sel_wait + 2); // Ensure the regulators settle.
910
911
// Set clock sources.
912
CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_EMC) = params->emc_clock_source;
913
CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_EMC_DLL) = params->emc_clock_source_dll;
914
915
// Select EMC write mux.
916
EMC(EMC_DBG) = (params->emc_dbg_write_mux << 1) | params->emc_dbg;
917
918
// Patch 2 using BCT spare variables.
919
if (params->emc_bct_spare2)
920
*(vu32 *)params->emc_bct_spare2 = params->emc_bct_spare3;
921
922
// This is required to do any reads from the pad macros.
923
EMC(EMC_CONFIG_SAMPLE_DELAY) = params->emc_config_sample_delay;
924
925
// Set data pipes mode.
926
EMC(EMC_FBIO_CFG8) = params->emc_fbio_cfg8;
927
928
// Set swizzle for Rank 0.
929
EMC(EMC_SWIZZLE_RANK0_BYTE0) = params->emc_swizzle_rank0_byte0;
930
EMC(EMC_SWIZZLE_RANK0_BYTE1) = params->emc_swizzle_rank0_byte1;
931
EMC(EMC_SWIZZLE_RANK0_BYTE2) = params->emc_swizzle_rank0_byte2;
932
EMC(EMC_SWIZZLE_RANK0_BYTE3) = params->emc_swizzle_rank0_byte3;
933
// Set swizzle for Rank 1.
934
EMC(EMC_SWIZZLE_RANK1_BYTE0) = params->emc_swizzle_rank1_byte0;
935
EMC(EMC_SWIZZLE_RANK1_BYTE1) = params->emc_swizzle_rank1_byte1;
936
EMC(EMC_SWIZZLE_RANK1_BYTE2) = params->emc_swizzle_rank1_byte2;
937
EMC(EMC_SWIZZLE_RANK1_BYTE3) = params->emc_swizzle_rank1_byte3;
938
939
// Patch 3 using BCT spare variables.
940
if (params->emc_bct_spare6)
941
*(vu32 *)params->emc_bct_spare6 = params->emc_bct_spare7;
942
943
// Program calibration impedance.
944
EMC(EMC_XM2COMPPADCTRL) = params->emc_xm2_comp_pad_ctrl;
945
EMC(EMC_XM2COMPPADCTRL2) = params->emc_xm2_comp_pad_ctrl2;
946
EMC(EMC_XM2COMPPADCTRL3) = params->emc_xm2_comp_pad_ctrl3;
947
948
// Program Autocal controls.
949
EMC(EMC_AUTO_CAL_CONFIG2) = params->emc_auto_cal_config2;
950
EMC(EMC_AUTO_CAL_CONFIG3) = params->emc_auto_cal_config3;
951
EMC(EMC_AUTO_CAL_CONFIG4) = params->emc_auto_cal_config4;
952
EMC(EMC_AUTO_CAL_CONFIG5) = params->emc_auto_cal_config5;
953
EMC(EMC_AUTO_CAL_CONFIG6) = params->emc_auto_cal_config6;
954
EMC(EMC_AUTO_CAL_CONFIG7) = params->emc_auto_cal_config7;
955
EMC(EMC_AUTO_CAL_CONFIG8) = params->emc_auto_cal_config8;
956
957
// Program termination and drive strength
958
EMC(EMC_PMACRO_RX_TERM) = params->emc_pmacro_rx_term;
959
EMC(EMC_PMACRO_DQ_TX_DRV) = params->emc_pmacro_dq_tx_drive;
960
EMC(EMC_PMACRO_CA_TX_DRV) = params->emc_pmacro_ca_tx_drive;
961
EMC(EMC_PMACRO_CMD_TX_DRV) = params->emc_pmacro_cmd_tx_drive;
962
EMC(EMC_PMACRO_AUTOCAL_CFG_COMMON) = params->emc_pmacro_auto_cal_common;
963
EMC(EMC_AUTO_CAL_CHANNEL) = params->emc_auto_cal_channel;
964
EMC(EMC_PMACRO_ZCTRL) = params->emc_pmacro_zcrtl;
965
966
// Program dll config.
967
EMC(EMC_DLL_CFG_0) = params->emc_dll_cfg0;
968
EMC(EMC_DLL_CFG_1) = params->emc_dll_cfg1;
969
EMC(EMC_CFG_DIG_DLL_1) = params->emc_cfg_dig_dll_1;
970
971
// Program barrelshift.
972
EMC(EMC_DATA_BRLSHFT_0) = params->emc_data_brlshft0;
973
EMC(EMC_DATA_BRLSHFT_1) = params->emc_data_brlshft1;
974
EMC(EMC_DQS_BRLSHFT_0) = params->emc_dqs_brlshft0;
975
EMC(EMC_DQS_BRLSHFT_1) = params->emc_dqs_brlshft1;
976
EMC(EMC_CMD_BRLSHFT_0) = params->emc_cmd_brlshft0;
977
EMC(EMC_CMD_BRLSHFT_1) = params->emc_cmd_brlshft1;
978
EMC(EMC_CMD_BRLSHFT_2) = params->emc_cmd_brlshft2;
979
EMC(EMC_CMD_BRLSHFT_3) = params->emc_cmd_brlshft3;
980
EMC(EMC_QUSE_BRLSHFT_0) = params->emc_quse_brlshft0;
981
EMC(EMC_QUSE_BRLSHFT_1) = params->emc_quse_brlshft1;
982
EMC(EMC_QUSE_BRLSHFT_2) = params->emc_quse_brlshft2;
983
EMC(EMC_QUSE_BRLSHFT_3) = params->emc_quse_brlshft3;
984
985
// Program pad macros controls and termination.
986
EMC(EMC_PMACRO_BRICK_CTRL_RFU1) = params->emc_pmacro_brick_ctrl_rfu1;
987
EMC(EMC_PMACRO_PAD_CFG_CTRL) = params->emc_pmacro_pad_cfg_ctrl;
988
989
EMC(EMC_PMACRO_CMD_BRICK_CTRL_FDPD) = params->emc_pmacro_cmd_brick_ctrl_fdpd;
990
EMC(EMC_PMACRO_BRICK_CTRL_RFU2) = params->emc_pmacro_brick_ctrl_rfu2;
991
EMC(EMC_PMACRO_DATA_BRICK_CTRL_FDPD) = params->emc_pmacro_data_brick_ctrl_fdpd;
992
EMC(EMC_PMACRO_DATA_PAD_RX_CTRL) = params->emc_pmacro_data_pad_rx_ctrl;
993
EMC(EMC_PMACRO_CMD_PAD_RX_CTRL) = params->emc_pmacro_cmd_pad_rx_ctrl;
994
EMC(EMC_PMACRO_DATA_PAD_TX_CTRL) = params->emc_pmacro_data_pad_tx_ctrl;
995
EMC(EMC_PMACRO_DATA_RX_TERM_MODE) = params->emc_pmacro_data_rx_term_mode;
996
EMC(EMC_PMACRO_CMD_RX_TERM_MODE) = params->emc_pmacro_cmd_rx_term_mode;
997
EMC(EMC_PMACRO_CMD_PAD_TX_CTRL) = params->emc_pmacro_cmd_pad_tx_ctrl & 0xEFFFFFFF;
998
999
// Program pad macro pins/bytes.
1000
EMC(EMC_CFG_3) = params->emc_cfg3;
1001
EMC(EMC_PMACRO_TX_PWRD_0) = params->emc_pmacro_tx_pwrd0;
1002
EMC(EMC_PMACRO_TX_PWRD_1) = params->emc_pmacro_tx_pwrd1;
1003
EMC(EMC_PMACRO_TX_PWRD_2) = params->emc_pmacro_tx_pwrd2;
1004
EMC(EMC_PMACRO_TX_PWRD_3) = params->emc_pmacro_tx_pwrd3;
1005
EMC(EMC_PMACRO_TX_PWRD_4) = params->emc_pmacro_tx_pwrd4;
1006
EMC(EMC_PMACRO_TX_PWRD_5) = params->emc_pmacro_tx_pwrd5;
1007
EMC(EMC_PMACRO_TX_SEL_CLK_SRC_0) = params->emc_pmacro_tx_sel_clk_src0;
1008
EMC(EMC_PMACRO_TX_SEL_CLK_SRC_1) = params->emc_pmacro_tx_sel_clk_src1;
1009
EMC(EMC_PMACRO_TX_SEL_CLK_SRC_2) = params->emc_pmacro_tx_sel_clk_src2;
1010
EMC(EMC_PMACRO_TX_SEL_CLK_SRC_3) = params->emc_pmacro_tx_sel_clk_src3;
1011
EMC(EMC_PMACRO_TX_SEL_CLK_SRC_4) = params->emc_pmacro_tx_sel_clk_src4;
1012
EMC(EMC_PMACRO_TX_SEL_CLK_SRC_5) = params->emc_pmacro_tx_sel_clk_src5;
1013
1014
// Program per bit pad macros.
1015
EMC(EMC_PMACRO_PERBIT_FGCG_CTRL_0) = params->emc_pmacro_perbit_fgcg_ctrl0;
1016
EMC(EMC_PMACRO_PERBIT_FGCG_CTRL_1) = params->emc_pmacro_perbit_fgcg_ctrl1;
1017
EMC(EMC_PMACRO_PERBIT_FGCG_CTRL_2) = params->emc_pmacro_perbit_fgcg_ctrl2;
1018
EMC(EMC_PMACRO_PERBIT_FGCG_CTRL_3) = params->emc_pmacro_perbit_fgcg_ctrl3;
1019
EMC(EMC_PMACRO_PERBIT_FGCG_CTRL_4) = params->emc_pmacro_perbit_fgcg_ctrl4;
1020
EMC(EMC_PMACRO_PERBIT_FGCG_CTRL_5) = params->emc_pmacro_perbit_fgcg_ctrl5;
1021
EMC(EMC_PMACRO_PERBIT_RFU_CTRL_0) = params->emc_pmacro_perbit_rfu_ctrl0;
1022
EMC(EMC_PMACRO_PERBIT_RFU_CTRL_1) = params->emc_pmacro_perbit_rfu_ctrl1;
1023
EMC(EMC_PMACRO_PERBIT_RFU_CTRL_2) = params->emc_pmacro_perbit_rfu_ctrl2;
1024
EMC(EMC_PMACRO_PERBIT_RFU_CTRL_3) = params->emc_pmacro_perbit_rfu_ctrl3;
1025
EMC(EMC_PMACRO_PERBIT_RFU_CTRL_4) = params->emc_pmacro_perbit_rfu_ctrl4;
1026
EMC(EMC_PMACRO_PERBIT_RFU_CTRL_5) = params->emc_pmacro_perbit_rfu_ctrl5;
1027
EMC(EMC_PMACRO_PERBIT_RFU1_CTRL_0) = params->emc_pmacro_perbit_rfu1_ctrl0;
1028
EMC(EMC_PMACRO_PERBIT_RFU1_CTRL_1) = params->emc_pmacro_perbit_rfu1_ctrl1;
1029
EMC(EMC_PMACRO_PERBIT_RFU1_CTRL_2) = params->emc_pmacro_perbit_rfu1_ctrl2;
1030
EMC(EMC_PMACRO_PERBIT_RFU1_CTRL_3) = params->emc_pmacro_perbit_rfu1_ctrl3;
1031
EMC(EMC_PMACRO_PERBIT_RFU1_CTRL_4) = params->emc_pmacro_perbit_rfu1_ctrl4;
1032
EMC(EMC_PMACRO_PERBIT_RFU1_CTRL_5) = params->emc_pmacro_perbit_rfu1_ctrl5;
1033
EMC(EMC_PMACRO_DATA_PI_CTRL) = params->emc_pmacro_data_pi_ctrl;
1034
EMC(EMC_PMACRO_CMD_PI_CTRL) = params->emc_pmacro_cmd_pi_ctrl;
1035
1036
EMC(EMC_PMACRO_DDLL_BYPASS) = params->emc_pmacro_ddll_bypass;
1037
EMC(EMC_PMACRO_DDLL_PWRD_0) = params->emc_pmacro_ddll_pwrd0;
1038
EMC(EMC_PMACRO_DDLL_PWRD_1) = params->emc_pmacro_ddll_pwrd1;
1039
EMC(EMC_PMACRO_DDLL_PWRD_2) = params->emc_pmacro_ddll_pwrd2;
1040
EMC(EMC_PMACRO_CMD_CTRL_0) = params->emc_pmacro_cmd_ctrl0;
1041
EMC(EMC_PMACRO_CMD_CTRL_1) = params->emc_pmacro_cmd_ctrl1;
1042
EMC(EMC_PMACRO_CMD_CTRL_2) = params->emc_pmacro_cmd_ctrl2;
1043
1044
// Program inbound vref setting.
1045
EMC(EMC_PMACRO_IB_VREF_DQ_0) = params->emc_pmacro_ib_vref_dq_0;
1046
EMC(EMC_PMACRO_IB_VREF_DQ_1) = params->emc_pmacro_ib_vref_dq_1;
1047
EMC(EMC_PMACRO_IB_VREF_DQS_0) = params->emc_pmacro_ib_vref_dqs_0;
1048
EMC(EMC_PMACRO_IB_VREF_DQS_1) = params->emc_pmacro_ib_vref_dqs_1;
1049
EMC(EMC_PMACRO_IB_RXRT) = params->emc_pmacro_ib_rxrt;
1050
1051
// Program quse trimmers.
1052
EMC(EMC_PMACRO_QUSE_DDLL_RANK0_0) = params->emc_pmacro_quse_ddll_rank0_0;
1053
EMC(EMC_PMACRO_QUSE_DDLL_RANK0_1) = params->emc_pmacro_quse_ddll_rank0_1;
1054
EMC(EMC_PMACRO_QUSE_DDLL_RANK0_2) = params->emc_pmacro_quse_ddll_rank0_2;
1055
EMC(EMC_PMACRO_QUSE_DDLL_RANK0_3) = params->emc_pmacro_quse_ddll_rank0_3;
1056
EMC(EMC_PMACRO_QUSE_DDLL_RANK0_4) = params->emc_pmacro_quse_ddll_rank0_4;
1057
EMC(EMC_PMACRO_QUSE_DDLL_RANK0_5) = params->emc_pmacro_quse_ddll_rank0_5;
1058
EMC(EMC_PMACRO_QUSE_DDLL_RANK1_0) = params->emc_pmacro_quse_ddll_rank1_0;
1059
EMC(EMC_PMACRO_QUSE_DDLL_RANK1_1) = params->emc_pmacro_quse_ddll_rank1_1;
1060
EMC(EMC_PMACRO_QUSE_DDLL_RANK1_2) = params->emc_pmacro_quse_ddll_rank1_2;
1061
EMC(EMC_PMACRO_QUSE_DDLL_RANK1_3) = params->emc_pmacro_quse_ddll_rank1_3;
1062
EMC(EMC_PMACRO_QUSE_DDLL_RANK1_4) = params->emc_pmacro_quse_ddll_rank1_4;
1063
EMC(EMC_PMACRO_QUSE_DDLL_RANK1_5) = params->emc_pmacro_quse_ddll_rank1_5;
1064
1065
// Program outbound trimmers.
1066
EMC(EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_0) = params->emc_pmacro_ob_ddll_long_dq_rank0_0;
1067
EMC(EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_1) = params->emc_pmacro_ob_ddll_long_dq_rank0_1;
1068
EMC(EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_2) = params->emc_pmacro_ob_ddll_long_dq_rank0_2;
1069
EMC(EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_3) = params->emc_pmacro_ob_ddll_long_dq_rank0_3;
1070
EMC(EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_4) = params->emc_pmacro_ob_ddll_long_dq_rank0_4;
1071
EMC(EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_5) = params->emc_pmacro_ob_ddll_long_dq_rank0_5;
1072
EMC(EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_0) = params->emc_pmacro_ob_ddll_long_dq_rank1_0;
1073
EMC(EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_1) = params->emc_pmacro_ob_ddll_long_dq_rank1_1;
1074
EMC(EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_2) = params->emc_pmacro_ob_ddll_long_dq_rank1_2;
1075
EMC(EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_3) = params->emc_pmacro_ob_ddll_long_dq_rank1_3;
1076
EMC(EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_4) = params->emc_pmacro_ob_ddll_long_dq_rank1_4;
1077
EMC(EMC_PMACRO_OB_DDLL_LONG_DQ_RANK1_5) = params->emc_pmacro_ob_ddll_long_dq_rank1_5;
1078
1079
EMC(EMC_PMACRO_OB_DDLL_LONG_DQS_RANK0_0) = params->emc_pmacro_ob_ddll_long_dqs_rank0_0;
1080
EMC(EMC_PMACRO_OB_DDLL_LONG_DQS_RANK0_1) = params->emc_pmacro_ob_ddll_long_dqs_rank0_1;
1081
EMC(EMC_PMACRO_OB_DDLL_LONG_DQS_RANK0_2) = params->emc_pmacro_ob_ddll_long_dqs_rank0_2;
1082
EMC(EMC_PMACRO_OB_DDLL_LONG_DQS_RANK0_3) = params->emc_pmacro_ob_ddll_long_dqs_rank0_3;
1083
EMC(EMC_PMACRO_OB_DDLL_LONG_DQS_RANK0_4) = params->emc_pmacro_ob_ddll_long_dqs_rank0_4;
1084
EMC(EMC_PMACRO_OB_DDLL_LONG_DQS_RANK0_5) = params->emc_pmacro_ob_ddll_long_dqs_rank0_5;
1085
EMC(EMC_PMACRO_OB_DDLL_LONG_DQS_RANK1_0) = params->emc_pmacro_ob_ddll_long_dqs_rank1_0;
1086
EMC(EMC_PMACRO_OB_DDLL_LONG_DQS_RANK1_1) = params->emc_pmacro_ob_ddll_long_dqs_rank1_1;
1087
EMC(EMC_PMACRO_OB_DDLL_LONG_DQS_RANK1_2) = params->emc_pmacro_ob_ddll_long_dqs_rank1_2;
1088
EMC(EMC_PMACRO_OB_DDLL_LONG_DQS_RANK1_3) = params->emc_pmacro_ob_ddll_long_dqs_rank1_3;
1089
EMC(EMC_PMACRO_OB_DDLL_LONG_DQS_RANK1_4) = params->emc_pmacro_ob_ddll_long_dqs_rank1_4;
1090
EMC(EMC_PMACRO_OB_DDLL_LONG_DQS_RANK1_5) = params->emc_pmacro_ob_ddll_long_dqs_rank1_5;
1091
EMC(EMC_PMACRO_IB_DDLL_LONG_DQS_RANK0_0) = params->emc_pmacro_ib_ddll_long_dqs_rank0_0;
1092
EMC(EMC_PMACRO_IB_DDLL_LONG_DQS_RANK0_1) = params->emc_pmacro_ib_ddll_long_dqs_rank0_1;
1093
EMC(EMC_PMACRO_IB_DDLL_LONG_DQS_RANK0_2) = params->emc_pmacro_ib_ddll_long_dqs_rank0_2;
1094
EMC(EMC_PMACRO_IB_DDLL_LONG_DQS_RANK0_3) = params->emc_pmacro_ib_ddll_long_dqs_rank0_3;
1095
EMC(EMC_PMACRO_IB_DDLL_LONG_DQS_RANK1_0) = params->emc_pmacro_ib_ddll_long_dqs_rank1_0;
1096
EMC(EMC_PMACRO_IB_DDLL_LONG_DQS_RANK1_1) = params->emc_pmacro_ib_ddll_long_dqs_rank1_1;
1097
EMC(EMC_PMACRO_IB_DDLL_LONG_DQS_RANK1_2) = params->emc_pmacro_ib_ddll_long_dqs_rank1_2;
1098
EMC(EMC_PMACRO_IB_DDLL_LONG_DQS_RANK1_3) = params->emc_pmacro_ib_ddll_long_dqs_rank1_3;
1099
1100
// Program clock trimmers.
1101
EMC(EMC_PMACRO_DDLL_LONG_CMD_0) = params->emc_pmacro_ddll_long_cmd_0;
1102
EMC(EMC_PMACRO_DDLL_LONG_CMD_1) = params->emc_pmacro_ddll_long_cmd_1;
1103
EMC(EMC_PMACRO_DDLL_LONG_CMD_2) = params->emc_pmacro_ddll_long_cmd_2;
1104
EMC(EMC_PMACRO_DDLL_LONG_CMD_3) = params->emc_pmacro_ddll_long_cmd_3;
1105
EMC(EMC_PMACRO_DDLL_LONG_CMD_4) = params->emc_pmacro_ddll_long_cmd_4;
1106
EMC(EMC_PMACRO_DDLL_SHORT_CMD_0) = params->emc_pmacro_ddll_short_cmd_0;
1107
EMC(EMC_PMACRO_DDLL_SHORT_CMD_1) = params->emc_pmacro_ddll_short_cmd_1;
1108
EMC(EMC_PMACRO_DDLL_SHORT_CMD_2) = params->emc_pmacro_ddll_short_cmd_2;
1109
1110
// Set DLL periodic offset.
1111
EMC(EMC_PMACRO_DDLL_PERIODIC_OFFSET) = params->emc_pmacro_ddll_periodic_offset;
1112
1113
// Patch 4 using BCT spare variables.
1114
if (params->emc_bct_spare4)
1115
*(vu32 *)params->emc_bct_spare4 = params->emc_bct_spare5;
1116
1117
// Patch 4 to 6 using BCT spare secure variables.
1118
if (params->emc_bct_spare_secure6)
1119
*(vu32 *)params->emc_bct_spare_secure6 = params->emc_bct_spare_secure7;
1120
if (params->emc_bct_spare_secure8)
1121
*(vu32 *)params->emc_bct_spare_secure8 = params->emc_bct_spare_secure9;
1122
if (params->emc_bct_spare_secure10)
1123
*(vu32 *)params->emc_bct_spare_secure10 = params->emc_bct_spare_secure11;
1124
1125
// Trigger timing update so above writes take place.
1126
EMC(EMC_TIMING_CONTROL) = 1;
1127
1128
// Initialize MC VPR settings.
1129
MC(MC_VIDEO_PROTECT_BOM) = params->mc_video_protect_bom;
1130
MC(MC_VIDEO_PROTECT_BOM_ADR_HI) = params->mc_video_protect_bom_adr_hi;
1131
MC(MC_VIDEO_PROTECT_SIZE_MB) = params->mc_video_protect_size_mb;
1132
MC(MC_VIDEO_PROTECT_VPR_OVERRIDE) = params->mc_video_protect_vpr_override;
1133
MC(MC_VIDEO_PROTECT_VPR_OVERRIDE1) = params->mc_video_protect_vpr_override1;
1134
MC(MC_VIDEO_PROTECT_GPU_OVERRIDE_0) = params->mc_video_protect_gpu_override0;
1135
MC(MC_VIDEO_PROTECT_GPU_OVERRIDE_1) = params->mc_video_protect_gpu_override1;
1136
1137
// Program SDRAM geometry parameters.
1138
MC(MC_EMEM_ADR_CFG) = params->mc_emem_adr_cfg;
1139
MC(MC_EMEM_ADR_CFG_DEV0) = params->mc_emem_adr_cfg_dev0;
1140
MC(MC_EMEM_ADR_CFG_DEV1) = params->mc_emem_adr_cfg_dev1;
1141
MC(MC_EMEM_ADR_CFG_CHANNEL_MASK) = params->mc_emem_adr_cfg_channel_mask;
1142
1143
// Program bank swizzling.
1144
MC(MC_EMEM_ADR_CFG_BANK_MASK_0) = params->mc_emem_adr_cfg_bank_mask0;
1145
MC(MC_EMEM_ADR_CFG_BANK_MASK_1) = params->mc_emem_adr_cfg_bank_mask1;
1146
MC(MC_EMEM_ADR_CFG_BANK_MASK_2) = params->mc_emem_adr_cfg_bank_mask2;
1147
1148
// Program external memory aperture (base and size).
1149
MC(MC_EMEM_CFG) = params->mc_emem_cfg;
1150
1151
// Program SEC carveout (base and size).
1152
MC(MC_SEC_CARVEOUT_BOM) = params->mc_sec_carveout_bom;
1153
MC(MC_SEC_CARVEOUT_ADR_HI) = params->mc_sec_carveout_adr_hi;
1154
MC(MC_SEC_CARVEOUT_SIZE_MB) = params->mc_sec_carveout_size_mb;
1155
1156
// Program MTS carveout (base and size).
1157
MC(MC_MTS_CARVEOUT_BOM) = params->mc_mts_carveout_bom;
1158
MC(MC_MTS_CARVEOUT_ADR_HI) = params->mc_mts_carveout_adr_hi;
1159
MC(MC_MTS_CARVEOUT_SIZE_MB) = params->mc_mts_carveout_size_mb;
1160
1161
// Program the memory arbiter.
1162
MC(MC_EMEM_ARB_CFG) = params->mc_emem_arb_cfg;
1163
MC(MC_EMEM_ARB_OUTSTANDING_REQ) = params->mc_emem_arb_outstanding_req;
1164
MC(MC_EMEM_ARB_REFPB_HP_CTRL) = params->emc_emem_arb_refpb_hp_ctrl;
1165
MC(MC_EMEM_ARB_REFPB_BANK_CTRL) = params->emc_emem_arb_refpb_bank_ctrl;
1166
MC(MC_EMEM_ARB_TIMING_RCD) = params->mc_emem_arb_timing_rcd;
1167
MC(MC_EMEM_ARB_TIMING_RP) = params->mc_emem_arb_timing_rp;
1168
MC(MC_EMEM_ARB_TIMING_RC) = params->mc_emem_arb_timing_rc;
1169
MC(MC_EMEM_ARB_TIMING_RAS) = params->mc_emem_arb_timing_ras;
1170
MC(MC_EMEM_ARB_TIMING_FAW) = params->mc_emem_arb_timing_faw;
1171
MC(MC_EMEM_ARB_TIMING_RRD) = params->mc_emem_arb_timing_rrd;
1172
MC(MC_EMEM_ARB_TIMING_RAP2PRE) = params->mc_emem_arb_timing_rap2pre;
1173
MC(MC_EMEM_ARB_TIMING_WAP2PRE) = params->mc_emem_arb_timing_wap2pre;
1174
MC(MC_EMEM_ARB_TIMING_R2R) = params->mc_emem_arb_timing_r2r;
1175
MC(MC_EMEM_ARB_TIMING_W2W) = params->mc_emem_arb_timing_w2w;
1176
MC(MC_EMEM_ARB_TIMING_CCDMW) = params->mc_emem_arb_timing_ccdmw;
1177
MC(MC_EMEM_ARB_TIMING_R2W) = params->mc_emem_arb_timing_r2w;
1178
MC(MC_EMEM_ARB_TIMING_W2R) = params->mc_emem_arb_timing_w2r;
1179
MC(MC_EMEM_ARB_TIMING_RFCPB) = params->mc_emem_arb_timing_rfcpb;
1180
MC(MC_EMEM_ARB_DA_TURNS) = params->mc_emem_arb_da_turns;
1181
MC(MC_EMEM_ARB_DA_COVERS) = params->mc_emem_arb_da_covers;
1182
MC(MC_EMEM_ARB_MISC0) = params->mc_emem_arb_misc0;
1183
MC(MC_EMEM_ARB_MISC1) = params->mc_emem_arb_misc1;
1184
MC(MC_EMEM_ARB_MISC2) = params->mc_emem_arb_misc2;
1185
MC(MC_EMEM_ARB_RING1_THROTTLE) = params->mc_emem_arb_ring1_throttle;
1186
MC(MC_EMEM_ARB_OVERRIDE) = params->mc_emem_arb_override;
1187
MC(MC_EMEM_ARB_OVERRIDE_1) = params->mc_emem_arb_override1;
1188
MC(MC_EMEM_ARB_RSV) = params->mc_emem_arb_rsv;
1189
MC(MC_DA_CONFIG0) = params->mc_da_cfg0;
1190
1191
// Trigger MC timing update.
1192
MC(MC_TIMING_CONTROL) = 1;
1193
1194
// Program second-level clock enable overrides.
1195
MC(MC_CLKEN_OVERRIDE) = params->mc_clken_override;
1196
1197
// Program statistics gathering.
1198
MC(MC_STAT_CONTROL) = params->mc_stat_control;
1199
1200
// Program SDRAM geometry parameters.
1201
EMC(EMC_ADR_CFG) = params->emc_adr_cfg;
1202
1203
// Program second-level clock enable overrides.
1204
EMC(EMC_CLKEN_OVERRIDE) = params->emc_clken_override;
1205
1206
// Program EMC pad auto calibration.
1207
EMC(EMC_PMACRO_AUTOCAL_CFG_0) = params->emc_pmacro_auto_cal_cfg0;
1208
EMC(EMC_PMACRO_AUTOCAL_CFG_1) = params->emc_pmacro_auto_cal_cfg1;
1209
EMC(EMC_PMACRO_AUTOCAL_CFG_2) = params->emc_pmacro_auto_cal_cfg2;
1210
1211
EMC(EMC_AUTO_CAL_VREF_SEL_0) = params->emc_auto_cal_vref_sel0;
1212
EMC(EMC_AUTO_CAL_VREF_SEL_1) = params->emc_auto_cal_vref_sel1;
1213
1214
// Program/Start auto calibration.
1215
EMC(EMC_AUTO_CAL_INTERVAL) = params->emc_auto_cal_interval;
1216
EMC(EMC_AUTO_CAL_CONFIG) = params->emc_auto_cal_config;
1217
usleep(params->emc_auto_cal_wait);
1218
1219
// Patch 5 using BCT spare variables.
1220
if (params->emc_bct_spare8)
1221
*(vu32 *)params->emc_bct_spare8 = params->emc_bct_spare9;
1222
1223
EMC(EMC_AUTO_CAL_CONFIG9) = params->emc_auto_cal_config9;
1224
1225
// Program EMC timing configuration.
1226
EMC(EMC_CFG_2) = params->emc_cfg2;
1227
EMC(EMC_CFG_PIPE) = params->emc_cfg_pipe;
1228
EMC(EMC_CFG_PIPE_1) = params->emc_cfg_pipe1;
1229
EMC(EMC_CFG_PIPE_2) = params->emc_cfg_pipe2;
1230
EMC(EMC_CMDQ) = params->emc_cmd_q;
1231
EMC(EMC_MC2EMCQ) = params->emc_mc2emc_q;
1232
EMC(EMC_MRS_WAIT_CNT) = params->emc_mrs_wait_cnt;
1233
EMC(EMC_MRS_WAIT_CNT2) = params->emc_mrs_wait_cnt2;
1234
EMC(EMC_FBIO_CFG5) = params->emc_fbio_cfg5;
1235
EMC(EMC_RC) = params->emc_rc;
1236
EMC(EMC_RFC) = params->emc_rfc;
1237
EMC(EMC_RFCPB) = params->emc_rfc_pb;
1238
EMC(EMC_REFCTRL2) = params->emc_ref_ctrl2;
1239
EMC(EMC_RFC_SLR) = params->emc_rfc_slr;
1240
EMC(EMC_RAS) = params->emc_ras;
1241
EMC(EMC_RP) = params->emc_rp;
1242
EMC(EMC_TPPD) = params->emc_tppd;
1243
EMC(EMC_CTT) = params->emc_trtm;
1244
EMC(EMC_FBIO_TWTM) = params->emc_twtm;
1245
EMC(EMC_FBIO_TRATM) = params->emc_tratm;
1246
EMC(EMC_FBIO_TWATM) = params->emc_twatm;
1247
EMC(EMC_FBIO_TR2REF) = params->emc_tr2ref;
1248
EMC(EMC_R2R) = params->emc_r2r;
1249
EMC(EMC_W2W) = params->emc_w2w;
1250
EMC(EMC_R2W) = params->emc_r2w;
1251
EMC(EMC_W2R) = params->emc_w2r;
1252
EMC(EMC_R2P) = params->emc_r2p;
1253
EMC(EMC_W2P) = params->emc_w2p;
1254
EMC(EMC_CCDMW) = params->emc_ccdmw;
1255
EMC(EMC_RD_RCD) = params->emc_rd_rcd;
1256
EMC(EMC_WR_RCD) = params->emc_wr_rcd;
1257
EMC(EMC_RRD) = params->emc_rrd;
1258
EMC(EMC_REXT) = params->emc_rext;
1259
EMC(EMC_WEXT) = params->emc_wext;
1260
EMC(EMC_WDV) = params->emc_wdv;
1261
EMC(EMC_WDV_CHK) = params->emc_wdv_chk;
1262
EMC(EMC_WSV) = params->emc_wsv;
1263
EMC(EMC_WEV) = params->emc_wev;
1264
EMC(EMC_WDV_MASK) = params->emc_wdv_mask;
1265
EMC(EMC_WS_DURATION) = params->emc_ws_duration;
1266
EMC(EMC_WE_DURATION) = params->emc_we_duration;
1267
EMC(EMC_QUSE) = params->emc_quse;
1268
EMC(EMC_QUSE_WIDTH) = params->emc_quse_width;
1269
EMC(EMC_IBDLY) = params->emc_ibdly;
1270
EMC(EMC_OBDLY) = params->emc_obdly;
1271
EMC(EMC_EINPUT) = params->emc_einput;
1272
EMC(EMC_EINPUT_DURATION) = params->emc_einput_duration;
1273
EMC(EMC_PUTERM_EXTRA) = params->emc_puterm_extra;
1274
EMC(EMC_PUTERM_WIDTH) = params->emc_puterm_width;
1275
1276
EMC(EMC_DBG) = params->emc_dbg;
1277
1278
// Clear read fifo.
1279
EMC(EMC_QRST) = params->emc_qrst;
1280
EMC(EMC_ISSUE_QRST) = 1;
1281
EMC(EMC_ISSUE_QRST) = 0;
1282
1283
// Program the rest of EMC timing configuration.
1284
EMC(EMC_QSAFE) = params->emc_qsafe;
1285
EMC(EMC_RDV) = params->emc_rdv;
1286
EMC(EMC_RDV_MASK) = params->emc_rdv_mask;
1287
EMC(EMC_RDV_EARLY) = params->emc_rdv_early;
1288
EMC(EMC_RDV_EARLY_MASK) = params->emc_rdv_early_mask;
1289
EMC(EMC_QPOP) = params->emc_qpop;
1290
EMC(EMC_REFRESH) = params->emc_refresh;
1291
EMC(EMC_BURST_REFRESH_NUM) = params->emc_burst_refresh_num;
1292
EMC(EMC_PRE_REFRESH_REQ_CNT) = params->emc_prerefresh_req_cnt;
1293
EMC(EMC_PDEX2WR) = params->emc_pdex2wr;
1294
EMC(EMC_PDEX2RD) = params->emc_pdex2rd;
1295
EMC(EMC_PCHG2PDEN) = params->emc_pchg2pden;
1296
EMC(EMC_ACT2PDEN) = params->emc_act2pden;
1297
EMC(EMC_AR2PDEN) = params->emc_ar2pden;
1298
EMC(EMC_RW2PDEN) = params->emc_rw2pden;
1299
EMC(EMC_CKE2PDEN) = params->emc_cke2pden;
1300
EMC(EMC_PDEX2CKE) = params->emc_pdex2che;
1301
EMC(EMC_PDEX2MRR) = params->emc_pdex2mrr;
1302
EMC(EMC_TXSR) = params->emc_txsr;
1303
EMC(EMC_TXSRDLL) = params->emc_txsr_dll;
1304
EMC(EMC_TCKE) = params->emc_tcke;
1305
EMC(EMC_TCKESR) = params->emc_tckesr;
1306
EMC(EMC_TPD) = params->emc_tpd;
1307
EMC(EMC_TFAW) = params->emc_tfaw;
1308
EMC(EMC_TRPAB) = params->emc_trpab;
1309
EMC(EMC_TCLKSTABLE) = params->emc_tclkstable;
1310
EMC(EMC_TCLKSTOP) = params->emc_tclkstop;
1311
EMC(EMC_TREFBW) = params->emc_trefbw;
1312
EMC(EMC_ODT_WRITE) = params->emc_odt_write;
1313
EMC(EMC_CFG_DIG_DLL) = params->emc_cfg_dig_dll;
1314
EMC(EMC_CFG_DIG_DLL_PERIOD) = params->emc_cfg_dig_dll_period;
1315
1316
// Don't write CFG_ADR_EN (bit 1) here - lock bit written later.
1317
EMC(EMC_FBIO_SPARE) = params->emc_fbio_spare & 0xFFFFFFFD;
1318
EMC(EMC_CFG_RSV) = params->emc_cfg_rsv;
1319
EMC(EMC_PMC_SCRATCH1) = params->emc_pmc_scratch1;
1320
EMC(EMC_PMC_SCRATCH2) = params->emc_pmc_scratch2;
1321
EMC(EMC_PMC_SCRATCH3) = params->emc_pmc_scratch3;
1322
EMC(EMC_ACPD_CONTROL) = params->emc_acpd_control;
1323
EMC(EMC_TXDSRVTTGEN) = params->emc_txdsrvttgen;
1324
EMC(EMC_PMACRO_DSR_VTTGEN_CTRL0) = params->emc_pmacro_dsr_vttgen_ctrl0;
1325
1326
// Set pipe bypass enable bits before sending any DRAM commands.
1327
EMC(EMC_CFG) = (params->emc_cfg & 0xE) | 0x3C00000;
1328
1329
// BootROM patching is used as a generic patch here.
1330
if (params->boot_rom_patch_control)
1331
{
1332
*(vu32 *)params->boot_rom_patch_control = params->boot_rom_patch_data;
1333
1334
// Trigger MC timing update.
1335
MC(MC_TIMING_CONTROL) = 1;
1336
}
1337
1338
// Patch 7 to 9 using BCT spare secure variables.
1339
if (params->emc_bct_spare_secure12)
1340
*(vu32 *)params->emc_bct_spare_secure12 = params->emc_bct_spare_secure13;
1341
if (params->emc_bct_spare_secure14)
1342
*(vu32 *)params->emc_bct_spare_secure14 = params->emc_bct_spare_secure15;
1343
if (params->emc_bct_spare_secure16)
1344
*(vu32 *)params->emc_bct_spare_secure16 = params->emc_bct_spare_secure17;
1345
1346
// Release SEL_DPD_CMD.
1347
PMC(APBDEV_PMC_IO_DPD3_REQ) = (params->emc_pmc_scratch1 & 0xFFF0000) | PMC_IO_DPD_REQ_DPD_OFF;
1348
usleep(params->pmc_io_dpd3_req_wait);
1349
1350
// Set transmission pad control parameters.
1351
EMC(EMC_PMACRO_CMD_PAD_TX_CTRL) = params->emc_pmacro_cmd_pad_tx_ctrl;
1352
1353
// ZQ CAL setup (not actually issuing ZQ CAL now).
1354
if (params->emc_zcal_warm_cold_boot_enables & 1)
1355
{
1356
EMC(EMC_ZCAL_WAIT_CNT) = params->emc_zcal_wait_cnt;
1357
EMC(EMC_ZCAL_MRW_CMD) = params->emc_zcal_mrw_cmd;
1358
}
1359
1360
// Trigger timing update so above writes take place.
1361
EMC(EMC_TIMING_CONTROL) = 1;
1362
usleep(params->emc_timing_control_wait);
1363
1364
// Deassert HOLD_CKE_LOW.
1365
PMC(APBDEV_PMC_DDR_CNTRL) &= 0xFF78007F;
1366
usleep(params->pmc_ddr_ctrl_wait);
1367
1368
// Set clock enable signal.
1369
u32 pin_gpio_cfg = (params->emc_pin_gpio_enable << 16) | (params->emc_pin_gpio << 12);
1370
EMC(EMC_PIN) = pin_gpio_cfg;
1371
(void)EMC(EMC_PIN);
1372
usleep(params->emc_pin_extra_wait + 200);
1373
EMC(EMC_PIN) = pin_gpio_cfg | 0x100;
1374
(void)EMC(EMC_PIN);
1375
1376
usleep(params->emc_pin_extra_wait + 2000);
1377
1378
// Enable clock enable signal.
1379
EMC(EMC_PIN) = pin_gpio_cfg | 0x101;
1380
(void)EMC(EMC_PIN);
1381
usleep(params->emc_pin_program_wait);
1382
1383
// Init zq calibration,
1384
// Patch 6 using BCT spare variables.
1385
if (params->emc_bct_spare10)
1386
*(vu32 *)params->emc_bct_spare10 = params->emc_bct_spare11;
1387
1388
// Write mode registers.
1389
EMC(EMC_MRW2) = params->emc_mrw2;
1390
EMC(EMC_MRW) = params->emc_mrw1;
1391
EMC(EMC_MRW3) = params->emc_mrw3;
1392
EMC(EMC_MRW4) = params->emc_mrw4;
1393
EMC(EMC_MRW6) = params->emc_mrw6;
1394
EMC(EMC_MRW14) = params->emc_mrw14;
1395
1396
EMC(EMC_MRW8) = params->emc_mrw8;
1397
EMC(EMC_MRW12) = params->emc_mrw12;
1398
EMC(EMC_MRW9) = params->emc_mrw9;
1399
EMC(EMC_MRW13) = params->emc_mrw13;
1400
1401
if (params->emc_zcal_warm_cold_boot_enables & 1)
1402
{
1403
// Issue ZQCAL start, device 0.
1404
EMC(EMC_ZQ_CAL) = params->emc_zcal_init_dev0;
1405
usleep(params->emc_zcal_init_wait);
1406
1407
// Issue ZQCAL latch.
1408
EMC(EMC_ZQ_CAL) = params->emc_zcal_init_dev0 ^ 3;
1409
// Same for device 1.
1410
if (!(params->emc_dev_select & 2))
1411
{
1412
EMC(EMC_ZQ_CAL) = params->emc_zcal_init_dev1;
1413
usleep(params->emc_zcal_init_wait);
1414
EMC(EMC_ZQ_CAL) = params->emc_zcal_init_dev1 ^ 3;
1415
}
1416
}
1417
1418
// Patch 10 to 12 using BCT spare secure variables.
1419
if (params->emc_bct_spare_secure18)
1420
*(vu32 *)params->emc_bct_spare_secure18 = params->emc_bct_spare_secure19;
1421
if (params->emc_bct_spare_secure20)
1422
*(vu32 *)params->emc_bct_spare_secure20 = params->emc_bct_spare_secure21;
1423
if (params->emc_bct_spare_secure22)
1424
*(vu32 *)params->emc_bct_spare_secure22 = params->emc_bct_spare_secure23;
1425
1426
// Set package and DPD pad control.
1427
PMC(APBDEV_PMC_DDR_CFG) = params->pmc_ddr_cfg;
1428
1429
// Start periodic ZQ calibration (LPDDRx only).
1430
EMC(EMC_ZCAL_INTERVAL) = params->emc_zcal_interval;
1431
EMC(EMC_ZCAL_WAIT_CNT) = params->emc_zcal_wait_cnt;
1432
EMC(EMC_ZCAL_MRW_CMD) = params->emc_zcal_mrw_cmd;
1433
1434
// Patch 7 using BCT spare variables.
1435
if (params->emc_bct_spare12)
1436
*(vu32 *)params->emc_bct_spare12 = params->emc_bct_spare13;
1437
1438
// Trigger timing update so above writes take place.
1439
EMC(EMC_TIMING_CONTROL) = 1;
1440
1441
if (params->emc_extra_refresh_num)
1442
EMC(EMC_REF) = ((1 << params->emc_extra_refresh_num << 8) - 253) | (params->emc_dev_select << 30);
1443
1444
// Enable refresh.
1445
EMC(EMC_REFCTRL) = params->emc_dev_select | BIT(31);
1446
1447
EMC(EMC_DYN_SELF_REF_CONTROL) = params->emc_dyn_self_ref_control;
1448
EMC(EMC_CFG) = params->emc_cfg;
1449
EMC(EMC_FDPD_CTRL_DQ) = params->emc_fdpd_ctrl_dq;
1450
EMC(EMC_FDPD_CTRL_CMD) = params->emc_fdpd_ctrl_cmd;
1451
EMC(EMC_SEL_DPD_CTRL) = params->emc_sel_dpd_ctrl;
1452
1453
// Write addr swizzle lock bit.
1454
EMC(EMC_FBIO_SPARE) = params->emc_fbio_spare | BIT(1);
1455
1456
// Re-trigger timing to latch power saving functions.
1457
EMC(EMC_TIMING_CONTROL) = 1;
1458
1459
EMC(EMC_CFG_UPDATE) = params->emc_cfg_update;
1460
1461
// Enable EMC pipe clock gating.
1462
EMC(EMC_CFG_PIPE_CLK) = params->emc_cfg_pipe_clk;
1463
1464
// Depending on freqency, enable CMD/CLK fdpd.
1465
EMC(EMC_FDPD_CTRL_CMD_NO_RAMP) = params->emc_fdpd_ctrl_cmd_no_ramp;
1466
1467
// Set untranslated region requirements.
1468
MC(MC_UNTRANSLATED_REGION_CHECK) = params->mc_untranslated_region_check;
1469
1470
// Lock carveouts per BCT cfg.
1471
MC(MC_VIDEO_PROTECT_REG_CTRL) = params->mc_video_protect_write_access;
1472
MC(MC_SEC_CARVEOUT_REG_CTRL) = params->mc_sec_carveout_protect_write_access;
1473
MC(MC_MTS_CARVEOUT_REG_CTRL) = params->mc_mts_carveout_reg_ctrl;
1474
1475
// Disable write access to a bunch of EMC registers.
1476
MC(MC_EMEM_CFG_ACCESS_CTRL) = 1;
1477
1478
// Enable arbiter.
1479
SYSREG(AHB_ARBITRATION_XBAR_CTRL) = (SYSREG(AHB_ARBITRATION_XBAR_CTRL) & 0xFFFEFFFF) | (params->ahb_arbitration_xbar_ctrl_meminit_done << 16);
1480
}
1481
1482
static void *_sdram_get_params_t210()
1483
{
1484
// Check if id is proper.
1485
u32 dramid = fuse_read_dramid(false);
1486
1487
// Copy base parameters.
1488
u32 *params = (u32 *)SDRAM_PARAMS_ADDR;
1489
memcpy(params, &_dram_cfg_0_samsung_4gb, sizeof(sdram_params_t210_t));
1490
1491
// Patch parameters if needed.
1492
for (u32 i = 0; i < ARRAY_SIZE(sdram_cfg_vendor_patches_t210); i++)
1493
if (sdram_cfg_vendor_patches_t210[i].dramcf & DRAM_ID(dramid))
1494
params[sdram_cfg_vendor_patches_t210[i].offset] = sdram_cfg_vendor_patches_t210[i].val;
1495
1496
return (void *)params;
1497
}
1498
1499
void *sdram_get_params_t210b01()
1500
{
1501
// Check if id is proper.
1502
u32 dramid = fuse_read_dramid(false);
1503
1504
// Copy base parameters.
1505
u32 *params = (u32 *)SDRAM_PARAMS_ADDR;
1506
memcpy(params, &_dram_cfg_08_10_12_14_samsung_hynix_4gb, sizeof(sdram_params_t210b01_t));
1507
1508
// Patch parameters if needed.
1509
u8 dram_code = dram_encoding_t210b01[dramid];
1510
if (!dram_code)
1511
return (void *)params;
1512
1513
for (u32 i = 0; i < ARRAY_SIZE(sdram_cfg_vendor_patches_t210b01); i++)
1514
if (sdram_cfg_vendor_patches_t210b01[i].dramcf & DRAM_CC(dram_code))
1515
params[sdram_cfg_vendor_patches_t210b01[i].offset] = sdram_cfg_vendor_patches_t210b01[i].val;
1516
1517
return (void *)params;
1518
}
1519
1520
/*
1521
* Function: sdram_get_params_patched
1522
*
1523
* This code implements a warmboot exploit. Warmboot, that is actually so hot, it burns Nvidia once again.
1524
* If the boot_rom_patch_control's MSB is set, it uses it as an index to
1525
* APB_MISC_BASE (u32 array) and sets it to the value of boot_rom_patch_data.
1526
* (The MSB falls out when it gets multiplied by sizeof(u32)).
1527
* Because the bootrom does not do any boundary checks, it lets us write anywhere and anything.
1528
* Ipatch hardware let us apply 12 changes to the bootrom and can be changed any time.
1529
* The first patch is not needed any more when the exploit is triggered, so we overwrite that.
1530
* 0x10459E is the address where it returns an error when the signature is not valid.
1531
* We change that to MOV R0, #0, so we pass the check.
1532
*
1533
* Note: The modulus in the header must match and validated.
1534
*/
1535
1536
void *sdram_get_params_patched()
1537
{
1538
#define IPATCH_CONFIG(addr, data) ((((addr) - 0x100000) / 2) << 16 | ((data) & 0xffff))
1539
sdram_params_t210_t *sdram_params = _sdram_get_params_t210();
1540
1541
// Disable Warmboot signature check.
1542
sdram_params->boot_rom_patch_control = BIT(31) | (((IPATCH_BASE + 4) - APB_MISC_BASE) / 4);
1543
sdram_params->boot_rom_patch_data = IPATCH_CONFIG(0x10459E, 0x2000);
1544
/*
1545
// Disable SBK lock.
1546
sdram_params->emc_bct_spare8 = (IPATCH_BASE + 7 * 4);
1547
sdram_params->emc_bct_spare9 = IPATCH_CONFIG(0x10210E, 0x2000);
1548
1549
// Disable bootrom read lock.
1550
sdram_params->emc_bct_spare10 = (IPATCH_BASE + 10 * 4);
1551
sdram_params->emc_bct_spare11 = IPATCH_CONFIG(0x100FDC, 0xF000);
1552
sdram_params->emc_bct_spare12 = (IPATCH_BASE + 11 * 4);
1553
sdram_params->emc_bct_spare13 = IPATCH_CONFIG(0x100FDE, 0xE320);
1554
*/
1555
return (void *)sdram_params;
1556
}
1557
1558
void sdram_init()
1559
{
1560
// Disable remote sense for SD1.
1561
i2c_send_byte(I2C_5, MAX77620_I2C_ADDR, MAX77620_REG_SD_CFG2, MAX77620_SD_CNF2_ROVS_EN_SD0 | MAX77620_SD_CNF2_RSVD);
1562
1563
if (hw_get_chip_id() == GP_HIDREV_MAJOR_T210)
1564
{
1565
const sdram_params_t210_t *params = (const sdram_params_t210_t *)_sdram_get_params_t210();
1566
if (params->memory_type != MEMORY_TYPE_LPDDR4)
1567
return;
1568
1569
// Set DRAM voltage.
1570
max7762x_regulator_set_voltage(REGULATOR_SD1, 1125000); // HOS: 1.125V. Bootloader: 1.1V.
1571
1572
_sdram_config_t210(params);
1573
}
1574
else
1575
{
1576
const sdram_params_t210b01_t *params = (const sdram_params_t210b01_t *)sdram_get_params_t210b01();
1577
if (params->memory_type != MEMORY_TYPE_LPDDR4)
1578
return;
1579
1580
_sdram_config_t210b01(params);
1581
}
1582
}
1583
1584