summaryrefslogtreecommitdiff
path: root/nvboot_sdram_param.h
blob: 03f276201d2919d28f06a5b0372e780d03f2a77e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
/**
 * Copyright (c) 2011 NVIDIA Corporation.  All rights reserved.
 *
 * See file CREDITS for list of people who contributed to this
 * project.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of
 * the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 * MA 02111-1307 USA
 */

/**
 * Defines the SDRAM parameter structure.
 *
 * Note that PLLM is used by EMC.
 */

#ifndef INCLUDED_NVBOOT_SDRAM_PARAM_H
#define INCLUDED_NVBOOT_SDRAM_PARAM_H

#define NVBOOT_BCT_SDRAM_ARB_CONFIG_WORDS 27

typedef enum 
{
	/// Specifies the memory type to be undefined
	nvboot_memory_type_none = 0,

	/// Specifies the memory type to be DDR SDRAM
	nvboot_memory_type_ddr,

	/// Specifies the memory type to be LPDDR SDRAM
	nvboot_memory_type_lpddr,

	/// Specifies the memory type to be DDR2 SDRAM
	nvboot_memory_type_ddr2,

	/// Specifies the memory type to be LPDDR2 SDRAM
	nvboot_memory_type_lpddr2,

	nvboot_memory_type_num,
	nvboot_memory_type_force32 = 0x7FFFFFF
} nvboot_memory_type;


/**
 * Defines the SDRAM parameter structure
 */
