blob: 2b4a58fb9fcc2b5bc9b1fb8c2560f231afa19337 [file] [log] [blame]
Stefan Roese5ffceb82015-03-26 15:36:56 +01001/*
2 * Copyright (C) Marvell International Ltd. and its affiliates
3 *
4 * SPDX-License-Identifier: GPL-2.0
5 */
6
7#include <common.h>
8#include <spl.h>
9#include <asm/io.h>
10#include <asm/arch/cpu.h>
11#include <asm/arch/soc.h>
12
13#include "ddr3_init.h"
14
15#define TYPICAL_PBS_VALUE 12
16
17u32 nominal_adll[MAX_INTERFACE_NUM * MAX_BUS_NUM];
18enum hws_training_ip_stat train_status[MAX_INTERFACE_NUM];
19u8 result_mat[MAX_INTERFACE_NUM][MAX_BUS_NUM][BUS_WIDTH_IN_BITS];
20u8 result_mat_rx_dqs[MAX_INTERFACE_NUM][MAX_BUS_NUM][MAX_CS_NUM];
21/* 4-EEWA, 3-EWA, 2-SWA, 1-Fail, 0-Pass */
22u8 result_all_bit[MAX_BUS_NUM * BUS_WIDTH_IN_BITS * MAX_INTERFACE_NUM];
23u8 max_pbs_per_pup[MAX_INTERFACE_NUM][MAX_BUS_NUM];
24u8 min_pbs_per_pup[MAX_INTERFACE_NUM][MAX_BUS_NUM];
25u8 max_adll_per_pup[MAX_INTERFACE_NUM][MAX_BUS_NUM];
26u8 min_adll_per_pup[MAX_INTERFACE_NUM][MAX_BUS_NUM];
27u32 pbsdelay_per_pup[NUM_OF_PBS_MODES][MAX_INTERFACE_NUM][MAX_BUS_NUM];
28u8 adll_shift_lock[MAX_INTERFACE_NUM][MAX_BUS_NUM];
29u8 adll_shift_val[MAX_INTERFACE_NUM][MAX_BUS_NUM];
30enum hws_pattern pbs_pattern = PATTERN_VREF;
31static u8 pup_state[MAX_INTERFACE_NUM][MAX_BUS_NUM];
32
33/*
34 * Name: ddr3_tip_pbs
35 * Desc: PBS
36 * Args: TBD
37 * Notes:
38 * Returns: OK if success, other error code if fail.
39 */
40int ddr3_tip_pbs(u32 dev_num, enum pbs_dir pbs_mode)
41{
42 u32 res0[MAX_INTERFACE_NUM];
43 int adll_tap = MEGA / freq_val[medium_freq] / 64;
44 int pad_num = 0;
45 enum hws_search_dir search_dir =
46 (pbs_mode == PBS_RX_MODE) ? HWS_HIGH2LOW : HWS_LOW2HIGH;
47 enum hws_dir dir = (pbs_mode == PBS_RX_MODE) ? OPER_READ : OPER_WRITE;
48 int iterations = (pbs_mode == PBS_RX_MODE) ? 31 : 63;
49 u32 res_valid_mask = (pbs_mode == PBS_RX_MODE) ? 0x1f : 0x3f;
50 int init_val = (search_dir == HWS_LOW2HIGH) ? 0 : iterations;
51 enum hws_edge_compare search_edge = EDGE_FP;
52 u32 pup = 0, bit = 0, if_id = 0, all_lock = 0, cs_num = 0;
53 int reg_addr = 0;
54 u32 validation_val = 0;
55 u32 cs_enable_reg_val[MAX_INTERFACE_NUM];
56 u16 *mask_results_dq_reg_map = ddr3_tip_get_mask_results_dq_reg();
57 u8 temp = 0;
58 struct hws_topology_map *tm = ddr3_get_topology_map();
59
60 /* save current cs enable reg val */
61 for (if_id = 0; if_id <= MAX_INTERFACE_NUM - 1; if_id++) {
62 VALIDATE_ACTIVE(tm->if_act_mask, if_id);
63
64 /* save current cs enable reg val */
65 CHECK_STATUS(ddr3_tip_if_read
66 (dev_num, ACCESS_TYPE_UNICAST, if_id,
67 CS_ENABLE_REG, cs_enable_reg_val, MASK_ALL_BITS));
68
69 /* enable single cs */
70 CHECK_STATUS(ddr3_tip_if_write
71 (dev_num, ACCESS_TYPE_UNICAST, if_id,
72 CS_ENABLE_REG, (1 << 3), (1 << 3)));
73 }
74
75 reg_addr = (pbs_mode == PBS_RX_MODE) ?
76 (READ_CENTRALIZATION_PHY_REG +
77 (effective_cs * CS_REGISTER_ADDR_OFFSET)) :
78 (WRITE_CENTRALIZATION_PHY_REG +
79 (effective_cs * CS_REGISTER_ADDR_OFFSET));
80 read_adll_value(nominal_adll, reg_addr, MASK_ALL_BITS);
81
82 /* stage 1 shift ADLL */
83 ddr3_tip_ip_training(dev_num, ACCESS_TYPE_MULTICAST,
84 PARAM_NOT_CARE, ACCESS_TYPE_MULTICAST,
85 PARAM_NOT_CARE, RESULT_PER_BIT,
86 HWS_CONTROL_ELEMENT_ADLL, search_dir, dir,
87 tm->if_act_mask, init_val, iterations,
88 pbs_pattern, search_edge, CS_SINGLE, cs_num,
89 train_status);
90 validation_val = (pbs_mode == PBS_RX_MODE) ? 0x1f : 0;
91 for (pup = 0; pup < tm->num_of_bus_per_interface; pup++) {
92 VALIDATE_ACTIVE(tm->bus_act_mask, pup);
93 for (if_id = 0; if_id <= MAX_INTERFACE_NUM - 1; if_id++) {
94 VALIDATE_ACTIVE(tm->if_act_mask, if_id);
95 min_adll_per_pup[if_id][pup] =
96 (pbs_mode == PBS_RX_MODE) ? 0x1f : 0x3f;
97 pup_state[if_id][pup] = 0x3;
98 adll_shift_lock[if_id][pup] = 1;
99 max_adll_per_pup[if_id][pup] = 0x0;
100 }
101 }
102
103 /* EBA */
104 for (pup = 0; pup < tm->num_of_bus_per_interface; pup++) {
105 VALIDATE_ACTIVE(tm->bus_act_mask, pup);
106 for (bit = 0; bit < BUS_WIDTH_IN_BITS; bit++) {
107 CHECK_STATUS(ddr3_tip_if_read
108 (dev_num, ACCESS_TYPE_MULTICAST,
109 PARAM_NOT_CARE,
110 mask_results_dq_reg_map[
111 bit + pup * BUS_WIDTH_IN_BITS],
112 res0, MASK_ALL_BITS));
113 for (if_id = 0; if_id <= MAX_INTERFACE_NUM - 1;
114 if_id++) {
115 VALIDATE_ACTIVE(tm->if_act_mask, if_id);
116 DEBUG_PBS_ENGINE(DEBUG_LEVEL_TRACE,
117 ("FP I/F %d, bit:%d, pup:%d res0 0x%x\n",
118 if_id, bit, pup,
119 res0[if_id]));
120 if (pup_state[if_id][pup] != 3)
121 continue;
122 /* if not EBA state than move to next pup */
123
124 if ((res0[if_id] & 0x2000000) == 0) {
125 DEBUG_PBS_ENGINE(DEBUG_LEVEL_TRACE,
126 ("-- Fail Training IP\n"));
127 /* training machine failed */
128 pup_state[if_id][pup] = 1;
129 adll_shift_lock[if_id][pup] = 0;
130 continue;
131 }
132
133 else if ((res0[if_id] & res_valid_mask) ==
134 validation_val) {
135 DEBUG_PBS_ENGINE(DEBUG_LEVEL_TRACE,
136 ("-- FAIL EBA %d %d %d %d\n",
137 if_id, bit, pup,
138 res0[if_id]));
139 pup_state[if_id][pup] = 4;
140 /* this pup move to EEBA */
141 adll_shift_lock[if_id][pup] = 0;
142 continue;
143 } else {
144 /*
145 * The search ended in Pass we need
146 * Fail
147 */
148 res0[if_id] =
149 (pbs_mode == PBS_RX_MODE) ?
150 ((res0[if_id] &
151 res_valid_mask) + 1) :
152 ((res0[if_id] &
153 res_valid_mask) - 1);
154 max_adll_per_pup[if_id][pup] =
155 (max_adll_per_pup[if_id][pup] <
156 res0[if_id]) ?
157 (u8)res0[if_id] :
158 max_adll_per_pup[if_id][pup];
159 min_adll_per_pup[if_id][pup] =
160 (res0[if_id] >
161 min_adll_per_pup[if_id][pup]) ?
162 min_adll_per_pup[if_id][pup] :
163 (u8)
164 res0[if_id];
165 /*
166 * vs the Rx we are searching for the
167 * smallest value of DQ shift so all
168 * Bus would fail
169 */
170 adll_shift_val[if_id][pup] =
171 (pbs_mode == PBS_RX_MODE) ?
172 max_adll_per_pup[if_id][pup] :
173 min_adll_per_pup[if_id][pup];
174 }
175 }
176 }
177 }
178
179 /* EEBA */
180 for (pup = 0; pup < tm->num_of_bus_per_interface; pup++) {
181 VALIDATE_ACTIVE(tm->bus_act_mask, pup);
182 for (if_id = 0; if_id <= MAX_INTERFACE_NUM - 1; if_id++) {
183 VALIDATE_ACTIVE(tm->if_act_mask, if_id);
184
185 if (pup_state[if_id][pup] != 4)
186 continue;
187 /*
188 * if pup state different from EEBA than move to
189 * next pup
190 */
191 reg_addr = (pbs_mode == PBS_RX_MODE) ?
192 (0x54 + effective_cs * 0x10) :
193 (0x14 + effective_cs * 0x10);
194 CHECK_STATUS(ddr3_tip_bus_write
195 (dev_num, ACCESS_TYPE_UNICAST, if_id,
196 ACCESS_TYPE_UNICAST, pup, DDR_PHY_DATA,
197 reg_addr, 0x1f));
198 reg_addr = (pbs_mode == PBS_RX_MODE) ?
199 (0x55 + effective_cs * 0x10) :
200 (0x15 + effective_cs * 0x10);
201 CHECK_STATUS(ddr3_tip_bus_write
202 (dev_num, ACCESS_TYPE_UNICAST, if_id,
203 ACCESS_TYPE_UNICAST, pup, DDR_PHY_DATA,
204 reg_addr, 0x1f));
205 /* initialize the Edge2 Max. */
206 adll_shift_val[if_id][pup] = 0;
207 min_adll_per_pup[if_id][pup] =
208 (pbs_mode == PBS_RX_MODE) ? 0x1f : 0x3f;
209 max_adll_per_pup[if_id][pup] = 0x0;
210
211 ddr3_tip_ip_training(dev_num, ACCESS_TYPE_MULTICAST,
212 PARAM_NOT_CARE,
213 ACCESS_TYPE_MULTICAST,
214 PARAM_NOT_CARE, RESULT_PER_BIT,
215 HWS_CONTROL_ELEMENT_ADLL,
216 search_dir, dir,
217 tm->if_act_mask, init_val,
218 iterations, pbs_pattern,
219 search_edge, CS_SINGLE, cs_num,
220 train_status);
221 DEBUG_PBS_ENGINE(DEBUG_LEVEL_INFO,
222 ("ADLL shift results:\n"));
223
224 for (bit = 0; bit < BUS_WIDTH_IN_BITS; bit++) {
225 CHECK_STATUS(ddr3_tip_if_read
226 (dev_num, ACCESS_TYPE_MULTICAST,
227 PARAM_NOT_CARE,
228 mask_results_dq_reg_map[
229 bit + pup *
230 BUS_WIDTH_IN_BITS],
231 res0, MASK_ALL_BITS));
232 DEBUG_PBS_ENGINE(DEBUG_LEVEL_TRACE,
233 ("FP I/F %d, bit:%d, pup:%d res0 0x%x\n",
234 if_id, bit, pup,
235 res0[if_id]));
236
237 if ((res0[if_id] & 0x2000000) == 0) {
238 DEBUG_PBS_ENGINE(DEBUG_LEVEL_TRACE,
239 (" -- EEBA Fail\n"));
240 bit = BUS_WIDTH_IN_BITS;
241 /* exit bit loop */
242 DEBUG_PBS_ENGINE(DEBUG_LEVEL_TRACE,
243 ("-- EEBA Fail Training IP\n"));
244 /*
245 * training machine failed but pass
246 * before in the EBA so maybe the DQS
247 * shift change env.
248 */
249 pup_state[if_id][pup] = 2;
250 adll_shift_lock[if_id][pup] = 0;
251 reg_addr = (pbs_mode == PBS_RX_MODE) ?
252 (0x54 + effective_cs * 0x10) :
253 (0x14 + effective_cs * 0x10);
254 CHECK_STATUS(ddr3_tip_bus_write
255 (dev_num,
256 ACCESS_TYPE_UNICAST,
257 if_id,
258 ACCESS_TYPE_UNICAST, pup,
259 DDR_PHY_DATA, reg_addr,
260 0x0));
261 reg_addr = (pbs_mode == PBS_RX_MODE) ?
262 (0x55 + effective_cs * 0x10) :
263 (0x15 + effective_cs * 0x10);
264 CHECK_STATUS(ddr3_tip_bus_write
265 (dev_num,
266 ACCESS_TYPE_UNICAST,
267 if_id,
268 ACCESS_TYPE_UNICAST, pup,
269 DDR_PHY_DATA, reg_addr,
270 0x0));
271 continue;
272 } else if ((res0[if_id] & res_valid_mask) ==
273 validation_val) {
274 /* exit bit loop */
275 bit = BUS_WIDTH_IN_BITS;
276 DEBUG_PBS_ENGINE(DEBUG_LEVEL_TRACE,
277 ("-- FAIL EEBA\n"));
278 /* this pup move to SBA */
279 pup_state[if_id][pup] = 2;
280 adll_shift_lock[if_id][pup] = 0;
281 reg_addr = (pbs_mode == PBS_RX_MODE) ?
282 (0x54 + effective_cs * 0x10) :
283 (0x14 + effective_cs * 0x10);
284 CHECK_STATUS(ddr3_tip_bus_write
285 (dev_num,
286 ACCESS_TYPE_UNICAST,
287 if_id,
288 ACCESS_TYPE_UNICAST, pup,
289 DDR_PHY_DATA, reg_addr,
290 0x0));
291 reg_addr = (pbs_mode == PBS_RX_MODE) ?
292 (0x55 + effective_cs * 0x10) :
293 (0x15 + effective_cs * 0x10);
294 CHECK_STATUS(ddr3_tip_bus_write
295 (dev_num,
296 ACCESS_TYPE_UNICAST,
297 if_id,
298 ACCESS_TYPE_UNICAST, pup,
299 DDR_PHY_DATA, reg_addr,
300 0x0));
301 continue;
302 } else {
303 adll_shift_lock[if_id][pup] = 1;
304 /*
305 * The search ended in Pass we need
306 * Fail
307 */
308 res0[if_id] =
309 (pbs_mode == PBS_RX_MODE) ?
310 ((res0[if_id] &
311 res_valid_mask) + 1) :
312 ((res0[if_id] &
313 res_valid_mask) - 1);
314 max_adll_per_pup[if_id][pup] =
315 (max_adll_per_pup[if_id][pup] <
316 res0[if_id]) ?
317 (u8)res0[if_id] :
318 max_adll_per_pup[if_id][pup];
319 min_adll_per_pup[if_id][pup] =
320 (res0[if_id] >
321 min_adll_per_pup[if_id][pup]) ?
322 min_adll_per_pup[if_id][pup] :
323 (u8)res0[if_id];
324 /*
325 * vs the Rx we are searching for the
326 * smallest value of DQ shift so all Bus
327 * would fail
328 */
329 adll_shift_val[if_id][pup] =
330 (pbs_mode == PBS_RX_MODE) ?
331 max_adll_per_pup[if_id][pup] :
332 min_adll_per_pup[if_id][pup];
333 }
334 }
335 }
336 }
337
338 /* Print Stage result */
339 for (pup = 0; pup < tm->num_of_bus_per_interface; pup++) {
340 VALIDATE_ACTIVE(tm->bus_act_mask, pup);
341 for (if_id = 0; if_id <= MAX_INTERFACE_NUM - 1; if_id++) {
342 VALIDATE_ACTIVE(tm->if_act_mask, if_id);
343 DEBUG_PBS_ENGINE(DEBUG_LEVEL_TRACE,
344 ("FP I/F %d, ADLL Shift for EBA: pup[%d] Lock status = %d Lock Val = %d,%d\n",
345 if_id, pup,
346 adll_shift_lock[if_id][pup],
347 max_adll_per_pup[if_id][pup],
348 min_adll_per_pup[if_id][pup]));
349 }
350 }
351 DEBUG_PBS_ENGINE(DEBUG_LEVEL_INFO,
352 ("Update ADLL Shift of all pups:\n"));
353
354 for (pup = 0; pup < tm->num_of_bus_per_interface; pup++) {
355 VALIDATE_ACTIVE(tm->bus_act_mask, pup);
356 for (if_id = 0; if_id <= MAX_INTERFACE_NUM - 1; if_id++) {
357 VALIDATE_ACTIVE(tm->if_act_mask, if_id);
358 if (adll_shift_lock[if_id][pup] != 1)
359 continue;
360 /* if pup not locked continue to next pup */
361
362 reg_addr = (pbs_mode == PBS_RX_MODE) ?
363 (0x3 + effective_cs * 4) :
364 (0x1 + effective_cs * 4);
365 CHECK_STATUS(ddr3_tip_bus_write
366 (dev_num, ACCESS_TYPE_UNICAST, if_id,
367 ACCESS_TYPE_UNICAST, pup, DDR_PHY_DATA,
368 reg_addr, adll_shift_val[if_id][pup]));
369 DEBUG_PBS_ENGINE(DEBUG_LEVEL_TRACE,
370 ("FP I/F %d, Pup[%d] = %d\n", if_id,
371 pup, adll_shift_val[if_id][pup]));
372 }
373 }
374
375 /* PBS EEBA&EBA */
376 /* Start the Per Bit Skew search */
377 for (pup = 0; pup < tm->num_of_bus_per_interface; pup++) {
378 VALIDATE_ACTIVE(tm->bus_act_mask, pup);
379 for (if_id = 0; if_id <= MAX_INTERFACE_NUM - 1; if_id++) {
380 VALIDATE_ACTIVE(tm->if_act_mask, if_id);
381 max_pbs_per_pup[if_id][pup] = 0x0;
382 min_pbs_per_pup[if_id][pup] = 0x1f;
383 for (bit = 0; bit < BUS_WIDTH_IN_BITS; bit++) {
384 /* reset result for PBS */
385 result_all_bit[bit + pup * BUS_WIDTH_IN_BITS +
386 if_id * MAX_BUS_NUM *
387 BUS_WIDTH_IN_BITS] = 0;
388 }
389 }
390 }
391
392 iterations = 31;
393 search_dir = HWS_LOW2HIGH;
394 /* !!!!! ran sh (search_dir == HWS_LOW2HIGH)?0:iterations; */
395 init_val = 0;
396
397 ddr3_tip_ip_training(dev_num, ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE,
398 ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE,
399 RESULT_PER_BIT, HWS_CONTROL_ELEMENT_DQ_SKEW,
400 search_dir, dir, tm->if_act_mask, init_val,
401 iterations, pbs_pattern, search_edge,
402 CS_SINGLE, cs_num, train_status);
403
404 for (pup = 0; pup < tm->num_of_bus_per_interface; pup++) {
405 VALIDATE_ACTIVE(tm->bus_act_mask, pup);
406 for (if_id = 0; if_id <= MAX_INTERFACE_NUM - 1; if_id++) {
407 VALIDATE_ACTIVE(tm->if_act_mask, if_id);
408 if (adll_shift_lock[if_id][pup] != 1) {
409 /* if pup not lock continue to next pup */
410 continue;
411 }
412
413 for (bit = 0; bit < BUS_WIDTH_IN_BITS; bit++) {
414 CHECK_STATUS(ddr3_tip_if_read
415 (dev_num, ACCESS_TYPE_MULTICAST,
416 PARAM_NOT_CARE,
417 mask_results_dq_reg_map[
418 bit +
419 pup * BUS_WIDTH_IN_BITS],
420 res0, MASK_ALL_BITS));
421 DEBUG_PBS_ENGINE(DEBUG_LEVEL_INFO,
422 ("Per Bit Skew search, FP I/F %d, bit:%d, pup:%d res0 0x%x\n",
423 if_id, bit, pup,
424 res0[if_id]));
425 if ((res0[if_id] & 0x2000000) == 0) {
426 DEBUG_PBS_ENGINE(DEBUG_LEVEL_INFO,
427 ("--EBA PBS Fail - Training IP machine\n"));
428 /* exit the bit loop */
429 bit = BUS_WIDTH_IN_BITS;
430 /*
431 * ADLL is no long in lock need new
432 * search
433 */
434 adll_shift_lock[if_id][pup] = 0;
435 /* Move to SBA */
436 pup_state[if_id][pup] = 2;
437 max_pbs_per_pup[if_id][pup] = 0x0;
438 min_pbs_per_pup[if_id][pup] = 0x1f;
439 continue;
440 } else {
441 temp = (u8)(res0[if_id] &
442 res_valid_mask);
443 max_pbs_per_pup[if_id][pup] =
444 (temp >
445 max_pbs_per_pup[if_id][pup]) ?
446 temp :
447 max_pbs_per_pup[if_id][pup];
448 min_pbs_per_pup[if_id][pup] =
449 (temp <
450 min_pbs_per_pup[if_id][pup]) ?
451 temp :
452 min_pbs_per_pup[if_id][pup];
453 result_all_bit[bit +
454 pup * BUS_WIDTH_IN_BITS +
455 if_id * MAX_BUS_NUM *
456 BUS_WIDTH_IN_BITS] =
457 temp;
458 }
459 }
460 }
461 }
462
463 /* Check all Pup lock */
464 all_lock = 1;
465 for (pup = 0; pup < tm->num_of_bus_per_interface; pup++) {
466 VALIDATE_ACTIVE(tm->bus_act_mask, pup);
467 for (if_id = 0; if_id <= MAX_INTERFACE_NUM - 1; if_id++) {
468 VALIDATE_ACTIVE(tm->if_act_mask, if_id);
469 all_lock = all_lock * adll_shift_lock[if_id][pup];
470 }
471 }
472
473 /* Only if not all Pups Lock */
474 if (all_lock == 0) {
475 DEBUG_PBS_ENGINE(DEBUG_LEVEL_INFO,
476 ("##########ADLL shift for SBA###########\n"));
477
478 /* ADLL shift for SBA */
479 search_dir = (pbs_mode == PBS_RX_MODE) ? HWS_LOW2HIGH :
480 HWS_HIGH2LOW;
481 init_val = (search_dir == HWS_LOW2HIGH) ? 0 : iterations;
482 for (pup = 0; pup < tm->num_of_bus_per_interface; pup++) {
483 VALIDATE_ACTIVE(tm->bus_act_mask, pup);
484 for (if_id = 0; if_id <= MAX_INTERFACE_NUM - 1;
485 if_id++) {
486 VALIDATE_ACTIVE(tm->if_act_mask, if_id);
487 if (adll_shift_lock[if_id][pup] == 1) {
488 /*if pup lock continue to next pup */
489 continue;
490 }
491 /*init the var altogth init before */
492 adll_shift_lock[if_id][pup] = 0;
493 reg_addr = (pbs_mode == PBS_RX_MODE) ?
494 (0x54 + effective_cs * 0x10) :
495 (0x14 + effective_cs * 0x10);
496 CHECK_STATUS(ddr3_tip_bus_write
497 (dev_num, ACCESS_TYPE_UNICAST,
498 if_id, ACCESS_TYPE_UNICAST, pup,
499 DDR_PHY_DATA, reg_addr, 0));
500 reg_addr = (pbs_mode == PBS_RX_MODE) ?
501 (0x55 + effective_cs * 0x10) :
502 (0x15 + effective_cs * 0x10);
503 CHECK_STATUS(ddr3_tip_bus_write
504 (dev_num, ACCESS_TYPE_UNICAST,
505 if_id, ACCESS_TYPE_UNICAST, pup,
506 DDR_PHY_DATA, reg_addr, 0));
507 reg_addr = (pbs_mode == PBS_RX_MODE) ?
508 (0x5f + effective_cs * 0x10) :
509 (0x1f + effective_cs * 0x10);
510 CHECK_STATUS(ddr3_tip_bus_write
511 (dev_num, ACCESS_TYPE_UNICAST,
512 if_id, ACCESS_TYPE_UNICAST, pup,
513 DDR_PHY_DATA, reg_addr, 0));
514 /* initilaze the Edge2 Max. */
515 adll_shift_val[if_id][pup] = 0;
516 min_adll_per_pup[if_id][pup] = 0x1f;
517 max_adll_per_pup[if_id][pup] = 0x0;
518
519 ddr3_tip_ip_training(dev_num,
520 ACCESS_TYPE_MULTICAST,
521 PARAM_NOT_CARE,
522 ACCESS_TYPE_MULTICAST,
523 PARAM_NOT_CARE,
524 RESULT_PER_BIT,
525 HWS_CONTROL_ELEMENT_ADLL,
526 search_dir, dir,
527 tm->if_act_mask,
528 init_val, iterations,
529 pbs_pattern,
530 search_edge, CS_SINGLE,
531 cs_num, train_status);
532
533 for (bit = 0; bit < BUS_WIDTH_IN_BITS; bit++) {
534 CHECK_STATUS(ddr3_tip_if_read
535 (dev_num,
536 ACCESS_TYPE_MULTICAST,
537 PARAM_NOT_CARE,
538 mask_results_dq_reg_map
539 [bit +
540 pup *
541 BUS_WIDTH_IN_BITS],
542 res0, MASK_ALL_BITS));
543 DEBUG_PBS_ENGINE(
544 DEBUG_LEVEL_INFO,
545 ("FP I/F %d, bit:%d, pup:%d res0 0x%x\n",
546 if_id, bit, pup, res0[if_id]));
547 if ((res0[if_id] & 0x2000000) == 0) {
548 /* exit the bit loop */
549 bit = BUS_WIDTH_IN_BITS;
550 /* Fail SBA --> Fail PBS */
551 pup_state[if_id][pup] = 1;
552 DEBUG_PBS_ENGINE
553 (DEBUG_LEVEL_INFO,
554 (" SBA Fail\n"));
555 continue;
556 } else {
557 /*
558 * - increment to get all
559 * 8 bit lock.
560 */
561 adll_shift_lock[if_id][pup]++;
562 /*
563 * The search ended in Pass
564 * we need Fail
565 */
566 res0[if_id] =
567 (pbs_mode == PBS_RX_MODE) ?
568 ((res0[if_id] & res_valid_mask) + 1) :
569 ((res0[if_id] & res_valid_mask) - 1);
570 max_adll_per_pup[if_id][pup] =
571 (max_adll_per_pup[if_id]
572 [pup] < res0[if_id]) ?
573 (u8)res0[if_id] :
574 max_adll_per_pup[if_id][pup];
575 min_adll_per_pup[if_id][pup] =
576 (res0[if_id] >
577 min_adll_per_pup[if_id]
578 [pup]) ?
579 min_adll_per_pup[if_id][pup] :
580 (u8)res0[if_id];
581 /*
582 * vs the Rx we are searching for
583 * the smallest value of DQ shift
584 * so all Bus would fail
585 */
586 adll_shift_val[if_id][pup] =
587 (pbs_mode == PBS_RX_MODE) ?
588 max_adll_per_pup[if_id][pup] :
589 min_adll_per_pup[if_id][pup];
590 }
591 }
592 /* 1 is lock */
593 adll_shift_lock[if_id][pup] =
594 (adll_shift_lock[if_id][pup] == 8) ?
595 1 : 0;
596 reg_addr = (pbs_mode == PBS_RX_MODE) ?
597 (0x3 + effective_cs * 4) :
598 (0x1 + effective_cs * 4);
599 CHECK_STATUS(ddr3_tip_bus_write
600 (dev_num, ACCESS_TYPE_UNICAST,
601 if_id, ACCESS_TYPE_UNICAST, pup,
602 DDR_PHY_DATA, reg_addr,
603 adll_shift_val[if_id][pup]));
604 DEBUG_PBS_ENGINE(
605 DEBUG_LEVEL_INFO,
606 ("adll_shift_lock[%x][%x] = %x\n",
607 if_id, pup,
608 adll_shift_lock[if_id][pup]));
609 }
610 }
611
612 /* End ADLL Shift for SBA */
613 /* Start the Per Bit Skew search */
614 /* The ADLL shift finished with a Pass */
615 search_edge = (pbs_mode == PBS_RX_MODE) ? EDGE_PF : EDGE_FP;
616 search_dir = (pbs_mode == PBS_RX_MODE) ?
617 HWS_LOW2HIGH : HWS_HIGH2LOW;
618 iterations = 0x1f;
619 /* - The initial value is different in Rx and Tx mode */
620 init_val = (pbs_mode == PBS_RX_MODE) ? 0 : iterations;
621
622 ddr3_tip_ip_training(dev_num, ACCESS_TYPE_MULTICAST,
623 PARAM_NOT_CARE, ACCESS_TYPE_MULTICAST,
624 PARAM_NOT_CARE, RESULT_PER_BIT,
625 HWS_CONTROL_ELEMENT_DQ_SKEW,
626 search_dir, dir, tm->if_act_mask,
627 init_val, iterations, pbs_pattern,
628 search_edge, CS_SINGLE, cs_num,
629 train_status);
630
631 for (pup = 0; pup < tm->num_of_bus_per_interface; pup++) {
632 VALIDATE_ACTIVE(tm->bus_act_mask, pup);
633 for (if_id = 0; if_id <= MAX_INTERFACE_NUM - 1;
634 if_id++) {
635 VALIDATE_ACTIVE(tm->if_act_mask, if_id);
636 for (bit = 0; bit < BUS_WIDTH_IN_BITS; bit++) {
637 CHECK_STATUS(ddr3_tip_if_read
638 (dev_num,
639 ACCESS_TYPE_MULTICAST,
640 PARAM_NOT_CARE,
641 mask_results_dq_reg_map
642 [bit +
643 pup *
644 BUS_WIDTH_IN_BITS],
645 res0, MASK_ALL_BITS));
646 if (pup_state[if_id][pup] != 2) {
647 /*
648 * if pup is not SBA continue
649 * to next pup
650 */
651 bit = BUS_WIDTH_IN_BITS;
652 continue;
653 }
654 DEBUG_PBS_ENGINE(
655 DEBUG_LEVEL_INFO,
656 ("Per Bit Skew search, PF I/F %d, bit:%d, pup:%d res0 0x%x\n",
657 if_id, bit, pup, res0[if_id]));
658 if ((res0[if_id] & 0x2000000) == 0) {
659 DEBUG_PBS_ENGINE
660 (DEBUG_LEVEL_INFO,
661 ("SBA Fail\n"));
662
663 max_pbs_per_pup[if_id][pup] =
664 0x1f;
665 result_all_bit[
666 bit + pup *
667 BUS_WIDTH_IN_BITS +
668 if_id * MAX_BUS_NUM *
669 BUS_WIDTH_IN_BITS] =
670 0x1f;
671 } else {
672 temp = (u8)(res0[if_id] &
673 res_valid_mask);
674 max_pbs_per_pup[if_id][pup] =
675 (temp >
676 max_pbs_per_pup[if_id]
677 [pup]) ? temp :
678 max_pbs_per_pup
679 [if_id][pup];
680 min_pbs_per_pup[if_id][pup] =
681 (temp <
682 min_pbs_per_pup[if_id]
683 [pup]) ? temp :
684 min_pbs_per_pup
685 [if_id][pup];
686 result_all_bit[
687 bit + pup *
688 BUS_WIDTH_IN_BITS +
689 if_id * MAX_BUS_NUM *
690 BUS_WIDTH_IN_BITS] =
691 temp;
692 adll_shift_lock[if_id][pup] = 1;
693 }
694 }
695 }
696 }
697
698 /* Check all Pup state */
699 all_lock = 1;
700 for (pup = 0; pup < tm->num_of_bus_per_interface; pup++) {
701 /*
702 * DEBUG_PBS_ENGINE(DEBUG_LEVEL_INFO,
703 * ("pup_state[%d][%d] = %d\n",if_id,pup,pup_state
704 * [if_id][pup]));
705 */
706 }
707 }
708
709 /* END OF SBA */
710 /* Norm */
711 for (pup = 0; pup < tm->num_of_bus_per_interface; pup++) {
712 VALIDATE_ACTIVE(tm->bus_act_mask, pup);
713 for (bit = 0; bit < BUS_WIDTH_IN_BITS; bit++) {
714 for (if_id = 0; if_id <= MAX_INTERFACE_NUM - 1;
715 if_id++) {
716 VALIDATE_ACTIVE(tm->if_act_mask, if_id);
717 /* if pup not lock continue to next pup */
718 if (adll_shift_lock[if_id][pup] != 1) {
719 DEBUG_PBS_ENGINE(
720 DEBUG_LEVEL_ERROR,
721 ("PBS failed for IF #%d\n",
722 if_id));
723 training_result[training_stage][if_id]
724 = TEST_FAILED;
725
726 result_mat[if_id][pup][bit] = 0;
727 max_pbs_per_pup[if_id][pup] = 0;
728 min_pbs_per_pup[if_id][pup] = 0;
729 } else {
730 training_result[
731 training_stage][if_id] =
732 (training_result[training_stage]
733 [if_id] == TEST_FAILED) ?
734 TEST_FAILED : TEST_SUCCESS;
735 result_mat[if_id][pup][bit] =
736 result_all_bit[
737 bit + pup *
738 BUS_WIDTH_IN_BITS +
739 if_id * MAX_BUS_NUM *
740 BUS_WIDTH_IN_BITS] -
741 min_pbs_per_pup[if_id][pup];
742 }
743 DEBUG_PBS_ENGINE(
744 DEBUG_LEVEL_INFO,
745 ("The abs min_pbs[%d][%d] = %d\n",
746 if_id, pup,
747 min_pbs_per_pup[if_id][pup]));
748 }
749 }
750 }
751
752 /* Clean all results */
753 ddr3_tip_clean_pbs_result(dev_num, pbs_mode);
754
755 /* DQ PBS register update with the final result */
756 for (if_id = 0; if_id < MAX_INTERFACE_NUM; if_id++) {
757 VALIDATE_ACTIVE(tm->if_act_mask, if_id);
758 for (pup = 0; pup < tm->num_of_bus_per_interface; pup++) {
759 VALIDATE_ACTIVE(tm->bus_act_mask, pup);
760
761 DEBUG_PBS_ENGINE(
762 DEBUG_LEVEL_INFO,
763 ("Final Results: if_id %d, pup %d, Pup State: %d\n",
764 if_id, pup, pup_state[if_id][pup]));
765 for (bit = 0; bit < BUS_WIDTH_IN_BITS; bit++) {
766 if (dq_map_table == NULL) {
767 DEBUG_PBS_ENGINE(
768 DEBUG_LEVEL_ERROR,
769 ("dq_map_table not initialized\n"));
770 return MV_FAIL;
771 }
772 pad_num = dq_map_table[
773 bit + pup * BUS_WIDTH_IN_BITS +
774 if_id * BUS_WIDTH_IN_BITS *
775 tm->num_of_bus_per_interface];
776 DEBUG_PBS_ENGINE(DEBUG_LEVEL_INFO,
777 ("result_mat: %d ",
778 result_mat[if_id][pup]
779 [bit]));
780 reg_addr = (pbs_mode == PBS_RX_MODE) ?
781 (PBS_RX_PHY_REG + effective_cs * 0x10) :
782 (PBS_TX_PHY_REG + effective_cs * 0x10);
783 CHECK_STATUS(ddr3_tip_bus_write
784 (dev_num, ACCESS_TYPE_UNICAST,
785 if_id, ACCESS_TYPE_UNICAST, pup,
786 DDR_PHY_DATA, reg_addr + pad_num,
787 result_mat[if_id][pup][bit]));
788 }
789 pbsdelay_per_pup[pbs_mode][if_id][pup] =
790 (max_pbs_per_pup[if_id][pup] ==
791 min_pbs_per_pup[if_id][pup]) ?
792 TYPICAL_PBS_VALUE :
793 ((max_adll_per_pup[if_id][pup] -
794 min_adll_per_pup[if_id][pup]) * adll_tap /
795 (max_pbs_per_pup[if_id][pup] -
796 min_pbs_per_pup[if_id][pup]));
797
798 /* RX results ready, write RX also */
799 if (pbs_mode == PBS_TX_MODE) {
800 /* Write TX results */
801 reg_addr = (0x14 + effective_cs * 0x10);
802 CHECK_STATUS(ddr3_tip_bus_write
803 (dev_num, ACCESS_TYPE_UNICAST,
804 if_id, ACCESS_TYPE_UNICAST, pup,
805 DDR_PHY_DATA, reg_addr,
806 (max_pbs_per_pup[if_id][pup] -
807 min_pbs_per_pup[if_id][pup]) /
808 2));
809 reg_addr = (0x15 + effective_cs * 0x10);
810 CHECK_STATUS(ddr3_tip_bus_write
811 (dev_num, ACCESS_TYPE_UNICAST,
812 if_id, ACCESS_TYPE_UNICAST, pup,
813 DDR_PHY_DATA, reg_addr,
814 (max_pbs_per_pup[if_id][pup] -
815 min_pbs_per_pup[if_id][pup]) /
816 2));
817
818 /* Write previously stored RX results */
819 reg_addr = (0x54 + effective_cs * 0x10);
820 CHECK_STATUS(ddr3_tip_bus_write
821 (dev_num, ACCESS_TYPE_UNICAST,
822 if_id, ACCESS_TYPE_UNICAST, pup,
823 DDR_PHY_DATA, reg_addr,
824 result_mat_rx_dqs[if_id][pup]
825 [effective_cs]));
826 reg_addr = (0x55 + effective_cs * 0x10);
827 CHECK_STATUS(ddr3_tip_bus_write
828 (dev_num, ACCESS_TYPE_UNICAST,
829 if_id, ACCESS_TYPE_UNICAST, pup,
830 DDR_PHY_DATA, reg_addr,
831 result_mat_rx_dqs[if_id][pup]
832 [effective_cs]));
833 } else {
834 /*
835 * RX results may affect RL results correctess,
836 * so just store the results that will written
837 * in TX stage
838 */
839 result_mat_rx_dqs[if_id][pup][effective_cs] =
840 (max_pbs_per_pup[if_id][pup] -
841 min_pbs_per_pup[if_id][pup]) / 2;
842 }
843 DEBUG_PBS_ENGINE(
844 DEBUG_LEVEL_INFO,
845 (", PBS tap=%d [psec] ==> skew observed = %d\n",
846 pbsdelay_per_pup[pbs_mode][if_id][pup],
847 ((max_pbs_per_pup[if_id][pup] -
848 min_pbs_per_pup[if_id][pup]) *
849 pbsdelay_per_pup[pbs_mode][if_id][pup])));
850 }
851 }
852
853 /* Write back to the phy the default values */
854 reg_addr = (pbs_mode == PBS_RX_MODE) ?
855 (READ_CENTRALIZATION_PHY_REG + effective_cs * 4) :
856 (WRITE_CENTRALIZATION_PHY_REG + effective_cs * 4);
857 write_adll_value(nominal_adll, reg_addr);
858
859 for (if_id = 0; if_id <= MAX_INTERFACE_NUM - 1; if_id++) {
860 reg_addr = (pbs_mode == PBS_RX_MODE) ?
861 (0x5a + effective_cs * 0x10) :
862 (0x1a + effective_cs * 0x10);
863 CHECK_STATUS(ddr3_tip_bus_write
864 (dev_num, ACCESS_TYPE_UNICAST, if_id,
865 ACCESS_TYPE_UNICAST, pup, DDR_PHY_DATA, reg_addr,
866 0));
867
868 /* restore cs enable value */
869 VALIDATE_ACTIVE(tm->if_act_mask, if_id);
870 CHECK_STATUS(ddr3_tip_if_write
871 (dev_num, ACCESS_TYPE_UNICAST, if_id,
872 CS_ENABLE_REG, cs_enable_reg_val[if_id],
873 MASK_ALL_BITS));
874 }
875
876 /* exit test mode */
877 CHECK_STATUS(ddr3_tip_if_write
878 (dev_num, ACCESS_TYPE_MULTICAST, PARAM_NOT_CARE,
879 ODPG_WRITE_READ_MODE_ENABLE_REG, 0xffff, MASK_ALL_BITS));
880 for (if_id = 0; if_id <= MAX_INTERFACE_NUM - 1; if_id++) {
881 /*
882 * meaning that there is no VW exist at all (No lock at
883 * the EBA ADLL shift at EBS)
884 */
885 if (pup_state[if_id][pup] == 1)
886 return MV_FAIL;
887 }
888
889 return MV_OK;
890}
891
892/*
893 * Name: ddr3_tip_pbs_rx.
894 * Desc: PBS TX
895 * Args: TBD
896 * Notes:
897 * Returns: OK if success, other error code if fail.
898 */
899int ddr3_tip_pbs_rx(u32 uidev_num)
900{
901 return ddr3_tip_pbs(uidev_num, PBS_RX_MODE);
902}
903
904/*
905 * Name: ddr3_tip_pbs_tx.
906 * Desc: PBS TX
907 * Args: TBD
908 * Notes:
909 * Returns: OK if success, other error code if fail.
910 */
911int ddr3_tip_pbs_tx(u32 uidev_num)
912{
913 return ddr3_tip_pbs(uidev_num, PBS_TX_MODE);
914}
915
916#ifndef EXCLUDE_SWITCH_DEBUG
917/*
918 * Print PBS Result
919 */
920int ddr3_tip_print_all_pbs_result(u32 dev_num)
921{
922 u32 curr_cs;
923 u32 max_cs = hws_ddr3_tip_max_cs_get();
924
925 for (curr_cs = 0; curr_cs < max_cs; curr_cs++) {
926 ddr3_tip_print_pbs_result(dev_num, curr_cs, PBS_RX_MODE);
927 ddr3_tip_print_pbs_result(dev_num, curr_cs, PBS_TX_MODE);
928 }
929
930 return MV_OK;
931}
932
933/*
934 * Print PBS Result
935 */
936int ddr3_tip_print_pbs_result(u32 dev_num, u32 cs_num, enum pbs_dir pbs_mode)
937{
938 u32 data_value = 0, bit = 0, if_id = 0, pup = 0;
939 u32 reg_addr = (pbs_mode == PBS_RX_MODE) ?
940 (PBS_RX_PHY_REG + cs_num * 0x10) :
941 (PBS_TX_PHY_REG + cs_num * 0x10);
942 struct hws_topology_map *tm = ddr3_get_topology_map();
943
944 printf("CS%d, %s ,PBS\n", cs_num,
945 (pbs_mode == PBS_RX_MODE) ? "Rx" : "Tx");
946
947 for (bit = 0; bit < BUS_WIDTH_IN_BITS; bit++) {
948 printf("%s, DQ", (pbs_mode == PBS_RX_MODE) ? "Rx" : "Tx");
949 for (if_id = 0; if_id <= MAX_INTERFACE_NUM - 1; if_id++) {
950 VALIDATE_ACTIVE(tm->if_act_mask, if_id);
951 printf("%d ,PBS,,, ", bit);
952 for (pup = 0; pup <= tm->num_of_bus_per_interface;
953 pup++) {
954 VALIDATE_ACTIVE(tm->bus_act_mask, pup);
955 CHECK_STATUS(ddr3_tip_bus_read
956 (dev_num, if_id,
957 ACCESS_TYPE_UNICAST, pup,
958 DDR_PHY_DATA, reg_addr + bit,
959 &data_value));
960 printf("%d , ", data_value);
961 }
962 }
963 printf("\n");
964 }
965 printf("\n");
966
967 return MV_OK;
968}
969#endif
970
971/*
972 * Fixup PBS Result
973 */
974int ddr3_tip_clean_pbs_result(u32 dev_num, enum pbs_dir pbs_mode)
975{
976 u32 if_id, pup, bit;
977 u32 reg_addr = (pbs_mode == PBS_RX_MODE) ?
978 (PBS_RX_PHY_REG + effective_cs * 0x10) :
979 (PBS_TX_PHY_REG + effective_cs * 0x10);
980 struct hws_topology_map *tm = ddr3_get_topology_map();
981
982 for (if_id = 0; if_id <= MAX_INTERFACE_NUM - 1; if_id++) {
983 VALIDATE_ACTIVE(tm->if_act_mask, if_id);
984 for (pup = 0; pup <= tm->num_of_bus_per_interface; pup++) {
985 for (bit = 0; bit <= BUS_WIDTH_IN_BITS + 3; bit++) {
986 CHECK_STATUS(ddr3_tip_bus_write
987 (dev_num, ACCESS_TYPE_UNICAST,
988 if_id, ACCESS_TYPE_UNICAST, pup,
989 DDR_PHY_DATA, reg_addr + bit, 0));
990 }
991 }
992 }
993
994 return MV_OK;
995}