1b5b06fb7SYork Sun /* 2b5b06fb7SYork Sun * Copyright 2012 Freescale Semiconductor, Inc. 3b5b06fb7SYork Sun * Author: Sandeep Kumar Singh <sandeep@freescale.com> 4b5b06fb7SYork Sun * 51a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 6b5b06fb7SYork Sun */ 7b5b06fb7SYork Sun 8b5b06fb7SYork Sun /* This file is based on board/freescale/corenet_ds/eth_superhydra.c */ 9b5b06fb7SYork Sun 10b5b06fb7SYork Sun /* 11b5b06fb7SYork Sun * This file handles the board muxing between the Fman Ethernet MACs and 12b5b06fb7SYork Sun * the RGMII/SGMII/XGMII PHYs on a Freescale B4860 "Centaur". The SGMII 13b5b06fb7SYork Sun * PHYs are the two on-board 1Gb ports. There are no RGMII PHY on board. 14b5b06fb7SYork Sun * The 10Gb XGMII PHY is provided via the XAUI riser card. There is only 15b5b06fb7SYork Sun * one Fman device on B4860. The SERDES configuration is used to determine 16b5b06fb7SYork Sun * where the SGMII and XAUI cards exist, and also which Fman MACs are routed 17b5b06fb7SYork Sun * to which PHYs. So for a given Fman MAC, there is one and only PHY it 18b5b06fb7SYork Sun * connects to. MACs cannot be routed to PHYs dynamically. This configuration 19b5b06fb7SYork Sun * is done at boot time by reading SERDES protocol from RCW. 20b5b06fb7SYork Sun */ 21b5b06fb7SYork Sun 22b5b06fb7SYork Sun #include <common.h> 23b5b06fb7SYork Sun #include <netdev.h> 24b5b06fb7SYork Sun #include <asm/fsl_serdes.h> 25b5b06fb7SYork Sun #include <fm_eth.h> 26b5b06fb7SYork Sun #include <fsl_mdio.h> 27b5b06fb7SYork Sun #include <malloc.h> 28b5b06fb7SYork Sun #include <fdt_support.h> 29b5b06fb7SYork Sun #include <asm/fsl_dtsec.h> 30b5b06fb7SYork Sun 31b5b06fb7SYork Sun #include "../common/ngpixis.h" 32b5b06fb7SYork Sun #include "../common/fman.h" 33b5b06fb7SYork Sun #include "../common/qixis.h" 34b5b06fb7SYork Sun #include "b4860qds_qixis.h" 35b5b06fb7SYork Sun 36b5b06fb7SYork Sun #define EMI_NONE 0xFFFFFFFF 37b5b06fb7SYork Sun 38b5b06fb7SYork Sun #ifdef CONFIG_FMAN_ENET 39b5b06fb7SYork Sun 40b5b06fb7SYork Sun /* 41b5b06fb7SYork Sun * Mapping of all 16 SERDES lanes to board slots. A value n(>0) will mean that 42b5b06fb7SYork Sun * lane at index is mapped to slot number n. A value of '0' will mean 43b5b06fb7SYork Sun * that the mapping must be determined dynamically, or that the lane maps to 44b5b06fb7SYork Sun * something other than a board slot 45b5b06fb7SYork Sun */ 46b5b06fb7SYork Sun static u8 lane_to_slot[] = { 47b5b06fb7SYork Sun 0, 0, 0, 0, 48b5b06fb7SYork Sun 0, 0, 0, 0, 49b5b06fb7SYork Sun 1, 1, 1, 1, 50b5b06fb7SYork Sun 0, 0, 0, 0 51b5b06fb7SYork Sun }; 52b5b06fb7SYork Sun 53b5b06fb7SYork Sun /* 54b5b06fb7SYork Sun * This function initializes the lane_to_slot[] array. It reads RCW to check 55b5b06fb7SYork Sun * if Serdes2{E,F,G,H} is configured as slot 2 or as SFP and initializes 56b5b06fb7SYork Sun * lane_to_slot[] accordingly 57b5b06fb7SYork Sun */ 58b5b06fb7SYork Sun static void initialize_lane_to_slot(void) 59b5b06fb7SYork Sun { 60b5b06fb7SYork Sun unsigned int serdes2_prtcl; 61b5b06fb7SYork Sun ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); 62b5b06fb7SYork Sun serdes2_prtcl = in_be32(&gur->rcwsr[4]) & 63b5b06fb7SYork Sun FSL_CORENET2_RCWSR4_SRDS2_PRTCL; 64b5b06fb7SYork Sun serdes2_prtcl >>= FSL_CORENET2_RCWSR4_SRDS2_PRTCL_SHIFT; 65b5b06fb7SYork Sun debug("Initializing lane to slot: Serdes2 protocol: %x\n", 66b5b06fb7SYork Sun serdes2_prtcl); 67b5b06fb7SYork Sun 68b5b06fb7SYork Sun switch (serdes2_prtcl) { 69c7d506d4Spoonam aggrwal case 0x17: 70b5b06fb7SYork Sun case 0x18: 71b5b06fb7SYork Sun /* 72b5b06fb7SYork Sun * Configuration: 73b5b06fb7SYork Sun * SERDES: 2 74b5b06fb7SYork Sun * Lanes: A,B,C,D: SGMII 75b5b06fb7SYork Sun * Lanes: E,F: Aur 76b5b06fb7SYork Sun * Lanes: G,H: SRIO 77b5b06fb7SYork Sun */ 78b5b06fb7SYork Sun case 0x91: 79b5b06fb7SYork Sun /* 80b5b06fb7SYork Sun * Configuration: 81b5b06fb7SYork Sun * SERDES: 2 82b5b06fb7SYork Sun * Lanes: A,B: SGMII 83b5b06fb7SYork Sun * Lanes: C,D: SRIO2 84b5b06fb7SYork Sun * Lanes: E,F,G,H: XAUI2 85b5b06fb7SYork Sun */ 86b5b06fb7SYork Sun case 0x93: 87b5b06fb7SYork Sun /* 88b5b06fb7SYork Sun * Configuration: 89b5b06fb7SYork Sun * SERDES: 2 90b5b06fb7SYork Sun * Lanes: A,B,C,D: SGMII 91b5b06fb7SYork Sun * Lanes: E,F,G,H: XAUI2 92b5b06fb7SYork Sun */ 93b5b06fb7SYork Sun case 0x98: 94b5b06fb7SYork Sun /* 95b5b06fb7SYork Sun * Configuration: 96b5b06fb7SYork Sun * SERDES: 2 97b5b06fb7SYork Sun * Lanes: A,B,C,D: XAUI2 98b5b06fb7SYork Sun * Lanes: E,F,G,H: XAUI2 99b5b06fb7SYork Sun */ 100b5b06fb7SYork Sun case 0x9a: 101b5b06fb7SYork Sun /* 102b5b06fb7SYork Sun * Configuration: 103b5b06fb7SYork Sun * SERDES: 2 104b5b06fb7SYork Sun * Lanes: A,B: PCI 105b5b06fb7SYork Sun * Lanes: C,D: SGMII 106b5b06fb7SYork Sun * Lanes: E,F,G,H: XAUI2 107b5b06fb7SYork Sun */ 108b5b06fb7SYork Sun case 0x9e: 109b5b06fb7SYork Sun /* 110b5b06fb7SYork Sun * Configuration: 111b5b06fb7SYork Sun * SERDES: 2 112b5b06fb7SYork Sun * Lanes: A,B,C,D: PCI 113b5b06fb7SYork Sun * Lanes: E,F,G,H: XAUI2 114b5b06fb7SYork Sun */ 115*f1d8074cSShaveta Leekha case 0xb1: 116b5b06fb7SYork Sun case 0xb2: 117*f1d8074cSShaveta Leekha case 0x8c: 118*f1d8074cSShaveta Leekha case 0x8d: 119b5b06fb7SYork Sun /* 120b5b06fb7SYork Sun * Configuration: 121b5b06fb7SYork Sun * SERDES: 2 122b5b06fb7SYork Sun * Lanes: A,B,C,D: PCI 123b5b06fb7SYork Sun * Lanes: E,F: SGMII 3&4 124b5b06fb7SYork Sun * Lanes: G,H: XFI 125b5b06fb7SYork Sun */ 126b5b06fb7SYork Sun case 0xc2: 127b5b06fb7SYork Sun /* 128b5b06fb7SYork Sun * Configuration: 129b5b06fb7SYork Sun * SERDES: 2 130b5b06fb7SYork Sun * Lanes: A,B: SGMII 131b5b06fb7SYork Sun * Lanes: C,D: SRIO2 132b5b06fb7SYork Sun * Lanes: E,F,G,H: XAUI2 133b5b06fb7SYork Sun */ 134b5b06fb7SYork Sun lane_to_slot[12] = 2; 135b5b06fb7SYork Sun lane_to_slot[13] = lane_to_slot[12]; 136b5b06fb7SYork Sun lane_to_slot[14] = lane_to_slot[12]; 137b5b06fb7SYork Sun lane_to_slot[15] = lane_to_slot[12]; 138b5b06fb7SYork Sun break; 139b5b06fb7SYork Sun 140b5b06fb7SYork Sun default: 141b5b06fb7SYork Sun printf("Fman: Unsupported SerDes2 Protocol 0x%02x\n", 142b5b06fb7SYork Sun serdes2_prtcl); 143b5b06fb7SYork Sun break; 144b5b06fb7SYork Sun } 145b5b06fb7SYork Sun return; 146b5b06fb7SYork Sun } 147b5b06fb7SYork Sun 148b5b06fb7SYork Sun #endif /* #ifdef CONFIG_FMAN_ENET */ 149b5b06fb7SYork Sun 150b5b06fb7SYork Sun int board_eth_init(bd_t *bis) 151b5b06fb7SYork Sun { 152b5b06fb7SYork Sun #ifdef CONFIG_FMAN_ENET 153b5b06fb7SYork Sun struct memac_mdio_info memac_mdio_info; 154b5b06fb7SYork Sun struct memac_mdio_info tg_memac_mdio_info; 155b5b06fb7SYork Sun unsigned int i; 156b5b06fb7SYork Sun unsigned int serdes1_prtcl, serdes2_prtcl; 157ffee1ddeSZhao Qiang int qsgmii; 158ffee1ddeSZhao Qiang struct mii_dev *bus; 159b5b06fb7SYork Sun ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); 160b5b06fb7SYork Sun serdes1_prtcl = in_be32(&gur->rcwsr[4]) & 161b5b06fb7SYork Sun FSL_CORENET2_RCWSR4_SRDS1_PRTCL; 162b5b06fb7SYork Sun if (!serdes1_prtcl) { 163b5b06fb7SYork Sun printf("SERDES1 is not enabled\n"); 164b5b06fb7SYork Sun return 0; 165b5b06fb7SYork Sun } 166b5b06fb7SYork Sun serdes1_prtcl >>= FSL_CORENET2_RCWSR4_SRDS1_PRTCL_SHIFT; 167b5b06fb7SYork Sun debug("Using SERDES1 Protocol: 0x%x:\n", serdes1_prtcl); 168b5b06fb7SYork Sun 169b5b06fb7SYork Sun serdes2_prtcl = in_be32(&gur->rcwsr[4]) & 170b5b06fb7SYork Sun FSL_CORENET2_RCWSR4_SRDS2_PRTCL; 171b5b06fb7SYork Sun if (!serdes2_prtcl) { 172b5b06fb7SYork Sun printf("SERDES2 is not enabled\n"); 173b5b06fb7SYork Sun return 0; 174b5b06fb7SYork Sun } 175b5b06fb7SYork Sun serdes2_prtcl >>= FSL_CORENET2_RCWSR4_SRDS2_PRTCL_SHIFT; 176b5b06fb7SYork Sun debug("Using SERDES2 Protocol: 0x%x:\n", serdes2_prtcl); 177b5b06fb7SYork Sun 178b5b06fb7SYork Sun printf("Initializing Fman\n"); 179b5b06fb7SYork Sun 180b5b06fb7SYork Sun initialize_lane_to_slot(); 181b5b06fb7SYork Sun 182b5b06fb7SYork Sun memac_mdio_info.regs = 183b5b06fb7SYork Sun (struct memac_mdio_controller *)CONFIG_SYS_FM1_DTSEC_MDIO_ADDR; 184b5b06fb7SYork Sun memac_mdio_info.name = DEFAULT_FM_MDIO_NAME; 185b5b06fb7SYork Sun 186b5b06fb7SYork Sun /* Register the real 1G MDIO bus */ 187b5b06fb7SYork Sun fm_memac_mdio_init(bis, &memac_mdio_info); 188b5b06fb7SYork Sun 189b5b06fb7SYork Sun tg_memac_mdio_info.regs = 190b5b06fb7SYork Sun (struct memac_mdio_controller *)CONFIG_SYS_FM1_TGEC_MDIO_ADDR; 191b5b06fb7SYork Sun tg_memac_mdio_info.name = DEFAULT_FM_TGEC_MDIO_NAME; 192b5b06fb7SYork Sun 193b5b06fb7SYork Sun /* Register the real 10G MDIO bus */ 194b5b06fb7SYork Sun fm_memac_mdio_init(bis, &tg_memac_mdio_info); 195b5b06fb7SYork Sun 196b5b06fb7SYork Sun /* 197b5b06fb7SYork Sun * Program the two on board DTSEC PHY addresses assuming that they are 198b5b06fb7SYork Sun * all SGMII. RGMII is not supported on this board. Setting SGMII 5 and 199b5b06fb7SYork Sun * 6 to on board SGMII phys 200b5b06fb7SYork Sun */ 201*f1d8074cSShaveta Leekha fm_info_set_phy_address(FM1_DTSEC5, CONFIG_SYS_FM1_ONBOARD_PHY1_ADDR); 202*f1d8074cSShaveta Leekha fm_info_set_phy_address(FM1_DTSEC6, CONFIG_SYS_FM1_ONBOARD_PHY2_ADDR); 203b5b06fb7SYork Sun 204b5b06fb7SYork Sun switch (serdes1_prtcl) { 205c7d506d4Spoonam aggrwal case 0x29: 206b5b06fb7SYork Sun case 0x2a: 207b5b06fb7SYork Sun /* Serdes 1: A-B SGMII, Configuring DTSEC 5 and 6 */ 208*f1d8074cSShaveta Leekha debug("Set phy addresses for FM1_DTSEC5:%x, FM1_DTSEC6:%x\n", 209*f1d8074cSShaveta Leekha CONFIG_SYS_FM1_ONBOARD_PHY1_ADDR, 210*f1d8074cSShaveta Leekha CONFIG_SYS_FM1_ONBOARD_PHY2_ADDR); 211b5b06fb7SYork Sun fm_info_set_phy_address(FM1_DTSEC5, 212*f1d8074cSShaveta Leekha CONFIG_SYS_FM1_ONBOARD_PHY1_ADDR); 213b5b06fb7SYork Sun fm_info_set_phy_address(FM1_DTSEC6, 214*f1d8074cSShaveta Leekha CONFIG_SYS_FM1_ONBOARD_PHY2_ADDR); 215b5b06fb7SYork Sun break; 216b5b06fb7SYork Sun #ifdef CONFIG_PPC_B4420 217c7d506d4Spoonam aggrwal case 0x17: 218b5b06fb7SYork Sun case 0x18: 219b5b06fb7SYork Sun /* Serdes 1: A-D SGMII, Configuring on board dual SGMII Phy */ 220*f1d8074cSShaveta Leekha debug("Set phy addresses for FM1_DTSEC3:%x, FM1_DTSEC4:%x\n", 221*f1d8074cSShaveta Leekha CONFIG_SYS_FM1_ONBOARD_PHY1_ADDR, 222*f1d8074cSShaveta Leekha CONFIG_SYS_FM1_ONBOARD_PHY2_ADDR); 223b5b06fb7SYork Sun /* Fixing Serdes clock by programming FPGA register */ 224b5b06fb7SYork Sun QIXIS_WRITE(brdcfg[4], QIXIS_SRDS1CLK_125); 225b5b06fb7SYork Sun fm_info_set_phy_address(FM1_DTSEC3, 226*f1d8074cSShaveta Leekha CONFIG_SYS_FM1_ONBOARD_PHY1_ADDR); 227b5b06fb7SYork Sun fm_info_set_phy_address(FM1_DTSEC4, 228*f1d8074cSShaveta Leekha CONFIG_SYS_FM1_ONBOARD_PHY2_ADDR); 229b5b06fb7SYork Sun break; 230b5b06fb7SYork Sun #endif 231b5b06fb7SYork Sun default: 232b5b06fb7SYork Sun printf("Fman: Unsupported SerDes1 Protocol 0x%02x\n", 233b5b06fb7SYork Sun serdes1_prtcl); 234b5b06fb7SYork Sun break; 235b5b06fb7SYork Sun } 236b5b06fb7SYork Sun switch (serdes2_prtcl) { 237c7d506d4Spoonam aggrwal case 0x17: 238b5b06fb7SYork Sun case 0x18: 239*f1d8074cSShaveta Leekha debug("Set phy address on SGMII Riser for FM1_DTSEC1:%x\n", 240*f1d8074cSShaveta Leekha CONFIG_SYS_FM1_DTSEC1_RISER_PHY_ADDR); 241b5b06fb7SYork Sun fm_info_set_phy_address(FM1_DTSEC1, 242b5b06fb7SYork Sun CONFIG_SYS_FM1_DTSEC1_RISER_PHY_ADDR); 243b5b06fb7SYork Sun fm_info_set_phy_address(FM1_DTSEC2, 244b5b06fb7SYork Sun CONFIG_SYS_FM1_DTSEC2_RISER_PHY_ADDR); 245b5b06fb7SYork Sun fm_info_set_phy_address(FM1_DTSEC3, 246b5b06fb7SYork Sun CONFIG_SYS_FM1_DTSEC3_RISER_PHY_ADDR); 247b5b06fb7SYork Sun fm_info_set_phy_address(FM1_DTSEC4, 248b5b06fb7SYork Sun CONFIG_SYS_FM1_DTSEC4_RISER_PHY_ADDR); 249b5b06fb7SYork Sun break; 250c7d506d4Spoonam aggrwal case 0x48: 251b5b06fb7SYork Sun case 0x49: 252*f1d8074cSShaveta Leekha debug("Set phy address on SGMII Riser for FM1_DTSEC1:%x\n", 253*f1d8074cSShaveta Leekha CONFIG_SYS_FM1_DTSEC1_RISER_PHY_ADDR); 254b5b06fb7SYork Sun fm_info_set_phy_address(FM1_DTSEC1, 255b5b06fb7SYork Sun CONFIG_SYS_FM1_DTSEC1_RISER_PHY_ADDR); 256b5b06fb7SYork Sun fm_info_set_phy_address(FM1_DTSEC2, 257b5b06fb7SYork Sun CONFIG_SYS_FM1_DTSEC2_RISER_PHY_ADDR); 258b5b06fb7SYork Sun fm_info_set_phy_address(FM1_DTSEC3, 259b5b06fb7SYork Sun CONFIG_SYS_FM1_DTSEC3_RISER_PHY_ADDR); 260b5b06fb7SYork Sun break; 261*f1d8074cSShaveta Leekha case 0xb1: 262b5b06fb7SYork Sun case 0xb2: 263*f1d8074cSShaveta Leekha case 0x8c: 264*f1d8074cSShaveta Leekha case 0x8d: 265*f1d8074cSShaveta Leekha debug("Set phy addresses on SGMII Riser for FM1_DTSEC1:%x\n", 266*f1d8074cSShaveta Leekha CONFIG_SYS_FM1_DTSEC1_RISER_PHY_ADDR); 267b5b06fb7SYork Sun fm_info_set_phy_address(FM1_DTSEC3, 268b5b06fb7SYork Sun CONFIG_SYS_FM1_DTSEC1_RISER_PHY_ADDR); 269b5b06fb7SYork Sun fm_info_set_phy_address(FM1_DTSEC4, 270b5b06fb7SYork Sun CONFIG_SYS_FM1_DTSEC2_RISER_PHY_ADDR); 271b5b06fb7SYork Sun break; 27216d88f41SSuresh Gupta case 0x98: 27316d88f41SSuresh Gupta /* XAUI in Slot1 and Slot2 */ 274*f1d8074cSShaveta Leekha debug("Set phy address of AMC2PEX-2S for FM1_10GEC1:%x\n", 27516d88f41SSuresh Gupta CONFIG_SYS_FM1_10GEC1_PHY_ADDR); 27616d88f41SSuresh Gupta fm_info_set_phy_address(FM1_10GEC1, 27716d88f41SSuresh Gupta CONFIG_SYS_FM1_10GEC1_PHY_ADDR); 278*f1d8074cSShaveta Leekha debug("Set phy address of AMC2PEX-2S for FM1_10GEC2:%x\n", 27916d88f41SSuresh Gupta CONFIG_SYS_FM1_10GEC2_PHY_ADDR); 28016d88f41SSuresh Gupta fm_info_set_phy_address(FM1_10GEC2, 28116d88f41SSuresh Gupta CONFIG_SYS_FM1_10GEC2_PHY_ADDR); 28216d88f41SSuresh Gupta break; 28316d88f41SSuresh Gupta case 0x9E: 28416d88f41SSuresh Gupta /* XAUI in Slot2 */ 285*f1d8074cSShaveta Leekha debug("Sett phy address of AMC2PEX-2S for FM1_10GEC2:%x\n", 28616d88f41SSuresh Gupta CONFIG_SYS_FM1_10GEC2_PHY_ADDR); 28716d88f41SSuresh Gupta fm_info_set_phy_address(FM1_10GEC2, 28816d88f41SSuresh Gupta CONFIG_SYS_FM1_10GEC2_PHY_ADDR); 28916d88f41SSuresh Gupta break; 290b5b06fb7SYork Sun default: 291b5b06fb7SYork Sun printf("Fman: Unsupported SerDes2 Protocol 0x%02x\n", 292b5b06fb7SYork Sun serdes2_prtcl); 293b5b06fb7SYork Sun break; 294b5b06fb7SYork Sun } 295b5b06fb7SYork Sun 296ffee1ddeSZhao Qiang /*set PHY address for QSGMII Riser Card on slot2*/ 297ffee1ddeSZhao Qiang bus = miiphy_get_dev_by_name(DEFAULT_FM_MDIO_NAME); 298ffee1ddeSZhao Qiang qsgmii = is_qsgmii_riser_card(bus, PHY_BASE_ADDR, PORT_NUM, REGNUM); 299ffee1ddeSZhao Qiang 300ffee1ddeSZhao Qiang if (qsgmii) { 301ffee1ddeSZhao Qiang switch (serdes2_prtcl) { 302ffee1ddeSZhao Qiang case 0xb2: 303ffee1ddeSZhao Qiang case 0x8d: 304ffee1ddeSZhao Qiang fm_info_set_phy_address(FM1_DTSEC3, PHY_BASE_ADDR); 305ffee1ddeSZhao Qiang fm_info_set_phy_address(FM1_DTSEC4, PHY_BASE_ADDR + 1); 306ffee1ddeSZhao Qiang break; 307ffee1ddeSZhao Qiang default: 308ffee1ddeSZhao Qiang break; 309ffee1ddeSZhao Qiang } 310ffee1ddeSZhao Qiang } 311ffee1ddeSZhao Qiang 312b5b06fb7SYork Sun for (i = FM1_DTSEC1; i < FM1_DTSEC1 + CONFIG_SYS_NUM_FM1_DTSEC; i++) { 313b5b06fb7SYork Sun int idx = i - FM1_DTSEC1; 314b5b06fb7SYork Sun 315b5b06fb7SYork Sun switch (fm_info_get_enet_if(i)) { 316b5b06fb7SYork Sun case PHY_INTERFACE_MODE_SGMII: 317b5b06fb7SYork Sun fm_info_set_mdio(i, 318b5b06fb7SYork Sun miiphy_get_dev_by_name(DEFAULT_FM_MDIO_NAME)); 319b5b06fb7SYork Sun break; 320b5b06fb7SYork Sun case PHY_INTERFACE_MODE_NONE: 321b5b06fb7SYork Sun fm_info_set_phy_address(i, 0); 322b5b06fb7SYork Sun break; 323b5b06fb7SYork Sun default: 324b5b06fb7SYork Sun printf("Fman1: DTSEC%u set to unknown interface %i\n", 325b5b06fb7SYork Sun idx + 1, fm_info_get_enet_if(i)); 326b5b06fb7SYork Sun fm_info_set_phy_address(i, 0); 327b5b06fb7SYork Sun break; 328b5b06fb7SYork Sun } 329b5b06fb7SYork Sun } 330b5b06fb7SYork Sun 33116d88f41SSuresh Gupta for (i = FM1_10GEC1; i < FM1_10GEC1 + CONFIG_SYS_NUM_FM1_10GEC; i++) { 33216d88f41SSuresh Gupta int idx = i - FM1_10GEC1; 33316d88f41SSuresh Gupta 33416d88f41SSuresh Gupta switch (fm_info_get_enet_if(i)) { 33516d88f41SSuresh Gupta case PHY_INTERFACE_MODE_XGMII: 33616d88f41SSuresh Gupta fm_info_set_mdio(i, 337*f1d8074cSShaveta Leekha miiphy_get_dev_by_name 338*f1d8074cSShaveta Leekha (DEFAULT_FM_TGEC_MDIO_NAME)); 339*f1d8074cSShaveta Leekha break; 340*f1d8074cSShaveta Leekha case PHY_INTERFACE_MODE_NONE: 341*f1d8074cSShaveta Leekha fm_info_set_phy_address(i, 0); 34216d88f41SSuresh Gupta break; 34316d88f41SSuresh Gupta default: 344*f1d8074cSShaveta Leekha printf("Fman1: TGEC%u set to unknown interface %i\n", 34516d88f41SSuresh Gupta idx + 1, fm_info_get_enet_if(i)); 34616d88f41SSuresh Gupta fm_info_set_phy_address(i, 0); 34716d88f41SSuresh Gupta break; 34816d88f41SSuresh Gupta } 34916d88f41SSuresh Gupta } 35016d88f41SSuresh Gupta 351b5b06fb7SYork Sun cpu_eth_init(bis); 352b5b06fb7SYork Sun #endif 353b5b06fb7SYork Sun 354b5b06fb7SYork Sun return pci_eth_init(bis); 355b5b06fb7SYork Sun } 356b5b06fb7SYork Sun 357b5b06fb7SYork Sun void board_ft_fman_fixup_port(void *fdt, char *compat, phys_addr_t addr, 358b5b06fb7SYork Sun enum fm_port port, int offset) 359b5b06fb7SYork Sun { 360b5b06fb7SYork Sun int phy; 361b5b06fb7SYork Sun char alias[32]; 362b5b06fb7SYork Sun 363b5b06fb7SYork Sun if (fm_info_get_enet_if(port) == PHY_INTERFACE_MODE_SGMII) { 364b5b06fb7SYork Sun phy = fm_info_get_phy_address(port); 365b5b06fb7SYork Sun 366b5b06fb7SYork Sun sprintf(alias, "phy_sgmii_%x", phy); 367b5b06fb7SYork Sun fdt_set_phy_handle(fdt, compat, addr, alias); 368*f1d8074cSShaveta Leekha fdt_status_okay_by_alias(fdt, alias); 369b5b06fb7SYork Sun } 370b5b06fb7SYork Sun } 371b5b06fb7SYork Sun 372*f1d8074cSShaveta Leekha /* 373*f1d8074cSShaveta Leekha * Set status to disabled for unused ethernet node 374*f1d8074cSShaveta Leekha */ 375b5b06fb7SYork Sun void fdt_fixup_board_enet(void *fdt) 376b5b06fb7SYork Sun { 377b5b06fb7SYork Sun int i; 378b5b06fb7SYork Sun char alias[32]; 379b5b06fb7SYork Sun 380*f1d8074cSShaveta Leekha for (i = FM1_DTSEC1; i <= FM1_10GEC2; i++) { 381b5b06fb7SYork Sun switch (fm_info_get_enet_if(i)) { 382b5b06fb7SYork Sun case PHY_INTERFACE_MODE_NONE: 383b5b06fb7SYork Sun sprintf(alias, "ethernet%u", i); 384b5b06fb7SYork Sun fdt_status_disabled_by_alias(fdt, alias); 385b5b06fb7SYork Sun break; 386b5b06fb7SYork Sun default: 387b5b06fb7SYork Sun break; 388b5b06fb7SYork Sun } 389b5b06fb7SYork Sun } 390b5b06fb7SYork Sun } 391