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> 29*8225b2fdSShaohui Xie #include <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 */ 115f1d8074cSShaveta Leekha case 0xb1: 116b5b06fb7SYork Sun case 0xb2: 117f1d8074cSShaveta Leekha case 0x8c: 118f1d8074cSShaveta 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 */ 201f1d8074cSShaveta Leekha fm_info_set_phy_address(FM1_DTSEC5, CONFIG_SYS_FM1_ONBOARD_PHY1_ADDR); 202f1d8074cSShaveta 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 */ 208f1d8074cSShaveta Leekha debug("Set phy addresses for FM1_DTSEC5:%x, FM1_DTSEC6:%x\n", 209f1d8074cSShaveta Leekha CONFIG_SYS_FM1_ONBOARD_PHY1_ADDR, 210f1d8074cSShaveta Leekha CONFIG_SYS_FM1_ONBOARD_PHY2_ADDR); 211b5b06fb7SYork Sun fm_info_set_phy_address(FM1_DTSEC5, 212f1d8074cSShaveta Leekha CONFIG_SYS_FM1_ONBOARD_PHY1_ADDR); 213b5b06fb7SYork Sun fm_info_set_phy_address(FM1_DTSEC6, 214f1d8074cSShaveta 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 */ 220f1d8074cSShaveta Leekha debug("Set phy addresses for FM1_DTSEC3:%x, FM1_DTSEC4:%x\n", 221f1d8074cSShaveta Leekha CONFIG_SYS_FM1_ONBOARD_PHY1_ADDR, 222f1d8074cSShaveta 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, 226f1d8074cSShaveta Leekha CONFIG_SYS_FM1_ONBOARD_PHY1_ADDR); 227b5b06fb7SYork Sun fm_info_set_phy_address(FM1_DTSEC4, 228f1d8074cSShaveta 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: 239f1d8074cSShaveta Leekha debug("Set phy address on SGMII Riser for FM1_DTSEC1:%x\n", 240f1d8074cSShaveta 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: 252f1d8074cSShaveta Leekha debug("Set phy address on SGMII Riser for FM1_DTSEC1:%x\n", 253f1d8074cSShaveta 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; 261f1d8074cSShaveta Leekha case 0xb1: 262b5b06fb7SYork Sun case 0xb2: 263f1d8074cSShaveta Leekha case 0x8c: 264f1d8074cSShaveta Leekha case 0x8d: 265f1d8074cSShaveta Leekha debug("Set phy addresses on SGMII Riser for FM1_DTSEC1:%x\n", 266f1d8074cSShaveta 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); 27189b94d85SShaohui Xie /* 27289b94d85SShaohui Xie * XFI does not need a PHY to work, but to make U-boot 27389b94d85SShaohui Xie * happy, assign a fake PHY address for a XFI port. 27489b94d85SShaohui Xie */ 27589b94d85SShaohui Xie fm_info_set_phy_address(FM1_10GEC1, 0); 27689b94d85SShaohui Xie fm_info_set_phy_address(FM1_10GEC2, 1); 277b5b06fb7SYork Sun break; 27816d88f41SSuresh Gupta case 0x98: 27916d88f41SSuresh Gupta /* XAUI in Slot1 and Slot2 */ 280f1d8074cSShaveta Leekha debug("Set phy address of AMC2PEX-2S for FM1_10GEC1:%x\n", 28116d88f41SSuresh Gupta CONFIG_SYS_FM1_10GEC1_PHY_ADDR); 28216d88f41SSuresh Gupta fm_info_set_phy_address(FM1_10GEC1, 28316d88f41SSuresh Gupta CONFIG_SYS_FM1_10GEC1_PHY_ADDR); 284f1d8074cSShaveta Leekha debug("Set phy address of AMC2PEX-2S for FM1_10GEC2:%x\n", 28516d88f41SSuresh Gupta CONFIG_SYS_FM1_10GEC2_PHY_ADDR); 28616d88f41SSuresh Gupta fm_info_set_phy_address(FM1_10GEC2, 28716d88f41SSuresh Gupta CONFIG_SYS_FM1_10GEC2_PHY_ADDR); 28816d88f41SSuresh Gupta break; 28916d88f41SSuresh Gupta case 0x9E: 29016d88f41SSuresh Gupta /* XAUI in Slot2 */ 291f1d8074cSShaveta Leekha debug("Sett phy address of AMC2PEX-2S for FM1_10GEC2:%x\n", 29216d88f41SSuresh Gupta CONFIG_SYS_FM1_10GEC2_PHY_ADDR); 29316d88f41SSuresh Gupta fm_info_set_phy_address(FM1_10GEC2, 29416d88f41SSuresh Gupta CONFIG_SYS_FM1_10GEC2_PHY_ADDR); 29516d88f41SSuresh Gupta break; 296b5b06fb7SYork Sun default: 297b5b06fb7SYork Sun printf("Fman: Unsupported SerDes2 Protocol 0x%02x\n", 298b5b06fb7SYork Sun serdes2_prtcl); 299b5b06fb7SYork Sun break; 300b5b06fb7SYork Sun } 301b5b06fb7SYork Sun 302ffee1ddeSZhao Qiang /*set PHY address for QSGMII Riser Card on slot2*/ 303ffee1ddeSZhao Qiang bus = miiphy_get_dev_by_name(DEFAULT_FM_MDIO_NAME); 304ffee1ddeSZhao Qiang qsgmii = is_qsgmii_riser_card(bus, PHY_BASE_ADDR, PORT_NUM, REGNUM); 305ffee1ddeSZhao Qiang 306ffee1ddeSZhao Qiang if (qsgmii) { 307ffee1ddeSZhao Qiang switch (serdes2_prtcl) { 308ffee1ddeSZhao Qiang case 0xb2: 309ffee1ddeSZhao Qiang case 0x8d: 310ffee1ddeSZhao Qiang fm_info_set_phy_address(FM1_DTSEC3, PHY_BASE_ADDR); 311ffee1ddeSZhao Qiang fm_info_set_phy_address(FM1_DTSEC4, PHY_BASE_ADDR + 1); 312ffee1ddeSZhao Qiang break; 313ffee1ddeSZhao Qiang default: 314ffee1ddeSZhao Qiang break; 315ffee1ddeSZhao Qiang } 316ffee1ddeSZhao Qiang } 317ffee1ddeSZhao Qiang 318b5b06fb7SYork Sun for (i = FM1_DTSEC1; i < FM1_DTSEC1 + CONFIG_SYS_NUM_FM1_DTSEC; i++) { 319b5b06fb7SYork Sun int idx = i - FM1_DTSEC1; 320b5b06fb7SYork Sun 321b5b06fb7SYork Sun switch (fm_info_get_enet_if(i)) { 322b5b06fb7SYork Sun case PHY_INTERFACE_MODE_SGMII: 323b5b06fb7SYork Sun fm_info_set_mdio(i, 324b5b06fb7SYork Sun miiphy_get_dev_by_name(DEFAULT_FM_MDIO_NAME)); 325b5b06fb7SYork Sun break; 326b5b06fb7SYork Sun case PHY_INTERFACE_MODE_NONE: 327b5b06fb7SYork Sun fm_info_set_phy_address(i, 0); 328b5b06fb7SYork Sun break; 329b5b06fb7SYork Sun default: 330b5b06fb7SYork Sun printf("Fman1: DTSEC%u set to unknown interface %i\n", 331b5b06fb7SYork Sun idx + 1, fm_info_get_enet_if(i)); 332b5b06fb7SYork Sun fm_info_set_phy_address(i, 0); 333b5b06fb7SYork Sun break; 334b5b06fb7SYork Sun } 335b5b06fb7SYork Sun } 336b5b06fb7SYork Sun 33716d88f41SSuresh Gupta for (i = FM1_10GEC1; i < FM1_10GEC1 + CONFIG_SYS_NUM_FM1_10GEC; i++) { 33816d88f41SSuresh Gupta int idx = i - FM1_10GEC1; 33916d88f41SSuresh Gupta 34016d88f41SSuresh Gupta switch (fm_info_get_enet_if(i)) { 34116d88f41SSuresh Gupta case PHY_INTERFACE_MODE_XGMII: 34216d88f41SSuresh Gupta fm_info_set_mdio(i, 343f1d8074cSShaveta Leekha miiphy_get_dev_by_name 344f1d8074cSShaveta Leekha (DEFAULT_FM_TGEC_MDIO_NAME)); 345f1d8074cSShaveta Leekha break; 346f1d8074cSShaveta Leekha case PHY_INTERFACE_MODE_NONE: 347f1d8074cSShaveta Leekha fm_info_set_phy_address(i, 0); 34816d88f41SSuresh Gupta break; 34916d88f41SSuresh Gupta default: 350f1d8074cSShaveta Leekha printf("Fman1: TGEC%u set to unknown interface %i\n", 35116d88f41SSuresh Gupta idx + 1, fm_info_get_enet_if(i)); 35216d88f41SSuresh Gupta fm_info_set_phy_address(i, 0); 35316d88f41SSuresh Gupta break; 35416d88f41SSuresh Gupta } 35516d88f41SSuresh Gupta } 35616d88f41SSuresh Gupta 357b5b06fb7SYork Sun cpu_eth_init(bis); 358b5b06fb7SYork Sun #endif 359b5b06fb7SYork Sun 360b5b06fb7SYork Sun return pci_eth_init(bis); 361b5b06fb7SYork Sun } 362b5b06fb7SYork Sun 363b5b06fb7SYork Sun void board_ft_fman_fixup_port(void *fdt, char *compat, phys_addr_t addr, 364b5b06fb7SYork Sun enum fm_port port, int offset) 365b5b06fb7SYork Sun { 366b5b06fb7SYork Sun int phy; 367b5b06fb7SYork Sun char alias[32]; 36890e80dc6SShaohui Xie struct fixed_link f_link; 36990e80dc6SShaohui Xie ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); 37090e80dc6SShaohui Xie u32 prtcl2 = in_be32(&gur->rcwsr[4]) & FSL_CORENET2_RCWSR4_SRDS2_PRTCL; 37190e80dc6SShaohui Xie 37290e80dc6SShaohui Xie prtcl2 >>= FSL_CORENET2_RCWSR4_SRDS2_PRTCL_SHIFT; 373b5b06fb7SYork Sun 374b5b06fb7SYork Sun if (fm_info_get_enet_if(port) == PHY_INTERFACE_MODE_SGMII) { 375b5b06fb7SYork Sun phy = fm_info_get_phy_address(port); 376b5b06fb7SYork Sun 377b5b06fb7SYork Sun sprintf(alias, "phy_sgmii_%x", phy); 378b5b06fb7SYork Sun fdt_set_phy_handle(fdt, compat, addr, alias); 379f1d8074cSShaveta Leekha fdt_status_okay_by_alias(fdt, alias); 38090e80dc6SShaohui Xie } else if (fm_info_get_enet_if(port) == PHY_INTERFACE_MODE_XGMII) { 38190e80dc6SShaohui Xie /* check if it's XFI interface for 10g */ 38290e80dc6SShaohui Xie switch (prtcl2) { 38390e80dc6SShaohui Xie case 0x80: 38490e80dc6SShaohui Xie case 0x81: 38590e80dc6SShaohui Xie case 0x82: 38690e80dc6SShaohui Xie case 0x83: 38790e80dc6SShaohui Xie case 0x84: 38890e80dc6SShaohui Xie case 0x85: 38990e80dc6SShaohui Xie case 0x86: 39090e80dc6SShaohui Xie case 0x87: 39190e80dc6SShaohui Xie case 0x88: 39290e80dc6SShaohui Xie case 0x89: 39390e80dc6SShaohui Xie case 0x8a: 39490e80dc6SShaohui Xie case 0x8b: 39590e80dc6SShaohui Xie case 0x8c: 39690e80dc6SShaohui Xie case 0x8d: 39790e80dc6SShaohui Xie case 0x8e: 39890e80dc6SShaohui Xie case 0xb1: 39990e80dc6SShaohui Xie case 0xb2: 40090e80dc6SShaohui Xie f_link.phy_id = port; 40190e80dc6SShaohui Xie f_link.duplex = 1; 40290e80dc6SShaohui Xie f_link.link_speed = 10000; 40390e80dc6SShaohui Xie f_link.pause = 0; 40490e80dc6SShaohui Xie f_link.asym_pause = 0; 40590e80dc6SShaohui Xie 40690e80dc6SShaohui Xie fdt_delprop(fdt, offset, "phy-handle"); 40790e80dc6SShaohui Xie fdt_setprop(fdt, offset, "fixed-link", &f_link, 40890e80dc6SShaohui Xie sizeof(f_link)); 40990e80dc6SShaohui Xie break; 410e2544e7aSSuresh Gupta case 0x98: /* XAUI interface */ 411e2544e7aSSuresh Gupta sprintf(alias, "phy_xaui_slot1"); 412e2544e7aSSuresh Gupta fdt_status_okay_by_alias(fdt, alias); 413e2544e7aSSuresh Gupta 414e2544e7aSSuresh Gupta sprintf(alias, "phy_xaui_slot2"); 415e2544e7aSSuresh Gupta fdt_status_okay_by_alias(fdt, alias); 416e2544e7aSSuresh Gupta break; 417e2544e7aSSuresh Gupta case 0x9e: /* XAUI interface */ 418e2544e7aSSuresh Gupta case 0x9a: 419e2544e7aSSuresh Gupta case 0x93: 420e2544e7aSSuresh Gupta case 0x91: 421e2544e7aSSuresh Gupta sprintf(alias, "phy_xaui_slot1"); 422e2544e7aSSuresh Gupta fdt_status_okay_by_alias(fdt, alias); 423e2544e7aSSuresh Gupta break; 424e2544e7aSSuresh Gupta case 0x97: /* XAUI interface */ 425e2544e7aSSuresh Gupta case 0xc3: 426e2544e7aSSuresh Gupta sprintf(alias, "phy_xaui_slot2"); 427e2544e7aSSuresh Gupta fdt_status_okay_by_alias(fdt, alias); 428e2544e7aSSuresh Gupta break; 42990e80dc6SShaohui Xie default: 43090e80dc6SShaohui Xie break; 43190e80dc6SShaohui Xie } 432b5b06fb7SYork Sun } 433b5b06fb7SYork Sun } 434b5b06fb7SYork Sun 435f1d8074cSShaveta Leekha /* 436f1d8074cSShaveta Leekha * Set status to disabled for unused ethernet node 437f1d8074cSShaveta Leekha */ 438b5b06fb7SYork Sun void fdt_fixup_board_enet(void *fdt) 439b5b06fb7SYork Sun { 440b5b06fb7SYork Sun int i; 441b5b06fb7SYork Sun char alias[32]; 442b5b06fb7SYork Sun 443f1d8074cSShaveta Leekha for (i = FM1_DTSEC1; i <= FM1_10GEC2; i++) { 444b5b06fb7SYork Sun switch (fm_info_get_enet_if(i)) { 445b5b06fb7SYork Sun case PHY_INTERFACE_MODE_NONE: 446b5b06fb7SYork Sun sprintf(alias, "ethernet%u", i); 447b5b06fb7SYork Sun fdt_status_disabled_by_alias(fdt, alias); 448b5b06fb7SYork Sun break; 449b5b06fb7SYork Sun default: 450b5b06fb7SYork Sun break; 451b5b06fb7SYork Sun } 452b5b06fb7SYork Sun } 453b5b06fb7SYork Sun } 454