xref: /OK3568_Linux_fs/u-boot/arch/powerpc/cpu/mpc85xx/t2080_serdes.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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