1 /*
2  * Copyright 2012 Freescale Semiconductor, Inc.
3  *
4  * SPDX-License-Identifier:	GPL-2.0+
5  */
6 
7 #include <common.h>
8 #include <asm/fsl_serdes.h>
9 #include <asm/processor.h>
10 #include <asm/io.h>
11 #include "fsl_corenet2_serdes.h"
12 
13 struct serdes_config {
14 	u32 protocol;
15 	u8 lanes[SRDS_MAX_LANES];
16 };
17 
18 #ifdef CONFIG_PPC_T4240
19 static const struct serdes_config serdes1_cfg_tbl[] = {
20 	/* SerDes 1 */
21 	{1, {XAUI_FM1_MAC9, XAUI_FM1_MAC9,
22 		XAUI_FM1_MAC9, XAUI_FM1_MAC9,
23 		XAUI_FM1_MAC10, XAUI_FM1_MAC10,
24 		XAUI_FM1_MAC10, XAUI_FM1_MAC10}},
25 	{2, {HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
26 		HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
27 		HIGIG_FM1_MAC10, HIGIG_FM1_MAC10,
28 		HIGIG_FM1_MAC10, HIGIG_FM1_MAC10}},
29 	{4, {HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
30 		HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
31 		HIGIG_FM1_MAC10, HIGIG_FM1_MAC10,
32 		HIGIG_FM1_MAC10, HIGIG_FM1_MAC10}},
33 	{27, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6,
34 		SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC9,
35 		SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
36 		SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4} },
37 	{28, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6,
38 		SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC9,
39 		SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
40 		SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4}},
41 	{35, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6,
42 		SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC9,
43 		SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
44 		SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4} },
45 	{36, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6,
46 		SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC9,
47 		SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
48 		SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4}},
49 	{37, {NONE, NONE, QSGMII_FM1_B, NONE,
50 		NONE, NONE, QSGMII_FM1_A, NONE} },
51 	{38, {NONE, NONE, QSGMII_FM1_B, NONE,
52 		NONE, NONE, QSGMII_FM1_A, NONE}},
53 	{39, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6,
54 		SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC9,
55 		NONE, NONE, QSGMII_FM1_A, NONE} },
56 	{40, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6,
57 		SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC9,
58 		NONE, NONE, QSGMII_FM1_A, NONE}},
59 	{45, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6,
60 		SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC9,
61 		NONE, NONE, QSGMII_FM1_A, NONE} },
62 	{46, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6,
63 		SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC9,
64 		NONE, NONE, QSGMII_FM1_A, NONE}},
65 	{47, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6,
66 		SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC9,
67 		NONE, NONE, QSGMII_FM1_A, NONE} },
68 	{48, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6,
69 		SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC9,
70 		NONE, NONE, QSGMII_FM1_A, NONE}},
71 	{}
72 };
73 static const struct serdes_config serdes2_cfg_tbl[] = {
74 	/* SerDes 2 */
75 	{1, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
76 		XAUI_FM2_MAC9, XAUI_FM2_MAC9,
77 		XAUI_FM2_MAC10, XAUI_FM2_MAC10,
78 		XAUI_FM2_MAC10, XAUI_FM2_MAC10}},
79 	{2, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
80 		HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
81 		HIGIG_FM2_MAC10, HIGIG_FM2_MAC10,
82 		HIGIG_FM2_MAC10, HIGIG_FM2_MAC10}},
83 	{4, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
84 		HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
85 		HIGIG_FM2_MAC10, HIGIG_FM2_MAC10,
86 		HIGIG_FM2_MAC10, HIGIG_FM2_MAC10}},
87 	{6, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
88 		XAUI_FM2_MAC9, XAUI_FM2_MAC9,
89 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
90 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
91 	{7, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
92 		XAUI_FM2_MAC9, XAUI_FM2_MAC9,
93 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
94 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
95 	{12, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
96 		XAUI_FM2_MAC9, XAUI_FM2_MAC9,
97 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
98 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
99 	{13, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
100 		XAUI_FM2_MAC9, XAUI_FM2_MAC9,
101 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
102 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
103 	{14, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
104 		XAUI_FM2_MAC9, XAUI_FM2_MAC9,
105 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
106 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
107 	{15, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
108 		HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
109 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
110 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
111 	{16, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
112 		HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
113 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
114 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
115 	{21, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
116 		HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
117 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
118 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
119 	{22, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
120 		HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
121 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
122 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
123 	{23, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
124 		HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
125 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
126 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
127 	{24, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
128 		HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
129 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
130 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
131 	{25, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
132 		HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
133 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
134 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
135 	{26, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
136 		HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
137 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
138 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
139 	{27, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
140 		SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
141 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
142 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
143 	{28, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
144 		SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
145 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
146 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
147 	{35, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
148 		SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
149 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
150 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
151 	{36, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
152 		SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
153 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
154 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
155 	{37, {NONE, NONE, QSGMII_FM2_B, NONE,
156 		NONE, NONE, QSGMII_FM2_A, NONE} },
157 	{38, {NONE, NONE, QSGMII_FM2_B, NONE,
158 		NONE, NONE, QSGMII_FM2_A, NONE} },
159 	{39, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
160 		SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
161 		NONE, NONE, QSGMII_FM2_A, NONE} },
162 	{40, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
163 		SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
164 		NONE, NONE, QSGMII_FM2_A, NONE} },
165 	{45, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
166 		SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
167 		NONE, NONE, QSGMII_FM2_A, NONE} },
168 	{46, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
169 		SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
170 		NONE, NONE, QSGMII_FM2_A, NONE} },
171 	{47, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
172 		SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
173 		NONE, NONE, QSGMII_FM2_A, NONE} },
174 	{48, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
175 		SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
176 		NONE, NONE, QSGMII_FM2_A, NONE} },
177 	{49, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
178 		XAUI_FM2_MAC9, XAUI_FM2_MAC9,
179 		NONE, NONE, QSGMII_FM2_A, NONE} },
180 	{50, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
181 		XAUI_FM2_MAC9, XAUI_FM2_MAC9,
182 		NONE, NONE, QSGMII_FM2_A, NONE} },
183 	{51, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
184 		HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
185 		NONE, NONE, QSGMII_FM2_A, NONE} },
186 	{52, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
187 		HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
188 		NONE, NONE, QSGMII_FM2_A, NONE} },
189 	{53, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
190 		HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
191 		NONE, NONE, QSGMII_FM2_A, NONE} },
192 	{54, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
193 		HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
194 		NONE, NONE, QSGMII_FM2_A, NONE} },
195 	{55, {XFI_FM1_MAC9, XFI_FM1_MAC10,
196 		XFI_FM2_MAC10, XFI_FM2_MAC9,
197 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
198 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
199 	{56, {XFI_FM1_MAC9, XFI_FM1_MAC10,
200 		XFI_FM2_MAC10, XFI_FM2_MAC9,
201 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
202 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
203 	{57, {XFI_FM1_MAC9, XFI_FM1_MAC10,
204 		XFI_FM2_MAC10, XFI_FM2_MAC9,
205 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
206 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
207 	{}
208 };
209 static const struct serdes_config serdes3_cfg_tbl[] = {
210 	/* SerDes 3 */
211 	{1, {PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1} },
212 	{2, {PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1}},
213 	{3, {PCIE1, PCIE1, PCIE1, PCIE1, PCIE2, PCIE2, PCIE2, PCIE2} },
214 	{4, {PCIE1, PCIE1, PCIE1, PCIE1, PCIE2, PCIE2, PCIE2, PCIE2}},
215 	{5, {PCIE1, PCIE1, PCIE1, PCIE1, SRIO1, SRIO1, SRIO1, SRIO1} },
216 	{6, {PCIE1, PCIE1, PCIE1, PCIE1, SRIO1, SRIO1, SRIO1, SRIO1}},
217 	{7, {PCIE1, PCIE1, PCIE1, PCIE1, SRIO1, NONE, NONE, NONE} },
218 	{8, {PCIE1, PCIE1, PCIE1, PCIE1, SRIO1, NONE, NONE, NONE}},
219 	{9, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
220 		INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN}},
221 	{10, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
222 		INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN}},
223 	{11, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
224 		PCIE2, PCIE2, PCIE2, PCIE2} },
225 	{12, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
226 		PCIE2, PCIE2, PCIE2, PCIE2}},
227 	{13, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
228 		PCIE2, PCIE2, PCIE2, PCIE2} },
229 	{14, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
230 		PCIE2, PCIE2, PCIE2, PCIE2}},
231 	{15, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
232 		SRIO1, SRIO1, SRIO1, SRIO1} },
233 	{16, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
234 		SRIO1, SRIO1, SRIO1, SRIO1}},
235 	{17, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
236 		SRIO1, SRIO1, SRIO1, SRIO1}},
237 	{18, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
238 		SRIO1, SRIO1, SRIO1, SRIO1} },
239 	{19, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
240 		SRIO1, SRIO1, SRIO1, SRIO1}},
241 	{20, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
242 		SRIO1, SRIO1, SRIO1, SRIO1}},
243 	{}
244 };
245 static const struct serdes_config serdes4_cfg_tbl[] = {
246 	/* SerDes 4 */
247 	{1, {PCIE3, PCIE3, PCIE3, PCIE3, PCIE3, PCIE3, PCIE3, PCIE3} },
248 	{2, {PCIE3, PCIE3, PCIE3, PCIE3, PCIE3, PCIE3, PCIE3, PCIE3}},
249 	{3, {PCIE3, PCIE3, PCIE3, PCIE3, PCIE4, PCIE4, PCIE4, PCIE4} },
250 	{4, {PCIE3, PCIE3, PCIE3, PCIE3, PCIE4, PCIE4, PCIE4, PCIE4}},
251 	{5, {PCIE3, PCIE3, PCIE3, PCIE3, SRIO2, SRIO2, SRIO2, SRIO2} },
252 	{6, {PCIE3, PCIE3, PCIE3, PCIE3, SRIO2, SRIO2, SRIO2, SRIO2}},
253 	{7, {PCIE3, PCIE3, PCIE3, PCIE3, SRIO2, SRIO2, SRIO2, SRIO2} },
254 	{8, {PCIE3, PCIE3, PCIE3, PCIE3, SRIO2, SRIO2, SRIO2, SRIO2}},
255 	{9, {PCIE3, PCIE3, PCIE3, PCIE3, PCIE4, PCIE4, SATA1, SATA2} },
256 	{10, {PCIE3, PCIE3, PCIE3, PCIE3, PCIE4, PCIE4, SATA1, SATA2} },
257 	{11, {PCIE3, PCIE3, PCIE3, PCIE3, AURORA, AURORA, SATA1, SATA2} },
258 	{12, {PCIE3, PCIE3, PCIE3, PCIE3, AURORA, AURORA, SATA1, SATA2} },
259 	{13, {PCIE3, PCIE3, PCIE3, PCIE3, AURORA, AURORA, SRIO2, SRIO2} },
260 	{14, {PCIE3, PCIE3, PCIE3, PCIE3, AURORA, AURORA, SRIO2, SRIO2}},
261 	{15, {PCIE3, PCIE3, PCIE3, PCIE3, AURORA, AURORA, SRIO2, SRIO2} },
262 	{16, {PCIE3, PCIE3, PCIE3, PCIE3, AURORA, AURORA, SRIO2, SRIO2}},
263 	{18, {PCIE3, PCIE3, PCIE3, PCIE3, AURORA, AURORA, AURORA, AURORA}},
264 	{}
265 };
266 #elif defined(CONFIG_PPC_T4160) || defined(CONFIG_PPC_T4080)
267 static const struct serdes_config serdes1_cfg_tbl[] = {
268 	/* SerDes 1 */
269 	{1, {XAUI_FM1_MAC9, XAUI_FM1_MAC9,
270 		XAUI_FM1_MAC9, XAUI_FM1_MAC9,
271 		XAUI_FM1_MAC10, XAUI_FM1_MAC10,
272 		XAUI_FM1_MAC10, XAUI_FM1_MAC10} },
273 	{2, {HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
274 		HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
275 		HIGIG_FM1_MAC10, HIGIG_FM1_MAC10,
276 		HIGIG_FM1_MAC10, HIGIG_FM1_MAC10} },
277 	{4, {HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
278 		HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
279 		HIGIG_FM1_MAC10, HIGIG_FM1_MAC10,
280 		HIGIG_FM1_MAC10, HIGIG_FM1_MAC10} },
281 	{27, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6,
282 		SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC9,
283 		SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
284 		SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4} },
285 	{28, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6,
286 		SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC9,
287 		SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
288 		SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4} },
289 	{35, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6,
290 		SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC9,
291 		SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
292 		SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4} },
293 	{36, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6,
294 		SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC9,
295 		SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
296 		SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4} },
297 	{37, {NONE, NONE, QSGMII_FM1_B, NONE,
298 		NONE, NONE, QSGMII_FM1_A, NONE} },
299 	{38, {NONE, NONE, QSGMII_FM1_B, NONE,
300 		NONE, NONE, QSGMII_FM1_A, NONE} },
301 	{}
302 };
303 static const struct serdes_config serdes2_cfg_tbl[] = {
304 	/* SerDes 2 */
305 	{6, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
306 		XAUI_FM2_MAC9, XAUI_FM2_MAC9,
307 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
308 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
309 	{7, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
310 		XAUI_FM2_MAC9, XAUI_FM2_MAC9,
311 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
312 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
313 	{12, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
314 		XAUI_FM2_MAC9, XAUI_FM2_MAC9,
315 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
316 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
317 	{13, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
318 		XAUI_FM2_MAC9, XAUI_FM2_MAC9,
319 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
320 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
321 	{15, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
322 		HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
323 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
324 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
325 	{16, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
326 		HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
327 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
328 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
329 	{21, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
330 		HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
331 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
332 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
333 	{22, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
334 		HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
335 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
336 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
337 	{24, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
338 		HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
339 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
340 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
341 	{25, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
342 		HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
343 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
344 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
345 	{26, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
346 		HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
347 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
348 		NONE, NONE} },
349 	{27, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
350 		SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
351 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
352 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
353 	{28, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
354 		SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
355 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
356 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
357 	{35, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
358 		SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
359 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
360 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
361 	{36, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
362 		SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
363 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
364 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
365 	{37, {NONE, NONE, QSGMII_FM2_B, NONE,
366 		NONE, QSGMII_FM1_A, NONE, NONE} },
367 	{38, {NONE, NONE, QSGMII_FM2_B, NONE,
368 		NONE, QSGMII_FM1_A, NONE, NONE} },
369 	{39, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
370 		SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
371 		NONE, QSGMII_FM1_A, NONE, NONE} },
372 	{40, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
373 		SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
374 		NONE, QSGMII_FM1_A, NONE, NONE} },
375 	{45, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
376 		SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
377 		NONE, QSGMII_FM1_A, NONE, NONE} },
378 	{46, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
379 		SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
380 		NONE, QSGMII_FM1_A, NONE, NONE} },
381 	{47, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
382 		SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
383 		NONE, QSGMII_FM1_A, NONE, NONE} },
384 	{48, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
385 		SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
386 		NONE, QSGMII_FM1_A, NONE, NONE} },
387 	{49, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
388 		XAUI_FM2_MAC9, XAUI_FM2_MAC9,
389 		NONE, NONE, NONE, NONE} },
390 	{50, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
391 		XAUI_FM2_MAC9, XAUI_FM2_MAC9,
392 		NONE, NONE, NONE, NONE} },
393 	{51, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
394 		HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
395 		NONE, NONE, NONE, NONE} },
396 	{52, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
397 		HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
398 		NONE, NONE, NONE, NONE} },
399 	{53, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
400 		HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
401 		NONE, NONE, NONE, NONE} },
402 	{54, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
403 		HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
404 		NONE, NONE, NONE, NONE} },
405 	{55, {NONE, XFI_FM1_MAC10,
406 		XFI_FM2_MAC10, NONE,
407 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
408 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
409 	{56, {NONE, XFI_FM1_MAC10,
410 		XFI_FM2_MAC10, NONE,
411 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
412 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
413 	{57, {NONE, XFI_FM1_MAC10,
414 		XFI_FM2_MAC10, NONE,
415 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
416 		NONE, NONE} },
417 	{}
418 };
419 static const struct serdes_config serdes3_cfg_tbl[] = {
420 	/* SerDes 3 */
421 	{1, {PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1} },
422 	{2, {PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1} },
423 	{3, {PCIE1, PCIE1, PCIE1, PCIE1, PCIE2, PCIE2, PCIE2, PCIE2} },
424 	{4, {PCIE1, PCIE1, PCIE1, PCIE1, PCIE2, PCIE2, PCIE2, PCIE2} },
425 	{5, {PCIE1, PCIE1, PCIE1, PCIE1, SRIO1, SRIO1, SRIO1, SRIO1} },
426 	{6, {PCIE1, PCIE1, PCIE1, PCIE1, SRIO1, SRIO1, SRIO1, SRIO1} },
427 	{7, {PCIE1, PCIE1, PCIE1, PCIE1, SRIO1, NONE, NONE, NONE} },
428 	{8, {PCIE1, PCIE1, PCIE1, PCIE1, SRIO1, NONE, NONE, NONE} },
429 	{9, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
430 		INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN} },
431 	{10, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
432 		INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN} },
433 	{11, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
434 		PCIE2, PCIE2, PCIE2, PCIE2} },
435 	{12, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
436 		PCIE2, PCIE2, PCIE2, PCIE2} },
437 	{13, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
438 		PCIE2, PCIE2, PCIE2, PCIE2} },
439 	{14, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
440 		PCIE2, PCIE2, PCIE2, PCIE2} },
441 	{15, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
442 		SRIO1, SRIO1, SRIO1, SRIO1} },
443 	{16, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
444 		SRIO1, SRIO1, SRIO1, SRIO1} },
445 	{17, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
446 		SRIO1, SRIO1, SRIO1, SRIO1} },
447 	{18, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
448 		SRIO1, SRIO1, SRIO1, SRIO1} },
449 	{19, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
450 		SRIO1, SRIO1, SRIO1, SRIO1} },
451 	{20, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
452 			NONE, NONE, NONE, NONE} },
453 	{}
454 };
455 static const struct serdes_config serdes4_cfg_tbl[] = {
456 	/* SerDes 4 */
457 	{3, {PCIE3, PCIE3, PCIE3, PCIE3, PCIE4, PCIE4, PCIE4, PCIE4} },
458 	{4, {PCIE3, PCIE3, PCIE3, PCIE3, PCIE4, PCIE4, PCIE4, PCIE4} },
459 	{5, {SRIO2, SRIO2, SRIO2, SRIO2, SRIO2, SRIO2, SRIO2, SRIO2} },
460 	{6, {SRIO2, SRIO2, SRIO2, SRIO2, SRIO2, SRIO2, SRIO2, SRIO2} },
461 	{7, {SRIO2, SRIO2, SRIO2, SRIO2, SRIO2, SRIO2, SRIO2, SRIO2} },
462 	{8, {SRIO2, SRIO2, SRIO2, SRIO2, SRIO2, SRIO2, SRIO2, SRIO2} },
463 	{9, {PCIE3, PCIE3, PCIE3, PCIE3, SATA1, SATA1, SATA2, SATA2} },
464 	{10, {PCIE3, PCIE3, PCIE3, PCIE3, SATA1, SATA1, SATA2, SATA2} },
465 	{11, {AURORA, AURORA, AURORA, AURORA, SATA1, SATA1, SATA2, SATA2} },
466 	{12, {AURORA, AURORA, AURORA, AURORA, SATA1, SATA1, SATA2, SATA2} },
467 	{13, {AURORA, AURORA, AURORA, AURORA, SRIO2, SRIO2, SRIO2, SRIO2} },
468 	{14, {AURORA, AURORA, AURORA, AURORA, SRIO2, SRIO2, SRIO2, SRIO2} },
469 	{15, {AURORA, AURORA, AURORA, AURORA, SRIO2, SRIO2, SRIO2, SRIO2} },
470 	{16, {AURORA, AURORA, AURORA, AURORA, SRIO2, SRIO2, SRIO2, SRIO2} },
471 	{18, {AURORA, AURORA, AURORA, AURORA, AURORA, AURORA, AURORA, AURORA} },
472 	{}
473 }
474 ;
475 #else
476 #error "Need to define SerDes protocol"
477 #endif
478 static const struct serdes_config *serdes_cfg_tbl[] = {
479 	serdes1_cfg_tbl,
480 	serdes2_cfg_tbl,
481 	serdes3_cfg_tbl,
482 	serdes4_cfg_tbl,
483 };
484 
485 enum srds_prtcl serdes_get_prtcl(int serdes, int cfg, int lane)
486 {
487 	const struct serdes_config *ptr;
488 
489 	if (serdes >= ARRAY_SIZE(serdes_cfg_tbl))
490 		return 0;
491 
492 	ptr = serdes_cfg_tbl[serdes];
493 	while (ptr->protocol) {
494 		if (ptr->protocol == cfg)
495 			return ptr->lanes[lane];
496 		ptr++;
497 	}
498 	return 0;
499 }
500 
501 int is_serdes_prtcl_valid(int serdes, u32 prtcl)
502 {
503 	int i;
504 	const struct serdes_config *ptr;
505 
506 	if (serdes >= ARRAY_SIZE(serdes_cfg_tbl))
507 		return 0;
508 
509 	ptr = serdes_cfg_tbl[serdes];
510 	while (ptr->protocol) {
511 		if (ptr->protocol == prtcl)
512 			break;
513 		ptr++;
514 	}
515 
516 	if (!ptr->protocol)
517 		return 0;
518 
519 	for (i = 0; i < SRDS_MAX_LANES; i++) {
520 		if (ptr->lanes[i] != NONE)
521 			return 1;
522 	}
523 
524 	return 0;
525 }
526