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