xref: /rk3399_rockchip-uboot/board/freescale/t4qds/eth.c (revision 57dc53a72460e8e301fa1cc7951b41db8e731485)
1ee52b188SYork Sun /*
2ee52b188SYork Sun  * Copyright 2012 Freescale Semiconductor, Inc.
3ee52b188SYork Sun  *
41a459660SWolfgang Denk  * SPDX-License-Identifier:	GPL-2.0+
5ee52b188SYork Sun  */
6ee52b188SYork Sun 
7ee52b188SYork Sun #include <common.h>
8ee52b188SYork Sun #include <command.h>
9ee52b188SYork Sun #include <netdev.h>
10ee52b188SYork Sun #include <asm/mmu.h>
11ee52b188SYork Sun #include <asm/processor.h>
12ee52b188SYork Sun #include <asm/cache.h>
13ee52b188SYork Sun #include <asm/immap_85xx.h>
14ee52b188SYork Sun #include <asm/fsl_law.h>
155614e71bSYork Sun #include <fsl_ddr_sdram.h>
16ee52b188SYork Sun #include <asm/fsl_serdes.h>
17ee52b188SYork Sun #include <asm/fsl_portals.h>
18ee52b188SYork Sun #include <asm/fsl_liodn.h>
19ee52b188SYork Sun #include <malloc.h>
20ee52b188SYork Sun #include <fm_eth.h>
21ee52b188SYork Sun #include <fsl_mdio.h>
22ee52b188SYork Sun #include <miiphy.h>
23ee52b188SYork Sun #include <phy.h>
248225b2fdSShaohui Xie #include <fsl_dtsec.h>
25ee52b188SYork Sun #include <asm/fsl_serdes.h>
269bf499acSShaohui Xie #include <hwconfig.h>
27ee52b188SYork Sun #include "../common/qixis.h"
28ee52b188SYork Sun #include "../common/fman.h"
29ee52b188SYork Sun 
30ee52b188SYork Sun #include "t4240qds_qixis.h"
31ee52b188SYork Sun 
32ee52b188SYork Sun #define EMI_NONE	0xFFFFFFFF
33ee52b188SYork Sun #define EMI1_RGMII	0
34ee52b188SYork Sun #define EMI1_SLOT1	1
35ee52b188SYork Sun #define EMI1_SLOT2	2
36ee52b188SYork Sun #define EMI1_SLOT3	3
37ee52b188SYork Sun #define EMI1_SLOT4	4
38ee52b188SYork Sun #define EMI1_SLOT5	5
39ee52b188SYork Sun #define EMI1_SLOT7	7
4095927808SShengzhou Liu #define EMI2		8
41ee52b188SYork Sun /* Slot6 and Slot8 do not have EMI connections */
42ee52b188SYork Sun 
43ee52b188SYork Sun static int mdio_mux[NUM_FM_PORTS];
44ee52b188SYork Sun 
45ee52b188SYork Sun static const char *mdio_names[] = {
46ee52b188SYork Sun 	"T4240QDS_MDIO0",
47ee52b188SYork Sun 	"T4240QDS_MDIO1",
48ee52b188SYork Sun 	"T4240QDS_MDIO2",
49ee52b188SYork Sun 	"T4240QDS_MDIO3",
50ee52b188SYork Sun 	"T4240QDS_MDIO4",
51ee52b188SYork Sun 	"T4240QDS_MDIO5",
52ee52b188SYork Sun 	"NULL",
53ee52b188SYork Sun 	"T4240QDS_MDIO7",
54ee52b188SYork Sun 	"T4240QDS_10GC",
55ee52b188SYork Sun };
56ee52b188SYork Sun 
57ee52b188SYork Sun static u8 lane_to_slot_fsm1[] = {1, 1, 1, 1, 2, 2, 2, 2};
58ee52b188SYork Sun static u8 lane_to_slot_fsm2[] = {3, 3, 3, 3, 4, 4, 4, 4};
5904bccc3aSShaohui Xie static u8 slot_qsgmii_phyaddr[5][4] = {
6004bccc3aSShaohui Xie 	{0, 0, 0, 0},/* not used, to make index match slot No. */
6104bccc3aSShaohui Xie 	{0, 1, 2, 3},
6204bccc3aSShaohui Xie 	{4, 5, 6, 7},
6304bccc3aSShaohui Xie 	{8, 9, 0xa, 0xb},
6404bccc3aSShaohui Xie 	{0xc, 0xd, 0xe, 0xf},
6504bccc3aSShaohui Xie };
66f63d638dSShaohui Xie static u8 qsgmiiphy_fix[NUM_FM_PORTS] = {0};
67ee52b188SYork Sun 
t4240qds_mdio_name_for_muxval(u8 muxval)68ee52b188SYork Sun static const char *t4240qds_mdio_name_for_muxval(u8 muxval)
69ee52b188SYork Sun {
70ee52b188SYork Sun 	return mdio_names[muxval];
71ee52b188SYork Sun }
72ee52b188SYork Sun 
mii_dev_for_muxval(u8 muxval)73ee52b188SYork Sun struct mii_dev *mii_dev_for_muxval(u8 muxval)
74ee52b188SYork Sun {
75ee52b188SYork Sun 	struct mii_dev *bus;
76ee52b188SYork Sun 	const char *name = t4240qds_mdio_name_for_muxval(muxval);
77ee52b188SYork Sun 
78ee52b188SYork Sun 	if (!name) {
79ee52b188SYork Sun 		printf("No bus for muxval %x\n", muxval);
80ee52b188SYork Sun 		return NULL;
81ee52b188SYork Sun 	}
82ee52b188SYork Sun 
83ee52b188SYork Sun 	bus = miiphy_get_dev_by_name(name);
84ee52b188SYork Sun 
85ee52b188SYork Sun 	if (!bus) {
86ee52b188SYork Sun 		printf("No bus by name %s\n", name);
87ee52b188SYork Sun 		return NULL;
88ee52b188SYork Sun 	}
89ee52b188SYork Sun 
90ee52b188SYork Sun 	return bus;
91ee52b188SYork Sun }
92ee52b188SYork Sun 
93ee52b188SYork Sun struct t4240qds_mdio {
94ee52b188SYork Sun 	u8 muxval;
95ee52b188SYork Sun 	struct mii_dev *realbus;
96ee52b188SYork Sun };
97ee52b188SYork Sun 
t4240qds_mux_mdio(u8 muxval)98ee52b188SYork Sun static void t4240qds_mux_mdio(u8 muxval)
99ee52b188SYork Sun {
100ee52b188SYork Sun 	u8 brdcfg4;
101ee52b188SYork Sun 	if ((muxval < 6) || (muxval == 7)) {
102ee52b188SYork Sun 		brdcfg4 = QIXIS_READ(brdcfg[4]);
103ee52b188SYork Sun 		brdcfg4 &= ~BRDCFG4_EMISEL_MASK;
104ee52b188SYork Sun 		brdcfg4 |= (muxval << BRDCFG4_EMISEL_SHIFT);
105ee52b188SYork Sun 		QIXIS_WRITE(brdcfg[4], brdcfg4);
106ee52b188SYork Sun 	}
107ee52b188SYork Sun }
108ee52b188SYork Sun 
t4240qds_mdio_read(struct mii_dev * bus,int addr,int devad,int regnum)109ee52b188SYork Sun static int t4240qds_mdio_read(struct mii_dev *bus, int addr, int devad,
110ee52b188SYork Sun 				int regnum)
111ee52b188SYork Sun {
112ee52b188SYork Sun 	struct t4240qds_mdio *priv = bus->priv;
113ee52b188SYork Sun 
114ee52b188SYork Sun 	t4240qds_mux_mdio(priv->muxval);
115ee52b188SYork Sun 
116ee52b188SYork Sun 	return priv->realbus->read(priv->realbus, addr, devad, regnum);
117ee52b188SYork Sun }
118ee52b188SYork Sun 
t4240qds_mdio_write(struct mii_dev * bus,int addr,int devad,int regnum,u16 value)119ee52b188SYork Sun static int t4240qds_mdio_write(struct mii_dev *bus, int addr, int devad,
120ee52b188SYork Sun 				int regnum, u16 value)
121ee52b188SYork Sun {
122ee52b188SYork Sun 	struct t4240qds_mdio *priv = bus->priv;
123ee52b188SYork Sun 
124ee52b188SYork Sun 	t4240qds_mux_mdio(priv->muxval);
125ee52b188SYork Sun 
126ee52b188SYork Sun 	return priv->realbus->write(priv->realbus, addr, devad, regnum, value);
127ee52b188SYork Sun }
128ee52b188SYork Sun 
t4240qds_mdio_reset(struct mii_dev * bus)129ee52b188SYork Sun static int t4240qds_mdio_reset(struct mii_dev *bus)
130ee52b188SYork Sun {
131ee52b188SYork Sun 	struct t4240qds_mdio *priv = bus->priv;
132ee52b188SYork Sun 
133ee52b188SYork Sun 	return priv->realbus->reset(priv->realbus);
134ee52b188SYork Sun }
135ee52b188SYork Sun 
t4240qds_mdio_init(char * realbusname,u8 muxval)136ee52b188SYork Sun static int t4240qds_mdio_init(char *realbusname, u8 muxval)
137ee52b188SYork Sun {
138ee52b188SYork Sun 	struct t4240qds_mdio *pmdio;
139ee52b188SYork Sun 	struct mii_dev *bus = mdio_alloc();
140ee52b188SYork Sun 
141ee52b188SYork Sun 	if (!bus) {
142ee52b188SYork Sun 		printf("Failed to allocate T4240QDS MDIO bus\n");
143ee52b188SYork Sun 		return -1;
144ee52b188SYork Sun 	}
145ee52b188SYork Sun 
146ee52b188SYork Sun 	pmdio = malloc(sizeof(*pmdio));
147ee52b188SYork Sun 	if (!pmdio) {
148ee52b188SYork Sun 		printf("Failed to allocate T4240QDS private data\n");
149ee52b188SYork Sun 		free(bus);
150ee52b188SYork Sun 		return -1;
151ee52b188SYork Sun 	}
152ee52b188SYork Sun 
153ee52b188SYork Sun 	bus->read = t4240qds_mdio_read;
154ee52b188SYork Sun 	bus->write = t4240qds_mdio_write;
155ee52b188SYork Sun 	bus->reset = t4240qds_mdio_reset;
156192bc694SBen Whitten 	strcpy(bus->name, t4240qds_mdio_name_for_muxval(muxval));
157ee52b188SYork Sun 
158ee52b188SYork Sun 	pmdio->realbus = miiphy_get_dev_by_name(realbusname);
159ee52b188SYork Sun 
160ee52b188SYork Sun 	if (!pmdio->realbus) {
161ee52b188SYork Sun 		printf("No bus with name %s\n", realbusname);
162ee52b188SYork Sun 		free(bus);
163ee52b188SYork Sun 		free(pmdio);
164ee52b188SYork Sun 		return -1;
165ee52b188SYork Sun 	}
166ee52b188SYork Sun 
167ee52b188SYork Sun 	pmdio->muxval = muxval;
168ee52b188SYork Sun 	bus->priv = pmdio;
169ee52b188SYork Sun 
170ee52b188SYork Sun 	return mdio_register(bus);
171ee52b188SYork Sun }
172ee52b188SYork Sun 
board_ft_fman_fixup_port(void * blob,char * prop,phys_addr_t pa,enum fm_port port,int offset)173ee52b188SYork Sun void board_ft_fman_fixup_port(void *blob, char * prop, phys_addr_t pa,
174ee52b188SYork Sun 				enum fm_port port, int offset)
175ee52b188SYork Sun {
1761c68d01eSShaohui Xie 	int interface = fm_info_get_enet_if(port);
1779bf499acSShaohui Xie 	ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
1789bf499acSShaohui Xie 	u32 prtcl2 = in_be32(&gur->rcwsr[4]) & FSL_CORENET2_RCWSR4_SRDS2_PRTCL;
1799bf499acSShaohui Xie 
1809bf499acSShaohui Xie 	prtcl2 >>= FSL_CORENET2_RCWSR4_SRDS2_PRTCL_SHIFT;
1811c68d01eSShaohui Xie 
1821c68d01eSShaohui Xie 	if (interface == PHY_INTERFACE_MODE_SGMII ||
1831c68d01eSShaohui Xie 	    interface == PHY_INTERFACE_MODE_QSGMII) {
18495927808SShengzhou Liu 		switch (port) {
185f63d638dSShaohui Xie 		case FM1_DTSEC1:
186f63d638dSShaohui Xie 			if (qsgmiiphy_fix[port])
187f63d638dSShaohui Xie 				fdt_set_phy_handle(blob, prop, pa,
188f63d638dSShaohui Xie 						   "sgmii_phy21");
189f63d638dSShaohui Xie 			break;
190f63d638dSShaohui Xie 		case FM1_DTSEC2:
191f63d638dSShaohui Xie 			if (qsgmiiphy_fix[port])
192f63d638dSShaohui Xie 				fdt_set_phy_handle(blob, prop, pa,
193f63d638dSShaohui Xie 						   "sgmii_phy22");
194f63d638dSShaohui Xie 			break;
195f63d638dSShaohui Xie 		case FM1_DTSEC3:
196f63d638dSShaohui Xie 			if (qsgmiiphy_fix[port])
197f63d638dSShaohui Xie 				fdt_set_phy_handle(blob, prop, pa,
198f63d638dSShaohui Xie 						   "sgmii_phy23");
199f63d638dSShaohui Xie 			break;
200f63d638dSShaohui Xie 		case FM1_DTSEC4:
201f63d638dSShaohui Xie 			if (qsgmiiphy_fix[port])
202f63d638dSShaohui Xie 				fdt_set_phy_handle(blob, prop, pa,
203f63d638dSShaohui Xie 						   "sgmii_phy24");
204f63d638dSShaohui Xie 			break;
205f63d638dSShaohui Xie 		case FM1_DTSEC6:
206f63d638dSShaohui Xie 			if (qsgmiiphy_fix[port])
207f63d638dSShaohui Xie 				fdt_set_phy_handle(blob, prop, pa,
208f63d638dSShaohui Xie 						   "sgmii_phy12");
209f63d638dSShaohui Xie 			break;
21095927808SShengzhou Liu 		case FM1_DTSEC9:
211f63d638dSShaohui Xie 			if (qsgmiiphy_fix[port])
212f63d638dSShaohui Xie 				fdt_set_phy_handle(blob, prop, pa,
213f63d638dSShaohui Xie 						   "sgmii_phy14");
214f63d638dSShaohui Xie 			else
215f63d638dSShaohui Xie 				fdt_set_phy_handle(blob, prop, pa,
216f63d638dSShaohui Xie 						   "phy_sgmii4");
21795927808SShengzhou Liu 			break;
21895927808SShengzhou Liu 		case FM1_DTSEC10:
219f63d638dSShaohui Xie 			if (qsgmiiphy_fix[port])
220f63d638dSShaohui Xie 				fdt_set_phy_handle(blob, prop, pa,
221f63d638dSShaohui Xie 						   "sgmii_phy13");
222f63d638dSShaohui Xie 			else
223f63d638dSShaohui Xie 				fdt_set_phy_handle(blob, prop, pa,
224f63d638dSShaohui Xie 						   "phy_sgmii3");
225f63d638dSShaohui Xie 			break;
226f63d638dSShaohui Xie 		case FM2_DTSEC1:
227f63d638dSShaohui Xie 			if (qsgmiiphy_fix[port])
228f63d638dSShaohui Xie 				fdt_set_phy_handle(blob, prop, pa,
229f63d638dSShaohui Xie 						   "sgmii_phy41");
230f63d638dSShaohui Xie 			break;
231f63d638dSShaohui Xie 		case FM2_DTSEC2:
232f63d638dSShaohui Xie 			if (qsgmiiphy_fix[port])
233f63d638dSShaohui Xie 				fdt_set_phy_handle(blob, prop, pa,
234f63d638dSShaohui Xie 						   "sgmii_phy42");
235f63d638dSShaohui Xie 			break;
236f63d638dSShaohui Xie 		case FM2_DTSEC3:
237f63d638dSShaohui Xie 			if (qsgmiiphy_fix[port])
238f63d638dSShaohui Xie 				fdt_set_phy_handle(blob, prop, pa,
239f63d638dSShaohui Xie 						   "sgmii_phy43");
240f63d638dSShaohui Xie 			break;
241f63d638dSShaohui Xie 		case FM2_DTSEC4:
242f63d638dSShaohui Xie 			if (qsgmiiphy_fix[port])
243f63d638dSShaohui Xie 				fdt_set_phy_handle(blob, prop, pa,
244f63d638dSShaohui Xie 						   "sgmii_phy44");
245f63d638dSShaohui Xie 			break;
246f63d638dSShaohui Xie 		case FM2_DTSEC6:
247f63d638dSShaohui Xie 			if (qsgmiiphy_fix[port])
248f63d638dSShaohui Xie 				fdt_set_phy_handle(blob, prop, pa,
249f63d638dSShaohui Xie 						   "sgmii_phy32");
25095927808SShengzhou Liu 			break;
25195927808SShengzhou Liu 		case FM2_DTSEC9:
252f63d638dSShaohui Xie 			if (qsgmiiphy_fix[port])
253f63d638dSShaohui Xie 				fdt_set_phy_handle(blob, prop, pa,
254f63d638dSShaohui Xie 						   "sgmii_phy34");
255f63d638dSShaohui Xie 			else
256f63d638dSShaohui Xie 				fdt_set_phy_handle(blob, prop, pa,
257f63d638dSShaohui Xie 						   "phy_sgmii12");
25895927808SShengzhou Liu 			break;
25995927808SShengzhou Liu 		case FM2_DTSEC10:
260f63d638dSShaohui Xie 			if (qsgmiiphy_fix[port])
261f63d638dSShaohui Xie 				fdt_set_phy_handle(blob, prop, pa,
262f63d638dSShaohui Xie 						   "sgmii_phy33");
263f63d638dSShaohui Xie 			else
264f63d638dSShaohui Xie 				fdt_set_phy_handle(blob, prop, pa,
265f63d638dSShaohui Xie 						   "phy_sgmii11");
26695927808SShengzhou Liu 			break;
26795927808SShengzhou Liu 		default:
26895927808SShengzhou Liu 			break;
26995927808SShengzhou Liu 		}
2709bf499acSShaohui Xie 	} else if (interface == PHY_INTERFACE_MODE_XGMII &&
2719bf499acSShaohui Xie 		  ((prtcl2 == 55) || (prtcl2 == 57))) {
2729bf499acSShaohui Xie 		/*
2739bf499acSShaohui Xie 		 * if the 10G is XFI, check hwconfig to see what is the
2749bf499acSShaohui Xie 		 * media type, there are two types, fiber or copper,
2759bf499acSShaohui Xie 		 * fix the dtb accordingly.
2769bf499acSShaohui Xie 		 */
2779bf499acSShaohui Xie 		int media_type = 0;
2789bf499acSShaohui Xie 		struct fixed_link f_link;
2799bf499acSShaohui Xie 		char lane_mode[20] = {"10GBASE-KR"};
2809bf499acSShaohui Xie 		char buf[32] = "serdes-2,";
2819bf499acSShaohui Xie 		int off;
2829bf499acSShaohui Xie 
2839bf499acSShaohui Xie 		switch (port) {
2849bf499acSShaohui Xie 		case FM1_10GEC1:
2859bf499acSShaohui Xie 			if (hwconfig_sub("fsl_10gkr_copper", "fm1_10g1")) {
2869bf499acSShaohui Xie 				media_type = 1;
2879bf499acSShaohui Xie 				fdt_set_phy_handle(blob, prop, pa,
2889bf499acSShaohui Xie 						   "phy_xfi1");
2899bf499acSShaohui Xie 				sprintf(buf, "%s%s%s", buf, "lane-a,",
2909bf499acSShaohui Xie 					(char *)lane_mode);
2919bf499acSShaohui Xie 			}
2929bf499acSShaohui Xie 			break;
2939bf499acSShaohui Xie 		case FM1_10GEC2:
2949bf499acSShaohui Xie 			if (hwconfig_sub("fsl_10gkr_copper", "fm1_10g2")) {
2959bf499acSShaohui Xie 				media_type = 1;
2969bf499acSShaohui Xie 				fdt_set_phy_handle(blob, prop, pa,
2979bf499acSShaohui Xie 						   "phy_xfi2");
2989bf499acSShaohui Xie 				sprintf(buf, "%s%s%s", buf, "lane-b,",
2999bf499acSShaohui Xie 					(char *)lane_mode);
3009bf499acSShaohui Xie 			}
3019bf499acSShaohui Xie 			break;
3029bf499acSShaohui Xie 		case FM2_10GEC1:
3039bf499acSShaohui Xie 			if (hwconfig_sub("fsl_10gkr_copper", "fm2_10g1")) {
3049bf499acSShaohui Xie 				media_type = 1;
3059bf499acSShaohui Xie 				fdt_set_phy_handle(blob, prop, pa,
3069bf499acSShaohui Xie 						   "phy_xfi3");
3079bf499acSShaohui Xie 				sprintf(buf, "%s%s%s", buf, "lane-d,",
3089bf499acSShaohui Xie 					(char *)lane_mode);
3099bf499acSShaohui Xie 			}
3109bf499acSShaohui Xie 			break;
3119bf499acSShaohui Xie 		case FM2_10GEC2:
3129bf499acSShaohui Xie 			if (hwconfig_sub("fsl_10gkr_copper", "fm2_10g2")) {
3139bf499acSShaohui Xie 				media_type = 1;
3149bf499acSShaohui Xie 				fdt_set_phy_handle(blob, prop, pa,
3159bf499acSShaohui Xie 						   "phy_xfi4");
3169bf499acSShaohui Xie 				sprintf(buf, "%s%s%s", buf, "lane-c,",
3179bf499acSShaohui Xie 					(char *)lane_mode);
3189bf499acSShaohui Xie 			}
3199bf499acSShaohui Xie 			break;
3209bf499acSShaohui Xie 		default:
3219bf499acSShaohui Xie 			return;
3229bf499acSShaohui Xie 		}
3239bf499acSShaohui Xie 
3249bf499acSShaohui Xie 		if (!media_type) {
3259bf499acSShaohui Xie 			/* fixed-link is used for XFI fiber cable */
3269bf499acSShaohui Xie 			fdt_delprop(blob, offset, "phy-handle");
3279bf499acSShaohui Xie 			f_link.phy_id = port;
3289bf499acSShaohui Xie 			f_link.duplex = 1;
3299bf499acSShaohui Xie 			f_link.link_speed = 10000;
3309bf499acSShaohui Xie 			f_link.pause = 0;
3319bf499acSShaohui Xie 			f_link.asym_pause = 0;
3329bf499acSShaohui Xie 			fdt_setprop(blob, offset, "fixed-link", &f_link,
3339bf499acSShaohui Xie 				    sizeof(f_link));
3349bf499acSShaohui Xie 		} else {
3359bf499acSShaohui Xie 			/* set property for copper cable */
3369bf499acSShaohui Xie 			off = fdt_node_offset_by_compat_reg(blob,
3379bf499acSShaohui Xie 					"fsl,fman-memac-mdio", pa + 0x1000);
3389bf499acSShaohui Xie 			fdt_setprop_string(blob, off, "lane-instance", buf);
3399bf499acSShaohui Xie 		}
34095927808SShengzhou Liu 	}
341ee52b188SYork Sun }
342ee52b188SYork Sun 
fdt_fixup_board_enet(void * fdt)343ee52b188SYork Sun void fdt_fixup_board_enet(void *fdt)
344ee52b188SYork Sun {
34595927808SShengzhou Liu 	int i;
34695927808SShengzhou Liu 	ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
34795927808SShengzhou Liu 	u32 prtcl2 = in_be32(&gur->rcwsr[4]) & FSL_CORENET2_RCWSR4_SRDS2_PRTCL;
34895927808SShengzhou Liu 
34995927808SShengzhou Liu 	prtcl2 >>= FSL_CORENET2_RCWSR4_SRDS2_PRTCL_SHIFT;
35095927808SShengzhou Liu 	for (i = FM1_DTSEC1; i < NUM_FM_PORTS; i++) {
35195927808SShengzhou Liu 		switch (fm_info_get_enet_if(i)) {
35295927808SShengzhou Liu 		case PHY_INTERFACE_MODE_SGMII:
3531c68d01eSShaohui Xie 		case PHY_INTERFACE_MODE_QSGMII:
35495927808SShengzhou Liu 			switch (mdio_mux[i]) {
35595927808SShengzhou Liu 			case EMI1_SLOT1:
35695927808SShengzhou Liu 				fdt_status_okay_by_alias(fdt, "emi1_slot1");
35795927808SShengzhou Liu 				break;
35895927808SShengzhou Liu 			case EMI1_SLOT2:
35995927808SShengzhou Liu 				fdt_status_okay_by_alias(fdt, "emi1_slot2");
36095927808SShengzhou Liu 				break;
36195927808SShengzhou Liu 			case EMI1_SLOT3:
36295927808SShengzhou Liu 				fdt_status_okay_by_alias(fdt, "emi1_slot3");
36395927808SShengzhou Liu 				break;
36495927808SShengzhou Liu 			case EMI1_SLOT4:
36595927808SShengzhou Liu 				fdt_status_okay_by_alias(fdt, "emi1_slot4");
36695927808SShengzhou Liu 				break;
36795927808SShengzhou Liu 			default:
36895927808SShengzhou Liu 				break;
36995927808SShengzhou Liu 			}
37095927808SShengzhou Liu 			break;
37195927808SShengzhou Liu 		case PHY_INTERFACE_MODE_XGMII:
37295927808SShengzhou Liu 			/* check if it's XFI interface for 10g */
3739bf499acSShaohui Xie 			if ((prtcl2 == 55) || (prtcl2 == 57)) {
3749bf499acSShaohui Xie 				if (i == FM1_10GEC1 && hwconfig_sub(
3759bf499acSShaohui Xie 					"fsl_10gkr_copper", "fm1_10g1"))
3769bf499acSShaohui Xie 					fdt_status_okay_by_alias(
3779bf499acSShaohui Xie 					fdt, "xfi_pcs_mdio1");
3789bf499acSShaohui Xie 				if (i == FM1_10GEC2 && hwconfig_sub(
3799bf499acSShaohui Xie 					"fsl_10gkr_copper", "fm1_10g2"))
3809bf499acSShaohui Xie 					fdt_status_okay_by_alias(
3819bf499acSShaohui Xie 					fdt, "xfi_pcs_mdio2");
3829bf499acSShaohui Xie 				if (i == FM2_10GEC1 && hwconfig_sub(
3839bf499acSShaohui Xie 					"fsl_10gkr_copper", "fm2_10g1"))
3849bf499acSShaohui Xie 					fdt_status_okay_by_alias(
3859bf499acSShaohui Xie 					fdt, "xfi_pcs_mdio3");
3869bf499acSShaohui Xie 				if (i == FM2_10GEC2 && hwconfig_sub(
3879bf499acSShaohui Xie 					"fsl_10gkr_copper", "fm2_10g2"))
3889bf499acSShaohui Xie 					fdt_status_okay_by_alias(
3899bf499acSShaohui Xie 					fdt, "xfi_pcs_mdio4");
39095927808SShengzhou Liu 				break;
39195927808SShengzhou Liu 			}
39295927808SShengzhou Liu 			switch (i) {
39395927808SShengzhou Liu 			case FM1_10GEC1:
39495927808SShengzhou Liu 				fdt_status_okay_by_alias(fdt, "emi2_xauislot1");
39595927808SShengzhou Liu 				break;
39695927808SShengzhou Liu 			case FM1_10GEC2:
39795927808SShengzhou Liu 				fdt_status_okay_by_alias(fdt, "emi2_xauislot2");
39895927808SShengzhou Liu 				break;
39995927808SShengzhou Liu 			case FM2_10GEC1:
40095927808SShengzhou Liu 				fdt_status_okay_by_alias(fdt, "emi2_xauislot3");
40195927808SShengzhou Liu 				break;
40295927808SShengzhou Liu 			case FM2_10GEC2:
40395927808SShengzhou Liu 				fdt_status_okay_by_alias(fdt, "emi2_xauislot4");
40495927808SShengzhou Liu 				break;
40595927808SShengzhou Liu 			default:
40695927808SShengzhou Liu 				break;
40795927808SShengzhou Liu 			}
40895927808SShengzhou Liu 			break;
40995927808SShengzhou Liu 		default:
41095927808SShengzhou Liu 			break;
41195927808SShengzhou Liu 		}
41295927808SShengzhou Liu 	}
413ee52b188SYork Sun }
414ee52b188SYork Sun 
initialize_qsgmiiphy_fix(void)415f63d638dSShaohui Xie static void initialize_qsgmiiphy_fix(void)
416f63d638dSShaohui Xie {
417f63d638dSShaohui Xie 	int i;
418f63d638dSShaohui Xie 	unsigned short reg;
419f63d638dSShaohui Xie 
420f63d638dSShaohui Xie 	for (i = 1; i <= 4; i++) {
421f63d638dSShaohui Xie 		/*
422f63d638dSShaohui Xie 		 * Try to read if a SGMII card is used, we do it slot by slot.
423f63d638dSShaohui Xie 		 * if a SGMII PHY address is valid on a slot, then we mark
424f63d638dSShaohui Xie 		 * all ports on the slot, then fix the PHY address for the
425f63d638dSShaohui Xie 		 * marked port when doing dtb fixup.
426f63d638dSShaohui Xie 		 */
427f63d638dSShaohui Xie 		if (miiphy_read(mdio_names[i],
428f63d638dSShaohui Xie 				SGMII_CARD_PORT1_PHY_ADDR, MII_PHYSID2, &reg) != 0) {
429f63d638dSShaohui Xie 			debug("Slot%d PHY ID register 2 read failed\n", i);
430f63d638dSShaohui Xie 			continue;
431f63d638dSShaohui Xie 		}
432f63d638dSShaohui Xie 
433f63d638dSShaohui Xie 		debug("Slot%d MII_PHYSID2 @ 0x1c= 0x%04x\n", i, reg);
434f63d638dSShaohui Xie 
435f63d638dSShaohui Xie 		if (reg == 0xFFFF) {
436f63d638dSShaohui Xie 			/* No physical device present at this address */
437f63d638dSShaohui Xie 			continue;
438f63d638dSShaohui Xie 		}
439f63d638dSShaohui Xie 
440f63d638dSShaohui Xie 		switch (i) {
441f63d638dSShaohui Xie 		case 1:
442f63d638dSShaohui Xie 			qsgmiiphy_fix[FM1_DTSEC5] = 1;
443f63d638dSShaohui Xie 			qsgmiiphy_fix[FM1_DTSEC6] = 1;
444f63d638dSShaohui Xie 			qsgmiiphy_fix[FM1_DTSEC9] = 1;
445f63d638dSShaohui Xie 			qsgmiiphy_fix[FM1_DTSEC10] = 1;
446037e19b8SShengzhou Liu 			slot_qsgmii_phyaddr[1][0] =  SGMII_CARD_PORT1_PHY_ADDR;
447037e19b8SShengzhou Liu 			slot_qsgmii_phyaddr[1][1] =  SGMII_CARD_PORT2_PHY_ADDR;
448037e19b8SShengzhou Liu 			slot_qsgmii_phyaddr[1][2] =  SGMII_CARD_PORT3_PHY_ADDR;
449037e19b8SShengzhou Liu 			slot_qsgmii_phyaddr[1][3] =  SGMII_CARD_PORT4_PHY_ADDR;
450f63d638dSShaohui Xie 			break;
451f63d638dSShaohui Xie 		case 2:
452f63d638dSShaohui Xie 			qsgmiiphy_fix[FM1_DTSEC1] = 1;
453f63d638dSShaohui Xie 			qsgmiiphy_fix[FM1_DTSEC2] = 1;
454f63d638dSShaohui Xie 			qsgmiiphy_fix[FM1_DTSEC3] = 1;
455f63d638dSShaohui Xie 			qsgmiiphy_fix[FM1_DTSEC4] = 1;
456037e19b8SShengzhou Liu 			slot_qsgmii_phyaddr[2][0] =  SGMII_CARD_PORT1_PHY_ADDR;
457037e19b8SShengzhou Liu 			slot_qsgmii_phyaddr[2][1] =  SGMII_CARD_PORT2_PHY_ADDR;
458037e19b8SShengzhou Liu 			slot_qsgmii_phyaddr[2][2] =  SGMII_CARD_PORT3_PHY_ADDR;
459037e19b8SShengzhou Liu 			slot_qsgmii_phyaddr[2][3] =  SGMII_CARD_PORT4_PHY_ADDR;
460f63d638dSShaohui Xie 			break;
461f63d638dSShaohui Xie 		case 3:
462f63d638dSShaohui Xie 			qsgmiiphy_fix[FM2_DTSEC5] = 1;
463f63d638dSShaohui Xie 			qsgmiiphy_fix[FM2_DTSEC6] = 1;
464f63d638dSShaohui Xie 			qsgmiiphy_fix[FM2_DTSEC9] = 1;
465f63d638dSShaohui Xie 			qsgmiiphy_fix[FM2_DTSEC10] = 1;
466037e19b8SShengzhou Liu 			slot_qsgmii_phyaddr[3][0] =  SGMII_CARD_PORT1_PHY_ADDR;
467037e19b8SShengzhou Liu 			slot_qsgmii_phyaddr[3][1] =  SGMII_CARD_PORT2_PHY_ADDR;
468037e19b8SShengzhou Liu 			slot_qsgmii_phyaddr[3][2] =  SGMII_CARD_PORT3_PHY_ADDR;
469037e19b8SShengzhou Liu 			slot_qsgmii_phyaddr[3][3] =  SGMII_CARD_PORT4_PHY_ADDR;
470f63d638dSShaohui Xie 			break;
471f63d638dSShaohui Xie 		case 4:
472f63d638dSShaohui Xie 			qsgmiiphy_fix[FM2_DTSEC1] = 1;
473f63d638dSShaohui Xie 			qsgmiiphy_fix[FM2_DTSEC2] = 1;
474f63d638dSShaohui Xie 			qsgmiiphy_fix[FM2_DTSEC3] = 1;
475f63d638dSShaohui Xie 			qsgmiiphy_fix[FM2_DTSEC4] = 1;
476037e19b8SShengzhou Liu 			slot_qsgmii_phyaddr[4][0] =  SGMII_CARD_PORT1_PHY_ADDR;
477037e19b8SShengzhou Liu 			slot_qsgmii_phyaddr[4][1] =  SGMII_CARD_PORT2_PHY_ADDR;
478037e19b8SShengzhou Liu 			slot_qsgmii_phyaddr[4][2] =  SGMII_CARD_PORT3_PHY_ADDR;
479037e19b8SShengzhou Liu 			slot_qsgmii_phyaddr[4][3] =  SGMII_CARD_PORT4_PHY_ADDR;
480f63d638dSShaohui Xie 			break;
481f63d638dSShaohui Xie 		default:
482f63d638dSShaohui Xie 			break;
483f63d638dSShaohui Xie 		}
484f63d638dSShaohui Xie 	}
485f63d638dSShaohui Xie }
486f63d638dSShaohui Xie 
board_eth_init(bd_t * bis)487ee52b188SYork Sun int board_eth_init(bd_t *bis)
488ee52b188SYork Sun {
489ee52b188SYork Sun #if defined(CONFIG_FMAN_ENET)
4901c68d01eSShaohui Xie 	int i, idx, lane, slot, interface;
491ee52b188SYork Sun 	struct memac_mdio_info dtsec_mdio_info;
492ee52b188SYork Sun 	struct memac_mdio_info tgec_mdio_info;
493ee52b188SYork Sun 	ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
494ee52b188SYork Sun 	u32 srds_prtcl_s1, srds_prtcl_s2;
495ee52b188SYork Sun 
496ee52b188SYork Sun 	srds_prtcl_s1 = in_be32(&gur->rcwsr[4]) &
497ee52b188SYork Sun 					FSL_CORENET2_RCWSR4_SRDS1_PRTCL;
498ee52b188SYork Sun 	srds_prtcl_s1 >>= FSL_CORENET2_RCWSR4_SRDS1_PRTCL_SHIFT;
499ee52b188SYork Sun 	srds_prtcl_s2 = in_be32(&gur->rcwsr[4]) &
500ee52b188SYork Sun 					FSL_CORENET2_RCWSR4_SRDS2_PRTCL;
501ee52b188SYork Sun 	srds_prtcl_s2 >>= FSL_CORENET2_RCWSR4_SRDS2_PRTCL_SHIFT;
502ee52b188SYork Sun 
503ee52b188SYork Sun 	/* Initialize the mdio_mux array so we can recognize empty elements */
504ee52b188SYork Sun 	for (i = 0; i < NUM_FM_PORTS; i++)
505ee52b188SYork Sun 		mdio_mux[i] = EMI_NONE;
506ee52b188SYork Sun 
507ee52b188SYork Sun 	dtsec_mdio_info.regs =
508ee52b188SYork Sun 		(struct memac_mdio_controller *)CONFIG_SYS_FM2_DTSEC_MDIO_ADDR;
509ee52b188SYork Sun 
510ee52b188SYork Sun 	dtsec_mdio_info.name = DEFAULT_FM_MDIO_NAME;
511ee52b188SYork Sun 
512ee52b188SYork Sun 	/* Register the 1G MDIO bus */
513ee52b188SYork Sun 	fm_memac_mdio_init(bis, &dtsec_mdio_info);
514ee52b188SYork Sun 
515ee52b188SYork Sun 	tgec_mdio_info.regs =
516ee52b188SYork Sun 		(struct memac_mdio_controller *)CONFIG_SYS_FM2_TGEC_MDIO_ADDR;
517ee52b188SYork Sun 	tgec_mdio_info.name = DEFAULT_FM_TGEC_MDIO_NAME;
518ee52b188SYork Sun 
519ee52b188SYork Sun 	/* Register the 10G MDIO bus */
520ee52b188SYork Sun 	fm_memac_mdio_init(bis, &tgec_mdio_info);
521ee52b188SYork Sun 
522ee52b188SYork Sun 	/* Register the muxing front-ends to the MDIO buses */
523ee52b188SYork Sun 	t4240qds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_RGMII);
524ee52b188SYork Sun 	t4240qds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT1);
525ee52b188SYork Sun 	t4240qds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT2);
526ee52b188SYork Sun 	t4240qds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT3);
527ee52b188SYork Sun 	t4240qds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT4);
528ee52b188SYork Sun 	t4240qds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT5);
529ee52b188SYork Sun 	t4240qds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT7);
530ee52b188SYork Sun 	t4240qds_mdio_init(DEFAULT_FM_TGEC_MDIO_NAME, EMI2);
531ee52b188SYork Sun 
532037e19b8SShengzhou Liu 	initialize_qsgmiiphy_fix();
533ee52b188SYork Sun 
534ee52b188SYork Sun 	switch (srds_prtcl_s1) {
535ee52b188SYork Sun 	case 1:
536ee52b188SYork Sun 	case 2:
537ee52b188SYork Sun 	case 4:
538ee52b188SYork Sun 		/* XAUI/HiGig in Slot1 and Slot2 */
539ee52b188SYork Sun 		fm_info_set_phy_address(FM1_10GEC1, FM1_10GEC1_PHY_ADDR);
540ee52b188SYork Sun 		fm_info_set_phy_address(FM1_10GEC2, FM1_10GEC2_PHY_ADDR);
541ee52b188SYork Sun 		break;
54294752f60SShaohui Xie 	case 27:
543ee52b188SYork Sun 	case 28:
54494752f60SShaohui Xie 	case 35:
545ee52b188SYork Sun 	case 36:
546ee52b188SYork Sun 		/* SGMII in Slot1 and Slot2 */
54704bccc3aSShaohui Xie 		fm_info_set_phy_address(FM1_DTSEC1, slot_qsgmii_phyaddr[2][0]);
54804bccc3aSShaohui Xie 		fm_info_set_phy_address(FM1_DTSEC2, slot_qsgmii_phyaddr[2][1]);
54904bccc3aSShaohui Xie 		fm_info_set_phy_address(FM1_DTSEC3, slot_qsgmii_phyaddr[2][2]);
55004bccc3aSShaohui Xie 		fm_info_set_phy_address(FM1_DTSEC4, slot_qsgmii_phyaddr[2][3]);
55104bccc3aSShaohui Xie 		fm_info_set_phy_address(FM1_DTSEC5, slot_qsgmii_phyaddr[1][0]);
55204bccc3aSShaohui Xie 		fm_info_set_phy_address(FM1_DTSEC6, slot_qsgmii_phyaddr[1][1]);
5539bf499acSShaohui Xie 		if ((srds_prtcl_s2 != 55) && (srds_prtcl_s2 != 57)) {
554ee52b188SYork Sun 			fm_info_set_phy_address(FM1_DTSEC9,
55504bccc3aSShaohui Xie 						slot_qsgmii_phyaddr[1][3]);
556ee52b188SYork Sun 			fm_info_set_phy_address(FM1_DTSEC10,
55704bccc3aSShaohui Xie 						slot_qsgmii_phyaddr[1][2]);
558ee52b188SYork Sun 		}
559ee52b188SYork Sun 		break;
56094752f60SShaohui Xie 	case 37:
561ee52b188SYork Sun 	case 38:
56204bccc3aSShaohui Xie 		fm_info_set_phy_address(FM1_DTSEC1, slot_qsgmii_phyaddr[2][0]);
56304bccc3aSShaohui Xie 		fm_info_set_phy_address(FM1_DTSEC2, slot_qsgmii_phyaddr[2][1]);
56404bccc3aSShaohui Xie 		fm_info_set_phy_address(FM1_DTSEC3, slot_qsgmii_phyaddr[2][2]);
56504bccc3aSShaohui Xie 		fm_info_set_phy_address(FM1_DTSEC4, slot_qsgmii_phyaddr[2][3]);
56604bccc3aSShaohui Xie 		fm_info_set_phy_address(FM1_DTSEC5, slot_qsgmii_phyaddr[1][0]);
56704bccc3aSShaohui Xie 		fm_info_set_phy_address(FM1_DTSEC6, slot_qsgmii_phyaddr[1][1]);
5689bf499acSShaohui Xie 		if ((srds_prtcl_s2 != 55) && (srds_prtcl_s2 != 57)) {
569ee52b188SYork Sun 			fm_info_set_phy_address(FM1_DTSEC9,
57004bccc3aSShaohui Xie 						slot_qsgmii_phyaddr[1][2]);
5711c68d01eSShaohui Xie 			fm_info_set_phy_address(FM1_DTSEC10,
5721c68d01eSShaohui Xie 						slot_qsgmii_phyaddr[1][3]);
573ee52b188SYork Sun 		}
574ee52b188SYork Sun 		break;
57594752f60SShaohui Xie 	case 39:
576ee52b188SYork Sun 	case 40:
57794752f60SShaohui Xie 	case 45:
578ee52b188SYork Sun 	case 46:
57994752f60SShaohui Xie 	case 47:
580ee52b188SYork Sun 	case 48:
58104bccc3aSShaohui Xie 		fm_info_set_phy_address(FM1_DTSEC5, slot_qsgmii_phyaddr[1][0]);
58204bccc3aSShaohui Xie 		fm_info_set_phy_address(FM1_DTSEC6, slot_qsgmii_phyaddr[1][1]);
5839bf499acSShaohui Xie 		if ((srds_prtcl_s2 != 55) && (srds_prtcl_s2 != 57)) {
584ee52b188SYork Sun 			fm_info_set_phy_address(FM1_DTSEC10,
58504bccc3aSShaohui Xie 						slot_qsgmii_phyaddr[1][2]);
5861c68d01eSShaohui Xie 			fm_info_set_phy_address(FM1_DTSEC9,
5871c68d01eSShaohui Xie 						slot_qsgmii_phyaddr[1][3]);
588ee52b188SYork Sun 		}
58904bccc3aSShaohui Xie 		fm_info_set_phy_address(FM1_DTSEC1, slot_qsgmii_phyaddr[2][0]);
59004bccc3aSShaohui Xie 		fm_info_set_phy_address(FM1_DTSEC2, slot_qsgmii_phyaddr[2][1]);
59104bccc3aSShaohui Xie 		fm_info_set_phy_address(FM1_DTSEC3, slot_qsgmii_phyaddr[2][2]);
59204bccc3aSShaohui Xie 		fm_info_set_phy_address(FM1_DTSEC4, slot_qsgmii_phyaddr[2][3]);
593ee52b188SYork Sun 		break;
594ee52b188SYork Sun 	default:
595ee52b188SYork Sun 		puts("Invalid SerDes1 protocol for T4240QDS\n");
596ee52b188SYork Sun 		break;
597ee52b188SYork Sun 	}
598ee52b188SYork Sun 
599ee52b188SYork Sun 	for (i = FM1_DTSEC1; i < FM1_DTSEC1 + CONFIG_SYS_NUM_FM1_DTSEC; i++) {
60095927808SShengzhou Liu 		idx = i - FM1_DTSEC1;
6011c68d01eSShaohui Xie 		interface = fm_info_get_enet_if(i);
6021c68d01eSShaohui Xie 		switch (interface) {
603ee52b188SYork Sun 		case PHY_INTERFACE_MODE_SGMII:
6041c68d01eSShaohui Xie 		case PHY_INTERFACE_MODE_QSGMII:
6051c68d01eSShaohui Xie 			if (interface == PHY_INTERFACE_MODE_QSGMII) {
6061c68d01eSShaohui Xie 				if (idx <= 3)
6071c68d01eSShaohui Xie 					lane = serdes_get_first_lane(FSL_SRDS_1,
6081c68d01eSShaohui Xie 							QSGMII_FM1_A);
6091c68d01eSShaohui Xie 				else
6101c68d01eSShaohui Xie 					lane = serdes_get_first_lane(FSL_SRDS_1,
6111c68d01eSShaohui Xie 							QSGMII_FM1_B);
6121c68d01eSShaohui Xie 				if (lane < 0)
6131c68d01eSShaohui Xie 					break;
6141c68d01eSShaohui Xie 				slot = lane_to_slot_fsm1[lane];
6151c68d01eSShaohui Xie 				debug("FM1@DTSEC%u expects QSGMII in slot %u\n",
6161c68d01eSShaohui Xie 				      idx + 1, slot);
6171c68d01eSShaohui Xie 			} else {
618ee52b188SYork Sun 				lane = serdes_get_first_lane(FSL_SRDS_1,
619ee52b188SYork Sun 						SGMII_FM1_DTSEC1 + idx);
620ee52b188SYork Sun 				if (lane < 0)
621ee52b188SYork Sun 					break;
622ee52b188SYork Sun 				slot = lane_to_slot_fsm1[lane];
623ee52b188SYork Sun 				debug("FM1@DTSEC%u expects SGMII in slot %u\n",
624ee52b188SYork Sun 				      idx + 1, slot);
6251c68d01eSShaohui Xie 			}
626ee52b188SYork Sun 			if (QIXIS_READ(present2) & (1 << (slot - 1)))
627ee52b188SYork Sun 				fm_disable_port(i);
628ee52b188SYork Sun 			switch (slot) {
629ee52b188SYork Sun 			case 1:
630ee52b188SYork Sun 				mdio_mux[i] = EMI1_SLOT1;
631ee52b188SYork Sun 				fm_info_set_mdio(i,
632ee52b188SYork Sun 					mii_dev_for_muxval(mdio_mux[i]));
633ee52b188SYork Sun 				break;
634ee52b188SYork Sun 			case 2:
635ee52b188SYork Sun 				mdio_mux[i] = EMI1_SLOT2;
636ee52b188SYork Sun 				fm_info_set_mdio(i,
637ee52b188SYork Sun 					mii_dev_for_muxval(mdio_mux[i]));
638ee52b188SYork Sun 				break;
639ee52b188SYork Sun 			};
640ee52b188SYork Sun 			break;
641ee52b188SYork Sun 		case PHY_INTERFACE_MODE_RGMII:
642ee52b188SYork Sun 			/* FM1 DTSEC5 routes to RGMII with EC2 */
643ee52b188SYork Sun 			debug("FM1@DTSEC%u is RGMII at address %u\n",
644ee52b188SYork Sun 				idx + 1, 2);
645ee52b188SYork Sun 			if (i == FM1_DTSEC5)
646ee52b188SYork Sun 				fm_info_set_phy_address(i, 2);
647ee52b188SYork Sun 			mdio_mux[i] = EMI1_RGMII;
648ee52b188SYork Sun 			fm_info_set_mdio(i,
649ee52b188SYork Sun 				mii_dev_for_muxval(mdio_mux[i]));
650ee52b188SYork Sun 			break;
651ee52b188SYork Sun 		default:
652ee52b188SYork Sun 			break;
653ee52b188SYork Sun 		}
654ee52b188SYork Sun 	}
655ee52b188SYork Sun 
656ee52b188SYork Sun 	for (i = FM1_10GEC1; i < FM1_10GEC1 + CONFIG_SYS_NUM_FM1_10GEC; i++) {
65795927808SShengzhou Liu 		idx = i - FM1_10GEC1;
658ee52b188SYork Sun 		switch (fm_info_get_enet_if(i)) {
659ee52b188SYork Sun 		case PHY_INTERFACE_MODE_XGMII:
6609bf499acSShaohui Xie 			if ((srds_prtcl_s2 == 55) || (srds_prtcl_s2 == 57)) {
661*a187559eSBin Meng 				/* A fake PHY address to make U-Boot happy */
6629bf499acSShaohui Xie 				fm_info_set_phy_address(i, i);
6639bf499acSShaohui Xie 			} else {
66495927808SShengzhou Liu 				lane = serdes_get_first_lane(FSL_SRDS_1,
66595927808SShengzhou Liu 						XAUI_FM1_MAC9 + idx);
66695927808SShengzhou Liu 				if (lane < 0)
66795927808SShengzhou Liu 					break;
66895927808SShengzhou Liu 				slot = lane_to_slot_fsm1[lane];
66995927808SShengzhou Liu 				if (QIXIS_READ(present2) & (1 << (slot - 1)))
67095927808SShengzhou Liu 					fm_disable_port(i);
6719bf499acSShaohui Xie 			}
672ee52b188SYork Sun 			mdio_mux[i] = EMI2;
673ee52b188SYork Sun 			fm_info_set_mdio(i, mii_dev_for_muxval(mdio_mux[i]));
674ee52b188SYork Sun 			break;
675ee52b188SYork Sun 		default:
676ee52b188SYork Sun 			break;
677ee52b188SYork Sun 		}
678ee52b188SYork Sun 	}
679ee52b188SYork Sun 
680ee52b188SYork Sun #if (CONFIG_SYS_NUM_FMAN == 2)
681ee52b188SYork Sun 	switch (srds_prtcl_s2) {
682ee52b188SYork Sun 	case 1:
683ee52b188SYork Sun 	case 2:
684ee52b188SYork Sun 	case 4:
685ee52b188SYork Sun 		/* XAUI/HiGig in Slot3 and Slot4 */
686ee52b188SYork Sun 		fm_info_set_phy_address(FM2_10GEC1, FM2_10GEC1_PHY_ADDR);
687ee52b188SYork Sun 		fm_info_set_phy_address(FM2_10GEC2, FM2_10GEC2_PHY_ADDR);
688ee52b188SYork Sun 		break;
68994752f60SShaohui Xie 	case 6:
690ee52b188SYork Sun 	case 7:
69194752f60SShaohui Xie 	case 12:
692ee52b188SYork Sun 	case 13:
693ee52b188SYork Sun 	case 14:
69494752f60SShaohui Xie 	case 15:
695ee52b188SYork Sun 	case 16:
69694752f60SShaohui Xie 	case 21:
697ee52b188SYork Sun 	case 22:
698ee52b188SYork Sun 	case 23:
69994752f60SShaohui Xie 	case 24:
700ee52b188SYork Sun 	case 25:
701ee52b188SYork Sun 	case 26:
702ee52b188SYork Sun 		/* XAUI/HiGig in Slot3, SGMII in Slot4 */
703ee52b188SYork Sun 		fm_info_set_phy_address(FM2_10GEC1, FM2_10GEC1_PHY_ADDR);
70404bccc3aSShaohui Xie 		fm_info_set_phy_address(FM2_DTSEC1, slot_qsgmii_phyaddr[4][0]);
70504bccc3aSShaohui Xie 		fm_info_set_phy_address(FM2_DTSEC2, slot_qsgmii_phyaddr[4][1]);
70604bccc3aSShaohui Xie 		fm_info_set_phy_address(FM2_DTSEC3, slot_qsgmii_phyaddr[4][2]);
70704bccc3aSShaohui Xie 		fm_info_set_phy_address(FM2_DTSEC4, slot_qsgmii_phyaddr[4][3]);
708ee52b188SYork Sun 		break;
70994752f60SShaohui Xie 	case 27:
710ee52b188SYork Sun 	case 28:
71194752f60SShaohui Xie 	case 35:
712ee52b188SYork Sun 	case 36:
713ee52b188SYork Sun 		/* SGMII in Slot3 and Slot4 */
71404bccc3aSShaohui Xie 		fm_info_set_phy_address(FM2_DTSEC1, slot_qsgmii_phyaddr[4][0]);
71504bccc3aSShaohui Xie 		fm_info_set_phy_address(FM2_DTSEC2, slot_qsgmii_phyaddr[4][1]);
71604bccc3aSShaohui Xie 		fm_info_set_phy_address(FM2_DTSEC3, slot_qsgmii_phyaddr[4][2]);
71704bccc3aSShaohui Xie 		fm_info_set_phy_address(FM2_DTSEC4, slot_qsgmii_phyaddr[4][3]);
71804bccc3aSShaohui Xie 		fm_info_set_phy_address(FM2_DTSEC5, slot_qsgmii_phyaddr[3][0]);
71904bccc3aSShaohui Xie 		fm_info_set_phy_address(FM2_DTSEC6, slot_qsgmii_phyaddr[3][1]);
72004bccc3aSShaohui Xie 		fm_info_set_phy_address(FM2_DTSEC9, slot_qsgmii_phyaddr[3][3]);
72104bccc3aSShaohui Xie 		fm_info_set_phy_address(FM2_DTSEC10, slot_qsgmii_phyaddr[3][2]);
722ee52b188SYork Sun 		break;
72394752f60SShaohui Xie 	case 37:
724ee52b188SYork Sun 	case 38:
725ee52b188SYork Sun 		/* QSGMII in Slot3 and Slot4 */
72604bccc3aSShaohui Xie 		fm_info_set_phy_address(FM2_DTSEC1, slot_qsgmii_phyaddr[4][0]);
72704bccc3aSShaohui Xie 		fm_info_set_phy_address(FM2_DTSEC2, slot_qsgmii_phyaddr[4][1]);
72804bccc3aSShaohui Xie 		fm_info_set_phy_address(FM2_DTSEC3, slot_qsgmii_phyaddr[4][2]);
72904bccc3aSShaohui Xie 		fm_info_set_phy_address(FM2_DTSEC4, slot_qsgmii_phyaddr[4][3]);
73004bccc3aSShaohui Xie 		fm_info_set_phy_address(FM2_DTSEC5, slot_qsgmii_phyaddr[3][0]);
73104bccc3aSShaohui Xie 		fm_info_set_phy_address(FM2_DTSEC6, slot_qsgmii_phyaddr[3][1]);
7321c68d01eSShaohui Xie 		fm_info_set_phy_address(FM2_DTSEC9, slot_qsgmii_phyaddr[3][2]);
7331c68d01eSShaohui Xie 		fm_info_set_phy_address(FM2_DTSEC10, slot_qsgmii_phyaddr[3][3]);
734ee52b188SYork Sun 		break;
73594752f60SShaohui Xie 	case 39:
736ee52b188SYork Sun 	case 40:
73794752f60SShaohui Xie 	case 45:
738ee52b188SYork Sun 	case 46:
73994752f60SShaohui Xie 	case 47:
740ee52b188SYork Sun 	case 48:
741ee52b188SYork Sun 		/* SGMII in Slot3 */
74204bccc3aSShaohui Xie 		fm_info_set_phy_address(FM2_DTSEC5, slot_qsgmii_phyaddr[3][0]);
74304bccc3aSShaohui Xie 		fm_info_set_phy_address(FM2_DTSEC6, slot_qsgmii_phyaddr[3][1]);
74404bccc3aSShaohui Xie 		fm_info_set_phy_address(FM2_DTSEC9, slot_qsgmii_phyaddr[3][3]);
74504bccc3aSShaohui Xie 		fm_info_set_phy_address(FM2_DTSEC10, slot_qsgmii_phyaddr[3][2]);
746ee52b188SYork Sun 		/* QSGMII in Slot4 */
74704bccc3aSShaohui Xie 		fm_info_set_phy_address(FM2_DTSEC1, slot_qsgmii_phyaddr[4][0]);
74804bccc3aSShaohui Xie 		fm_info_set_phy_address(FM2_DTSEC2, slot_qsgmii_phyaddr[4][1]);
74904bccc3aSShaohui Xie 		fm_info_set_phy_address(FM2_DTSEC3, slot_qsgmii_phyaddr[4][2]);
75004bccc3aSShaohui Xie 		fm_info_set_phy_address(FM2_DTSEC4, slot_qsgmii_phyaddr[4][3]);
751ee52b188SYork Sun 		break;
75294752f60SShaohui Xie 	case 49:
753ee52b188SYork Sun 	case 50:
75494752f60SShaohui Xie 	case 51:
755ee52b188SYork Sun 	case 52:
75694752f60SShaohui Xie 	case 53:
757ee52b188SYork Sun 	case 54:
758ee52b188SYork Sun 		fm_info_set_phy_address(FM2_10GEC1, FM2_10GEC1_PHY_ADDR);
75904bccc3aSShaohui Xie 		fm_info_set_phy_address(FM2_DTSEC1, slot_qsgmii_phyaddr[4][0]);
76004bccc3aSShaohui Xie 		fm_info_set_phy_address(FM2_DTSEC2, slot_qsgmii_phyaddr[4][1]);
76104bccc3aSShaohui Xie 		fm_info_set_phy_address(FM2_DTSEC3, slot_qsgmii_phyaddr[4][2]);
76204bccc3aSShaohui Xie 		fm_info_set_phy_address(FM2_DTSEC4, slot_qsgmii_phyaddr[4][3]);
763ee52b188SYork Sun 		break;
7649bf499acSShaohui Xie 	case 55:
765ee52b188SYork Sun 	case 57:
766ee52b188SYork Sun 		/* XFI in Slot3, SGMII in Slot4 */
76704bccc3aSShaohui Xie 		fm_info_set_phy_address(FM2_DTSEC1, slot_qsgmii_phyaddr[4][0]);
76804bccc3aSShaohui Xie 		fm_info_set_phy_address(FM2_DTSEC2, slot_qsgmii_phyaddr[4][1]);
76904bccc3aSShaohui Xie 		fm_info_set_phy_address(FM2_DTSEC3, slot_qsgmii_phyaddr[4][2]);
77004bccc3aSShaohui Xie 		fm_info_set_phy_address(FM2_DTSEC4, slot_qsgmii_phyaddr[4][3]);
771ee52b188SYork Sun 		break;
772ee52b188SYork Sun 	default:
773ee52b188SYork Sun 		puts("Invalid SerDes2 protocol for T4240QDS\n");
774ee52b188SYork Sun 		break;
775ee52b188SYork Sun 	}
776ee52b188SYork Sun 
777ee52b188SYork Sun 	for (i = FM2_DTSEC1; i < FM2_DTSEC1 + CONFIG_SYS_NUM_FM2_DTSEC; i++) {
77895927808SShengzhou Liu 		idx = i - FM2_DTSEC1;
7791c68d01eSShaohui Xie 		interface = fm_info_get_enet_if(i);
7801c68d01eSShaohui Xie 		switch (interface) {
781ee52b188SYork Sun 		case PHY_INTERFACE_MODE_SGMII:
7821c68d01eSShaohui Xie 		case PHY_INTERFACE_MODE_QSGMII:
7831c68d01eSShaohui Xie 			if (interface == PHY_INTERFACE_MODE_QSGMII) {
7841c68d01eSShaohui Xie 				if (idx <= 3)
7851c68d01eSShaohui Xie 					lane = serdes_get_first_lane(FSL_SRDS_2,
7861c68d01eSShaohui Xie 							QSGMII_FM2_A);
7871c68d01eSShaohui Xie 				else
7881c68d01eSShaohui Xie 					lane = serdes_get_first_lane(FSL_SRDS_2,
7891c68d01eSShaohui Xie 							QSGMII_FM2_B);
7901c68d01eSShaohui Xie 				if (lane < 0)
7911c68d01eSShaohui Xie 					break;
7921c68d01eSShaohui Xie 				slot = lane_to_slot_fsm2[lane];
7931c68d01eSShaohui Xie 				debug("FM2@DTSEC%u expects QSGMII in slot %u\n",
7941c68d01eSShaohui Xie 				      idx + 1, slot);
7951c68d01eSShaohui Xie 			} else {
796ee52b188SYork Sun 				lane = serdes_get_first_lane(FSL_SRDS_2,
797ee52b188SYork Sun 						SGMII_FM2_DTSEC1 + idx);
798ee52b188SYork Sun 				if (lane < 0)
799ee52b188SYork Sun 					break;
800ee52b188SYork Sun 				slot = lane_to_slot_fsm2[lane];
801ee52b188SYork Sun 				debug("FM2@DTSEC%u expects SGMII in slot %u\n",
802ee52b188SYork Sun 				      idx + 1, slot);
8031c68d01eSShaohui Xie 			}
804ee52b188SYork Sun 			if (QIXIS_READ(present2) & (1 << (slot - 1)))
805ee52b188SYork Sun 				fm_disable_port(i);
806ee52b188SYork Sun 			switch (slot) {
807ee52b188SYork Sun 			case 3:
808ee52b188SYork Sun 				mdio_mux[i] = EMI1_SLOT3;
809ee52b188SYork Sun 				fm_info_set_mdio(i,
810ee52b188SYork Sun 					mii_dev_for_muxval(mdio_mux[i]));
811ee52b188SYork Sun 				break;
812ee52b188SYork Sun 			case 4:
813ee52b188SYork Sun 				mdio_mux[i] = EMI1_SLOT4;
814ee52b188SYork Sun 				fm_info_set_mdio(i,
815ee52b188SYork Sun 					mii_dev_for_muxval(mdio_mux[i]));
816ee52b188SYork Sun 				break;
817ee52b188SYork Sun 			};
818ee52b188SYork Sun 			break;
819ee52b188SYork Sun 		case PHY_INTERFACE_MODE_RGMII:
820ee52b188SYork Sun 			/*
821ee52b188SYork Sun 			 * If DTSEC5 is RGMII, then it's routed via via EC1 to
822ee52b188SYork Sun 			 * the first on-board RGMII port.  If DTSEC6 is RGMII,
823ee52b188SYork Sun 			 * then it's routed via via EC2 to the second on-board
824ee52b188SYork Sun 			 * RGMII port.
825ee52b188SYork Sun 			 */
826ee52b188SYork Sun 			debug("FM2@DTSEC%u is RGMII at address %u\n",
827ee52b188SYork Sun 				idx + 1, i == FM2_DTSEC5 ? 1 : 2);
828ee52b188SYork Sun 			fm_info_set_phy_address(i, i == FM2_DTSEC5 ? 1 : 2);
829ee52b188SYork Sun 			mdio_mux[i] = EMI1_RGMII;
830ee52b188SYork Sun 			fm_info_set_mdio(i, mii_dev_for_muxval(mdio_mux[i]));
831ee52b188SYork Sun 			break;
832ee52b188SYork Sun 		default:
833ee52b188SYork Sun 			break;
834ee52b188SYork Sun 		}
835ee52b188SYork Sun 	}
836ee52b188SYork Sun 
837ee52b188SYork Sun 	for (i = FM2_10GEC1; i < FM2_10GEC1 + CONFIG_SYS_NUM_FM2_10GEC; i++) {
83895927808SShengzhou Liu 		idx = i - FM2_10GEC1;
839ee52b188SYork Sun 		switch (fm_info_get_enet_if(i)) {
840ee52b188SYork Sun 		case PHY_INTERFACE_MODE_XGMII:
8419bf499acSShaohui Xie 			if ((srds_prtcl_s2 == 55) || (srds_prtcl_s2 == 57)) {
842*a187559eSBin Meng 				/* A fake PHY address to make U-Boot happy */
8439bf499acSShaohui Xie 				fm_info_set_phy_address(i, i);
8449bf499acSShaohui Xie 			} else {
84595927808SShengzhou Liu 				lane = serdes_get_first_lane(FSL_SRDS_2,
84695927808SShengzhou Liu 						XAUI_FM2_MAC9 + idx);
84795927808SShengzhou Liu 				if (lane < 0)
84895927808SShengzhou Liu 					break;
84995927808SShengzhou Liu 				slot = lane_to_slot_fsm2[lane];
85095927808SShengzhou Liu 				if (QIXIS_READ(present2) & (1 << (slot - 1)))
85195927808SShengzhou Liu 					fm_disable_port(i);
8529bf499acSShaohui Xie 			}
853ee52b188SYork Sun 			mdio_mux[i] = EMI2;
854ee52b188SYork Sun 			fm_info_set_mdio(i, mii_dev_for_muxval(mdio_mux[i]));
855ee52b188SYork Sun 			break;
856ee52b188SYork Sun 		default:
857ee52b188SYork Sun 			break;
858ee52b188SYork Sun 		}
859ee52b188SYork Sun 	}
860ee52b188SYork Sun #endif /* CONFIG_SYS_NUM_FMAN */
861ee52b188SYork Sun 
862ee52b188SYork Sun 	cpu_eth_init(bis);
863ee52b188SYork Sun #endif /* CONFIG_FMAN_ENET */
864ee52b188SYork Sun 
865ee52b188SYork Sun 	return pci_eth_init(bis);
866ee52b188SYork Sun }
867