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