19e758758SYork Sun /* 29e758758SYork Sun * Copyright 2012 Freescale Semiconductor, Inc. 39e758758SYork Sun * Roy Zang <tie-fei.zang@freescale.com> 49e758758SYork Sun * 51a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 69e758758SYork Sun */ 79e758758SYork Sun #include <common.h> 89e758758SYork Sun #include <phy.h> 99e758758SYork Sun #include <fm_eth.h> 109e758758SYork Sun #include <asm/io.h> 119e758758SYork Sun #include <asm/immap_85xx.h> 129e758758SYork Sun #include <asm/fsl_serdes.h> 139e758758SYork Sun 149e758758SYork Sun u32 port_to_devdisr[] = { 159e758758SYork Sun [FM1_DTSEC1] = FSL_CORENET_DEVDISR2_DTSEC1_1, 169e758758SYork Sun [FM1_DTSEC2] = FSL_CORENET_DEVDISR2_DTSEC1_2, 179e758758SYork Sun [FM1_DTSEC3] = FSL_CORENET_DEVDISR2_DTSEC1_3, 189e758758SYork Sun [FM1_DTSEC4] = FSL_CORENET_DEVDISR2_DTSEC1_4, 199e758758SYork Sun [FM1_DTSEC5] = FSL_CORENET_DEVDISR2_DTSEC1_5, 209e758758SYork Sun [FM1_DTSEC6] = FSL_CORENET_DEVDISR2_DTSEC1_6, 219e758758SYork Sun [FM1_DTSEC9] = FSL_CORENET_DEVDISR2_DTSEC1_9, 229e758758SYork Sun [FM1_DTSEC10] = FSL_CORENET_DEVDISR2_DTSEC1_10, 239e758758SYork Sun [FM1_10GEC1] = FSL_CORENET_DEVDISR2_10GEC1_1, 249e758758SYork Sun [FM1_10GEC2] = FSL_CORENET_DEVDISR2_10GEC1_2, 259e758758SYork Sun [FM2_DTSEC1] = FSL_CORENET_DEVDISR2_DTSEC2_1, 269e758758SYork Sun [FM2_DTSEC2] = FSL_CORENET_DEVDISR2_DTSEC2_2, 279e758758SYork Sun [FM2_DTSEC3] = FSL_CORENET_DEVDISR2_DTSEC2_3, 289e758758SYork Sun [FM2_DTSEC4] = FSL_CORENET_DEVDISR2_DTSEC2_4, 299e758758SYork Sun [FM2_DTSEC5] = FSL_CORENET_DEVDISR2_DTSEC2_5, 309e758758SYork Sun [FM2_DTSEC6] = FSL_CORENET_DEVDISR2_DTSEC2_6, 319e758758SYork Sun [FM2_DTSEC9] = FSL_CORENET_DEVDISR2_DTSEC2_9, 329e758758SYork Sun [FM2_DTSEC10] = FSL_CORENET_DEVDISR2_DTSEC2_10, 339e758758SYork Sun [FM2_10GEC1] = FSL_CORENET_DEVDISR2_10GEC2_1, 349e758758SYork Sun [FM2_10GEC2] = FSL_CORENET_DEVDISR2_10GEC2_2, 359e758758SYork Sun }; 369e758758SYork Sun 379e758758SYork Sun static int is_device_disabled(enum fm_port port) 389e758758SYork Sun { 399e758758SYork Sun ccsr_gur_t *gur = (void __iomem *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); 409e758758SYork Sun u32 devdisr2 = in_be32(&gur->devdisr2); 419e758758SYork Sun 429e758758SYork Sun return port_to_devdisr[port] & devdisr2; 439e758758SYork Sun } 449e758758SYork Sun 459e758758SYork Sun void fman_disable_port(enum fm_port port) 469e758758SYork Sun { 479e758758SYork Sun ccsr_gur_t *gur = (void __iomem *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); 489e758758SYork Sun 499e758758SYork Sun setbits_be32(&gur->devdisr2, port_to_devdisr[port]); 509e758758SYork Sun } 519e758758SYork Sun 52*f51d3b71SValentin Longchamp void fman_enable_port(enum fm_port port) 53*f51d3b71SValentin Longchamp { 54*f51d3b71SValentin Longchamp ccsr_gur_t *gur = (void __iomem *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); 55*f51d3b71SValentin Longchamp 56*f51d3b71SValentin Longchamp clrbits_be32(&gur->devdisr2, port_to_devdisr[port]); 57*f51d3b71SValentin Longchamp } 58*f51d3b71SValentin Longchamp 599e758758SYork Sun phy_interface_t fman_port_enet_if(enum fm_port port) 609e758758SYork Sun { 619e758758SYork Sun ccsr_gur_t *gur = (void __iomem *)(CONFIG_SYS_MPC85xx_GUTS_ADDR); 629e758758SYork Sun u32 rcwsr13 = in_be32(&gur->rcwsr[13]); 639e758758SYork Sun 649e758758SYork Sun if (is_device_disabled(port)) 659e758758SYork Sun return PHY_INTERFACE_MODE_NONE; 669e758758SYork Sun 67944b6ccfSShaohui Xie if ((port == FM1_10GEC1 || port == FM1_10GEC2) && 68944b6ccfSShaohui Xie ((is_serdes_configured(XAUI_FM1_MAC9)) || 69944b6ccfSShaohui Xie (is_serdes_configured(XAUI_FM1_MAC10)) || 70944b6ccfSShaohui Xie (is_serdes_configured(XFI_FM1_MAC9)) || 71944b6ccfSShaohui Xie (is_serdes_configured(XFI_FM1_MAC10)))) 729e758758SYork Sun return PHY_INTERFACE_MODE_XGMII; 739e758758SYork Sun 74944b6ccfSShaohui Xie if ((port == FM2_10GEC1 || port == FM2_10GEC2) && 75944b6ccfSShaohui Xie ((is_serdes_configured(XAUI_FM2_MAC9)) || 76944b6ccfSShaohui Xie (is_serdes_configured(XAUI_FM2_MAC10)) || 77944b6ccfSShaohui Xie (is_serdes_configured(XFI_FM2_MAC9)) || 78944b6ccfSShaohui Xie (is_serdes_configured(XFI_FM2_MAC10)))) 799e758758SYork Sun return PHY_INTERFACE_MODE_XGMII; 809e758758SYork Sun 819e758758SYork Sun #define FSL_CORENET_RCWSR13_EC1 0x60000000 /* bits 417..418 */ 829e758758SYork Sun #define FSL_CORENET_RCWSR13_EC1_FM2_DTSEC5_RGMII 0x00000000 839e758758SYork Sun #define FSL_CORENET_RCWSR13_EC1_FM2_GPIO 0x40000000 849e758758SYork Sun #define FSL_CORENET_RCWSR13_EC2 0x18000000 /* bits 419..420 */ 859e758758SYork Sun #define FSL_CORENET_RCWSR13_EC2_FM1_DTSEC5_RGMII 0x00000000 869e758758SYork Sun #define FSL_CORENET_RCWSR13_EC2_FM2_DTSEC6_RGMII 0x08000000 879e758758SYork Sun #define FSL_CORENET_RCWSR13_EC2_FM1_GPIO 0x10000000 889e758758SYork Sun /* handle RGMII first */ 899e758758SYork Sun if ((port == FM2_DTSEC5) && ((rcwsr13 & FSL_CORENET_RCWSR13_EC1) == 909e758758SYork Sun FSL_CORENET_RCWSR13_EC1_FM2_DTSEC5_RGMII)) 919e758758SYork Sun return PHY_INTERFACE_MODE_RGMII; 929e758758SYork Sun 939e758758SYork Sun if ((port == FM1_DTSEC5) && ((rcwsr13 & FSL_CORENET_RCWSR13_EC2) == 949e758758SYork Sun FSL_CORENET_RCWSR13_EC2_FM1_DTSEC5_RGMII)) 959e758758SYork Sun return PHY_INTERFACE_MODE_RGMII; 969e758758SYork Sun 979e758758SYork Sun if ((port == FM2_DTSEC6) && ((rcwsr13 & FSL_CORENET_RCWSR13_EC2) == 989e758758SYork Sun FSL_CORENET_RCWSR13_EC2_FM2_DTSEC6_RGMII)) 999e758758SYork Sun return PHY_INTERFACE_MODE_RGMII; 1009e758758SYork Sun switch (port) { 1019e758758SYork Sun case FM1_DTSEC1: 1029e758758SYork Sun case FM1_DTSEC2: 1039e758758SYork Sun case FM1_DTSEC3: 1049e758758SYork Sun case FM1_DTSEC4: 1059e758758SYork Sun case FM1_DTSEC5: 1069e758758SYork Sun case FM1_DTSEC6: 1079e758758SYork Sun case FM1_DTSEC9: 1089e758758SYork Sun case FM1_DTSEC10: 1099e758758SYork Sun if (is_serdes_configured(SGMII_FM1_DTSEC1 + port - FM1_DTSEC1)) 1109e758758SYork Sun return PHY_INTERFACE_MODE_SGMII; 1119e758758SYork Sun break; 1129e758758SYork Sun case FM2_DTSEC1: 1139e758758SYork Sun case FM2_DTSEC2: 1149e758758SYork Sun case FM2_DTSEC3: 1159e758758SYork Sun case FM2_DTSEC4: 1169e758758SYork Sun case FM2_DTSEC5: 1179e758758SYork Sun case FM2_DTSEC6: 1189e758758SYork Sun case FM2_DTSEC9: 1199e758758SYork Sun case FM2_DTSEC10: 1209e758758SYork Sun if (is_serdes_configured(SGMII_FM2_DTSEC1 + port - FM2_DTSEC1)) 1219e758758SYork Sun return PHY_INTERFACE_MODE_SGMII; 1229e758758SYork Sun break; 1239e758758SYork Sun default: 1241c68d01eSShaohui Xie break; 1251c68d01eSShaohui Xie } 1261c68d01eSShaohui Xie 1271c68d01eSShaohui Xie /* handle QSGMII */ 1281c68d01eSShaohui Xie switch (port) { 1291c68d01eSShaohui Xie case FM1_DTSEC1: 1301c68d01eSShaohui Xie case FM1_DTSEC2: 1311c68d01eSShaohui Xie case FM1_DTSEC3: 1321c68d01eSShaohui Xie case FM1_DTSEC4: 1331c68d01eSShaohui Xie /* check lane G on SerDes1 */ 1341c68d01eSShaohui Xie if (is_serdes_configured(QSGMII_FM1_A)) 1351c68d01eSShaohui Xie return PHY_INTERFACE_MODE_QSGMII; 1361c68d01eSShaohui Xie break; 1371c68d01eSShaohui Xie case FM1_DTSEC5: 1381c68d01eSShaohui Xie case FM1_DTSEC6: 1391c68d01eSShaohui Xie case FM1_DTSEC9: 1401c68d01eSShaohui Xie case FM1_DTSEC10: 1411c68d01eSShaohui Xie /* check lane C on SerDes1 */ 1421c68d01eSShaohui Xie if (is_serdes_configured(QSGMII_FM1_B)) 1431c68d01eSShaohui Xie return PHY_INTERFACE_MODE_QSGMII; 1441c68d01eSShaohui Xie break; 1451c68d01eSShaohui Xie case FM2_DTSEC1: 1461c68d01eSShaohui Xie case FM2_DTSEC2: 1471c68d01eSShaohui Xie case FM2_DTSEC3: 1481c68d01eSShaohui Xie case FM2_DTSEC4: 1491c68d01eSShaohui Xie /* check lane G on SerDes2 */ 1501c68d01eSShaohui Xie if (is_serdes_configured(QSGMII_FM2_A)) 1511c68d01eSShaohui Xie return PHY_INTERFACE_MODE_QSGMII; 1521c68d01eSShaohui Xie break; 1531c68d01eSShaohui Xie case FM2_DTSEC5: 1541c68d01eSShaohui Xie case FM2_DTSEC6: 1551c68d01eSShaohui Xie case FM2_DTSEC9: 1561c68d01eSShaohui Xie case FM2_DTSEC10: 1571c68d01eSShaohui Xie /* check lane C on SerDes2 */ 1581c68d01eSShaohui Xie if (is_serdes_configured(QSGMII_FM2_B)) 1591c68d01eSShaohui Xie return PHY_INTERFACE_MODE_QSGMII; 1601c68d01eSShaohui Xie break; 1611c68d01eSShaohui Xie default: 1621c68d01eSShaohui Xie break; 1639e758758SYork Sun } 1649e758758SYork Sun 1659e758758SYork Sun return PHY_INTERFACE_MODE_NONE; 1669e758758SYork Sun } 167