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, SRIO1, SRIO1, SRIO1} },
218 	{8, {PCIE1, PCIE1, PCIE1, PCIE1, SRIO1, SRIO1, SRIO1, SRIO1} },
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, {NONE, NONE, NONE, NONE,
270 		XAUI_FM1_MAC10, XAUI_FM1_MAC10,
271 		XAUI_FM1_MAC10, XAUI_FM1_MAC10} },
272 	{2, {NONE, NONE, NONE, NONE,
273 		HIGIG_FM1_MAC10, HIGIG_FM1_MAC10,
274 		HIGIG_FM1_MAC10, HIGIG_FM1_MAC10} },
275 	{4, {NONE, NONE, NONE, NONE,
276 		HIGIG_FM1_MAC10, HIGIG_FM1_MAC10,
277 		HIGIG_FM1_MAC10, HIGIG_FM1_MAC10} },
278 	{27, {NONE, NONE, NONE, NONE,
279 		SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
280 		SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4} },
281 	{28, {NONE, NONE, NONE, NONE,
282 		SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
283 		SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4} },
284 	{35, {NONE, NONE, NONE, NONE,
285 		SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
286 		SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4} },
287 	{36, {NONE, NONE, NONE, NONE,
288 		SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
289 		SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4} },
290 	{37, {NONE, NONE, NONE, NONE,
291 		NONE, NONE, QSGMII_FM1_A, NONE} },
292 	{38, {NONE, NONE, NONE, NONE,
293 		NONE, NONE, QSGMII_FM1_A, NONE} },
294 	{}
295 };
296 static const struct serdes_config serdes2_cfg_tbl[] = {
297 	/* SerDes 2 */
298 	{6, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
299 		XAUI_FM2_MAC9, XAUI_FM2_MAC9,
300 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
301 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
302 	{7, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
303 		XAUI_FM2_MAC9, XAUI_FM2_MAC9,
304 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
305 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
306 	{12, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
307 		XAUI_FM2_MAC9, XAUI_FM2_MAC9,
308 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
309 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
310 	{13, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
311 		XAUI_FM2_MAC9, XAUI_FM2_MAC9,
312 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
313 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
314 	{15, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
315 		HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
316 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
317 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
318 	{16, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
319 		HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
320 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
321 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
322 	{21, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
323 		HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
324 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
325 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
326 	{22, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
327 		HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
328 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
329 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
330 	{24, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
331 		HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
332 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
333 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
334 	{25, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
335 		HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
336 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
337 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
338 	{26, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
339 		HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
340 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
341 		NONE, NONE} },
342 	{27, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
343 		SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
344 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
345 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
346 	{28, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
347 		SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
348 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
349 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
350 	{35, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
351 		SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
352 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
353 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
354 	{36, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
355 		SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
356 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
357 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
358 	{37, {NONE, NONE, QSGMII_FM2_B, NONE,
359 		NONE, NONE, QSGMII_FM2_A, NONE} },
360 	{38, {NONE, NONE, QSGMII_FM2_B, NONE,
361 		NONE, NONE, QSGMII_FM2_A, NONE} },
362 	{39, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
363 		SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
364 		NONE, NONE, QSGMII_FM2_A, NONE} },
365 	{40, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
366 		SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
367 		NONE, NONE, QSGMII_FM2_A, NONE} },
368 	{45, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
369 		SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
370 		NONE, NONE, QSGMII_FM2_A, NONE} },
371 	{46, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
372 		SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
373 		NONE, NONE, QSGMII_FM2_A, NONE} },
374 	{47, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
375 		SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
376 		NONE, NONE, QSGMII_FM2_A, NONE} },
377 	{48, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
378 		SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
379 		NONE, NONE, QSGMII_FM2_A, NONE} },
380 	{49, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
381 		XAUI_FM2_MAC9, XAUI_FM2_MAC9,
382 		NONE, NONE, QSGMII_FM2_A, NONE} },
383 	{50, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
384 		XAUI_FM2_MAC9, XAUI_FM2_MAC9,
385 		NONE, NONE, QSGMII_FM2_A, NONE} },
386 	{51, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
387 		HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
388 		NONE, NONE, QSGMII_FM2_A, NONE} },
389 	{52, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
390 		HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
391 		NONE, NONE, QSGMII_FM2_A, NONE} },
392 	{53, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
393 		HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
394 		NONE, NONE, QSGMII_FM2_A, NONE} },
395 	{54, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
396 		HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
397 		NONE, NONE, QSGMII_FM2_A, NONE} },
398 	{55, {NONE, XFI_FM1_MAC10,
399 		XFI_FM2_MAC10, NONE,
400 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
401 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
402 	{56, {NONE, XFI_FM1_MAC10,
403 		XFI_FM2_MAC10, NONE,
404 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
405 		SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
406 	{57, {NONE, XFI_FM1_MAC10,
407 		XFI_FM2_MAC10, NONE,
408 		SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
409 		NONE, NONE} },
410 	{}
411 };
412 static const struct serdes_config serdes3_cfg_tbl[] = {
413 	/* SerDes 3 */
414 	{1, {PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1} },
415 	{2, {PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1} },
416 	{3, {PCIE1, PCIE1, PCIE1, PCIE1, PCIE2, PCIE2, PCIE2, PCIE2} },
417 	{4, {PCIE1, PCIE1, PCIE1, PCIE1, PCIE2, PCIE2, PCIE2, PCIE2} },
418 	{5, {PCIE1, PCIE1, PCIE1, PCIE1, SRIO1, SRIO1, SRIO1, SRIO1} },
419 	{6, {PCIE1, PCIE1, PCIE1, PCIE1, SRIO1, SRIO1, SRIO1, SRIO1} },
420 	{7, {PCIE1, PCIE1, PCIE1, PCIE1, SRIO1, SRIO1, SRIO1, SRIO1} },
421 	{8, {PCIE1, PCIE1, PCIE1, PCIE1, SRIO1, SRIO1, SRIO1, SRIO1} },
422 	{9, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
423 		INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN} },
424 	{10, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
425 		INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN} },
426 	{11, {NONE, NONE, NONE, NONE,
427 		PCIE2, PCIE2, PCIE2, PCIE2} },
428 	{12, {NONE, NONE, NONE, NONE,
429 		PCIE2, PCIE2, PCIE2, PCIE2} },
430 	{13, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
431 		PCIE2, PCIE2, PCIE2, PCIE2} },
432 	{14, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
433 		PCIE2, PCIE2, PCIE2, PCIE2} },
434 	{15, {NONE, NONE, NONE, NONE,
435 		SRIO1, SRIO1, SRIO1, SRIO1} },
436 	{16, {NONE, NONE, NONE, NONE,
437 		SRIO1, SRIO1, SRIO1, SRIO1} },
438 	{17, {NONE, NONE, NONE, NONE,
439 		SRIO1, SRIO1, SRIO1, SRIO1} },
440 	{18, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
441 		SRIO1, SRIO1, SRIO1, SRIO1} },
442 	{19, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
443 		SRIO1, SRIO1, SRIO1, SRIO1} },
444 	{20, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
445 		SRIO1, SRIO1, SRIO1, SRIO1} },
446 	{}
447 };
448 static const struct serdes_config serdes4_cfg_tbl[] = {
449 	/* SerDes 4 */
450 	{3, {NONE, NONE, NONE, NONE, PCIE4, PCIE4, PCIE4, PCIE4} },
451 	{4, {NONE, NONE, NONE, NONE, PCIE4, PCIE4, PCIE4, PCIE4} },
452 	{5, {NONE, NONE, NONE, NONE, SRIO2, SRIO2, SRIO2, SRIO2} },
453 	{6, {NONE, NONE, NONE, NONE, SRIO2, SRIO2, SRIO2, SRIO2} },
454 	{7, {NONE, NONE, NONE, NONE, SRIO2, SRIO2, SRIO2, SRIO2} },
455 	{8, {NONE, NONE, NONE, NONE, SRIO2, SRIO2, SRIO2, SRIO2} },
456 	{9, {NONE, NONE, NONE, NONE, PCIE4, PCIE4, SATA1, SATA2} },
457 	{10, {NONE, NONE, NONE, NONE, PCIE4, PCIE4, SATA1, SATA2} },
458 	{11, {NONE, NONE, NONE, NONE, AURORA, AURORA, SATA1, SATA2} },
459 	{12, {NONE, NONE, NONE, NONE, AURORA, AURORA, SATA1, SATA2} },
460 	{13, {NONE, NONE, NONE, NONE, AURORA, AURORA, SRIO2, SRIO2} },
461 	{14, {NONE, NONE, NONE, NONE, AURORA, AURORA, SRIO2, SRIO2} },
462 	{15, {NONE, NONE, NONE, NONE, AURORA, AURORA, SRIO2, SRIO2} },
463 	{16, {NONE, NONE, NONE, NONE, AURORA, AURORA, SRIO2, SRIO2} },
464 	{18, {NONE, NONE, NONE, NONE, AURORA, AURORA, AURORA, AURORA} },
465 	{}
466 }
467 ;
468 #else
469 #error "Need to define SerDes protocol"
470 #endif
471 static const struct serdes_config *serdes_cfg_tbl[] = {
472 	serdes1_cfg_tbl,
473 	serdes2_cfg_tbl,
474 	serdes3_cfg_tbl,
475 	serdes4_cfg_tbl,
476 };
477 
478 enum srds_prtcl serdes_get_prtcl(int serdes, int cfg, int lane)
479 {
480 	const struct serdes_config *ptr;
481 
482 	if (serdes >= ARRAY_SIZE(serdes_cfg_tbl))
483 		return 0;
484 
485 	ptr = serdes_cfg_tbl[serdes];
486 	while (ptr->protocol) {
487 		if (ptr->protocol == cfg)
488 			return ptr->lanes[lane];
489 		ptr++;
490 	}
491 	return 0;
492 }
493 
494 int is_serdes_prtcl_valid(int serdes, u32 prtcl)
495 {
496 	int i;
497 	const struct serdes_config *ptr;
498 
499 	if (serdes >= ARRAY_SIZE(serdes_cfg_tbl))
500 		return 0;
501 
502 	ptr = serdes_cfg_tbl[serdes];
503 	while (ptr->protocol) {
504 		if (ptr->protocol == prtcl)
505 			break;
506 		ptr++;
507 	}
508 
509 	if (!ptr->protocol)
510 		return 0;
511 
512 	for (i = 0; i < SRDS_MAX_LANES; i++) {
513 		if (ptr->lanes[i] != NONE)
514 			return 1;
515 	}
516 
517 	return 0;
518 }
519