xref: /OK3568_Linux_fs/u-boot/board/freescale/t102xqds/eth_t102xqds.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright 2014 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 <command.h>
11*4882a593Smuzhiyun #include <netdev.h>
12*4882a593Smuzhiyun #include <asm/mmu.h>
13*4882a593Smuzhiyun #include <asm/processor.h>
14*4882a593Smuzhiyun #include <asm/immap_85xx.h>
15*4882a593Smuzhiyun #include <asm/fsl_law.h>
16*4882a593Smuzhiyun #include <asm/fsl_serdes.h>
17*4882a593Smuzhiyun #include <asm/fsl_portals.h>
18*4882a593Smuzhiyun #include <asm/fsl_liodn.h>
19*4882a593Smuzhiyun #include <malloc.h>
20*4882a593Smuzhiyun #include <fm_eth.h>
21*4882a593Smuzhiyun #include <fsl_mdio.h>
22*4882a593Smuzhiyun #include <miiphy.h>
23*4882a593Smuzhiyun #include <phy.h>
24*4882a593Smuzhiyun #include <fsl_dtsec.h>
25*4882a593Smuzhiyun #include <asm/fsl_serdes.h>
26*4882a593Smuzhiyun #include "../common/qixis.h"
27*4882a593Smuzhiyun #include "../common/fman.h"
28*4882a593Smuzhiyun #include "t102xqds_qixis.h"
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun #define EMI_NONE	0xFFFFFFFF
31*4882a593Smuzhiyun #define EMI1_RGMII1	0
32*4882a593Smuzhiyun #define EMI1_RGMII2	1
33*4882a593Smuzhiyun #define EMI1_SLOT1	2
34*4882a593Smuzhiyun #define EMI1_SLOT2	3
35*4882a593Smuzhiyun #define EMI1_SLOT3	4
36*4882a593Smuzhiyun #define EMI1_SLOT4	5
37*4882a593Smuzhiyun #define EMI1_SLOT5	6
38*4882a593Smuzhiyun #define EMI2		7
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun static int mdio_mux[NUM_FM_PORTS];
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun static const char * const mdio_names[] = {
43*4882a593Smuzhiyun 	"T1024QDS_MDIO_RGMII1",
44*4882a593Smuzhiyun 	"T1024QDS_MDIO_RGMII2",
45*4882a593Smuzhiyun 	"T1024QDS_MDIO_SLOT1",
46*4882a593Smuzhiyun 	"T1024QDS_MDIO_SLOT2",
47*4882a593Smuzhiyun 	"T1024QDS_MDIO_SLOT3",
48*4882a593Smuzhiyun 	"T1024QDS_MDIO_SLOT4",
49*4882a593Smuzhiyun 	"T1024QDS_MDIO_SLOT5",
50*4882a593Smuzhiyun 	"T1024QDS_MDIO_10GC",
51*4882a593Smuzhiyun 	"NULL",
52*4882a593Smuzhiyun };
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun /* Map SerDes1 4 lanes to default slot, will be initialized dynamically */
55*4882a593Smuzhiyun static u8 lane_to_slot[] = {2, 3, 4, 5};
56*4882a593Smuzhiyun 
t1024qds_mdio_name_for_muxval(u8 muxval)57*4882a593Smuzhiyun static const char *t1024qds_mdio_name_for_muxval(u8 muxval)
58*4882a593Smuzhiyun {
59*4882a593Smuzhiyun 	return mdio_names[muxval];
60*4882a593Smuzhiyun }
61*4882a593Smuzhiyun 
mii_dev_for_muxval(u8 muxval)62*4882a593Smuzhiyun struct mii_dev *mii_dev_for_muxval(u8 muxval)
63*4882a593Smuzhiyun {
64*4882a593Smuzhiyun 	struct mii_dev *bus;
65*4882a593Smuzhiyun 	const char *name;
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun 	if (muxval > EMI2)
68*4882a593Smuzhiyun 		return NULL;
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun 	name = t1024qds_mdio_name_for_muxval(muxval);
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun 	if (!name) {
73*4882a593Smuzhiyun 		printf("No bus for muxval %x\n", muxval);
74*4882a593Smuzhiyun 		return NULL;
75*4882a593Smuzhiyun 	}
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun 	bus = miiphy_get_dev_by_name(name);
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun 	if (!bus) {
80*4882a593Smuzhiyun 		printf("No bus by name %s\n", name);
81*4882a593Smuzhiyun 		return NULL;
82*4882a593Smuzhiyun 	}
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun 	return bus;
85*4882a593Smuzhiyun }
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun struct t1024qds_mdio {
88*4882a593Smuzhiyun 	u8 muxval;
89*4882a593Smuzhiyun 	struct mii_dev *realbus;
90*4882a593Smuzhiyun };
91*4882a593Smuzhiyun 
t1024qds_mux_mdio(u8 muxval)92*4882a593Smuzhiyun static void t1024qds_mux_mdio(u8 muxval)
93*4882a593Smuzhiyun {
94*4882a593Smuzhiyun 	u8 brdcfg4;
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun 	if (muxval < 7) {
97*4882a593Smuzhiyun 		brdcfg4 = QIXIS_READ(brdcfg[4]);
98*4882a593Smuzhiyun 		brdcfg4 &= ~BRDCFG4_EMISEL_MASK;
99*4882a593Smuzhiyun 		brdcfg4 |= (muxval << BRDCFG4_EMISEL_SHIFT);
100*4882a593Smuzhiyun 		QIXIS_WRITE(brdcfg[4], brdcfg4);
101*4882a593Smuzhiyun 	}
102*4882a593Smuzhiyun }
103*4882a593Smuzhiyun 
t1024qds_mdio_read(struct mii_dev * bus,int addr,int devad,int regnum)104*4882a593Smuzhiyun static int t1024qds_mdio_read(struct mii_dev *bus, int addr, int devad,
105*4882a593Smuzhiyun 			      int regnum)
106*4882a593Smuzhiyun {
107*4882a593Smuzhiyun 	struct t1024qds_mdio *priv = bus->priv;
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun 	t1024qds_mux_mdio(priv->muxval);
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun 	return priv->realbus->read(priv->realbus, addr, devad, regnum);
112*4882a593Smuzhiyun }
113*4882a593Smuzhiyun 
t1024qds_mdio_write(struct mii_dev * bus,int addr,int devad,int regnum,u16 value)114*4882a593Smuzhiyun static int t1024qds_mdio_write(struct mii_dev *bus, int addr, int devad,
115*4882a593Smuzhiyun 			       int regnum, u16 value)
116*4882a593Smuzhiyun {
117*4882a593Smuzhiyun 	struct t1024qds_mdio *priv = bus->priv;
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun 	t1024qds_mux_mdio(priv->muxval);
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun 	return priv->realbus->write(priv->realbus, addr, devad, regnum, value);
122*4882a593Smuzhiyun }
123*4882a593Smuzhiyun 
t1024qds_mdio_reset(struct mii_dev * bus)124*4882a593Smuzhiyun static int t1024qds_mdio_reset(struct mii_dev *bus)
125*4882a593Smuzhiyun {
126*4882a593Smuzhiyun 	struct t1024qds_mdio *priv = bus->priv;
127*4882a593Smuzhiyun 
128*4882a593Smuzhiyun 	return priv->realbus->reset(priv->realbus);
129*4882a593Smuzhiyun }
130*4882a593Smuzhiyun 
t1024qds_mdio_init(char * realbusname,u8 muxval)131*4882a593Smuzhiyun static int t1024qds_mdio_init(char *realbusname, u8 muxval)
132*4882a593Smuzhiyun {
133*4882a593Smuzhiyun 	struct t1024qds_mdio *pmdio;
134*4882a593Smuzhiyun 	struct mii_dev *bus = mdio_alloc();
135*4882a593Smuzhiyun 
136*4882a593Smuzhiyun 	if (!bus) {
137*4882a593Smuzhiyun 		printf("Failed to allocate t1024qds MDIO bus\n");
138*4882a593Smuzhiyun 		return -1;
139*4882a593Smuzhiyun 	}
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun 	pmdio = malloc(sizeof(*pmdio));
142*4882a593Smuzhiyun 	if (!pmdio) {
143*4882a593Smuzhiyun 		printf("Failed to allocate t1024qds private data\n");
144*4882a593Smuzhiyun 		free(bus);
145*4882a593Smuzhiyun 		return -1;
146*4882a593Smuzhiyun 	}
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun 	bus->read = t1024qds_mdio_read;
149*4882a593Smuzhiyun 	bus->write = t1024qds_mdio_write;
150*4882a593Smuzhiyun 	bus->reset = t1024qds_mdio_reset;
151*4882a593Smuzhiyun 	strcpy(bus->name, t1024qds_mdio_name_for_muxval(muxval));
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun 	pmdio->realbus = miiphy_get_dev_by_name(realbusname);
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun 	if (!pmdio->realbus) {
156*4882a593Smuzhiyun 		printf("No bus with name %s\n", realbusname);
157*4882a593Smuzhiyun 		free(bus);
158*4882a593Smuzhiyun 		free(pmdio);
159*4882a593Smuzhiyun 		return -1;
160*4882a593Smuzhiyun 	}
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun 	pmdio->muxval = muxval;
163*4882a593Smuzhiyun 	bus->priv = pmdio;
164*4882a593Smuzhiyun 	return mdio_register(bus);
165*4882a593Smuzhiyun }
166*4882a593Smuzhiyun 
board_ft_fman_fixup_port(void * fdt,char * compat,phys_addr_t addr,enum fm_port port,int offset)167*4882a593Smuzhiyun void board_ft_fman_fixup_port(void *fdt, char *compat, phys_addr_t addr,
168*4882a593Smuzhiyun 			      enum fm_port port, int offset)
169*4882a593Smuzhiyun {
170*4882a593Smuzhiyun 	struct fixed_link f_link;
171*4882a593Smuzhiyun 
172*4882a593Smuzhiyun 	if (fm_info_get_enet_if(port) == PHY_INTERFACE_MODE_RGMII) {
173*4882a593Smuzhiyun 		if (port == FM1_DTSEC3) {
174*4882a593Smuzhiyun 			fdt_set_phy_handle(fdt, compat, addr, "rgmii_phy2");
175*4882a593Smuzhiyun 			fdt_setprop_string(fdt, offset, "phy-connection-type",
176*4882a593Smuzhiyun 					   "rgmii");
177*4882a593Smuzhiyun 			fdt_status_okay_by_alias(fdt, "emi1_rgmii1");
178*4882a593Smuzhiyun 		}
179*4882a593Smuzhiyun 	} else if (fm_info_get_enet_if(port) == PHY_INTERFACE_MODE_SGMII) {
180*4882a593Smuzhiyun 		if (port == FM1_DTSEC1) {
181*4882a593Smuzhiyun 			fdt_set_phy_handle(fdt, compat, addr,
182*4882a593Smuzhiyun 					   "sgmii_vsc8234_phy_s5");
183*4882a593Smuzhiyun 		} else if (port == FM1_DTSEC2) {
184*4882a593Smuzhiyun 			fdt_set_phy_handle(fdt, compat, addr,
185*4882a593Smuzhiyun 					   "sgmii_vsc8234_phy_s4");
186*4882a593Smuzhiyun 		}
187*4882a593Smuzhiyun 	} else if (fm_info_get_enet_if(port) == PHY_INTERFACE_MODE_SGMII_2500) {
188*4882a593Smuzhiyun 		if (port == FM1_DTSEC3) {
189*4882a593Smuzhiyun 			fdt_set_phy_handle(fdt, compat, addr,
190*4882a593Smuzhiyun 					   "sgmii_aqr105_phy_s3");
191*4882a593Smuzhiyun 		}
192*4882a593Smuzhiyun 	} else if (fm_info_get_enet_if(port) == PHY_INTERFACE_MODE_QSGMII) {
193*4882a593Smuzhiyun 		switch (port) {
194*4882a593Smuzhiyun 		case FM1_DTSEC1:
195*4882a593Smuzhiyun 			fdt_set_phy_handle(fdt, compat, addr, "qsgmii_phy_p1");
196*4882a593Smuzhiyun 			break;
197*4882a593Smuzhiyun 		case FM1_DTSEC2:
198*4882a593Smuzhiyun 			fdt_set_phy_handle(fdt, compat, addr, "qsgmii_phy_p2");
199*4882a593Smuzhiyun 			break;
200*4882a593Smuzhiyun 		case FM1_DTSEC3:
201*4882a593Smuzhiyun 			fdt_set_phy_handle(fdt, compat, addr, "qsgmii_phy_p3");
202*4882a593Smuzhiyun 			break;
203*4882a593Smuzhiyun 		case FM1_DTSEC4:
204*4882a593Smuzhiyun 			fdt_set_phy_handle(fdt, compat, addr, "qsgmii_phy_p4");
205*4882a593Smuzhiyun 			break;
206*4882a593Smuzhiyun 		default:
207*4882a593Smuzhiyun 			break;
208*4882a593Smuzhiyun 		}
209*4882a593Smuzhiyun 		fdt_delprop(fdt, offset, "phy-connection-type");
210*4882a593Smuzhiyun 		fdt_setprop_string(fdt, offset, "phy-connection-type",
211*4882a593Smuzhiyun 				   "qsgmii");
212*4882a593Smuzhiyun 		fdt_status_okay_by_alias(fdt, "emi1_slot2");
213*4882a593Smuzhiyun 	} else if (fm_info_get_enet_if(port) == PHY_INTERFACE_MODE_XGMII) {
214*4882a593Smuzhiyun 		/* XFI interface */
215*4882a593Smuzhiyun 		f_link.phy_id = port;
216*4882a593Smuzhiyun 		f_link.duplex = 1;
217*4882a593Smuzhiyun 		f_link.link_speed = 10000;
218*4882a593Smuzhiyun 		f_link.pause = 0;
219*4882a593Smuzhiyun 		f_link.asym_pause = 0;
220*4882a593Smuzhiyun 		/* no PHY for XFI */
221*4882a593Smuzhiyun 		fdt_delprop(fdt, offset, "phy-handle");
222*4882a593Smuzhiyun 		fdt_setprop(fdt, offset, "fixed-link", &f_link, sizeof(f_link));
223*4882a593Smuzhiyun 		fdt_setprop_string(fdt, offset, "phy-connection-type", "xgmii");
224*4882a593Smuzhiyun 	}
225*4882a593Smuzhiyun }
226*4882a593Smuzhiyun 
fdt_fixup_board_enet(void * fdt)227*4882a593Smuzhiyun void fdt_fixup_board_enet(void *fdt)
228*4882a593Smuzhiyun {
229*4882a593Smuzhiyun }
230*4882a593Smuzhiyun 
231*4882a593Smuzhiyun /*
232*4882a593Smuzhiyun  * This function reads RCW to check if Serdes1{A:D} is configured
233*4882a593Smuzhiyun  * to slot 1/2/3/4/5 and update the lane_to_slot[] array accordingly
234*4882a593Smuzhiyun  */
initialize_lane_to_slot(void)235*4882a593Smuzhiyun static void initialize_lane_to_slot(void)
236*4882a593Smuzhiyun {
237*4882a593Smuzhiyun 	ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
238*4882a593Smuzhiyun 	u32 srds_s1 = in_be32(&gur->rcwsr[4]) &
239*4882a593Smuzhiyun 				FSL_CORENET2_RCWSR4_SRDS1_PRTCL;
240*4882a593Smuzhiyun 
241*4882a593Smuzhiyun 	srds_s1 >>= FSL_CORENET2_RCWSR4_SRDS1_PRTCL_SHIFT;
242*4882a593Smuzhiyun 
243*4882a593Smuzhiyun 	switch (srds_s1) {
244*4882a593Smuzhiyun 	case 0x46:
245*4882a593Smuzhiyun 	case 0x47:
246*4882a593Smuzhiyun 		lane_to_slot[1] = 2;
247*4882a593Smuzhiyun 		break;
248*4882a593Smuzhiyun 	default:
249*4882a593Smuzhiyun 		break;
250*4882a593Smuzhiyun 	}
251*4882a593Smuzhiyun }
252*4882a593Smuzhiyun 
board_eth_init(bd_t * bis)253*4882a593Smuzhiyun int board_eth_init(bd_t *bis)
254*4882a593Smuzhiyun {
255*4882a593Smuzhiyun #if defined(CONFIG_FMAN_ENET)
256*4882a593Smuzhiyun 	int i, idx, lane, slot, interface;
257*4882a593Smuzhiyun 	struct memac_mdio_info dtsec_mdio_info;
258*4882a593Smuzhiyun 	struct memac_mdio_info tgec_mdio_info;
259*4882a593Smuzhiyun 	ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
260*4882a593Smuzhiyun 	u32 srds_s1;
261*4882a593Smuzhiyun 
262*4882a593Smuzhiyun 	srds_s1 = in_be32(&gur->rcwsr[4]) &
263*4882a593Smuzhiyun 					FSL_CORENET2_RCWSR4_SRDS1_PRTCL;
264*4882a593Smuzhiyun 	srds_s1 >>= FSL_CORENET2_RCWSR4_SRDS1_PRTCL_SHIFT;
265*4882a593Smuzhiyun 
266*4882a593Smuzhiyun 	initialize_lane_to_slot();
267*4882a593Smuzhiyun 
268*4882a593Smuzhiyun 	/* Initialize the mdio_mux array so we can recognize empty elements */
269*4882a593Smuzhiyun 	for (i = 0; i < NUM_FM_PORTS; i++)
270*4882a593Smuzhiyun 		mdio_mux[i] = EMI_NONE;
271*4882a593Smuzhiyun 
272*4882a593Smuzhiyun 	dtsec_mdio_info.regs =
273*4882a593Smuzhiyun 		(struct memac_mdio_controller *)CONFIG_SYS_FM1_DTSEC_MDIO_ADDR;
274*4882a593Smuzhiyun 
275*4882a593Smuzhiyun 	dtsec_mdio_info.name = DEFAULT_FM_MDIO_NAME;
276*4882a593Smuzhiyun 
277*4882a593Smuzhiyun 	/* Register the 1G MDIO bus */
278*4882a593Smuzhiyun 	fm_memac_mdio_init(bis, &dtsec_mdio_info);
279*4882a593Smuzhiyun 
280*4882a593Smuzhiyun 	tgec_mdio_info.regs =
281*4882a593Smuzhiyun 		(struct memac_mdio_controller *)CONFIG_SYS_FM1_TGEC_MDIO_ADDR;
282*4882a593Smuzhiyun 	tgec_mdio_info.name = DEFAULT_FM_TGEC_MDIO_NAME;
283*4882a593Smuzhiyun 
284*4882a593Smuzhiyun 	/* Register the 10G MDIO bus */
285*4882a593Smuzhiyun 	fm_memac_mdio_init(bis, &tgec_mdio_info);
286*4882a593Smuzhiyun 
287*4882a593Smuzhiyun 	/* Register the muxing front-ends to the MDIO buses */
288*4882a593Smuzhiyun 	t1024qds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_RGMII1);
289*4882a593Smuzhiyun 	t1024qds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_RGMII2);
290*4882a593Smuzhiyun 	t1024qds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT1);
291*4882a593Smuzhiyun 	t1024qds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT2);
292*4882a593Smuzhiyun 	t1024qds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT3);
293*4882a593Smuzhiyun 	t1024qds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT4);
294*4882a593Smuzhiyun 	t1024qds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT5);
295*4882a593Smuzhiyun 	t1024qds_mdio_init(DEFAULT_FM_TGEC_MDIO_NAME, EMI2);
296*4882a593Smuzhiyun 
297*4882a593Smuzhiyun 	/* Set the two on-board RGMII PHY address */
298*4882a593Smuzhiyun 	fm_info_set_phy_address(FM1_DTSEC3, RGMII_PHY2_ADDR);
299*4882a593Smuzhiyun 	fm_info_set_phy_address(FM1_DTSEC4, RGMII_PHY1_ADDR);
300*4882a593Smuzhiyun 
301*4882a593Smuzhiyun 	switch (srds_s1) {
302*4882a593Smuzhiyun 	case 0xd5:
303*4882a593Smuzhiyun 	case 0xd6:
304*4882a593Smuzhiyun 		/* QSGMII in Slot2 */
305*4882a593Smuzhiyun 		fm_info_set_phy_address(FM1_DTSEC1, 0x8);
306*4882a593Smuzhiyun 		fm_info_set_phy_address(FM1_DTSEC2, 0x9);
307*4882a593Smuzhiyun 		fm_info_set_phy_address(FM1_DTSEC3, 0xa);
308*4882a593Smuzhiyun 		fm_info_set_phy_address(FM1_DTSEC4, 0xb);
309*4882a593Smuzhiyun 		break;
310*4882a593Smuzhiyun 	case 0x95:
311*4882a593Smuzhiyun 	case 0x99:
312*4882a593Smuzhiyun 		/*
313*4882a593Smuzhiyun 		 * XFI does not need a PHY to work, but to avoid U-Boot use
314*4882a593Smuzhiyun 		 * default PHY address which is zero to a MAC when it found
315*4882a593Smuzhiyun 		 * a MAC has no PHY address, we give a PHY address to XFI
316*4882a593Smuzhiyun 		 * MAC, and should not use a real XAUI PHY address, since
317*4882a593Smuzhiyun 		 * MDIO can access it successfully, and then MDIO thinks the
318*4882a593Smuzhiyun 		 * XAUI card is used for the XFI MAC, which will cause error.
319*4882a593Smuzhiyun 		 */
320*4882a593Smuzhiyun 		fm_info_set_phy_address(FM1_10GEC1, 4);
321*4882a593Smuzhiyun 		fm_info_set_phy_address(FM1_DTSEC2, SGMII_CARD_PORT1_PHY_ADDR);
322*4882a593Smuzhiyun 		break;
323*4882a593Smuzhiyun 	case 0x6f:
324*4882a593Smuzhiyun 		/* SGMII in Slot3, Slot4, Slot5 */
325*4882a593Smuzhiyun 		fm_info_set_phy_address(FM1_DTSEC1, SGMII_CARD_AQ_PHY_ADDR_S5);
326*4882a593Smuzhiyun 		fm_info_set_phy_address(FM1_DTSEC2, SGMII_CARD_AQ_PHY_ADDR_S4);
327*4882a593Smuzhiyun 		fm_info_set_phy_address(FM1_DTSEC3, SGMII_CARD_PORT1_PHY_ADDR);
328*4882a593Smuzhiyun 		break;
329*4882a593Smuzhiyun 	case 0x7f:
330*4882a593Smuzhiyun 		fm_info_set_phy_address(FM1_DTSEC1, SGMII_CARD_AQ_PHY_ADDR_S5);
331*4882a593Smuzhiyun 		fm_info_set_phy_address(FM1_DTSEC2, SGMII_CARD_AQ_PHY_ADDR_S4);
332*4882a593Smuzhiyun 		fm_info_set_phy_address(FM1_DTSEC3, SGMII_CARD_AQ_PHY_ADDR_S3);
333*4882a593Smuzhiyun 		break;
334*4882a593Smuzhiyun 	case 0x47:
335*4882a593Smuzhiyun 		fm_info_set_phy_address(FM1_DTSEC1, SGMII_CARD_PORT1_PHY_ADDR);
336*4882a593Smuzhiyun 		break;
337*4882a593Smuzhiyun 	case 0x77:
338*4882a593Smuzhiyun 		fm_info_set_phy_address(FM1_DTSEC1, SGMII_CARD_PORT1_PHY_ADDR);
339*4882a593Smuzhiyun 		fm_info_set_phy_address(FM1_DTSEC3, SGMII_CARD_AQ_PHY_ADDR_S3);
340*4882a593Smuzhiyun 		break;
341*4882a593Smuzhiyun 	case 0x5a:
342*4882a593Smuzhiyun 		fm_info_set_phy_address(FM1_DTSEC2, SGMII_CARD_PORT1_PHY_ADDR);
343*4882a593Smuzhiyun 		break;
344*4882a593Smuzhiyun 	case 0x6a:
345*4882a593Smuzhiyun 		fm_info_set_phy_address(FM1_DTSEC2, SGMII_CARD_PORT1_PHY_ADDR);
346*4882a593Smuzhiyun 		fm_info_set_phy_address(FM1_DTSEC3, SGMII_CARD_PORT1_PHY_ADDR);
347*4882a593Smuzhiyun 		break;
348*4882a593Smuzhiyun 	case 0x5b:
349*4882a593Smuzhiyun 		fm_info_set_phy_address(FM1_DTSEC1, SGMII_CARD_PORT1_PHY_ADDR);
350*4882a593Smuzhiyun 		fm_info_set_phy_address(FM1_DTSEC2, SGMII_CARD_PORT1_PHY_ADDR);
351*4882a593Smuzhiyun 		break;
352*4882a593Smuzhiyun 	case 0x6b:
353*4882a593Smuzhiyun 		fm_info_set_phy_address(FM1_DTSEC1, SGMII_CARD_PORT1_PHY_ADDR);
354*4882a593Smuzhiyun 		fm_info_set_phy_address(FM1_DTSEC2, SGMII_CARD_PORT1_PHY_ADDR);
355*4882a593Smuzhiyun 		fm_info_set_phy_address(FM1_DTSEC3, SGMII_CARD_PORT1_PHY_ADDR);
356*4882a593Smuzhiyun 		break;
357*4882a593Smuzhiyun 	default:
358*4882a593Smuzhiyun 		break;
359*4882a593Smuzhiyun 	}
360*4882a593Smuzhiyun 
361*4882a593Smuzhiyun 	for (i = FM1_DTSEC1; i < FM1_DTSEC1 + CONFIG_SYS_NUM_FM1_DTSEC; i++) {
362*4882a593Smuzhiyun 		idx = i - FM1_DTSEC1;
363*4882a593Smuzhiyun 		interface = fm_info_get_enet_if(i);
364*4882a593Smuzhiyun 		switch (interface) {
365*4882a593Smuzhiyun 		case PHY_INTERFACE_MODE_SGMII:
366*4882a593Smuzhiyun 		case PHY_INTERFACE_MODE_SGMII_2500:
367*4882a593Smuzhiyun 		case PHY_INTERFACE_MODE_QSGMII:
368*4882a593Smuzhiyun 			if (interface == PHY_INTERFACE_MODE_SGMII) {
369*4882a593Smuzhiyun 				lane = serdes_get_first_lane(FSL_SRDS_1,
370*4882a593Smuzhiyun 						SGMII_FM1_DTSEC1 + idx);
371*4882a593Smuzhiyun 			} else if (interface == PHY_INTERFACE_MODE_SGMII_2500) {
372*4882a593Smuzhiyun 				lane = serdes_get_first_lane(FSL_SRDS_1,
373*4882a593Smuzhiyun 						SGMII_2500_FM1_DTSEC1 + idx);
374*4882a593Smuzhiyun 			} else {
375*4882a593Smuzhiyun 				lane = serdes_get_first_lane(FSL_SRDS_1,
376*4882a593Smuzhiyun 						QSGMII_FM1_A);
377*4882a593Smuzhiyun 			}
378*4882a593Smuzhiyun 
379*4882a593Smuzhiyun 			if (lane < 0)
380*4882a593Smuzhiyun 				break;
381*4882a593Smuzhiyun 
382*4882a593Smuzhiyun 			slot = lane_to_slot[lane];
383*4882a593Smuzhiyun 			debug("FM1@DTSEC%u expects SGMII in slot %u\n",
384*4882a593Smuzhiyun 			      idx + 1, slot);
385*4882a593Smuzhiyun 			if (QIXIS_READ(present2) & (1 << (slot - 1)))
386*4882a593Smuzhiyun 				fm_disable_port(i);
387*4882a593Smuzhiyun 
388*4882a593Smuzhiyun 			switch (slot) {
389*4882a593Smuzhiyun 			case 2:
390*4882a593Smuzhiyun 				mdio_mux[i] = EMI1_SLOT2;
391*4882a593Smuzhiyun 				fm_info_set_mdio(i, mii_dev_for_muxval(
392*4882a593Smuzhiyun 						 mdio_mux[i]));
393*4882a593Smuzhiyun 				break;
394*4882a593Smuzhiyun 			case 3:
395*4882a593Smuzhiyun 				mdio_mux[i] = EMI1_SLOT3;
396*4882a593Smuzhiyun 				fm_info_set_mdio(i, mii_dev_for_muxval(
397*4882a593Smuzhiyun 						 mdio_mux[i]));
398*4882a593Smuzhiyun 				break;
399*4882a593Smuzhiyun 			case 4:
400*4882a593Smuzhiyun 				mdio_mux[i] = EMI1_SLOT4;
401*4882a593Smuzhiyun 				fm_info_set_mdio(i, mii_dev_for_muxval(
402*4882a593Smuzhiyun 						 mdio_mux[i]));
403*4882a593Smuzhiyun 				break;
404*4882a593Smuzhiyun 			case 5:
405*4882a593Smuzhiyun 				mdio_mux[i] = EMI1_SLOT5;
406*4882a593Smuzhiyun 				fm_info_set_mdio(i, mii_dev_for_muxval(
407*4882a593Smuzhiyun 						 mdio_mux[i]));
408*4882a593Smuzhiyun 				break;
409*4882a593Smuzhiyun 			}
410*4882a593Smuzhiyun 			break;
411*4882a593Smuzhiyun 		case PHY_INTERFACE_MODE_RGMII:
412*4882a593Smuzhiyun 			if (i == FM1_DTSEC3)
413*4882a593Smuzhiyun 				mdio_mux[i] = EMI1_RGMII2;
414*4882a593Smuzhiyun 			else if (i == FM1_DTSEC4)
415*4882a593Smuzhiyun 				mdio_mux[i] = EMI1_RGMII1;
416*4882a593Smuzhiyun 			fm_info_set_mdio(i, mii_dev_for_muxval(mdio_mux[i]));
417*4882a593Smuzhiyun 			break;
418*4882a593Smuzhiyun 		default:
419*4882a593Smuzhiyun 			break;
420*4882a593Smuzhiyun 		}
421*4882a593Smuzhiyun 	}
422*4882a593Smuzhiyun 
423*4882a593Smuzhiyun 	for (i = FM1_10GEC1; i < FM1_10GEC1 + CONFIG_SYS_NUM_FM1_10GEC; i++) {
424*4882a593Smuzhiyun 		idx = i - FM1_10GEC1;
425*4882a593Smuzhiyun 		switch (fm_info_get_enet_if(i)) {
426*4882a593Smuzhiyun 		case PHY_INTERFACE_MODE_XGMII:
427*4882a593Smuzhiyun 			lane = serdes_get_first_lane(FSL_SRDS_1,
428*4882a593Smuzhiyun 						     XFI_FM1_MAC1 + idx);
429*4882a593Smuzhiyun 			if (lane < 0)
430*4882a593Smuzhiyun 				break;
431*4882a593Smuzhiyun 			mdio_mux[i] = EMI2;
432*4882a593Smuzhiyun 			fm_info_set_mdio(i, mii_dev_for_muxval(mdio_mux[i]));
433*4882a593Smuzhiyun 			break;
434*4882a593Smuzhiyun 		default:
435*4882a593Smuzhiyun 			break;
436*4882a593Smuzhiyun 		}
437*4882a593Smuzhiyun 	}
438*4882a593Smuzhiyun 
439*4882a593Smuzhiyun 	cpu_eth_init(bis);
440*4882a593Smuzhiyun #endif /* CONFIG_FMAN_ENET */
441*4882a593Smuzhiyun 
442*4882a593Smuzhiyun 	return pci_eth_init(bis);
443*4882a593Smuzhiyun }
444