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