xref: /OK3568_Linux_fs/u-boot/board/freescale/ls1043aqds/eth.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright 2015 Freescale Semiconductor, Inc.
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * SPDX-License-Identifier:	GPL-2.0+
5*4882a593Smuzhiyun  */
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #include <common.h>
8*4882a593Smuzhiyun #include <asm/io.h>
9*4882a593Smuzhiyun #include <netdev.h>
10*4882a593Smuzhiyun #include <fdt_support.h>
11*4882a593Smuzhiyun #include <fm_eth.h>
12*4882a593Smuzhiyun #include <fsl_mdio.h>
13*4882a593Smuzhiyun #include <fsl_dtsec.h>
14*4882a593Smuzhiyun #include <linux/libfdt.h>
15*4882a593Smuzhiyun #include <malloc.h>
16*4882a593Smuzhiyun #include <asm/arch/fsl_serdes.h>
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun #include "../common/qixis.h"
19*4882a593Smuzhiyun #include "../common/fman.h"
20*4882a593Smuzhiyun #include "ls1043aqds_qixis.h"
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun #define EMI_NONE	0xFF
23*4882a593Smuzhiyun #define EMI1_RGMII1	0
24*4882a593Smuzhiyun #define EMI1_RGMII2	1
25*4882a593Smuzhiyun #define EMI1_SLOT1	2
26*4882a593Smuzhiyun #define EMI1_SLOT2	3
27*4882a593Smuzhiyun #define EMI1_SLOT3	4
28*4882a593Smuzhiyun #define EMI1_SLOT4	5
29*4882a593Smuzhiyun #define EMI2		6
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun static int mdio_mux[NUM_FM_PORTS];
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun static const char * const mdio_names[] = {
34*4882a593Smuzhiyun 	"LS1043AQDS_MDIO_RGMII1",
35*4882a593Smuzhiyun 	"LS1043AQDS_MDIO_RGMII2",
36*4882a593Smuzhiyun 	"LS1043AQDS_MDIO_SLOT1",
37*4882a593Smuzhiyun 	"LS1043AQDS_MDIO_SLOT2",
38*4882a593Smuzhiyun 	"LS1043AQDS_MDIO_SLOT3",
39*4882a593Smuzhiyun 	"LS1043AQDS_MDIO_SLOT4",
40*4882a593Smuzhiyun 	"NULL",
41*4882a593Smuzhiyun };
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun /* Map SerDes1 4 lanes to default slot, will be initialized dynamically */
44*4882a593Smuzhiyun static u8 lane_to_slot[] = {1, 2, 3, 4};
45*4882a593Smuzhiyun 
ls1043aqds_mdio_name_for_muxval(u8 muxval)46*4882a593Smuzhiyun static const char *ls1043aqds_mdio_name_for_muxval(u8 muxval)
47*4882a593Smuzhiyun {
48*4882a593Smuzhiyun 	return mdio_names[muxval];
49*4882a593Smuzhiyun }
50*4882a593Smuzhiyun 
mii_dev_for_muxval(u8 muxval)51*4882a593Smuzhiyun struct mii_dev *mii_dev_for_muxval(u8 muxval)
52*4882a593Smuzhiyun {
53*4882a593Smuzhiyun 	struct mii_dev *bus;
54*4882a593Smuzhiyun 	const char *name;
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun 	if (muxval > EMI2)
57*4882a593Smuzhiyun 		return NULL;
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun 	name = ls1043aqds_mdio_name_for_muxval(muxval);
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun 	if (!name) {
62*4882a593Smuzhiyun 		printf("No bus for muxval %x\n", muxval);
63*4882a593Smuzhiyun 		return NULL;
64*4882a593Smuzhiyun 	}
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun 	bus = miiphy_get_dev_by_name(name);
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun 	if (!bus) {
69*4882a593Smuzhiyun 		printf("No bus by name %s\n", name);
70*4882a593Smuzhiyun 		return NULL;
71*4882a593Smuzhiyun 	}
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun 	return bus;
74*4882a593Smuzhiyun }
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun struct ls1043aqds_mdio {
77*4882a593Smuzhiyun 	u8 muxval;
78*4882a593Smuzhiyun 	struct mii_dev *realbus;
79*4882a593Smuzhiyun };
80*4882a593Smuzhiyun 
ls1043aqds_mux_mdio(u8 muxval)81*4882a593Smuzhiyun static void ls1043aqds_mux_mdio(u8 muxval)
82*4882a593Smuzhiyun {
83*4882a593Smuzhiyun 	u8 brdcfg4;
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun 	if (muxval < 7) {
86*4882a593Smuzhiyun 		brdcfg4 = QIXIS_READ(brdcfg[4]);
87*4882a593Smuzhiyun 		brdcfg4 &= ~BRDCFG4_EMISEL_MASK;
88*4882a593Smuzhiyun 		brdcfg4 |= (muxval << BRDCFG4_EMISEL_SHIFT);
89*4882a593Smuzhiyun 		QIXIS_WRITE(brdcfg[4], brdcfg4);
90*4882a593Smuzhiyun 	}
91*4882a593Smuzhiyun }
92*4882a593Smuzhiyun 
ls1043aqds_mdio_read(struct mii_dev * bus,int addr,int devad,int regnum)93*4882a593Smuzhiyun static int ls1043aqds_mdio_read(struct mii_dev *bus, int addr, int devad,
94*4882a593Smuzhiyun 			      int regnum)
95*4882a593Smuzhiyun {
96*4882a593Smuzhiyun 	struct ls1043aqds_mdio *priv = bus->priv;
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun 	ls1043aqds_mux_mdio(priv->muxval);
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun 	return priv->realbus->read(priv->realbus, addr, devad, regnum);
101*4882a593Smuzhiyun }
102*4882a593Smuzhiyun 
ls1043aqds_mdio_write(struct mii_dev * bus,int addr,int devad,int regnum,u16 value)103*4882a593Smuzhiyun static int ls1043aqds_mdio_write(struct mii_dev *bus, int addr, int devad,
104*4882a593Smuzhiyun 			       int regnum, u16 value)
105*4882a593Smuzhiyun {
106*4882a593Smuzhiyun 	struct ls1043aqds_mdio *priv = bus->priv;
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun 	ls1043aqds_mux_mdio(priv->muxval);
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun 	return priv->realbus->write(priv->realbus, addr, devad,
111*4882a593Smuzhiyun 				    regnum, value);
112*4882a593Smuzhiyun }
113*4882a593Smuzhiyun 
ls1043aqds_mdio_reset(struct mii_dev * bus)114*4882a593Smuzhiyun static int ls1043aqds_mdio_reset(struct mii_dev *bus)
115*4882a593Smuzhiyun {
116*4882a593Smuzhiyun 	struct ls1043aqds_mdio *priv = bus->priv;
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun 	return priv->realbus->reset(priv->realbus);
119*4882a593Smuzhiyun }
120*4882a593Smuzhiyun 
ls1043aqds_mdio_init(char * realbusname,u8 muxval)121*4882a593Smuzhiyun static int ls1043aqds_mdio_init(char *realbusname, u8 muxval)
122*4882a593Smuzhiyun {
123*4882a593Smuzhiyun 	struct ls1043aqds_mdio *pmdio;
124*4882a593Smuzhiyun 	struct mii_dev *bus = mdio_alloc();
125*4882a593Smuzhiyun 
126*4882a593Smuzhiyun 	if (!bus) {
127*4882a593Smuzhiyun 		printf("Failed to allocate ls1043aqds MDIO bus\n");
128*4882a593Smuzhiyun 		return -1;
129*4882a593Smuzhiyun 	}
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun 	pmdio = malloc(sizeof(*pmdio));
132*4882a593Smuzhiyun 	if (!pmdio) {
133*4882a593Smuzhiyun 		printf("Failed to allocate ls1043aqds private data\n");
134*4882a593Smuzhiyun 		free(bus);
135*4882a593Smuzhiyun 		return -1;
136*4882a593Smuzhiyun 	}
137*4882a593Smuzhiyun 
138*4882a593Smuzhiyun 	bus->read = ls1043aqds_mdio_read;
139*4882a593Smuzhiyun 	bus->write = ls1043aqds_mdio_write;
140*4882a593Smuzhiyun 	bus->reset = ls1043aqds_mdio_reset;
141*4882a593Smuzhiyun 	strcpy(bus->name, ls1043aqds_mdio_name_for_muxval(muxval));
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun 	pmdio->realbus = miiphy_get_dev_by_name(realbusname);
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun 	if (!pmdio->realbus) {
146*4882a593Smuzhiyun 		printf("No bus with name %s\n", realbusname);
147*4882a593Smuzhiyun 		free(bus);
148*4882a593Smuzhiyun 		free(pmdio);
149*4882a593Smuzhiyun 		return -1;
150*4882a593Smuzhiyun 	}
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun 	pmdio->muxval = muxval;
153*4882a593Smuzhiyun 	bus->priv = pmdio;
154*4882a593Smuzhiyun 	return mdio_register(bus);
155*4882a593Smuzhiyun }
156*4882a593Smuzhiyun 
board_ft_fman_fixup_port(void * fdt,char * compat,phys_addr_t addr,enum fm_port port,int offset)157*4882a593Smuzhiyun void board_ft_fman_fixup_port(void *fdt, char *compat, phys_addr_t addr,
158*4882a593Smuzhiyun 			      enum fm_port port, int offset)
159*4882a593Smuzhiyun {
160*4882a593Smuzhiyun 	struct fixed_link f_link;
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun 	if (fm_info_get_enet_if(port) == PHY_INTERFACE_MODE_SGMII) {
163*4882a593Smuzhiyun 		if (port == FM1_DTSEC9) {
164*4882a593Smuzhiyun 			fdt_set_phy_handle(fdt, compat, addr,
165*4882a593Smuzhiyun 					   "sgmii_riser_s1_p1");
166*4882a593Smuzhiyun 		} else if (port == FM1_DTSEC2) {
167*4882a593Smuzhiyun 			fdt_set_phy_handle(fdt, compat, addr,
168*4882a593Smuzhiyun 					   "sgmii_riser_s2_p1");
169*4882a593Smuzhiyun 		} else if (port == FM1_DTSEC5) {
170*4882a593Smuzhiyun 			fdt_set_phy_handle(fdt, compat, addr,
171*4882a593Smuzhiyun 					   "sgmii_riser_s3_p1");
172*4882a593Smuzhiyun 		} else if (port == FM1_DTSEC6) {
173*4882a593Smuzhiyun 			fdt_set_phy_handle(fdt, compat, addr,
174*4882a593Smuzhiyun 					   "sgmii_riser_s4_p1");
175*4882a593Smuzhiyun 		}
176*4882a593Smuzhiyun 	} else if (fm_info_get_enet_if(port) ==
177*4882a593Smuzhiyun 		   PHY_INTERFACE_MODE_SGMII_2500) {
178*4882a593Smuzhiyun 		/* 2.5G SGMII interface */
179*4882a593Smuzhiyun 		f_link.phy_id = cpu_to_fdt32(port);
180*4882a593Smuzhiyun 		f_link.duplex = cpu_to_fdt32(1);
181*4882a593Smuzhiyun 		f_link.link_speed = cpu_to_fdt32(1000);
182*4882a593Smuzhiyun 		f_link.pause = 0;
183*4882a593Smuzhiyun 		f_link.asym_pause = 0;
184*4882a593Smuzhiyun 		/* no PHY for 2.5G SGMII */
185*4882a593Smuzhiyun 		fdt_delprop(fdt, offset, "phy-handle");
186*4882a593Smuzhiyun 		fdt_setprop(fdt, offset, "fixed-link", &f_link, sizeof(f_link));
187*4882a593Smuzhiyun 		fdt_setprop_string(fdt, offset, "phy-connection-type",
188*4882a593Smuzhiyun 				   "sgmii-2500");
189*4882a593Smuzhiyun 	} else if (fm_info_get_enet_if(port) == PHY_INTERFACE_MODE_QSGMII) {
190*4882a593Smuzhiyun 		switch (mdio_mux[port]) {
191*4882a593Smuzhiyun 		case EMI1_SLOT1:
192*4882a593Smuzhiyun 			switch (port) {
193*4882a593Smuzhiyun 			case FM1_DTSEC1:
194*4882a593Smuzhiyun 				fdt_set_phy_handle(fdt, compat, addr,
195*4882a593Smuzhiyun 						   "qsgmii_s1_p1");
196*4882a593Smuzhiyun 				break;
197*4882a593Smuzhiyun 			case FM1_DTSEC2:
198*4882a593Smuzhiyun 				fdt_set_phy_handle(fdt, compat, addr,
199*4882a593Smuzhiyun 						   "qsgmii_s1_p2");
200*4882a593Smuzhiyun 				break;
201*4882a593Smuzhiyun 			case FM1_DTSEC5:
202*4882a593Smuzhiyun 				fdt_set_phy_handle(fdt, compat, addr,
203*4882a593Smuzhiyun 						   "qsgmii_s1_p3");
204*4882a593Smuzhiyun 				break;
205*4882a593Smuzhiyun 			case FM1_DTSEC6:
206*4882a593Smuzhiyun 				fdt_set_phy_handle(fdt, compat, addr,
207*4882a593Smuzhiyun 						   "qsgmii_s1_p4");
208*4882a593Smuzhiyun 				break;
209*4882a593Smuzhiyun 			default:
210*4882a593Smuzhiyun 				break;
211*4882a593Smuzhiyun 			}
212*4882a593Smuzhiyun 			break;
213*4882a593Smuzhiyun 		case EMI1_SLOT2:
214*4882a593Smuzhiyun 			switch (port) {
215*4882a593Smuzhiyun 			case FM1_DTSEC1:
216*4882a593Smuzhiyun 				fdt_set_phy_handle(fdt, compat, addr,
217*4882a593Smuzhiyun 						   "qsgmii_s2_p1");
218*4882a593Smuzhiyun 				break;
219*4882a593Smuzhiyun 			case FM1_DTSEC2:
220*4882a593Smuzhiyun 				fdt_set_phy_handle(fdt, compat, addr,
221*4882a593Smuzhiyun 						   "qsgmii_s2_p2");
222*4882a593Smuzhiyun 				break;
223*4882a593Smuzhiyun 			case FM1_DTSEC5:
224*4882a593Smuzhiyun 				fdt_set_phy_handle(fdt, compat, addr,
225*4882a593Smuzhiyun 						   "qsgmii_s2_p3");
226*4882a593Smuzhiyun 				break;
227*4882a593Smuzhiyun 			case FM1_DTSEC6:
228*4882a593Smuzhiyun 				fdt_set_phy_handle(fdt, compat, addr,
229*4882a593Smuzhiyun 						   "qsgmii_s2_p4");
230*4882a593Smuzhiyun 				break;
231*4882a593Smuzhiyun 			default:
232*4882a593Smuzhiyun 				break;
233*4882a593Smuzhiyun 			}
234*4882a593Smuzhiyun 			break;
235*4882a593Smuzhiyun 		default:
236*4882a593Smuzhiyun 			break;
237*4882a593Smuzhiyun 		}
238*4882a593Smuzhiyun 		fdt_delprop(fdt, offset, "phy-connection-type");
239*4882a593Smuzhiyun 		fdt_setprop_string(fdt, offset, "phy-connection-type",
240*4882a593Smuzhiyun 				   "qsgmii");
241*4882a593Smuzhiyun 	} else if (fm_info_get_enet_if(port) == PHY_INTERFACE_MODE_XGMII &&
242*4882a593Smuzhiyun 		   port == FM1_10GEC1) {
243*4882a593Smuzhiyun 		/* XFI interface */
244*4882a593Smuzhiyun 		f_link.phy_id = cpu_to_fdt32(port);
245*4882a593Smuzhiyun 		f_link.duplex = cpu_to_fdt32(1);
246*4882a593Smuzhiyun 		f_link.link_speed = cpu_to_fdt32(10000);
247*4882a593Smuzhiyun 		f_link.pause = 0;
248*4882a593Smuzhiyun 		f_link.asym_pause = 0;
249*4882a593Smuzhiyun 		/* no PHY for XFI */
250*4882a593Smuzhiyun 		fdt_delprop(fdt, offset, "phy-handle");
251*4882a593Smuzhiyun 		fdt_setprop(fdt, offset, "fixed-link", &f_link, sizeof(f_link));
252*4882a593Smuzhiyun 		fdt_setprop_string(fdt, offset, "phy-connection-type", "xgmii");
253*4882a593Smuzhiyun 	}
254*4882a593Smuzhiyun }
255*4882a593Smuzhiyun 
fdt_fixup_board_enet(void * fdt)256*4882a593Smuzhiyun void fdt_fixup_board_enet(void *fdt)
257*4882a593Smuzhiyun {
258*4882a593Smuzhiyun 	int i;
259*4882a593Smuzhiyun 	struct ccsr_gur *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR);
260*4882a593Smuzhiyun 	u32 srds_s1;
261*4882a593Smuzhiyun 
262*4882a593Smuzhiyun 	srds_s1 = in_be32(&gur->rcwsr[4]) &
263*4882a593Smuzhiyun 			FSL_CHASSIS2_RCWSR4_SRDS1_PRTCL_MASK;
264*4882a593Smuzhiyun 	srds_s1 >>= FSL_CHASSIS2_RCWSR4_SRDS1_PRTCL_SHIFT;
265*4882a593Smuzhiyun 
266*4882a593Smuzhiyun 	for (i = FM1_DTSEC1; i < NUM_FM_PORTS; i++) {
267*4882a593Smuzhiyun 		switch (fm_info_get_enet_if(i)) {
268*4882a593Smuzhiyun 		case PHY_INTERFACE_MODE_SGMII:
269*4882a593Smuzhiyun 		case PHY_INTERFACE_MODE_QSGMII:
270*4882a593Smuzhiyun 			switch (mdio_mux[i]) {
271*4882a593Smuzhiyun 			case EMI1_SLOT1:
272*4882a593Smuzhiyun 				fdt_status_okay_by_alias(fdt, "emi1_slot1");
273*4882a593Smuzhiyun 				break;
274*4882a593Smuzhiyun 			case EMI1_SLOT2:
275*4882a593Smuzhiyun 				fdt_status_okay_by_alias(fdt, "emi1_slot2");
276*4882a593Smuzhiyun 				break;
277*4882a593Smuzhiyun 			case EMI1_SLOT3:
278*4882a593Smuzhiyun 				fdt_status_okay_by_alias(fdt, "emi1_slot3");
279*4882a593Smuzhiyun 				break;
280*4882a593Smuzhiyun 			case EMI1_SLOT4:
281*4882a593Smuzhiyun 				fdt_status_okay_by_alias(fdt, "emi1_slot4");
282*4882a593Smuzhiyun 				break;
283*4882a593Smuzhiyun 			default:
284*4882a593Smuzhiyun 				break;
285*4882a593Smuzhiyun 			}
286*4882a593Smuzhiyun 			break;
287*4882a593Smuzhiyun 		case PHY_INTERFACE_MODE_XGMII:
288*4882a593Smuzhiyun 			break;
289*4882a593Smuzhiyun 		default:
290*4882a593Smuzhiyun 			break;
291*4882a593Smuzhiyun 		}
292*4882a593Smuzhiyun 	}
293*4882a593Smuzhiyun }
294*4882a593Smuzhiyun 
board_eth_init(bd_t * bis)295*4882a593Smuzhiyun int board_eth_init(bd_t *bis)
296*4882a593Smuzhiyun {
297*4882a593Smuzhiyun #ifdef CONFIG_FMAN_ENET
298*4882a593Smuzhiyun 	int i, idx, lane, slot, interface;
299*4882a593Smuzhiyun 	struct memac_mdio_info dtsec_mdio_info;
300*4882a593Smuzhiyun 	struct memac_mdio_info tgec_mdio_info;
301*4882a593Smuzhiyun 	struct ccsr_gur *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR);
302*4882a593Smuzhiyun 	u32 srds_s1;
303*4882a593Smuzhiyun 
304*4882a593Smuzhiyun 	srds_s1 = in_be32(&gur->rcwsr[4]) &
305*4882a593Smuzhiyun 			FSL_CHASSIS2_RCWSR4_SRDS1_PRTCL_MASK;
306*4882a593Smuzhiyun 	srds_s1 >>= FSL_CHASSIS2_RCWSR4_SRDS1_PRTCL_SHIFT;
307*4882a593Smuzhiyun 
308*4882a593Smuzhiyun 	/* Initialize the mdio_mux array so we can recognize empty elements */
309*4882a593Smuzhiyun 	for (i = 0; i < NUM_FM_PORTS; i++)
310*4882a593Smuzhiyun 		mdio_mux[i] = EMI_NONE;
311*4882a593Smuzhiyun 
312*4882a593Smuzhiyun 	dtsec_mdio_info.regs =
313*4882a593Smuzhiyun 		(struct memac_mdio_controller *)CONFIG_SYS_FM1_DTSEC_MDIO_ADDR;
314*4882a593Smuzhiyun 
315*4882a593Smuzhiyun 	dtsec_mdio_info.name = DEFAULT_FM_MDIO_NAME;
316*4882a593Smuzhiyun 
317*4882a593Smuzhiyun 	/* Register the 1G MDIO bus */
318*4882a593Smuzhiyun 	fm_memac_mdio_init(bis, &dtsec_mdio_info);
319*4882a593Smuzhiyun 
320*4882a593Smuzhiyun 	tgec_mdio_info.regs =
321*4882a593Smuzhiyun 		(struct memac_mdio_controller *)CONFIG_SYS_FM1_TGEC_MDIO_ADDR;
322*4882a593Smuzhiyun 	tgec_mdio_info.name = DEFAULT_FM_TGEC_MDIO_NAME;
323*4882a593Smuzhiyun 
324*4882a593Smuzhiyun 	/* Register the 10G MDIO bus */
325*4882a593Smuzhiyun 	fm_memac_mdio_init(bis, &tgec_mdio_info);
326*4882a593Smuzhiyun 
327*4882a593Smuzhiyun 	/* Register the muxing front-ends to the MDIO buses */
328*4882a593Smuzhiyun 	ls1043aqds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_RGMII1);
329*4882a593Smuzhiyun 	ls1043aqds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_RGMII2);
330*4882a593Smuzhiyun 	ls1043aqds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT1);
331*4882a593Smuzhiyun 	ls1043aqds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT2);
332*4882a593Smuzhiyun 	ls1043aqds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT3);
333*4882a593Smuzhiyun 	ls1043aqds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT4);
334*4882a593Smuzhiyun 	ls1043aqds_mdio_init(DEFAULT_FM_TGEC_MDIO_NAME, EMI2);
335*4882a593Smuzhiyun 
336*4882a593Smuzhiyun 	/* Set the two on-board RGMII PHY address */
337*4882a593Smuzhiyun 	fm_info_set_phy_address(FM1_DTSEC3, RGMII_PHY1_ADDR);
338*4882a593Smuzhiyun 	fm_info_set_phy_address(FM1_DTSEC4, RGMII_PHY2_ADDR);
339*4882a593Smuzhiyun 
340*4882a593Smuzhiyun 	switch (srds_s1) {
341*4882a593Smuzhiyun 	case 0x2555:
342*4882a593Smuzhiyun 		/* 2.5G SGMII on lane A, MAC 9 */
343*4882a593Smuzhiyun 		fm_info_set_phy_address(FM1_DTSEC9, 9);
344*4882a593Smuzhiyun 		break;
345*4882a593Smuzhiyun 	case 0x4555:
346*4882a593Smuzhiyun 	case 0x4558:
347*4882a593Smuzhiyun 		/* QSGMII on lane A, MAC 1/2/5/6 */
348*4882a593Smuzhiyun 		fm_info_set_phy_address(FM1_DTSEC1,
349*4882a593Smuzhiyun 					QSGMII_CARD_PORT1_PHY_ADDR_S1);
350*4882a593Smuzhiyun 		fm_info_set_phy_address(FM1_DTSEC2,
351*4882a593Smuzhiyun 					QSGMII_CARD_PORT2_PHY_ADDR_S1);
352*4882a593Smuzhiyun 		fm_info_set_phy_address(FM1_DTSEC5,
353*4882a593Smuzhiyun 					QSGMII_CARD_PORT3_PHY_ADDR_S1);
354*4882a593Smuzhiyun 		fm_info_set_phy_address(FM1_DTSEC6,
355*4882a593Smuzhiyun 					QSGMII_CARD_PORT4_PHY_ADDR_S1);
356*4882a593Smuzhiyun 		break;
357*4882a593Smuzhiyun 	case 0x1355:
358*4882a593Smuzhiyun 		/* SGMII on lane B, MAC 2*/
359*4882a593Smuzhiyun 		fm_info_set_phy_address(FM1_DTSEC2, SGMII_CARD_PORT1_PHY_ADDR);
360*4882a593Smuzhiyun 		break;
361*4882a593Smuzhiyun 	case 0x2355:
362*4882a593Smuzhiyun 		/* 2.5G SGMII on lane A, MAC 9 */
363*4882a593Smuzhiyun 		fm_info_set_phy_address(FM1_DTSEC9, 9);
364*4882a593Smuzhiyun 		/* SGMII on lane B, MAC 2*/
365*4882a593Smuzhiyun 		fm_info_set_phy_address(FM1_DTSEC2, SGMII_CARD_PORT1_PHY_ADDR);
366*4882a593Smuzhiyun 		break;
367*4882a593Smuzhiyun 	case 0x3335:
368*4882a593Smuzhiyun 		/* SGMII on lane C, MAC 5 */
369*4882a593Smuzhiyun 		fm_info_set_phy_address(FM1_DTSEC5, SGMII_CARD_PORT1_PHY_ADDR);
370*4882a593Smuzhiyun 	case 0x3355:
371*4882a593Smuzhiyun 	case 0x3358:
372*4882a593Smuzhiyun 		/* SGMII on lane B, MAC 2 */
373*4882a593Smuzhiyun 		fm_info_set_phy_address(FM1_DTSEC2, SGMII_CARD_PORT1_PHY_ADDR);
374*4882a593Smuzhiyun 	case 0x3555:
375*4882a593Smuzhiyun 	case 0x3558:
376*4882a593Smuzhiyun 		/* SGMII on lane A, MAC 9 */
377*4882a593Smuzhiyun 		fm_info_set_phy_address(FM1_DTSEC9, SGMII_CARD_PORT1_PHY_ADDR);
378*4882a593Smuzhiyun 		break;
379*4882a593Smuzhiyun 	case 0x1455:
380*4882a593Smuzhiyun 		/* QSGMII on lane B, MAC 1/2/5/6 */
381*4882a593Smuzhiyun 		fm_info_set_phy_address(FM1_DTSEC1,
382*4882a593Smuzhiyun 					QSGMII_CARD_PORT1_PHY_ADDR_S2);
383*4882a593Smuzhiyun 		fm_info_set_phy_address(FM1_DTSEC2,
384*4882a593Smuzhiyun 					QSGMII_CARD_PORT2_PHY_ADDR_S2);
385*4882a593Smuzhiyun 		fm_info_set_phy_address(FM1_DTSEC5,
386*4882a593Smuzhiyun 					QSGMII_CARD_PORT3_PHY_ADDR_S2);
387*4882a593Smuzhiyun 		fm_info_set_phy_address(FM1_DTSEC6,
388*4882a593Smuzhiyun 					QSGMII_CARD_PORT4_PHY_ADDR_S2);
389*4882a593Smuzhiyun 		break;
390*4882a593Smuzhiyun 	case 0x2455:
391*4882a593Smuzhiyun 		/* 2.5G SGMII on lane A, MAC 9 */
392*4882a593Smuzhiyun 		fm_info_set_phy_address(FM1_DTSEC9, 9);
393*4882a593Smuzhiyun 		/* QSGMII on lane B, MAC 1/2/5/6 */
394*4882a593Smuzhiyun 		fm_info_set_phy_address(FM1_DTSEC1,
395*4882a593Smuzhiyun 					QSGMII_CARD_PORT1_PHY_ADDR_S2);
396*4882a593Smuzhiyun 		fm_info_set_phy_address(FM1_DTSEC2,
397*4882a593Smuzhiyun 					QSGMII_CARD_PORT2_PHY_ADDR_S2);
398*4882a593Smuzhiyun 		fm_info_set_phy_address(FM1_DTSEC5,
399*4882a593Smuzhiyun 					QSGMII_CARD_PORT3_PHY_ADDR_S2);
400*4882a593Smuzhiyun 		fm_info_set_phy_address(FM1_DTSEC6,
401*4882a593Smuzhiyun 					QSGMII_CARD_PORT4_PHY_ADDR_S2);
402*4882a593Smuzhiyun 		break;
403*4882a593Smuzhiyun 	case 0x2255:
404*4882a593Smuzhiyun 		/* 2.5G SGMII on lane A, MAC 9 */
405*4882a593Smuzhiyun 		fm_info_set_phy_address(FM1_DTSEC9, 9);
406*4882a593Smuzhiyun 		/* 2.5G SGMII on lane B, MAC 2 */
407*4882a593Smuzhiyun 		fm_info_set_phy_address(FM1_DTSEC2, 2);
408*4882a593Smuzhiyun 		break;
409*4882a593Smuzhiyun 	case 0x3333:
410*4882a593Smuzhiyun 		/* SGMII on lane A/B/C/D, MAC 9/2/5/6 */
411*4882a593Smuzhiyun 		fm_info_set_phy_address(FM1_DTSEC9,
412*4882a593Smuzhiyun 					SGMII_CARD_PORT1_PHY_ADDR);
413*4882a593Smuzhiyun 		fm_info_set_phy_address(FM1_DTSEC2,
414*4882a593Smuzhiyun 					SGMII_CARD_PORT1_PHY_ADDR);
415*4882a593Smuzhiyun 		fm_info_set_phy_address(FM1_DTSEC5,
416*4882a593Smuzhiyun 					SGMII_CARD_PORT1_PHY_ADDR);
417*4882a593Smuzhiyun 		fm_info_set_phy_address(FM1_DTSEC6,
418*4882a593Smuzhiyun 					SGMII_CARD_PORT1_PHY_ADDR);
419*4882a593Smuzhiyun 		break;
420*4882a593Smuzhiyun 	default:
421*4882a593Smuzhiyun 		printf("Invalid SerDes protocol 0x%x for LS1043AQDS\n",
422*4882a593Smuzhiyun 		       srds_s1);
423*4882a593Smuzhiyun 		break;
424*4882a593Smuzhiyun 	}
425*4882a593Smuzhiyun 
426*4882a593Smuzhiyun 	for (i = FM1_DTSEC1; i < FM1_DTSEC1 + CONFIG_SYS_NUM_FM1_DTSEC; i++) {
427*4882a593Smuzhiyun 		idx = i - FM1_DTSEC1;
428*4882a593Smuzhiyun 		interface = fm_info_get_enet_if(i);
429*4882a593Smuzhiyun 		switch (interface) {
430*4882a593Smuzhiyun 		case PHY_INTERFACE_MODE_SGMII:
431*4882a593Smuzhiyun 		case PHY_INTERFACE_MODE_SGMII_2500:
432*4882a593Smuzhiyun 		case PHY_INTERFACE_MODE_QSGMII:
433*4882a593Smuzhiyun 			if (interface == PHY_INTERFACE_MODE_SGMII) {
434*4882a593Smuzhiyun 				lane = serdes_get_first_lane(FSL_SRDS_1,
435*4882a593Smuzhiyun 						SGMII_FM1_DTSEC1 + idx);
436*4882a593Smuzhiyun 			} else if (interface == PHY_INTERFACE_MODE_SGMII_2500) {
437*4882a593Smuzhiyun 				lane = serdes_get_first_lane(FSL_SRDS_1,
438*4882a593Smuzhiyun 						SGMII_2500_FM1_DTSEC1 + idx);
439*4882a593Smuzhiyun 			} else {
440*4882a593Smuzhiyun 				lane = serdes_get_first_lane(FSL_SRDS_1,
441*4882a593Smuzhiyun 						QSGMII_FM1_A);
442*4882a593Smuzhiyun 			}
443*4882a593Smuzhiyun 
444*4882a593Smuzhiyun 			if (lane < 0)
445*4882a593Smuzhiyun 				break;
446*4882a593Smuzhiyun 
447*4882a593Smuzhiyun 			slot = lane_to_slot[lane];
448*4882a593Smuzhiyun 			debug("FM1@DTSEC%u expects SGMII in slot %u\n",
449*4882a593Smuzhiyun 			      idx + 1, slot);
450*4882a593Smuzhiyun 			if (QIXIS_READ(present2) & (1 << (slot - 1)))
451*4882a593Smuzhiyun 				fm_disable_port(i);
452*4882a593Smuzhiyun 
453*4882a593Smuzhiyun 			switch (slot) {
454*4882a593Smuzhiyun 			case 1:
455*4882a593Smuzhiyun 				mdio_mux[i] = EMI1_SLOT1;
456*4882a593Smuzhiyun 				fm_info_set_mdio(i, mii_dev_for_muxval(
457*4882a593Smuzhiyun 						 mdio_mux[i]));
458*4882a593Smuzhiyun 				break;
459*4882a593Smuzhiyun 			case 2:
460*4882a593Smuzhiyun 				mdio_mux[i] = EMI1_SLOT2;
461*4882a593Smuzhiyun 				fm_info_set_mdio(i, mii_dev_for_muxval(
462*4882a593Smuzhiyun 						 mdio_mux[i]));
463*4882a593Smuzhiyun 				break;
464*4882a593Smuzhiyun 			case 3:
465*4882a593Smuzhiyun 				mdio_mux[i] = EMI1_SLOT3;
466*4882a593Smuzhiyun 				fm_info_set_mdio(i, mii_dev_for_muxval(
467*4882a593Smuzhiyun 						 mdio_mux[i]));
468*4882a593Smuzhiyun 				break;
469*4882a593Smuzhiyun 			case 4:
470*4882a593Smuzhiyun 				mdio_mux[i] = EMI1_SLOT4;
471*4882a593Smuzhiyun 				fm_info_set_mdio(i, mii_dev_for_muxval(
472*4882a593Smuzhiyun 						 mdio_mux[i]));
473*4882a593Smuzhiyun 				break;
474*4882a593Smuzhiyun 			default:
475*4882a593Smuzhiyun 				break;
476*4882a593Smuzhiyun 			}
477*4882a593Smuzhiyun 			break;
478*4882a593Smuzhiyun 		case PHY_INTERFACE_MODE_RGMII:
479*4882a593Smuzhiyun 		case PHY_INTERFACE_MODE_RGMII_TXID:
480*4882a593Smuzhiyun 			if (i == FM1_DTSEC3)
481*4882a593Smuzhiyun 				mdio_mux[i] = EMI1_RGMII1;
482*4882a593Smuzhiyun 			else if (i == FM1_DTSEC4)
483*4882a593Smuzhiyun 				mdio_mux[i] = EMI1_RGMII2;
484*4882a593Smuzhiyun 			fm_info_set_mdio(i, mii_dev_for_muxval(mdio_mux[i]));
485*4882a593Smuzhiyun 			break;
486*4882a593Smuzhiyun 		default:
487*4882a593Smuzhiyun 			break;
488*4882a593Smuzhiyun 		}
489*4882a593Smuzhiyun 	}
490*4882a593Smuzhiyun 
491*4882a593Smuzhiyun 	cpu_eth_init(bis);
492*4882a593Smuzhiyun #endif /* CONFIG_FMAN_ENET */
493*4882a593Smuzhiyun 
494*4882a593Smuzhiyun 	return pci_eth_init(bis);
495*4882a593Smuzhiyun }
496