xref: /rk3399_rockchip-uboot/drivers/ddr/marvell/a38x/ddr3_debug.c (revision 1b69ce2fc0ecd1741645d6084be45e562156b5ae)
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 <i2c.h>
9*f1df9364SStefan Roese #include <spl.h>
10*f1df9364SStefan Roese #include <asm/io.h>
11*f1df9364SStefan Roese #include <asm/arch/cpu.h>
12*f1df9364SStefan Roese #include <asm/arch/soc.h>
13*f1df9364SStefan Roese 
14*f1df9364SStefan Roese #include "ddr3_init.h"
15*f1df9364SStefan Roese 
16*f1df9364SStefan Roese u8 is_reg_dump = 0;
17*f1df9364SStefan Roese u8 debug_pbs = DEBUG_LEVEL_ERROR;
18*f1df9364SStefan Roese 
19*f1df9364SStefan Roese /*
20*f1df9364SStefan Roese  * API to change flags outside of the lib
21*f1df9364SStefan Roese  */
22*f1df9364SStefan Roese #ifndef SILENT_LIB
23*f1df9364SStefan Roese /* Debug flags for other Training modules */
24*f1df9364SStefan Roese u8 debug_training_static = DEBUG_LEVEL_ERROR;
25*f1df9364SStefan Roese u8 debug_training = DEBUG_LEVEL_ERROR;
26*f1df9364SStefan Roese u8 debug_leveling = DEBUG_LEVEL_ERROR;
27*f1df9364SStefan Roese u8 debug_centralization = DEBUG_LEVEL_ERROR;
28*f1df9364SStefan Roese u8 debug_training_ip = DEBUG_LEVEL_ERROR;
29*f1df9364SStefan Roese u8 debug_training_bist = DEBUG_LEVEL_ERROR;
30*f1df9364SStefan Roese u8 debug_training_hw_alg = DEBUG_LEVEL_ERROR;
31*f1df9364SStefan Roese u8 debug_training_access = DEBUG_LEVEL_ERROR;
32*f1df9364SStefan Roese u8 debug_training_a38x = DEBUG_LEVEL_ERROR;
33*f1df9364SStefan Roese 
ddr3_hws_set_log_level(enum ddr_lib_debug_block block,u8 level)34*f1df9364SStefan Roese void ddr3_hws_set_log_level(enum ddr_lib_debug_block block, u8 level)
35*f1df9364SStefan Roese {
36*f1df9364SStefan Roese 	switch (block) {
37*f1df9364SStefan Roese 	case DEBUG_BLOCK_STATIC:
38*f1df9364SStefan Roese 		debug_training_static = level;
39*f1df9364SStefan Roese 		break;
40*f1df9364SStefan Roese 	case DEBUG_BLOCK_TRAINING_MAIN:
41*f1df9364SStefan Roese 		debug_training = level;
42*f1df9364SStefan Roese 		break;
43*f1df9364SStefan Roese 	case DEBUG_BLOCK_LEVELING:
44*f1df9364SStefan Roese 		debug_leveling = level;
45*f1df9364SStefan Roese 		break;
46*f1df9364SStefan Roese 	case DEBUG_BLOCK_CENTRALIZATION:
47*f1df9364SStefan Roese 		debug_centralization = level;
48*f1df9364SStefan Roese 		break;
49*f1df9364SStefan Roese 	case DEBUG_BLOCK_PBS:
50*f1df9364SStefan Roese 		debug_pbs = level;
51*f1df9364SStefan Roese 		break;
52*f1df9364SStefan Roese 	case DEBUG_BLOCK_ALG:
53*f1df9364SStefan Roese 		debug_training_hw_alg = level;
54*f1df9364SStefan Roese 		break;
55*f1df9364SStefan Roese 	case DEBUG_BLOCK_DEVICE:
56*f1df9364SStefan Roese 		debug_training_a38x = level;
57*f1df9364SStefan Roese 		break;
58*f1df9364SStefan Roese 	case DEBUG_BLOCK_ACCESS:
59*f1df9364SStefan Roese 		debug_training_access = level;
60*f1df9364SStefan Roese 		break;
61*f1df9364SStefan Roese 	case DEBUG_STAGES_REG_DUMP:
62*f1df9364SStefan Roese 		if (level == DEBUG_LEVEL_TRACE)
63*f1df9364SStefan Roese 			is_reg_dump = 1;
64*f1df9364SStefan Roese 		else
65*f1df9364SStefan Roese 			is_reg_dump = 0;
66*f1df9364SStefan Roese 		break;
67*f1df9364SStefan Roese 	case DEBUG_BLOCK_ALL:
68*f1df9364SStefan Roese 	default:
69*f1df9364SStefan Roese 		debug_training_static = level;
70*f1df9364SStefan Roese 		debug_training = level;
71*f1df9364SStefan Roese 		debug_leveling = level;
72*f1df9364SStefan Roese 		debug_centralization = level;
73*f1df9364SStefan Roese 		debug_pbs = level;
74*f1df9364SStefan Roese 		debug_training_hw_alg = level;
75*f1df9364SStefan Roese 		debug_training_access = level;
76*f1df9364SStefan Roese 		debug_training_a38x = level;
77*f1df9364SStefan Roese 	}
78*f1df9364SStefan Roese }
79*f1df9364SStefan Roese #else
ddr3_hws_set_log_level(enum ddr_lib_debug_block block,u8 level)80*f1df9364SStefan Roese void ddr3_hws_set_log_level(enum ddr_lib_debug_block block, u8 level)
81*f1df9364SStefan Roese {
82*f1df9364SStefan Roese 	return;
83*f1df9364SStefan Roese }
84*f1df9364SStefan Roese #endif
85*f1df9364SStefan Roese 
86*f1df9364SStefan Roese struct hws_tip_config_func_db config_func_info[HWS_MAX_DEVICE_NUM];
87*f1df9364SStefan Roese u8 is_default_centralization = 0;
88*f1df9364SStefan Roese u8 is_tune_result = 0;
89*f1df9364SStefan Roese u8 is_validate_window_per_if = 0;
90*f1df9364SStefan Roese u8 is_validate_window_per_pup = 0;
91*f1df9364SStefan Roese u8 sweep_cnt = 1;
92*f1df9364SStefan Roese u32 is_bist_reset_bit = 1;
93*f1df9364SStefan Roese static struct hws_xsb_info xsb_info[HWS_MAX_DEVICE_NUM];
94*f1df9364SStefan Roese 
95*f1df9364SStefan Roese /*
96*f1df9364SStefan Roese  * Dump Dunit & Phy registers
97*f1df9364SStefan Roese  */
ddr3_tip_reg_dump(u32 dev_num)98*f1df9364SStefan Roese int ddr3_tip_reg_dump(u32 dev_num)
99*f1df9364SStefan Roese {
100*f1df9364SStefan Roese 	u32 if_id, reg_addr, data_value, bus_id;
101*f1df9364SStefan Roese 	u32 read_data[MAX_INTERFACE_NUM];
102*f1df9364SStefan Roese 	struct hws_topology_map *tm = ddr3_get_topology_map();
103*f1df9364SStefan Roese 
104*f1df9364SStefan Roese 	printf("-- dunit registers --\n");
105*f1df9364SStefan Roese 	for (reg_addr = 0x1400; reg_addr < 0x19f0; reg_addr += 4) {
106*f1df9364SStefan Roese 		printf("0x%x ", reg_addr);
107*f1df9364SStefan Roese 		for (if_id = 0; if_id <= MAX_INTERFACE_NUM - 1; if_id++) {
108*f1df9364SStefan Roese 			VALIDATE_ACTIVE(tm->if_act_mask, if_id);
109*f1df9364SStefan Roese 			CHECK_STATUS(ddr3_tip_if_read
110*f1df9364SStefan Roese 				     (dev_num, ACCESS_TYPE_UNICAST,
111*f1df9364SStefan Roese 				      if_id, reg_addr, read_data,
112*f1df9364SStefan Roese 				      MASK_ALL_BITS));
113*f1df9364SStefan Roese 			printf("0x%x ", read_data[if_id]);
114*f1df9364SStefan Roese 		}
115*f1df9364SStefan Roese 		printf("\n");
116*f1df9364SStefan Roese 	}
117*f1df9364SStefan Roese 
118*f1df9364SStefan Roese 	printf("-- Phy registers --\n");
119*f1df9364SStefan Roese 	for (reg_addr = 0; reg_addr <= 0xff; reg_addr++) {
120*f1df9364SStefan Roese 		printf("0x%x ", reg_addr);
121*f1df9364SStefan Roese 		for (if_id = 0; if_id <= MAX_INTERFACE_NUM - 1; if_id++) {
122*f1df9364SStefan Roese 			VALIDATE_ACTIVE(tm->if_act_mask, if_id);
123*f1df9364SStefan Roese 			for (bus_id = 0;
124*f1df9364SStefan Roese 			     bus_id < tm->num_of_bus_per_interface;
125*f1df9364SStefan Roese 			     bus_id++) {
126*f1df9364SStefan Roese 				VALIDATE_ACTIVE(tm->bus_act_mask, bus_id);
127*f1df9364SStefan Roese 				CHECK_STATUS(ddr3_tip_bus_read
128*f1df9364SStefan Roese 					     (dev_num, if_id,
129*f1df9364SStefan Roese 					      ACCESS_TYPE_UNICAST, bus_id,
130*f1df9364SStefan Roese 					      DDR_PHY_DATA, reg_addr,
131*f1df9364SStefan Roese 					      &data_value));
132*f1df9364SStefan Roese 				printf("0x%x ", data_value);
133*f1df9364SStefan Roese 			}
134*f1df9364SStefan Roese 			for (bus_id = 0;
135*f1df9364SStefan Roese 			     bus_id < tm->num_of_bus_per_interface;
136*f1df9364SStefan Roese 			     bus_id++) {
137*f1df9364SStefan Roese 				VALIDATE_ACTIVE(tm->bus_act_mask, bus_id);
138*f1df9364SStefan Roese 				CHECK_STATUS(ddr3_tip_bus_read
139*f1df9364SStefan Roese 					     (dev_num, if_id,
140*f1df9364SStefan Roese 					      ACCESS_TYPE_UNICAST, bus_id,
141*f1df9364SStefan Roese 					      DDR_PHY_CONTROL, reg_addr,
142*f1df9364SStefan Roese 					      &data_value));
143*f1df9364SStefan Roese 				printf("0x%x ", data_value);
144*f1df9364SStefan Roese 			}
145*f1df9364SStefan Roese 		}
146*f1df9364SStefan Roese 		printf("\n");
147*f1df9364SStefan Roese 	}
148*f1df9364SStefan Roese 
149*f1df9364SStefan Roese 	return MV_OK;
150*f1df9364SStefan Roese }
151*f1df9364SStefan Roese 
152*f1df9364SStefan Roese /*
153*f1df9364SStefan Roese  * Register access func registration
154*f1df9364SStefan Roese  */
ddr3_tip_init_config_func(u32 dev_num,struct hws_tip_config_func_db * config_func)155*f1df9364SStefan Roese int ddr3_tip_init_config_func(u32 dev_num,
156*f1df9364SStefan Roese 			      struct hws_tip_config_func_db *config_func)
157*f1df9364SStefan Roese {
158*f1df9364SStefan Roese 	if (config_func == NULL)
159*f1df9364SStefan Roese 		return MV_BAD_PARAM;
160*f1df9364SStefan Roese 
161*f1df9364SStefan Roese 	memcpy(&config_func_info[dev_num], config_func,
162*f1df9364SStefan Roese 	       sizeof(struct hws_tip_config_func_db));
163*f1df9364SStefan Roese 
164*f1df9364SStefan Roese 	return MV_OK;
165*f1df9364SStefan Roese }
166*f1df9364SStefan Roese 
167*f1df9364SStefan Roese /*
168*f1df9364SStefan Roese  * Get training result info pointer
169*f1df9364SStefan Roese  */
ddr3_tip_get_result_ptr(u32 stage)170*f1df9364SStefan Roese enum hws_result *ddr3_tip_get_result_ptr(u32 stage)
171*f1df9364SStefan Roese {
172*f1df9364SStefan Roese 	return training_result[stage];
173*f1df9364SStefan Roese }
174*f1df9364SStefan Roese 
175*f1df9364SStefan Roese /*
176*f1df9364SStefan Roese  * Device info read
177*f1df9364SStefan Roese  */
ddr3_tip_get_device_info(u32 dev_num,struct ddr3_device_info * info_ptr)178*f1df9364SStefan Roese int ddr3_tip_get_device_info(u32 dev_num, struct ddr3_device_info *info_ptr)
179*f1df9364SStefan Roese {
180*f1df9364SStefan Roese 	if (config_func_info[dev_num].tip_get_device_info_func != NULL) {
181*f1df9364SStefan Roese 		return config_func_info[dev_num].
182*f1df9364SStefan Roese 			tip_get_device_info_func((u8) dev_num, info_ptr);
183*f1df9364SStefan Roese 	}
184*f1df9364SStefan Roese 
185*f1df9364SStefan Roese 	return MV_FAIL;
186*f1df9364SStefan Roese }
187*f1df9364SStefan Roese 
188*f1df9364SStefan Roese #ifndef EXCLUDE_SWITCH_DEBUG
189*f1df9364SStefan Roese /*
190*f1df9364SStefan Roese  * Convert freq to character string
191*f1df9364SStefan Roese  */
convert_freq(enum hws_ddr_freq freq)192*f1df9364SStefan Roese static char *convert_freq(enum hws_ddr_freq freq)
193*f1df9364SStefan Roese {
194*f1df9364SStefan Roese 	switch (freq) {
195*f1df9364SStefan Roese 	case DDR_FREQ_LOW_FREQ:
196*f1df9364SStefan Roese 		return "DDR_FREQ_LOW_FREQ";
197*f1df9364SStefan Roese 	case DDR_FREQ_400:
198*f1df9364SStefan Roese 		return "400";
199*f1df9364SStefan Roese 
200*f1df9364SStefan Roese 	case DDR_FREQ_533:
201*f1df9364SStefan Roese 		return "533";
202*f1df9364SStefan Roese 	case DDR_FREQ_667:
203*f1df9364SStefan Roese 		return "667";
204*f1df9364SStefan Roese 
205*f1df9364SStefan Roese 	case DDR_FREQ_800:
206*f1df9364SStefan Roese 		return "800";
207*f1df9364SStefan Roese 
208*f1df9364SStefan Roese 	case DDR_FREQ_933:
209*f1df9364SStefan Roese 		return "933";
210*f1df9364SStefan Roese 
211*f1df9364SStefan Roese 	case DDR_FREQ_1066:
212*f1df9364SStefan Roese 		return "1066";
213*f1df9364SStefan Roese 	case DDR_FREQ_311:
214*f1df9364SStefan Roese 		return "311";
215*f1df9364SStefan Roese 
216*f1df9364SStefan Roese 	case DDR_FREQ_333:
217*f1df9364SStefan Roese 		return "333";
218*f1df9364SStefan Roese 
219*f1df9364SStefan Roese 	case DDR_FREQ_467:
220*f1df9364SStefan Roese 		return "467";
221*f1df9364SStefan Roese 
222*f1df9364SStefan Roese 	case DDR_FREQ_850:
223*f1df9364SStefan Roese 		return "850";
224*f1df9364SStefan Roese 
225*f1df9364SStefan Roese 	case DDR_FREQ_900:
226*f1df9364SStefan Roese 		return "900";
227*f1df9364SStefan Roese 
228*f1df9364SStefan Roese 	case DDR_FREQ_360:
229*f1df9364SStefan Roese 		return "DDR_FREQ_360";
230*f1df9364SStefan Roese 
231*f1df9364SStefan Roese 	case DDR_FREQ_1000:
232*f1df9364SStefan Roese 		return "DDR_FREQ_1000";
233*f1df9364SStefan Roese 	default:
234*f1df9364SStefan Roese 		return "Unknown Frequency";
235*f1df9364SStefan Roese 	}
236*f1df9364SStefan Roese }
237*f1df9364SStefan Roese 
238*f1df9364SStefan Roese /*
239*f1df9364SStefan Roese  * Convert device ID to character string
240*f1df9364SStefan Roese  */
convert_dev_id(u32 dev_id)241*f1df9364SStefan Roese static char *convert_dev_id(u32 dev_id)
242*f1df9364SStefan Roese {
243*f1df9364SStefan Roese 	switch (dev_id) {
244*f1df9364SStefan Roese 	case 0x6800:
245*f1df9364SStefan Roese 		return "A38xx";
246*f1df9364SStefan Roese 	case 0x6900:
247*f1df9364SStefan Roese 		return "A39XX";
248*f1df9364SStefan Roese 	case 0xf400:
249*f1df9364SStefan Roese 		return "AC3";
250*f1df9364SStefan Roese 	case 0xfc00:
251*f1df9364SStefan Roese 		return "BC2";
252*f1df9364SStefan Roese 
253*f1df9364SStefan Roese 	default:
254*f1df9364SStefan Roese 		return "Unknown Device";
255*f1df9364SStefan Roese 	}
256*f1df9364SStefan Roese }
257*f1df9364SStefan Roese 
258*f1df9364SStefan Roese /*
259*f1df9364SStefan Roese  * Convert device ID to character string
260*f1df9364SStefan Roese  */
convert_mem_size(u32 dev_id)261*f1df9364SStefan Roese static char *convert_mem_size(u32 dev_id)
262*f1df9364SStefan Roese {
263*f1df9364SStefan Roese 	switch (dev_id) {
264*f1df9364SStefan Roese 	case 0:
265*f1df9364SStefan Roese 		return "512 MB";
266*f1df9364SStefan Roese 	case 1:
267*f1df9364SStefan Roese 		return "1 GB";
268*f1df9364SStefan Roese 	case 2:
269*f1df9364SStefan Roese 		return "2 GB";
270*f1df9364SStefan Roese 	case 3:
271*f1df9364SStefan Roese 		return "4 GB";
272*f1df9364SStefan Roese 	case 4:
273*f1df9364SStefan Roese 		return "8 GB";
274*f1df9364SStefan Roese 
275*f1df9364SStefan Roese 	default:
276*f1df9364SStefan Roese 		return "wrong mem size";
277*f1df9364SStefan Roese 	}
278*f1df9364SStefan Roese }
279*f1df9364SStefan Roese 
print_device_info(u8 dev_num)280*f1df9364SStefan Roese int print_device_info(u8 dev_num)
281*f1df9364SStefan Roese {
282*f1df9364SStefan Roese 	struct ddr3_device_info info_ptr;
283*f1df9364SStefan Roese 	struct hws_topology_map *tm = ddr3_get_topology_map();
284*f1df9364SStefan Roese 
285*f1df9364SStefan Roese 	CHECK_STATUS(ddr3_tip_get_device_info(dev_num, &info_ptr));
286*f1df9364SStefan Roese 	printf("=== DDR setup START===\n");
287*f1df9364SStefan Roese 	printf("\tDevice ID: %s\n", convert_dev_id(info_ptr.device_id));
288*f1df9364SStefan Roese 	printf("\tDDR3  CK delay: %d\n", info_ptr.ck_delay);
289*f1df9364SStefan Roese 	print_topology(tm);
290*f1df9364SStefan Roese 	printf("=== DDR setup END===\n");
291*f1df9364SStefan Roese 
292*f1df9364SStefan Roese 	return MV_OK;
293*f1df9364SStefan Roese }
294*f1df9364SStefan Roese 
hws_ddr3_tip_sweep_test(int enable)295*f1df9364SStefan Roese void hws_ddr3_tip_sweep_test(int enable)
296*f1df9364SStefan Roese {
297*f1df9364SStefan Roese 	if (enable) {
298*f1df9364SStefan Roese 		is_validate_window_per_if = 1;
299*f1df9364SStefan Roese 		is_validate_window_per_pup = 1;
300*f1df9364SStefan Roese 		debug_training = DEBUG_LEVEL_TRACE;
301*f1df9364SStefan Roese 	} else {
302*f1df9364SStefan Roese 		is_validate_window_per_if = 0;
303*f1df9364SStefan Roese 		is_validate_window_per_pup = 0;
304*f1df9364SStefan Roese 	}
305*f1df9364SStefan Roese }
306*f1df9364SStefan Roese #endif
307*f1df9364SStefan Roese 
ddr3_tip_convert_tune_result(enum hws_result tune_result)308*f1df9364SStefan Roese char *ddr3_tip_convert_tune_result(enum hws_result tune_result)
309*f1df9364SStefan Roese {
310*f1df9364SStefan Roese 	switch (tune_result) {
311*f1df9364SStefan Roese 	case TEST_FAILED:
312*f1df9364SStefan Roese 		return "FAILED";
313*f1df9364SStefan Roese 	case TEST_SUCCESS:
314*f1df9364SStefan Roese 		return "PASS";
315*f1df9364SStefan Roese 	case NO_TEST_DONE:
316*f1df9364SStefan Roese 		return "NOT COMPLETED";
317*f1df9364SStefan Roese 	default:
318*f1df9364SStefan Roese 		return "Un-KNOWN";
319*f1df9364SStefan Roese 	}
320*f1df9364SStefan Roese }
321*f1df9364SStefan Roese 
322*f1df9364SStefan Roese /*
323*f1df9364SStefan Roese  * Print log info
324*f1df9364SStefan Roese  */
ddr3_tip_print_log(u32 dev_num,u32 mem_addr)325*f1df9364SStefan Roese int ddr3_tip_print_log(u32 dev_num, u32 mem_addr)
326*f1df9364SStefan Roese {
327*f1df9364SStefan Roese 	u32 if_id = 0;
328*f1df9364SStefan Roese 	struct hws_topology_map *tm = ddr3_get_topology_map();
329*f1df9364SStefan Roese 
330*f1df9364SStefan Roese #ifndef EXCLUDE_SWITCH_DEBUG
331*f1df9364SStefan Roese 	if ((is_validate_window_per_if != 0) ||
332*f1df9364SStefan Roese 	    (is_validate_window_per_pup != 0)) {
333*f1df9364SStefan Roese 		u32 is_pup_log = 0;
334*f1df9364SStefan Roese 		enum hws_ddr_freq freq;
335*f1df9364SStefan Roese 
336*f1df9364SStefan Roese 		freq = tm->interface_params[first_active_if].memory_freq;
337*f1df9364SStefan Roese 
338*f1df9364SStefan Roese 		is_pup_log = (is_validate_window_per_pup != 0) ? 1 : 0;
339*f1df9364SStefan Roese 		printf("===VALIDATE WINDOW LOG START===\n");
340*f1df9364SStefan Roese 		printf("DDR Frequency: %s   ======\n", convert_freq(freq));
341*f1df9364SStefan Roese 		/* print sweep windows */
342*f1df9364SStefan Roese 		ddr3_tip_run_sweep_test(dev_num, sweep_cnt, 1, is_pup_log);
343*f1df9364SStefan Roese 		ddr3_tip_run_sweep_test(dev_num, sweep_cnt, 0, is_pup_log);
344*f1df9364SStefan Roese 		ddr3_tip_print_all_pbs_result(dev_num);
345*f1df9364SStefan Roese 		ddr3_tip_print_wl_supp_result(dev_num);
346*f1df9364SStefan Roese 		printf("===VALIDATE WINDOW LOG END ===\n");
347*f1df9364SStefan Roese 		CHECK_STATUS(ddr3_tip_restore_dunit_regs(dev_num));
348*f1df9364SStefan Roese 		ddr3_tip_reg_dump(dev_num);
349*f1df9364SStefan Roese 	}
350*f1df9364SStefan Roese #endif
351*f1df9364SStefan Roese 
352*f1df9364SStefan Roese 	for (if_id = 0; if_id <= MAX_INTERFACE_NUM - 1; if_id++) {
353*f1df9364SStefan Roese 		VALIDATE_ACTIVE(tm->if_act_mask, if_id);
354*f1df9364SStefan Roese 
355*f1df9364SStefan Roese 		DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO,
356*f1df9364SStefan Roese 				  ("IF %d Status:\n", if_id));
357*f1df9364SStefan Roese 
358*f1df9364SStefan Roese 		if (mask_tune_func & INIT_CONTROLLER_MASK_BIT) {
359*f1df9364SStefan Roese 			DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO,
360*f1df9364SStefan Roese 					  ("\tInit Controller: %s\n",
361*f1df9364SStefan Roese 					   ddr3_tip_convert_tune_result
362*f1df9364SStefan Roese 					   (training_result[INIT_CONTROLLER]
363*f1df9364SStefan Roese 					    [if_id])));
364*f1df9364SStefan Roese 		}
365*f1df9364SStefan Roese 		if (mask_tune_func & SET_LOW_FREQ_MASK_BIT) {
366*f1df9364SStefan Roese 			DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO,
367*f1df9364SStefan Roese 					  ("\tLow freq Config: %s\n",
368*f1df9364SStefan Roese 					   ddr3_tip_convert_tune_result
369*f1df9364SStefan Roese 					   (training_result[SET_LOW_FREQ]
370*f1df9364SStefan Roese 					    [if_id])));
371*f1df9364SStefan Roese 		}
372*f1df9364SStefan Roese 		if (mask_tune_func & LOAD_PATTERN_MASK_BIT) {
373*f1df9364SStefan Roese 			DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO,
374*f1df9364SStefan Roese 					  ("\tLoad Pattern: %s\n",
375*f1df9364SStefan Roese 					   ddr3_tip_convert_tune_result
376*f1df9364SStefan Roese 					   (training_result[LOAD_PATTERN]
377*f1df9364SStefan Roese 					    [if_id])));
378*f1df9364SStefan Roese 		}
379*f1df9364SStefan Roese 		if (mask_tune_func & SET_MEDIUM_FREQ_MASK_BIT) {
380*f1df9364SStefan Roese 			DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO,
381*f1df9364SStefan Roese 					  ("\tMedium freq Config: %s\n",
382*f1df9364SStefan Roese 					   ddr3_tip_convert_tune_result
383*f1df9364SStefan Roese 					   (training_result[SET_MEDIUM_FREQ]
384*f1df9364SStefan Roese 					    [if_id])));
385*f1df9364SStefan Roese 		}
386*f1df9364SStefan Roese 		if (mask_tune_func & WRITE_LEVELING_MASK_BIT) {
387*f1df9364SStefan Roese 			DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO,
388*f1df9364SStefan Roese 					  ("\tWL: %s\n",
389*f1df9364SStefan Roese 					   ddr3_tip_convert_tune_result
390*f1df9364SStefan Roese 					   (training_result[WRITE_LEVELING]
391*f1df9364SStefan Roese 					    [if_id])));
392*f1df9364SStefan Roese 		}
393*f1df9364SStefan Roese 		if (mask_tune_func & LOAD_PATTERN_2_MASK_BIT) {
394*f1df9364SStefan Roese 			DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO,
395*f1df9364SStefan Roese 					  ("\tLoad Pattern: %s\n",
396*f1df9364SStefan Roese 					   ddr3_tip_convert_tune_result
397*f1df9364SStefan Roese 					   (training_result[LOAD_PATTERN_2]
398*f1df9364SStefan Roese 					    [if_id])));
399*f1df9364SStefan Roese 		}
400*f1df9364SStefan Roese 		if (mask_tune_func & READ_LEVELING_MASK_BIT) {
401*f1df9364SStefan Roese 			DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO,
402*f1df9364SStefan Roese 					  ("\tRL: %s\n",
403*f1df9364SStefan Roese 					   ddr3_tip_convert_tune_result
404*f1df9364SStefan Roese 					   (training_result[READ_LEVELING]
405*f1df9364SStefan Roese 					    [if_id])));
406*f1df9364SStefan Roese 		}
407*f1df9364SStefan Roese 		if (mask_tune_func & WRITE_LEVELING_SUPP_MASK_BIT) {
408*f1df9364SStefan Roese 			DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO,
409*f1df9364SStefan Roese 					  ("\tWL Supp: %s\n",
410*f1df9364SStefan Roese 					   ddr3_tip_convert_tune_result
411*f1df9364SStefan Roese 					   (training_result[WRITE_LEVELING_SUPP]
412*f1df9364SStefan Roese 					    [if_id])));
413*f1df9364SStefan Roese 		}
414*f1df9364SStefan Roese 		if (mask_tune_func & PBS_RX_MASK_BIT) {
415*f1df9364SStefan Roese 			DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO,
416*f1df9364SStefan Roese 					  ("\tPBS RX: %s\n",
417*f1df9364SStefan Roese 					   ddr3_tip_convert_tune_result
418*f1df9364SStefan Roese 					   (training_result[PBS_RX]
419*f1df9364SStefan Roese 					    [if_id])));
420*f1df9364SStefan Roese 		}
421*f1df9364SStefan Roese 		if (mask_tune_func & PBS_TX_MASK_BIT) {
422*f1df9364SStefan Roese 			DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO,
423*f1df9364SStefan Roese 					  ("\tPBS TX: %s\n",
424*f1df9364SStefan Roese 					   ddr3_tip_convert_tune_result
425*f1df9364SStefan Roese 					   (training_result[PBS_TX]
426*f1df9364SStefan Roese 					    [if_id])));
427*f1df9364SStefan Roese 		}
428*f1df9364SStefan Roese 		if (mask_tune_func & SET_TARGET_FREQ_MASK_BIT) {
429*f1df9364SStefan Roese 			DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO,
430*f1df9364SStefan Roese 					  ("\tTarget freq Config: %s\n",
431*f1df9364SStefan Roese 					   ddr3_tip_convert_tune_result
432*f1df9364SStefan Roese 					   (training_result[SET_TARGET_FREQ]
433*f1df9364SStefan Roese 					    [if_id])));
434*f1df9364SStefan Roese 		}
435*f1df9364SStefan Roese 		if (mask_tune_func & WRITE_LEVELING_TF_MASK_BIT) {
436*f1df9364SStefan Roese 			DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO,
437*f1df9364SStefan Roese 					  ("\tWL TF: %s\n",
438*f1df9364SStefan Roese 					   ddr3_tip_convert_tune_result
439*f1df9364SStefan Roese 					   (training_result[WRITE_LEVELING_TF]
440*f1df9364SStefan Roese 					    [if_id])));
441*f1df9364SStefan Roese 		}
442*f1df9364SStefan Roese 		if (mask_tune_func & READ_LEVELING_TF_MASK_BIT) {
443*f1df9364SStefan Roese 			DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO,
444*f1df9364SStefan Roese 					  ("\tRL TF: %s\n",
445*f1df9364SStefan Roese 					   ddr3_tip_convert_tune_result
446*f1df9364SStefan Roese 					   (training_result[READ_LEVELING_TF]
447*f1df9364SStefan Roese 					    [if_id])));
448*f1df9364SStefan Roese 		}
449*f1df9364SStefan Roese 		if (mask_tune_func & WRITE_LEVELING_SUPP_TF_MASK_BIT) {
450*f1df9364SStefan Roese 			DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO,
451*f1df9364SStefan Roese 					  ("\tWL TF Supp: %s\n",
452*f1df9364SStefan Roese 					   ddr3_tip_convert_tune_result
453*f1df9364SStefan Roese 					   (training_result
454*f1df9364SStefan Roese 					    [WRITE_LEVELING_SUPP_TF]
455*f1df9364SStefan Roese 					    [if_id])));
456*f1df9364SStefan Roese 		}
457*f1df9364SStefan Roese 		if (mask_tune_func & CENTRALIZATION_RX_MASK_BIT) {
458*f1df9364SStefan Roese 			DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO,
459*f1df9364SStefan Roese 					  ("\tCentr RX: %s\n",
460*f1df9364SStefan Roese 					   ddr3_tip_convert_tune_result
461*f1df9364SStefan Roese 					   (training_result[CENTRALIZATION_RX]
462*f1df9364SStefan Roese 					    [if_id])));
463*f1df9364SStefan Roese 		}
464*f1df9364SStefan Roese 		if (mask_tune_func & VREF_CALIBRATION_MASK_BIT) {
465*f1df9364SStefan Roese 			DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO,
466*f1df9364SStefan Roese 					  ("\tVREF_CALIBRATION: %s\n",
467*f1df9364SStefan Roese 					   ddr3_tip_convert_tune_result
468*f1df9364SStefan Roese 					   (training_result[VREF_CALIBRATION]
469*f1df9364SStefan Roese 					    [if_id])));
470*f1df9364SStefan Roese 		}
471*f1df9364SStefan Roese 		if (mask_tune_func & CENTRALIZATION_TX_MASK_BIT) {
472*f1df9364SStefan Roese 			DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO,
473*f1df9364SStefan Roese 					  ("\tCentr TX: %s\n",
474*f1df9364SStefan Roese 					   ddr3_tip_convert_tune_result
475*f1df9364SStefan Roese 					   (training_result[CENTRALIZATION_TX]
476*f1df9364SStefan Roese 					    [if_id])));
477*f1df9364SStefan Roese 		}
478*f1df9364SStefan Roese 	}
479*f1df9364SStefan Roese 
480*f1df9364SStefan Roese 	return MV_OK;
481*f1df9364SStefan Roese }
482*f1df9364SStefan Roese 
483*f1df9364SStefan Roese /*
484*f1df9364SStefan Roese  * Print stability log info
485*f1df9364SStefan Roese  */
ddr3_tip_print_stability_log(u32 dev_num)486*f1df9364SStefan Roese int ddr3_tip_print_stability_log(u32 dev_num)
487*f1df9364SStefan Roese {
488*f1df9364SStefan Roese 	u8 if_id = 0, csindex = 0, bus_id = 0, idx = 0;
489*f1df9364SStefan Roese 	u32 reg_data;
490*f1df9364SStefan Roese 	u32 read_data[MAX_INTERFACE_NUM];
491*f1df9364SStefan Roese 	u32 max_cs = hws_ddr3_tip_max_cs_get();
492*f1df9364SStefan Roese 	struct hws_topology_map *tm = ddr3_get_topology_map();
493*f1df9364SStefan Roese 
494*f1df9364SStefan Roese 	/* Title print */
495*f1df9364SStefan Roese 	for (if_id = 0; if_id < MAX_INTERFACE_NUM; if_id++) {
496*f1df9364SStefan Roese 		VALIDATE_ACTIVE(tm->if_act_mask, if_id);
497*f1df9364SStefan Roese 		printf("Title: I/F# , Tj, Calibration_n0, Calibration_p0, Calibration_n1, Calibration_p1, Calibration_n2, Calibration_p2,");
498*f1df9364SStefan Roese 		for (csindex = 0; csindex < max_cs; csindex++) {
499*f1df9364SStefan Roese 			printf("CS%d , ", csindex);
500*f1df9364SStefan Roese 			printf("\n");
501*f1df9364SStefan Roese 			VALIDATE_ACTIVE(tm->bus_act_mask, bus_id);
502*f1df9364SStefan Roese 			printf("VWTx, VWRx, WL_tot, WL_ADLL, WL_PH, RL_Tot, RL_ADLL, RL_PH, RL_Smp, Cen_tx, Cen_rx, Vref, DQVref,");
503*f1df9364SStefan Roese 			printf("\t\t");
504*f1df9364SStefan Roese 			for (idx = 0; idx < 11; idx++)
505*f1df9364SStefan Roese 				printf("PBSTx-Pad%d,", idx);
506*f1df9364SStefan Roese 			printf("\t\t");
507*f1df9364SStefan Roese 			for (idx = 0; idx < 11; idx++)
508*f1df9364SStefan Roese 				printf("PBSRx-Pad%d,", idx);
509*f1df9364SStefan Roese 		}
510*f1df9364SStefan Roese 	}
511*f1df9364SStefan Roese 	printf("\n");
512*f1df9364SStefan Roese 
513*f1df9364SStefan Roese 	/* Data print */
514*f1df9364SStefan Roese 	for (if_id = 0; if_id < MAX_INTERFACE_NUM; if_id++) {
515*f1df9364SStefan Roese 		VALIDATE_ACTIVE(tm->if_act_mask, if_id);
516*f1df9364SStefan Roese 
517*f1df9364SStefan Roese 		printf("Data: %d,%d,", if_id,
518*f1df9364SStefan Roese 		       (config_func_info[dev_num].tip_get_temperature != NULL)
519*f1df9364SStefan Roese 		       ? (config_func_info[dev_num].
520*f1df9364SStefan Roese 			  tip_get_temperature(dev_num)) : (0));
521*f1df9364SStefan Roese 
522*f1df9364SStefan Roese 		CHECK_STATUS(ddr3_tip_if_read
523*f1df9364SStefan Roese 			     (dev_num, ACCESS_TYPE_UNICAST, if_id, 0x14c8,
524*f1df9364SStefan Roese 			      read_data, MASK_ALL_BITS));
525*f1df9364SStefan Roese 		printf("%d,%d,", ((read_data[if_id] & 0x3f0) >> 4),
526*f1df9364SStefan Roese 		       ((read_data[if_id] & 0xfc00) >> 10));
527*f1df9364SStefan Roese 		CHECK_STATUS(ddr3_tip_if_read
528*f1df9364SStefan Roese 			     (dev_num, ACCESS_TYPE_UNICAST, if_id, 0x17c8,
529*f1df9364SStefan Roese 			      read_data, MASK_ALL_BITS));
530*f1df9364SStefan Roese 		printf("%d,%d,", ((read_data[if_id] & 0x3f0) >> 4),
531*f1df9364SStefan Roese 		       ((read_data[if_id] & 0xfc00) >> 10));
532*f1df9364SStefan Roese 		CHECK_STATUS(ddr3_tip_if_read
533*f1df9364SStefan Roese 			     (dev_num, ACCESS_TYPE_UNICAST, if_id, 0x1dc8,
534*f1df9364SStefan Roese 			      read_data, MASK_ALL_BITS));
535*f1df9364SStefan Roese 		printf("%d,%d,", ((read_data[if_id] & 0x3f0000) >> 16),
536*f1df9364SStefan Roese 		       ((read_data[if_id] & 0xfc00000) >> 22));
537*f1df9364SStefan Roese 
538*f1df9364SStefan Roese 		for (csindex = 0; csindex < max_cs; csindex++) {
539*f1df9364SStefan Roese 			printf("CS%d , ", csindex);
540*f1df9364SStefan Roese 			for (bus_id = 0; bus_id < MAX_BUS_NUM; bus_id++) {
541*f1df9364SStefan Roese 				printf("\n");
542*f1df9364SStefan Roese 				VALIDATE_ACTIVE(tm->bus_act_mask, bus_id);
543*f1df9364SStefan Roese 				ddr3_tip_bus_read(dev_num, if_id,
544*f1df9364SStefan Roese 						  ACCESS_TYPE_UNICAST,
545*f1df9364SStefan Roese 						  bus_id, DDR_PHY_DATA,
546*f1df9364SStefan Roese 						  RESULT_DB_PHY_REG_ADDR +
547*f1df9364SStefan Roese 						  csindex, &reg_data);
548*f1df9364SStefan Roese 				printf("%d,%d,", (reg_data & 0x1f),
549*f1df9364SStefan Roese 				       ((reg_data & 0x3e0) >> 5));
550*f1df9364SStefan Roese 				/* WL */
551*f1df9364SStefan Roese 				ddr3_tip_bus_read(dev_num, if_id,
552*f1df9364SStefan Roese 						  ACCESS_TYPE_UNICAST,
553*f1df9364SStefan Roese 						  bus_id, DDR_PHY_DATA,
554*f1df9364SStefan Roese 						  WL_PHY_REG +
555*f1df9364SStefan Roese 						  csindex * 4, &reg_data);
556*f1df9364SStefan Roese 				printf("%d,%d,%d,",
557*f1df9364SStefan Roese 				       (reg_data & 0x1f) +
558*f1df9364SStefan Roese 				       ((reg_data & 0x1c0) >> 6) * 32,
559*f1df9364SStefan Roese 				       (reg_data & 0x1f),
560*f1df9364SStefan Roese 				       (reg_data & 0x1c0) >> 6);
561*f1df9364SStefan Roese 				/* RL */
562*f1df9364SStefan Roese 				CHECK_STATUS(ddr3_tip_if_read
563*f1df9364SStefan Roese 					     (dev_num, ACCESS_TYPE_UNICAST,
564*f1df9364SStefan Roese 					      if_id,
565*f1df9364SStefan Roese 					      READ_DATA_SAMPLE_DELAY,
566*f1df9364SStefan Roese 					      read_data, MASK_ALL_BITS));
567*f1df9364SStefan Roese 				read_data[if_id] =
568*f1df9364SStefan Roese 					(read_data[if_id] &
569*f1df9364SStefan Roese 					 (0xf << (4 * csindex))) >>
570*f1df9364SStefan Roese 					(4 * csindex);
571*f1df9364SStefan Roese 				ddr3_tip_bus_read(dev_num, if_id,
572*f1df9364SStefan Roese 						  ACCESS_TYPE_UNICAST, bus_id,
573*f1df9364SStefan Roese 						  DDR_PHY_DATA,
574*f1df9364SStefan Roese 						  RL_PHY_REG + csindex * 4,
575*f1df9364SStefan Roese 						  &reg_data);
576*f1df9364SStefan Roese 				printf("%d,%d,%d,%d,",
577*f1df9364SStefan Roese 				       (reg_data & 0x1f) +
578*f1df9364SStefan Roese 				       ((reg_data & 0x1c0) >> 6) * 32 +
579*f1df9364SStefan Roese 				       read_data[if_id] * 64,
580*f1df9364SStefan Roese 				       (reg_data & 0x1f),
581*f1df9364SStefan Roese 				       ((reg_data & 0x1c0) >> 6),
582*f1df9364SStefan Roese 				       read_data[if_id]);
583*f1df9364SStefan Roese 				/* Centralization */
584*f1df9364SStefan Roese 				ddr3_tip_bus_read(dev_num, if_id,
585*f1df9364SStefan Roese 						  ACCESS_TYPE_UNICAST, bus_id,
586*f1df9364SStefan Roese 						  DDR_PHY_DATA,
587*f1df9364SStefan Roese 						  WRITE_CENTRALIZATION_PHY_REG
588*f1df9364SStefan Roese 						  + csindex * 4, &reg_data);
589*f1df9364SStefan Roese 				printf("%d,", (reg_data & 0x3f));
590*f1df9364SStefan Roese 				ddr3_tip_bus_read(dev_num, if_id,
591*f1df9364SStefan Roese 						  ACCESS_TYPE_UNICAST, bus_id,
592*f1df9364SStefan Roese 						  DDR_PHY_DATA,
593*f1df9364SStefan Roese 						  READ_CENTRALIZATION_PHY_REG
594*f1df9364SStefan Roese 						  + csindex * 4, &reg_data);
595*f1df9364SStefan Roese 				printf("%d,", (reg_data & 0x1f));
596*f1df9364SStefan Roese 				/* Vref */
597*f1df9364SStefan Roese 				ddr3_tip_bus_read(dev_num, if_id,
598*f1df9364SStefan Roese 						  ACCESS_TYPE_UNICAST, bus_id,
599*f1df9364SStefan Roese 						  DDR_PHY_DATA,
600*f1df9364SStefan Roese 						  PAD_CONFIG_PHY_REG,
601*f1df9364SStefan Roese 						  &reg_data);
602*f1df9364SStefan Roese 				printf("%d,", (reg_data & 0x7));
603*f1df9364SStefan Roese 				/* DQVref */
604*f1df9364SStefan Roese 				/* Need to add the Read Function from device */
605*f1df9364SStefan Roese 				printf("%d,", 0);
606*f1df9364SStefan Roese 				printf("\t\t");
607*f1df9364SStefan Roese 				for (idx = 0; idx < 11; idx++) {
608*f1df9364SStefan Roese 					ddr3_tip_bus_read(dev_num, if_id,
609*f1df9364SStefan Roese 							  ACCESS_TYPE_UNICAST,
610*f1df9364SStefan Roese 							  bus_id, DDR_PHY_DATA,
611*f1df9364SStefan Roese 							  0xd0 +
612*f1df9364SStefan Roese 							  12 * csindex +
613*f1df9364SStefan Roese 							  idx, &reg_data);
614*f1df9364SStefan Roese 					printf("%d,", (reg_data & 0x3f));
615*f1df9364SStefan Roese 				}
616*f1df9364SStefan Roese 				printf("\t\t");
617*f1df9364SStefan Roese 				for (idx = 0; idx < 11; idx++) {
618*f1df9364SStefan Roese 					ddr3_tip_bus_read(dev_num, if_id,
619*f1df9364SStefan Roese 							  ACCESS_TYPE_UNICAST,
620*f1df9364SStefan Roese 							  bus_id, DDR_PHY_DATA,
621*f1df9364SStefan Roese 							  0x10 +
622*f1df9364SStefan Roese 							  16 * csindex +
623*f1df9364SStefan Roese 							  idx, &reg_data);
624*f1df9364SStefan Roese 					printf("%d,", (reg_data & 0x3f));
625*f1df9364SStefan Roese 				}
626*f1df9364SStefan Roese 				printf("\t\t");
627*f1df9364SStefan Roese 				for (idx = 0; idx < 11; idx++) {
628*f1df9364SStefan Roese 					ddr3_tip_bus_read(dev_num, if_id,
629*f1df9364SStefan Roese 							  ACCESS_TYPE_UNICAST,
630*f1df9364SStefan Roese 							  bus_id, DDR_PHY_DATA,
631*f1df9364SStefan Roese 							  0x50 +
632*f1df9364SStefan Roese 							  16 * csindex +
633*f1df9364SStefan Roese 							  idx, &reg_data);
634*f1df9364SStefan Roese 					printf("%d,", (reg_data & 0x3f));
635*f1df9364SStefan Roese 				}
636*f1df9364SStefan Roese 			}
637*f1df9364SStefan Roese 		}
638*f1df9364SStefan Roese 	}
639*f1df9364SStefan Roese 	printf("\n");
640*f1df9364SStefan Roese 
641*f1df9364SStefan Roese 	return MV_OK;
642*f1df9364SStefan Roese }
643*f1df9364SStefan Roese 
644*f1df9364SStefan Roese /*
645*f1df9364SStefan Roese  * Register XSB information
646*f1df9364SStefan Roese  */
ddr3_tip_register_xsb_info(u32 dev_num,struct hws_xsb_info * xsb_info_table)647*f1df9364SStefan Roese int ddr3_tip_register_xsb_info(u32 dev_num, struct hws_xsb_info *xsb_info_table)
648*f1df9364SStefan Roese {
649*f1df9364SStefan Roese 	memcpy(&xsb_info[dev_num], xsb_info_table, sizeof(struct hws_xsb_info));
650*f1df9364SStefan Roese 	return MV_OK;
651*f1df9364SStefan Roese }
652*f1df9364SStefan Roese 
653*f1df9364SStefan Roese /*
654*f1df9364SStefan Roese  * Read ADLL Value
655*f1df9364SStefan Roese  */
read_adll_value(u32 pup_values[MAX_INTERFACE_NUM * MAX_BUS_NUM],int reg_addr,u32 mask)656*f1df9364SStefan Roese int read_adll_value(u32 pup_values[MAX_INTERFACE_NUM * MAX_BUS_NUM],
657*f1df9364SStefan Roese 		    int reg_addr, u32 mask)
658*f1df9364SStefan Roese {
659*f1df9364SStefan Roese 	u32 data_value;
660*f1df9364SStefan Roese 	u32 if_id = 0, bus_id = 0;
661*f1df9364SStefan Roese 	u32 dev_num = 0;
662*f1df9364SStefan Roese 	struct hws_topology_map *tm = ddr3_get_topology_map();
663*f1df9364SStefan Roese 
664*f1df9364SStefan Roese 	/*
665*f1df9364SStefan Roese 	 * multi CS support - reg_addr is calucalated in calling function
666*f1df9364SStefan Roese 	 * with CS offset
667*f1df9364SStefan Roese 	 */
668*f1df9364SStefan Roese 	for (if_id = 0; if_id <= MAX_INTERFACE_NUM - 1; if_id++) {
669*f1df9364SStefan Roese 		VALIDATE_ACTIVE(tm->if_act_mask, if_id);
670*f1df9364SStefan Roese 		for (bus_id = 0; bus_id < tm->num_of_bus_per_interface;
671*f1df9364SStefan Roese 		     bus_id++) {
672*f1df9364SStefan Roese 			VALIDATE_ACTIVE(tm->bus_act_mask, bus_id);
673*f1df9364SStefan Roese 			CHECK_STATUS(ddr3_tip_bus_read(dev_num, if_id,
674*f1df9364SStefan Roese 						       ACCESS_TYPE_UNICAST,
675*f1df9364SStefan Roese 						       bus_id,
676*f1df9364SStefan Roese 						       DDR_PHY_DATA, reg_addr,
677*f1df9364SStefan Roese 						       &data_value));
678*f1df9364SStefan Roese 			pup_values[if_id *
679*f1df9364SStefan Roese 				   tm->num_of_bus_per_interface + bus_id] =
680*f1df9364SStefan Roese 				data_value & mask;
681*f1df9364SStefan Roese 		}
682*f1df9364SStefan Roese 	}
683*f1df9364SStefan Roese 
684*f1df9364SStefan Roese 	return 0;
685*f1df9364SStefan Roese }
686*f1df9364SStefan Roese 
687*f1df9364SStefan Roese /*
688*f1df9364SStefan Roese  * Write ADLL Value
689*f1df9364SStefan Roese  */
write_adll_value(u32 pup_values[MAX_INTERFACE_NUM * MAX_BUS_NUM],int reg_addr)690*f1df9364SStefan Roese int write_adll_value(u32 pup_values[MAX_INTERFACE_NUM * MAX_BUS_NUM],
691*f1df9364SStefan Roese 		     int reg_addr)
692*f1df9364SStefan Roese {
693*f1df9364SStefan Roese 	u32 if_id = 0, bus_id = 0;
694*f1df9364SStefan Roese 	u32 dev_num = 0, data;
695*f1df9364SStefan Roese 	struct hws_topology_map *tm = ddr3_get_topology_map();
696*f1df9364SStefan Roese 
697*f1df9364SStefan Roese 	/*
698*f1df9364SStefan Roese 	 * multi CS support - reg_addr is calucalated in calling function
699*f1df9364SStefan Roese 	 * with CS offset
700*f1df9364SStefan Roese 	 */
701*f1df9364SStefan Roese 	for (if_id = 0; if_id <= MAX_INTERFACE_NUM - 1; if_id++) {
702*f1df9364SStefan Roese 		VALIDATE_ACTIVE(tm->if_act_mask, if_id);
703*f1df9364SStefan Roese 		for (bus_id = 0; bus_id < tm->num_of_bus_per_interface;
704*f1df9364SStefan Roese 		     bus_id++) {
705*f1df9364SStefan Roese 			VALIDATE_ACTIVE(tm->bus_act_mask, bus_id);
706*f1df9364SStefan Roese 			data = pup_values[if_id *
707*f1df9364SStefan Roese 					  tm->num_of_bus_per_interface +
708*f1df9364SStefan Roese 					  bus_id];
709*f1df9364SStefan Roese 			CHECK_STATUS(ddr3_tip_bus_write(dev_num,
710*f1df9364SStefan Roese 							ACCESS_TYPE_UNICAST,
711*f1df9364SStefan Roese 							if_id,
712*f1df9364SStefan Roese 							ACCESS_TYPE_UNICAST,
713*f1df9364SStefan Roese 							bus_id, DDR_PHY_DATA,
714*f1df9364SStefan Roese 							reg_addr, data));
715*f1df9364SStefan Roese 		}
716*f1df9364SStefan Roese 	}
717*f1df9364SStefan Roese 
718*f1df9364SStefan Roese 	return 0;
719*f1df9364SStefan Roese }
720*f1df9364SStefan Roese 
721*f1df9364SStefan Roese #ifndef EXCLUDE_SWITCH_DEBUG
722*f1df9364SStefan Roese u32 rl_version = 1;		/* 0 - old RL machine */
723*f1df9364SStefan Roese struct hws_tip_config_func_db config_func_info[HWS_MAX_DEVICE_NUM];
724*f1df9364SStefan Roese u32 start_xsb_offset = 0;
725*f1df9364SStefan Roese u8 is_rl_old = 0;
726*f1df9364SStefan Roese u8 is_freq_old = 0;
727*f1df9364SStefan Roese u8 is_dfs_disabled = 0;
728*f1df9364SStefan Roese u32 default_centrlization_value = 0x12;
729*f1df9364SStefan Roese u32 vref = 0x4;
730*f1df9364SStefan Roese u32 activate_select_before_run_alg = 1, activate_deselect_after_run_alg = 1,
731*f1df9364SStefan Roese 	rl_test = 0, reset_read_fifo = 0;
732*f1df9364SStefan Roese int debug_acc = 0;
733*f1df9364SStefan Roese u32 ctrl_sweepres[ADLL_LENGTH][MAX_INTERFACE_NUM][MAX_BUS_NUM];
734*f1df9364SStefan Roese u32 ctrl_adll[MAX_CS_NUM * MAX_INTERFACE_NUM * MAX_BUS_NUM];
735*f1df9364SStefan Roese u8 cs_mask_reg[] = {
736*f1df9364SStefan Roese 	0, 4, 8, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
737*f1df9364SStefan Roese };
738*f1df9364SStefan Roese 
739*f1df9364SStefan Roese u32 xsb_test_table[][8] = {
740*f1df9364SStefan Roese 	{0x00000000, 0x11111111, 0x22222222, 0x33333333, 0x44444444, 0x55555555,
741*f1df9364SStefan Roese 	 0x66666666, 0x77777777},
742*f1df9364SStefan Roese 	{0x88888888, 0x99999999, 0xaaaaaaaa, 0xbbbbbbbb, 0xcccccccc, 0xdddddddd,
743*f1df9364SStefan Roese 	 0xeeeeeeee, 0xffffffff},
744*f1df9364SStefan Roese 	{0x00000000, 0xffffffff, 0x00000000, 0xffffffff, 0x00000000, 0xffffffff,
745*f1df9364SStefan Roese 	 0x00000000, 0xffffffff},
746*f1df9364SStefan Roese 	{0x00000000, 0xffffffff, 0x00000000, 0xffffffff, 0x00000000, 0xffffffff,
747*f1df9364SStefan Roese 	 0x00000000, 0xffffffff},
748*f1df9364SStefan Roese 	{0x00000000, 0xffffffff, 0x00000000, 0xffffffff, 0x00000000, 0xffffffff,
749*f1df9364SStefan Roese 	 0x00000000, 0xffffffff},
750*f1df9364SStefan Roese 	{0x00000000, 0xffffffff, 0x00000000, 0xffffffff, 0x00000000, 0xffffffff,
751*f1df9364SStefan Roese 	 0x00000000, 0xffffffff},
752*f1df9364SStefan Roese 	{0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000,
753*f1df9364SStefan Roese 	 0xffffffff, 0xffffffff},
754*f1df9364SStefan Roese 	{0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000,
755*f1df9364SStefan Roese 	 0x00000000, 0x00000000},
756*f1df9364SStefan Roese 	{0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0xffffffff,
757*f1df9364SStefan Roese 	 0xffffffff, 0xffffffff}
758*f1df9364SStefan Roese };
759*f1df9364SStefan Roese 
760*f1df9364SStefan Roese static int ddr3_tip_access_atr(u32 dev_num, u32 flag_id, u32 value, u32 **ptr);
761*f1df9364SStefan Roese 
ddr3_tip_print_adll(void)762*f1df9364SStefan Roese int ddr3_tip_print_adll(void)
763*f1df9364SStefan Roese {
764*f1df9364SStefan Roese 	u32 bus_cnt = 0, if_id, data_p1, data_p2, ui_data3, dev_num = 0;
765*f1df9364SStefan Roese 	struct hws_topology_map *tm = ddr3_get_topology_map();
766*f1df9364SStefan Roese 
767*f1df9364SStefan Roese 	for (if_id = 0; if_id <= MAX_INTERFACE_NUM - 1; if_id++) {
768*f1df9364SStefan Roese 		VALIDATE_ACTIVE(tm->if_act_mask, if_id);
769*f1df9364SStefan Roese 		for (bus_cnt = 0; bus_cnt < GET_TOPOLOGY_NUM_OF_BUSES();
770*f1df9364SStefan Roese 		     bus_cnt++) {
771*f1df9364SStefan Roese 			VALIDATE_ACTIVE(tm->bus_act_mask, bus_cnt);
772*f1df9364SStefan Roese 			CHECK_STATUS(ddr3_tip_bus_read
773*f1df9364SStefan Roese 				     (dev_num, if_id,
774*f1df9364SStefan Roese 				      ACCESS_TYPE_UNICAST, bus_cnt,
775*f1df9364SStefan Roese 				      DDR_PHY_DATA, 0x1, &data_p1));
776*f1df9364SStefan Roese 			CHECK_STATUS(ddr3_tip_bus_read
777*f1df9364SStefan Roese 				     (dev_num, if_id, ACCESS_TYPE_UNICAST,
778*f1df9364SStefan Roese 				      bus_cnt, DDR_PHY_DATA, 0x2, &data_p2));
779*f1df9364SStefan Roese 			CHECK_STATUS(ddr3_tip_bus_read
780*f1df9364SStefan Roese 				     (dev_num, if_id, ACCESS_TYPE_UNICAST,
781*f1df9364SStefan Roese 				      bus_cnt, DDR_PHY_DATA, 0x3, &ui_data3));
782*f1df9364SStefan Roese 			DEBUG_TRAINING_IP(DEBUG_LEVEL_TRACE,
783*f1df9364SStefan Roese 					  (" IF %d bus_cnt %d  phy_reg_1_data 0x%x phy_reg_2_data 0x%x phy_reg_3_data 0x%x\n",
784*f1df9364SStefan Roese 					   if_id, bus_cnt, data_p1, data_p2,
785*f1df9364SStefan Roese 					   ui_data3));
786*f1df9364SStefan Roese 			}
787*f1df9364SStefan Roese 	}
788*f1df9364SStefan Roese 
789*f1df9364SStefan Roese 	return MV_OK;
790*f1df9364SStefan Roese }
791*f1df9364SStefan Roese 
792*f1df9364SStefan Roese /*
793*f1df9364SStefan Roese  * Set attribute value
794*f1df9364SStefan Roese  */
ddr3_tip_set_atr(u32 dev_num,u32 flag_id,u32 value)795*f1df9364SStefan Roese int ddr3_tip_set_atr(u32 dev_num, u32 flag_id, u32 value)
796*f1df9364SStefan Roese {
797*f1df9364SStefan Roese 	int ret;
798*f1df9364SStefan Roese 	u32 *ptr_flag = NULL;
799*f1df9364SStefan Roese 
800*f1df9364SStefan Roese 	ret = ddr3_tip_access_atr(dev_num, flag_id, value, &ptr_flag);
801*f1df9364SStefan Roese 	if (ptr_flag != NULL) {
802*f1df9364SStefan Roese 		printf("ddr3_tip_set_atr Flag ID 0x%x value is set to 0x%x (was 0x%x)\n",
803*f1df9364SStefan Roese 		       flag_id, value, *ptr_flag);
804*f1df9364SStefan Roese 		*ptr_flag = value;
805*f1df9364SStefan Roese 	} else {
806*f1df9364SStefan Roese 		printf("ddr3_tip_set_atr Flag ID 0x%x value is set to 0x%x\n",
807*f1df9364SStefan Roese 		       flag_id, value);
808*f1df9364SStefan Roese 	}
809*f1df9364SStefan Roese 
810*f1df9364SStefan Roese 	return ret;
811*f1df9364SStefan Roese }
812*f1df9364SStefan Roese 
813*f1df9364SStefan Roese /*
814*f1df9364SStefan Roese  * Access attribute
815*f1df9364SStefan Roese  */
ddr3_tip_access_atr(u32 dev_num,u32 flag_id,u32 value,u32 ** ptr)816*f1df9364SStefan Roese static int ddr3_tip_access_atr(u32 dev_num, u32 flag_id, u32 value, u32 **ptr)
817*f1df9364SStefan Roese {
818*f1df9364SStefan Roese 	u32 tmp_val = 0, if_id = 0, pup_id = 0;
819*f1df9364SStefan Roese 	struct hws_topology_map *tm = ddr3_get_topology_map();
820*f1df9364SStefan Roese 
821*f1df9364SStefan Roese 	*ptr = NULL;
822*f1df9364SStefan Roese 
823*f1df9364SStefan Roese 	switch (flag_id) {
824*f1df9364SStefan Roese 	case 0:
825*f1df9364SStefan Roese 		*ptr = (u32 *)&(tm->if_act_mask);
826*f1df9364SStefan Roese 		break;
827*f1df9364SStefan Roese 
828*f1df9364SStefan Roese 	case 0x1:
829*f1df9364SStefan Roese 		*ptr = (u32 *)&mask_tune_func;
830*f1df9364SStefan Roese 		break;
831*f1df9364SStefan Roese 
832*f1df9364SStefan Roese 	case 0x2:
833*f1df9364SStefan Roese 		*ptr = (u32 *)&low_freq;
834*f1df9364SStefan Roese 		break;
835*f1df9364SStefan Roese 
836*f1df9364SStefan Roese 	case 0x3:
837*f1df9364SStefan Roese 		*ptr = (u32 *)&medium_freq;
838*f1df9364SStefan Roese 		break;
839*f1df9364SStefan Roese 
840*f1df9364SStefan Roese 	case 0x4:
841*f1df9364SStefan Roese 		*ptr = (u32 *)&generic_init_controller;
842*f1df9364SStefan Roese 		break;
843*f1df9364SStefan Roese 
844*f1df9364SStefan Roese 	case 0x5:
845*f1df9364SStefan Roese 		*ptr = (u32 *)&rl_version;
846*f1df9364SStefan Roese 		break;
847*f1df9364SStefan Roese 
848*f1df9364SStefan Roese 	case 0x8:
849*f1df9364SStefan Roese 		*ptr = (u32 *)&start_xsb_offset;
850*f1df9364SStefan Roese 		break;
851*f1df9364SStefan Roese 
852*f1df9364SStefan Roese 	case 0x20:
853*f1df9364SStefan Roese 		*ptr = (u32 *)&is_rl_old;
854*f1df9364SStefan Roese 		break;
855*f1df9364SStefan Roese 
856*f1df9364SStefan Roese 	case 0x21:
857*f1df9364SStefan Roese 		*ptr = (u32 *)&is_freq_old;
858*f1df9364SStefan Roese 		break;
859*f1df9364SStefan Roese 
860*f1df9364SStefan Roese 	case 0x23:
861*f1df9364SStefan Roese 		*ptr = (u32 *)&is_dfs_disabled;
862*f1df9364SStefan Roese 		break;
863*f1df9364SStefan Roese 
864*f1df9364SStefan Roese 	case 0x24:
865*f1df9364SStefan Roese 		*ptr = (u32 *)&is_pll_before_init;
866*f1df9364SStefan Roese 		break;
867*f1df9364SStefan Roese 
868*f1df9364SStefan Roese 	case 0x25:
869*f1df9364SStefan Roese 		*ptr = (u32 *)&is_adll_calib_before_init;
870*f1df9364SStefan Roese 		break;
871*f1df9364SStefan Roese #ifdef STATIC_ALGO_SUPPORT
872*f1df9364SStefan Roese 	case 0x26:
873*f1df9364SStefan Roese 		*ptr = (u32 *)&(silicon_delay[0]);
874*f1df9364SStefan Roese 		break;
875*f1df9364SStefan Roese 
876*f1df9364SStefan Roese 	case 0x27:
877*f1df9364SStefan Roese 		*ptr = (u32 *)&wl_debug_delay;
878*f1df9364SStefan Roese 		break;
879*f1df9364SStefan Roese #endif
880*f1df9364SStefan Roese 	case 0x28:
881*f1df9364SStefan Roese 		*ptr = (u32 *)&is_tune_result;
882*f1df9364SStefan Roese 		break;
883*f1df9364SStefan Roese 
884*f1df9364SStefan Roese 	case 0x29:
885*f1df9364SStefan Roese 		*ptr = (u32 *)&is_validate_window_per_if;
886*f1df9364SStefan Roese 		break;
887*f1df9364SStefan Roese 
888*f1df9364SStefan Roese 	case 0x2a:
889*f1df9364SStefan Roese 		*ptr = (u32 *)&is_validate_window_per_pup;
890*f1df9364SStefan Roese 		break;
891*f1df9364SStefan Roese 
892*f1df9364SStefan Roese 	case 0x30:
893*f1df9364SStefan Roese 		*ptr = (u32 *)&sweep_cnt;
894*f1df9364SStefan Roese 		break;
895*f1df9364SStefan Roese 
896*f1df9364SStefan Roese 	case 0x31:
897*f1df9364SStefan Roese 		*ptr = (u32 *)&is_bist_reset_bit;
898*f1df9364SStefan Roese 		break;
899*f1df9364SStefan Roese 
900*f1df9364SStefan Roese 	case 0x32:
901*f1df9364SStefan Roese 		*ptr = (u32 *)&is_dfs_in_init;
902*f1df9364SStefan Roese 		break;
903*f1df9364SStefan Roese 
904*f1df9364SStefan Roese 	case 0x33:
905*f1df9364SStefan Roese 		*ptr = (u32 *)&p_finger;
906*f1df9364SStefan Roese 		break;
907*f1df9364SStefan Roese 
908*f1df9364SStefan Roese 	case 0x34:
909*f1df9364SStefan Roese 		*ptr = (u32 *)&n_finger;
910*f1df9364SStefan Roese 		break;
911*f1df9364SStefan Roese 
912*f1df9364SStefan Roese 	case 0x35:
913*f1df9364SStefan Roese 		*ptr = (u32 *)&init_freq;
914*f1df9364SStefan Roese 		break;
915*f1df9364SStefan Roese 
916*f1df9364SStefan Roese 	case 0x36:
917*f1df9364SStefan Roese 		*ptr = (u32 *)&(freq_val[DDR_FREQ_LOW_FREQ]);
918*f1df9364SStefan Roese 		break;
919*f1df9364SStefan Roese 
920*f1df9364SStefan Roese 	case 0x37:
921*f1df9364SStefan Roese 		*ptr = (u32 *)&start_pattern;
922*f1df9364SStefan Roese 		break;
923*f1df9364SStefan Roese 
924*f1df9364SStefan Roese 	case 0x38:
925*f1df9364SStefan Roese 		*ptr = (u32 *)&end_pattern;
926*f1df9364SStefan Roese 		break;
927*f1df9364SStefan Roese 
928*f1df9364SStefan Roese 	case 0x39:
929*f1df9364SStefan Roese 		*ptr = (u32 *)&phy_reg0_val;
930*f1df9364SStefan Roese 		break;
931*f1df9364SStefan Roese 
932*f1df9364SStefan Roese 	case 0x4a:
933*f1df9364SStefan Roese 		*ptr = (u32 *)&phy_reg1_val;
934*f1df9364SStefan Roese 		break;
935*f1df9364SStefan Roese 
936*f1df9364SStefan Roese 	case 0x4b:
937*f1df9364SStefan Roese 		*ptr = (u32 *)&phy_reg2_val;
938*f1df9364SStefan Roese 		break;
939*f1df9364SStefan Roese 
940*f1df9364SStefan Roese 	case 0x4c:
941*f1df9364SStefan Roese 		*ptr = (u32 *)&phy_reg3_val;
942*f1df9364SStefan Roese 		break;
943*f1df9364SStefan Roese 
944*f1df9364SStefan Roese 	case 0x4e:
945*f1df9364SStefan Roese 		*ptr = (u32 *)&sweep_pattern;
946*f1df9364SStefan Roese 		break;
947*f1df9364SStefan Roese 
948*f1df9364SStefan Roese 	case 0x50:
949*f1df9364SStefan Roese 		*ptr = (u32 *)&is_rzq6;
950*f1df9364SStefan Roese 		break;
951*f1df9364SStefan Roese 
952*f1df9364SStefan Roese 	case 0x51:
953*f1df9364SStefan Roese 		*ptr = (u32 *)&znri_data_phy_val;
954*f1df9364SStefan Roese 		break;
955*f1df9364SStefan Roese 
956*f1df9364SStefan Roese 	case 0x52:
957*f1df9364SStefan Roese 		*ptr = (u32 *)&zpri_data_phy_val;
958*f1df9364SStefan Roese 		break;
959*f1df9364SStefan Roese 
960*f1df9364SStefan Roese 	case 0x53:
961*f1df9364SStefan Roese 		*ptr = (u32 *)&finger_test;
962*f1df9364SStefan Roese 		break;
963*f1df9364SStefan Roese 
964*f1df9364SStefan Roese 	case 0x54:
965*f1df9364SStefan Roese 		*ptr = (u32 *)&n_finger_start;
966*f1df9364SStefan Roese 		break;
967*f1df9364SStefan Roese 
968*f1df9364SStefan Roese 	case 0x55:
969*f1df9364SStefan Roese 		*ptr = (u32 *)&n_finger_end;
970*f1df9364SStefan Roese 		break;
971*f1df9364SStefan Roese 
972*f1df9364SStefan Roese 	case 0x56:
973*f1df9364SStefan Roese 		*ptr = (u32 *)&p_finger_start;
974*f1df9364SStefan Roese 		break;
975*f1df9364SStefan Roese 
976*f1df9364SStefan Roese 	case 0x57:
977*f1df9364SStefan Roese 		*ptr = (u32 *)&p_finger_end;
978*f1df9364SStefan Roese 		break;
979*f1df9364SStefan Roese 
980*f1df9364SStefan Roese 	case 0x58:
981*f1df9364SStefan Roese 		*ptr = (u32 *)&p_finger_step;
982*f1df9364SStefan Roese 		break;
983*f1df9364SStefan Roese 
984*f1df9364SStefan Roese 	case 0x59:
985*f1df9364SStefan Roese 		*ptr = (u32 *)&n_finger_step;
986*f1df9364SStefan Roese 		break;
987*f1df9364SStefan Roese 
988*f1df9364SStefan Roese 	case 0x5a:
989*f1df9364SStefan Roese 		*ptr = (u32 *)&znri_ctrl_phy_val;
990*f1df9364SStefan Roese 		break;
991*f1df9364SStefan Roese 
992*f1df9364SStefan Roese 	case 0x5b:
993*f1df9364SStefan Roese 		*ptr = (u32 *)&zpri_ctrl_phy_val;
994*f1df9364SStefan Roese 		break;
995*f1df9364SStefan Roese 
996*f1df9364SStefan Roese 	case 0x5c:
997*f1df9364SStefan Roese 		*ptr = (u32 *)&is_reg_dump;
998*f1df9364SStefan Roese 		break;
999*f1df9364SStefan Roese 
1000*f1df9364SStefan Roese 	case 0x5d:
1001*f1df9364SStefan Roese 		*ptr = (u32 *)&vref;
1002*f1df9364SStefan Roese 		break;
1003*f1df9364SStefan Roese 
1004*f1df9364SStefan Roese 	case 0x5e:
1005*f1df9364SStefan Roese 		*ptr = (u32 *)&mode2_t;
1006*f1df9364SStefan Roese 		break;
1007*f1df9364SStefan Roese 
1008*f1df9364SStefan Roese 	case 0x5f:
1009*f1df9364SStefan Roese 		*ptr = (u32 *)&xsb_validate_type;
1010*f1df9364SStefan Roese 		break;
1011*f1df9364SStefan Roese 
1012*f1df9364SStefan Roese 	case 0x60:
1013*f1df9364SStefan Roese 		*ptr = (u32 *)&xsb_validation_base_address;
1014*f1df9364SStefan Roese 		break;
1015*f1df9364SStefan Roese 
1016*f1df9364SStefan Roese 	case 0x67:
1017*f1df9364SStefan Roese 		*ptr = (u32 *)&activate_select_before_run_alg;
1018*f1df9364SStefan Roese 		break;
1019*f1df9364SStefan Roese 
1020*f1df9364SStefan Roese 	case 0x68:
1021*f1df9364SStefan Roese 		*ptr = (u32 *)&activate_deselect_after_run_alg;
1022*f1df9364SStefan Roese 		break;
1023*f1df9364SStefan Roese 
1024*f1df9364SStefan Roese 	case 0x69:
1025*f1df9364SStefan Roese 		*ptr = (u32 *)&odt_additional;
1026*f1df9364SStefan Roese 		break;
1027*f1df9364SStefan Roese 
1028*f1df9364SStefan Roese 	case 0x70:
1029*f1df9364SStefan Roese 		*ptr = (u32 *)&debug_mode;
1030*f1df9364SStefan Roese 		break;
1031*f1df9364SStefan Roese 
1032*f1df9364SStefan Roese 	case 0x71:
1033*f1df9364SStefan Roese 		*ptr = (u32 *)&pbs_pattern;
1034*f1df9364SStefan Roese 		break;
1035*f1df9364SStefan Roese 
1036*f1df9364SStefan Roese 	case 0x72:
1037*f1df9364SStefan Roese 		*ptr = (u32 *)&delay_enable;
1038*f1df9364SStefan Roese 		break;
1039*f1df9364SStefan Roese 
1040*f1df9364SStefan Roese 	case 0x73:
1041*f1df9364SStefan Roese 		*ptr = (u32 *)&ck_delay;
1042*f1df9364SStefan Roese 		break;
1043*f1df9364SStefan Roese 
1044*f1df9364SStefan Roese 	case 0x74:
1045*f1df9364SStefan Roese 		*ptr = (u32 *)&ck_delay_16;
1046*f1df9364SStefan Roese 		break;
1047*f1df9364SStefan Roese 
1048*f1df9364SStefan Roese 	case 0x75:
1049*f1df9364SStefan Roese 		*ptr = (u32 *)&ca_delay;
1050*f1df9364SStefan Roese 		break;
1051*f1df9364SStefan Roese 
1052*f1df9364SStefan Roese 	case 0x100:
1053*f1df9364SStefan Roese 		*ptr = (u32 *)&debug_dunit;
1054*f1df9364SStefan Roese 		break;
1055*f1df9364SStefan Roese 
1056*f1df9364SStefan Roese 	case 0x101:
1057*f1df9364SStefan Roese 		debug_acc = (int)value;
1058*f1df9364SStefan Roese 		break;
1059*f1df9364SStefan Roese 
1060*f1df9364SStefan Roese 	case 0x102:
1061*f1df9364SStefan Roese 		debug_training = (u8)value;
1062*f1df9364SStefan Roese 		break;
1063*f1df9364SStefan Roese 
1064*f1df9364SStefan Roese 	case 0x103:
1065*f1df9364SStefan Roese 		debug_training_bist = (u8)value;
1066*f1df9364SStefan Roese 		break;
1067*f1df9364SStefan Roese 
1068*f1df9364SStefan Roese 	case 0x104:
1069*f1df9364SStefan Roese 		debug_centralization = (u8)value;
1070*f1df9364SStefan Roese 		break;
1071*f1df9364SStefan Roese 
1072*f1df9364SStefan Roese 	case 0x105:
1073*f1df9364SStefan Roese 		debug_training_ip = (u8)value;
1074*f1df9364SStefan Roese 		break;
1075*f1df9364SStefan Roese 
1076*f1df9364SStefan Roese 	case 0x106:
1077*f1df9364SStefan Roese 		debug_leveling = (u8)value;
1078*f1df9364SStefan Roese 		break;
1079*f1df9364SStefan Roese 
1080*f1df9364SStefan Roese 	case 0x107:
1081*f1df9364SStefan Roese 		debug_pbs = (u8)value;
1082*f1df9364SStefan Roese 		break;
1083*f1df9364SStefan Roese 
1084*f1df9364SStefan Roese 	case 0x108:
1085*f1df9364SStefan Roese 		debug_training_static = (u8)value;
1086*f1df9364SStefan Roese 		break;
1087*f1df9364SStefan Roese 
1088*f1df9364SStefan Roese 	case 0x109:
1089*f1df9364SStefan Roese 		debug_training_access = (u8)value;
1090*f1df9364SStefan Roese 		break;
1091*f1df9364SStefan Roese 
1092*f1df9364SStefan Roese 	case 0x112:
1093*f1df9364SStefan Roese 		*ptr = &start_pattern;
1094*f1df9364SStefan Roese 		break;
1095*f1df9364SStefan Roese 
1096*f1df9364SStefan Roese 	case 0x113:
1097*f1df9364SStefan Roese 		*ptr = &end_pattern;
1098*f1df9364SStefan Roese 		break;
1099*f1df9364SStefan Roese 
1100*f1df9364SStefan Roese 	default:
1101*f1df9364SStefan Roese 		if ((flag_id >= 0x200) && (flag_id < 0x210)) {
1102*f1df9364SStefan Roese 			if_id = flag_id - 0x200;
1103*f1df9364SStefan Roese 			*ptr = (u32 *)&(tm->interface_params
1104*f1df9364SStefan Roese 					[if_id].memory_freq);
1105*f1df9364SStefan Roese 		} else if ((flag_id >= 0x210) && (flag_id < 0x220)) {
1106*f1df9364SStefan Roese 			if_id = flag_id - 0x210;
1107*f1df9364SStefan Roese 			*ptr = (u32 *)&(tm->interface_params
1108*f1df9364SStefan Roese 					[if_id].speed_bin_index);
1109*f1df9364SStefan Roese 		} else if ((flag_id >= 0x220) && (flag_id < 0x230)) {
1110*f1df9364SStefan Roese 			if_id = flag_id - 0x220;
1111*f1df9364SStefan Roese 			*ptr = (u32 *)&(tm->interface_params
1112*f1df9364SStefan Roese 					[if_id].bus_width);
1113*f1df9364SStefan Roese 		} else if ((flag_id >= 0x230) && (flag_id < 0x240)) {
1114*f1df9364SStefan Roese 			if_id = flag_id - 0x230;
1115*f1df9364SStefan Roese 			*ptr = (u32 *)&(tm->interface_params
1116*f1df9364SStefan Roese 					[if_id].memory_size);
1117*f1df9364SStefan Roese 		} else if ((flag_id >= 0x240) && (flag_id < 0x250)) {
1118*f1df9364SStefan Roese 			if_id = flag_id - 0x240;
1119*f1df9364SStefan Roese 			*ptr = (u32 *)&(tm->interface_params
1120*f1df9364SStefan Roese 					[if_id].cas_l);
1121*f1df9364SStefan Roese 		} else if ((flag_id >= 0x250) && (flag_id < 0x260)) {
1122*f1df9364SStefan Roese 			if_id = flag_id - 0x250;
1123*f1df9364SStefan Roese 			*ptr = (u32 *)&(tm->interface_params
1124*f1df9364SStefan Roese 					[if_id].cas_wl);
1125*f1df9364SStefan Roese 		} else if ((flag_id >= 0x270) && (flag_id < 0x2cf)) {
1126*f1df9364SStefan Roese 			if_id = (flag_id - 0x270) / MAX_BUS_NUM;
1127*f1df9364SStefan Roese 			pup_id = (flag_id - 0x270) % MAX_BUS_NUM;
1128*f1df9364SStefan Roese 			*ptr = (u32 *)&(tm->interface_params[if_id].
1129*f1df9364SStefan Roese 					as_bus_params[pup_id].is_ck_swap);
1130*f1df9364SStefan Roese 		} else if ((flag_id >= 0x2d0) && (flag_id < 0x32f)) {
1131*f1df9364SStefan Roese 			if_id = (flag_id - 0x2d0) / MAX_BUS_NUM;
1132*f1df9364SStefan Roese 			pup_id = (flag_id - 0x2d0) % MAX_BUS_NUM;
1133*f1df9364SStefan Roese 			*ptr = (u32 *)&(tm->interface_params[if_id].
1134*f1df9364SStefan Roese 					as_bus_params[pup_id].is_dqs_swap);
1135*f1df9364SStefan Roese 		} else if ((flag_id >= 0x330) && (flag_id < 0x38f)) {
1136*f1df9364SStefan Roese 			if_id = (flag_id - 0x330) / MAX_BUS_NUM;
1137*f1df9364SStefan Roese 			pup_id = (flag_id - 0x330) % MAX_BUS_NUM;
1138*f1df9364SStefan Roese 			*ptr = (u32 *)&(tm->interface_params[if_id].
1139*f1df9364SStefan Roese 					as_bus_params[pup_id].cs_bitmask);
1140*f1df9364SStefan Roese 		} else if ((flag_id >= 0x390) && (flag_id < 0x3ef)) {
1141*f1df9364SStefan Roese 			if_id = (flag_id - 0x390) / MAX_BUS_NUM;
1142*f1df9364SStefan Roese 			pup_id = (flag_id - 0x390) % MAX_BUS_NUM;
1143*f1df9364SStefan Roese 			*ptr = (u32 *)&(tm->interface_params
1144*f1df9364SStefan Roese 					[if_id].as_bus_params
1145*f1df9364SStefan Roese 					[pup_id].mirror_enable_bitmask);
1146*f1df9364SStefan Roese 		} else if ((flag_id >= 0x500) && (flag_id <= 0x50f)) {
1147*f1df9364SStefan Roese 			tmp_val = flag_id - 0x320;
1148*f1df9364SStefan Roese 			*ptr = (u32 *)&(clamp_tbl[tmp_val]);
1149*f1df9364SStefan Roese 		} else {
1150*f1df9364SStefan Roese 			DEBUG_TRAINING_IP(DEBUG_LEVEL_ERROR,
1151*f1df9364SStefan Roese 					  ("flag_id out of boundary %d\n",
1152*f1df9364SStefan Roese 					   flag_id));
1153*f1df9364SStefan Roese 			return MV_BAD_PARAM;
1154*f1df9364SStefan Roese 		}
1155*f1df9364SStefan Roese 	}
1156*f1df9364SStefan Roese 
1157*f1df9364SStefan Roese 	return MV_OK;
1158*f1df9364SStefan Roese }
1159*f1df9364SStefan Roese 
1160*f1df9364SStefan Roese #ifndef EXCLUDE_SWITCH_DEBUG
1161*f1df9364SStefan Roese /*
1162*f1df9364SStefan Roese  * Print ADLL
1163*f1df9364SStefan Roese  */
print_adll(u32 dev_num,u32 adll[MAX_INTERFACE_NUM * MAX_BUS_NUM])1164*f1df9364SStefan Roese int print_adll(u32 dev_num, u32 adll[MAX_INTERFACE_NUM * MAX_BUS_NUM])
1165*f1df9364SStefan Roese {
1166*f1df9364SStefan Roese 	u32 i, j;
1167*f1df9364SStefan Roese 	struct hws_topology_map *tm = ddr3_get_topology_map();
1168*f1df9364SStefan Roese 
1169*f1df9364SStefan Roese 	for (j = 0; j < tm->num_of_bus_per_interface; j++) {
1170*f1df9364SStefan Roese 		VALIDATE_ACTIVE(tm->bus_act_mask, j);
1171*f1df9364SStefan Roese 		for (i = 0; i < MAX_INTERFACE_NUM; i++) {
1172*f1df9364SStefan Roese 			printf("%d ,",
1173*f1df9364SStefan Roese 			       adll[i * tm->num_of_bus_per_interface + j]);
1174*f1df9364SStefan Roese 		}
1175*f1df9364SStefan Roese 	}
1176*f1df9364SStefan Roese 	printf("\n");
1177*f1df9364SStefan Roese 
1178*f1df9364SStefan Roese 	return MV_OK;
1179*f1df9364SStefan Roese }
1180*f1df9364SStefan Roese #endif
1181*f1df9364SStefan Roese 
1182*f1df9364SStefan Roese /* byte_index - only byte 0, 1, 2, or 3, oxff - test all bytes */
ddr3_tip_compare(u32 if_id,u32 * p_src,u32 * p_dst,u32 byte_index)1183*f1df9364SStefan Roese static u32 ddr3_tip_compare(u32 if_id, u32 *p_src, u32 *p_dst,
1184*f1df9364SStefan Roese 			    u32 byte_index)
1185*f1df9364SStefan Roese {
1186*f1df9364SStefan Roese 	u32 burst_cnt = 0, addr_offset, i_id;
1187*f1df9364SStefan Roese 	int b_is_fail = 0;
1188*f1df9364SStefan Roese 
1189*f1df9364SStefan Roese 	addr_offset =
1190*f1df9364SStefan Roese 		(byte_index ==
1191*f1df9364SStefan Roese 		 0xff) ? (u32) 0xffffffff : (u32) (0xff << (byte_index * 8));
1192*f1df9364SStefan Roese 	for (burst_cnt = 0; burst_cnt < EXT_ACCESS_BURST_LENGTH; burst_cnt++) {
1193*f1df9364SStefan Roese 		if ((p_src[burst_cnt] & addr_offset) !=
1194*f1df9364SStefan Roese 		    (p_dst[burst_cnt] & addr_offset))
1195*f1df9364SStefan Roese 			b_is_fail = 1;
1196*f1df9364SStefan Roese 	}
1197*f1df9364SStefan Roese 
1198*f1df9364SStefan Roese 	if (b_is_fail == 1) {
1199*f1df9364SStefan Roese 		DEBUG_TRAINING_IP(DEBUG_LEVEL_ERROR,
1200*f1df9364SStefan Roese 				  ("IF %d exp: ", if_id));
1201*f1df9364SStefan Roese 		for (i_id = 0; i_id <= MAX_INTERFACE_NUM - 1; i_id++) {
1202*f1df9364SStefan Roese 			DEBUG_TRAINING_IP(DEBUG_LEVEL_ERROR,
1203*f1df9364SStefan Roese 					  ("0x%8x ", p_src[i_id]));
1204*f1df9364SStefan Roese 		}
1205*f1df9364SStefan Roese 		DEBUG_TRAINING_IP(DEBUG_LEVEL_ERROR,
1206*f1df9364SStefan Roese 				  ("\n_i_f %d rcv: ", if_id));
1207*f1df9364SStefan Roese 		for (i_id = 0; i_id <= MAX_INTERFACE_NUM - 1; i_id++) {
1208*f1df9364SStefan Roese 			DEBUG_TRAINING_IP(DEBUG_LEVEL_ERROR,
1209*f1df9364SStefan Roese 					  ("(0x%8x ", p_dst[i_id]));
1210*f1df9364SStefan Roese 		}
1211*f1df9364SStefan Roese 		DEBUG_TRAINING_IP(DEBUG_LEVEL_ERROR, ("\n "));
1212*f1df9364SStefan Roese 	}
1213*f1df9364SStefan Roese 
1214*f1df9364SStefan Roese 	return b_is_fail;
1215*f1df9364SStefan Roese }
1216*f1df9364SStefan Roese 
1217*f1df9364SStefan Roese /* test_type = 0-tx , 1-rx */
ddr3_tip_sweep_test(u32 dev_num,u32 test_type,u32 mem_addr,u32 is_modify_adll,u32 start_if,u32 end_if,u32 startpup,u32 endpup)1218*f1df9364SStefan Roese int ddr3_tip_sweep_test(u32 dev_num, u32 test_type,
1219*f1df9364SStefan Roese 			u32 mem_addr, u32 is_modify_adll,
1220*f1df9364SStefan Roese 			u32 start_if, u32 end_if, u32 startpup, u32 endpup)
1221*f1df9364SStefan Roese {
1222*f1df9364SStefan Roese 	u32 bus_cnt = 0, adll_val = 0, if_id, ui_prev_adll, ui_mask_bit,
1223*f1df9364SStefan Roese 		end_adll, start_adll;
1224*f1df9364SStefan Roese 	u32 reg_addr = 0;
1225*f1df9364SStefan Roese 	struct hws_topology_map *tm = ddr3_get_topology_map();
1226*f1df9364SStefan Roese 
1227*f1df9364SStefan Roese 	if (test_type == 0) {
1228*f1df9364SStefan Roese 		reg_addr = 1;
1229*f1df9364SStefan Roese 		ui_mask_bit = 0x3f;
1230*f1df9364SStefan Roese 		start_adll = 0;
1231*f1df9364SStefan Roese 		end_adll = ui_mask_bit;
1232*f1df9364SStefan Roese 	} else {
1233*f1df9364SStefan Roese 		reg_addr = 3;
1234*f1df9364SStefan Roese 		ui_mask_bit = 0x1f;
1235*f1df9364SStefan Roese 		start_adll = 0;
1236*f1df9364SStefan Roese 		end_adll = ui_mask_bit;
1237*f1df9364SStefan Roese 	}
1238*f1df9364SStefan Roese 
1239*f1df9364SStefan Roese 	DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO,
1240*f1df9364SStefan Roese 			  ("==============================\n"));
1241*f1df9364SStefan Roese 	DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO,
1242*f1df9364SStefan Roese 			  ("Test type %d (0-tx, 1-rx)\n", test_type));
1243*f1df9364SStefan Roese 
1244*f1df9364SStefan Roese 	for (if_id = start_if; if_id <= end_if; if_id++) {
1245*f1df9364SStefan Roese 		VALIDATE_ACTIVE(tm->if_act_mask, if_id);
1246*f1df9364SStefan Roese 		for (bus_cnt = startpup; bus_cnt < endpup; bus_cnt++) {
1247*f1df9364SStefan Roese 			CHECK_STATUS(ddr3_tip_bus_read
1248*f1df9364SStefan Roese 				     (dev_num, if_id, ACCESS_TYPE_UNICAST,
1249*f1df9364SStefan Roese 				      bus_cnt, DDR_PHY_DATA, reg_addr,
1250*f1df9364SStefan Roese 				      &ui_prev_adll));
1251*f1df9364SStefan Roese 
1252*f1df9364SStefan Roese 			for (adll_val = start_adll; adll_val <= end_adll;
1253*f1df9364SStefan Roese 			     adll_val++) {
1254*f1df9364SStefan Roese 				if (is_modify_adll == 1) {
1255*f1df9364SStefan Roese 					CHECK_STATUS(ddr3_tip_bus_read_modify_write
1256*f1df9364SStefan Roese 						     (dev_num,
1257*f1df9364SStefan Roese 						      ACCESS_TYPE_UNICAST,
1258*f1df9364SStefan Roese 						      if_id, bus_cnt,
1259*f1df9364SStefan Roese 						      DDR_PHY_DATA, reg_addr,
1260*f1df9364SStefan Roese 						      adll_val, ui_mask_bit));
1261*f1df9364SStefan Roese 				}
1262*f1df9364SStefan Roese 			}
1263*f1df9364SStefan Roese 			if (is_modify_adll == 1) {
1264*f1df9364SStefan Roese 				CHECK_STATUS(ddr3_tip_bus_write
1265*f1df9364SStefan Roese 					     (dev_num, ACCESS_TYPE_UNICAST,
1266*f1df9364SStefan Roese 					      if_id, ACCESS_TYPE_UNICAST,
1267*f1df9364SStefan Roese 					      bus_cnt, DDR_PHY_DATA, reg_addr,
1268*f1df9364SStefan Roese 					      ui_prev_adll));
1269*f1df9364SStefan Roese 			}
1270*f1df9364SStefan Roese 			DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO, ("\n"));
1271*f1df9364SStefan Roese 		}
1272*f1df9364SStefan Roese 		DEBUG_TRAINING_IP(DEBUG_LEVEL_INFO, ("\n"));
1273*f1df9364SStefan Roese 	}
1274*f1df9364SStefan Roese 
1275*f1df9364SStefan Roese 	return MV_OK;
1276*f1df9364SStefan Roese }
1277*f1df9364SStefan Roese 
1278*f1df9364SStefan Roese #ifndef EXCLUDE_SWITCH_DEBUG
1279*f1df9364SStefan Roese /*
1280*f1df9364SStefan Roese  * Sweep validation
1281*f1df9364SStefan Roese  */
ddr3_tip_run_sweep_test(int dev_num,u32 repeat_num,u32 direction,u32 mode)1282*f1df9364SStefan Roese int ddr3_tip_run_sweep_test(int dev_num, u32 repeat_num, u32 direction,
1283*f1df9364SStefan Roese 			    u32 mode)
1284*f1df9364SStefan Roese {
1285*f1df9364SStefan Roese 	u32 pup = 0, start_pup = 0, end_pup = 0;
1286*f1df9364SStefan Roese 	u32 adll = 0;
1287*f1df9364SStefan Roese 	u32 res[MAX_INTERFACE_NUM] = { 0 };
1288*f1df9364SStefan Roese 	int if_id = 0;
1289*f1df9364SStefan Roese 	u32 adll_value = 0;
1290*f1df9364SStefan Roese 	int reg = (direction == 0) ? WRITE_CENTRALIZATION_PHY_REG :
1291*f1df9364SStefan Roese 		READ_CENTRALIZATION_PHY_REG;
1292*f1df9364SStefan Roese 	enum hws_access_type pup_access;
1293*f1df9364SStefan Roese 	u32 cs;
1294*f1df9364SStefan Roese 	u32 max_cs = hws_ddr3_tip_max_cs_get();
1295*f1df9364SStefan Roese 	struct hws_topology_map *tm = ddr3_get_topology_map();
1296*f1df9364SStefan Roese 
1297*f1df9364SStefan Roese 	if (mode == 1) {
1298*f1df9364SStefan Roese 		/* per pup */
1299*f1df9364SStefan Roese 		start_pup = 0;
1300*f1df9364SStefan Roese 		end_pup = tm->num_of_bus_per_interface - 1;
1301*f1df9364SStefan Roese 		pup_access = ACCESS_TYPE_UNICAST;
1302*f1df9364SStefan Roese 	} else {
1303*f1df9364SStefan Roese 		start_pup = 0;
1304*f1df9364SStefan Roese 		end_pup = 0;
1305*f1df9364SStefan Roese 		pup_access = ACCESS_TYPE_MULTICAST;
1306*f1df9364SStefan Roese 	}
1307*f1df9364SStefan Roese 
1308*f1df9364SStefan Roese 	for (cs = 0; cs < max_cs; cs++) {
1309*f1df9364SStefan Roese 		for (adll = 0; adll < ADLL_LENGTH; adll++) {
1310*f1df9364SStefan Roese 			for (if_id = 0;
1311*f1df9364SStefan Roese 			     if_id <= MAX_INTERFACE_NUM - 1;
1312*f1df9364SStefan Roese 			     if_id++) {
1313*f1df9364SStefan Roese 				VALIDATE_ACTIVE
1314*f1df9364SStefan Roese 					(tm->if_act_mask,
1315*f1df9364SStefan Roese 					 if_id);
1316*f1df9364SStefan Roese 				for (pup = start_pup; pup <= end_pup; pup++) {
1317*f1df9364SStefan Roese 					ctrl_sweepres[adll][if_id][pup] =
1318*f1df9364SStefan Roese 						0;
1319*f1df9364SStefan Roese 				}
1320*f1df9364SStefan Roese 			}
1321*f1df9364SStefan Roese 		}
1322*f1df9364SStefan Roese 
1323*f1df9364SStefan Roese 		for (adll = 0; adll < (MAX_INTERFACE_NUM * MAX_BUS_NUM); adll++)
1324*f1df9364SStefan Roese 			ctrl_adll[adll] = 0;
1325*f1df9364SStefan Roese 		/* Save DQS value(after algorithm run) */
1326*f1df9364SStefan Roese 		read_adll_value(ctrl_adll,
1327*f1df9364SStefan Roese 				(reg + (cs * CS_REGISTER_ADDR_OFFSET)),
1328*f1df9364SStefan Roese 				MASK_ALL_BITS);
1329*f1df9364SStefan Roese 
1330*f1df9364SStefan Roese 		/*
1331*f1df9364SStefan Roese 		 * Sweep ADLL  from 0:31 on all I/F on all Pup and perform
1332*f1df9364SStefan Roese 		 * BIST on each stage.
1333*f1df9364SStefan Roese 		 */
1334*f1df9364SStefan Roese 		for (pup = start_pup; pup <= end_pup; pup++) {
1335*f1df9364SStefan Roese 			for (adll = 0; adll < ADLL_LENGTH; adll++) {
1336*f1df9364SStefan Roese 				adll_value =
1337*f1df9364SStefan Roese 					(direction == 0) ? (adll * 2) : adll;
1338*f1df9364SStefan Roese 				CHECK_STATUS(ddr3_tip_bus_write
1339*f1df9364SStefan Roese 					     (dev_num, ACCESS_TYPE_MULTICAST, 0,
1340*f1df9364SStefan Roese 					      pup_access, pup, DDR_PHY_DATA,
1341*f1df9364SStefan Roese 					      reg + CS_REG_VALUE(cs),
1342*f1df9364SStefan Roese 					      adll_value));
1343*f1df9364SStefan Roese 				hws_ddr3_run_bist(dev_num, sweep_pattern, res,
1344*f1df9364SStefan Roese 						  cs);
1345*f1df9364SStefan Roese 				/* ddr3_tip_reset_fifo_ptr(dev_num); */
1346*f1df9364SStefan Roese 				for (if_id = 0;
1347*f1df9364SStefan Roese 				     if_id <= MAX_INTERFACE_NUM - 1;
1348*f1df9364SStefan Roese 				     if_id++) {
1349*f1df9364SStefan Roese 					VALIDATE_ACTIVE
1350*f1df9364SStefan Roese 						(tm->if_act_mask,
1351*f1df9364SStefan Roese 						 if_id);
1352*f1df9364SStefan Roese 					ctrl_sweepres[adll][if_id][pup]
1353*f1df9364SStefan Roese 						= res[if_id];
1354*f1df9364SStefan Roese 					if (mode == 1) {
1355*f1df9364SStefan Roese 						CHECK_STATUS
1356*f1df9364SStefan Roese 							(ddr3_tip_bus_write
1357*f1df9364SStefan Roese 							 (dev_num,
1358*f1df9364SStefan Roese 							  ACCESS_TYPE_UNICAST,
1359*f1df9364SStefan Roese 							  if_id,
1360*f1df9364SStefan Roese 							  ACCESS_TYPE_UNICAST,
1361*f1df9364SStefan Roese 							  pup,
1362*f1df9364SStefan Roese 							  DDR_PHY_DATA,
1363*f1df9364SStefan Roese 							  reg + CS_REG_VALUE(cs),
1364*f1df9364SStefan Roese 							  ctrl_adll[if_id *
1365*f1df9364SStefan Roese 								    cs *
1366*f1df9364SStefan Roese 								    tm->num_of_bus_per_interface
1367*f1df9364SStefan Roese 								    + pup]));
1368*f1df9364SStefan Roese 					}
1369*f1df9364SStefan Roese 				}
1370*f1df9364SStefan Roese 			}
1371*f1df9364SStefan Roese 		}
1372*f1df9364SStefan Roese 		printf("Final, CS %d,%s, Sweep, Result, Adll,", cs,
1373*f1df9364SStefan Roese 		       ((direction == 0) ? "TX" : "RX"));
1374*f1df9364SStefan Roese 		for (if_id = 0; if_id <= MAX_INTERFACE_NUM - 1; if_id++) {
1375*f1df9364SStefan Roese 			VALIDATE_ACTIVE(tm->if_act_mask, if_id);
1376*f1df9364SStefan Roese 			if (mode == 1) {
1377*f1df9364SStefan Roese 				for (pup = start_pup; pup <= end_pup; pup++) {
1378*f1df9364SStefan Roese 					VALIDATE_ACTIVE(tm->bus_act_mask, pup);
1379*f1df9364SStefan Roese 					printf("I/F%d-PHY%d , ", if_id, pup);
1380*f1df9364SStefan Roese 				}
1381*f1df9364SStefan Roese 			} else {
1382*f1df9364SStefan Roese 				printf("I/F%d , ", if_id);
1383*f1df9364SStefan Roese 			}
1384*f1df9364SStefan Roese 		}
1385*f1df9364SStefan Roese 		printf("\n");
1386*f1df9364SStefan Roese 
1387*f1df9364SStefan Roese 		for (adll = 0; adll < ADLL_LENGTH; adll++) {
1388*f1df9364SStefan Roese 			adll_value = (direction == 0) ? (adll * 2) : adll;
1389*f1df9364SStefan Roese 			printf("Final,%s, Sweep, Result, %d ,",
1390*f1df9364SStefan Roese 			       ((direction == 0) ? "TX" : "RX"), adll_value);
1391*f1df9364SStefan Roese 
1392*f1df9364SStefan Roese 			for (if_id = 0;
1393*f1df9364SStefan Roese 			     if_id <= MAX_INTERFACE_NUM - 1;
1394*f1df9364SStefan Roese 			     if_id++) {
1395*f1df9364SStefan Roese 				VALIDATE_ACTIVE(tm->if_act_mask, if_id);
1396*f1df9364SStefan Roese 				for (pup = start_pup; pup <= end_pup; pup++) {
1397*f1df9364SStefan Roese 					printf("%d , ",
1398*f1df9364SStefan Roese 					       ctrl_sweepres[adll][if_id]
1399*f1df9364SStefan Roese 					       [pup]);
1400*f1df9364SStefan Roese 				}
1401*f1df9364SStefan Roese 			}
1402*f1df9364SStefan Roese 			printf("\n");
1403*f1df9364SStefan Roese 		}
1404*f1df9364SStefan Roese 
1405*f1df9364SStefan Roese 		/*
1406*f1df9364SStefan Roese 		 * Write back to the phy the Rx DQS value, we store in
1407*f1df9364SStefan Roese 		 * the beginning.
1408*f1df9364SStefan Roese 		 */
1409*f1df9364SStefan Roese 		write_adll_value(ctrl_adll,
1410*f1df9364SStefan Roese 				 (reg + cs * CS_REGISTER_ADDR_OFFSET));
1411*f1df9364SStefan Roese 		/* print adll results */
1412*f1df9364SStefan Roese 		read_adll_value(ctrl_adll, (reg + cs * CS_REGISTER_ADDR_OFFSET),
1413*f1df9364SStefan Roese 				MASK_ALL_BITS);
1414*f1df9364SStefan Roese 		printf("%s, DQS, ADLL,,,", (direction == 0) ? "Tx" : "Rx");
1415*f1df9364SStefan Roese 		print_adll(dev_num, ctrl_adll);
1416*f1df9364SStefan Roese 	}
1417*f1df9364SStefan Roese 	ddr3_tip_reset_fifo_ptr(dev_num);
1418*f1df9364SStefan Roese 
1419*f1df9364SStefan Roese 	return 0;
1420*f1df9364SStefan Roese }
1421*f1df9364SStefan Roese 
print_topology(struct hws_topology_map * topology_db)1422*f1df9364SStefan Roese void print_topology(struct hws_topology_map *topology_db)
1423*f1df9364SStefan Roese {
1424*f1df9364SStefan Roese 	u32 ui, uj;
1425*f1df9364SStefan Roese 
1426*f1df9364SStefan Roese 	printf("\tinterface_mask: 0x%x\n", topology_db->if_act_mask);
1427*f1df9364SStefan Roese 	printf("\tNum Bus:  %d\n", topology_db->num_of_bus_per_interface);
1428*f1df9364SStefan Roese 	printf("\tbus_act_mask: 0x%x\n", topology_db->bus_act_mask);
1429*f1df9364SStefan Roese 
1430*f1df9364SStefan Roese 	for (ui = 0; ui < MAX_INTERFACE_NUM; ui++) {
1431*f1df9364SStefan Roese 		VALIDATE_ACTIVE(topology_db->if_act_mask, ui);
1432*f1df9364SStefan Roese 		printf("\n\tInterface ID: %d\n", ui);
1433*f1df9364SStefan Roese 		printf("\t\tDDR Frequency: %s\n",
1434*f1df9364SStefan Roese 		       convert_freq(topology_db->
1435*f1df9364SStefan Roese 				    interface_params[ui].memory_freq));
1436*f1df9364SStefan Roese 		printf("\t\tSpeed_bin: %d\n",
1437*f1df9364SStefan Roese 		       topology_db->interface_params[ui].speed_bin_index);
1438*f1df9364SStefan Roese 		printf("\t\tBus_width: %d\n",
1439*f1df9364SStefan Roese 		       (4 << topology_db->interface_params[ui].bus_width));
1440*f1df9364SStefan Roese 		printf("\t\tMem_size: %s\n",
1441*f1df9364SStefan Roese 		       convert_mem_size(topology_db->
1442*f1df9364SStefan Roese 					interface_params[ui].memory_size));
1443*f1df9364SStefan Roese 		printf("\t\tCAS-WL: %d\n",
1444*f1df9364SStefan Roese 		       topology_db->interface_params[ui].cas_wl);
1445*f1df9364SStefan Roese 		printf("\t\tCAS-L: %d\n",
1446*f1df9364SStefan Roese 		       topology_db->interface_params[ui].cas_l);
1447*f1df9364SStefan Roese 		printf("\t\tTemperature: %d\n",
1448*f1df9364SStefan Roese 		       topology_db->interface_params[ui].interface_temp);
1449*f1df9364SStefan Roese 		printf("\n");
1450*f1df9364SStefan Roese 		for (uj = 0; uj < 4; uj++) {
1451*f1df9364SStefan Roese 			printf("\t\tBus %d parameters- CS Mask: 0x%x\t", uj,
1452*f1df9364SStefan Roese 			       topology_db->interface_params[ui].
1453*f1df9364SStefan Roese 			       as_bus_params[uj].cs_bitmask);
1454*f1df9364SStefan Roese 			printf("Mirror: 0x%x\t",
1455*f1df9364SStefan Roese 			       topology_db->interface_params[ui].
1456*f1df9364SStefan Roese 			       as_bus_params[uj].mirror_enable_bitmask);
1457*f1df9364SStefan Roese 			printf("DQS Swap is %s \t",
1458*f1df9364SStefan Roese 			       (topology_db->
1459*f1df9364SStefan Roese 				interface_params[ui].as_bus_params[uj].
1460*f1df9364SStefan Roese 				is_dqs_swap == 1) ? "enabled" : "disabled");
1461*f1df9364SStefan Roese 			printf("Ck Swap:%s\t",
1462*f1df9364SStefan Roese 			       (topology_db->
1463*f1df9364SStefan Roese 				interface_params[ui].as_bus_params[uj].
1464*f1df9364SStefan Roese 				is_ck_swap == 1) ? "enabled" : "disabled");
1465*f1df9364SStefan Roese 			printf("\n");
1466*f1df9364SStefan Roese 		}
1467*f1df9364SStefan Roese 	}
1468*f1df9364SStefan Roese }
1469*f1df9364SStefan Roese #endif
1470*f1df9364SStefan Roese 
1471*f1df9364SStefan Roese /*
1472*f1df9364SStefan Roese  * Execute XSB Test transaction (rd/wr/both)
1473*f1df9364SStefan Roese  */
run_xsb_test(u32 dev_num,u32 mem_addr,u32 write_type,u32 read_type,u32 burst_length)1474*f1df9364SStefan Roese int run_xsb_test(u32 dev_num, u32 mem_addr, u32 write_type,
1475*f1df9364SStefan Roese 		 u32 read_type, u32 burst_length)
1476*f1df9364SStefan Roese {
1477*f1df9364SStefan Roese 	u32 seq = 0, if_id = 0, addr, cnt;
1478*f1df9364SStefan Roese 	int ret = MV_OK, ret_tmp;
1479*f1df9364SStefan Roese 	u32 data_read[MAX_INTERFACE_NUM];
1480*f1df9364SStefan Roese 	struct hws_topology_map *tm = ddr3_get_topology_map();
1481*f1df9364SStefan Roese 
1482*f1df9364SStefan Roese 	for (if_id = 0; if_id <= MAX_INTERFACE_NUM - 1; if_id++) {
1483*f1df9364SStefan Roese 		VALIDATE_ACTIVE(tm->if_act_mask, if_id);
1484*f1df9364SStefan Roese 		addr = mem_addr;
1485*f1df9364SStefan Roese 		for (cnt = 0; cnt <= burst_length; cnt++) {
1486*f1df9364SStefan Roese 			seq = (seq + 1) % 8;
1487*f1df9364SStefan Roese 			if (write_type != 0) {
1488*f1df9364SStefan Roese 				CHECK_STATUS(ddr3_tip_ext_write
1489*f1df9364SStefan Roese 					     (dev_num, if_id, addr, 1,
1490*f1df9364SStefan Roese 					      xsb_test_table[seq]));
1491*f1df9364SStefan Roese 			}
1492*f1df9364SStefan Roese 			if (read_type != 0) {
1493*f1df9364SStefan Roese 				CHECK_STATUS(ddr3_tip_ext_read
1494*f1df9364SStefan Roese 					     (dev_num, if_id, addr, 1,
1495*f1df9364SStefan Roese 					      data_read));
1496*f1df9364SStefan Roese 			}
1497*f1df9364SStefan Roese 			if ((read_type != 0) && (write_type != 0)) {
1498*f1df9364SStefan Roese 				ret_tmp =
1499*f1df9364SStefan Roese 					ddr3_tip_compare(if_id,
1500*f1df9364SStefan Roese 							 xsb_test_table[seq],
1501*f1df9364SStefan Roese 							 data_read,
1502*f1df9364SStefan Roese 							 0xff);
1503*f1df9364SStefan Roese 				addr += (EXT_ACCESS_BURST_LENGTH * 4);
1504*f1df9364SStefan Roese 				ret = (ret != MV_OK) ? ret : ret_tmp;
1505*f1df9364SStefan Roese 			}
1506*f1df9364SStefan Roese 		}
1507*f1df9364SStefan Roese 	}
1508*f1df9364SStefan Roese 
1509*f1df9364SStefan Roese 	return ret;
1510*f1df9364SStefan Roese }
1511*f1df9364SStefan Roese 
1512*f1df9364SStefan Roese #else /*EXCLUDE_SWITCH_DEBUG */
1513*f1df9364SStefan Roese 
1514*f1df9364SStefan Roese u32 rl_version = 1;		/* 0 - old RL machine */
1515*f1df9364SStefan Roese u32 vref = 0x4;
1516*f1df9364SStefan Roese u32 start_xsb_offset = 0;
1517*f1df9364SStefan Roese u8 cs_mask_reg[] = {
1518*f1df9364SStefan Roese 	0, 4, 8, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
1519*f1df9364SStefan Roese };
1520*f1df9364SStefan Roese 
run_xsb_test(u32 dev_num,u32 mem_addr,u32 write_type,u32 read_type,u32 burst_length)1521*f1df9364SStefan Roese int run_xsb_test(u32 dev_num, u32 mem_addr, u32 write_type,
1522*f1df9364SStefan Roese 		 u32 read_type, u32 burst_length)
1523*f1df9364SStefan Roese {
1524*f1df9364SStefan Roese 	return MV_OK;
1525*f1df9364SStefan Roese }
1526*f1df9364SStefan Roese 
1527*f1df9364SStefan Roese #endif
1528