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, ®) != 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