1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright 2012 Freescale Semiconductor, Inc.
4  */
5 
6 #include <common.h>
7 #include <asm/fsl_serdes.h>
8 #include <asm/processor.h>
9 #include <asm/io.h>
10 #include "fsl_corenet2_serdes.h"
11 
12 struct serdes_config {
13 	u8 protocol;
14 	u8 lanes[SRDS_MAX_LANES];
15 };
16 
17 #ifdef CONFIG_ARCH_B4860
18 static struct serdes_config serdes1_cfg_tbl[] = {
19 	/* SerDes 1 */
20 	{0x01, {AURORA, AURORA, CPRI6, CPRI5,
21 		CPRI4, CPRI3, CPRI2, CPRI1} },
22 	{0x02, {AURORA, AURORA, CPRI6, CPRI5,
23 		CPRI4, CPRI3, CPRI2, CPRI1} },
24 	{0x04, {AURORA, AURORA, CPRI6, CPRI5,
25 		CPRI4, CPRI3, CPRI2, CPRI1} },
26 	{0x05, {AURORA, AURORA, CPRI6, CPRI5,
27 		CPRI4, CPRI3, CPRI2, CPRI1} },
28 	{0x06, {AURORA, AURORA, CPRI6, CPRI5,
29 		CPRI4, CPRI3, CPRI2, CPRI1} },
30 	{0x07, {AURORA, AURORA, CPRI6, CPRI5,
31 		CPRI4, CPRI3, CPRI2, CPRI1} },
32 	{0x08, {AURORA, AURORA, CPRI6, CPRI5,
33 		CPRI4, CPRI3, CPRI2, CPRI1} },
34 	{0x09, {AURORA, AURORA, CPRI6, CPRI5,
35 		CPRI4, CPRI3, CPRI2, CPRI1} },
36 	{0x0A, {AURORA, AURORA, CPRI6, CPRI5,
37 		CPRI4, CPRI3, CPRI2, CPRI1} },
38 	{0x0B, {AURORA, AURORA, CPRI6, CPRI5,
39 		CPRI4, CPRI3, CPRI2, CPRI1} },
40 	{0x0C, {AURORA, AURORA, CPRI6, CPRI5,
41 		CPRI4, CPRI3, CPRI2, CPRI1} },
42 	{0x0D, {CPRI8, CPRI7, CPRI6, CPRI5,
43 		CPRI4, CPRI3, CPRI2, CPRI1}},
44 	{0x0E, {CPRI8, CPRI7,	CPRI6, CPRI5,
45 		CPRI4, CPRI3, CPRI2, CPRI1}},
46 	{0x12, {CPRI8, CPRI7,	CPRI6, CPRI5,
47 		CPRI4, CPRI3, CPRI2, CPRI1}},
48 	{0x29, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6,
49 		CPRI6, CPRI5, CPRI4, CPRI3, CPRI2, CPRI1} },
50 	{0x2a, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6,
51 		CPRI6, CPRI5, CPRI4, CPRI3, CPRI2, CPRI1}},
52 	{0x2C, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6,
53 		CPRI6, CPRI5, CPRI4, CPRI3, CPRI2, CPRI1}},
54 	{0x2D, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6,
55 		CPRI6, CPRI5, CPRI4, CPRI3, CPRI2, CPRI1}},
56 	{0x2E, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6,
57 		CPRI6, CPRI5, CPRI4, CPRI3, CPRI2, CPRI1}},
58 	{0x2F, {AURORA, AURORA,
59 		SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4,
60 		CPRI4, CPRI3, CPRI2, CPRI1} },
61 	{0x30, {AURORA, AURORA,
62 		SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4,
63 		CPRI4, CPRI3, CPRI2, CPRI1}},
64 	{0x32, {AURORA, AURORA,
65 		SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4,
66 		CPRI4, CPRI3, CPRI2, CPRI1}},
67 	{0x33, {AURORA, AURORA,
68 		SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4,
69 		CPRI4, CPRI3, CPRI2, CPRI1}},
70 	{0x34, {AURORA, AURORA,
71 		SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4,
72 		CPRI4, CPRI3, CPRI2, CPRI1}},
73 	{0x39, {AURORA, AURORA, CPRI6, CPRI5,
74 		CPRI4, CPRI3, CPRI2, CPRI1} },
75 	{0x3A, {AURORA, AURORA, CPRI6, CPRI5,
76 		CPRI4, CPRI3, CPRI2, CPRI1} },
77 	{0x3C, {AURORA, AURORA, CPRI6, CPRI5,
78 		CPRI4, CPRI3, CPRI2, CPRI1} },
79 	{0x3D, {AURORA, AURORA, CPRI6, CPRI5,
80 		CPRI4, CPRI3, CPRI2, CPRI1} },
81 	{0x3E, {CPRI8, CPRI7,	CPRI6, CPRI5,
82 		CPRI4, CPRI3, CPRI2, CPRI1}},
83 	{0x5C, {AURORA, AURORA,
84 		SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4,
85 		CPRI4, CPRI3, CPRI2, CPRI1} },
86 	{0x5D, {AURORA, AURORA,
87 		SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4,
88 		CPRI4, CPRI3, CPRI2, CPRI1} },
89 	{}
90 };
91 static struct serdes_config serdes2_cfg_tbl[] = {
92 	/* SerDes 2 */
93 	{0x17, {SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
94 		SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4,
95 		AURORA, AURORA,	SRIO1, SRIO1} },
96 	{0x18, {SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
97 		SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4,
98 		AURORA, AURORA,	SRIO1, SRIO1}},
99 	{0x1D, {SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
100 		SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4,
101 		AURORA, AURORA,	SRIO1, SRIO1}},
102 	{0x2A, {SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
103 		SRIO2, SRIO2,
104 		AURORA, AURORA, SRIO1, SRIO1} },
105 	{0x2B, {SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
106 		SRIO2, SRIO2,
107 		AURORA, AURORA, SRIO1, SRIO1}},
108 	{0x30, {SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
109 		SRIO2, SRIO2,
110 		AURORA, AURORA,
111 		SRIO1, SRIO1}},
112 	{0x48, {SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
113 		SGMII_FM1_DTSEC3, AURORA,
114 		SRIO1, SRIO1, SRIO1, SRIO1} },
115 	{0x49, {SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
116 		SGMII_FM1_DTSEC3, AURORA,
117 		SRIO1, SRIO1, SRIO1, SRIO1}},
118 	{0x4A, {SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
119 		SGMII_FM1_DTSEC3, AURORA,
120 		SRIO1, SRIO1, SRIO1, SRIO1}},
121 	{0x4C, {SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
122 		SGMII_FM1_DTSEC3, AURORA,
123 		SRIO1, SRIO1, SRIO1, SRIO1}},
124 	{0x4E, {SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
125 		SGMII_FM1_DTSEC3, AURORA,
126 		SRIO1, SRIO1, SRIO1, SRIO1}},
127 	{0x79, {SRIO2, SRIO2, SRIO2, SRIO2,
128 		SRIO1, SRIO1, SRIO1, SRIO1} },
129 	{0x7A, {SRIO2, SRIO2, SRIO2, SRIO2,
130 		SRIO1, SRIO1, SRIO1, SRIO1}},
131 	{0x83, {SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
132 		SRIO2, SRIO2, AURORA, AURORA,
133 		XFI_FM1_MAC9, XFI_FM1_MAC10} },
134 	{0x84, {SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
135 		SRIO2, SRIO2, AURORA, AURORA,
136 		XFI_FM1_MAC9, XFI_FM1_MAC10}},
137 	{0x85, {SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
138 		SRIO2, SRIO2, AURORA, AURORA,
139 		XFI_FM1_MAC9, XFI_FM1_MAC10}},
140 	{0x86, {SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
141 		SRIO2, SRIO2,
142 		SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4,
143 		XFI_FM1_MAC9, XFI_FM1_MAC10} },
144 	{0x87, {SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
145 		SRIO2, SRIO2,
146 		SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4,
147 		XFI_FM1_MAC9, XFI_FM1_MAC10}},
148 	{0x8C, {SRIO2, SRIO2, SRIO2, SRIO2,
149 		SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4,
150 		XFI_FM1_MAC9, XFI_FM1_MAC10} },
151 	{0x8D, {SRIO2, SRIO2, SRIO2, SRIO2,
152 		SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4,
153 		XFI_FM1_MAC9, XFI_FM1_MAC10}},
154 	{0x93, {SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
155 		SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4,
156 		XAUI_FM1_MAC10, XAUI_FM1_MAC10,
157 		XAUI_FM1_MAC10, XAUI_FM1_MAC10}},
158 	{0x9E, {PCIE1, PCIE1,	PCIE1, PCIE1,
159 		XAUI_FM1_MAC10, XAUI_FM1_MAC10,
160 		XAUI_FM1_MAC10, XAUI_FM1_MAC10}},
161 	{0x9A, {PCIE1, PCIE1,
162 		SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4,
163 		XAUI_FM1_MAC10, XAUI_FM1_MAC10,
164 		XAUI_FM1_MAC10, XAUI_FM1_MAC10}},
165 	{0xB1, {PCIE1, PCIE1, PCIE1, PCIE1,
166 		SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4,
167 		XFI_FM1_MAC9, XFI_FM1_MAC10} },
168 	{0xB2, {PCIE1, PCIE1, PCIE1, PCIE1,
169 		SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4,
170 		XFI_FM1_MAC9, XFI_FM1_MAC10}},
171 	{0xC3, {XAUI_FM1_MAC9, XAUI_FM1_MAC9,
172 		XAUI_FM1_MAC9, XAUI_FM1_MAC9,
173 		SRIO1, SRIO1, SRIO1, SRIO1}},
174 	{0x98, {XAUI_FM1_MAC9, XAUI_FM1_MAC9,
175 		XAUI_FM1_MAC9, XAUI_FM1_MAC9,
176 		XAUI_FM1_MAC10, XAUI_FM1_MAC10,
177 		XAUI_FM1_MAC10, XAUI_FM1_MAC10}},
178 	{}
179 };
180 #endif
181 
182 #ifdef CONFIG_ARCH_B4420
183 static struct serdes_config serdes1_cfg_tbl[] = {
184 	{0x0D, {NONE, NONE, CPRI6, CPRI5,
185 		CPRI4, CPRI3, NONE, NONE} },
186 	{0x0E, {NONE, NONE, CPRI8, CPRI5,
187 		CPRI4, CPRI3, NONE, NONE} },
188 	{0x0F, {NONE, NONE, CPRI6, CPRI5,
189 		CPRI4, CPRI3, NONE, NONE} },
190 	{0x17, {NONE, NONE,
191 		SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4,
192 		NONE, NONE, NONE, NONE} },
193 	{0x18, {NONE, NONE,
194 		SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4,
195 		NONE, NONE, NONE, NONE} },
196 	{0x1B, {NONE, NONE,
197 		SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4,
198 		NONE, NONE, NONE, NONE} },
199 	{0x1D, {NONE, NONE, AURORA, AURORA,
200 		NONE, NONE, NONE, NONE} },
201 	{0x1E, {NONE, NONE, AURORA, AURORA,
202 		NONE, NONE, NONE, NONE} },
203 	{0x21, {NONE, NONE, AURORA, AURORA,
204 		NONE, NONE, NONE, NONE} },
205 	{0x3E, {NONE, NONE, CPRI6, CPRI5,
206 		CPRI4, CPRI3, NONE, NONE} },
207 	{}
208 };
209 static struct serdes_config serdes2_cfg_tbl[] = {
210 	{0x48, {SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
211 		SGMII_FM1_DTSEC3, AURORA,
212 		NONE, NONE, NONE, NONE} },
213 	{0x49, {SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
214 		SGMII_FM1_DTSEC3, AURORA,
215 		NONE, NONE, NONE, NONE} },
216 	{0x4A, {SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
217 		SGMII_FM1_DTSEC3, AURORA,
218 		NONE, NONE, NONE, NONE} },
219 	{0x6E, {SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
220 		AURORA, AURORA, NONE, NONE, NONE, NONE} },
221 	{0x6F, {SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
222 		AURORA, AURORA,	NONE, NONE, NONE, NONE} },
223 	{0x70, {SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
224 		AURORA, AURORA,	NONE, NONE, NONE, NONE} },
225 	{0x99, {PCIE1, PCIE1,
226 		SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4,
227 		NONE, NONE, NONE, NONE} },
228 	{0x9A, {PCIE1, PCIE1,
229 		SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4,
230 		NONE, NONE, NONE, NONE} },
231 	{0x9D, {PCIE1, PCIE1, PCIE1, PCIE1,
232 		NONE, NONE, NONE, NONE} },
233 	{0x9E, {PCIE1, PCIE1, PCIE1, PCIE1,
234 		NONE, NONE, NONE, NONE} },
235 	{}
236 };
237 #endif
238 
239 static struct serdes_config *serdes_cfg_tbl[] = {
240 	serdes1_cfg_tbl,
241 	serdes2_cfg_tbl,
242 };
243 
244 enum srds_prtcl serdes_get_prtcl(int serdes, int cfg, int lane)
245 {
246 	struct serdes_config *ptr;
247 
248 	if (serdes >= ARRAY_SIZE(serdes_cfg_tbl))
249 		return 0;
250 
251 	ptr = serdes_cfg_tbl[serdes];
252 	while (ptr->protocol) {
253 		if (ptr->protocol == cfg)
254 			return ptr->lanes[lane];
255 		ptr++;
256 	}
257 
258 	return 0;
259 }
260 
261 int is_serdes_prtcl_valid(int serdes, u32 prtcl)
262 {
263 	int i;
264 	struct serdes_config *ptr;
265 
266 	if (serdes >= ARRAY_SIZE(serdes_cfg_tbl))
267 		return 0;
268 
269 	ptr = serdes_cfg_tbl[serdes];
270 	while (ptr->protocol) {
271 		if (ptr->protocol == prtcl)
272 			break;
273 		ptr++;
274 	}
275 
276 	if (!ptr->protocol)
277 		return 0;
278 
279 	for (i = 0; i < SRDS_MAX_LANES; i++) {
280 		if (ptr->lanes[i] != NONE)
281 			return 1;
282 	}
283 
284 	return 0;
285 }
286