1 /* 2 * Copyright 2012 Freescale Semiconductor, Inc. 3 * 4 * See file CREDITS for list of people who contributed to this 5 * project. 6 * 7 * This program is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU General Public License as 9 * published by the Free Software Foundation; either version 2 of 10 * the License, or (at your option) any later version. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this program; if not, write to the Free Software 19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 20 * MA 02111-1307 USA 21 */ 22 23 #include <common.h> 24 #include <command.h> 25 #include <netdev.h> 26 #include <asm/mmu.h> 27 #include <asm/processor.h> 28 #include <asm/cache.h> 29 #include <asm/immap_85xx.h> 30 #include <asm/fsl_law.h> 31 #include <asm/fsl_ddr_sdram.h> 32 #include <asm/fsl_serdes.h> 33 #include <asm/fsl_portals.h> 34 #include <asm/fsl_liodn.h> 35 #include <malloc.h> 36 #include <fm_eth.h> 37 #include <fsl_mdio.h> 38 #include <miiphy.h> 39 #include <phy.h> 40 #include <asm/fsl_dtsec.h> 41 #include <asm/fsl_serdes.h> 42 #include "../common/qixis.h" 43 #include "../common/fman.h" 44 45 #include "t4240qds_qixis.h" 46 47 #define EMI_NONE 0xFFFFFFFF 48 #define EMI1_RGMII 0 49 #define EMI1_SLOT1 1 50 #define EMI1_SLOT2 2 51 #define EMI1_SLOT3 3 52 #define EMI1_SLOT4 4 53 #define EMI1_SLOT5 5 54 #define EMI1_SLOT7 7 55 #define EMI2 8 56 /* Slot6 and Slot8 do not have EMI connections */ 57 58 static int mdio_mux[NUM_FM_PORTS]; 59 60 static const char *mdio_names[] = { 61 "T4240QDS_MDIO0", 62 "T4240QDS_MDIO1", 63 "T4240QDS_MDIO2", 64 "T4240QDS_MDIO3", 65 "T4240QDS_MDIO4", 66 "T4240QDS_MDIO5", 67 "NULL", 68 "T4240QDS_MDIO7", 69 "T4240QDS_10GC", 70 }; 71 72 static u8 lane_to_slot_fsm1[] = {1, 1, 1, 1, 2, 2, 2, 2}; 73 static u8 lane_to_slot_fsm2[] = {3, 3, 3, 3, 4, 4, 4, 4}; 74 static u8 slot_qsgmii_phyaddr[5][4] = { 75 {0, 0, 0, 0},/* not used, to make index match slot No. */ 76 {0, 1, 2, 3}, 77 {4, 5, 6, 7}, 78 {8, 9, 0xa, 0xb}, 79 {0xc, 0xd, 0xe, 0xf}, 80 }; 81 static u8 qsgmiiphy_fix[NUM_FM_PORTS] = {0}; 82 83 static const char *t4240qds_mdio_name_for_muxval(u8 muxval) 84 { 85 return mdio_names[muxval]; 86 } 87 88 struct mii_dev *mii_dev_for_muxval(u8 muxval) 89 { 90 struct mii_dev *bus; 91 const char *name = t4240qds_mdio_name_for_muxval(muxval); 92 93 if (!name) { 94 printf("No bus for muxval %x\n", muxval); 95 return NULL; 96 } 97 98 bus = miiphy_get_dev_by_name(name); 99 100 if (!bus) { 101 printf("No bus by name %s\n", name); 102 return NULL; 103 } 104 105 return bus; 106 } 107 108 struct t4240qds_mdio { 109 u8 muxval; 110 struct mii_dev *realbus; 111 }; 112 113 static void t4240qds_mux_mdio(u8 muxval) 114 { 115 u8 brdcfg4; 116 if ((muxval < 6) || (muxval == 7)) { 117 brdcfg4 = QIXIS_READ(brdcfg[4]); 118 brdcfg4 &= ~BRDCFG4_EMISEL_MASK; 119 brdcfg4 |= (muxval << BRDCFG4_EMISEL_SHIFT); 120 QIXIS_WRITE(brdcfg[4], brdcfg4); 121 } 122 } 123 124 static int t4240qds_mdio_read(struct mii_dev *bus, int addr, int devad, 125 int regnum) 126 { 127 struct t4240qds_mdio *priv = bus->priv; 128 129 t4240qds_mux_mdio(priv->muxval); 130 131 return priv->realbus->read(priv->realbus, addr, devad, regnum); 132 } 133 134 static int t4240qds_mdio_write(struct mii_dev *bus, int addr, int devad, 135 int regnum, u16 value) 136 { 137 struct t4240qds_mdio *priv = bus->priv; 138 139 t4240qds_mux_mdio(priv->muxval); 140 141 return priv->realbus->write(priv->realbus, addr, devad, regnum, value); 142 } 143 144 static int t4240qds_mdio_reset(struct mii_dev *bus) 145 { 146 struct t4240qds_mdio *priv = bus->priv; 147 148 return priv->realbus->reset(priv->realbus); 149 } 150 151 static int t4240qds_mdio_init(char *realbusname, u8 muxval) 152 { 153 struct t4240qds_mdio *pmdio; 154 struct mii_dev *bus = mdio_alloc(); 155 156 if (!bus) { 157 printf("Failed to allocate T4240QDS MDIO bus\n"); 158 return -1; 159 } 160 161 pmdio = malloc(sizeof(*pmdio)); 162 if (!pmdio) { 163 printf("Failed to allocate T4240QDS private data\n"); 164 free(bus); 165 return -1; 166 } 167 168 bus->read = t4240qds_mdio_read; 169 bus->write = t4240qds_mdio_write; 170 bus->reset = t4240qds_mdio_reset; 171 sprintf(bus->name, t4240qds_mdio_name_for_muxval(muxval)); 172 173 pmdio->realbus = miiphy_get_dev_by_name(realbusname); 174 175 if (!pmdio->realbus) { 176 printf("No bus with name %s\n", realbusname); 177 free(bus); 178 free(pmdio); 179 return -1; 180 } 181 182 pmdio->muxval = muxval; 183 bus->priv = pmdio; 184 185 return mdio_register(bus); 186 } 187 188 void board_ft_fman_fixup_port(void *blob, char * prop, phys_addr_t pa, 189 enum fm_port port, int offset) 190 { 191 if (fm_info_get_enet_if(port) == PHY_INTERFACE_MODE_SGMII) { 192 switch (port) { 193 case FM1_DTSEC1: 194 if (qsgmiiphy_fix[port]) 195 fdt_set_phy_handle(blob, prop, pa, 196 "sgmii_phy21"); 197 break; 198 case FM1_DTSEC2: 199 if (qsgmiiphy_fix[port]) 200 fdt_set_phy_handle(blob, prop, pa, 201 "sgmii_phy22"); 202 break; 203 case FM1_DTSEC3: 204 if (qsgmiiphy_fix[port]) 205 fdt_set_phy_handle(blob, prop, pa, 206 "sgmii_phy23"); 207 break; 208 case FM1_DTSEC4: 209 if (qsgmiiphy_fix[port]) 210 fdt_set_phy_handle(blob, prop, pa, 211 "sgmii_phy24"); 212 break; 213 case FM1_DTSEC6: 214 if (qsgmiiphy_fix[port]) 215 fdt_set_phy_handle(blob, prop, pa, 216 "sgmii_phy12"); 217 break; 218 case FM1_DTSEC9: 219 if (qsgmiiphy_fix[port]) 220 fdt_set_phy_handle(blob, prop, pa, 221 "sgmii_phy14"); 222 else 223 fdt_set_phy_handle(blob, prop, pa, 224 "phy_sgmii4"); 225 break; 226 case FM1_DTSEC10: 227 if (qsgmiiphy_fix[port]) 228 fdt_set_phy_handle(blob, prop, pa, 229 "sgmii_phy13"); 230 else 231 fdt_set_phy_handle(blob, prop, pa, 232 "phy_sgmii3"); 233 break; 234 case FM2_DTSEC1: 235 if (qsgmiiphy_fix[port]) 236 fdt_set_phy_handle(blob, prop, pa, 237 "sgmii_phy41"); 238 break; 239 case FM2_DTSEC2: 240 if (qsgmiiphy_fix[port]) 241 fdt_set_phy_handle(blob, prop, pa, 242 "sgmii_phy42"); 243 break; 244 case FM2_DTSEC3: 245 if (qsgmiiphy_fix[port]) 246 fdt_set_phy_handle(blob, prop, pa, 247 "sgmii_phy43"); 248 break; 249 case FM2_DTSEC4: 250 if (qsgmiiphy_fix[port]) 251 fdt_set_phy_handle(blob, prop, pa, 252 "sgmii_phy44"); 253 break; 254 case FM2_DTSEC6: 255 if (qsgmiiphy_fix[port]) 256 fdt_set_phy_handle(blob, prop, pa, 257 "sgmii_phy32"); 258 break; 259 case FM2_DTSEC9: 260 if (qsgmiiphy_fix[port]) 261 fdt_set_phy_handle(blob, prop, pa, 262 "sgmii_phy34"); 263 else 264 fdt_set_phy_handle(blob, prop, pa, 265 "phy_sgmii12"); 266 break; 267 case FM2_DTSEC10: 268 if (qsgmiiphy_fix[port]) 269 fdt_set_phy_handle(blob, prop, pa, 270 "sgmii_phy33"); 271 else 272 fdt_set_phy_handle(blob, prop, pa, 273 "phy_sgmii11"); 274 break; 275 default: 276 break; 277 } 278 } 279 } 280 281 void fdt_fixup_board_enet(void *fdt) 282 { 283 int i; 284 ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); 285 u32 prtcl2 = in_be32(&gur->rcwsr[4]) & FSL_CORENET2_RCWSR4_SRDS2_PRTCL; 286 287 prtcl2 >>= FSL_CORENET2_RCWSR4_SRDS2_PRTCL_SHIFT; 288 for (i = FM1_DTSEC1; i < NUM_FM_PORTS; i++) { 289 switch (fm_info_get_enet_if(i)) { 290 case PHY_INTERFACE_MODE_SGMII: 291 switch (mdio_mux[i]) { 292 case EMI1_SLOT1: 293 fdt_status_okay_by_alias(fdt, "emi1_slot1"); 294 break; 295 case EMI1_SLOT2: 296 fdt_status_okay_by_alias(fdt, "emi1_slot2"); 297 break; 298 case EMI1_SLOT3: 299 fdt_status_okay_by_alias(fdt, "emi1_slot3"); 300 break; 301 case EMI1_SLOT4: 302 fdt_status_okay_by_alias(fdt, "emi1_slot4"); 303 break; 304 default: 305 break; 306 } 307 break; 308 case PHY_INTERFACE_MODE_XGMII: 309 /* check if it's XFI interface for 10g */ 310 if ((prtcl2 == 56) || (prtcl2 == 57)) { 311 fdt_status_okay_by_alias(fdt, "emi2_xfislot3"); 312 break; 313 } 314 switch (i) { 315 case FM1_10GEC1: 316 fdt_status_okay_by_alias(fdt, "emi2_xauislot1"); 317 break; 318 case FM1_10GEC2: 319 fdt_status_okay_by_alias(fdt, "emi2_xauislot2"); 320 break; 321 case FM2_10GEC1: 322 fdt_status_okay_by_alias(fdt, "emi2_xauislot3"); 323 break; 324 case FM2_10GEC2: 325 fdt_status_okay_by_alias(fdt, "emi2_xauislot4"); 326 break; 327 default: 328 break; 329 } 330 break; 331 default: 332 break; 333 } 334 } 335 } 336 337 static void initialize_qsgmiiphy_fix(void) 338 { 339 int i; 340 unsigned short reg; 341 342 for (i = 1; i <= 4; i++) { 343 /* 344 * Try to read if a SGMII card is used, we do it slot by slot. 345 * if a SGMII PHY address is valid on a slot, then we mark 346 * all ports on the slot, then fix the PHY address for the 347 * marked port when doing dtb fixup. 348 */ 349 if (miiphy_read(mdio_names[i], 350 SGMII_CARD_PORT1_PHY_ADDR, MII_PHYSID2, ®) != 0) { 351 debug("Slot%d PHY ID register 2 read failed\n", i); 352 continue; 353 } 354 355 debug("Slot%d MII_PHYSID2 @ 0x1c= 0x%04x\n", i, reg); 356 357 if (reg == 0xFFFF) { 358 /* No physical device present at this address */ 359 continue; 360 } 361 362 switch (i) { 363 case 1: 364 qsgmiiphy_fix[FM1_DTSEC5] = 1; 365 qsgmiiphy_fix[FM1_DTSEC6] = 1; 366 qsgmiiphy_fix[FM1_DTSEC9] = 1; 367 qsgmiiphy_fix[FM1_DTSEC10] = 1; 368 break; 369 case 2: 370 qsgmiiphy_fix[FM1_DTSEC1] = 1; 371 qsgmiiphy_fix[FM1_DTSEC2] = 1; 372 qsgmiiphy_fix[FM1_DTSEC3] = 1; 373 qsgmiiphy_fix[FM1_DTSEC4] = 1; 374 break; 375 case 3: 376 qsgmiiphy_fix[FM2_DTSEC5] = 1; 377 qsgmiiphy_fix[FM2_DTSEC6] = 1; 378 qsgmiiphy_fix[FM2_DTSEC9] = 1; 379 qsgmiiphy_fix[FM2_DTSEC10] = 1; 380 break; 381 case 4: 382 qsgmiiphy_fix[FM2_DTSEC1] = 1; 383 qsgmiiphy_fix[FM2_DTSEC2] = 1; 384 qsgmiiphy_fix[FM2_DTSEC3] = 1; 385 qsgmiiphy_fix[FM2_DTSEC4] = 1; 386 break; 387 default: 388 break; 389 } 390 } 391 } 392 393 int board_eth_init(bd_t *bis) 394 { 395 #if defined(CONFIG_FMAN_ENET) 396 int i, idx, lane, slot; 397 struct memac_mdio_info dtsec_mdio_info; 398 struct memac_mdio_info tgec_mdio_info; 399 ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); 400 u32 srds_prtcl_s1, srds_prtcl_s2; 401 402 srds_prtcl_s1 = in_be32(&gur->rcwsr[4]) & 403 FSL_CORENET2_RCWSR4_SRDS1_PRTCL; 404 srds_prtcl_s1 >>= FSL_CORENET2_RCWSR4_SRDS1_PRTCL_SHIFT; 405 srds_prtcl_s2 = in_be32(&gur->rcwsr[4]) & 406 FSL_CORENET2_RCWSR4_SRDS2_PRTCL; 407 srds_prtcl_s2 >>= FSL_CORENET2_RCWSR4_SRDS2_PRTCL_SHIFT; 408 409 /* Initialize the mdio_mux array so we can recognize empty elements */ 410 for (i = 0; i < NUM_FM_PORTS; i++) 411 mdio_mux[i] = EMI_NONE; 412 413 dtsec_mdio_info.regs = 414 (struct memac_mdio_controller *)CONFIG_SYS_FM2_DTSEC_MDIO_ADDR; 415 416 dtsec_mdio_info.name = DEFAULT_FM_MDIO_NAME; 417 418 /* Register the 1G MDIO bus */ 419 fm_memac_mdio_init(bis, &dtsec_mdio_info); 420 421 tgec_mdio_info.regs = 422 (struct memac_mdio_controller *)CONFIG_SYS_FM2_TGEC_MDIO_ADDR; 423 tgec_mdio_info.name = DEFAULT_FM_TGEC_MDIO_NAME; 424 425 /* Register the 10G MDIO bus */ 426 fm_memac_mdio_init(bis, &tgec_mdio_info); 427 428 /* Register the muxing front-ends to the MDIO buses */ 429 t4240qds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_RGMII); 430 t4240qds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT1); 431 t4240qds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT2); 432 t4240qds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT3); 433 t4240qds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT4); 434 t4240qds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT5); 435 t4240qds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT7); 436 t4240qds_mdio_init(DEFAULT_FM_TGEC_MDIO_NAME, EMI2); 437 438 439 switch (srds_prtcl_s1) { 440 case 1: 441 case 2: 442 case 4: 443 /* XAUI/HiGig in Slot1 and Slot2 */ 444 fm_info_set_phy_address(FM1_10GEC1, FM1_10GEC1_PHY_ADDR); 445 fm_info_set_phy_address(FM1_10GEC2, FM1_10GEC2_PHY_ADDR); 446 break; 447 case 28: 448 case 36: 449 /* SGMII in Slot1 and Slot2 */ 450 fm_info_set_phy_address(FM1_DTSEC1, slot_qsgmii_phyaddr[2][0]); 451 fm_info_set_phy_address(FM1_DTSEC2, slot_qsgmii_phyaddr[2][1]); 452 fm_info_set_phy_address(FM1_DTSEC3, slot_qsgmii_phyaddr[2][2]); 453 fm_info_set_phy_address(FM1_DTSEC4, slot_qsgmii_phyaddr[2][3]); 454 fm_info_set_phy_address(FM1_DTSEC5, slot_qsgmii_phyaddr[1][0]); 455 fm_info_set_phy_address(FM1_DTSEC6, slot_qsgmii_phyaddr[1][1]); 456 if ((srds_prtcl_s2 != 56) && (srds_prtcl_s2 != 57)) { 457 fm_info_set_phy_address(FM1_DTSEC9, 458 slot_qsgmii_phyaddr[1][3]); 459 fm_info_set_phy_address(FM1_DTSEC10, 460 slot_qsgmii_phyaddr[1][2]); 461 } 462 break; 463 case 38: 464 fm_info_set_phy_address(FM1_DTSEC1, slot_qsgmii_phyaddr[2][0]); 465 fm_info_set_phy_address(FM1_DTSEC2, slot_qsgmii_phyaddr[2][1]); 466 fm_info_set_phy_address(FM1_DTSEC3, slot_qsgmii_phyaddr[2][2]); 467 fm_info_set_phy_address(FM1_DTSEC4, slot_qsgmii_phyaddr[2][3]); 468 fm_info_set_phy_address(FM1_DTSEC5, slot_qsgmii_phyaddr[1][0]); 469 fm_info_set_phy_address(FM1_DTSEC6, slot_qsgmii_phyaddr[1][1]); 470 if ((srds_prtcl_s2 != 56) && (srds_prtcl_s2 != 57)) { 471 fm_info_set_phy_address(FM1_DTSEC9, 472 slot_qsgmii_phyaddr[1][3]); 473 fm_info_set_phy_address(FM1_DTSEC10, 474 slot_qsgmii_phyaddr[1][2]); 475 } 476 break; 477 case 40: 478 case 46: 479 case 48: 480 fm_info_set_phy_address(FM1_DTSEC5, slot_qsgmii_phyaddr[1][0]); 481 fm_info_set_phy_address(FM1_DTSEC6, slot_qsgmii_phyaddr[1][1]); 482 if ((srds_prtcl_s2 != 56) && (srds_prtcl_s2 != 57)) { 483 fm_info_set_phy_address(FM1_DTSEC10, 484 slot_qsgmii_phyaddr[1][3]); 485 fm_info_set_phy_address(FM1_DTSEC9, 486 slot_qsgmii_phyaddr[1][2]); 487 } 488 fm_info_set_phy_address(FM1_DTSEC1, slot_qsgmii_phyaddr[2][0]); 489 fm_info_set_phy_address(FM1_DTSEC2, slot_qsgmii_phyaddr[2][1]); 490 fm_info_set_phy_address(FM1_DTSEC3, slot_qsgmii_phyaddr[2][2]); 491 fm_info_set_phy_address(FM1_DTSEC4, slot_qsgmii_phyaddr[2][3]); 492 break; 493 default: 494 puts("Invalid SerDes1 protocol for T4240QDS\n"); 495 break; 496 } 497 498 for (i = FM1_DTSEC1; i < FM1_DTSEC1 + CONFIG_SYS_NUM_FM1_DTSEC; i++) { 499 idx = i - FM1_DTSEC1; 500 switch (fm_info_get_enet_if(i)) { 501 case PHY_INTERFACE_MODE_SGMII: 502 lane = serdes_get_first_lane(FSL_SRDS_1, 503 SGMII_FM1_DTSEC1 + idx); 504 if (lane < 0) 505 break; 506 slot = lane_to_slot_fsm1[lane]; 507 debug("FM1@DTSEC%u expects SGMII in slot %u\n", 508 idx + 1, slot); 509 if (QIXIS_READ(present2) & (1 << (slot - 1))) 510 fm_disable_port(i); 511 switch (slot) { 512 case 1: 513 mdio_mux[i] = EMI1_SLOT1; 514 fm_info_set_mdio(i, 515 mii_dev_for_muxval(mdio_mux[i])); 516 break; 517 case 2: 518 mdio_mux[i] = EMI1_SLOT2; 519 fm_info_set_mdio(i, 520 mii_dev_for_muxval(mdio_mux[i])); 521 break; 522 }; 523 break; 524 case PHY_INTERFACE_MODE_RGMII: 525 /* FM1 DTSEC5 routes to RGMII with EC2 */ 526 debug("FM1@DTSEC%u is RGMII at address %u\n", 527 idx + 1, 2); 528 if (i == FM1_DTSEC5) 529 fm_info_set_phy_address(i, 2); 530 mdio_mux[i] = EMI1_RGMII; 531 fm_info_set_mdio(i, 532 mii_dev_for_muxval(mdio_mux[i])); 533 break; 534 default: 535 break; 536 } 537 } 538 539 for (i = FM1_10GEC1; i < FM1_10GEC1 + CONFIG_SYS_NUM_FM1_10GEC; i++) { 540 idx = i - FM1_10GEC1; 541 switch (fm_info_get_enet_if(i)) { 542 case PHY_INTERFACE_MODE_XGMII: 543 lane = serdes_get_first_lane(FSL_SRDS_1, 544 XAUI_FM1_MAC9 + idx); 545 if (lane < 0) 546 break; 547 slot = lane_to_slot_fsm1[lane]; 548 if (QIXIS_READ(present2) & (1 << (slot - 1))) 549 fm_disable_port(i); 550 mdio_mux[i] = EMI2; 551 fm_info_set_mdio(i, mii_dev_for_muxval(mdio_mux[i])); 552 break; 553 default: 554 break; 555 } 556 } 557 558 #if (CONFIG_SYS_NUM_FMAN == 2) 559 switch (srds_prtcl_s2) { 560 case 1: 561 case 2: 562 case 4: 563 /* XAUI/HiGig in Slot3 and Slot4 */ 564 fm_info_set_phy_address(FM2_10GEC1, FM2_10GEC1_PHY_ADDR); 565 fm_info_set_phy_address(FM2_10GEC2, FM2_10GEC2_PHY_ADDR); 566 break; 567 case 7: 568 case 13: 569 case 14: 570 case 16: 571 case 22: 572 case 23: 573 case 25: 574 case 26: 575 /* XAUI/HiGig in Slot3, SGMII in Slot4 */ 576 fm_info_set_phy_address(FM2_10GEC1, FM2_10GEC1_PHY_ADDR); 577 fm_info_set_phy_address(FM2_DTSEC1, slot_qsgmii_phyaddr[4][0]); 578 fm_info_set_phy_address(FM2_DTSEC2, slot_qsgmii_phyaddr[4][1]); 579 fm_info_set_phy_address(FM2_DTSEC3, slot_qsgmii_phyaddr[4][2]); 580 fm_info_set_phy_address(FM2_DTSEC4, slot_qsgmii_phyaddr[4][3]); 581 break; 582 case 28: 583 case 36: 584 /* SGMII in Slot3 and Slot4 */ 585 fm_info_set_phy_address(FM2_DTSEC1, slot_qsgmii_phyaddr[4][0]); 586 fm_info_set_phy_address(FM2_DTSEC2, slot_qsgmii_phyaddr[4][1]); 587 fm_info_set_phy_address(FM2_DTSEC3, slot_qsgmii_phyaddr[4][2]); 588 fm_info_set_phy_address(FM2_DTSEC4, slot_qsgmii_phyaddr[4][3]); 589 fm_info_set_phy_address(FM2_DTSEC5, slot_qsgmii_phyaddr[3][0]); 590 fm_info_set_phy_address(FM2_DTSEC6, slot_qsgmii_phyaddr[3][1]); 591 fm_info_set_phy_address(FM2_DTSEC9, slot_qsgmii_phyaddr[3][3]); 592 fm_info_set_phy_address(FM2_DTSEC10, slot_qsgmii_phyaddr[3][2]); 593 break; 594 case 38: 595 /* QSGMII in Slot3 and Slot4 */ 596 fm_info_set_phy_address(FM2_DTSEC1, slot_qsgmii_phyaddr[4][0]); 597 fm_info_set_phy_address(FM2_DTSEC2, slot_qsgmii_phyaddr[4][1]); 598 fm_info_set_phy_address(FM2_DTSEC3, slot_qsgmii_phyaddr[4][2]); 599 fm_info_set_phy_address(FM2_DTSEC4, slot_qsgmii_phyaddr[4][3]); 600 fm_info_set_phy_address(FM2_DTSEC5, slot_qsgmii_phyaddr[3][0]); 601 fm_info_set_phy_address(FM2_DTSEC6, slot_qsgmii_phyaddr[3][1]); 602 fm_info_set_phy_address(FM2_DTSEC9, slot_qsgmii_phyaddr[3][3]); 603 fm_info_set_phy_address(FM2_DTSEC10, slot_qsgmii_phyaddr[3][2]); 604 break; 605 case 40: 606 case 46: 607 case 48: 608 /* SGMII in Slot3 */ 609 fm_info_set_phy_address(FM2_DTSEC5, slot_qsgmii_phyaddr[3][0]); 610 fm_info_set_phy_address(FM2_DTSEC6, slot_qsgmii_phyaddr[3][1]); 611 fm_info_set_phy_address(FM2_DTSEC9, slot_qsgmii_phyaddr[3][3]); 612 fm_info_set_phy_address(FM2_DTSEC10, slot_qsgmii_phyaddr[3][2]); 613 /* QSGMII in Slot4 */ 614 fm_info_set_phy_address(FM2_DTSEC1, slot_qsgmii_phyaddr[4][0]); 615 fm_info_set_phy_address(FM2_DTSEC2, slot_qsgmii_phyaddr[4][1]); 616 fm_info_set_phy_address(FM2_DTSEC3, slot_qsgmii_phyaddr[4][2]); 617 fm_info_set_phy_address(FM2_DTSEC4, slot_qsgmii_phyaddr[4][3]); 618 break; 619 case 50: 620 case 52: 621 case 54: 622 fm_info_set_phy_address(FM2_10GEC1, FM2_10GEC1_PHY_ADDR); 623 fm_info_set_phy_address(FM2_DTSEC1, slot_qsgmii_phyaddr[4][0]); 624 fm_info_set_phy_address(FM2_DTSEC2, slot_qsgmii_phyaddr[4][1]); 625 fm_info_set_phy_address(FM2_DTSEC3, slot_qsgmii_phyaddr[4][2]); 626 fm_info_set_phy_address(FM2_DTSEC4, slot_qsgmii_phyaddr[4][3]); 627 break; 628 case 56: 629 case 57: 630 /* XFI in Slot3, SGMII in Slot4 */ 631 fm_info_set_phy_address(FM2_DTSEC1, slot_qsgmii_phyaddr[4][0]); 632 fm_info_set_phy_address(FM2_DTSEC2, slot_qsgmii_phyaddr[4][1]); 633 fm_info_set_phy_address(FM2_DTSEC3, slot_qsgmii_phyaddr[4][2]); 634 fm_info_set_phy_address(FM2_DTSEC4, slot_qsgmii_phyaddr[4][3]); 635 break; 636 default: 637 puts("Invalid SerDes2 protocol for T4240QDS\n"); 638 break; 639 } 640 641 for (i = FM2_DTSEC1; i < FM2_DTSEC1 + CONFIG_SYS_NUM_FM2_DTSEC; i++) { 642 idx = i - FM2_DTSEC1; 643 switch (fm_info_get_enet_if(i)) { 644 case PHY_INTERFACE_MODE_SGMII: 645 lane = serdes_get_first_lane(FSL_SRDS_2, 646 SGMII_FM2_DTSEC1 + idx); 647 if (lane < 0) 648 break; 649 slot = lane_to_slot_fsm2[lane]; 650 debug("FM2@DTSEC%u expects SGMII in slot %u\n", 651 idx + 1, slot); 652 if (QIXIS_READ(present2) & (1 << (slot - 1))) 653 fm_disable_port(i); 654 switch (slot) { 655 case 3: 656 mdio_mux[i] = EMI1_SLOT3; 657 fm_info_set_mdio(i, 658 mii_dev_for_muxval(mdio_mux[i])); 659 break; 660 case 4: 661 mdio_mux[i] = EMI1_SLOT4; 662 fm_info_set_mdio(i, 663 mii_dev_for_muxval(mdio_mux[i])); 664 break; 665 }; 666 break; 667 case PHY_INTERFACE_MODE_RGMII: 668 /* 669 * If DTSEC5 is RGMII, then it's routed via via EC1 to 670 * the first on-board RGMII port. If DTSEC6 is RGMII, 671 * then it's routed via via EC2 to the second on-board 672 * RGMII port. 673 */ 674 debug("FM2@DTSEC%u is RGMII at address %u\n", 675 idx + 1, i == FM2_DTSEC5 ? 1 : 2); 676 fm_info_set_phy_address(i, i == FM2_DTSEC5 ? 1 : 2); 677 mdio_mux[i] = EMI1_RGMII; 678 fm_info_set_mdio(i, mii_dev_for_muxval(mdio_mux[i])); 679 break; 680 default: 681 break; 682 } 683 } 684 685 for (i = FM2_10GEC1; i < FM2_10GEC1 + CONFIG_SYS_NUM_FM2_10GEC; i++) { 686 idx = i - FM2_10GEC1; 687 switch (fm_info_get_enet_if(i)) { 688 case PHY_INTERFACE_MODE_XGMII: 689 lane = serdes_get_first_lane(FSL_SRDS_2, 690 XAUI_FM2_MAC9 + idx); 691 if (lane < 0) 692 break; 693 slot = lane_to_slot_fsm2[lane]; 694 if (QIXIS_READ(present2) & (1 << (slot - 1))) 695 fm_disable_port(i); 696 mdio_mux[i] = EMI2; 697 fm_info_set_mdio(i, mii_dev_for_muxval(mdio_mux[i])); 698 break; 699 default: 700 break; 701 } 702 } 703 #endif /* CONFIG_SYS_NUM_FMAN */ 704 705 initialize_qsgmiiphy_fix(); 706 707 cpu_eth_init(bis); 708 #endif /* CONFIG_FMAN_ENET */ 709 710 return pci_eth_init(bis); 711 } 712