2 * Copyright 2009-2011 Freescale Semiconductor, Inc.
3 * Author: Timur Tabi <timur@freescale.com>
5 * SPDX-License-Identifier: GPL-2.0+
9 * This file handles the board muxing between the Fman Ethernet MACs and
10 * the RGMII/SGMII/XGMII PHYs on a Freescale P3041/P5020 "Hydra" reference
11 * board. The RGMII PHYs are the two on-board 1Gb ports. The SGMII PHYs are
12 * provided by the standard Freescale four-port SGMII riser card. The 10Gb
13 * XGMII PHY is provided via the XAUI riser card. Since there is only one
14 * Fman device on a P3041 and P5020, we only support one SGMII card and one
17 * Muxing is handled via the PIXIS BRDCFG1 register. The EMI1 bits control
18 * muxing among the RGMII PHYs and the SGMII PHYs. The value for RGMII is
19 * always the same (0). The value for SGMII depends on which slot the riser is
20 * inserted in. The EMI2 bits control muxing for the the XGMII. Like SGMII,
21 * the value is based on which slot the XAUI is inserted in.
23 * The SERDES configuration is used to determine where the SGMII and XAUI cards
24 * exist, and also which Fman MACs are routed to which PHYs. So for a given
25 * Fman MAC, there is one and only PHY it connects to. MACs cannot be routed
26 * to PHYs dynamically.
29 * This file also updates the device tree in three ways:
31 * 1) The status of each virtual MDIO node that is referenced by an Ethernet
32 * node is set to "okay".
34 * 2) The phy-handle property of each active Ethernet MAC node is set to the
35 * appropriate PHY node.
37 * 3) The "mux value" for each virtual MDIO node is set to the correct value,
38 * if necessary. Some virtual MDIO nodes do not have configurable mux
39 * values, so those values are hard-coded in the DTS. On the HYDRA board,
40 * the virtual MDIO node for the SGMII card needs to be updated.
42 * For all this to work, the device tree needs to have the following:
44 * 1) An alias for each PHY node that an Ethernet node could be routed to.
46 * 2) An alias for each real and virtual MDIO node that is disabled by default
47 * and might need to be enabled, and also might need to have its mux-value
53 #include <asm/fsl_serdes.h>
57 #include <fdt_support.h>
58 #include <asm/fsl_dtsec.h>
60 #include "../common/ngpixis.h"
61 #include "../common/fman.h"
63 #ifdef CONFIG_FMAN_ENET
65 #define BRDCFG1_EMI1_SEL_MASK 0x70
66 #define BRDCFG1_EMI1_SEL_SLOT1 0x10
67 #define BRDCFG1_EMI1_SEL_SLOT2 0x20
68 #define BRDCFG1_EMI1_SEL_SLOT5 0x30
69 #define BRDCFG1_EMI1_SEL_SLOT6 0x40
70 #define BRDCFG1_EMI1_SEL_SLOT7 0x50
71 #define BRDCFG1_EMI1_SEL_RGMII 0x00
72 #define BRDCFG1_EMI1_EN 0x08
73 #define BRDCFG1_EMI2_SEL_MASK 0x06
74 #define BRDCFG1_EMI2_SEL_SLOT1 0x00
75 #define BRDCFG1_EMI2_SEL_SLOT2 0x02
77 #define BRDCFG2_REG_GPIO_SEL 0x20
79 #define PHY_BASE_ADDR 0x00
82 * BRDCFG1 mask and value for each MAC
84 * This array contains the BRDCFG1 values (in mask/val format) that route the
85 * MDIO bus to a particular RGMII or SGMII PHY.
90 } mdio_mux
[NUM_FM_PORTS
];
93 * Mapping of all 18 SERDES lanes to board slots. A value of '0' here means
94 * that the mapping must be determined dynamically, or that the lane maps to
95 * something other than a board slot
97 static u8 lane_to_slot
[] = {
98 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 1, 1, 0, 0
102 * Set the board muxing for a given MAC
104 * The MDIO layer calls this function every time it wants to talk to a PHY.
106 void hydra_mux_mdio(u8 mask
, u8 val
)
108 clrsetbits_8(&pixis
->brdcfg1
, mask
, val
);
114 struct mii_dev
*realbus
;
117 static int hydra_mdio_read(struct mii_dev
*bus
, int addr
, int devad
,
120 struct hydra_mdio
*priv
= bus
->priv
;
122 hydra_mux_mdio(priv
->mask
, priv
->val
);
124 return priv
->realbus
->read(priv
->realbus
, addr
, devad
, regnum
);
127 static int hydra_mdio_write(struct mii_dev
*bus
, int addr
, int devad
,
128 int regnum
, u16 value
)
130 struct hydra_mdio
*priv
= bus
->priv
;
132 hydra_mux_mdio(priv
->mask
, priv
->val
);
134 return priv
->realbus
->write(priv
->realbus
, addr
, devad
, regnum
, value
);
137 static int hydra_mdio_reset(struct mii_dev
*bus
)
139 struct hydra_mdio
*priv
= bus
->priv
;
141 return priv
->realbus
->reset(priv
->realbus
);
144 static void hydra_mdio_set_mux(char *name
, u8 mask
, u8 val
)
146 struct mii_dev
*bus
= miiphy_get_dev_by_name(name
);
147 struct hydra_mdio
*priv
= bus
->priv
;
153 static int hydra_mdio_init(char *realbusname
, char *fakebusname
)
155 struct hydra_mdio
*hmdio
;
156 struct mii_dev
*bus
= mdio_alloc();
159 printf("Failed to allocate Hydra MDIO bus\n");
163 hmdio
= malloc(sizeof(*hmdio
));
165 printf("Failed to allocate Hydra private data\n");
170 bus
->read
= hydra_mdio_read
;
171 bus
->write
= hydra_mdio_write
;
172 bus
->reset
= hydra_mdio_reset
;
173 sprintf(bus
->name
, fakebusname
);
175 hmdio
->realbus
= miiphy_get_dev_by_name(realbusname
);
177 if (!hmdio
->realbus
) {
178 printf("No bus with name %s\n", realbusname
);
186 return mdio_register(bus
);
190 * Given an alias or a path for a node, set the mux value of that node.
192 * If 'alias' is not a valid alias, then it is treated as a full path to the
193 * node. No error checking is performed.
195 * This function is normally called to set the fsl,hydra-mdio-muxval property
196 * of a virtual MDIO node.
198 static void fdt_set_mdio_mux(void *fdt
, const char *alias
, u32 mux
)
200 const char *path
= fdt_get_alias(fdt
, alias
);
205 do_fixup_by_path(fdt
, path
, "fsl,hydra-mdio-muxval",
206 &mux
, sizeof(mux
), 1);
210 * Given the following ...
212 * 1) A pointer to an Fman Ethernet node (as identified by the 'compat'
213 * compatible string and 'addr' physical address)
217 * ... update the phy-handle property of the Ethernet node to point to the
218 * right PHY. This assumes that we already know the PHY for each port. That
219 * information is stored in mdio_mux[].
221 * The offset of the Fman Ethernet node is also passed in for convenience, but
222 * it is not used, and we recalculate the offset anyway.
224 * Note that what we call "Fman ports" (enum fm_port) is really an Fman MAC.
225 * Inside the Fman, "ports" are things that connect to MACs. We only call them
226 * ports in U-Boot because on previous Ethernet devices (e.g. Gianfar), MACs
227 * and ports are the same thing.
229 * Note that this code would be cleaner if had a function called
230 * fm_info_get_phy_address(), which returns a value from the fm1_dtsec_info[]
231 * array. That's because all we're doing is figuring out the PHY address for
232 * a given Fman MAC and writing it to the device tree. Well, we already did
233 * the hard work to figure that out in board_eth_init(), so it's silly to
236 void board_ft_fman_fixup_port(void *fdt
, char *compat
, phys_addr_t addr
,
237 enum fm_port port
, int offset
)
239 unsigned int mux
= mdio_mux
[port
].val
& mdio_mux
[port
].mask
;
242 if (port
== FM1_10GEC1
) {
244 int lane
= serdes_get_first_lane(XAUI_FM1
);
246 /* The XAUI PHY is identified by the slot */
247 sprintf(phy
, "phy_xgmii_%u", lane_to_slot
[lane
]);
248 fdt_set_phy_handle(fdt
, compat
, addr
, phy
);
253 if (mux
== BRDCFG1_EMI1_SEL_RGMII
) {
255 /* The RGMII PHY is identified by the MAC connected to it */
256 sprintf(phy
, "phy_rgmii_%u", port
== FM1_DTSEC4
? 0 : 1);
257 fdt_set_phy_handle(fdt
, compat
, addr
, phy
);
260 /* If it's not RGMII or XGMII, it must be SGMII */
262 /* The SGMII PHY is identified by the MAC connected to it */
263 sprintf(phy
, "phy_sgmii_%x",
264 CONFIG_SYS_FM1_DTSEC1_PHY_ADDR
+ (port
- FM1_DTSEC1
));
265 fdt_set_phy_handle(fdt
, compat
, addr
, phy
);
269 #define PIXIS_SW2_LANE_23_SEL 0x80
270 #define PIXIS_SW2_LANE_45_SEL 0x40
271 #define PIXIS_SW2_LANE_67_SEL_MASK 0x30
272 #define PIXIS_SW2_LANE_67_SEL_5 0x00
273 #define PIXIS_SW2_LANE_67_SEL_6 0x20
274 #define PIXIS_SW2_LANE_67_SEL_7 0x10
275 #define PIXIS_SW2_LANE_8_SEL 0x08
276 #define PIXIS_SW2_LANE_1617_SEL 0x04
279 * Initialize the lane_to_slot[] array.
281 * On the P4080DS "Expedition" board, the mapping of SERDES lanes to board
282 * slots is hard-coded. On the Hydra board, however, the mapping is controlled
283 * by board switch SW2, so the lane_to_slot[] array needs to be dynamically
286 static void initialize_lane_to_slot(void)
288 u8 sw2
= in_8(&PIXIS_SW(2));
290 lane_to_slot
[2] = (sw2
& PIXIS_SW2_LANE_23_SEL
) ? 7 : 4;
291 lane_to_slot
[3] = lane_to_slot
[2];
293 lane_to_slot
[4] = (sw2
& PIXIS_SW2_LANE_45_SEL
) ? 7 : 6;
294 lane_to_slot
[5] = lane_to_slot
[4];
296 switch (sw2
& PIXIS_SW2_LANE_67_SEL_MASK
) {
297 case PIXIS_SW2_LANE_67_SEL_5
:
300 case PIXIS_SW2_LANE_67_SEL_6
:
303 case PIXIS_SW2_LANE_67_SEL_7
:
307 lane_to_slot
[7] = lane_to_slot
[6];
309 lane_to_slot
[8] = (sw2
& PIXIS_SW2_LANE_8_SEL
) ? 3 : 0;
311 lane_to_slot
[16] = (sw2
& PIXIS_SW2_LANE_1617_SEL
) ? 1 : 0;
312 lane_to_slot
[17] = lane_to_slot
[16];
315 #endif /* #ifdef CONFIG_FMAN_ENET */
318 * Configure the status for the virtual MDIO nodes
320 * Rather than create the virtual MDIO nodes from scratch for each active
321 * virtual MDIO, we expect the DTS to have the nodes defined already, and we
322 * only enable the ones that are actually active.
324 * We assume that the DTS already hard-codes the status for all the
325 * virtual MDIO nodes to "disabled", so all we need to do is enable the
328 * For SGMII, we also need to set the mux value in the node.
330 void fdt_fixup_board_enet(void *fdt
)
332 #ifdef CONFIG_FMAN_ENET
336 for (i
= FM1_DTSEC1
; i
< FM1_DTSEC1
+ CONFIG_SYS_NUM_FM1_DTSEC
; i
++) {
337 int idx
= i
- FM1_DTSEC1
;
339 switch (fm_info_get_enet_if(i
)) {
340 case PHY_INTERFACE_MODE_SGMII
:
341 lane
= serdes_get_first_lane(SGMII_FM1_DTSEC1
+ idx
);
343 fdt_status_okay_by_alias(fdt
, "emi1_sgmii");
344 /* Also set the MUX value */
345 fdt_set_mdio_mux(fdt
, "emi1_sgmii",
349 case PHY_INTERFACE_MODE_RGMII
:
350 fdt_status_okay_by_alias(fdt
, "emi1_rgmii");
357 lane
= serdes_get_first_lane(XAUI_FM1
);
359 fdt_status_okay_by_alias(fdt
, "emi2_xgmii");
363 int board_eth_init(bd_t
*bis
)
365 #ifdef CONFIG_FMAN_ENET
366 struct fsl_pq_mdio_info dtsec_mdio_info
;
367 struct tgec_mdio_info tgec_mdio_info
;
368 unsigned int i
, slot
;
372 printf("Initializing Fman\n");
374 initialize_lane_to_slot();
376 /* We want to use the PIXIS to configure MUX routing, not GPIOs. */
377 setbits_8(&pixis
->brdcfg2
, BRDCFG2_REG_GPIO_SEL
);
379 memset(mdio_mux
, 0, sizeof(mdio_mux
));
381 dtsec_mdio_info
.regs
=
382 (struct tsec_mii_mng
*)CONFIG_SYS_FM1_DTSEC1_MDIO_ADDR
;
383 dtsec_mdio_info
.name
= DEFAULT_FM_MDIO_NAME
;
385 /* Register the real 1G MDIO bus */
386 fsl_pq_mdio_init(bis
, &dtsec_mdio_info
);
388 tgec_mdio_info
.regs
=
389 (struct tgec_mdio_controller
*)CONFIG_SYS_FM1_TGEC_MDIO_ADDR
;
390 tgec_mdio_info
.name
= DEFAULT_FM_TGEC_MDIO_NAME
;
392 /* Register the real 10G MDIO bus */
393 fm_tgec_mdio_init(bis
, &tgec_mdio_info
);
395 /* Register the three virtual MDIO front-ends */
396 hydra_mdio_init(DEFAULT_FM_MDIO_NAME
, "HYDRA_RGMII_MDIO");
397 hydra_mdio_init(DEFAULT_FM_MDIO_NAME
, "HYDRA_SGMII_MDIO");
400 * Program the DTSEC PHY addresses assuming that they are all SGMII.
401 * For any DTSEC that's RGMII, we'll override its PHY address later.
402 * We assume that DTSEC5 is only used for RGMII.
404 fm_info_set_phy_address(FM1_DTSEC1
, CONFIG_SYS_FM1_DTSEC1_PHY_ADDR
);
405 fm_info_set_phy_address(FM1_DTSEC2
, CONFIG_SYS_FM1_DTSEC2_PHY_ADDR
);
406 fm_info_set_phy_address(FM1_DTSEC3
, CONFIG_SYS_FM1_DTSEC3_PHY_ADDR
);
407 fm_info_set_phy_address(FM1_DTSEC4
, CONFIG_SYS_FM1_DTSEC4_PHY_ADDR
);
409 for (i
= FM1_DTSEC1
; i
< FM1_DTSEC1
+ CONFIG_SYS_NUM_FM1_DTSEC
; i
++) {
410 int idx
= i
- FM1_DTSEC1
;
412 switch (fm_info_get_enet_if(i
)) {
413 case PHY_INTERFACE_MODE_SGMII
:
414 lane
= serdes_get_first_lane(SGMII_FM1_DTSEC1
+ idx
);
417 slot
= lane_to_slot
[lane
];
418 mdio_mux
[i
].mask
= BRDCFG1_EMI1_SEL_MASK
;
421 /* Always DTSEC5 on Bank 3 */
422 mdio_mux
[i
].val
= BRDCFG1_EMI1_SEL_SLOT1
|
426 mdio_mux
[i
].val
= BRDCFG1_EMI1_SEL_SLOT2
|
430 mdio_mux
[i
].val
= BRDCFG1_EMI1_SEL_SLOT5
|
434 mdio_mux
[i
].val
= BRDCFG1_EMI1_SEL_SLOT6
|
438 mdio_mux
[i
].val
= BRDCFG1_EMI1_SEL_SLOT7
|
443 hydra_mdio_set_mux("HYDRA_SGMII_MDIO",
444 mdio_mux
[i
].mask
, mdio_mux
[i
].val
);
446 miiphy_get_dev_by_name("HYDRA_SGMII_MDIO"));
448 case PHY_INTERFACE_MODE_RGMII
:
450 * If DTSEC4 is RGMII, then it's routed via via EC1 to
451 * the first on-board RGMII port. If DTSEC5 is RGMII,
452 * then it's routed via via EC2 to the second on-board
453 * RGMII port. The other DTSECs cannot be routed to
456 fm_info_set_phy_address(i
, i
== FM1_DTSEC4
? 0 : 1);
457 mdio_mux
[i
].mask
= BRDCFG1_EMI1_SEL_MASK
;
458 mdio_mux
[i
].val
= BRDCFG1_EMI1_SEL_RGMII
|
460 hydra_mdio_set_mux("HYDRA_RGMII_MDIO",
461 mdio_mux
[i
].mask
, mdio_mux
[i
].val
);
463 miiphy_get_dev_by_name("HYDRA_RGMII_MDIO"));
465 case PHY_INTERFACE_MODE_NONE
:
466 fm_info_set_phy_address(i
, 0);
469 printf("Fman1: DTSEC%u set to unknown interface %i\n",
470 idx
+ 1, fm_info_get_enet_if(i
));
471 fm_info_set_phy_address(i
, 0);
476 bus
= miiphy_get_dev_by_name("HYDRA_SGMII_MDIO");
477 set_sgmii_phy(bus
, FM1_DTSEC1
, CONFIG_SYS_NUM_FM1_DTSEC
, PHY_BASE_ADDR
);
480 * For 10G, we only support one XAUI card per Fman. If present, then we
481 * force its routing and never touch those bits again, which removes the
482 * need for Linux to do any muxing. This works because of the way
483 * BRDCFG1 is defined, but it's a bit hackish.
485 * The PHY address for the XAUI card depends on which slot it's in. The
486 * macros we use imply that the PHY address is based on which FM, but
487 * that's not true. On the P4080DS, FM1 could only use XAUI in slot 5,
488 * and FM2 could only use a XAUI in slot 4. On the Hydra board, we
489 * check the actual slot and just use the macros as-is, even though
490 * the P3041 and P5020 only have one Fman.
492 lane
= serdes_get_first_lane(XAUI_FM1
);
494 slot
= lane_to_slot
[lane
];
496 /* XAUI card is in slot 1 */
497 clrsetbits_8(&pixis
->brdcfg1
, BRDCFG1_EMI2_SEL_MASK
,
498 BRDCFG1_EMI2_SEL_SLOT1
);
499 fm_info_set_phy_address(FM1_10GEC1
,
500 CONFIG_SYS_FM1_10GEC1_PHY_ADDR
);
502 /* XAUI card is in slot 2 */
503 clrsetbits_8(&pixis
->brdcfg1
, BRDCFG1_EMI2_SEL_MASK
,
504 BRDCFG1_EMI2_SEL_SLOT2
);
505 fm_info_set_phy_address(FM1_10GEC1
,
506 CONFIG_SYS_FM2_10GEC1_PHY_ADDR
);
510 fm_info_set_mdio(FM1_10GEC1
,
511 miiphy_get_dev_by_name(DEFAULT_FM_TGEC_MDIO_NAME
));
516 return pci_eth_init(bis
);