1629d6b32SShengzhou Liu /*
2629d6b32SShengzhou Liu * Copyright 2013 Freescale Semiconductor, Inc.
3629d6b32SShengzhou Liu *
4629d6b32SShengzhou Liu * Shengzhou Liu <Shengzhou.Liu@freescale.com>
5629d6b32SShengzhou Liu *
6629d6b32SShengzhou Liu * SPDX-License-Identifier: GPL-2.0+
7629d6b32SShengzhou Liu */
8629d6b32SShengzhou Liu
9629d6b32SShengzhou Liu #include <common.h>
10629d6b32SShengzhou Liu #include <asm/fsl_serdes.h>
11629d6b32SShengzhou Liu #include <asm/processor.h>
12629d6b32SShengzhou Liu #include "fsl_corenet2_serdes.h"
13629d6b32SShengzhou Liu
14629d6b32SShengzhou Liu struct serdes_config {
15629d6b32SShengzhou Liu u32 protocol;
16629d6b32SShengzhou Liu u8 lanes[SRDS_MAX_LANES];
17629d6b32SShengzhou Liu };
18629d6b32SShengzhou Liu
19629d6b32SShengzhou Liu static const struct serdes_config serdes1_cfg_tbl[] = {
20629d6b32SShengzhou Liu /* SerDes 1 */
21629d6b32SShengzhou Liu {0x6E, {XFI_FM1_MAC9, XFI_FM1_MAC10,
22629d6b32SShengzhou Liu SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
23629d6b32SShengzhou Liu PCIE4, PCIE4, SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
24629d6b32SShengzhou Liu {0xBC, {PCIE3, PCIE3, SGMII_FM1_DTSEC1,
25629d6b32SShengzhou Liu SGMII_FM1_DTSEC2, PCIE4, PCIE4, PCIE4, PCIE4} },
26629d6b32SShengzhou Liu {0xC8, {PCIE3, SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC1,
27629d6b32SShengzhou Liu SGMII_FM1_DTSEC2, PCIE4, PCIE4,
28629d6b32SShengzhou Liu SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
29629d6b32SShengzhou Liu {0xD6, {PCIE3, SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC1,
30629d6b32SShengzhou Liu SGMII_FM1_DTSEC2, PCIE4, PCIE4,
31629d6b32SShengzhou Liu SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
32629d6b32SShengzhou Liu {0xDE, {PCIE3, PCIE3, PCIE3, PCIE3,
33629d6b32SShengzhou Liu PCIE4, PCIE1, PCIE2, SGMII_FM1_DTSEC6} },
34629d6b32SShengzhou Liu {0xE0, {PCIE3, PCIE3, PCIE3, PCIE3, PCIE4,
35629d6b32SShengzhou Liu PCIE1, SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
36629d6b32SShengzhou Liu {0xF2, {PCIE3, SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC1,
37629d6b32SShengzhou Liu SGMII_FM1_DTSEC2, PCIE4, PCIE1, PCIE2, SGMII_FM1_DTSEC6} },
38629d6b32SShengzhou Liu {0xF8, {PCIE3, SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC1,
39629d6b32SShengzhou Liu SGMII_FM1_DTSEC2, PCIE4, PCIE1, PCIE2, SGMII_FM1_DTSEC6} },
40629d6b32SShengzhou Liu {0xFA, {PCIE3, SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC1,
41629d6b32SShengzhou Liu SGMII_FM1_DTSEC2, PCIE4, PCIE1,
42629d6b32SShengzhou Liu SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
43629d6b32SShengzhou Liu {0x6C, {XFI_FM1_MAC9, XFI_FM1_MAC10,
44629d6b32SShengzhou Liu SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
45629d6b32SShengzhou Liu PCIE4, PCIE4, PCIE4, PCIE4} },
469752eb64SShengzhou Liu {0x1B, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC10,
479752eb64SShengzhou Liu SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
489752eb64SShengzhou Liu SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4,
499752eb64SShengzhou Liu SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
50629d6b32SShengzhou Liu {0x1C, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC10,
51629d6b32SShengzhou Liu SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
52629d6b32SShengzhou Liu SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4,
53629d6b32SShengzhou Liu SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
54629d6b32SShengzhou Liu {0x95, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC10,
55629d6b32SShengzhou Liu SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
56629d6b32SShengzhou Liu SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4,
57629d6b32SShengzhou Liu SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
58629d6b32SShengzhou Liu {0xA2, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC10,
59629d6b32SShengzhou Liu SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
60629d6b32SShengzhou Liu SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4,
61629d6b32SShengzhou Liu SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
62629d6b32SShengzhou Liu {0x94, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC10,
63629d6b32SShengzhou Liu SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
64629d6b32SShengzhou Liu SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4,
65629d6b32SShengzhou Liu SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
669752eb64SShengzhou Liu {0x50, {XAUI_FM1_MAC9, XAUI_FM1_MAC9,
679752eb64SShengzhou Liu XAUI_FM1_MAC9, XAUI_FM1_MAC9,
689752eb64SShengzhou Liu PCIE4, SGMII_FM1_DTSEC4,
699752eb64SShengzhou Liu SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
70629d6b32SShengzhou Liu {0x51, {XAUI_FM1_MAC9, XAUI_FM1_MAC9,
71629d6b32SShengzhou Liu XAUI_FM1_MAC9, XAUI_FM1_MAC9,
72629d6b32SShengzhou Liu PCIE4, SGMII_FM1_DTSEC4,
73629d6b32SShengzhou Liu SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
749752eb64SShengzhou Liu {0x5E, {HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
759752eb64SShengzhou Liu HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
769752eb64SShengzhou Liu PCIE4, SGMII_FM1_DTSEC4,
779752eb64SShengzhou Liu SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
78629d6b32SShengzhou Liu {0x5F, {HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
79629d6b32SShengzhou Liu HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
80629d6b32SShengzhou Liu PCIE4, SGMII_FM1_DTSEC4,
81629d6b32SShengzhou Liu SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
829752eb64SShengzhou Liu {0x64, {HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
839752eb64SShengzhou Liu HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
849752eb64SShengzhou Liu PCIE4, SGMII_FM1_DTSEC4,
859752eb64SShengzhou Liu SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
86629d6b32SShengzhou Liu {0x65, {HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
87629d6b32SShengzhou Liu HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
88629d6b32SShengzhou Liu PCIE4, SGMII_FM1_DTSEC4,
89629d6b32SShengzhou Liu SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
909752eb64SShengzhou Liu {0x6A, {XFI_FM1_MAC9, XFI_FM1_MAC10,
919752eb64SShengzhou Liu XFI_FM1_MAC1, XFI_FM1_MAC2,
929752eb64SShengzhou Liu PCIE4, SGMII_FM1_DTSEC4,
939752eb64SShengzhou Liu SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
94629d6b32SShengzhou Liu {0x6B, {XFI_FM1_MAC9, XFI_FM1_MAC10,
95629d6b32SShengzhou Liu XFI_FM1_MAC1, XFI_FM1_MAC2,
96629d6b32SShengzhou Liu PCIE4, SGMII_FM1_DTSEC4,
97629d6b32SShengzhou Liu SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
98629d6b32SShengzhou Liu {0x6D, {XFI_FM1_MAC9, XFI_FM1_MAC10,
99629d6b32SShengzhou Liu SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
100629d6b32SShengzhou Liu PCIE4, PCIE4, PCIE4, PCIE4} },
101629d6b32SShengzhou Liu {0x71, {XFI_FM1_MAC9, XFI_FM1_MAC10,
102629d6b32SShengzhou Liu SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2, PCIE4,
103629d6b32SShengzhou Liu SGMII_FM1_DTSEC4, SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
104629d6b32SShengzhou Liu {0xA6, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC10,
105629d6b32SShengzhou Liu SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2, PCIE4,
106629d6b32SShengzhou Liu PCIE4, SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
107629d6b32SShengzhou Liu {0x8E, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC10,
108629d6b32SShengzhou Liu SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2, PCIE4,
109629d6b32SShengzhou Liu PCIE4, SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
110629d6b32SShengzhou Liu {0x8F, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC10,
111629d6b32SShengzhou Liu SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2, PCIE4,
112629d6b32SShengzhou Liu PCIE4, SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
113629d6b32SShengzhou Liu {0x82, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC10,
114629d6b32SShengzhou Liu SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
115629d6b32SShengzhou Liu PCIE4, PCIE4, SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
116629d6b32SShengzhou Liu {0x83, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC10,
117629d6b32SShengzhou Liu SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
118629d6b32SShengzhou Liu PCIE4, PCIE4, SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
119629d6b32SShengzhou Liu {0xA4, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC10,
120629d6b32SShengzhou Liu SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
121629d6b32SShengzhou Liu PCIE4, PCIE4, PCIE4, PCIE4} },
122629d6b32SShengzhou Liu {0x96, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC10,
123629d6b32SShengzhou Liu SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
124629d6b32SShengzhou Liu PCIE4, PCIE4, PCIE4, PCIE4} },
125629d6b32SShengzhou Liu {0x8A, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC10,
126629d6b32SShengzhou Liu SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
127629d6b32SShengzhou Liu PCIE4, PCIE4, PCIE4, PCIE4} },
128629d6b32SShengzhou Liu {0x67, {XFI_FM1_MAC9, XFI_FM1_MAC10,
129629d6b32SShengzhou Liu XFI_FM1_MAC1, XFI_FM1_MAC2,
130629d6b32SShengzhou Liu PCIE4, PCIE4, PCIE4, PCIE4} },
131629d6b32SShengzhou Liu {0xAB, {PCIE3, PCIE3, PCIE3, PCIE3,
132629d6b32SShengzhou Liu PCIE4, PCIE4, PCIE4, PCIE4} },
133629d6b32SShengzhou Liu {0xDA, {PCIE3, PCIE3, PCIE3, PCIE3,
134629d6b32SShengzhou Liu PCIE3, PCIE3, PCIE3, PCIE3} },
135629d6b32SShengzhou Liu {0xD9, {PCIE3, SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC1,
136629d6b32SShengzhou Liu SGMII_FM1_DTSEC2, PCIE4, SGMII_FM1_DTSEC4,
137629d6b32SShengzhou Liu SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
1389752eb64SShengzhou Liu {0xD2, {PCIE3, SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC1,
1399752eb64SShengzhou Liu SGMII_FM1_DTSEC2, PCIE4, SGMII_FM1_DTSEC4,
1409752eb64SShengzhou Liu SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
141629d6b32SShengzhou Liu {0xD3, {PCIE3, SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC1,
142629d6b32SShengzhou Liu SGMII_FM1_DTSEC2, PCIE4, SGMII_FM1_DTSEC4,
143629d6b32SShengzhou Liu SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
144629d6b32SShengzhou Liu {0xCB, {PCIE3, SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC1,
145629d6b32SShengzhou Liu SGMII_FM1_DTSEC2, PCIE4, SGMII_FM1_DTSEC4,
146629d6b32SShengzhou Liu SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
147629d6b32SShengzhou Liu {0xD8, {PCIE3, SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC1,
148629d6b32SShengzhou Liu SGMII_FM1_DTSEC2, PCIE4, SGMII_FM1_DTSEC4,
149629d6b32SShengzhou Liu SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
150629d6b32SShengzhou Liu {0x66, {XFI_FM1_MAC9, XFI_FM1_MAC10,
151629d6b32SShengzhou Liu XFI_FM1_MAC1, XFI_FM1_MAC2,
152629d6b32SShengzhou Liu PCIE4, PCIE4, PCIE4, PCIE4} },
153629d6b32SShengzhou Liu {0xAA, {PCIE3, PCIE3, PCIE3, PCIE3,
154629d6b32SShengzhou Liu PCIE4, PCIE4, PCIE4, PCIE4} },
155629d6b32SShengzhou Liu {0xCA, {PCIE3, SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC1,
156629d6b32SShengzhou Liu SGMII_FM1_DTSEC2, PCIE4, SGMII_FM1_DTSEC4,
157629d6b32SShengzhou Liu SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
158629d6b32SShengzhou Liu {0x70, {XFI_FM1_MAC9, XFI_FM1_MAC10, SGMII_FM1_DTSEC1,
159629d6b32SShengzhou Liu SGMII_FM1_DTSEC2, PCIE4, SGMII_FM1_DTSEC4,
160629d6b32SShengzhou Liu SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
161629d6b32SShengzhou Liu {}
162629d6b32SShengzhou Liu };
163629d6b32SShengzhou Liu
164*0f3d80e9SYork Sun #ifndef CONFIG_ARCH_T2081
165629d6b32SShengzhou Liu static const struct serdes_config serdes2_cfg_tbl[] = {
166629d6b32SShengzhou Liu /* SerDes 2 */
167629d6b32SShengzhou Liu {0x1F, {PCIE1, PCIE1, PCIE1, PCIE1, PCIE2, PCIE2, PCIE2, PCIE2} },
168629d6b32SShengzhou Liu {0x16, {PCIE1, PCIE1, PCIE1, PCIE1, PCIE2, PCIE2, SATA1, SATA2} },
169629d6b32SShengzhou Liu {0x01, {PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1} },
170629d6b32SShengzhou Liu {0x29, {SRIO2, SRIO2, SRIO2, SRIO2, SRIO1, SRIO1, SRIO1, SRIO1} },
171629d6b32SShengzhou Liu {0x2D, {SRIO2, SRIO2, SRIO2, SRIO2, SRIO1, SRIO1, SRIO1, SRIO1} },
1722519cb34SShengzhou Liu {0x2E, {SRIO2, SRIO2, SRIO2, SRIO2, SRIO1, SRIO1, SRIO1, SRIO1} },
173629d6b32SShengzhou Liu {0x15, {PCIE1, PCIE1, PCIE1, PCIE1, PCIE2, PCIE2, SATA1, SATA2} },
174aaee5230SShengzhou Liu {0x27, {PCIE1, PCIE1, PCIE1, PCIE1, NONE, NONE, SATA1, SATA2} },
175629d6b32SShengzhou Liu {0x18, {PCIE1, PCIE1, PCIE1, PCIE1, AURORA, AURORA, SATA1, SATA2} },
176629d6b32SShengzhou Liu {0x02, {PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1} },
177629d6b32SShengzhou Liu {0x36, {SRIO2, SRIO2, SRIO2, SRIO2, AURORA, AURORA, SATA1, SATA2} },
178629d6b32SShengzhou Liu {}
179629d6b32SShengzhou Liu };
180629d6b32SShengzhou Liu #endif
181629d6b32SShengzhou Liu
182629d6b32SShengzhou Liu static const struct serdes_config *serdes_cfg_tbl[] = {
183629d6b32SShengzhou Liu serdes1_cfg_tbl,
184*0f3d80e9SYork Sun #ifndef CONFIG_ARCH_T2081
185629d6b32SShengzhou Liu serdes2_cfg_tbl,
186629d6b32SShengzhou Liu #endif
187629d6b32SShengzhou Liu };
188629d6b32SShengzhou Liu
serdes_get_prtcl(int serdes,int cfg,int lane)189629d6b32SShengzhou Liu enum srds_prtcl serdes_get_prtcl(int serdes, int cfg, int lane)
190629d6b32SShengzhou Liu {
191629d6b32SShengzhou Liu const struct serdes_config *ptr;
192629d6b32SShengzhou Liu
193629d6b32SShengzhou Liu if (serdes >= ARRAY_SIZE(serdes_cfg_tbl))
194629d6b32SShengzhou Liu return 0;
195629d6b32SShengzhou Liu
196629d6b32SShengzhou Liu ptr = serdes_cfg_tbl[serdes];
197629d6b32SShengzhou Liu while (ptr->protocol) {
198629d6b32SShengzhou Liu if (ptr->protocol == cfg)
199629d6b32SShengzhou Liu return ptr->lanes[lane];
200629d6b32SShengzhou Liu ptr++;
201629d6b32SShengzhou Liu }
202629d6b32SShengzhou Liu return 0;
203629d6b32SShengzhou Liu }
204629d6b32SShengzhou Liu
is_serdes_prtcl_valid(int serdes,u32 prtcl)205629d6b32SShengzhou Liu int is_serdes_prtcl_valid(int serdes, u32 prtcl)
206629d6b32SShengzhou Liu {
207629d6b32SShengzhou Liu int i;
208629d6b32SShengzhou Liu const struct serdes_config *ptr;
209629d6b32SShengzhou Liu
210629d6b32SShengzhou Liu if (serdes >= ARRAY_SIZE(serdes_cfg_tbl))
211629d6b32SShengzhou Liu return 0;
212629d6b32SShengzhou Liu
213629d6b32SShengzhou Liu ptr = serdes_cfg_tbl[serdes];
214629d6b32SShengzhou Liu while (ptr->protocol) {
215629d6b32SShengzhou Liu if (ptr->protocol == prtcl)
216629d6b32SShengzhou Liu break;
217629d6b32SShengzhou Liu ptr++;
218629d6b32SShengzhou Liu }
219629d6b32SShengzhou Liu
220629d6b32SShengzhou Liu if (!ptr->protocol)
221629d6b32SShengzhou Liu return 0;
222629d6b32SShengzhou Liu
223629d6b32SShengzhou Liu for (i = 0; i < SRDS_MAX_LANES; i++) {
224629d6b32SShengzhou Liu if (ptr->lanes[i] != NONE)
225629d6b32SShengzhou Liu return 1;
226629d6b32SShengzhou Liu }
227629d6b32SShengzhou Liu
228629d6b32SShengzhou Liu return 0;
229629d6b32SShengzhou Liu }
230