1 /*
2  * Copyright (C) Marvell International Ltd. and its affiliates
3  *
4  * SPDX-License-Identifier:	GPL-2.0
5  */
6 
7 #ifndef _HIGH_SPEED_ENV_SPEC_H
8 #define _HIGH_SPEED_ENV_SPEC_H
9 
10 #include "seq_exec.h"
11 
12 /*
13  * For setting or clearing a certain bit (bit is a number between 0 and 31)
14  * in the data
15  */
16 #define SET_BIT(data, bit)		((data) | (0x1 << (bit)))
17 #define CLEAR_BIT(data, bit)		((data) & (~(0x1 << (bit))))
18 
19 #define MAX_SERDES_LANES		7	/* as in a39x */
20 
21 /* Serdes revision */
22 /* Serdes revision 1.2 (for A38x-Z1) */
23 #define MV_SERDES_REV_1_2		0x0
24 /* Serdes revision 2.1 (for A39x-Z1, A38x-A0) */
25 #define MV_SERDES_REV_2_1		0x1
26 #define MV_SERDES_REV_NA		0xff
27 
28 #define	SERDES_REGS_LANE_BASE_OFFSET(lane)	(0x800 * (lane))
29 
30 #define PEX_X4_ENABLE_OFFS						\
31 	(hws_ctrl_serdes_rev_get() == MV_SERDES_REV_1_2 ? 18 : 31)
32 
33 /* Serdes lane types */
34 enum serdes_type {
35 	PEX0,
36 	PEX1,
37 	PEX2,
38 	PEX3,
39 	SATA0,
40 	SATA1,
41 	SATA2,
42 	SATA3,
43 	SGMII0,
44 	SGMII1,
45 	SGMII2,
46 	QSGMII,
47 	USB3_HOST0,
48 	USB3_HOST1,
49 	USB3_DEVICE,
50 	SGMII3,
51 	XAUI,
52 	RXAUI,
53 	DEFAULT_SERDES,
54 	LAST_SERDES_TYPE
55 };
56 
57 /* Serdes baud rates */
58 enum serdes_speed {
59 	SERDES_SPEED_1_25_GBPS,
60 	SERDES_SPEED_1_5_GBPS,
61 	SERDES_SPEED_2_5_GBPS,
62 	SERDES_SPEED_3_GBPS,
63 	SERDES_SPEED_3_125_GBPS,
64 	SERDES_SPEED_5_GBPS,
65 	SERDES_SPEED_6_GBPS,
66 	SERDES_SPEED_6_25_GBPS,
67 	LAST_SERDES_SPEED
68 };
69 
70 /* Serdes modes */
71 enum serdes_mode {
72 	PEX_ROOT_COMPLEX_X1,
73 	PEX_ROOT_COMPLEX_X4,
74 	PEX_END_POINT_X1,
75 	PEX_END_POINT_X4,
76 
77 	SERDES_DEFAULT_MODE, /* not pex */
78 
79 	SERDES_LAST_MODE
80 };
81 
82 struct serdes_map {
83 	enum serdes_type	serdes_type;
84 	enum serdes_speed	serdes_speed;
85 	enum serdes_mode	serdes_mode;
86 	int			swap_rx;
87 	int			swap_tx;
88 };
89 
90 /* Serdes ref clock options */
91 enum ref_clock {
92 	REF_CLOCK_25MHZ,
93 	REF_CLOCK_100MHZ,
94 	REF_CLOCK_40MHZ,
95 	REF_CLOCK_UNSUPPORTED
96 };
97 
98 /* Serdes sequences */
99 enum serdes_seq {
100 	SATA_PORT_0_ONLY_POWER_UP_SEQ,
101 	SATA_PORT_1_ONLY_POWER_UP_SEQ,
102 	SATA_POWER_UP_SEQ,
103 	SATA_1_5_SPEED_CONFIG_SEQ,
104 	SATA_3_SPEED_CONFIG_SEQ,
105 	SATA_6_SPEED_CONFIG_SEQ,
106 	SATA_ELECTRICAL_CONFIG_SEQ,
107 	SATA_TX_CONFIG_SEQ1,
108 	SATA_PORT_0_ONLY_TX_CONFIG_SEQ,
109 	SATA_PORT_1_ONLY_TX_CONFIG_SEQ,
110 	SATA_TX_CONFIG_SEQ2,
111 
112 	SGMII_POWER_UP_SEQ,
113 	SGMII_1_25_SPEED_CONFIG_SEQ,
114 	SGMII_3_125_SPEED_CONFIG_SEQ,
115 	SGMII_ELECTRICAL_CONFIG_SEQ,
116 	SGMII_TX_CONFIG_SEQ1,
117 	SGMII_TX_CONFIG_SEQ2,
118 
119 	PEX_POWER_UP_SEQ,
120 	PEX_2_5_SPEED_CONFIG_SEQ,
121 	PEX_5_SPEED_CONFIG_SEQ,
122 	PEX_ELECTRICAL_CONFIG_SEQ,
123 	PEX_TX_CONFIG_SEQ1,
124 	PEX_TX_CONFIG_SEQ2,
125 	PEX_TX_CONFIG_SEQ3,
126 	PEX_BY_4_CONFIG_SEQ,
127 	PEX_CONFIG_REF_CLOCK_25MHZ_SEQ,
128 	PEX_CONFIG_REF_CLOCK_100MHZ_SEQ,
129 	PEX_CONFIG_REF_CLOCK_40MHZ_SEQ,
130 
131 	USB3_POWER_UP_SEQ,
132 	USB3_HOST_SPEED_CONFIG_SEQ,
133 	USB3_DEVICE_SPEED_CONFIG_SEQ,
134 	USB3_ELECTRICAL_CONFIG_SEQ,
135 	USB3_TX_CONFIG_SEQ1,
136 	USB3_TX_CONFIG_SEQ2,
137 	USB3_TX_CONFIG_SEQ3,
138 	USB3_DEVICE_CONFIG_SEQ,
139 
140 	USB2_POWER_UP_SEQ,
141 
142 	SERDES_POWER_DOWN_SEQ,
143 
144 	SGMII3_POWER_UP_SEQ,
145 	SGMII3_1_25_SPEED_CONFIG_SEQ,
146 	SGMII3_TX_CONFIG_SEQ1,
147 	SGMII3_TX_CONFIG_SEQ2,
148 
149 	QSGMII_POWER_UP_SEQ,
150 	QSGMII_5_SPEED_CONFIG_SEQ,
151 	QSGMII_ELECTRICAL_CONFIG_SEQ,
152 	QSGMII_TX_CONFIG_SEQ1,
153 	QSGMII_TX_CONFIG_SEQ2,
154 
155 	XAUI_POWER_UP_SEQ,
156 	XAUI_3_125_SPEED_CONFIG_SEQ,
157 	XAUI_ELECTRICAL_CONFIG_SEQ,
158 	XAUI_TX_CONFIG_SEQ1,
159 	XAUI_TX_CONFIG_SEQ2,
160 
161 	RXAUI_POWER_UP_SEQ,
162 	RXAUI_6_25_SPEED_CONFIG_SEQ,
163 	RXAUI_ELECTRICAL_CONFIG_SEQ,
164 	RXAUI_TX_CONFIG_SEQ1,
165 	RXAUI_TX_CONFIG_SEQ2,
166 
167 	SERDES_LAST_SEQ
168 };
169 
170 /* The different sequence types for PEX and USB3 */
171 enum {
172 	PEX,
173 	USB3,
174 	LAST_PEX_USB_SEQ_TYPE
175 };
176 
177 enum {
178 	PEXSERDES_SPEED_2_5_GBPS,
179 	PEXSERDES_SPEED_5_GBPS,
180 	USB3SERDES_SPEED_5_GBPS_HOST,
181 	USB3SERDES_SPEED_5_GBPS_DEVICE,
182 	LAST_PEX_USB_SPEED_SEQ_TYPE
183 };
184 
185 /* The different sequence types for SATA and SGMII */
186 enum {
187 	SATA,
188 	SGMII,
189 	SGMII_3_125,
190 	LAST_SATA_SGMII_SEQ_TYPE
191 };
192 
193 enum {
194 	QSGMII_SEQ_IDX,
195 	LAST_QSGMII_SEQ_TYPE
196 };
197 
198 enum {
199 	XAUI_SEQ_IDX,
200 	RXAUI_SEQ_IDX,
201 	LAST_XAUI_RXAUI_SEQ_TYPE
202 };
203 
204 enum {
205 	SATASERDES_SPEED_1_5_GBPS,
206 	SATASERDES_SPEED_3_GBPS,
207 	SATASERDES_SPEED_6_GBPS,
208 	SGMIISERDES_SPEED_1_25_GBPS,
209 	SGMIISERDES_SPEED_3_125_GBPS,
210 	LAST_SATA_SGMII_SPEED_SEQ_TYPE
211 };
212 
213 extern u8 selectors_serdes_rev1_map[LAST_SERDES_TYPE][MAX_SERDES_LANES];
214 extern u8 selectors_serdes_rev2_map[LAST_SERDES_TYPE][MAX_SERDES_LANES];
215 
216 u8 hws_ctrl_serdes_rev_get(void);
217 int mv_update_serdes_select_phy_mode_seq(void);
218 int hws_board_topology_load(struct serdes_map **serdes_map, u8 *count);
219 enum serdes_seq serdes_type_and_speed_to_speed_seq(enum serdes_type serdes_type,
220 						   enum serdes_speed baud_rate);
221 int hws_serdes_seq_init(void);
222 int hws_serdes_seq_db_init(void);
223 int hws_power_up_serdes_lanes(struct serdes_map *serdes_map, u8 count);
224 int hws_ctrl_high_speed_serdes_phy_config(void);
225 int serdes_power_up_ctrl(u32 serdes_num, int serdes_power_up,
226 			 enum serdes_type serdes_type,
227 			 enum serdes_speed baud_rate,
228 			 enum serdes_mode serdes_mode,
229 			 enum ref_clock ref_clock);
230 int serdes_power_up_ctrl_ext(u32 serdes_num, int serdes_power_up,
231 			     enum serdes_type serdes_type,
232 			     enum serdes_speed baud_rate,
233 			     enum serdes_mode serdes_mode,
234 			     enum ref_clock ref_clock);
235 u32 hws_serdes_silicon_ref_clock_get(void);
236 int hws_serdes_pex_ref_clock_get(enum serdes_type serdes_type,
237 				 enum ref_clock *ref_clock);
238 int hws_ref_clock_set(u32 serdes_num, enum serdes_type serdes_type,
239 		      enum ref_clock ref_clock);
240 int hws_update_serdes_phy_selectors(struct serdes_map *serdes_map, u8 count);
241 u32 hws_serdes_get_phy_selector_val(int serdes_num,
242 				    enum serdes_type serdes_type);
243 u32 hws_serdes_get_ref_clock_val(enum serdes_type serdes_type);
244 u32 hws_serdes_get_max_lane(void);
245 int hws_get_ext_base_addr(u32 serdes_num, u32 base_addr, u32 unit_base_offset,
246 			  u32 *unit_base_reg, u32 *unit_offset);
247 int hws_pex_tx_config_seq(const struct serdes_map *serdes_map, u8 count);
248 u32 hws_get_physical_serdes_num(u32 serdes_num);
249 int hws_is_serdes_active(u8 lane_num);
250 
251 #endif /* _HIGH_SPEED_ENV_SPEC_H */
252