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