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 #define VALIDATE_WIN_LENGTH(e1, e2, maxsize) \
16*f1df9364SStefan Roese (((e2) + 1 > (e1) + (u8)MIN_WINDOW_SIZE) && \
17*f1df9364SStefan Roese ((e2) + 1 < (e1) + (u8)maxsize))
18*f1df9364SStefan Roese #define IS_WINDOW_OUT_BOUNDARY(e1, e2, maxsize) \
19*f1df9364SStefan Roese (((e1) == 0 && (e2) != 0) || \
20*f1df9364SStefan Roese ((e1) != (maxsize - 1) && (e2) == (maxsize - 1)))
21*f1df9364SStefan Roese #define CENTRAL_TX 0
22*f1df9364SStefan Roese #define CENTRAL_RX 1
23*f1df9364SStefan Roese #define NUM_OF_CENTRAL_TYPES 2
24*f1df9364SStefan Roese
25*f1df9364SStefan Roese u32 start_pattern = PATTERN_KILLER_DQ0, end_pattern = PATTERN_KILLER_DQ7;
26*f1df9364SStefan Roese u32 start_if = 0, end_if = (MAX_INTERFACE_NUM - 1);
27*f1df9364SStefan Roese u8 bus_end_window[NUM_OF_CENTRAL_TYPES][MAX_INTERFACE_NUM][MAX_BUS_NUM];
28*f1df9364SStefan Roese u8 bus_start_window[NUM_OF_CENTRAL_TYPES][MAX_INTERFACE_NUM][MAX_BUS_NUM];
29*f1df9364SStefan Roese u8 centralization_state[MAX_INTERFACE_NUM][MAX_BUS_NUM];
30*f1df9364SStefan Roese static u8 ddr3_tip_special_rx_run_once_flag;
31*f1df9364SStefan Roese
32*f1df9364SStefan Roese static int ddr3_tip_centralization(u32 dev_num, u32 mode);
33*f1df9364SStefan Roese
34*f1df9364SStefan Roese /*
35*f1df9364SStefan Roese * Centralization RX Flow
36*f1df9364SStefan Roese */
ddr3_tip_centralization_rx(u32 dev_num)37*f1df9364SStefan Roese int ddr3_tip_centralization_rx(u32 dev_num)
38*f1df9364SStefan Roese {
39*f1df9364SStefan Roese CHECK_STATUS(ddr3_tip_special_rx(dev_num));
40*f1df9364SStefan Roese CHECK_STATUS(ddr3_tip_centralization(dev_num, CENTRAL_RX));
41*f1df9364SStefan Roese
42*f1df9364SStefan Roese return MV_OK;
43*f1df9364SStefan Roese }
44*f1df9364SStefan Roese
45*f1df9364SStefan Roese /*
46*f1df9364SStefan Roese * Centralization TX Flow
47*f1df9364SStefan Roese */
ddr3_tip_centralization_tx(u32 dev_num)48*f1df9364SStefan Roese int ddr3_tip_centralization_tx(u32 dev_num)
49*f1df9364SStefan Roese {
50*f1df9364SStefan Roese CHECK_STATUS(ddr3_tip_centralization(dev_num, CENTRAL_TX));
51*f1df9364SStefan Roese
52*f1df9364SStefan Roese return MV_OK;
53*f1df9364SStefan Roese }
54*f1df9364SStefan Roese
55*f1df9364SStefan Roese /*
56*f1df9364SStefan Roese * Centralization Flow
57*f1df9364SStefan Roese */
ddr3_tip_centralization(u32 dev_num,u32 mode)58*f1df9364SStefan Roese static int ddr3_tip_centralization(u32 dev_num, u32 mode)
59*f1df9364SStefan Roese {
60*f1df9364SStefan Roese enum hws_training_ip_stat training_result[MAX_INTERFACE_NUM];
61*f1df9364SStefan Roese u32 if_id, pattern_id, bit_id;
62*f1df9364SStefan Roese u8 bus_id;
63*f1df9364SStefan Roese u8 cur_start_win[BUS_WIDTH_IN_BITS];
64*f1df9364SStefan Roese u8 centralization_result[MAX_INTERFACE_NUM][BUS_WIDTH_IN_BITS];
65*f1df9364SStefan Roese u8 cur_end_win[BUS_WIDTH_IN_BITS];
66*f1df9364SStefan Roese u8 current_window[BUS_WIDTH_IN_BITS];
67*f1df9364SStefan Roese u8 opt_window, waste_window, start_window_skew, end_window_skew;
68*f1df9364SStefan Roese u8 final_pup_window[MAX_INTERFACE_NUM][BUS_WIDTH_IN_BITS];
69*f1df9364SStefan Roese struct hws_topology_map *tm = ddr3_get_topology_map();
70*f1df9364SStefan Roese enum hws_training_result result_type = RESULT_PER_BIT;
71*f1df9364SStefan Roese enum hws_dir direction;
72*f1df9364SStefan Roese u32 *result[HWS_SEARCH_DIR_LIMIT];
73*f1df9364SStefan Roese u32 reg_phy_off, reg;
74*f1df9364SStefan Roese u8 max_win_size;
75*f1df9364SStefan Roese int lock_success = 1;
76*f1df9364SStefan Roese u8 cur_end_win_min, cur_start_win_max;
77*f1df9364SStefan Roese u32 cs_enable_reg_val[MAX_INTERFACE_NUM];
78*f1df9364SStefan Roese int is_if_fail = 0;
79*f1df9364SStefan Roese enum hws_result *flow_result = ddr3_tip_get_result_ptr(training_stage);
80*f1df9364SStefan Roese u32 pup_win_length = 0;
81*f1df9364SStefan Roese enum hws_search_dir search_dir_id;
82*f1df9364SStefan Roese u8 cons_tap = (mode == CENTRAL_TX) ? (64) : (0);
83*f1df9364SStefan Roese
84*f1df9364SStefan Roese for (if_id = 0; if_id <= MAX_INTERFACE_NUM - 1; if_id++) {
85*f1df9364SStefan Roese VALIDATE_ACTIVE(tm->if_act_mask, if_id);
86*f1df9364SStefan Roese /* save current cs enable reg val */
87*f1df9364SStefan Roese CHECK_STATUS(ddr3_tip_if_read
88*f1df9364SStefan Roese (dev_num, ACCESS_TYPE_UNICAST, if_id,
89*f1df9364SStefan Roese CS_ENABLE_REG, cs_enable_reg_val, MASK_ALL_BITS));
90*f1df9364SStefan Roese /* enable single cs */
91*f1df9364SStefan Roese CHECK_STATUS(ddr3_tip_if_write
92*f1df9364SStefan Roese (dev_num, ACCESS_TYPE_UNICAST, if_id,
93*f1df9364SStefan Roese CS_ENABLE_REG, (1 << 3), (1 << 3)));
94*f1df9364SStefan Roese }
95*f1df9364SStefan Roese
96*f1df9364SStefan Roese if (mode == CENTRAL_TX) {
97*f1df9364SStefan Roese max_win_size = MAX_WINDOW_SIZE_TX;
98*f1df9364SStefan Roese reg_phy_off = WRITE_CENTRALIZATION_PHY_REG + (effective_cs * 4);
99*f1df9364SStefan Roese direction = OPER_WRITE;
100*f1df9364SStefan Roese } else {
101*f1df9364SStefan Roese max_win_size = MAX_WINDOW_SIZE_RX;
102*f1df9364SStefan Roese reg_phy_off = READ_CENTRALIZATION_PHY_REG + (effective_cs * 4);
103*f1df9364SStefan Roese direction = OPER_READ;
104*f1df9364SStefan Roese }
105*f1df9364SStefan Roese
106*f1df9364SStefan Roese /* DB initialization */
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 for (bus_id = 0;
110*f1df9364SStefan Roese bus_id < tm->num_of_bus_per_interface; bus_id++) {
111*f1df9364SStefan Roese VALIDATE_ACTIVE(tm->bus_act_mask, bus_id);
112*f1df9364SStefan Roese centralization_state[if_id][bus_id] = 0;
113*f1df9364SStefan Roese bus_end_window[mode][if_id][bus_id] =
114*f1df9364SStefan Roese (max_win_size - 1) + cons_tap;
115*f1df9364SStefan Roese bus_start_window[mode][if_id][bus_id] = 0;
116*f1df9364SStefan Roese centralization_result[if_id][bus_id] = 0;
117*f1df9364SStefan Roese }
118*f1df9364SStefan Roese }
119*f1df9364SStefan Roese
120*f1df9364SStefan Roese /* start flow */
121*f1df9364SStefan Roese for (pattern_id = start_pattern; pattern_id <= end_pattern;
122*f1df9364SStefan Roese pattern_id++) {
123*f1df9364SStefan Roese ddr3_tip_ip_training_wrapper(dev_num, ACCESS_TYPE_MULTICAST,
124*f1df9364SStefan Roese PARAM_NOT_CARE,
125*f1df9364SStefan Roese ACCESS_TYPE_MULTICAST,
126*f1df9364SStefan Roese PARAM_NOT_CARE, result_type,
127*f1df9364SStefan Roese HWS_CONTROL_ELEMENT_ADLL,
128*f1df9364SStefan Roese PARAM_NOT_CARE, direction,
129*f1df9364SStefan Roese tm->
130*f1df9364SStefan Roese if_act_mask, 0x0,
131*f1df9364SStefan Roese max_win_size - 1,
132*f1df9364SStefan Roese max_win_size - 1,
133*f1df9364SStefan Roese pattern_id, EDGE_FPF, CS_SINGLE,
134*f1df9364SStefan Roese PARAM_NOT_CARE, training_result);
135*f1df9364SStefan Roese
136*f1df9364SStefan Roese for (if_id = start_if; if_id <= end_if; if_id++) {
137*f1df9364SStefan Roese VALIDATE_ACTIVE(tm->if_act_mask, if_id);
138*f1df9364SStefan Roese for (bus_id = 0;
139*f1df9364SStefan Roese bus_id <= tm->num_of_bus_per_interface - 1;
140*f1df9364SStefan Roese bus_id++) {
141*f1df9364SStefan Roese VALIDATE_ACTIVE(tm->bus_act_mask, bus_id);
142*f1df9364SStefan Roese
143*f1df9364SStefan Roese for (search_dir_id = HWS_LOW2HIGH;
144*f1df9364SStefan Roese search_dir_id <= HWS_HIGH2LOW;
145*f1df9364SStefan Roese search_dir_id++) {
146*f1df9364SStefan Roese CHECK_STATUS
147*f1df9364SStefan Roese (ddr3_tip_read_training_result
148*f1df9364SStefan Roese (dev_num, if_id,
149*f1df9364SStefan Roese ACCESS_TYPE_UNICAST, bus_id,
150*f1df9364SStefan Roese ALL_BITS_PER_PUP,
151*f1df9364SStefan Roese search_dir_id,
152*f1df9364SStefan Roese direction, result_type,
153*f1df9364SStefan Roese TRAINING_LOAD_OPERATION_UNLOAD,
154*f1df9364SStefan Roese CS_SINGLE,
155*f1df9364SStefan Roese &result[search_dir_id],
156*f1df9364SStefan Roese 1, 0, 0));
157*f1df9364SStefan Roese DEBUG_CENTRALIZATION_ENGINE
158*f1df9364SStefan Roese (DEBUG_LEVEL_INFO,
159*f1df9364SStefan Roese ("%s pat %d IF %d pup %d Regs: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n",
160*f1df9364SStefan Roese ((mode ==
161*f1df9364SStefan Roese CENTRAL_TX) ? "TX" : "RX"),
162*f1df9364SStefan Roese pattern_id, if_id, bus_id,
163*f1df9364SStefan Roese result[search_dir_id][0],
164*f1df9364SStefan Roese result[search_dir_id][1],
165*f1df9364SStefan Roese result[search_dir_id][2],
166*f1df9364SStefan Roese result[search_dir_id][3],
167*f1df9364SStefan Roese result[search_dir_id][4],
168*f1df9364SStefan Roese result[search_dir_id][5],
169*f1df9364SStefan Roese result[search_dir_id][6],
170*f1df9364SStefan Roese result[search_dir_id][7]));
171*f1df9364SStefan Roese }
172*f1df9364SStefan Roese
173*f1df9364SStefan Roese for (bit_id = 0; bit_id < BUS_WIDTH_IN_BITS;
174*f1df9364SStefan Roese bit_id++) {
175*f1df9364SStefan Roese /* check if this code is valid for 2 edge, probably not :( */
176*f1df9364SStefan Roese cur_start_win[bit_id] =
177*f1df9364SStefan Roese GET_TAP_RESULT(result
178*f1df9364SStefan Roese [HWS_LOW2HIGH]
179*f1df9364SStefan Roese [bit_id],
180*f1df9364SStefan Roese EDGE_1);
181*f1df9364SStefan Roese cur_end_win[bit_id] =
182*f1df9364SStefan Roese GET_TAP_RESULT(result
183*f1df9364SStefan Roese [HWS_HIGH2LOW]
184*f1df9364SStefan Roese [bit_id],
185*f1df9364SStefan Roese EDGE_1);
186*f1df9364SStefan Roese /* window length */
187*f1df9364SStefan Roese current_window[bit_id] =
188*f1df9364SStefan Roese cur_end_win[bit_id] -
189*f1df9364SStefan Roese cur_start_win[bit_id] + 1;
190*f1df9364SStefan Roese DEBUG_CENTRALIZATION_ENGINE
191*f1df9364SStefan Roese (DEBUG_LEVEL_TRACE,
192*f1df9364SStefan Roese ("cs %x patern %d IF %d pup %d cur_start_win %d cur_end_win %d current_window %d\n",
193*f1df9364SStefan Roese effective_cs, pattern_id,
194*f1df9364SStefan Roese if_id, bus_id,
195*f1df9364SStefan Roese cur_start_win[bit_id],
196*f1df9364SStefan Roese cur_end_win[bit_id],
197*f1df9364SStefan Roese current_window[bit_id]));
198*f1df9364SStefan Roese }
199*f1df9364SStefan Roese
200*f1df9364SStefan Roese if ((ddr3_tip_is_pup_lock
201*f1df9364SStefan Roese (result[HWS_LOW2HIGH], result_type)) &&
202*f1df9364SStefan Roese (ddr3_tip_is_pup_lock
203*f1df9364SStefan Roese (result[HWS_HIGH2LOW], result_type))) {
204*f1df9364SStefan Roese /* read result success */
205*f1df9364SStefan Roese DEBUG_CENTRALIZATION_ENGINE
206*f1df9364SStefan Roese (DEBUG_LEVEL_INFO,
207*f1df9364SStefan Roese ("Pup locked, pat %d IF %d pup %d\n",
208*f1df9364SStefan Roese pattern_id, if_id, bus_id));
209*f1df9364SStefan Roese } else {
210*f1df9364SStefan Roese /* read result failure */
211*f1df9364SStefan Roese DEBUG_CENTRALIZATION_ENGINE
212*f1df9364SStefan Roese (DEBUG_LEVEL_INFO,
213*f1df9364SStefan Roese ("fail Lock, pat %d IF %d pup %d\n",
214*f1df9364SStefan Roese pattern_id, if_id, bus_id));
215*f1df9364SStefan Roese if (centralization_state[if_id][bus_id]
216*f1df9364SStefan Roese == 1) {
217*f1df9364SStefan Roese /* continue with next pup */
218*f1df9364SStefan Roese DEBUG_CENTRALIZATION_ENGINE
219*f1df9364SStefan Roese (DEBUG_LEVEL_TRACE,
220*f1df9364SStefan Roese ("continue to next pup %d %d\n",
221*f1df9364SStefan Roese if_id, bus_id));
222*f1df9364SStefan Roese continue;
223*f1df9364SStefan Roese }
224*f1df9364SStefan Roese
225*f1df9364SStefan Roese for (bit_id = 0;
226*f1df9364SStefan Roese bit_id < BUS_WIDTH_IN_BITS;
227*f1df9364SStefan Roese bit_id++) {
228*f1df9364SStefan Roese /*
229*f1df9364SStefan Roese * the next check is relevant
230*f1df9364SStefan Roese * only when using search
231*f1df9364SStefan Roese * machine 2 edges
232*f1df9364SStefan Roese */
233*f1df9364SStefan Roese if (cur_start_win[bit_id] > 0 &&
234*f1df9364SStefan Roese cur_end_win[bit_id] == 0) {
235*f1df9364SStefan Roese cur_end_win
236*f1df9364SStefan Roese [bit_id] =
237*f1df9364SStefan Roese max_win_size - 1;
238*f1df9364SStefan Roese DEBUG_CENTRALIZATION_ENGINE
239*f1df9364SStefan Roese (DEBUG_LEVEL_TRACE,
240*f1df9364SStefan Roese ("fail, IF %d pup %d bit %d fail #1\n",
241*f1df9364SStefan Roese if_id, bus_id,
242*f1df9364SStefan Roese bit_id));
243*f1df9364SStefan Roese /* the next bit */
244*f1df9364SStefan Roese continue;
245*f1df9364SStefan Roese } else {
246*f1df9364SStefan Roese centralization_state
247*f1df9364SStefan Roese [if_id][bus_id] = 1;
248*f1df9364SStefan Roese DEBUG_CENTRALIZATION_ENGINE
249*f1df9364SStefan Roese (DEBUG_LEVEL_TRACE,
250*f1df9364SStefan Roese ("fail, IF %d pup %d bit %d fail #2\n",
251*f1df9364SStefan Roese if_id, bus_id,
252*f1df9364SStefan Roese bit_id));
253*f1df9364SStefan Roese }
254*f1df9364SStefan Roese }
255*f1df9364SStefan Roese
256*f1df9364SStefan Roese if (centralization_state[if_id][bus_id]
257*f1df9364SStefan Roese == 1) {
258*f1df9364SStefan Roese /* going to next pup */
259*f1df9364SStefan Roese continue;
260*f1df9364SStefan Roese }
261*f1df9364SStefan Roese } /*bit */
262*f1df9364SStefan Roese
263*f1df9364SStefan Roese opt_window =
264*f1df9364SStefan Roese ddr3_tip_get_buf_min(current_window);
265*f1df9364SStefan Roese /* final pup window length */
266*f1df9364SStefan Roese final_pup_window[if_id][bus_id] =
267*f1df9364SStefan Roese ddr3_tip_get_buf_min(cur_end_win) -
268*f1df9364SStefan Roese ddr3_tip_get_buf_max(cur_start_win) +
269*f1df9364SStefan Roese 1;
270*f1df9364SStefan Roese waste_window =
271*f1df9364SStefan Roese opt_window -
272*f1df9364SStefan Roese final_pup_window[if_id][bus_id];
273*f1df9364SStefan Roese start_window_skew =
274*f1df9364SStefan Roese ddr3_tip_get_buf_max(cur_start_win) -
275*f1df9364SStefan Roese ddr3_tip_get_buf_min(
276*f1df9364SStefan Roese cur_start_win);
277*f1df9364SStefan Roese end_window_skew =
278*f1df9364SStefan Roese ddr3_tip_get_buf_max(
279*f1df9364SStefan Roese cur_end_win) -
280*f1df9364SStefan Roese ddr3_tip_get_buf_min(
281*f1df9364SStefan Roese cur_end_win);
282*f1df9364SStefan Roese /* min/max updated with pattern change */
283*f1df9364SStefan Roese cur_end_win_min =
284*f1df9364SStefan Roese ddr3_tip_get_buf_min(
285*f1df9364SStefan Roese cur_end_win);
286*f1df9364SStefan Roese cur_start_win_max =
287*f1df9364SStefan Roese ddr3_tip_get_buf_max(
288*f1df9364SStefan Roese cur_start_win);
289*f1df9364SStefan Roese bus_end_window[mode][if_id][bus_id] =
290*f1df9364SStefan Roese GET_MIN(bus_end_window[mode][if_id]
291*f1df9364SStefan Roese [bus_id],
292*f1df9364SStefan Roese cur_end_win_min);
293*f1df9364SStefan Roese bus_start_window[mode][if_id][bus_id] =
294*f1df9364SStefan Roese GET_MAX(bus_start_window[mode][if_id]
295*f1df9364SStefan Roese [bus_id],
296*f1df9364SStefan Roese cur_start_win_max);
297*f1df9364SStefan Roese DEBUG_CENTRALIZATION_ENGINE(
298*f1df9364SStefan Roese DEBUG_LEVEL_INFO,
299*f1df9364SStefan Roese ("pat %d IF %d pup %d opt_win %d final_win %d waste_win %d st_win_skew %d end_win_skew %d cur_st_win_max %d cur_end_win_min %d bus_st_win %d bus_end_win %d\n",
300*f1df9364SStefan Roese pattern_id, if_id, bus_id, opt_window,
301*f1df9364SStefan Roese final_pup_window[if_id][bus_id],
302*f1df9364SStefan Roese waste_window, start_window_skew,
303*f1df9364SStefan Roese end_window_skew,
304*f1df9364SStefan Roese cur_start_win_max,
305*f1df9364SStefan Roese cur_end_win_min,
306*f1df9364SStefan Roese bus_start_window[mode][if_id][bus_id],
307*f1df9364SStefan Roese bus_end_window[mode][if_id][bus_id]));
308*f1df9364SStefan Roese
309*f1df9364SStefan Roese /* check if window is valid */
310*f1df9364SStefan Roese if (ddr3_tip_centr_skip_min_win_check == 0) {
311*f1df9364SStefan Roese if ((VALIDATE_WIN_LENGTH
312*f1df9364SStefan Roese (bus_start_window[mode][if_id]
313*f1df9364SStefan Roese [bus_id],
314*f1df9364SStefan Roese bus_end_window[mode][if_id]
315*f1df9364SStefan Roese [bus_id],
316*f1df9364SStefan Roese max_win_size) == 1) ||
317*f1df9364SStefan Roese (IS_WINDOW_OUT_BOUNDARY
318*f1df9364SStefan Roese (bus_start_window[mode][if_id]
319*f1df9364SStefan Roese [bus_id],
320*f1df9364SStefan Roese bus_end_window[mode][if_id]
321*f1df9364SStefan Roese [bus_id],
322*f1df9364SStefan Roese max_win_size) == 1)) {
323*f1df9364SStefan Roese DEBUG_CENTRALIZATION_ENGINE
324*f1df9364SStefan Roese (DEBUG_LEVEL_INFO,
325*f1df9364SStefan Roese ("win valid, pat %d IF %d pup %d\n",
326*f1df9364SStefan Roese pattern_id, if_id,
327*f1df9364SStefan Roese bus_id));
328*f1df9364SStefan Roese /* window is valid */
329*f1df9364SStefan Roese } else {
330*f1df9364SStefan Roese DEBUG_CENTRALIZATION_ENGINE
331*f1df9364SStefan Roese (DEBUG_LEVEL_INFO,
332*f1df9364SStefan Roese ("fail win, pat %d IF %d pup %d bus_st_win %d bus_end_win %d\n",
333*f1df9364SStefan Roese pattern_id, if_id, bus_id,
334*f1df9364SStefan Roese bus_start_window[mode]
335*f1df9364SStefan Roese [if_id][bus_id],
336*f1df9364SStefan Roese bus_end_window[mode]
337*f1df9364SStefan Roese [if_id][bus_id]));
338*f1df9364SStefan Roese centralization_state[if_id]
339*f1df9364SStefan Roese [bus_id] = 1;
340*f1df9364SStefan Roese if (debug_mode == 0)
341*f1df9364SStefan Roese return MV_FAIL;
342*f1df9364SStefan Roese }
343*f1df9364SStefan Roese } /* ddr3_tip_centr_skip_min_win_check */
344*f1df9364SStefan Roese } /* pup */
345*f1df9364SStefan Roese } /* interface */
346*f1df9364SStefan Roese } /* pattern */
347*f1df9364SStefan Roese
348*f1df9364SStefan Roese for (if_id = start_if; if_id <= end_if; if_id++) {
349*f1df9364SStefan Roese if (IS_ACTIVE(tm->if_act_mask, if_id) == 0)
350*f1df9364SStefan Roese continue;
351*f1df9364SStefan Roese
352*f1df9364SStefan Roese is_if_fail = 0;
353*f1df9364SStefan Roese flow_result[if_id] = TEST_SUCCESS;
354*f1df9364SStefan Roese
355*f1df9364SStefan Roese for (bus_id = 0;
356*f1df9364SStefan Roese bus_id <= (tm->num_of_bus_per_interface - 1); bus_id++) {
357*f1df9364SStefan Roese VALIDATE_ACTIVE(tm->bus_act_mask, bus_id);
358*f1df9364SStefan Roese
359*f1df9364SStefan Roese /* continue only if lock */
360*f1df9364SStefan Roese if (centralization_state[if_id][bus_id] != 1) {
361*f1df9364SStefan Roese if (ddr3_tip_centr_skip_min_win_check == 0) {
362*f1df9364SStefan Roese if ((bus_end_window
363*f1df9364SStefan Roese [mode][if_id][bus_id] ==
364*f1df9364SStefan Roese (max_win_size - 1)) &&
365*f1df9364SStefan Roese ((bus_end_window
366*f1df9364SStefan Roese [mode][if_id][bus_id] -
367*f1df9364SStefan Roese bus_start_window[mode][if_id]
368*f1df9364SStefan Roese [bus_id]) < MIN_WINDOW_SIZE) &&
369*f1df9364SStefan Roese ((bus_end_window[mode][if_id]
370*f1df9364SStefan Roese [bus_id] - bus_start_window
371*f1df9364SStefan Roese [mode][if_id][bus_id]) > 2)) {
372*f1df9364SStefan Roese /* prevent false lock */
373*f1df9364SStefan Roese /* TBD change to enum */
374*f1df9364SStefan Roese centralization_state
375*f1df9364SStefan Roese [if_id][bus_id] = 2;
376*f1df9364SStefan Roese }
377*f1df9364SStefan Roese
378*f1df9364SStefan Roese if ((bus_end_window[mode][if_id][bus_id]
379*f1df9364SStefan Roese == 0) &&
380*f1df9364SStefan Roese ((bus_end_window[mode][if_id]
381*f1df9364SStefan Roese [bus_id] -
382*f1df9364SStefan Roese bus_start_window[mode][if_id]
383*f1df9364SStefan Roese [bus_id]) < MIN_WINDOW_SIZE) &&
384*f1df9364SStefan Roese ((bus_end_window[mode][if_id]
385*f1df9364SStefan Roese [bus_id] -
386*f1df9364SStefan Roese bus_start_window[mode][if_id]
387*f1df9364SStefan Roese [bus_id]) > 2))
388*f1df9364SStefan Roese /*prevent false lock */
389*f1df9364SStefan Roese centralization_state[if_id]
390*f1df9364SStefan Roese [bus_id] = 3;
391*f1df9364SStefan Roese }
392*f1df9364SStefan Roese
393*f1df9364SStefan Roese if ((bus_end_window[mode][if_id][bus_id] >
394*f1df9364SStefan Roese (max_win_size - 1)) && direction ==
395*f1df9364SStefan Roese OPER_WRITE) {
396*f1df9364SStefan Roese DEBUG_CENTRALIZATION_ENGINE
397*f1df9364SStefan Roese (DEBUG_LEVEL_INFO,
398*f1df9364SStefan Roese ("Tx special pattern\n"));
399*f1df9364SStefan Roese cons_tap = 64;
400*f1df9364SStefan Roese }
401*f1df9364SStefan Roese }
402*f1df9364SStefan Roese
403*f1df9364SStefan Roese /* check states */
404*f1df9364SStefan Roese if (centralization_state[if_id][bus_id] == 3) {
405*f1df9364SStefan Roese DEBUG_CENTRALIZATION_ENGINE(
406*f1df9364SStefan Roese DEBUG_LEVEL_INFO,
407*f1df9364SStefan Roese ("SSW - TBD IF %d pup %d\n",
408*f1df9364SStefan Roese if_id, bus_id));
409*f1df9364SStefan Roese lock_success = 1;
410*f1df9364SStefan Roese } else if (centralization_state[if_id][bus_id] == 2) {
411*f1df9364SStefan Roese DEBUG_CENTRALIZATION_ENGINE(
412*f1df9364SStefan Roese DEBUG_LEVEL_INFO,
413*f1df9364SStefan Roese ("SEW - TBD IF %d pup %d\n",
414*f1df9364SStefan Roese if_id, bus_id));
415*f1df9364SStefan Roese lock_success = 1;
416*f1df9364SStefan Roese } else if (centralization_state[if_id][bus_id] == 0) {
417*f1df9364SStefan Roese lock_success = 1;
418*f1df9364SStefan Roese } else {
419*f1df9364SStefan Roese DEBUG_CENTRALIZATION_ENGINE(
420*f1df9364SStefan Roese DEBUG_LEVEL_ERROR,
421*f1df9364SStefan Roese ("fail, IF %d pup %d\n",
422*f1df9364SStefan Roese if_id, bus_id));
423*f1df9364SStefan Roese lock_success = 0;
424*f1df9364SStefan Roese }
425*f1df9364SStefan Roese
426*f1df9364SStefan Roese if (lock_success == 1) {
427*f1df9364SStefan Roese centralization_result[if_id][bus_id] =
428*f1df9364SStefan Roese (bus_end_window[mode][if_id][bus_id] +
429*f1df9364SStefan Roese bus_start_window[mode][if_id][bus_id])
430*f1df9364SStefan Roese / 2 - cons_tap;
431*f1df9364SStefan Roese DEBUG_CENTRALIZATION_ENGINE(
432*f1df9364SStefan Roese DEBUG_LEVEL_TRACE,
433*f1df9364SStefan Roese (" bus_id %d Res= %d\n", bus_id,
434*f1df9364SStefan Roese centralization_result[if_id][bus_id]));
435*f1df9364SStefan Roese /* copy results to registers */
436*f1df9364SStefan Roese pup_win_length =
437*f1df9364SStefan Roese bus_end_window[mode][if_id][bus_id] -
438*f1df9364SStefan Roese bus_start_window[mode][if_id][bus_id] +
439*f1df9364SStefan Roese 1;
440*f1df9364SStefan Roese
441*f1df9364SStefan Roese ddr3_tip_bus_read(dev_num, if_id,
442*f1df9364SStefan Roese ACCESS_TYPE_UNICAST, bus_id,
443*f1df9364SStefan Roese DDR_PHY_DATA,
444*f1df9364SStefan Roese RESULT_DB_PHY_REG_ADDR +
445*f1df9364SStefan Roese effective_cs, ®);
446*f1df9364SStefan Roese reg = (reg & (~0x1f <<
447*f1df9364SStefan Roese ((mode == CENTRAL_TX) ?
448*f1df9364SStefan Roese (RESULT_DB_PHY_REG_TX_OFFSET) :
449*f1df9364SStefan Roese (RESULT_DB_PHY_REG_RX_OFFSET))))
450*f1df9364SStefan Roese | pup_win_length <<
451*f1df9364SStefan Roese ((mode == CENTRAL_TX) ?
452*f1df9364SStefan Roese (RESULT_DB_PHY_REG_TX_OFFSET) :
453*f1df9364SStefan Roese (RESULT_DB_PHY_REG_RX_OFFSET));
454*f1df9364SStefan Roese CHECK_STATUS(ddr3_tip_bus_write
455*f1df9364SStefan Roese (dev_num, ACCESS_TYPE_UNICAST,
456*f1df9364SStefan Roese if_id, ACCESS_TYPE_UNICAST,
457*f1df9364SStefan Roese bus_id, DDR_PHY_DATA,
458*f1df9364SStefan Roese RESULT_DB_PHY_REG_ADDR +
459*f1df9364SStefan Roese effective_cs, reg));
460*f1df9364SStefan Roese
461*f1df9364SStefan Roese /* offset per CS is calculated earlier */
462*f1df9364SStefan Roese CHECK_STATUS(
463*f1df9364SStefan Roese ddr3_tip_bus_write(dev_num,
464*f1df9364SStefan Roese ACCESS_TYPE_UNICAST,
465*f1df9364SStefan Roese if_id,
466*f1df9364SStefan Roese ACCESS_TYPE_UNICAST,
467*f1df9364SStefan Roese bus_id,
468*f1df9364SStefan Roese DDR_PHY_DATA,
469*f1df9364SStefan Roese reg_phy_off,
470*f1df9364SStefan Roese centralization_result
471*f1df9364SStefan Roese [if_id]
472*f1df9364SStefan Roese [bus_id]));
473*f1df9364SStefan Roese } else {
474*f1df9364SStefan Roese is_if_fail = 1;
475*f1df9364SStefan Roese }
476*f1df9364SStefan Roese }
477*f1df9364SStefan Roese
478*f1df9364SStefan Roese if (is_if_fail == 1)
479*f1df9364SStefan Roese flow_result[if_id] = TEST_FAILED;
480*f1df9364SStefan Roese }
481*f1df9364SStefan Roese
482*f1df9364SStefan Roese for (if_id = 0; if_id <= MAX_INTERFACE_NUM - 1; if_id++) {
483*f1df9364SStefan Roese /* restore cs enable value */
484*f1df9364SStefan Roese VALIDATE_ACTIVE(tm->if_act_mask, if_id);
485*f1df9364SStefan Roese CHECK_STATUS(ddr3_tip_if_write(dev_num, ACCESS_TYPE_UNICAST,
486*f1df9364SStefan Roese if_id, CS_ENABLE_REG,
487*f1df9364SStefan Roese cs_enable_reg_val[if_id],
488*f1df9364SStefan Roese MASK_ALL_BITS));
489*f1df9364SStefan Roese }
490*f1df9364SStefan Roese
491*f1df9364SStefan Roese return is_if_fail;
492*f1df9364SStefan Roese }
493*f1df9364SStefan Roese
494*f1df9364SStefan Roese /*
495*f1df9364SStefan Roese * Centralization Flow
496*f1df9364SStefan Roese */
ddr3_tip_special_rx(u32 dev_num)497*f1df9364SStefan Roese int ddr3_tip_special_rx(u32 dev_num)
498*f1df9364SStefan Roese {
499*f1df9364SStefan Roese enum hws_training_ip_stat training_result[MAX_INTERFACE_NUM];
500*f1df9364SStefan Roese u32 if_id, pup_id, pattern_id, bit_id;
501*f1df9364SStefan Roese u8 cur_start_win[BUS_WIDTH_IN_BITS];
502*f1df9364SStefan Roese u8 cur_end_win[BUS_WIDTH_IN_BITS];
503*f1df9364SStefan Roese enum hws_training_result result_type = RESULT_PER_BIT;
504*f1df9364SStefan Roese enum hws_dir direction;
505*f1df9364SStefan Roese enum hws_search_dir search_dir_id;
506*f1df9364SStefan Roese u32 *result[HWS_SEARCH_DIR_LIMIT];
507*f1df9364SStefan Roese u32 max_win_size;
508*f1df9364SStefan Roese u8 cur_end_win_min, cur_start_win_max;
509*f1df9364SStefan Roese u32 cs_enable_reg_val[MAX_INTERFACE_NUM];
510*f1df9364SStefan Roese u32 temp = 0;
511*f1df9364SStefan Roese int pad_num = 0;
512*f1df9364SStefan Roese struct hws_topology_map *tm = ddr3_get_topology_map();
513*f1df9364SStefan Roese
514*f1df9364SStefan Roese if (ddr3_tip_special_rx_run_once_flag != 0)
515*f1df9364SStefan Roese return MV_OK;
516*f1df9364SStefan Roese
517*f1df9364SStefan Roese ddr3_tip_special_rx_run_once_flag = 1;
518*f1df9364SStefan Roese
519*f1df9364SStefan Roese for (if_id = 0; if_id < MAX_INTERFACE_NUM; if_id++) {
520*f1df9364SStefan Roese VALIDATE_ACTIVE(tm->if_act_mask, if_id);
521*f1df9364SStefan Roese /* save current cs enable reg val */
522*f1df9364SStefan Roese CHECK_STATUS(ddr3_tip_if_read(dev_num, ACCESS_TYPE_UNICAST,
523*f1df9364SStefan Roese if_id, CS_ENABLE_REG,
524*f1df9364SStefan Roese cs_enable_reg_val,
525*f1df9364SStefan Roese MASK_ALL_BITS));
526*f1df9364SStefan Roese /* enable single cs */
527*f1df9364SStefan Roese CHECK_STATUS(ddr3_tip_if_write(dev_num, ACCESS_TYPE_UNICAST,
528*f1df9364SStefan Roese if_id, CS_ENABLE_REG,
529*f1df9364SStefan Roese (1 << 3), (1 << 3)));
530*f1df9364SStefan Roese }
531*f1df9364SStefan Roese
532*f1df9364SStefan Roese max_win_size = MAX_WINDOW_SIZE_RX;
533*f1df9364SStefan Roese direction = OPER_READ;
534*f1df9364SStefan Roese pattern_id = PATTERN_VREF;
535*f1df9364SStefan Roese
536*f1df9364SStefan Roese /* start flow */
537*f1df9364SStefan Roese ddr3_tip_ip_training_wrapper(dev_num, ACCESS_TYPE_MULTICAST,
538*f1df9364SStefan Roese PARAM_NOT_CARE, ACCESS_TYPE_MULTICAST,
539*f1df9364SStefan Roese PARAM_NOT_CARE, result_type,
540*f1df9364SStefan Roese HWS_CONTROL_ELEMENT_ADLL,
541*f1df9364SStefan Roese PARAM_NOT_CARE, direction,
542*f1df9364SStefan Roese tm->if_act_mask, 0x0,
543*f1df9364SStefan Roese max_win_size - 1, max_win_size - 1,
544*f1df9364SStefan Roese pattern_id, EDGE_FPF, CS_SINGLE,
545*f1df9364SStefan Roese PARAM_NOT_CARE, training_result);
546*f1df9364SStefan Roese
547*f1df9364SStefan Roese for (if_id = start_if; if_id <= end_if; if_id++) {
548*f1df9364SStefan Roese VALIDATE_ACTIVE(tm->if_act_mask, if_id);
549*f1df9364SStefan Roese for (pup_id = 0;
550*f1df9364SStefan Roese pup_id <= tm->num_of_bus_per_interface; pup_id++) {
551*f1df9364SStefan Roese VALIDATE_ACTIVE(tm->bus_act_mask, pup_id);
552*f1df9364SStefan Roese
553*f1df9364SStefan Roese for (search_dir_id = HWS_LOW2HIGH;
554*f1df9364SStefan Roese search_dir_id <= HWS_HIGH2LOW;
555*f1df9364SStefan Roese search_dir_id++) {
556*f1df9364SStefan Roese CHECK_STATUS(ddr3_tip_read_training_result
557*f1df9364SStefan Roese (dev_num, if_id,
558*f1df9364SStefan Roese ACCESS_TYPE_UNICAST, pup_id,
559*f1df9364SStefan Roese ALL_BITS_PER_PUP, search_dir_id,
560*f1df9364SStefan Roese direction, result_type,
561*f1df9364SStefan Roese TRAINING_LOAD_OPERATION_UNLOAD,
562*f1df9364SStefan Roese CS_SINGLE, &result[search_dir_id],
563*f1df9364SStefan Roese 1, 0, 0));
564*f1df9364SStefan Roese DEBUG_CENTRALIZATION_ENGINE(DEBUG_LEVEL_INFO,
565*f1df9364SStefan Roese ("Special: pat %d IF %d pup %d Regs: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n",
566*f1df9364SStefan Roese pattern_id, if_id,
567*f1df9364SStefan Roese pup_id,
568*f1df9364SStefan Roese result
569*f1df9364SStefan Roese [search_dir_id][0],
570*f1df9364SStefan Roese result
571*f1df9364SStefan Roese [search_dir_id][1],
572*f1df9364SStefan Roese result
573*f1df9364SStefan Roese [search_dir_id][2],
574*f1df9364SStefan Roese result
575*f1df9364SStefan Roese [search_dir_id][3],
576*f1df9364SStefan Roese result
577*f1df9364SStefan Roese [search_dir_id][4],
578*f1df9364SStefan Roese result
579*f1df9364SStefan Roese [search_dir_id][5],
580*f1df9364SStefan Roese result
581*f1df9364SStefan Roese [search_dir_id][6],
582*f1df9364SStefan Roese result
583*f1df9364SStefan Roese [search_dir_id]
584*f1df9364SStefan Roese [7]));
585*f1df9364SStefan Roese }
586*f1df9364SStefan Roese
587*f1df9364SStefan Roese for (bit_id = 0; bit_id < BUS_WIDTH_IN_BITS; bit_id++) {
588*f1df9364SStefan Roese /*
589*f1df9364SStefan Roese * check if this code is valid for 2 edge,
590*f1df9364SStefan Roese * probably not :(
591*f1df9364SStefan Roese */
592*f1df9364SStefan Roese cur_start_win[bit_id] =
593*f1df9364SStefan Roese GET_TAP_RESULT(result[HWS_LOW2HIGH]
594*f1df9364SStefan Roese [bit_id], EDGE_1);
595*f1df9364SStefan Roese cur_end_win[bit_id] =
596*f1df9364SStefan Roese GET_TAP_RESULT(result[HWS_HIGH2LOW]
597*f1df9364SStefan Roese [bit_id], EDGE_1);
598*f1df9364SStefan Roese }
599*f1df9364SStefan Roese if (!((ddr3_tip_is_pup_lock
600*f1df9364SStefan Roese (result[HWS_LOW2HIGH], result_type)) &&
601*f1df9364SStefan Roese (ddr3_tip_is_pup_lock
602*f1df9364SStefan Roese (result[HWS_HIGH2LOW], result_type)))) {
603*f1df9364SStefan Roese DEBUG_CENTRALIZATION_ENGINE(
604*f1df9364SStefan Roese DEBUG_LEVEL_ERROR,
605*f1df9364SStefan Roese ("Special: Pup lock fail, pat %d IF %d pup %d\n",
606*f1df9364SStefan Roese pattern_id, if_id, pup_id));
607*f1df9364SStefan Roese return MV_FAIL;
608*f1df9364SStefan Roese }
609*f1df9364SStefan Roese
610*f1df9364SStefan Roese cur_end_win_min =
611*f1df9364SStefan Roese ddr3_tip_get_buf_min(cur_end_win);
612*f1df9364SStefan Roese cur_start_win_max =
613*f1df9364SStefan Roese ddr3_tip_get_buf_max(cur_start_win);
614*f1df9364SStefan Roese
615*f1df9364SStefan Roese if (cur_start_win_max <= 1) { /* Align left */
616*f1df9364SStefan Roese for (bit_id = 0; bit_id < BUS_WIDTH_IN_BITS;
617*f1df9364SStefan Roese bit_id++) {
618*f1df9364SStefan Roese pad_num =
619*f1df9364SStefan Roese dq_map_table[bit_id +
620*f1df9364SStefan Roese pup_id *
621*f1df9364SStefan Roese BUS_WIDTH_IN_BITS +
622*f1df9364SStefan Roese if_id *
623*f1df9364SStefan Roese BUS_WIDTH_IN_BITS *
624*f1df9364SStefan Roese tm->
625*f1df9364SStefan Roese num_of_bus_per_interface];
626*f1df9364SStefan Roese CHECK_STATUS(ddr3_tip_bus_read
627*f1df9364SStefan Roese (dev_num, if_id,
628*f1df9364SStefan Roese ACCESS_TYPE_UNICAST,
629*f1df9364SStefan Roese pup_id, DDR_PHY_DATA,
630*f1df9364SStefan Roese PBS_RX_PHY_REG + pad_num,
631*f1df9364SStefan Roese &temp));
632*f1df9364SStefan Roese temp = (temp + 0xa > 31) ?
633*f1df9364SStefan Roese (31) : (temp + 0xa);
634*f1df9364SStefan Roese CHECK_STATUS(ddr3_tip_bus_write
635*f1df9364SStefan Roese (dev_num,
636*f1df9364SStefan Roese ACCESS_TYPE_UNICAST,
637*f1df9364SStefan Roese if_id,
638*f1df9364SStefan Roese ACCESS_TYPE_UNICAST,
639*f1df9364SStefan Roese pup_id, DDR_PHY_DATA,
640*f1df9364SStefan Roese PBS_RX_PHY_REG + pad_num,
641*f1df9364SStefan Roese temp));
642*f1df9364SStefan Roese }
643*f1df9364SStefan Roese DEBUG_CENTRALIZATION_ENGINE(
644*f1df9364SStefan Roese DEBUG_LEVEL_INFO,
645*f1df9364SStefan Roese ("Special: PBS:: I/F# %d , Bus# %d fix align to the Left\n",
646*f1df9364SStefan Roese if_id, pup_id));
647*f1df9364SStefan Roese }
648*f1df9364SStefan Roese
649*f1df9364SStefan Roese if (cur_end_win_min > 30) { /* Align right */
650*f1df9364SStefan Roese CHECK_STATUS(ddr3_tip_bus_read
651*f1df9364SStefan Roese (dev_num, if_id,
652*f1df9364SStefan Roese ACCESS_TYPE_UNICAST, pup_id,
653*f1df9364SStefan Roese DDR_PHY_DATA, PBS_RX_PHY_REG + 4,
654*f1df9364SStefan Roese &temp));
655*f1df9364SStefan Roese temp += 0xa;
656*f1df9364SStefan Roese CHECK_STATUS(ddr3_tip_bus_write
657*f1df9364SStefan Roese (dev_num, ACCESS_TYPE_UNICAST,
658*f1df9364SStefan Roese if_id, ACCESS_TYPE_UNICAST,
659*f1df9364SStefan Roese pup_id, DDR_PHY_DATA,
660*f1df9364SStefan Roese PBS_RX_PHY_REG + 4, temp));
661*f1df9364SStefan Roese CHECK_STATUS(ddr3_tip_bus_read
662*f1df9364SStefan Roese (dev_num, if_id,
663*f1df9364SStefan Roese ACCESS_TYPE_UNICAST, pup_id,
664*f1df9364SStefan Roese DDR_PHY_DATA, PBS_RX_PHY_REG + 5,
665*f1df9364SStefan Roese &temp));
666*f1df9364SStefan Roese temp += 0xa;
667*f1df9364SStefan Roese CHECK_STATUS(ddr3_tip_bus_write
668*f1df9364SStefan Roese (dev_num, ACCESS_TYPE_UNICAST,
669*f1df9364SStefan Roese if_id, ACCESS_TYPE_UNICAST,
670*f1df9364SStefan Roese pup_id, DDR_PHY_DATA,
671*f1df9364SStefan Roese PBS_RX_PHY_REG + 5, temp));
672*f1df9364SStefan Roese DEBUG_CENTRALIZATION_ENGINE(
673*f1df9364SStefan Roese DEBUG_LEVEL_INFO,
674*f1df9364SStefan Roese ("Special: PBS:: I/F# %d , Bus# %d fix align to the right\n",
675*f1df9364SStefan Roese if_id, pup_id));
676*f1df9364SStefan Roese }
677*f1df9364SStefan Roese
678*f1df9364SStefan Roese vref_window_size[if_id][pup_id] =
679*f1df9364SStefan Roese cur_end_win_min -
680*f1df9364SStefan Roese cur_start_win_max + 1;
681*f1df9364SStefan Roese DEBUG_CENTRALIZATION_ENGINE(
682*f1df9364SStefan Roese DEBUG_LEVEL_INFO,
683*f1df9364SStefan Roese ("Special: Winsize I/F# %d , Bus# %d is %d\n",
684*f1df9364SStefan Roese if_id, pup_id, vref_window_size
685*f1df9364SStefan Roese [if_id][pup_id]));
686*f1df9364SStefan Roese } /* pup */
687*f1df9364SStefan Roese } /* end of interface */
688*f1df9364SStefan Roese
689*f1df9364SStefan Roese return MV_OK;
690*f1df9364SStefan Roese }
691*f1df9364SStefan Roese
692*f1df9364SStefan Roese /*
693*f1df9364SStefan Roese * Print Centralization Result
694*f1df9364SStefan Roese */
ddr3_tip_print_centralization_result(u32 dev_num)695*f1df9364SStefan Roese int ddr3_tip_print_centralization_result(u32 dev_num)
696*f1df9364SStefan Roese {
697*f1df9364SStefan Roese u32 if_id = 0, bus_id = 0;
698*f1df9364SStefan Roese struct hws_topology_map *tm = ddr3_get_topology_map();
699*f1df9364SStefan Roese
700*f1df9364SStefan Roese printf("Centralization Results\n");
701*f1df9364SStefan Roese printf("I/F0 Result[0 - success 1-fail 2 - state_2 3 - state_3] ...\n");
702*f1df9364SStefan Roese for (if_id = 0; if_id <= MAX_INTERFACE_NUM - 1; if_id++) {
703*f1df9364SStefan Roese VALIDATE_ACTIVE(tm->if_act_mask, if_id);
704*f1df9364SStefan Roese for (bus_id = 0; bus_id < tm->num_of_bus_per_interface;
705*f1df9364SStefan Roese bus_id++) {
706*f1df9364SStefan Roese VALIDATE_ACTIVE(tm->bus_act_mask, bus_id);
707*f1df9364SStefan Roese printf("%d ,\n", centralization_state[if_id][bus_id]);
708*f1df9364SStefan Roese }
709*f1df9364SStefan Roese }
710*f1df9364SStefan Roese
711*f1df9364SStefan Roese return MV_OK;
712*f1df9364SStefan Roese }
713