1 /* 2 * Copyright 2013 Freescale Semiconductor, Inc. 3 * 4 * SPDX-License-Identifier: GPL-2.0+ 5 */ 6 7 /* 8 * The RGMII PHYs are provided by the two on-board PHY connected to 9 * dTSEC instances 4 and 5. The SGMII PHYs are provided by one on-board 10 * PHY or by the standard four-port SGMII riser card (VSC). 11 */ 12 13 #include <common.h> 14 #include <netdev.h> 15 #include <asm/fsl_serdes.h> 16 #include <asm/immap_85xx.h> 17 #include <fm_eth.h> 18 #include <fsl_mdio.h> 19 #include <malloc.h> 20 #include <fsl_dtsec.h> 21 #include <vsc9953.h> 22 23 #include "../common/fman.h" 24 #include "../common/qixis.h" 25 26 #include "t1040qds_qixis.h" 27 28 #ifdef CONFIG_FMAN_ENET 29 /* - In T1040 there are only 8 SERDES lanes, spread across 2 SERDES banks. 30 * Bank 1 -> Lanes A, B, C, D 31 * Bank 2 -> Lanes E, F, G, H 32 */ 33 34 /* Mapping of 8 SERDES lanes to T1040 QDS board slots. A value of '0' here 35 * means that the mapping must be determined dynamically, or that the lane 36 * maps to something other than a board slot. 37 */ 38 static u8 lane_to_slot[] = { 39 0, 0, 0, 0, 0, 0, 0, 0 40 }; 41 42 /* On the Vitesse VSC8234XHG SGMII riser card there are 4 SGMII PHYs 43 * housed. 44 */ 45 static int riser_phy_addr[] = { 46 CONFIG_SYS_FM1_DTSEC1_RISER_PHY_ADDR, 47 CONFIG_SYS_FM1_DTSEC2_RISER_PHY_ADDR, 48 CONFIG_SYS_FM1_DTSEC3_RISER_PHY_ADDR, 49 CONFIG_SYS_FM1_DTSEC4_RISER_PHY_ADDR, 50 }; 51 52 /* Slot2 does not have EMI connections */ 53 #define EMI_NONE 0xFFFFFFFF 54 #define EMI1_RGMII0 0 55 #define EMI1_RGMII1 1 56 #define EMI1_SLOT1 2 57 #define EMI1_SLOT3 3 58 #define EMI1_SLOT4 4 59 #define EMI1_SLOT5 5 60 #define EMI1_SLOT6 6 61 #define EMI1_SLOT7 7 62 #define EMI2 8 63 64 static int mdio_mux[NUM_FM_PORTS]; 65 66 static const char * const mdio_names[] = { 67 "T1040_QDS_MDIO0", 68 "T1040_QDS_MDIO1", 69 "T1040_QDS_MDIO2", 70 "T1040_QDS_MDIO3", 71 "T1040_QDS_MDIO4", 72 "T1040_QDS_MDIO5", 73 "T1040_QDS_MDIO6", 74 "T1040_QDS_MDIO7", 75 }; 76 77 struct t1040_qds_mdio { 78 u8 muxval; 79 struct mii_dev *realbus; 80 }; 81 82 static const char *t1040_qds_mdio_name_for_muxval(u8 muxval) 83 { 84 return mdio_names[muxval]; 85 } 86 87 struct mii_dev *mii_dev_for_muxval(u8 muxval) 88 { 89 struct mii_dev *bus; 90 const char *name = t1040_qds_mdio_name_for_muxval(muxval); 91 92 if (!name) { 93 printf("No bus for muxval %x\n", muxval); 94 return NULL; 95 } 96 97 bus = miiphy_get_dev_by_name(name); 98 99 if (!bus) { 100 printf("No bus by name %s\n", name); 101 return NULL; 102 } 103 104 return bus; 105 } 106 107 static void t1040_qds_mux_mdio(u8 muxval) 108 { 109 u8 brdcfg4; 110 if (muxval <= 7) { 111 brdcfg4 = QIXIS_READ(brdcfg[4]); 112 brdcfg4 &= ~BRDCFG4_EMISEL_MASK; 113 brdcfg4 |= (muxval << BRDCFG4_EMISEL_SHIFT); 114 QIXIS_WRITE(brdcfg[4], brdcfg4); 115 } 116 } 117 118 static int t1040_qds_mdio_read(struct mii_dev *bus, int addr, int devad, 119 int regnum) 120 { 121 struct t1040_qds_mdio *priv = bus->priv; 122 123 t1040_qds_mux_mdio(priv->muxval); 124 125 return priv->realbus->read(priv->realbus, addr, devad, regnum); 126 } 127 128 static int t1040_qds_mdio_write(struct mii_dev *bus, int addr, int devad, 129 int regnum, u16 value) 130 { 131 struct t1040_qds_mdio *priv = bus->priv; 132 133 t1040_qds_mux_mdio(priv->muxval); 134 135 return priv->realbus->write(priv->realbus, addr, devad, regnum, value); 136 } 137 138 static int t1040_qds_mdio_reset(struct mii_dev *bus) 139 { 140 struct t1040_qds_mdio *priv = bus->priv; 141 142 return priv->realbus->reset(priv->realbus); 143 } 144 145 static int t1040_qds_mdio_init(char *realbusname, u8 muxval) 146 { 147 struct t1040_qds_mdio *pmdio; 148 struct mii_dev *bus = mdio_alloc(); 149 150 if (!bus) { 151 printf("Failed to allocate t1040_qds MDIO bus\n"); 152 return -1; 153 } 154 155 pmdio = malloc(sizeof(*pmdio)); 156 if (!pmdio) { 157 printf("Failed to allocate t1040_qds private data\n"); 158 free(bus); 159 return -1; 160 } 161 162 bus->read = t1040_qds_mdio_read; 163 bus->write = t1040_qds_mdio_write; 164 bus->reset = t1040_qds_mdio_reset; 165 sprintf(bus->name, t1040_qds_mdio_name_for_muxval(muxval)); 166 167 pmdio->realbus = miiphy_get_dev_by_name(realbusname); 168 169 if (!pmdio->realbus) { 170 printf("No bus with name %s\n", realbusname); 171 free(bus); 172 free(pmdio); 173 return -1; 174 } 175 176 pmdio->muxval = muxval; 177 bus->priv = pmdio; 178 179 return mdio_register(bus); 180 } 181 182 /* 183 * Initialize the lane_to_slot[] array. 184 * 185 * On the T1040QDS board the mapping is controlled by ?? register. 186 */ 187 static void initialize_lane_to_slot(void) 188 { 189 ccsr_gur_t *gur = (void *)CONFIG_SYS_MPC85xx_GUTS_ADDR; 190 int serdes1_prtcl = (in_be32(&gur->rcwsr[4]) & 191 FSL_CORENET2_RCWSR4_SRDS1_PRTCL) 192 >> FSL_CORENET2_RCWSR4_SRDS1_PRTCL_SHIFT; 193 194 QIXIS_WRITE(cms[0], 0x07); 195 196 switch (serdes1_prtcl) { 197 case 0x60: 198 case 0x66: 199 case 0x67: 200 case 0x69: 201 lane_to_slot[1] = 7; 202 lane_to_slot[2] = 6; 203 lane_to_slot[3] = 5; 204 break; 205 case 0x86: 206 lane_to_slot[1] = 7; 207 lane_to_slot[2] = 7; 208 lane_to_slot[3] = 7; 209 break; 210 case 0x87: 211 lane_to_slot[1] = 7; 212 lane_to_slot[2] = 7; 213 lane_to_slot[3] = 7; 214 lane_to_slot[7] = 7; 215 break; 216 case 0x89: 217 lane_to_slot[1] = 7; 218 lane_to_slot[2] = 7; 219 lane_to_slot[3] = 7; 220 lane_to_slot[6] = 7; 221 lane_to_slot[7] = 7; 222 break; 223 case 0x8d: 224 lane_to_slot[1] = 7; 225 lane_to_slot[2] = 7; 226 lane_to_slot[3] = 7; 227 lane_to_slot[5] = 3; 228 lane_to_slot[6] = 3; 229 lane_to_slot[7] = 3; 230 break; 231 case 0x8F: 232 case 0x85: 233 lane_to_slot[1] = 7; 234 lane_to_slot[2] = 6; 235 lane_to_slot[3] = 5; 236 lane_to_slot[6] = 3; 237 lane_to_slot[7] = 3; 238 break; 239 case 0xA5: 240 lane_to_slot[1] = 7; 241 lane_to_slot[6] = 3; 242 lane_to_slot[7] = 3; 243 break; 244 case 0xA7: 245 lane_to_slot[1] = 7; 246 lane_to_slot[2] = 6; 247 lane_to_slot[3] = 5; 248 lane_to_slot[7] = 7; 249 break; 250 case 0xAA: 251 lane_to_slot[1] = 7; 252 lane_to_slot[6] = 7; 253 lane_to_slot[7] = 7; 254 break; 255 case 0x40: 256 lane_to_slot[2] = 7; 257 lane_to_slot[3] = 7; 258 break; 259 default: 260 printf("qds: Fman: Unsupported SerDes Protocol 0x%02x\n", 261 serdes1_prtcl); 262 break; 263 } 264 } 265 266 /* 267 * Given the following ... 268 * 269 * 1) A pointer to an Fman Ethernet node (as identified by the 'compat' 270 * compatible string and 'addr' physical address) 271 * 272 * 2) An Fman port 273 * 274 * ... update the phy-handle property of the Ethernet node to point to the 275 * right PHY. This assumes that we already know the PHY for each port. 276 * 277 * The offset of the Fman Ethernet node is also passed in for convenience, but 278 * it is not used, and we recalculate the offset anyway. 279 * 280 * Note that what we call "Fman ports" (enum fm_port) is really an Fman MAC. 281 * Inside the Fman, "ports" are things that connect to MACs. We only call them 282 * ports in U-Boot because on previous Ethernet devices (e.g. Gianfar), MACs 283 * and ports are the same thing. 284 * 285 */ 286 void board_ft_fman_fixup_port(void *fdt, char *compat, phys_addr_t addr, 287 enum fm_port port, int offset) 288 { 289 phy_interface_t intf = fm_info_get_enet_if(port); 290 char phy[16]; 291 292 /* The RGMII PHY is identified by the MAC connected to it */ 293 if (intf == PHY_INTERFACE_MODE_RGMII) { 294 sprintf(phy, "rgmii_phy%u", port == FM1_DTSEC4 ? 1 : 2); 295 fdt_set_phy_handle(fdt, compat, addr, phy); 296 } 297 298 /* The SGMII PHY is identified by the MAC connected to it */ 299 if (intf == PHY_INTERFACE_MODE_SGMII) { 300 int lane = serdes_get_first_lane(FSL_SRDS_1, SGMII_FM1_DTSEC1 301 + port); 302 u8 slot; 303 if (lane < 0) 304 return; 305 slot = lane_to_slot[lane]; 306 if (slot) { 307 /* Slot housing a SGMII riser card */ 308 sprintf(phy, "phy_s%x_%02x", slot, 309 (fm_info_get_phy_address(port - FM1_DTSEC1)- 310 CONFIG_SYS_FM1_DTSEC1_RISER_PHY_ADDR + 1)); 311 fdt_set_phy_handle(fdt, compat, addr, phy); 312 } 313 } 314 } 315 316 void fdt_fixup_board_enet(void *fdt) 317 { 318 int i, lane, idx; 319 320 for (i = FM1_DTSEC1; i < FM1_DTSEC1 + CONFIG_SYS_NUM_FM1_DTSEC; i++) { 321 idx = i - FM1_DTSEC1; 322 switch (fm_info_get_enet_if(i)) { 323 case PHY_INTERFACE_MODE_SGMII: 324 lane = serdes_get_first_lane(FSL_SRDS_1, 325 SGMII_FM1_DTSEC1 + idx); 326 if (lane < 0) 327 break; 328 329 switch (mdio_mux[i]) { 330 case EMI1_SLOT3: 331 fdt_status_okay_by_alias(fdt, "emi1_slot3"); 332 break; 333 case EMI1_SLOT5: 334 fdt_status_okay_by_alias(fdt, "emi1_slot5"); 335 break; 336 case EMI1_SLOT6: 337 fdt_status_okay_by_alias(fdt, "emi1_slot6"); 338 break; 339 case EMI1_SLOT7: 340 fdt_status_okay_by_alias(fdt, "emi1_slot7"); 341 break; 342 } 343 break; 344 case PHY_INTERFACE_MODE_RGMII: 345 if (i == FM1_DTSEC4) 346 fdt_status_okay_by_alias(fdt, "emi1_rgmii0"); 347 348 if (i == FM1_DTSEC5) 349 fdt_status_okay_by_alias(fdt, "emi1_rgmii1"); 350 break; 351 default: 352 break; 353 } 354 } 355 } 356 #endif /* #ifdef CONFIG_FMAN_ENET */ 357 358 static void set_brdcfg9_for_gtx_clk(void) 359 { 360 u8 brdcfg9; 361 brdcfg9 = QIXIS_READ(brdcfg[9]); 362 /* Initializing EPHY2 clock to RGMII mode */ 363 brdcfg9 &= ~(BRDCFG9_EPHY2_MASK); 364 brdcfg9 |= (BRDCFG9_EPHY2_VAL); 365 QIXIS_WRITE(brdcfg[9], brdcfg9); 366 } 367 368 void t1040_handle_phy_interface_sgmii(int i) 369 { 370 int lane, idx, slot; 371 idx = i - FM1_DTSEC1; 372 lane = serdes_get_first_lane(FSL_SRDS_1, 373 SGMII_FM1_DTSEC1 + idx); 374 375 if (lane < 0) 376 return; 377 slot = lane_to_slot[lane]; 378 379 switch (slot) { 380 case 1: 381 mdio_mux[i] = EMI1_SLOT1; 382 fm_info_set_mdio(i, mii_dev_for_muxval(mdio_mux[i])); 383 break; 384 case 3: 385 if (FM1_DTSEC4 == i) 386 fm_info_set_phy_address(i, riser_phy_addr[0]); 387 if (FM1_DTSEC5 == i) 388 fm_info_set_phy_address(i, riser_phy_addr[1]); 389 390 mdio_mux[i] = EMI1_SLOT3; 391 392 fm_info_set_mdio(i, mii_dev_for_muxval(mdio_mux[i])); 393 break; 394 case 4: 395 mdio_mux[i] = EMI1_SLOT4; 396 fm_info_set_mdio(i, mii_dev_for_muxval(mdio_mux[i])); 397 break; 398 case 5: 399 /* Slot housing a SGMII riser card? */ 400 fm_info_set_phy_address(i, riser_phy_addr[0]); 401 mdio_mux[i] = EMI1_SLOT5; 402 fm_info_set_mdio(i, mii_dev_for_muxval(mdio_mux[i])); 403 break; 404 case 6: 405 /* Slot housing a SGMII riser card? */ 406 fm_info_set_phy_address(i, riser_phy_addr[0]); 407 mdio_mux[i] = EMI1_SLOT6; 408 fm_info_set_mdio(i, mii_dev_for_muxval(mdio_mux[i])); 409 break; 410 case 7: 411 if (FM1_DTSEC1 == i) 412 fm_info_set_phy_address(i, riser_phy_addr[0]); 413 if (FM1_DTSEC2 == i) 414 fm_info_set_phy_address(i, riser_phy_addr[1]); 415 if (FM1_DTSEC3 == i) 416 fm_info_set_phy_address(i, riser_phy_addr[2]); 417 if (FM1_DTSEC5 == i) 418 fm_info_set_phy_address(i, riser_phy_addr[3]); 419 420 mdio_mux[i] = EMI1_SLOT7; 421 fm_info_set_mdio(i, mii_dev_for_muxval(mdio_mux[i])); 422 break; 423 default: 424 break; 425 } 426 fm_info_set_mdio(i, mii_dev_for_muxval(mdio_mux[i])); 427 } 428 void t1040_handle_phy_interface_rgmii(int i) 429 { 430 fm_info_set_phy_address(i, i == FM1_DTSEC5 ? 431 CONFIG_SYS_FM1_DTSEC5_PHY_ADDR : 432 CONFIG_SYS_FM1_DTSEC4_PHY_ADDR); 433 mdio_mux[i] = (i == FM1_DTSEC5) ? EMI1_RGMII1 : 434 EMI1_RGMII0; 435 fm_info_set_mdio(i, mii_dev_for_muxval(mdio_mux[i])); 436 } 437 438 int board_eth_init(bd_t *bis) 439 { 440 #ifdef CONFIG_FMAN_ENET 441 struct memac_mdio_info memac_mdio_info; 442 unsigned int i; 443 #ifdef CONFIG_VSC9953 444 int lane; 445 int phy_addr; 446 phy_interface_t phy_int; 447 struct mii_dev *bus; 448 #endif 449 450 printf("Initializing Fman\n"); 451 set_brdcfg9_for_gtx_clk(); 452 453 initialize_lane_to_slot(); 454 455 /* Initialize the mdio_mux array so we can recognize empty elements */ 456 for (i = 0; i < NUM_FM_PORTS; i++) 457 mdio_mux[i] = EMI_NONE; 458 459 memac_mdio_info.regs = 460 (struct memac_mdio_controller *)CONFIG_SYS_FM1_DTSEC_MDIO_ADDR; 461 memac_mdio_info.name = DEFAULT_FM_MDIO_NAME; 462 463 /* Register the real 1G MDIO bus */ 464 fm_memac_mdio_init(bis, &memac_mdio_info); 465 466 /* Register the muxing front-ends to the MDIO buses */ 467 t1040_qds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_RGMII0); 468 t1040_qds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_RGMII1); 469 t1040_qds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT1); 470 t1040_qds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT3); 471 t1040_qds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT4); 472 t1040_qds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT5); 473 t1040_qds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT6); 474 t1040_qds_mdio_init(DEFAULT_FM_MDIO_NAME, EMI1_SLOT7); 475 476 /* 477 * Program on board RGMII PHY addresses. If the SGMII Riser 478 * card used, we'll override the PHY address later. For any DTSEC that 479 * is RGMII, we'll also override its PHY address later. We assume that 480 * DTSEC4 and DTSEC5 are used for RGMII. 481 */ 482 fm_info_set_phy_address(FM1_DTSEC4, CONFIG_SYS_FM1_DTSEC4_PHY_ADDR); 483 fm_info_set_phy_address(FM1_DTSEC5, CONFIG_SYS_FM1_DTSEC5_PHY_ADDR); 484 485 for (i = FM1_DTSEC1; i < FM1_DTSEC1 + CONFIG_SYS_NUM_FM1_DTSEC; i++) { 486 switch (fm_info_get_enet_if(i)) { 487 case PHY_INTERFACE_MODE_QSGMII: 488 fm_info_set_mdio(i, NULL); 489 break; 490 case PHY_INTERFACE_MODE_SGMII: 491 t1040_handle_phy_interface_sgmii(i); 492 break; 493 494 case PHY_INTERFACE_MODE_RGMII: 495 /* Only DTSEC4 and DTSEC5 can be routed to RGMII */ 496 t1040_handle_phy_interface_rgmii(i); 497 break; 498 default: 499 break; 500 } 501 } 502 503 #ifdef CONFIG_VSC9953 504 for (i = 0; i < VSC9953_MAX_PORTS; i++) { 505 lane = -1; 506 phy_addr = 0; 507 phy_int = PHY_INTERFACE_MODE_NONE; 508 switch (i) { 509 case 0: 510 case 1: 511 case 2: 512 case 3: 513 lane = serdes_get_first_lane(FSL_SRDS_1, QSGMII_SW1_A); 514 /* PHYs connected over QSGMII */ 515 if (lane >= 0) { 516 phy_addr = CONFIG_SYS_FM1_QSGMII21_PHY_ADDR + 517 i; 518 phy_int = PHY_INTERFACE_MODE_QSGMII; 519 break; 520 } 521 lane = serdes_get_first_lane(FSL_SRDS_1, 522 SGMII_SW1_MAC1 + i); 523 524 if (lane < 0) 525 break; 526 527 /* PHYs connected over QSGMII */ 528 if (i != 3 || lane_to_slot[lane] == 7) 529 phy_addr = CONFIG_SYS_FM1_DTSEC1_RISER_PHY_ADDR 530 + i; 531 else 532 phy_addr = CONFIG_SYS_FM1_DTSEC1_RISER_PHY_ADDR; 533 phy_int = PHY_INTERFACE_MODE_SGMII; 534 break; 535 case 4: 536 case 5: 537 case 6: 538 case 7: 539 lane = serdes_get_first_lane(FSL_SRDS_1, QSGMII_SW1_B); 540 /* PHYs connected over QSGMII */ 541 if (lane >= 0) { 542 phy_addr = CONFIG_SYS_FM1_QSGMII11_PHY_ADDR + 543 i - 4; 544 phy_int = PHY_INTERFACE_MODE_QSGMII; 545 break; 546 } 547 lane = serdes_get_first_lane(FSL_SRDS_1, 548 SGMII_SW1_MAC1 + i); 549 /* PHYs connected over SGMII */ 550 if (lane >= 0) { 551 phy_addr = CONFIG_SYS_FM1_DTSEC1_RISER_PHY_ADDR 552 + i - 3; 553 phy_int = PHY_INTERFACE_MODE_SGMII; 554 } 555 break; 556 case 8: 557 if (serdes_get_first_lane(FSL_SRDS_1, 558 SGMII_FM1_DTSEC1) < 0) 559 /* FM1@DTSEC1 is connected to SW1@PORT8 */ 560 vsc9953_port_enable(i); 561 break; 562 case 9: 563 if (serdes_get_first_lane(FSL_SRDS_1, 564 SGMII_FM1_DTSEC2) < 0) { 565 /* Enable L2 On MAC2 using SCFG */ 566 struct ccsr_scfg *scfg = (struct ccsr_scfg *) 567 CONFIG_SYS_MPC85xx_SCFG; 568 569 out_be32(&scfg->esgmiiselcr, 570 in_be32(&scfg->esgmiiselcr) | 571 (0x80000000)); 572 vsc9953_port_enable(i); 573 } 574 break; 575 } 576 577 if (lane >= 0) { 578 bus = mii_dev_for_muxval(lane_to_slot[lane]); 579 vsc9953_port_info_set_mdio(i, bus); 580 vsc9953_port_enable(i); 581 } 582 vsc9953_port_info_set_phy_address(i, phy_addr); 583 vsc9953_port_info_set_phy_int(i, phy_int); 584 } 585 586 #endif 587 cpu_eth_init(bis); 588 #endif 589 590 return pci_eth_init(bis); 591 } 592