xref: /rk3399_rockchip-uboot/drivers/ddr/marvell/a38x/ddr3_training_ip_engine.h (revision 3c9cc70d7153da442575112d9a2643eecd17d534)
1*f1df9364SStefan Roese /*
2*f1df9364SStefan Roese  * Copyright (C) Marvell International Ltd. and its affiliates
3*f1df9364SStefan Roese  *
4*f1df9364SStefan Roese  * SPDX-License-Identifier:	GPL-2.0
5*f1df9364SStefan Roese  */
6*f1df9364SStefan Roese 
7*f1df9364SStefan Roese #ifndef _DDR3_TRAINING_IP_ENGINE_H_
8*f1df9364SStefan Roese #define _DDR3_TRAINING_IP_ENGINE_H_
9*f1df9364SStefan Roese 
10*f1df9364SStefan Roese #include "ddr3_training_ip_def.h"
11*f1df9364SStefan Roese #include "ddr3_training_ip_flow.h"
12*f1df9364SStefan Roese 
13*f1df9364SStefan Roese #define EDGE_1				0
14*f1df9364SStefan Roese #define EDGE_2				1
15*f1df9364SStefan Roese #define ALL_PUP_TRAINING		0xe
16*f1df9364SStefan Roese #define PUP_RESULT_EDGE_1_MASK		0xff
17*f1df9364SStefan Roese #define PUP_RESULT_EDGE_2_MASK		(0xff << 8)
18*f1df9364SStefan Roese #define PUP_LOCK_RESULT_BIT		25
19*f1df9364SStefan Roese 
20*f1df9364SStefan Roese #define GET_TAP_RESULT(reg, edge)				 \
21*f1df9364SStefan Roese 	(((edge) == EDGE_1) ? ((reg) & PUP_RESULT_EDGE_1_MASK) : \
22*f1df9364SStefan Roese 	 (((reg) & PUP_RESULT_EDGE_2_MASK) >> 8));
23*f1df9364SStefan Roese #define GET_LOCK_RESULT(reg)						\
24*f1df9364SStefan Roese 	(((reg) & (1<<PUP_LOCK_RESULT_BIT)) >> PUP_LOCK_RESULT_BIT)
25*f1df9364SStefan Roese 
26*f1df9364SStefan Roese #define EDGE_FAILURE			128
27*f1df9364SStefan Roese #define ALL_BITS_PER_PUP		128
28*f1df9364SStefan Roese 
29*f1df9364SStefan Roese #define MIN_WINDOW_SIZE			6
30*f1df9364SStefan Roese #define MAX_WINDOW_SIZE_RX		32
31*f1df9364SStefan Roese #define MAX_WINDOW_SIZE_TX		64
32*f1df9364SStefan Roese 
33*f1df9364SStefan Roese int ddr3_tip_training_ip_test(u32 dev_num, enum hws_training_result result_type,
34*f1df9364SStefan Roese 			      enum hws_search_dir search_dir,
35*f1df9364SStefan Roese 			      enum hws_dir direction,
36*f1df9364SStefan Roese 			      enum hws_edge_compare edge,
37*f1df9364SStefan Roese 			      u32 init_val1, u32 init_val2,
38*f1df9364SStefan Roese 			      u32 num_of_iterations, u32 start_pattern,
39*f1df9364SStefan Roese 			      u32 end_pattern);
40*f1df9364SStefan Roese int ddr3_tip_load_pattern_to_mem(u32 dev_num, enum hws_pattern pattern);
41*f1df9364SStefan Roese int ddr3_tip_load_pattern_to_mem_by_cpu(u32 dev_num, enum hws_pattern pattern,
42*f1df9364SStefan Roese 					u32 offset);
43*f1df9364SStefan Roese int ddr3_tip_load_all_pattern_to_mem(u32 dev_num);
44*f1df9364SStefan Roese int ddr3_tip_read_training_result(u32 dev_num, u32 if_id,
45*f1df9364SStefan Roese 				  enum hws_access_type pup_access_type,
46*f1df9364SStefan Roese 				  u32 pup_num, u32 bit_num,
47*f1df9364SStefan Roese 				  enum hws_search_dir search,
48*f1df9364SStefan Roese 				  enum hws_dir direction,
49*f1df9364SStefan Roese 				  enum hws_training_result result_type,
50*f1df9364SStefan Roese 				  enum hws_training_load_op operation,
51*f1df9364SStefan Roese 				  u32 cs_num_type, u32 **load_res,
52*f1df9364SStefan Roese 				  int is_read_from_db, u8 cons_tap,
53*f1df9364SStefan Roese 				  int is_check_result_validity);
54*f1df9364SStefan Roese int ddr3_tip_ip_training(u32 dev_num, enum hws_access_type access_type,
55*f1df9364SStefan Roese 			 u32 interface_num,
56*f1df9364SStefan Roese 			 enum hws_access_type pup_access_type,
57*f1df9364SStefan Roese 			 u32 pup_num, enum hws_training_result result_type,
58*f1df9364SStefan Roese 			 enum hws_control_element control_element,
59*f1df9364SStefan Roese 			 enum hws_search_dir search_dir, enum hws_dir direction,
60*f1df9364SStefan Roese 			 u32 interface_mask, u32 init_value, u32 num_iter,
61*f1df9364SStefan Roese 			 enum hws_pattern pattern,
62*f1df9364SStefan Roese 			 enum hws_edge_compare edge_comp,
63*f1df9364SStefan Roese 			 enum hws_ddr_cs cs_type, u32 cs_num,
64*f1df9364SStefan Roese 			 enum hws_training_ip_stat *train_status);
65*f1df9364SStefan Roese int ddr3_tip_ip_training_wrapper(u32 dev_num, enum hws_access_type access_type,
66*f1df9364SStefan Roese 				 u32 if_id,
67*f1df9364SStefan Roese 				 enum hws_access_type pup_access_type,
68*f1df9364SStefan Roese 				 u32 pup_num,
69*f1df9364SStefan Roese 				 enum hws_training_result result_type,
70*f1df9364SStefan Roese 				 enum hws_control_element control_element,
71*f1df9364SStefan Roese 				 enum hws_search_dir search_dir,
72*f1df9364SStefan Roese 				 enum hws_dir direction,
73*f1df9364SStefan Roese 				 u32 interface_mask, u32 init_value1,
74*f1df9364SStefan Roese 				 u32 init_value2, u32 num_iter,
75*f1df9364SStefan Roese 				 enum hws_pattern pattern,
76*f1df9364SStefan Roese 				 enum hws_edge_compare edge_comp,
77*f1df9364SStefan Roese 				 enum hws_ddr_cs train_cs_type, u32 cs_num,
78*f1df9364SStefan Roese 				 enum hws_training_ip_stat *train_status);
79*f1df9364SStefan Roese int is_odpg_access_done(u32 dev_num, u32 if_id);
80*f1df9364SStefan Roese void ddr3_tip_print_bist_res(void);
81*f1df9364SStefan Roese struct pattern_info *ddr3_tip_get_pattern_table(void);
82*f1df9364SStefan Roese u16 *ddr3_tip_get_mask_results_dq_reg(void);
83*f1df9364SStefan Roese u16 *ddr3_tip_get_mask_results_pup_reg_map(void);
84*f1df9364SStefan Roese 
85*f1df9364SStefan Roese #endif /* _DDR3_TRAINING_IP_ENGINE_H_ */
86