1126fe70dSShaohui Xie /*
2126fe70dSShaohui Xie * Copyright 2016 Freescale Semiconductor, Inc.
3126fe70dSShaohui Xie *
4126fe70dSShaohui Xie * SPDX-License-Identifier: GPL-2.0+
5126fe70dSShaohui Xie */
6126fe70dSShaohui Xie
7126fe70dSShaohui Xie #include <common.h>
8126fe70dSShaohui Xie #include <asm/io.h>
9126fe70dSShaohui Xie #include <netdev.h>
10126fe70dSShaohui Xie #include <fdt_support.h>
11126fe70dSShaohui Xie #include <fm_eth.h>
12126fe70dSShaohui Xie #include <fsl_mdio.h>
13126fe70dSShaohui Xie #include <fsl_dtsec.h>
14126fe70dSShaohui Xie #include <malloc.h>
15126fe70dSShaohui Xie #include <asm/arch/fsl_serdes.h>
16126fe70dSShaohui Xie
17126fe70dSShaohui Xie #include "../common/qixis.h"
18126fe70dSShaohui Xie #include "../common/fman.h"
19126fe70dSShaohui Xie #include "ls1046aqds_qixis.h"
20126fe70dSShaohui Xie
21126fe70dSShaohui Xie #define EMI_NONE 0xFF
22126fe70dSShaohui Xie #define EMI1_RGMII1 0
23126fe70dSShaohui Xie #define EMI1_RGMII2 1
24126fe70dSShaohui Xie #define EMI1_SLOT1 2
25126fe70dSShaohui Xie #define EMI1_SLOT2 3
26126fe70dSShaohui Xie #define EMI1_SLOT4 4
27126fe70dSShaohui Xie
28126fe70dSShaohui Xie static int mdio_mux[NUM_FM_PORTS];
29126fe70dSShaohui Xie
30126fe70dSShaohui Xie static const char * const mdio_names[] = {
31126fe70dSShaohui Xie "LS1046AQDS_MDIO_RGMII1",
32126fe70dSShaohui Xie "LS1046AQDS_MDIO_RGMII2",
33126fe70dSShaohui Xie "LS1046AQDS_MDIO_SLOT1",
34126fe70dSShaohui Xie "LS1046AQDS_MDIO_SLOT2",
35126fe70dSShaohui Xie "LS1046AQDS_MDIO_SLOT4",
36126fe70dSShaohui Xie "NULL",
37126fe70dSShaohui Xie };
38126fe70dSShaohui Xie
39126fe70dSShaohui Xie /* Map SerDes 1 & 2 lanes to default slot. */
40126fe70dSShaohui Xie static u8 lane_to_slot[] = {1, 1, 1, 1, 0, 4, 0 , 0};
41126fe70dSShaohui Xie
ls1046aqds_mdio_name_for_muxval(u8 muxval)42126fe70dSShaohui Xie static const char *ls1046aqds_mdio_name_for_muxval(u8 muxval)
43126fe70dSShaohui Xie {
44126fe70dSShaohui Xie return mdio_names[muxval];
45126fe70dSShaohui Xie }
46126fe70dSShaohui Xie
mii_dev_for_muxval(u8 muxval)47126fe70dSShaohui Xie struct mii_dev *mii_dev_for_muxval(u8 muxval)
48126fe70dSShaohui Xie {
49126fe70dSShaohui Xie struct mii_dev *bus;
50126fe70dSShaohui Xie const char *name;
51126fe70dSShaohui Xie
52126fe70dSShaohui Xie if (muxval > EMI1_SLOT4)
53126fe70dSShaohui Xie return NULL;
54126fe70dSShaohui Xie
55126fe70dSShaohui Xie name = ls1046aqds_mdio_name_for_muxval(muxval);
56126fe70dSShaohui Xie
57126fe70dSShaohui Xie if (!name) {
58126fe70dSShaohui Xie printf("No bus for muxval %x\n", muxval);
59126fe70dSShaohui Xie return NULL;
60126fe70dSShaohui Xie }
61126fe70dSShaohui Xie
62126fe70dSShaohui Xie bus = miiphy_get_dev_by_name(name);
63126fe70dSShaohui Xie
64126fe70dSShaohui Xie if (!bus) {
65126fe70dSShaohui Xie printf("No bus by name %s\n", name);
66126fe70dSShaohui Xie return NULL;
67126fe70dSShaohui Xie }
68126fe70dSShaohui Xie
69126fe70dSShaohui Xie return bus;
70126fe70dSShaohui Xie }
71126fe70dSShaohui Xie
72126fe70dSShaohui Xie struct ls1046aqds_mdio {
73126fe70dSShaohui Xie u8 muxval;
74126fe70dSShaohui Xie struct mii_dev *realbus;
75126fe70dSShaohui Xie };
76126fe70dSShaohui Xie
ls1046aqds_mux_mdio(u8 muxval)77126fe70dSShaohui Xie static void ls1046aqds_mux_mdio(u8 muxval)
78126fe70dSShaohui Xie {
79126fe70dSShaohui Xie u8 brdcfg4;
80126fe70dSShaohui Xie
81126fe70dSShaohui Xie if (muxval < 7) {
82126fe70dSShaohui Xie brdcfg4 = QIXIS_READ(brdcfg[4]);
83126fe70dSShaohui Xie brdcfg4 &= ~BRDCFG4_EMISEL_MASK;
84126fe70dSShaohui Xie brdcfg4 |= (muxval << BRDCFG4_EMISEL_SHIFT);
85126fe70dSShaohui Xie QIXIS_WRITE(brdcfg[4], brdcfg4);
86126fe70dSShaohui Xie }
87126fe70dSShaohui Xie }
88126fe70dSShaohui Xie
ls1046aqds_mdio_read(struct mii_dev * bus,int addr,int devad,int regnum)89126fe70dSShaohui Xie static int ls1046aqds_mdio_read(struct mii_dev *bus, int addr, int devad,
90126fe70dSShaohui Xie int regnum)
91126fe70dSShaohui Xie {
92126fe70dSShaohui Xie struct ls1046aqds_mdio *priv = bus->priv;
93126fe70dSShaohui Xie
94126fe70dSShaohui Xie ls1046aqds_mux_mdio(priv->muxval);
95126fe70dSShaohui Xie
96126fe70dSShaohui Xie return priv->realbus->read(priv->realbus, addr, devad, regnum);
97126fe70dSShaohui Xie }
98126fe70dSShaohui Xie
ls1046aqds_mdio_write(struct mii_dev * bus,int addr,int devad,int regnum,u16 value)99126fe70dSShaohui Xie static int ls1046aqds_mdio_write(struct mii_dev *bus, int addr, int devad,
100126fe70dSShaohui Xie int regnum, u16 value)
101126fe70dSShaohui Xie {
102126fe70dSShaohui Xie struct ls1046aqds_mdio *priv = bus->priv;
103126fe70dSShaohui Xie
104126fe70dSShaohui Xie ls1046aqds_mux_mdio(priv->muxval);
105126fe70dSShaohui Xie
106126fe70dSShaohui Xie return priv->realbus->write(priv->realbus, addr, devad,
107126fe70dSShaohui Xie regnum, value);
108126fe70dSShaohui Xie }
109126fe70dSShaohui Xie
ls1046aqds_mdio_reset(struct mii_dev * bus)110126fe70dSShaohui Xie static int ls1046aqds_mdio_reset(struct mii_dev *bus)
111126fe70dSShaohui Xie {
112126fe70dSShaohui Xie struct ls1046aqds_mdio *priv = bus->priv;
113126fe70dSShaohui Xie
114126fe70dSShaohui Xie return priv->realbus->reset(priv->realbus);
115126fe70dSShaohui Xie }
116126fe70dSShaohui Xie
ls1046aqds_mdio_init(char * realbusname,u8 muxval)117126fe70dSShaohui Xie static int ls1046aqds_mdio_init(char *realbusname, u8 muxval)
118126fe70dSShaohui Xie {
119126fe70dSShaohui Xie struct ls1046aqds_mdio *pmdio;
120126fe70dSShaohui Xie struct mii_dev *bus = mdio_alloc();
121126fe70dSShaohui Xie
122126fe70dSShaohui Xie if (!bus) {
123126fe70dSShaohui Xie printf("Failed to allocate ls1046aqds MDIO bus\n");
124126fe70dSShaohui Xie return -1;
125126fe70dSShaohui Xie }
126126fe70dSShaohui Xie
127126fe70dSShaohui Xie pmdio = malloc(sizeof(*pmdio));
128126fe70dSShaohui Xie if (!pmdio) {
129126fe70dSShaohui Xie printf("Failed to allocate ls1046aqds private data\n");
130126fe70dSShaohui Xie free(bus);
131126fe70dSShaohui Xie return -1;
132126fe70dSShaohui Xie }
133126fe70dSShaohui Xie
134126fe70dSShaohui Xie bus->read = ls1046aqds_mdio_read;
135126fe70dSShaohui Xie bus->write = ls1046aqds_mdio_write;
136126fe70dSShaohui Xie bus->reset = ls1046aqds_mdio_reset;
137126fe70dSShaohui Xie sprintf(bus->name, ls1046aqds_mdio_name_for_muxval(muxval));
138126fe70dSShaohui Xie
139126fe70dSShaohui Xie pmdio->realbus = miiphy_get_dev_by_name(realbusname);
140126fe70dSShaohui Xie
141126fe70dSShaohui Xie if (!pmdio->realbus) {
142126fe70dSShaohui Xie printf("No bus with name %s\n", realbusname);
143126fe70dSShaohui Xie free(bus);
144126fe70dSShaohui Xie free(pmdio);
145126fe70dSShaohui Xie return -1;
146126fe70dSShaohui Xie }
147126fe70dSShaohui Xie
148126fe70dSShaohui Xie pmdio->muxval = muxval;
149126fe70dSShaohui Xie bus->priv = pmdio;
150126fe70dSShaohui Xie return mdio_register(bus);
151126fe70dSShaohui Xie }
152126fe70dSShaohui Xie
board_ft_fman_fixup_port(void * fdt,char * compat,phys_addr_t addr,enum fm_port port,int offset)153126fe70dSShaohui Xie void board_ft_fman_fixup_port(void *fdt, char *compat, phys_addr_t addr,
154126fe70dSShaohui Xie enum fm_port port, int offset)
155126fe70dSShaohui Xie {
156126fe70dSShaohui Xie struct fixed_link f_link;
157126fe70dSShaohui Xie
158126fe70dSShaohui Xie if (fm_info_get_enet_if(port) == PHY_INTERFACE_MODE_SGMII) {
159126fe70dSShaohui Xie switch (port) {
160126fe70dSShaohui Xie case FM1_DTSEC9:
161126fe70dSShaohui Xie fdt_set_phy_handle(fdt, compat, addr, "sgmii_s1_p1");
162126fe70dSShaohui Xie break;
163126fe70dSShaohui Xie case FM1_DTSEC10:
164126fe70dSShaohui Xie fdt_set_phy_handle(fdt, compat, addr, "sgmii_s1_p2");
165126fe70dSShaohui Xie break;
166126fe70dSShaohui Xie case FM1_DTSEC5:
167126fe70dSShaohui Xie fdt_set_phy_handle(fdt, compat, addr, "sgmii_s1_p3");
168126fe70dSShaohui Xie break;
169126fe70dSShaohui Xie case FM1_DTSEC6:
170126fe70dSShaohui Xie fdt_set_phy_handle(fdt, compat, addr, "sgmii_s1_p4");
171126fe70dSShaohui Xie break;
172126fe70dSShaohui Xie case FM1_DTSEC2:
173126fe70dSShaohui Xie fdt_set_phy_handle(fdt, compat, addr, "sgmii_s4_p1");
174126fe70dSShaohui Xie break;
175126fe70dSShaohui Xie default:
176126fe70dSShaohui Xie break;
177126fe70dSShaohui Xie }
178126fe70dSShaohui Xie } else if (fm_info_get_enet_if(port) == PHY_INTERFACE_MODE_SGMII_2500) {
179126fe70dSShaohui Xie /* 2.5G SGMII interface */
180126fe70dSShaohui Xie f_link.phy_id = cpu_to_fdt32(port);
181126fe70dSShaohui Xie f_link.duplex = cpu_to_fdt32(1);
182126fe70dSShaohui Xie f_link.link_speed = cpu_to_fdt32(1000);
183126fe70dSShaohui Xie f_link.pause = 0;
184126fe70dSShaohui Xie f_link.asym_pause = 0;
185126fe70dSShaohui Xie /* no PHY for 2.5G SGMII on QDS */
186126fe70dSShaohui Xie fdt_delprop(fdt, offset, "phy-handle");
187126fe70dSShaohui Xie fdt_setprop(fdt, offset, "fixed-link", &f_link, sizeof(f_link));
188126fe70dSShaohui Xie fdt_setprop_string(fdt, offset, "phy-connection-type",
189126fe70dSShaohui Xie "sgmii-2500");
190126fe70dSShaohui Xie } else if (fm_info_get_enet_if(port) == PHY_INTERFACE_MODE_QSGMII) {
191126fe70dSShaohui Xie switch (port) {
192126fe70dSShaohui Xie case FM1_DTSEC1:
193126fe70dSShaohui Xie fdt_set_phy_handle(fdt, compat, addr, "qsgmii_s2_p4");
194126fe70dSShaohui Xie break;
195126fe70dSShaohui Xie case FM1_DTSEC5:
196126fe70dSShaohui Xie fdt_set_phy_handle(fdt, compat, addr, "qsgmii_s2_p2");
197126fe70dSShaohui Xie break;
198126fe70dSShaohui Xie case FM1_DTSEC6:
199126fe70dSShaohui Xie fdt_set_phy_handle(fdt, compat, addr, "qsgmii_s2_p1");
200126fe70dSShaohui Xie break;
201126fe70dSShaohui Xie case FM1_DTSEC10:
202126fe70dSShaohui Xie fdt_set_phy_handle(fdt, compat, addr, "qsgmii_s2_p3");
203126fe70dSShaohui Xie break;
204126fe70dSShaohui Xie default:
205126fe70dSShaohui Xie break;
206126fe70dSShaohui Xie }
207126fe70dSShaohui Xie fdt_delprop(fdt, offset, "phy-connection-type");
208126fe70dSShaohui Xie fdt_setprop_string(fdt, offset, "phy-connection-type",
209126fe70dSShaohui Xie "qsgmii");
210126fe70dSShaohui Xie } else if (fm_info_get_enet_if(port) == PHY_INTERFACE_MODE_XGMII &&
211126fe70dSShaohui Xie (port == FM1_10GEC1 || port == FM1_10GEC2)) {
212126fe70dSShaohui Xie /* XFI interface */
213126fe70dSShaohui Xie f_link.phy_id = cpu_to_fdt32(port);
214126fe70dSShaohui Xie f_link.duplex = cpu_to_fdt32(1);
215126fe70dSShaohui Xie f_link.link_speed = cpu_to_fdt32(10000);
216126fe70dSShaohui Xie f_link.pause = 0;
217126fe70dSShaohui Xie f_link.asym_pause = 0;
218126fe70dSShaohui Xie /* no PHY for XFI */
219126fe70dSShaohui Xie fdt_delprop(fdt, offset, "phy-handle");
220126fe70dSShaohui Xie fdt_setprop(fdt, offset, "fixed-link", &f_link, sizeof(f_link));
221126fe70dSShaohui Xie fdt_setprop_string(fdt, offset, "phy-connection-type", "xgmii");
222126fe70dSShaohui Xie }
223126fe70dSShaohui Xie }
224126fe70dSShaohui Xie
fdt_fixup_board_enet(void * fdt)225126fe70dSShaohui Xie void fdt_fixup_board_enet(void *fdt)
226126fe70dSShaohui Xie {
227126fe70dSShaohui Xie int i;
228126fe70dSShaohui Xie
229126fe70dSShaohui Xie for (i = FM1_DTSEC1; i < NUM_FM_PORTS; i++) {
230126fe70dSShaohui Xie switch (fm_info_get_enet_if(i)) {
231126fe70dSShaohui Xie case PHY_INTERFACE_MODE_SGMII:
232126fe70dSShaohui Xie case PHY_INTERFACE_MODE_QSGMII:
233126fe70dSShaohui Xie switch (mdio_mux[i]) {
234126fe70dSShaohui Xie case EMI1_SLOT1:
235126fe70dSShaohui Xie fdt_status_okay_by_alias(fdt, "emi1_slot1");
236126fe70dSShaohui Xie break;
237126fe70dSShaohui Xie case EMI1_SLOT2:
238126fe70dSShaohui Xie fdt_status_okay_by_alias(fdt, "emi1_slot2");
239126fe70dSShaohui Xie break;
240126fe70dSShaohui Xie case EMI1_SLOT4:
241126fe70dSShaohui Xie fdt_status_okay_by_alias(fdt, "emi1_slot4");
242126fe70dSShaohui Xie break;
243126fe70dSShaohui Xie default:
244126fe70dSShaohui Xie break;
245126fe70dSShaohui Xie }
246126fe70dSShaohui Xie break;
247126fe70dSShaohui Xie default:
248126fe70dSShaohui Xie break;
249126fe70dSShaohui Xie }
250126fe70dSShaohui Xie }
251126fe70dSShaohui Xie }
252126fe70dSShaohui Xie
board_eth_init(bd_t * bis)253126fe70dSShaohui Xie int board_eth_init(bd_t *bis)
254126fe70dSShaohui Xie {
255126fe70dSShaohui Xie #ifdef CONFIG_FMAN_ENET
256126fe70dSShaohui Xie int i, idx, lane, slot, interface;
257126fe70dSShaohui Xie struct memac_mdio_info dtsec_mdio_info;
258126fe70dSShaohui Xie struct ccsr_gur *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR);
259126fe70dSShaohui Xie u32 srds_s1, srds_s2;
260126fe70dSShaohui Xie u8 brdcfg12;
261126fe70dSShaohui Xie
262126fe70dSShaohui Xie srds_s1 = in_be32(&gur->rcwsr[4]) &
263126fe70dSShaohui Xie FSL_CHASSIS2_RCWSR4_SRDS1_PRTCL_MASK;
264126fe70dSShaohui Xie srds_s1 >>= FSL_CHASSIS2_RCWSR4_SRDS1_PRTCL_SHIFT;
265126fe70dSShaohui Xie
266126fe70dSShaohui Xie srds_s2 = in_be32(&gur->rcwsr[4]) &
267126fe70dSShaohui Xie FSL_CHASSIS2_RCWSR4_SRDS2_PRTCL_MASK;
268126fe70dSShaohui Xie srds_s2 >>= FSL_CHASSIS2_RCWSR4_SRDS2_PRTCL_SHIFT;
269126fe70dSShaohui Xie
270126fe70dSShaohui Xie /* Initialize the mdio_mux array so we can recognize empty elements */
271126fe70dSShaohui Xie for (i = 0; i < NUM_FM_PORTS; i++)
272126fe70dSShaohui Xie mdio_mux[i] = EMI_NONE;
273126fe70dSShaohui Xie
274126fe70dSShaohui Xie dtsec_mdio_info.regs =
275126fe70dSShaohui Xie (struct memac_mdio_controller *)CONFIG_SYS_FM1_DTSEC_MDIO_ADDR;
276126fe70dSShaohui Xie
277126fe70dSShaohui Xie dtsec_mdio_info.name = DEFAULT_FM_MDIO_NAME;
278126fe70dSShaohui Xie
279126fe70dSShaohui Xie /* Register the 1G MDIO bus */
280126fe70dSShaohui Xie fm_memac_mdio_init(bis, &dtsec_mdio_info);
281126fe70dSShaohui Xie
282126fe70dSShaohui Xie /* Register the muxing front-ends to the MDIO buses */
283126fe70dSShaohui Xie ls1046aqds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_RGMII1);
284126fe70dSShaohui Xie ls1046aqds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_RGMII2);
285126fe70dSShaohui Xie ls1046aqds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT1);
286126fe70dSShaohui Xie ls1046aqds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT2);
287126fe70dSShaohui Xie ls1046aqds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT4);
288126fe70dSShaohui Xie
289126fe70dSShaohui Xie /* Set the two on-board RGMII PHY address */
290126fe70dSShaohui Xie fm_info_set_phy_address(FM1_DTSEC3, RGMII_PHY1_ADDR);
291126fe70dSShaohui Xie fm_info_set_phy_address(FM1_DTSEC4, RGMII_PHY2_ADDR);
292126fe70dSShaohui Xie
293126fe70dSShaohui Xie switch (srds_s1) {
294126fe70dSShaohui Xie case 0x3333:
295126fe70dSShaohui Xie /* SGMII on slot 1, MAC 9 */
296126fe70dSShaohui Xie fm_info_set_phy_address(FM1_DTSEC9, SGMII_CARD_PORT1_PHY_ADDR);
297126fe70dSShaohui Xie case 0x1333:
298126fe70dSShaohui Xie case 0x2333:
299126fe70dSShaohui Xie /* SGMII on slot 1, MAC 10 */
300126fe70dSShaohui Xie fm_info_set_phy_address(FM1_DTSEC10, SGMII_CARD_PORT2_PHY_ADDR);
301126fe70dSShaohui Xie case 0x1133:
302126fe70dSShaohui Xie case 0x2233:
303126fe70dSShaohui Xie /* SGMII on slot 1, MAC 5/6 */
304126fe70dSShaohui Xie fm_info_set_phy_address(FM1_DTSEC5, SGMII_CARD_PORT3_PHY_ADDR);
305126fe70dSShaohui Xie fm_info_set_phy_address(FM1_DTSEC6, SGMII_CARD_PORT4_PHY_ADDR);
306126fe70dSShaohui Xie break;
307126fe70dSShaohui Xie case 0x1040:
308126fe70dSShaohui Xie case 0x2040:
309126fe70dSShaohui Xie /* QSGMII on lane B, MAC 6/5/10/1 */
310126fe70dSShaohui Xie fm_info_set_phy_address(FM1_DTSEC6,
311126fe70dSShaohui Xie QSGMII_CARD_PORT1_PHY_ADDR_S2);
312126fe70dSShaohui Xie fm_info_set_phy_address(FM1_DTSEC5,
313126fe70dSShaohui Xie QSGMII_CARD_PORT2_PHY_ADDR_S2);
314126fe70dSShaohui Xie fm_info_set_phy_address(FM1_DTSEC10,
315126fe70dSShaohui Xie QSGMII_CARD_PORT3_PHY_ADDR_S2);
316126fe70dSShaohui Xie fm_info_set_phy_address(FM1_DTSEC1,
317126fe70dSShaohui Xie QSGMII_CARD_PORT4_PHY_ADDR_S2);
318126fe70dSShaohui Xie break;
319126fe70dSShaohui Xie case 0x3363:
320126fe70dSShaohui Xie /* SGMII on slot 1, MAC 9/10 */
321126fe70dSShaohui Xie fm_info_set_phy_address(FM1_DTSEC9, SGMII_CARD_PORT1_PHY_ADDR);
322126fe70dSShaohui Xie fm_info_set_phy_address(FM1_DTSEC10, SGMII_CARD_PORT2_PHY_ADDR);
323126fe70dSShaohui Xie case 0x1163:
324126fe70dSShaohui Xie case 0x2263:
325126fe70dSShaohui Xie case 0x2223:
326126fe70dSShaohui Xie /* SGMII on slot 1, MAC 6 */
327126fe70dSShaohui Xie fm_info_set_phy_address(FM1_DTSEC6, SGMII_CARD_PORT4_PHY_ADDR);
328126fe70dSShaohui Xie break;
329126fe70dSShaohui Xie default:
330126fe70dSShaohui Xie printf("Invalid SerDes protocol 0x%x for LS1046AQDS\n",
331126fe70dSShaohui Xie srds_s1);
332126fe70dSShaohui Xie break;
333126fe70dSShaohui Xie }
334126fe70dSShaohui Xie
335126fe70dSShaohui Xie if (srds_s2 == 0x5a59 || srds_s2 == 0x5a06)
336126fe70dSShaohui Xie /* SGMII on slot 4, MAC 2 */
337126fe70dSShaohui Xie fm_info_set_phy_address(FM1_DTSEC2, SGMII_CARD_PORT1_PHY_ADDR);
338126fe70dSShaohui Xie
339126fe70dSShaohui Xie for (i = FM1_DTSEC1; i < FM1_DTSEC1 + CONFIG_SYS_NUM_FM1_DTSEC; i++) {
340126fe70dSShaohui Xie idx = i - FM1_DTSEC1;
341126fe70dSShaohui Xie interface = fm_info_get_enet_if(i);
342126fe70dSShaohui Xie switch (interface) {
343126fe70dSShaohui Xie case PHY_INTERFACE_MODE_SGMII:
344126fe70dSShaohui Xie case PHY_INTERFACE_MODE_QSGMII:
345126fe70dSShaohui Xie if (interface == PHY_INTERFACE_MODE_SGMII) {
346126fe70dSShaohui Xie if (i == FM1_DTSEC5) {
347126fe70dSShaohui Xie /* route lane 2 to slot1 so to have
348126fe70dSShaohui Xie * one sgmii riser card supports
349126fe70dSShaohui Xie * MAC5 and MAC6.
350126fe70dSShaohui Xie */
351126fe70dSShaohui Xie brdcfg12 = QIXIS_READ(brdcfg[12]);
352126fe70dSShaohui Xie QIXIS_WRITE(brdcfg[12],
353126fe70dSShaohui Xie brdcfg12 | 0x80);
354126fe70dSShaohui Xie }
355126fe70dSShaohui Xie lane = serdes_get_first_lane(FSL_SRDS_1,
356126fe70dSShaohui Xie SGMII_FM1_DTSEC1 + idx);
357126fe70dSShaohui Xie } else {
358126fe70dSShaohui Xie /* clear the bit 7 to route lane B on slot2. */
359126fe70dSShaohui Xie brdcfg12 = QIXIS_READ(brdcfg[12]);
360126fe70dSShaohui Xie QIXIS_WRITE(brdcfg[12], brdcfg12 & 0x7f);
361126fe70dSShaohui Xie
362126fe70dSShaohui Xie lane = serdes_get_first_lane(FSL_SRDS_1,
363126fe70dSShaohui Xie QSGMII_FM1_A);
364126fe70dSShaohui Xie lane_to_slot[lane] = 2;
365126fe70dSShaohui Xie }
366126fe70dSShaohui Xie
367126fe70dSShaohui Xie if (i == FM1_DTSEC2)
368126fe70dSShaohui Xie lane = 5;
369126fe70dSShaohui Xie
370126fe70dSShaohui Xie if (lane < 0)
371126fe70dSShaohui Xie break;
372126fe70dSShaohui Xie
373126fe70dSShaohui Xie slot = lane_to_slot[lane];
374126fe70dSShaohui Xie debug("FM1@DTSEC%u expects SGMII in slot %u\n",
375126fe70dSShaohui Xie idx + 1, slot);
376126fe70dSShaohui Xie if (QIXIS_READ(present2) & (1 << (slot - 1)))
377126fe70dSShaohui Xie fm_disable_port(i);
378126fe70dSShaohui Xie
379126fe70dSShaohui Xie switch (slot) {
380126fe70dSShaohui Xie case 1:
381126fe70dSShaohui Xie mdio_mux[i] = EMI1_SLOT1;
382126fe70dSShaohui Xie fm_info_set_mdio(i, mii_dev_for_muxval(
383126fe70dSShaohui Xie mdio_mux[i]));
384126fe70dSShaohui Xie break;
385126fe70dSShaohui Xie case 2:
386126fe70dSShaohui Xie mdio_mux[i] = EMI1_SLOT2;
387126fe70dSShaohui Xie fm_info_set_mdio(i, mii_dev_for_muxval(
388126fe70dSShaohui Xie mdio_mux[i]));
389126fe70dSShaohui Xie break;
390126fe70dSShaohui Xie case 4:
391126fe70dSShaohui Xie mdio_mux[i] = EMI1_SLOT4;
392126fe70dSShaohui Xie fm_info_set_mdio(i, mii_dev_for_muxval(
393126fe70dSShaohui Xie mdio_mux[i]));
394126fe70dSShaohui Xie break;
395126fe70dSShaohui Xie default:
396126fe70dSShaohui Xie break;
397126fe70dSShaohui Xie }
398126fe70dSShaohui Xie break;
399126fe70dSShaohui Xie case PHY_INTERFACE_MODE_RGMII:
400*10710b4eSMadalin Bucur case PHY_INTERFACE_MODE_RGMII_TXID:
401126fe70dSShaohui Xie if (i == FM1_DTSEC3)
402126fe70dSShaohui Xie mdio_mux[i] = EMI1_RGMII1;
403126fe70dSShaohui Xie else if (i == FM1_DTSEC4)
404126fe70dSShaohui Xie mdio_mux[i] = EMI1_RGMII2;
405126fe70dSShaohui Xie fm_info_set_mdio(i, mii_dev_for_muxval(mdio_mux[i]));
406126fe70dSShaohui Xie break;
407126fe70dSShaohui Xie default:
408126fe70dSShaohui Xie break;
409126fe70dSShaohui Xie }
410126fe70dSShaohui Xie }
411126fe70dSShaohui Xie
412126fe70dSShaohui Xie cpu_eth_init(bis);
413126fe70dSShaohui Xie #endif /* CONFIG_FMAN_ENET */
414126fe70dSShaohui Xie
415126fe70dSShaohui Xie return pci_eth_init(bis);
416126fe70dSShaohui Xie }
417