1a5bcb13e7232269038205c305bb3820c151d732
[oweals/u-boot.git] / arch / powerpc / cpu / mpc85xx / t4240_serdes.c
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_ARCH_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_ARCH_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 }