xref: /OK3568_Linux_fs/u-boot/drivers/ddr/marvell/a38x/ddr3_training_ip.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright (C) Marvell International Ltd. and its affiliates
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * SPDX-License-Identifier:	GPL-2.0
5*4882a593Smuzhiyun  */
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #ifndef _DDR3_TRAINING_IP_H_
8*4882a593Smuzhiyun #define _DDR3_TRAINING_IP_H_
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #include "ddr3_training_ip_def.h"
11*4882a593Smuzhiyun #include "ddr_topology_def.h"
12*4882a593Smuzhiyun #include "ddr_training_ip_db.h"
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #define DDR3_TIP_VERSION_STRING "DDR3 Training Sequence - Ver TIP-1.29."
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun #define MAX_CS_NUM		4
17*4882a593Smuzhiyun #define MAX_TOTAL_BUS_NUM	(MAX_INTERFACE_NUM * MAX_BUS_NUM)
18*4882a593Smuzhiyun #define MAX_DQ_NUM		40
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun #define GET_MIN(arg1, arg2)	((arg1) < (arg2)) ? (arg1) : (arg2)
21*4882a593Smuzhiyun #define GET_MAX(arg1, arg2)	((arg1) < (arg2)) ? (arg2) : (arg1)
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun #define INIT_CONTROLLER_MASK_BIT	0x00000001
24*4882a593Smuzhiyun #define STATIC_LEVELING_MASK_BIT	0x00000002
25*4882a593Smuzhiyun #define SET_LOW_FREQ_MASK_BIT		0x00000004
26*4882a593Smuzhiyun #define LOAD_PATTERN_MASK_BIT		0x00000008
27*4882a593Smuzhiyun #define SET_MEDIUM_FREQ_MASK_BIT	0x00000010
28*4882a593Smuzhiyun #define WRITE_LEVELING_MASK_BIT		0x00000020
29*4882a593Smuzhiyun #define LOAD_PATTERN_2_MASK_BIT		0x00000040
30*4882a593Smuzhiyun #define READ_LEVELING_MASK_BIT		0x00000080
31*4882a593Smuzhiyun #define SW_READ_LEVELING_MASK_BIT	0x00000100
32*4882a593Smuzhiyun #define WRITE_LEVELING_SUPP_MASK_BIT	0x00000200
33*4882a593Smuzhiyun #define PBS_RX_MASK_BIT			0x00000400
34*4882a593Smuzhiyun #define PBS_TX_MASK_BIT			0x00000800
35*4882a593Smuzhiyun #define SET_TARGET_FREQ_MASK_BIT	0x00001000
36*4882a593Smuzhiyun #define ADJUST_DQS_MASK_BIT		0x00002000
37*4882a593Smuzhiyun #define WRITE_LEVELING_TF_MASK_BIT	0x00004000
38*4882a593Smuzhiyun #define LOAD_PATTERN_HIGH_MASK_BIT	0x00008000
39*4882a593Smuzhiyun #define READ_LEVELING_TF_MASK_BIT	0x00010000
40*4882a593Smuzhiyun #define WRITE_LEVELING_SUPP_TF_MASK_BIT	0x00020000
41*4882a593Smuzhiyun #define DM_PBS_TX_MASK_BIT		0x00040000
42*4882a593Smuzhiyun #define CENTRALIZATION_RX_MASK_BIT	0x00100000
43*4882a593Smuzhiyun #define CENTRALIZATION_TX_MASK_BIT	0x00200000
44*4882a593Smuzhiyun #define TX_EMPHASIS_MASK_BIT		0x00400000
45*4882a593Smuzhiyun #define PER_BIT_READ_LEVELING_TF_MASK_BIT	0x00800000
46*4882a593Smuzhiyun #define VREF_CALIBRATION_MASK_BIT	0x01000000
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun enum hws_result {
49*4882a593Smuzhiyun 	TEST_FAILED = 0,
50*4882a593Smuzhiyun 	TEST_SUCCESS = 1,
51*4882a593Smuzhiyun 	NO_TEST_DONE = 2
52*4882a593Smuzhiyun };
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun enum hws_training_result {
55*4882a593Smuzhiyun 	RESULT_PER_BIT,
56*4882a593Smuzhiyun 	RESULT_PER_BYTE
57*4882a593Smuzhiyun };
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun enum auto_tune_stage {
60*4882a593Smuzhiyun 	INIT_CONTROLLER,
61*4882a593Smuzhiyun 	STATIC_LEVELING,
62*4882a593Smuzhiyun 	SET_LOW_FREQ,
63*4882a593Smuzhiyun 	LOAD_PATTERN,
64*4882a593Smuzhiyun 	SET_MEDIUM_FREQ,
65*4882a593Smuzhiyun 	WRITE_LEVELING,
66*4882a593Smuzhiyun 	LOAD_PATTERN_2,
67*4882a593Smuzhiyun 	READ_LEVELING,
68*4882a593Smuzhiyun 	WRITE_LEVELING_SUPP,
69*4882a593Smuzhiyun 	PBS_RX,
70*4882a593Smuzhiyun 	PBS_TX,
71*4882a593Smuzhiyun 	SET_TARGET_FREQ,
72*4882a593Smuzhiyun 	ADJUST_DQS,
73*4882a593Smuzhiyun 	WRITE_LEVELING_TF,
74*4882a593Smuzhiyun 	READ_LEVELING_TF,
75*4882a593Smuzhiyun 	WRITE_LEVELING_SUPP_TF,
76*4882a593Smuzhiyun 	DM_PBS_TX,
77*4882a593Smuzhiyun 	VREF_CALIBRATION,
78*4882a593Smuzhiyun 	CENTRALIZATION_RX,
79*4882a593Smuzhiyun 	CENTRALIZATION_TX,
80*4882a593Smuzhiyun 	TX_EMPHASIS,
81*4882a593Smuzhiyun 	LOAD_PATTERN_HIGH,
82*4882a593Smuzhiyun 	PER_BIT_READ_LEVELING_TF,
83*4882a593Smuzhiyun 	MAX_STAGE_LIMIT
84*4882a593Smuzhiyun };
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun enum hws_access_type {
87*4882a593Smuzhiyun 	ACCESS_TYPE_UNICAST = 0,
88*4882a593Smuzhiyun 	ACCESS_TYPE_MULTICAST = 1
89*4882a593Smuzhiyun };
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun enum hws_algo_type {
92*4882a593Smuzhiyun 	ALGO_TYPE_DYNAMIC,
93*4882a593Smuzhiyun 	ALGO_TYPE_STATIC
94*4882a593Smuzhiyun };
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun struct init_cntr_param {
97*4882a593Smuzhiyun 	int is_ctrl64_bit;
98*4882a593Smuzhiyun 	int do_mrs_phy;
99*4882a593Smuzhiyun 	int init_phy;
100*4882a593Smuzhiyun 	int msys_init;
101*4882a593Smuzhiyun };
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun struct pattern_info {
104*4882a593Smuzhiyun 	u8 num_of_phases_tx;
105*4882a593Smuzhiyun 	u8 tx_burst_size;
106*4882a593Smuzhiyun 	u8 delay_between_bursts;
107*4882a593Smuzhiyun 	u8 num_of_phases_rx;
108*4882a593Smuzhiyun 	u32 start_addr;
109*4882a593Smuzhiyun 	u8 pattern_len;
110*4882a593Smuzhiyun };
111*4882a593Smuzhiyun 
112*4882a593Smuzhiyun /* CL value for each frequency */
113*4882a593Smuzhiyun struct cl_val_per_freq {
114*4882a593Smuzhiyun 	u8 cl_val[DDR_FREQ_LIMIT];
115*4882a593Smuzhiyun };
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun struct cs_element {
118*4882a593Smuzhiyun 	u8 cs_num;
119*4882a593Smuzhiyun 	u8 num_of_cs;
120*4882a593Smuzhiyun };
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun struct mode_info {
123*4882a593Smuzhiyun 	/* 32 bits representing MRS bits */
124*4882a593Smuzhiyun 	u32 reg_mr0[MAX_INTERFACE_NUM];
125*4882a593Smuzhiyun 	u32 reg_mr1[MAX_INTERFACE_NUM];
126*4882a593Smuzhiyun 	u32 reg_mr2[MAX_INTERFACE_NUM];
127*4882a593Smuzhiyun 	u32 reg_m_r3[MAX_INTERFACE_NUM];
128*4882a593Smuzhiyun 	/*
129*4882a593Smuzhiyun 	 * Each element in array represent read_data_sample register delay for
130*4882a593Smuzhiyun 	 * a specific interface.
131*4882a593Smuzhiyun 	 * Each register, 4 bits[0+CS*8 to 4+CS*8] represent Number of DDR
132*4882a593Smuzhiyun 	 * cycles from read command until data is ready to be fetched from
133*4882a593Smuzhiyun 	 * the PHY, when accessing CS.
134*4882a593Smuzhiyun 	 */
135*4882a593Smuzhiyun 	u32 read_data_sample[MAX_INTERFACE_NUM];
136*4882a593Smuzhiyun 	/*
137*4882a593Smuzhiyun 	 * Each element in array represent read_data_sample register delay for
138*4882a593Smuzhiyun 	 * a specific interface.
139*4882a593Smuzhiyun 	 * Each register, 4 bits[0+CS*8 to 4+CS*8] represent the total delay
140*4882a593Smuzhiyun 	 * from read command until opening the read mask, when accessing CS.
141*4882a593Smuzhiyun 	 * This field defines the delay in DDR cycles granularity.
142*4882a593Smuzhiyun 	 */
143*4882a593Smuzhiyun 	u32 read_data_ready[MAX_INTERFACE_NUM];
144*4882a593Smuzhiyun };
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun struct hws_tip_freq_config_info {
147*4882a593Smuzhiyun 	u8 is_supported;
148*4882a593Smuzhiyun 	u8 bw_per_freq;
149*4882a593Smuzhiyun 	u8 rate_per_freq;
150*4882a593Smuzhiyun };
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun struct hws_cs_config_info {
153*4882a593Smuzhiyun 	u32 cs_reg_value;
154*4882a593Smuzhiyun 	u32 cs_cbe_value;
155*4882a593Smuzhiyun };
156*4882a593Smuzhiyun 
157*4882a593Smuzhiyun struct dfx_access {
158*4882a593Smuzhiyun 	u8 pipe;
159*4882a593Smuzhiyun 	u8 client;
160*4882a593Smuzhiyun };
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun struct hws_xsb_info {
163*4882a593Smuzhiyun 	struct dfx_access *dfx_table;
164*4882a593Smuzhiyun };
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun int ddr3_tip_register_dq_table(u32 dev_num, u32 *table);
167*4882a593Smuzhiyun int hws_ddr3_tip_select_ddr_controller(u32 dev_num, int enable);
168*4882a593Smuzhiyun int hws_ddr3_tip_init_controller(u32 dev_num,
169*4882a593Smuzhiyun 				 struct init_cntr_param *init_cntr_prm);
170*4882a593Smuzhiyun int hws_ddr3_tip_load_topology_map(u32 dev_num,
171*4882a593Smuzhiyun 				   struct hws_topology_map *topology);
172*4882a593Smuzhiyun int hws_ddr3_tip_run_alg(u32 dev_num, enum hws_algo_type algo_type);
173*4882a593Smuzhiyun int hws_ddr3_tip_mode_read(u32 dev_num, struct mode_info *mode_info);
174*4882a593Smuzhiyun int ddr3_tip_is_pup_lock(u32 *pup_buf, enum hws_training_result read_mode);
175*4882a593Smuzhiyun u8 ddr3_tip_get_buf_min(u8 *buf_ptr);
176*4882a593Smuzhiyun u8 ddr3_tip_get_buf_max(u8 *buf_ptr);
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun #endif /* _DDR3_TRAINING_IP_H_ */
179