blob: 5101f3f383492b0aca7ceafbe283dbf8b22037e1 [file] [log] [blame]
Stefan Roese5ffceb82015-03-26 15:36:56 +01001/*
2 * Copyright (C) Marvell International Ltd. and its affiliates
3 *
4 * SPDX-License-Identifier: GPL-2.0
5 */
6
7#include <common.h>
8#include <spl.h>
9#include <asm/io.h>
10#include <asm/arch/cpu.h>
11#include <asm/arch/soc.h>
12
13#include "ddr3_init.h"
14
15/* Design Guidelines parameters */
16u32 g_zpri_data = 123; /* controller data - P drive strength */
17u32 g_znri_data = 123; /* controller data - N drive strength */
18u32 g_zpri_ctrl = 74; /* controller C/A - P drive strength */
19u32 g_znri_ctrl = 74; /* controller C/A - N drive strength */
20u32 g_zpodt_data = 45; /* controller data - P ODT */
21u32 g_znodt_data = 45; /* controller data - N ODT */
22u32 g_zpodt_ctrl = 45; /* controller data - P ODT */
23u32 g_znodt_ctrl = 45; /* controller data - N ODT */
24u32 g_odt_config = 0x120012;
25u32 g_rtt_nom = 0x44;
26u32 g_dic = 0x2;
27
28#ifdef STATIC_ALGO_SUPPORT
29
30#define PARAM_NOT_CARE 0
31#define MAX_STATIC_SEQ 48
32
33u32 silicon_delay[HWS_MAX_DEVICE_NUM];
34struct hws_tip_static_config_info static_config[HWS_MAX_DEVICE_NUM];
35static reg_data *static_init_controller_config[HWS_MAX_DEVICE_NUM];
36
37/* debug delay in write leveling */
38int wl_debug_delay = 0;
39/* pup register #3 for functional board */
40int function_reg_value = 8;
41u32 silicon;
42
43u32 read_ready_delay_phase_offset[] = { 4, 4, 4, 4, 6, 6, 6, 6 };
44
45static struct cs_element chip_select_map[] = {
46 /* CS Value (single only) Num_CS */
47 {0, 0},
48 {0, 1},
49 {1, 1},
50 {0, 2},
51 {2, 1},
52 {0, 2},
53 {0, 2},
54 {0, 3},
55 {3, 1},
56 {0, 2},
57 {0, 2},
58 {0, 3},
59 {0, 2},
60 {0, 3},
61 {0, 3},
62 {0, 4}
63};
64
65/*
66 * Register static init controller DB
67 */
68int ddr3_tip_init_specific_reg_config(u32 dev_num, reg_data *reg_config_arr)
69{
70 static_init_controller_config[dev_num] = reg_config_arr;
71 return MV_OK;
72}
73
74/*
75 * Register static info DB
76 */
77int ddr3_tip_init_static_config_db(
78 u32 dev_num, struct hws_tip_static_config_info *static_config_info)
79{
80 static_config[dev_num].board_trace_arr =
81 static_config_info->board_trace_arr;
82 static_config[dev_num].package_trace_arr =
83 static_config_info->package_trace_arr;
84 silicon_delay[dev_num] = static_config_info->silicon_delay;
85
86 return MV_OK;
87}
88
89/*
90 * Static round trip flow - Calculates the total round trip delay.
91 */
92int ddr3_tip_static_round_trip_arr_build(u32 dev_num,
93 struct trip_delay_element *table_ptr,
94 int is_wl, u32 *round_trip_delay_arr)
95{
96 u32 bus_index, global_bus;
97 u32 if_id;
98 u32 bus_per_interface;
99 int sign;
100 u32 temp;
101 u32 board_trace;
102 struct trip_delay_element *pkg_delay_ptr;
103 struct hws_topology_map *tm = ddr3_get_topology_map();
104
105 /*
106 * In WL we calc the diff between Clock to DQs in RL we sum the round
107 * trip of Clock and DQs
108 */
109 sign = (is_wl) ? -1 : 1;
110
111 bus_per_interface = GET_TOPOLOGY_NUM_OF_BUSES();
112
113 for (if_id = 0; if_id <= MAX_INTERFACE_NUM - 1; if_id++) {
114 VALIDATE_ACTIVE(tm->if_act_mask, if_id);
115 for (bus_index = 0; bus_index < bus_per_interface;
116 bus_index++) {
117 VALIDATE_ACTIVE(tm->bus_act_mask, bus_index);
118 global_bus = (if_id * bus_per_interface) + bus_index;
119
120 /* calculate total trip delay (package and board) */
121 board_trace = (table_ptr[global_bus].dqs_delay * sign) +
122 table_ptr[global_bus].ck_delay;
123 temp = (board_trace * 163) / 1000;
124
125 /* Convert the length to delay in psec units */
126 pkg_delay_ptr =
127 static_config[dev_num].package_trace_arr;
128 round_trip_delay_arr[global_bus] = temp +
129 (int)(pkg_delay_ptr[global_bus].dqs_delay *
130 sign) +
131 (int)pkg_delay_ptr[global_bus].ck_delay +
132 (int)((is_wl == 1) ? wl_debug_delay :
133 (int)silicon_delay[dev_num]);
134 DEBUG_TRAINING_STATIC_IP(
135 DEBUG_LEVEL_TRACE,
136 ("Round Trip Build round_trip_delay_arr[0x%x]: 0x%x temp 0x%x\n",
137 global_bus, round_trip_delay_arr[global_bus],
138 temp));
139 }
140 }
141
142 return MV_OK;
143}
144
145/*
146 * Write leveling for static flow - calculating the round trip delay of the
147 * DQS signal.
148 */
149int ddr3_tip_write_leveling_static_config(u32 dev_num, u32 if_id,
150 enum hws_ddr_freq frequency,
151 u32 *round_trip_delay_arr)
152{
153 u32 bus_index; /* index to the bus loop */
154 u32 bus_start_index;
155 u32 bus_per_interface;
156 u32 phase = 0;
157 u32 adll = 0, adll_cen, adll_inv, adll_final;
158 u32 adll_period = MEGA / freq_val[frequency] / 64;
159
160 DEBUG_TRAINING_STATIC_IP(DEBUG_LEVEL_TRACE,
161 ("ddr3_tip_write_leveling_static_config\n"));
162 DEBUG_TRAINING_STATIC_IP(
163 DEBUG_LEVEL_TRACE,
164 ("dev_num 0x%x IF 0x%x freq %d (adll_period 0x%x)\n",
165 dev_num, if_id, frequency, adll_period));
166
167 bus_per_interface = GET_TOPOLOGY_NUM_OF_BUSES();
168 bus_start_index = if_id * bus_per_interface;
169 for (bus_index = bus_start_index;
170 bus_index < (bus_start_index + bus_per_interface); bus_index++) {
171 VALIDATE_ACTIVE(tm->bus_act_mask, bus_index);
172 phase = round_trip_delay_arr[bus_index] / (32 * adll_period);
173 adll = (round_trip_delay_arr[bus_index] -
174 (phase * 32 * adll_period)) / adll_period;
175 adll = (adll > 31) ? 31 : adll;
176 adll_cen = 16 + adll;
177 adll_inv = adll_cen / 32;
178 adll_final = adll_cen - (adll_inv * 32);
179 adll_final = (adll_final > 31) ? 31 : adll_final;
180
181 DEBUG_TRAINING_STATIC_IP(DEBUG_LEVEL_TRACE,
182 ("\t%d - phase 0x%x adll 0x%x\n",
183 bus_index, phase, adll));
184 /*
185 * Writing to all 4 phy of Interface number,
186 * bit 0 \96 4 \96 ADLL, bit 6-8 phase
187 */
188 CHECK_STATUS(ddr3_tip_bus_read_modify_write
189 (dev_num, ACCESS_TYPE_UNICAST, if_id,
190 (bus_index % 4), DDR_PHY_DATA,
191 PHY_WRITE_DELAY(cs),
192 ((phase << 6) + (adll & 0x1f)), 0x1df));
193 CHECK_STATUS(ddr3_tip_bus_write
194 (dev_num, ACCESS_TYPE_UNICAST, if_id,
195 ACCESS_TYPE_UNICAST, (bus_index % 4),
196 DDR_PHY_DATA, WRITE_CENTRALIZATION_PHY_REG,
197 ((adll_inv & 0x1) << 5) + adll_final));
198 }
199
200 return MV_OK;
201}
202
203/*
204 * Read leveling for static flow
205 */
206int ddr3_tip_read_leveling_static_config(u32 dev_num,
207 u32 if_id,
208 enum hws_ddr_freq frequency,
209 u32 *total_round_trip_delay_arr)
210{
211 u32 cs, data0, data1, data3 = 0;
212 u32 bus_index; /* index to the bus loop */
213 u32 bus_start_index;
214 u32 phase0, phase1, max_phase;
215 u32 adll0, adll1;
216 u32 cl_value;
217 u32 min_delay;
218 u32 sdr_period = MEGA / freq_val[frequency];
219 u32 ddr_period = MEGA / freq_val[frequency] / 2;
220 u32 adll_period = MEGA / freq_val[frequency] / 64;
221 enum hws_speed_bin speed_bin_index;
222 u32 rd_sample_dly[MAX_CS_NUM] = { 0 };
223 u32 rd_ready_del[MAX_CS_NUM] = { 0 };
224 u32 bus_per_interface = GET_TOPOLOGY_NUM_OF_BUSES();
225 struct hws_topology_map *tm = ddr3_get_topology_map();
226
227 DEBUG_TRAINING_STATIC_IP(DEBUG_LEVEL_TRACE,
228 ("ddr3_tip_read_leveling_static_config\n"));
229 DEBUG_TRAINING_STATIC_IP(DEBUG_LEVEL_TRACE,
230 ("dev_num 0x%x ifc 0x%x freq %d\n", dev_num,
231 if_id, frequency));
232 DEBUG_TRAINING_STATIC_IP(
233 DEBUG_LEVEL_TRACE,
234 ("Sdr_period 0x%x Ddr_period 0x%x adll_period 0x%x\n",
235 sdr_period, ddr_period, adll_period));
236
237 if (tm->interface_params[first_active_if].memory_freq ==
238 frequency) {
239 cl_value = tm->interface_params[first_active_if].cas_l;
240 DEBUG_TRAINING_STATIC_IP(DEBUG_LEVEL_TRACE,
241 ("cl_value 0x%x\n", cl_value));
242 } else {
243 speed_bin_index = tm->interface_params[if_id].speed_bin_index;
244 cl_value = cas_latency_table[speed_bin_index].cl_val[frequency];
245 DEBUG_TRAINING_STATIC_IP(DEBUG_LEVEL_TRACE,
246 ("cl_value 0x%x speed_bin_index %d\n",
247 cl_value, speed_bin_index));
248 }
249
250 bus_start_index = if_id * bus_per_interface;
251
252 for (bus_index = bus_start_index;
253 bus_index < (bus_start_index + bus_per_interface);
254 bus_index += 2) {
255 VALIDATE_ACTIVE(tm->bus_act_mask, bus_index);
256 cs = chip_select_map[
257 tm->interface_params[if_id].as_bus_params[
258 (bus_index % 4)].cs_bitmask].cs_num;
259
260 /* read sample delay calculation */
261 min_delay = (total_round_trip_delay_arr[bus_index] <
262 total_round_trip_delay_arr[bus_index + 1]) ?
263 total_round_trip_delay_arr[bus_index] :
264 total_round_trip_delay_arr[bus_index + 1];
265 /* round down */
266 rd_sample_dly[cs] = 2 * (min_delay / (sdr_period * 2));
267 DEBUG_TRAINING_STATIC_IP(
268 DEBUG_LEVEL_TRACE,
269 ("\t%d - min_delay 0x%x cs 0x%x rd_sample_dly[cs] 0x%x\n",
270 bus_index, min_delay, cs, rd_sample_dly[cs]));
271
272 /* phase calculation */
273 phase0 = (total_round_trip_delay_arr[bus_index] -
274 (sdr_period * rd_sample_dly[cs])) / (ddr_period);
275 phase1 = (total_round_trip_delay_arr[bus_index + 1] -
276 (sdr_period * rd_sample_dly[cs])) / (ddr_period);
277 max_phase = (phase0 > phase1) ? phase0 : phase1;
278 DEBUG_TRAINING_STATIC_IP(
279 DEBUG_LEVEL_TRACE,
280 ("\tphase0 0x%x phase1 0x%x max_phase 0x%x\n",
281 phase0, phase1, max_phase));
282
283 /* ADLL calculation */
284 adll0 = (u32)((total_round_trip_delay_arr[bus_index] -
285 (sdr_period * rd_sample_dly[cs]) -
286 (ddr_period * phase0)) / adll_period);
287 adll0 = (adll0 > 31) ? 31 : adll0;
288 adll1 = (u32)((total_round_trip_delay_arr[bus_index + 1] -
289 (sdr_period * rd_sample_dly[cs]) -
290 (ddr_period * phase1)) / adll_period);
291 adll1 = (adll1 > 31) ? 31 : adll1;
292
293 /* The Read delay close the Read FIFO */
294 rd_ready_del[cs] = rd_sample_dly[cs] +
295 read_ready_delay_phase_offset[max_phase];
296 DEBUG_TRAINING_STATIC_IP(
297 DEBUG_LEVEL_TRACE,
298 ("\tadll0 0x%x adll1 0x%x rd_ready_del[cs] 0x%x\n",
299 adll0, adll1, rd_ready_del[cs]));
300
301 /*
302 * Write to the phy of Interface (bit 0 \96 4 \96 ADLL,
303 * bit 6-8 phase)
304 */
305 data0 = ((phase0 << 6) + (adll0 & 0x1f));
306 data1 = ((phase1 << 6) + (adll1 & 0x1f));
307
308 CHECK_STATUS(ddr3_tip_bus_read_modify_write
309 (dev_num, ACCESS_TYPE_UNICAST, if_id,
310 (bus_index % 4), DDR_PHY_DATA, PHY_READ_DELAY(cs),
311 data0, 0x1df));
312 CHECK_STATUS(ddr3_tip_bus_read_modify_write
313 (dev_num, ACCESS_TYPE_UNICAST, if_id,
314 ((bus_index + 1) % 4), DDR_PHY_DATA,
315 PHY_READ_DELAY(cs), data1, 0x1df));
316 }
317
318 for (bus_index = 0; bus_index < bus_per_interface; bus_index++) {
319 VALIDATE_ACTIVE(tm->bus_act_mask, bus_index);
320 CHECK_STATUS(ddr3_tip_bus_read_modify_write
321 (dev_num, ACCESS_TYPE_UNICAST, if_id,
322 bus_index, DDR_PHY_DATA, 0x3, data3, 0x1f));
323 }
324 CHECK_STATUS(ddr3_tip_if_write
325 (dev_num, ACCESS_TYPE_UNICAST, if_id,
326 READ_DATA_SAMPLE_DELAY,
327 (rd_sample_dly[0] + cl_value) + (rd_sample_dly[1] << 8),
328 MASK_ALL_BITS));
329
330 /* Read_ready_del0 bit 0-4 , CS bits 8-12 */
331 CHECK_STATUS(ddr3_tip_if_write
332 (dev_num, ACCESS_TYPE_UNICAST, if_id,
333 READ_DATA_READY_DELAY,
334 rd_ready_del[0] + (rd_ready_del[1] << 8) + cl_value,
335 MASK_ALL_BITS));
336
337 return MV_OK;
338}
339
340/*
341 * DDR3 Static flow
342 */
343int ddr3_tip_run_static_alg(u32 dev_num, enum hws_ddr_freq freq)
344{
345 u32 if_id = 0;
346 struct trip_delay_element *table_ptr;
347 u32 wl_total_round_trip_delay_arr[MAX_TOTAL_BUS_NUM];
348 u32 rl_total_round_trip_delay_arr[MAX_TOTAL_BUS_NUM];
349 struct init_cntr_param init_cntr_prm;
350 int ret;
351 struct hws_topology_map *tm = ddr3_get_topology_map();
352
353 DEBUG_TRAINING_STATIC_IP(DEBUG_LEVEL_TRACE,
354 ("ddr3_tip_run_static_alg"));
355
356 init_cntr_prm.do_mrs_phy = 1;
357 init_cntr_prm.is_ctrl64_bit = 0;
358 init_cntr_prm.init_phy = 1;
359 ret = hws_ddr3_tip_init_controller(dev_num, &init_cntr_prm);
360 if (ret != MV_OK) {
361 DEBUG_TRAINING_STATIC_IP(
362 DEBUG_LEVEL_ERROR,
363 ("hws_ddr3_tip_init_controller failure\n"));
364 }
365
366 /* calculate the round trip delay for Write Leveling */
367 table_ptr = static_config[dev_num].board_trace_arr;
368 CHECK_STATUS(ddr3_tip_static_round_trip_arr_build
369 (dev_num, table_ptr, 1,
370 wl_total_round_trip_delay_arr));
371 /* calculate the round trip delay for Read Leveling */
372 CHECK_STATUS(ddr3_tip_static_round_trip_arr_build
373 (dev_num, table_ptr, 0,
374 rl_total_round_trip_delay_arr));
375
376 for (if_id = 0; if_id <= MAX_INTERFACE_NUM - 1; if_id++) {
377 /* check if the interface is enabled */
378 VALIDATE_ACTIVE(tm->if_act_mask, if_id);
379 /*
380 * Static frequency is defined according to init-frequency
381 * (not target)
382 */
383 DEBUG_TRAINING_STATIC_IP(DEBUG_LEVEL_TRACE,
384 ("Static IF %d freq %d\n",
385 if_id, freq));
386 CHECK_STATUS(ddr3_tip_write_leveling_static_config
387 (dev_num, if_id, freq,
388 wl_total_round_trip_delay_arr));
389 CHECK_STATUS(ddr3_tip_read_leveling_static_config
390 (dev_num, if_id, freq,
391 rl_total_round_trip_delay_arr));
392 }
393
394 return MV_OK;
395}
396
397/*
398 * Init controller for static flow
399 */
400int ddr3_tip_static_init_controller(u32 dev_num)
401{
402 u32 index_cnt = 0;
403
404 DEBUG_TRAINING_STATIC_IP(DEBUG_LEVEL_TRACE,
405 ("ddr3_tip_static_init_controller\n"));
406 while (static_init_controller_config[dev_num][index_cnt].reg_addr !=
407 0) {
408 CHECK_STATUS(ddr3_tip_if_write
409 (dev_num, ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE,
410 static_init_controller_config[dev_num][index_cnt].
411 reg_addr,
412 static_init_controller_config[dev_num][index_cnt].
413 reg_data,
414 static_init_controller_config[dev_num][index_cnt].
415 reg_mask));
416
417 DEBUG_TRAINING_STATIC_IP(DEBUG_LEVEL_TRACE,
418 ("Init_controller index_cnt %d\n",
419 index_cnt));
420 index_cnt++;
421 }
422
423 return MV_OK;
424}
425
426int ddr3_tip_static_phy_init_controller(u32 dev_num)
427{
428 DEBUG_TRAINING_STATIC_IP(DEBUG_LEVEL_TRACE,
429 ("Phy Init Controller 2\n"));
430 CHECK_STATUS(ddr3_tip_bus_write
431 (dev_num, ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE,
432 ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE, DDR_PHY_DATA, 0xa4,
433 0x3dfe));
434
435 DEBUG_TRAINING_STATIC_IP(DEBUG_LEVEL_TRACE,
436 ("Phy Init Controller 3\n"));
437 CHECK_STATUS(ddr3_tip_bus_write
438 (dev_num, ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE,
439 ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE, DDR_PHY_DATA, 0xa6,
440 0xcb2));
441
442 DEBUG_TRAINING_STATIC_IP(DEBUG_LEVEL_TRACE,
443 ("Phy Init Controller 4\n"));
444 CHECK_STATUS(ddr3_tip_bus_write
445 (dev_num, ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE,
446 ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE, DDR_PHY_DATA, 0xa9,
447 0));
448
449 DEBUG_TRAINING_STATIC_IP(DEBUG_LEVEL_TRACE,
450 ("Static Receiver Calibration\n"));
451 CHECK_STATUS(ddr3_tip_bus_write
452 (dev_num, ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE,
453 ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE, DDR_PHY_DATA, 0xd0,
454 0x1f));
455
456 DEBUG_TRAINING_STATIC_IP(DEBUG_LEVEL_TRACE,
457 ("Static V-REF Calibration\n"));
458 CHECK_STATUS(ddr3_tip_bus_write
459 (dev_num, ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE,
460 ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE, DDR_PHY_DATA, 0xa8,
461 0x434));
462
463 return MV_OK;
464}
465#endif
466
467/*
468 * Configure phy (called by static init controller) for static flow
469 */
470int ddr3_tip_configure_phy(u32 dev_num)
471{
472 u32 if_id, phy_id;
473 struct hws_topology_map *tm = ddr3_get_topology_map();
474
475 CHECK_STATUS(ddr3_tip_bus_write
476 (dev_num, ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE,
477 ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE, DDR_PHY_DATA,
478 PAD_ZRI_CALIB_PHY_REG,
479 ((0x7f & g_zpri_data) << 7 | (0x7f & g_znri_data))));
480 CHECK_STATUS(ddr3_tip_bus_write
481 (dev_num, ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE,
482 ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE, DDR_PHY_CONTROL,
483 PAD_ZRI_CALIB_PHY_REG,
484 ((0x7f & g_zpri_ctrl) << 7 | (0x7f & g_znri_ctrl))));
485 CHECK_STATUS(ddr3_tip_bus_write
486 (dev_num, ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE,
487 ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE, DDR_PHY_DATA,
488 PAD_ODT_CALIB_PHY_REG,
489 ((0x3f & g_zpodt_data) << 6 | (0x3f & g_znodt_data))));
490 CHECK_STATUS(ddr3_tip_bus_write
491 (dev_num, ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE,
492 ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE, DDR_PHY_CONTROL,
493 PAD_ODT_CALIB_PHY_REG,
494 ((0x3f & g_zpodt_ctrl) << 6 | (0x3f & g_znodt_ctrl))));
495
496 CHECK_STATUS(ddr3_tip_bus_write
497 (dev_num, ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE,
498 ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE, DDR_PHY_DATA,
499 PAD_PRE_DISABLE_PHY_REG, 0));
500 CHECK_STATUS(ddr3_tip_bus_write
501 (dev_num, ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE,
502 ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE, DDR_PHY_DATA,
503 CMOS_CONFIG_PHY_REG, 0));
504 CHECK_STATUS(ddr3_tip_bus_write
505 (dev_num, ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE,
506 ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE, DDR_PHY_CONTROL,
507 CMOS_CONFIG_PHY_REG, 0));
508
509 for (if_id = 0; if_id <= MAX_INTERFACE_NUM - 1; if_id++) {
510 /* check if the interface is enabled */
511 VALIDATE_ACTIVE(tm->if_act_mask, if_id);
512
513 for (phy_id = 0;
514 phy_id < tm->num_of_bus_per_interface;
515 phy_id++) {
516 VALIDATE_ACTIVE(tm->bus_act_mask, phy_id);
517 /* Vref & clamp */
518 CHECK_STATUS(ddr3_tip_bus_read_modify_write
519 (dev_num, ACCESS_TYPE_UNICAST,
520 if_id, phy_id, DDR_PHY_DATA,
521 PAD_CONFIG_PHY_REG,
522 ((clamp_tbl[if_id] << 4) | vref),
523 ((0x7 << 4) | 0x7)));
524 /* clamp not relevant for control */
525 CHECK_STATUS(ddr3_tip_bus_read_modify_write
526 (dev_num, ACCESS_TYPE_UNICAST,
527 if_id, phy_id, DDR_PHY_CONTROL,
528 PAD_CONFIG_PHY_REG, 0x4, 0x7));
529 }
530 }
531
532 CHECK_STATUS(ddr3_tip_bus_write
533 (dev_num, ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE,
534 ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE, DDR_PHY_DATA, 0x90,
535 0x6002));
536
537 return MV_OK;
538}