typedef struct nvboot_sdram_params_rec
{
	/// Specifies the type of memory device
	nvboot_memory_type memory_type;

	/// Specifies the CPCON value for PllM
	u_int32_t pllm_charge_pump_setup_ctrl;
	/// Specifies the LPCON value for PllM
	u_int32_t pllm_loop_filter_setup_ctrl;
	/// Specifies the M value for PllM
	u_int32_t pllm_input_divider;
	/// Specifies the N value for PllM
	u_int32_t pllm_feedback_divider;
	/// Specifies the P value for PllM
	u_int32_t pllm_post_divider;
	/// Specifies the time to wait for PLLM to lock (in microseconds)
	u_int32_t pllm_stable_time;

	/// Specifies the divider for the EMC Clock Source
	u_int32_t emc_clock_divider;

	///
	/// Auto-calibration of EMC pads
	///
	/// Specifies the value for EMC_AUTO_CAL_INTERVAL
	u_int32_t emc_auto_cal_interval;
	/// Specifies the value for EMC_AUTO_CAL_CONFIG
	/// Note: Trigger bits are set by the SDRAM code.
	u_int32_t emc_auto_cal_config;   
	/// Specifies the time for the calibration to
	/// stabilize (in microseconds)
	u_int32_t emc_auto_cal_wait;

	/// Specifies the time to wait after pin programming (in microseconds)
	/// Dram vendors require at least 200us.
	u_int32_t emc_pin_program_wait;

	///
	/// Timing parameters required for the SDRAM 
	///
	/// Specifies the value for EMC_RC
	u_int32_t emc_rc;
	/// Specifies the value for EMC_RFC
	u_int32_t emc_rfc;
	/// Specifies the value for EMC_RAS
	u_int32_t emc_ras;
	/// Specifies the value for EMC_RP
	u_int32_t emc_rp;
	/// Specifies the value for EMC_R2W
	u_int32_t emc_r2w;
	/// Specifies the value for EMC_R2W
	u_int32_t emc_w2r;
	/// Specifies the value for EMC_R2P
	u_int32_t emc_r2p;
	/// Specifies the value for EMC_W2P
	u_int32_t emc_w2p;
	/// Specifies the value for EMC_RD_RCD
	u_int32_t emc_rd_rcd;
	/// Specifies the value for EMC_WR_RCD
	u_int32_t emc_wr_rcd;
	/// Specifies the value for EMC_RRD
	u_int32_t emc_rrd;
	/// Specifies the value for EMC_REXT
	u_int32_t emc_rext;
	/// Specifies the value for EMC_WDV
	u_int32_t emc_wdv;
	/// Specifies the value for EMC_QUSE
	u_int32_t emc_quse;
	/// Specifies the value for EMC_QRST
	u_int32_t emc_qrst;
	/// Specifies the value for EMC_QSAFE
	u_int32_t emc_qsafe;
	/// Specifies the value for EMC_RDV
	u_int32_t emc_rdv;
	/// Specifies the value for EMC_REFRESH
	u_int32_t emc_refresh;
	/// Specifies the value for EMC_BURST_REFRESH_NUM
	u_int32_t emc_burst_refresh_num;
	/// Specifies the value for EMC_PDEX2WR
	u_int32_t emc_pdex2wr;
	/// Specifies the value for EMC_PDEX2RD
	u_int32_t emc_pdex2rd;
	/// Specifies the value for EMC_PCHG2PDEN
	u_int32_t emc_pchg2pden;
	/// Specifies the value for EMC_ACT2PDEN
	u_int32_t emc_act2pden;
	/// Specifies the value for EMC_AR2PDEN
	u_int32_t emc_ar2pden;
	/// Specifies the value for EMC_RW2PDEN
	u_int32_t emc_rw2pden;
	/// Specifies the value for EMC_TXSR
	u_int32_t emc_txsr;
	/// Specifies the value for EMC_TCKE
	u_int32_t emc_tcke;
	/// Specifies the value for EMC_TFAW
	u_int32_t emc_tfaw;
	/// Specifies the value for EMC_TRPAB
	u_int32_t emc_trpab;
	/// Specifies the value for EMC_TCLKSTABLE
	u_int32_t emc_tclkstable;
	/// Specifies the value for EMC_TCLKSTOP
	u_int32_t emc_tclkstop;
	/// Specifies the value for EMC_TREFBW
	u_int32_t emc_trefbw;
	/// Specifies the value for EMC_QUSE_EXTRA
	u_int32_t emc_quse_extra;

	///
	/// FBIO configuration values 
	///
	/// Specifies the value for EMC_FBIO_CFG1
	u_int32_t emc_fbio_cfg1;
	/// Specifies the value for EMC_FBIO_DQSIB_DLY
	u_int32_t emc_fbio_dqsib_dly;
	/// Specifies the value for EMC_FBIO_DQSIB_DLY_MSB
	u_int32_t emc_fbio_dqsib_dly_msb;
	/// Specifies the value for EMC_FBIO_QUSE_DLY
	u_int32_t emc_fbio_quse_dly;
	/// Specifies the value for EMC_FBIO_QUSE_DLY_MSB
	u_int32_t emc_fbio_quse_dly_msb;
	/// Specifies the value for EMC_FBIO_CFG5
	u_int32_t emc_fbio_cfg5;
	/// Specifies the value for EMC_FBIO_CFG6
	u_int32_t emc_fbio_cfg6;
	/// Specifies the value for EMC_FBIO_SPARE
	u_int32_t emc_fbio_spare;

	///
	/// MRS command values
	///
	/// Specifies the value for EMC_MRS
	u_int32_t emc_mrs;
	/// Specifies the value for EMC_EMRS
	u_int32_t emc_emrs;
	/// Specifies the first  of a sequence of three values for EMC_MRW
	u_int32_t emc_mrw1;
	/// Specifies the second of a sequence of three values for EMC_MRW
	u_int32_t emc_mrw2;
	/// Specifies the third  of a sequence of three values for EMC_MRW
	u_int32_t emc_mrw3;

	/// Specifies the EMC_MRW reset command value
	u_int32_t emc_mrw_reset_command;
	/// Specifies the EMC Reset wait time (in microseconds)
	u_int32_t emc_mrw_reset_ninit_wait;

	/// Specifies the value for EMC_ADR_CFG
	/// The same value is also used for MC_EMC_ADR_CFG
	u_int32_t emc_adr_cfg;
	/// Specifies the value for EMC_ADR_CFG_1
	u_int32_t emc_adr_cfg1;

	/// Specifies the value for MC_EMEM_CFG which holds the external memory
	/// size (in KBytes)
	/// EMEM_SIZE_KB must be <= (Device size in KB * Number of Devices)
	u_int32_t mc_emem_Cfg;

	/// Specifies the value for MC_LOWLATENCY_CONFIG
	/// Mainly for LL_DRAM_INTERLEAVE: Some DRAMs do not support interleave
	/// mode. If so, turn off this bit to get the correct low-latency path
	/// behavior. Reset is ENABLED. 
	u_int32_t mc_lowlatency_config;
	/// Specifies the value for EMC_CFG
	u_int32_t emc_cfg;
	/// Specifies the value for EMC_CFG_2
	u_int32_t emc_cfg2;
	/// Specifies the value for EMC_DBG
	u_int32_t emc_dbg;

	/// Specifies the value for AHB_ARBITRATION_XBAR_CTRL.
	/// This is used to set the Memory Inid done
	u_int32_t ahb_arbitration_xbar_ctrl;

	/// Specifies the value for EMC_CFG_DIG_DLL
	/// Note: Trigger bits are set by the SDRAM code.
	u_int32_t emc_cfg_dig_dll;
	/// Specifies the value for EMC_DLL_XFORM_DQS
	u_int32_t emc_dll_xform_dqs;
	/// Specifies the value for EMC_DLL_XFORM_QUSE
	u_int32_t emc_dll_xform_quse;

	/// Specifies the delay after prgramming the PIN/NOP register during a
	/// WarmBoot0 sequence (in microseconds)
	u_int32_t warm_boot_wait;

	/// Specifies the value for EMC_CTT_TERM_CTRL
	u_int32_t emc_ctt_term_ctrl;

	/// Specifies the value for EMC_ODT_WRITE
	u_int32_t emc_odt_write;
	/// Specifies the value for EMC_ODT_WRITE
	u_int32_t emc_odt_read;

	/// Specifies the value for EMC_ZCAL_REF_CNT
	/// Only meaningful for LPDDR2. Set to 0 for all other memory types.
	u_int32_t emc_zcal_ref_cnt;
	/// Specifies the value for EMC_ZCAL_WAIT_CNT
	/// Only meaningful for LPDDR2. Set to 0 for all other memory types.
	u_int32_t emc_zcal_wait_cnt;
	/// Specifies the value for EMC_ZCAL_MRW_CMD
	/// Only meaningful for LPDDR2. Set to 0 for all other memory types.
	u_int32_t emc_zcal_mrw_cmd;

	/// Specifies the MRS command value for initilizing the mode register.
	u_int32_t emc_mrs_reset_dll;
	/// Specifies the MRW command for ZQ initialization of device 0
	u_int32_t emc_mrw_zq_init_dev0;
	/// Specifies the MRW command for ZQ initialization of device 1
	u_int32_t emc_mrw_zq_init_dev1;
	/// Specifies the wait time after programming a ZQ initialization
	/// command (in microseconds)
	u_int32_t emc_mrw_zq_init_wait;
	/// Specifies the wait time after sending an MRS DLL reset command
	/// (in microseconds)
	u_int32_t emc_mrs_reset_dll_wait;
	/// Specifies the first of two EMRS commands to initialize mode
	/// registers
	u_int32_t emc_emrs_emr2;
	/// Specifies the second of two EMRS commands to initialize mode
	/// registers
	u_int32_t emc_emrs_emr3;
	/// Specifies the EMRS command to enable the DDR2 DLL
	u_int32_t emc_emrs_ddr2_dll_enable;
	/// Specifies the MRS command to reset the DDR2 DLL
	u_int32_t emc_mrs_ddr2_dll_reset;
	/// Specifies the EMRS command to set OCD calibration
	u_int32_t emc_emrs_ddr2_ocd_calib;
	/// Specifies the wait between initializing DDR and setting OCD
	/// calibration (in microseconds)
	u_int32_t emc_ddr2_wait;

	///
	/// Clock trimmers
	///
	/// Specifies the value for EMC_CFG_CLKTRIM_0
	u_int32_t emc_cfg_clktrim0;
	/// Specifies the value for EMC_CFG_CLKTRIM_1
	u_int32_t emc_cfg_clktrim1;
	/// Specifies the value for EMC_CFG_CLKTRIM_2
	u_int32_t emc_cfg_clktrim2;

	///
	/// Pad controls
	///
	/// Specifies the value for PMC_DDR_PWR
	u_int32_t pmc_ddr_pwr;
	/// Specifies the value for APB_MISC_GP_XM2CFGAPADCTRL
	u_int32_t apb_misc_gp_xm2cfga_pad_ctrl;
	/// Specifies the value for APB_MISC_GP_XM2CFGCPADCTRL
	u_int32_t apb_misc_gp_xm2cfgc_pad_ctrl;
	/// Specifies the value for APB_MISC_GP_XM2CFGCPADCTRL2
	u_int32_t apb_misc_gp_xm2cfgc_pad_ctrl2;
	/// Specifies the value for APB_MISC_GP_XM2CFGDPADCTRL
	u_int32_t apb_misc_gp_xm2cfgd_pad_ctrl;
	/// Specifies the value for APB_MISC_GP_XM2CFGDPADCTRL2
	u_int32_t apb_misc_gp_xm2cfgd_pad_ctrl2;
	/// Specifies the value for APB_MISC_GP_XM2CLKCFGPADCTRL
	u_int32_t apb_misc_gp_xm2clkcfg_Pad_ctrl;
	/// Specifies the value for APB_MISC_GP_XM2COMPPADCTRL
	u_int32_t apb_misc_gp_xm2comp_pad_ctrl;
	/// Specifies the value for APB_MISC_GP_XM2VTTGENPADCTRL
	u_int32_t apb_misc_gp_xm2vttgen_pad_ctrl;

	/// Specifies storage for arbitration configuration registers
	/// Data passed through to the Bootloader but not used by the Boot ROM
	u_int32_t arbitration_config[NVBOOT_BCT_SDRAM_ARB_CONFIG_WORDS];
} nvboot_sdram_params;

#endif /* #ifndef INCLUDED_NVBOOT_SDRAM_PARAM_H */