1 /* SPDX-License-Identifier: GPL-2.0-only */
3 #ifndef RAMINIT_COMMON_H
4 #define RAMINIT_COMMON_H
6 #include <device/dram/ddr3.h>
12 #define NUM_CHANNELS 2
13 #define NUM_SLOTRANKS 4
17 /* IOSAV_n_SP_CMD_CTRL DRAM commands */
18 #define IOSAV_MRS (0xf000)
19 #define IOSAV_PRE (0xf002)
20 #define IOSAV_ZQCS (0xf003)
21 #define IOSAV_ACT (0xf006)
22 #define IOSAV_RD (0xf105)
23 #define IOSAV_NOP_ALT (0xf107)
24 #define IOSAV_WR (0xf201)
25 #define IOSAV_NOP (0xf207)
27 /* IOSAV_n_SUBSEQ_CTRL data direction */
28 #define SSQ_NA 0 /* Non-data */
29 #define SSQ_RD 1 /* Read */
30 #define SSQ_WR 2 /* Write */
31 #define SSQ_RW 3 /* Read and write */
34 /* IOSAV_n_SP_CMD_CTRL */
37 u32 command
: 16; /* [15.. 0] */
38 u32 ranksel_ap
: 2; /* [17..16] */
44 /* IOSAV_n_SUBSEQ_CTRL */
47 u32 cmd_executions
: 9; /* [ 8.. 0] */
49 u32 cmd_delay_gap
: 5; /* [14..10] */
51 u32 post_ssq_wait
: 9; /* [24..16] */
53 u32 data_direction
: 2; /* [27..26] */
59 /* IOSAV_n_SP_CMD_ADDR */
62 u32 address
: 16; /* [15.. 0] */
63 u32 rowbits
: 3; /* [18..16] */
65 u32 bank
: 3; /* [22..20] */
67 u32 rank
: 2; /* [25..24] */
73 /* IOSAV_n_ADDR_UPDATE */
76 u32 inc_addr_1
: 1; /* [ 0.. 0] */
77 u32 inc_addr_8
: 1; /* [ 1.. 1] */
78 u32 inc_bank
: 1; /* [ 2.. 2] */
79 u32 inc_rank
: 2; /* [ 4.. 3] */
80 u32 addr_wrap
: 5; /* [ 9.. 5] */
81 u32 lfsr_upd
: 2; /* [11..10] */
82 u32 upd_rate
: 4; /* [15..12] */
83 u32 lfsr_xors
: 2; /* [17..16] */
92 u32 rcven_pi_code
: 6; /* [ 5.. 0] */
94 u32 rx_dqs_p_pi_code
: 7; /* [14.. 8] */
96 u32 rcven_logic_delay
: 3; /* [18..16] */
98 u32 rx_dqs_n_pi_code
: 7; /* [26..20] */
106 u32 tx_dq_pi_code
: 6; /* [ 5.. 0] */
108 u32 tx_dqs_pi_code
: 6; /* [13.. 8] */
110 u32 tx_dqs_logic_delay
: 3; /* [17..15] */
112 u32 tx_dq_logic_delay
: 1; /* [19..19] */
118 union gdcr_cmd_pi_coding_reg
{
120 u32 cmd_pi_code
: 6; /* [ 5.. 0] */
121 u32 ctl_pi_code_d0
: 6; /* [11.. 6] */
122 u32 cmd_logic_delay
: 1; /* [12..12] */
123 u32 cmd_phase_delay
: 1; /* [13..13] */
124 u32 cmd_xover_enable
: 1; /* [14..14] */
125 u32 ctl_logic_delay_d0
: 1; /* [15..15] */
126 u32 ctl_phase_delay_d0
: 1; /* [16..16] */
127 u32 ctl_xover_enable_d0
: 1; /* [17..17] */
128 u32 ctl_pi_code_d1
: 6; /* [23..18] */
129 u32 ctl_logic_delay_d1
: 1; /* [24..24] */
130 u32 ctl_phase_delay_d1
: 1; /* [25..25] */
131 u32 ctl_xover_enable_d1
: 1; /* [26..26] */
137 union gdcr_training_mod_reg
{
139 u32 receive_enable_mode
: 1; /* [ 0.. 0] */
140 u32 write_leveling_mode
: 1; /* [ 1.. 1] */
141 u32 training_rank_sel
: 2; /* [ 3.. 2] */
142 u32 enable_dqs_wl
: 4; /* [ 7.. 4] */
143 u32 dqs_logic_delay_wl
: 1; /* [ 8.. 8] */
144 u32 dq_dqs_training_res
: 1; /* [ 9.. 9] */
146 u32 delay_dq
: 1; /* [14..14] */
147 u32 odt_always_on
: 1; /* [15..15] */
149 u32 force_drive_enable
: 1; /* [20..20] */
150 u32 dft_tx_pi_clk_view
: 1; /* [21..21] */
151 u32 dft_tx_pi_clk_swap
: 1; /* [22..22] */
152 u32 early_odt_en
: 1; /* [23..23] */
153 u32 vref_gen_ctl
: 6; /* [29..24] */
154 u32 ext_vref_sel
: 1; /* [30..30] */
155 u32 tx_fifo_always_on
: 1; /* [31..31] */
160 union comp_ofst_1_reg
{
162 u32 dq_odt_down
: 3; /* [ 2.. 0] */
163 u32 dq_odt_up
: 3; /* [ 5.. 3] */
164 u32 clk_odt_down
: 3; /* [ 8.. 6] */
165 u32 clk_odt_up
: 3; /* [11.. 9] */
166 u32 dq_drv_down
: 3; /* [14..12] */
167 u32 dq_drv_up
: 3; /* [17..15] */
168 u32 clk_drv_down
: 3; /* [20..18] */
169 u32 clk_drv_up
: 3; /* [23..21] */
170 u32 ctl_drv_down
: 3; /* [26..24] */
171 u32 ctl_drv_up
: 3; /* [29..27] */
179 u32 tRCD
: 4; /* [ 3.. 0] */
180 u32 tRP
: 4; /* [ 7.. 4] */
181 u32 tAA
: 4; /* [11.. 8] */
182 u32 tCWL
: 4; /* [15..12] */
183 u32 tRAS
: 8; /* [23..16] */
191 u32 tRRD
: 4; /* [ 3.. 0] */
192 u32 tRTP
: 4; /* [ 7.. 4] */
193 u32 tCKE
: 4; /* [11.. 8] */
194 u32 tWTR
: 4; /* [15..12] */
195 u32 tFAW
: 8; /* [23..16] */
196 u32 tWR
: 5; /* [28..24] */
197 u32 dis_3st
: 1; /* [29..29] */
198 u32 tCMD
: 2; /* [31..30] */
205 u32 tRRDR
: 3; /* [ 2.. 0] */
207 u32 tRRDD
: 3; /* [ 6.. 4] */
209 u32 tWWDR
: 3; /* [10.. 8] */
211 u32 tWWDD
: 3; /* [14..12] */
213 u32 tRWDRDD
: 3; /* [18..16] */
215 u32 tWRDRDD
: 3; /* [22..20] */
217 u32 tRWSR
: 3; /* [26..24] */
218 u32 dec_wrd
: 1; /* [27..27] */
226 u32 tXPDLL
: 5; /* [ 4.. 0] */
227 u32 tXP
: 3; /* [ 7.. 5] */
228 u32 tAONPD
: 4; /* [11.. 8] */
229 u32 tCPDED
: 2; /* [13..12] */
230 u32 tPRPDEN
: 2; /* [15..14] */
231 u32 odt_delay_d0
: 2; /* [17..16] */
232 u32 odt_delay_d1
: 2; /* [19..18] */
241 u32 overclock_tXP
: 1; /* [12..12] */
242 u32 overclock_tXPDLL
: 1; /* [13..13] */
250 u32 oref_ri
: 8; /* [ 7.. 0] */
251 u32 refresh_high_wm
: 4; /* [11.. 8] */
252 u32 refresh_panic_wm
: 4; /* [15..12] */
253 u32 refresh_2x_control
: 2; /* [17..16] */
261 u32 tREFI
: 16; /* [15.. 0] */
262 u32 tRFC
: 9; /* [24..16] */
263 u32 tREFIx9
: 7; /* [31..25] */
270 u32 tXSDLL
: 12; /* [11.. 0] */
271 u32 tXS_offset
: 4; /* [15..12] */
272 u32 tZQOPER
: 10; /* [25..16] */
274 u32 tMOD
: 4; /* [31..28] */
279 typedef struct ramctr_timing_st ramctr_timing
;
281 void iosav_write_sequence(const int ch
, const struct iosav_ssq
*seq
, const unsigned int length
);
282 void iosav_run_queue(const int ch
, const u8 loops
, const u8 as_timer
);
283 void wait_for_iosav(int channel
);
284 void iosav_run_once_and_wait(const int ch
);
286 void iosav_write_zqcs_sequence(int channel
, int slotrank
, u32 gap
, u32 post
, u32 wrap
);
287 void iosav_write_prea_sequence(int channel
, int slotrank
, u32 post
, u32 wrap
);
288 void iosav_write_read_mpr_sequence(
289 int channel
, int slotrank
, u32 tMOD
, u32 loops
, u32 gap
, u32 loops2
, u32 post2
);
290 void iosav_write_prea_act_read_sequence(ramctr_timing
*ctrl
, int channel
, int slotrank
);
291 void iosav_write_jedec_write_leveling_sequence(
292 ramctr_timing
*ctrl
, int channel
, int slotrank
, int bank
, u32 mr1reg
);
293 void iosav_write_misc_write_sequence(ramctr_timing
*ctrl
, int channel
, int slotrank
,
294 u32 gap0
, u32 loops0
, u32 gap1
, u32 loops2
, u32 wrap2
);
295 void iosav_write_command_training_sequence(
296 ramctr_timing
*ctrl
, int channel
, int slotrank
, unsigned int address
);
297 void iosav_write_data_write_sequence(ramctr_timing
*ctrl
, int channel
, int slotrank
);
298 void iosav_write_aggressive_write_read_sequence(ramctr_timing
*ctrl
, int channel
, int slotrank
);
299 void iosav_write_memory_test_sequence(ramctr_timing
*ctrl
, int channel
, int slotrank
);
301 /* FIXME: Vendor BIOS uses 64 but our algorithms are less
302 performant and even 1 seems to be enough in practice. */
303 #define NUM_PATTERNS 4
306 * WARNING: Do not forget to increase MRC_CACHE_VERSION when the saved data is changed!
308 #define MRC_CACHE_VERSION 5
310 enum power_down_mode
{
319 typedef struct odtmap_st
{
324 /* WARNING: Do not forget to increase MRC_CACHE_VERSION when this struct is changed! */
325 typedef struct dimm_info_st
{
326 struct dimm_attr_ddr3_st dimm
[NUM_CHANNELS
][NUM_SLOTS
];
329 /* WARNING: Do not forget to increase MRC_CACHE_VERSION when this struct is changed! */
330 struct ram_rank_timings
{
331 /* ROUNDT_LAT register: One byte per slotrank */
332 u8 roundtrip_latency
;
334 /* IO_LATENCY register: One nibble per slotrank */
337 /* Phase interpolator coding for command and control */
340 struct ram_lane_timings
{
341 /* GDCR RX timings */
346 /* GDCR TX timings */
352 /* WARNING: Do not forget to increase MRC_CACHE_VERSION when this struct is changed! */
353 typedef struct ramctr_timing_st
{
354 u16 spd_crc
[NUM_CHANNELS
][NUM_SLOTS
];
359 /* DDR base_freq = 100 Mhz / 133 Mhz */
362 /* Frequency index */
366 /* Latencies are in units of ns, scaled by x256 */
380 /* Latencies in terms of clock cycles
381 They are saved separately as they are needed for DRAM MRS commands */
382 u8 CAS
; /* CAS read latency */
383 u8 CWL
; /* CAS write latency */
394 /* Bits [0..11] of PM_DLL_CONFIG: Master DLL wakeup delay timer */
397 u8 rankmap
[NUM_CHANNELS
];
398 int ref_card_offset
[NUM_CHANNELS
];
399 u32 mad_dimm
[NUM_CHANNELS
];
400 int channel_size_mb
[NUM_CHANNELS
];
401 u32 cmd_stretch
[NUM_CHANNELS
];
404 int pi_coding_threshold
;
409 int lanes
; /* active lanes: 8 or 9 */
413 int extended_temperature_range
;
414 int auto_self_refresh
;
416 int rank_mirror
[NUM_CHANNELS
][NUM_SLOTRANKS
];
418 struct ram_rank_timings timings
[NUM_CHANNELS
][NUM_SLOTRANKS
];
423 #define SOUTHBRIDGE PCI_DEV(0, 0x1f, 0)
425 #define FOR_ALL_LANES for (lane = 0; lane < ctrl->lanes; lane++)
426 #define FOR_ALL_CHANNELS for (channel = 0; channel < NUM_CHANNELS; channel++)
427 #define FOR_ALL_POPULATED_RANKS for (slotrank = 0; slotrank < NUM_SLOTRANKS; slotrank++) if (ctrl->rankmap[channel] & (1 << slotrank))
428 #define FOR_ALL_POPULATED_CHANNELS for (channel = 0; channel < NUM_CHANNELS; channel++) if (ctrl->rankmap[channel])
429 #define MAX_EDGE_TIMING 71
430 #define MAX_TX_DQ 127
431 #define MAX_TX_DQS 511
432 #define MAX_RCVEN 127
437 * 1 QCLK (quadrature clock) is one half of a full clock cycle (tCK).
438 * In addition, 64 PI (phase interpolator) ticks are equal to 1 QCLK.
439 * Logic delay values in I/O register bitfields are expressed in QCLKs.
443 #define MAKE_ERR ((channel << 16) | (slotrank << 8) | 1)
444 #define GET_ERR_CHANNEL(x) (x >> 16)
446 void dram_mrscommands(ramctr_timing
*ctrl
);
447 void program_timings(ramctr_timing
*ctrl
, int channel
);
448 void dram_find_common_params(ramctr_timing
*ctrl
);
449 void dram_xover(ramctr_timing
*ctrl
);
450 void dram_timing_regs(ramctr_timing
*ctrl
);
451 void dram_dimm_mapping(ramctr_timing
*ctrl
);
452 void dram_dimm_set_mapping(ramctr_timing
*ctrl
, int training
);
453 void dram_zones(ramctr_timing
*ctrl
, int training
);
454 void dram_memorymap(ramctr_timing
*ctrl
, int me_uma_size
);
455 void dram_jedecreset(ramctr_timing
*ctrl
);
456 int receive_enable_calibration(ramctr_timing
*ctrl
);
457 int write_training(ramctr_timing
*ctrl
);
458 int command_training(ramctr_timing
*ctrl
);
459 int read_mpr_training(ramctr_timing
*ctrl
);
460 int aggressive_read_training(ramctr_timing
*ctrl
);
461 int aggressive_write_training(ramctr_timing
*ctrl
);
462 void normalize_training(ramctr_timing
*ctrl
);
463 int channel_test(ramctr_timing
*ctrl
);
464 void set_scrambling_seed(ramctr_timing
*ctrl
);
465 void set_wmm_behavior(const u32 cpu
);
466 void prepare_training(ramctr_timing
*ctrl
);
467 void set_read_write_timings(ramctr_timing
*ctrl
);
468 void set_normal_operation(ramctr_timing
*ctrl
);
469 void final_registers(ramctr_timing
*ctrl
);
470 void restore_timings(ramctr_timing
*ctrl
);
471 int try_init_dram_ddr3(ramctr_timing
*ctrl
, int fast_boot
, int s3resume
, int me_uma_size
);
473 void channel_scrub(ramctr_timing
*ctrl
);
474 bool get_host_ecc_cap(void);
475 bool get_host_ecc_forced(void);