1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright 2015 Freescale Semiconductor, Inc.
9 #include <fdt_support.h>
12 #include <fsl_dtsec.h>
13 #include <linux/libfdt.h>
15 #include <asm/arch/fsl_serdes.h>
17 #include "../common/qixis.h"
18 #include "../common/fman.h"
19 #include "ls1043aqds_qixis.h"
30 static int mdio_mux
[NUM_FM_PORTS
];
32 static const char * const mdio_names
[] = {
33 "LS1043AQDS_MDIO_RGMII1",
34 "LS1043AQDS_MDIO_RGMII2",
35 "LS1043AQDS_MDIO_SLOT1",
36 "LS1043AQDS_MDIO_SLOT2",
37 "LS1043AQDS_MDIO_SLOT3",
38 "LS1043AQDS_MDIO_SLOT4",
42 /* Map SerDes1 4 lanes to default slot, will be initialized dynamically */
43 static u8 lane_to_slot
[] = {1, 2, 3, 4};
45 static const char *ls1043aqds_mdio_name_for_muxval(u8 muxval
)
47 return mdio_names
[muxval
];
50 struct mii_dev
*mii_dev_for_muxval(u8 muxval
)
58 name
= ls1043aqds_mdio_name_for_muxval(muxval
);
61 printf("No bus for muxval %x\n", muxval
);
65 bus
= miiphy_get_dev_by_name(name
);
68 printf("No bus by name %s\n", name
);
75 struct ls1043aqds_mdio
{
77 struct mii_dev
*realbus
;
80 static void ls1043aqds_mux_mdio(u8 muxval
)
85 brdcfg4
= QIXIS_READ(brdcfg
[4]);
86 brdcfg4
&= ~BRDCFG4_EMISEL_MASK
;
87 brdcfg4
|= (muxval
<< BRDCFG4_EMISEL_SHIFT
);
88 QIXIS_WRITE(brdcfg
[4], brdcfg4
);
92 static int ls1043aqds_mdio_read(struct mii_dev
*bus
, int addr
, int devad
,
95 struct ls1043aqds_mdio
*priv
= bus
->priv
;
97 ls1043aqds_mux_mdio(priv
->muxval
);
99 return priv
->realbus
->read(priv
->realbus
, addr
, devad
, regnum
);
102 static int ls1043aqds_mdio_write(struct mii_dev
*bus
, int addr
, int devad
,
103 int regnum
, u16 value
)
105 struct ls1043aqds_mdio
*priv
= bus
->priv
;
107 ls1043aqds_mux_mdio(priv
->muxval
);
109 return priv
->realbus
->write(priv
->realbus
, addr
, devad
,
113 static int ls1043aqds_mdio_reset(struct mii_dev
*bus
)
115 struct ls1043aqds_mdio
*priv
= bus
->priv
;
117 return priv
->realbus
->reset(priv
->realbus
);
120 static int ls1043aqds_mdio_init(char *realbusname
, u8 muxval
)
122 struct ls1043aqds_mdio
*pmdio
;
123 struct mii_dev
*bus
= mdio_alloc();
126 printf("Failed to allocate ls1043aqds MDIO bus\n");
130 pmdio
= malloc(sizeof(*pmdio
));
132 printf("Failed to allocate ls1043aqds private data\n");
137 bus
->read
= ls1043aqds_mdio_read
;
138 bus
->write
= ls1043aqds_mdio_write
;
139 bus
->reset
= ls1043aqds_mdio_reset
;
140 strcpy(bus
->name
, ls1043aqds_mdio_name_for_muxval(muxval
));
142 pmdio
->realbus
= miiphy_get_dev_by_name(realbusname
);
144 if (!pmdio
->realbus
) {
145 printf("No bus with name %s\n", realbusname
);
151 pmdio
->muxval
= muxval
;
153 return mdio_register(bus
);
156 void board_ft_fman_fixup_port(void *fdt
, char *compat
, phys_addr_t addr
,
157 enum fm_port port
, int offset
)
159 struct fixed_link f_link
;
161 if (fm_info_get_enet_if(port
) == PHY_INTERFACE_MODE_SGMII
) {
162 if (port
== FM1_DTSEC9
) {
163 fdt_set_phy_handle(fdt
, compat
, addr
,
164 "sgmii_riser_s1_p1");
165 } else if (port
== FM1_DTSEC2
) {
166 fdt_set_phy_handle(fdt
, compat
, addr
,
167 "sgmii_riser_s2_p1");
168 } else if (port
== FM1_DTSEC5
) {
169 fdt_set_phy_handle(fdt
, compat
, addr
,
170 "sgmii_riser_s3_p1");
171 } else if (port
== FM1_DTSEC6
) {
172 fdt_set_phy_handle(fdt
, compat
, addr
,
173 "sgmii_riser_s4_p1");
175 } else if (fm_info_get_enet_if(port
) ==
176 PHY_INTERFACE_MODE_SGMII_2500
) {
177 /* 2.5G SGMII interface */
178 f_link
.phy_id
= cpu_to_fdt32(port
);
179 f_link
.duplex
= cpu_to_fdt32(1);
180 f_link
.link_speed
= cpu_to_fdt32(1000);
182 f_link
.asym_pause
= 0;
183 /* no PHY for 2.5G SGMII */
184 fdt_delprop(fdt
, offset
, "phy-handle");
185 fdt_setprop(fdt
, offset
, "fixed-link", &f_link
, sizeof(f_link
));
186 fdt_setprop_string(fdt
, offset
, "phy-connection-type",
188 } else if (fm_info_get_enet_if(port
) == PHY_INTERFACE_MODE_QSGMII
) {
189 switch (mdio_mux
[port
]) {
193 fdt_set_phy_handle(fdt
, compat
, addr
,
197 fdt_set_phy_handle(fdt
, compat
, addr
,
201 fdt_set_phy_handle(fdt
, compat
, addr
,
205 fdt_set_phy_handle(fdt
, compat
, addr
,
215 fdt_set_phy_handle(fdt
, compat
, addr
,
219 fdt_set_phy_handle(fdt
, compat
, addr
,
223 fdt_set_phy_handle(fdt
, compat
, addr
,
227 fdt_set_phy_handle(fdt
, compat
, addr
,
237 fdt_delprop(fdt
, offset
, "phy-connection-type");
238 fdt_setprop_string(fdt
, offset
, "phy-connection-type",
240 } else if (fm_info_get_enet_if(port
) == PHY_INTERFACE_MODE_XGMII
&&
241 port
== FM1_10GEC1
) {
243 f_link
.phy_id
= cpu_to_fdt32(port
);
244 f_link
.duplex
= cpu_to_fdt32(1);
245 f_link
.link_speed
= cpu_to_fdt32(10000);
247 f_link
.asym_pause
= 0;
249 fdt_delprop(fdt
, offset
, "phy-handle");
250 fdt_setprop(fdt
, offset
, "fixed-link", &f_link
, sizeof(f_link
));
251 fdt_setprop_string(fdt
, offset
, "phy-connection-type", "xgmii");
255 void fdt_fixup_board_enet(void *fdt
)
258 struct ccsr_gur
*gur
= (void *)(CONFIG_SYS_FSL_GUTS_ADDR
);
261 srds_s1
= in_be32(&gur
->rcwsr
[4]) &
262 FSL_CHASSIS2_RCWSR4_SRDS1_PRTCL_MASK
;
263 srds_s1
>>= FSL_CHASSIS2_RCWSR4_SRDS1_PRTCL_SHIFT
;
265 for (i
= FM1_DTSEC1
; i
< NUM_FM_PORTS
; i
++) {
266 switch (fm_info_get_enet_if(i
)) {
267 case PHY_INTERFACE_MODE_SGMII
:
268 case PHY_INTERFACE_MODE_QSGMII
:
269 switch (mdio_mux
[i
]) {
271 fdt_status_okay_by_alias(fdt
, "emi1_slot1");
274 fdt_status_okay_by_alias(fdt
, "emi1_slot2");
277 fdt_status_okay_by_alias(fdt
, "emi1_slot3");
280 fdt_status_okay_by_alias(fdt
, "emi1_slot4");
286 case PHY_INTERFACE_MODE_XGMII
:
294 int board_eth_init(bd_t
*bis
)
296 #ifdef CONFIG_FMAN_ENET
297 int i
, idx
, lane
, slot
, interface
;
298 struct memac_mdio_info dtsec_mdio_info
;
299 struct memac_mdio_info tgec_mdio_info
;
300 struct ccsr_gur
*gur
= (void *)(CONFIG_SYS_FSL_GUTS_ADDR
);
303 srds_s1
= in_be32(&gur
->rcwsr
[4]) &
304 FSL_CHASSIS2_RCWSR4_SRDS1_PRTCL_MASK
;
305 srds_s1
>>= FSL_CHASSIS2_RCWSR4_SRDS1_PRTCL_SHIFT
;
307 /* Initialize the mdio_mux array so we can recognize empty elements */
308 for (i
= 0; i
< NUM_FM_PORTS
; i
++)
309 mdio_mux
[i
] = EMI_NONE
;
311 dtsec_mdio_info
.regs
=
312 (struct memac_mdio_controller
*)CONFIG_SYS_FM1_DTSEC_MDIO_ADDR
;
314 dtsec_mdio_info
.name
= DEFAULT_FM_MDIO_NAME
;
316 /* Register the 1G MDIO bus */
317 fm_memac_mdio_init(bis
, &dtsec_mdio_info
);
319 tgec_mdio_info
.regs
=
320 (struct memac_mdio_controller
*)CONFIG_SYS_FM1_TGEC_MDIO_ADDR
;
321 tgec_mdio_info
.name
= DEFAULT_FM_TGEC_MDIO_NAME
;
323 /* Register the 10G MDIO bus */
324 fm_memac_mdio_init(bis
, &tgec_mdio_info
);
326 /* Register the muxing front-ends to the MDIO buses */
327 ls1043aqds_mdio_init(DEFAULT_FM_MDIO_NAME
, EMI1_RGMII1
);
328 ls1043aqds_mdio_init(DEFAULT_FM_MDIO_NAME
, EMI1_RGMII2
);
329 ls1043aqds_mdio_init(DEFAULT_FM_MDIO_NAME
, EMI1_SLOT1
);
330 ls1043aqds_mdio_init(DEFAULT_FM_MDIO_NAME
, EMI1_SLOT2
);
331 ls1043aqds_mdio_init(DEFAULT_FM_MDIO_NAME
, EMI1_SLOT3
);
332 ls1043aqds_mdio_init(DEFAULT_FM_MDIO_NAME
, EMI1_SLOT4
);
333 ls1043aqds_mdio_init(DEFAULT_FM_TGEC_MDIO_NAME
, EMI2
);
335 /* Set the two on-board RGMII PHY address */
336 fm_info_set_phy_address(FM1_DTSEC3
, RGMII_PHY1_ADDR
);
337 fm_info_set_phy_address(FM1_DTSEC4
, RGMII_PHY2_ADDR
);
341 /* 2.5G SGMII on lane A, MAC 9 */
342 fm_info_set_phy_address(FM1_DTSEC9
, 9);
346 /* QSGMII on lane A, MAC 1/2/5/6 */
347 fm_info_set_phy_address(FM1_DTSEC1
,
348 QSGMII_CARD_PORT1_PHY_ADDR_S1
);
349 fm_info_set_phy_address(FM1_DTSEC2
,
350 QSGMII_CARD_PORT2_PHY_ADDR_S1
);
351 fm_info_set_phy_address(FM1_DTSEC5
,
352 QSGMII_CARD_PORT3_PHY_ADDR_S1
);
353 fm_info_set_phy_address(FM1_DTSEC6
,
354 QSGMII_CARD_PORT4_PHY_ADDR_S1
);
357 /* SGMII on lane B, MAC 2*/
358 fm_info_set_phy_address(FM1_DTSEC2
, SGMII_CARD_PORT1_PHY_ADDR
);
361 /* 2.5G SGMII on lane A, MAC 9 */
362 fm_info_set_phy_address(FM1_DTSEC9
, 9);
363 /* SGMII on lane B, MAC 2*/
364 fm_info_set_phy_address(FM1_DTSEC2
, SGMII_CARD_PORT1_PHY_ADDR
);
367 /* SGMII on lane C, MAC 5 */
368 fm_info_set_phy_address(FM1_DTSEC5
, SGMII_CARD_PORT1_PHY_ADDR
);
371 /* SGMII on lane B, MAC 2 */
372 fm_info_set_phy_address(FM1_DTSEC2
, SGMII_CARD_PORT1_PHY_ADDR
);
375 /* SGMII on lane A, MAC 9 */
376 fm_info_set_phy_address(FM1_DTSEC9
, SGMII_CARD_PORT1_PHY_ADDR
);
379 /* QSGMII on lane B, MAC 1/2/5/6 */
380 fm_info_set_phy_address(FM1_DTSEC1
,
381 QSGMII_CARD_PORT1_PHY_ADDR_S2
);
382 fm_info_set_phy_address(FM1_DTSEC2
,
383 QSGMII_CARD_PORT2_PHY_ADDR_S2
);
384 fm_info_set_phy_address(FM1_DTSEC5
,
385 QSGMII_CARD_PORT3_PHY_ADDR_S2
);
386 fm_info_set_phy_address(FM1_DTSEC6
,
387 QSGMII_CARD_PORT4_PHY_ADDR_S2
);
390 /* 2.5G SGMII on lane A, MAC 9 */
391 fm_info_set_phy_address(FM1_DTSEC9
, 9);
392 /* QSGMII on lane B, MAC 1/2/5/6 */
393 fm_info_set_phy_address(FM1_DTSEC1
,
394 QSGMII_CARD_PORT1_PHY_ADDR_S2
);
395 fm_info_set_phy_address(FM1_DTSEC2
,
396 QSGMII_CARD_PORT2_PHY_ADDR_S2
);
397 fm_info_set_phy_address(FM1_DTSEC5
,
398 QSGMII_CARD_PORT3_PHY_ADDR_S2
);
399 fm_info_set_phy_address(FM1_DTSEC6
,
400 QSGMII_CARD_PORT4_PHY_ADDR_S2
);
403 /* 2.5G SGMII on lane A, MAC 9 */
404 fm_info_set_phy_address(FM1_DTSEC9
, 9);
405 /* 2.5G SGMII on lane B, MAC 2 */
406 fm_info_set_phy_address(FM1_DTSEC2
, 2);
409 /* SGMII on lane A/B/C/D, MAC 9/2/5/6 */
410 fm_info_set_phy_address(FM1_DTSEC9
,
411 SGMII_CARD_PORT1_PHY_ADDR
);
412 fm_info_set_phy_address(FM1_DTSEC2
,
413 SGMII_CARD_PORT1_PHY_ADDR
);
414 fm_info_set_phy_address(FM1_DTSEC5
,
415 SGMII_CARD_PORT1_PHY_ADDR
);
416 fm_info_set_phy_address(FM1_DTSEC6
,
417 SGMII_CARD_PORT1_PHY_ADDR
);
420 printf("Invalid SerDes protocol 0x%x for LS1043AQDS\n",
425 for (i
= FM1_DTSEC1
; i
< FM1_DTSEC1
+ CONFIG_SYS_NUM_FM1_DTSEC
; i
++) {
426 idx
= i
- FM1_DTSEC1
;
427 interface
= fm_info_get_enet_if(i
);
429 case PHY_INTERFACE_MODE_SGMII
:
430 case PHY_INTERFACE_MODE_SGMII_2500
:
431 case PHY_INTERFACE_MODE_QSGMII
:
432 if (interface
== PHY_INTERFACE_MODE_SGMII
) {
433 lane
= serdes_get_first_lane(FSL_SRDS_1
,
434 SGMII_FM1_DTSEC1
+ idx
);
435 } else if (interface
== PHY_INTERFACE_MODE_SGMII_2500
) {
436 lane
= serdes_get_first_lane(FSL_SRDS_1
,
437 SGMII_2500_FM1_DTSEC1
+ idx
);
439 lane
= serdes_get_first_lane(FSL_SRDS_1
,
446 slot
= lane_to_slot
[lane
];
447 debug("FM1@DTSEC%u expects SGMII in slot %u\n",
449 if (QIXIS_READ(present2
) & (1 << (slot
- 1)))
454 mdio_mux
[i
] = EMI1_SLOT1
;
455 fm_info_set_mdio(i
, mii_dev_for_muxval(
459 mdio_mux
[i
] = EMI1_SLOT2
;
460 fm_info_set_mdio(i
, mii_dev_for_muxval(
464 mdio_mux
[i
] = EMI1_SLOT3
;
465 fm_info_set_mdio(i
, mii_dev_for_muxval(
469 mdio_mux
[i
] = EMI1_SLOT4
;
470 fm_info_set_mdio(i
, mii_dev_for_muxval(
477 case PHY_INTERFACE_MODE_RGMII
:
478 case PHY_INTERFACE_MODE_RGMII_TXID
:
480 mdio_mux
[i
] = EMI1_RGMII1
;
481 else if (i
== FM1_DTSEC4
)
482 mdio_mux
[i
] = EMI1_RGMII2
;
483 fm_info_set_mdio(i
, mii_dev_for_muxval(mdio_mux
[i
]));
491 #endif /* CONFIG_FMAN_ENET */
493 return pci_eth_init(bis
);