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