1 /* SPDX-License-Identifier: GPL-2.0 */
3 * Copyright (C) 2020 Marvell International Ltd.
5 * https://spdx.org/licenses
8 #ifndef __BOARD_DDR_H__
9 #define __BOARD_DDR_H__
11 #define OCTEON_EBB7304_DRAM_SOCKET_CONFIGURATION0 \
12 { {0x1050, 0x0}, {NULL, NULL} }, { {0x1051, 0x0}, {NULL, NULL} }
13 #define OCTEON_EBB7304_DRAM_SOCKET_CONFIGURATION1 \
14 { {0x1052, 0x0}, {NULL, NULL} }, { {0x1053, 0x0}, {NULL, NULL} }
16 #define OCTEON_EBB7304_BOARD_EEPROM_TWSI_ADDR 0x56
19 * Local copy of these parameters to allow for customization for this
20 * board design. The generic version resides in lib_octeon_shared.h.
23 /* LMC0_MODEREG_PARAMS1 */
24 #define OCTEON_EBB7304_MODEREG_PARAMS1_1RANK_1SLOT \
30 .rtt_wr_00 = ddr4_rttwr_80ohm & 3, \
31 .rtt_wr_00_ext = (ddr4_rttwr_80ohm >> 2) & 1, \
32 .dic_00 = ddr4_dic_34ohm, \
38 .dic_01 = ddr4_dic_34ohm, \
44 .dic_10 = ddr4_dic_34ohm, \
50 .dic_11 = ddr4_dic_34ohm, \
55 #define OCTEON_EBB7304_MODEREG_PARAMS1_1RANK_2SLOT \
61 .rtt_wr_00 = ddr4_rttwr_80ohm & 3, \
62 .rtt_wr_00_ext = (ddr4_rttwr_80ohm >> 2) & 1, \
63 .dic_00 = ddr4_dic_34ohm, \
69 .dic_01 = ddr4_dic_34ohm, \
74 .rtt_wr_10 = ddr4_rttwr_80ohm & 3, \
75 .rtt_wr_10_ext = (ddr4_rttwr_80ohm >> 2) & 1, \
76 .dic_10 = ddr4_dic_34ohm, \
82 .dic_11 = ddr4_dic_34ohm, \
87 #define OCTEON_EBB7304_MODEREG_PARAMS1_2RANK_1SLOT \
93 .rtt_wr_00 = ddr4_rttwr_240ohm, \
94 .dic_00 = ddr4_dic_34ohm, \
99 .rtt_wr_01 = ddr4_rttwr_240ohm, \
100 .dic_01 = ddr4_dic_34ohm, \
105 .dic_10 = ddr4_dic_34ohm, \
111 .dic_11 = ddr4_dic_34ohm, \
116 #define OCTEON_EBB7304_MODEREG_PARAMS1_2RANK_2SLOT \
122 .rtt_wr_00 = ddr4_rttwr_240ohm, \
123 .dic_00 = ddr4_dic_34ohm, \
124 .rtt_nom_00 = ddr4_rttnom_120ohm, \
128 .rtt_wr_01 = ddr4_rttwr_240ohm, \
129 .dic_01 = ddr4_dic_34ohm, \
130 .rtt_nom_01 = ddr4_rttnom_120ohm, \
134 .rtt_wr_10 = ddr4_rttwr_240ohm, \
135 .dic_10 = ddr4_dic_34ohm, \
136 .rtt_nom_10 = ddr4_rttnom_120ohm, \
140 .rtt_wr_11 = ddr4_rttwr_240ohm, \
141 .dic_11 = ddr4_dic_34ohm, \
142 .rtt_nom_11 = ddr4_rttnom_120ohm, \
146 #define OCTEON_EBB7304_MODEREG_PARAMS1_4RANK_1SLOT \
152 .rtt_wr_00 = rttwr_60ohm, \
153 .dic_00 = dic_34ohm, \
154 .rtt_nom_00 = rttnom_20ohm, \
158 .rtt_wr_01 = rttwr_60ohm, \
159 .dic_01 = dic_34ohm, \
160 .rtt_nom_01 = rttnom_none, \
164 .rtt_wr_10 = rttwr_60ohm, \
165 .dic_10 = dic_34ohm, \
166 .rtt_nom_10 = rttnom_20ohm, \
170 .rtt_wr_11 = rttwr_60ohm, \
171 .dic_11 = dic_34ohm, \
172 .rtt_nom_11 = rttnom_none, \
176 #define OCTEON_EBB7304_MODEREG_PARAMS2_1RANK_1SLOT \
179 .rtt_park_00 = ddr4_rttpark_60ohm, \
180 .vref_value_00 = 0x22, \
181 .vref_range_00 = 0, \
183 .vref_value_01 = 0, \
184 .vref_range_01 = 0, \
186 .vref_value_10 = 0, \
187 .vref_range_10 = 0, \
189 .vref_value_11 = 0, \
195 #define OCTEON_EBB7304_MODEREG_PARAMS2_1RANK_2SLOT \
198 .rtt_park_00 = ddr4_rttpark_48ohm, \
199 .vref_value_00 = 0x1f, \
200 .vref_range_00 = 0, \
202 .vref_value_01 = 0, \
203 .vref_range_01 = 0, \
204 .rtt_park_10 = ddr4_rttpark_48ohm, \
205 .vref_value_10 = 0x1f, \
206 .vref_range_10 = 0, \
208 .vref_value_11 = 0, \
213 #define OCTEON_EBB7304_MODEREG_PARAMS2_2RANK_1SLOT \
216 .rtt_park_00 = ddr4_rttpark_120ohm, \
217 .vref_value_00 = 0x19, \
218 .vref_range_00 = 0, \
219 .rtt_park_01 = ddr4_rttpark_120ohm, \
220 .vref_value_01 = 0x19, \
221 .vref_range_01 = 0, \
223 .vref_value_10 = 0, \
224 .vref_range_10 = 0, \
226 .vref_value_11 = 0, \
231 #define OCTEON_EBB7304_MODEREG_PARAMS2_2RANK_2SLOT \
234 .rtt_park_00 = ddr4_rttpark_60ohm, \
235 .vref_value_00 = 0x19, \
236 .vref_range_00 = 0, \
237 .rtt_park_01 = ddr4_rttpark_60ohm, \
238 .vref_value_01 = 0x19, \
239 .vref_range_01 = 0, \
240 .rtt_park_10 = ddr4_rttpark_60ohm, \
241 .vref_value_10 = 0x19, \
242 .vref_range_10 = 0, \
243 .rtt_park_11 = ddr4_rttpark_60ohm, \
244 .vref_value_11 = 0x19, \
249 #define OCTEON_EBB7304_MODEREG_PARAMS2_4RANK_1SLOT \
252 .rtt_park_00 = ddr4_rttpark_80ohm, \
253 .vref_value_00 = 0x1f, \
254 .vref_range_00 = 0, \
255 .rtt_park_01 = ddr4_rttpark_80ohm, \
256 .vref_value_01 = 0x1f, \
257 .vref_range_01 = 0, \
259 .vref_value_10 = 0, \
260 .vref_range_10 = 0, \
262 .vref_value_11 = 0, \
267 #define OCTEON_EBB7304_CN78XX_DRAM_ODT_1RANK_CONFIGURATION \
270 ddr4_dqx_driver_34_ohm, \
272 OCTEON_EBB7304_MODEREG_PARAMS1_1RANK_1SLOT, \
273 OCTEON_EBB7304_MODEREG_PARAMS2_1RANK_1SLOT, \
274 ddr4_rodt_ctl_48_ohm, \
280 ddr4_dqx_driver_34_ohm, \
282 OCTEON_EBB7304_MODEREG_PARAMS1_1RANK_2SLOT, \
283 OCTEON_EBB7304_MODEREG_PARAMS2_1RANK_2SLOT, \
284 ddr4_rodt_ctl_80_ohm, \
289 #define OCTEON_EBB7304_CN78XX_DRAM_ODT_2RANK_CONFIGURATION \
292 ddr4_dqx_driver_34_ohm, \
294 OCTEON_EBB7304_MODEREG_PARAMS1_2RANK_1SLOT, \
295 OCTEON_EBB7304_MODEREG_PARAMS2_2RANK_1SLOT, \
296 ddr4_rodt_ctl_80_ohm, \
302 ddr4_dqx_driver_34_ohm, \
304 OCTEON_EBB7304_MODEREG_PARAMS1_2RANK_2SLOT, \
305 OCTEON_EBB7304_MODEREG_PARAMS2_2RANK_2SLOT, \
306 ddr4_rodt_ctl_48_ohm, \
311 #define OCTEON_EBB7304_CN78XX_DRAM_ODT_4RANK_CONFIGURATION \
314 ddr4_dqx_driver_34_ohm, \
316 OCTEON_EBB7304_MODEREG_PARAMS1_4RANK_1SLOT, \
317 OCTEON_EBB7304_MODEREG_PARAMS2_4RANK_1SLOT, \
318 ddr4_rodt_ctl_48_ohm, \
324 * Construct a static initializer for the ddr_configuration_t variable that
325 * holds (almost) all of the information required for DDR initialization.
329 * The parameters below make up the custom_lmc_config data structure.
330 * This structure is used to customize the way that the LMC DRAM
331 * Controller is configured for a particular board design.
333 * Refer to the file lib_octeon_board_table_entry.h for a description
334 * of the custom board settings. It is usually kept in the following
335 * location... arch/mips/include/asm/arch-octeon/
339 #define OCTEON_EBB7304_DDR_CONFIGURATION \
342 .custom_lmc_config = { \
343 .min_rtt_nom_idx = 1, \
344 .max_rtt_nom_idx = 7, \
347 .ck_ctl = ddr4_driver_34_ohm, \
348 .cmd_ctl = ddr4_driver_34_ohm, \
349 .ctl_ctl = ddr4_driver_34_ohm, \
350 .min_cas_latency = 0, \
354 .ddr_rtt_nom_auto = 0, \
355 .ddr_rodt_ctl_auto = 0, \
356 .rlevel_comp_offset_udimm = 0, \
357 .rlevel_comp_offset_rdimm = 0, \
358 .rlevel_compute = 0, \
361 .maximum_adjacent_rlevel_delay_increment = 2, \
363 .dll_write_offset = NULL, \
364 .dll_read_offset = NULL, \
367 .dimm_config_table = { \
368 OCTEON_EBB7304_DRAM_SOCKET_CONFIGURATION0, \
369 DIMM_CONFIG_TERMINATOR \
372 .ddr_board_delay = 0, \
373 .lmc_delay_clk = 0, \
374 .lmc_delay_cmd = 0, \
378 .ddr_board_delay = 0, \
379 .lmc_delay_clk = 0, \
380 .lmc_delay_cmd = 0, \
383 .odt_1rank_config = { \
384 OCTEON_EBB7304_CN78XX_DRAM_ODT_1RANK_CONFIGURATION \
386 .odt_2rank_config = { \
387 OCTEON_EBB7304_CN78XX_DRAM_ODT_2RANK_CONFIGURATION \
389 .odt_4rank_config = { \
390 OCTEON_EBB7304_CN78XX_DRAM_ODT_4RANK_CONFIGURATION \
395 .custom_lmc_config = { \
396 .min_rtt_nom_idx = 1, \
397 .max_rtt_nom_idx = 7, \
400 .ck_ctl = ddr4_driver_34_ohm, \
401 .cmd_ctl = ddr4_driver_34_ohm, \
402 .ctl_ctl = ddr4_driver_34_ohm, \
403 .min_cas_latency = 0, \
407 .ddr_rtt_nom_auto = 0, \
408 .ddr_rodt_ctl_auto = 0, \
409 .rlevel_comp_offset_udimm = 0, \
410 .rlevel_comp_offset_rdimm = 0, \
411 .rlevel_compute = 0, \
414 .maximum_adjacent_rlevel_delay_increment = 2, \
416 .dll_write_offset = NULL, \
417 .dll_read_offset = NULL, \
420 .dimm_config_table = { \
421 OCTEON_EBB7304_DRAM_SOCKET_CONFIGURATION1, \
422 DIMM_CONFIG_TERMINATOR \
425 .ddr_board_delay = 0, \
426 .lmc_delay_clk = 0, \
427 .lmc_delay_cmd = 0, \
431 .ddr_board_delay = 0, \
432 .lmc_delay_clk = 0, \
433 .lmc_delay_cmd = 0, \
436 .odt_1rank_config = { \
437 OCTEON_EBB7304_CN78XX_DRAM_ODT_1RANK_CONFIGURATION \
439 .odt_2rank_config = { \
440 OCTEON_EBB7304_CN78XX_DRAM_ODT_2RANK_CONFIGURATION \
442 .odt_4rank_config = { \
443 OCTEON_EBB7304_CN78XX_DRAM_ODT_4RANK_CONFIGURATION \
447 #endif /* __BOARD_DDR_H__ */