1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * Copyright 2013 Freescale Semiconductor, Inc.
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * Shengzhou Liu <Shengzhou.Liu@freescale.com>
5*4882a593Smuzhiyun *
6*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+
7*4882a593Smuzhiyun */
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun #include <common.h>
10*4882a593Smuzhiyun #include <asm/fsl_serdes.h>
11*4882a593Smuzhiyun #include <asm/processor.h>
12*4882a593Smuzhiyun #include "fsl_corenet2_serdes.h"
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun struct serdes_config {
15*4882a593Smuzhiyun u32 protocol;
16*4882a593Smuzhiyun u8 lanes[SRDS_MAX_LANES];
17*4882a593Smuzhiyun };
18*4882a593Smuzhiyun
19*4882a593Smuzhiyun static const struct serdes_config serdes1_cfg_tbl[] = {
20*4882a593Smuzhiyun /* SerDes 1 */
21*4882a593Smuzhiyun {0x6E, {XFI_FM1_MAC9, XFI_FM1_MAC10,
22*4882a593Smuzhiyun SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
23*4882a593Smuzhiyun PCIE4, PCIE4, SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
24*4882a593Smuzhiyun {0xBC, {PCIE3, PCIE3, SGMII_FM1_DTSEC1,
25*4882a593Smuzhiyun SGMII_FM1_DTSEC2, PCIE4, PCIE4, PCIE4, PCIE4} },
26*4882a593Smuzhiyun {0xC8, {PCIE3, SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC1,
27*4882a593Smuzhiyun SGMII_FM1_DTSEC2, PCIE4, PCIE4,
28*4882a593Smuzhiyun SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
29*4882a593Smuzhiyun {0xD6, {PCIE3, SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC1,
30*4882a593Smuzhiyun SGMII_FM1_DTSEC2, PCIE4, PCIE4,
31*4882a593Smuzhiyun SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
32*4882a593Smuzhiyun {0xDE, {PCIE3, PCIE3, PCIE3, PCIE3,
33*4882a593Smuzhiyun PCIE4, PCIE1, PCIE2, SGMII_FM1_DTSEC6} },
34*4882a593Smuzhiyun {0xE0, {PCIE3, PCIE3, PCIE3, PCIE3, PCIE4,
35*4882a593Smuzhiyun PCIE1, SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
36*4882a593Smuzhiyun {0xF2, {PCIE3, SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC1,
37*4882a593Smuzhiyun SGMII_FM1_DTSEC2, PCIE4, PCIE1, PCIE2, SGMII_FM1_DTSEC6} },
38*4882a593Smuzhiyun {0xF8, {PCIE3, SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC1,
39*4882a593Smuzhiyun SGMII_FM1_DTSEC2, PCIE4, PCIE1, PCIE2, SGMII_FM1_DTSEC6} },
40*4882a593Smuzhiyun {0xFA, {PCIE3, SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC1,
41*4882a593Smuzhiyun SGMII_FM1_DTSEC2, PCIE4, PCIE1,
42*4882a593Smuzhiyun SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
43*4882a593Smuzhiyun {0x6C, {XFI_FM1_MAC9, XFI_FM1_MAC10,
44*4882a593Smuzhiyun SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
45*4882a593Smuzhiyun PCIE4, PCIE4, PCIE4, PCIE4} },
46*4882a593Smuzhiyun {0x1B, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC10,
47*4882a593Smuzhiyun SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
48*4882a593Smuzhiyun SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4,
49*4882a593Smuzhiyun SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
50*4882a593Smuzhiyun {0x1C, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC10,
51*4882a593Smuzhiyun SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
52*4882a593Smuzhiyun SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4,
53*4882a593Smuzhiyun SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
54*4882a593Smuzhiyun {0x95, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC10,
55*4882a593Smuzhiyun SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
56*4882a593Smuzhiyun SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4,
57*4882a593Smuzhiyun SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
58*4882a593Smuzhiyun {0xA2, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC10,
59*4882a593Smuzhiyun SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
60*4882a593Smuzhiyun SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4,
61*4882a593Smuzhiyun SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
62*4882a593Smuzhiyun {0x94, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC10,
63*4882a593Smuzhiyun SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
64*4882a593Smuzhiyun SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4,
65*4882a593Smuzhiyun SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
66*4882a593Smuzhiyun {0x50, {XAUI_FM1_MAC9, XAUI_FM1_MAC9,
67*4882a593Smuzhiyun XAUI_FM1_MAC9, XAUI_FM1_MAC9,
68*4882a593Smuzhiyun PCIE4, SGMII_FM1_DTSEC4,
69*4882a593Smuzhiyun SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
70*4882a593Smuzhiyun {0x51, {XAUI_FM1_MAC9, XAUI_FM1_MAC9,
71*4882a593Smuzhiyun XAUI_FM1_MAC9, XAUI_FM1_MAC9,
72*4882a593Smuzhiyun PCIE4, SGMII_FM1_DTSEC4,
73*4882a593Smuzhiyun SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
74*4882a593Smuzhiyun {0x5E, {HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
75*4882a593Smuzhiyun HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
76*4882a593Smuzhiyun PCIE4, SGMII_FM1_DTSEC4,
77*4882a593Smuzhiyun SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
78*4882a593Smuzhiyun {0x5F, {HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
79*4882a593Smuzhiyun HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
80*4882a593Smuzhiyun PCIE4, SGMII_FM1_DTSEC4,
81*4882a593Smuzhiyun SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
82*4882a593Smuzhiyun {0x64, {HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
83*4882a593Smuzhiyun HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
84*4882a593Smuzhiyun PCIE4, SGMII_FM1_DTSEC4,
85*4882a593Smuzhiyun SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
86*4882a593Smuzhiyun {0x65, {HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
87*4882a593Smuzhiyun HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
88*4882a593Smuzhiyun PCIE4, SGMII_FM1_DTSEC4,
89*4882a593Smuzhiyun SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
90*4882a593Smuzhiyun {0x6A, {XFI_FM1_MAC9, XFI_FM1_MAC10,
91*4882a593Smuzhiyun XFI_FM1_MAC1, XFI_FM1_MAC2,
92*4882a593Smuzhiyun PCIE4, SGMII_FM1_DTSEC4,
93*4882a593Smuzhiyun SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
94*4882a593Smuzhiyun {0x6B, {XFI_FM1_MAC9, XFI_FM1_MAC10,
95*4882a593Smuzhiyun XFI_FM1_MAC1, XFI_FM1_MAC2,
96*4882a593Smuzhiyun PCIE4, SGMII_FM1_DTSEC4,
97*4882a593Smuzhiyun SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
98*4882a593Smuzhiyun {0x6D, {XFI_FM1_MAC9, XFI_FM1_MAC10,
99*4882a593Smuzhiyun SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
100*4882a593Smuzhiyun PCIE4, PCIE4, PCIE4, PCIE4} },
101*4882a593Smuzhiyun {0x71, {XFI_FM1_MAC9, XFI_FM1_MAC10,
102*4882a593Smuzhiyun SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2, PCIE4,
103*4882a593Smuzhiyun SGMII_FM1_DTSEC4, SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
104*4882a593Smuzhiyun {0xA6, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC10,
105*4882a593Smuzhiyun SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2, PCIE4,
106*4882a593Smuzhiyun PCIE4, SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
107*4882a593Smuzhiyun {0x8E, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC10,
108*4882a593Smuzhiyun SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2, PCIE4,
109*4882a593Smuzhiyun PCIE4, SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
110*4882a593Smuzhiyun {0x8F, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC10,
111*4882a593Smuzhiyun SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2, PCIE4,
112*4882a593Smuzhiyun PCIE4, SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
113*4882a593Smuzhiyun {0x82, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC10,
114*4882a593Smuzhiyun SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
115*4882a593Smuzhiyun PCIE4, PCIE4, SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
116*4882a593Smuzhiyun {0x83, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC10,
117*4882a593Smuzhiyun SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
118*4882a593Smuzhiyun PCIE4, PCIE4, SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
119*4882a593Smuzhiyun {0xA4, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC10,
120*4882a593Smuzhiyun SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
121*4882a593Smuzhiyun PCIE4, PCIE4, PCIE4, PCIE4} },
122*4882a593Smuzhiyun {0x96, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC10,
123*4882a593Smuzhiyun SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
124*4882a593Smuzhiyun PCIE4, PCIE4, PCIE4, PCIE4} },
125*4882a593Smuzhiyun {0x8A, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC10,
126*4882a593Smuzhiyun SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
127*4882a593Smuzhiyun PCIE4, PCIE4, PCIE4, PCIE4} },
128*4882a593Smuzhiyun {0x67, {XFI_FM1_MAC9, XFI_FM1_MAC10,
129*4882a593Smuzhiyun XFI_FM1_MAC1, XFI_FM1_MAC2,
130*4882a593Smuzhiyun PCIE4, PCIE4, PCIE4, PCIE4} },
131*4882a593Smuzhiyun {0xAB, {PCIE3, PCIE3, PCIE3, PCIE3,
132*4882a593Smuzhiyun PCIE4, PCIE4, PCIE4, PCIE4} },
133*4882a593Smuzhiyun {0xDA, {PCIE3, PCIE3, PCIE3, PCIE3,
134*4882a593Smuzhiyun PCIE3, PCIE3, PCIE3, PCIE3} },
135*4882a593Smuzhiyun {0xD9, {PCIE3, SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC1,
136*4882a593Smuzhiyun SGMII_FM1_DTSEC2, PCIE4, SGMII_FM1_DTSEC4,
137*4882a593Smuzhiyun SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
138*4882a593Smuzhiyun {0xD2, {PCIE3, SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC1,
139*4882a593Smuzhiyun SGMII_FM1_DTSEC2, PCIE4, SGMII_FM1_DTSEC4,
140*4882a593Smuzhiyun SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
141*4882a593Smuzhiyun {0xD3, {PCIE3, SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC1,
142*4882a593Smuzhiyun SGMII_FM1_DTSEC2, PCIE4, SGMII_FM1_DTSEC4,
143*4882a593Smuzhiyun SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
144*4882a593Smuzhiyun {0xCB, {PCIE3, SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC1,
145*4882a593Smuzhiyun SGMII_FM1_DTSEC2, PCIE4, SGMII_FM1_DTSEC4,
146*4882a593Smuzhiyun SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
147*4882a593Smuzhiyun {0xD8, {PCIE3, SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC1,
148*4882a593Smuzhiyun SGMII_FM1_DTSEC2, PCIE4, SGMII_FM1_DTSEC4,
149*4882a593Smuzhiyun SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
150*4882a593Smuzhiyun {0x66, {XFI_FM1_MAC9, XFI_FM1_MAC10,
151*4882a593Smuzhiyun XFI_FM1_MAC1, XFI_FM1_MAC2,
152*4882a593Smuzhiyun PCIE4, PCIE4, PCIE4, PCIE4} },
153*4882a593Smuzhiyun {0xAA, {PCIE3, PCIE3, PCIE3, PCIE3,
154*4882a593Smuzhiyun PCIE4, PCIE4, PCIE4, PCIE4} },
155*4882a593Smuzhiyun {0xCA, {PCIE3, SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC1,
156*4882a593Smuzhiyun SGMII_FM1_DTSEC2, PCIE4, SGMII_FM1_DTSEC4,
157*4882a593Smuzhiyun SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
158*4882a593Smuzhiyun {0x70, {XFI_FM1_MAC9, XFI_FM1_MAC10, SGMII_FM1_DTSEC1,
159*4882a593Smuzhiyun SGMII_FM1_DTSEC2, PCIE4, SGMII_FM1_DTSEC4,
160*4882a593Smuzhiyun SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
161*4882a593Smuzhiyun {}
162*4882a593Smuzhiyun };
163*4882a593Smuzhiyun
164*4882a593Smuzhiyun #ifndef CONFIG_ARCH_T2081
165*4882a593Smuzhiyun static const struct serdes_config serdes2_cfg_tbl[] = {
166*4882a593Smuzhiyun /* SerDes 2 */
167*4882a593Smuzhiyun {0x1F, {PCIE1, PCIE1, PCIE1, PCIE1, PCIE2, PCIE2, PCIE2, PCIE2} },
168*4882a593Smuzhiyun {0x16, {PCIE1, PCIE1, PCIE1, PCIE1, PCIE2, PCIE2, SATA1, SATA2} },
169*4882a593Smuzhiyun {0x01, {PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1} },
170*4882a593Smuzhiyun {0x29, {SRIO2, SRIO2, SRIO2, SRIO2, SRIO1, SRIO1, SRIO1, SRIO1} },
171*4882a593Smuzhiyun {0x2D, {SRIO2, SRIO2, SRIO2, SRIO2, SRIO1, SRIO1, SRIO1, SRIO1} },
172*4882a593Smuzhiyun {0x2E, {SRIO2, SRIO2, SRIO2, SRIO2, SRIO1, SRIO1, SRIO1, SRIO1} },
173*4882a593Smuzhiyun {0x15, {PCIE1, PCIE1, PCIE1, PCIE1, PCIE2, PCIE2, SATA1, SATA2} },
174*4882a593Smuzhiyun {0x27, {PCIE1, PCIE1, PCIE1, PCIE1, NONE, NONE, SATA1, SATA2} },
175*4882a593Smuzhiyun {0x18, {PCIE1, PCIE1, PCIE1, PCIE1, AURORA, AURORA, SATA1, SATA2} },
176*4882a593Smuzhiyun {0x02, {PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1} },
177*4882a593Smuzhiyun {0x36, {SRIO2, SRIO2, SRIO2, SRIO2, AURORA, AURORA, SATA1, SATA2} },
178*4882a593Smuzhiyun {}
179*4882a593Smuzhiyun };
180*4882a593Smuzhiyun #endif
181*4882a593Smuzhiyun
182*4882a593Smuzhiyun static const struct serdes_config *serdes_cfg_tbl[] = {
183*4882a593Smuzhiyun serdes1_cfg_tbl,
184*4882a593Smuzhiyun #ifndef CONFIG_ARCH_T2081
185*4882a593Smuzhiyun serdes2_cfg_tbl,
186*4882a593Smuzhiyun #endif
187*4882a593Smuzhiyun };
188*4882a593Smuzhiyun
serdes_get_prtcl(int serdes,int cfg,int lane)189*4882a593Smuzhiyun enum srds_prtcl serdes_get_prtcl(int serdes, int cfg, int lane)
190*4882a593Smuzhiyun {
191*4882a593Smuzhiyun const struct serdes_config *ptr;
192*4882a593Smuzhiyun
193*4882a593Smuzhiyun if (serdes >= ARRAY_SIZE(serdes_cfg_tbl))
194*4882a593Smuzhiyun return 0;
195*4882a593Smuzhiyun
196*4882a593Smuzhiyun ptr = serdes_cfg_tbl[serdes];
197*4882a593Smuzhiyun while (ptr->protocol) {
198*4882a593Smuzhiyun if (ptr->protocol == cfg)
199*4882a593Smuzhiyun return ptr->lanes[lane];
200*4882a593Smuzhiyun ptr++;
201*4882a593Smuzhiyun }
202*4882a593Smuzhiyun return 0;
203*4882a593Smuzhiyun }
204*4882a593Smuzhiyun
is_serdes_prtcl_valid(int serdes,u32 prtcl)205*4882a593Smuzhiyun int is_serdes_prtcl_valid(int serdes, u32 prtcl)
206*4882a593Smuzhiyun {
207*4882a593Smuzhiyun int i;
208*4882a593Smuzhiyun const struct serdes_config *ptr;
209*4882a593Smuzhiyun
210*4882a593Smuzhiyun if (serdes >= ARRAY_SIZE(serdes_cfg_tbl))
211*4882a593Smuzhiyun return 0;
212*4882a593Smuzhiyun
213*4882a593Smuzhiyun ptr = serdes_cfg_tbl[serdes];
214*4882a593Smuzhiyun while (ptr->protocol) {
215*4882a593Smuzhiyun if (ptr->protocol == prtcl)
216*4882a593Smuzhiyun break;
217*4882a593Smuzhiyun ptr++;
218*4882a593Smuzhiyun }
219*4882a593Smuzhiyun
220*4882a593Smuzhiyun if (!ptr->protocol)
221*4882a593Smuzhiyun return 0;
222*4882a593Smuzhiyun
223*4882a593Smuzhiyun for (i = 0; i < SRDS_MAX_LANES; i++) {
224*4882a593Smuzhiyun if (ptr->lanes[i] != NONE)
225*4882a593Smuzhiyun return 1;
226*4882a593Smuzhiyun }
227*4882a593Smuzhiyun
228*4882a593Smuzhiyun return 0;
229*4882a593Smuzhiyun }
230