xref: /rk3399_rockchip-uboot/drivers/net/fm/t4240.c (revision dc557e9a1fe00ca9d884bd88feef5bebf23fede4)
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 
is_device_disabled(enum fm_port port)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 
fman_disable_port(enum fm_port port)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 
fman_enable_port(enum fm_port port)52f51d3b71SValentin Longchamp void fman_enable_port(enum fm_port port)
53f51d3b71SValentin Longchamp {
54f51d3b71SValentin Longchamp 	ccsr_gur_t *gur = (void __iomem *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
55f51d3b71SValentin Longchamp 
56f51d3b71SValentin Longchamp 	clrbits_be32(&gur->devdisr2, port_to_devdisr[port]);
57f51d3b71SValentin Longchamp }
58f51d3b71SValentin Longchamp 
fman_port_enet_if(enum fm_port port)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 
749bf499acSShaohui Xie 	if ((port == FM1_DTSEC9 || port == FM1_DTSEC10) &&
759bf499acSShaohui Xie 	    ((is_serdes_configured(XFI_FM1_MAC9)) ||
769bf499acSShaohui Xie 	     (is_serdes_configured(XFI_FM1_MAC10))))
77*8ef548d5SYing Zhang 		return PHY_INTERFACE_MODE_NONE;
789bf499acSShaohui Xie 
79944b6ccfSShaohui Xie 	if ((port == FM2_10GEC1 || port == FM2_10GEC2) &&
80944b6ccfSShaohui Xie 	    ((is_serdes_configured(XAUI_FM2_MAC9))	||
81944b6ccfSShaohui Xie 	     (is_serdes_configured(XAUI_FM2_MAC10))	||
82944b6ccfSShaohui Xie 	     (is_serdes_configured(XFI_FM2_MAC9))	||
83944b6ccfSShaohui Xie 	     (is_serdes_configured(XFI_FM2_MAC10))))
849e758758SYork Sun 		return PHY_INTERFACE_MODE_XGMII;
859e758758SYork Sun 
869e758758SYork Sun #define FSL_CORENET_RCWSR13_EC1			0x60000000 /* bits 417..418 */
879e758758SYork Sun #define FSL_CORENET_RCWSR13_EC1_FM2_DTSEC5_RGMII	0x00000000
889e758758SYork Sun #define FSL_CORENET_RCWSR13_EC1_FM2_GPIO		0x40000000
899e758758SYork Sun #define FSL_CORENET_RCWSR13_EC2			0x18000000 /* bits 419..420 */
909e758758SYork Sun #define FSL_CORENET_RCWSR13_EC2_FM1_DTSEC5_RGMII	0x00000000
919e758758SYork Sun #define FSL_CORENET_RCWSR13_EC2_FM2_DTSEC6_RGMII	0x08000000
929e758758SYork Sun #define FSL_CORENET_RCWSR13_EC2_FM1_GPIO		0x10000000
939e758758SYork Sun 	/* handle RGMII first */
949e758758SYork Sun 	if ((port == FM2_DTSEC5) && ((rcwsr13 & FSL_CORENET_RCWSR13_EC1) ==
959e758758SYork Sun 		FSL_CORENET_RCWSR13_EC1_FM2_DTSEC5_RGMII))
969e758758SYork Sun 		return PHY_INTERFACE_MODE_RGMII;
979e758758SYork Sun 
989e758758SYork Sun 	if ((port == FM1_DTSEC5) && ((rcwsr13 & FSL_CORENET_RCWSR13_EC2) ==
999e758758SYork Sun 		FSL_CORENET_RCWSR13_EC2_FM1_DTSEC5_RGMII))
1009e758758SYork Sun 		return PHY_INTERFACE_MODE_RGMII;
1019e758758SYork Sun 
1029e758758SYork Sun 	if ((port == FM2_DTSEC6) && ((rcwsr13 & FSL_CORENET_RCWSR13_EC2) ==
1039e758758SYork Sun 		FSL_CORENET_RCWSR13_EC2_FM2_DTSEC6_RGMII))
1049e758758SYork Sun 		return PHY_INTERFACE_MODE_RGMII;
1059e758758SYork Sun 	switch (port) {
1069e758758SYork Sun 	case FM1_DTSEC1:
1079e758758SYork Sun 	case FM1_DTSEC2:
1089e758758SYork Sun 	case FM1_DTSEC3:
1099e758758SYork Sun 	case FM1_DTSEC4:
1109e758758SYork Sun 	case FM1_DTSEC5:
1119e758758SYork Sun 	case FM1_DTSEC6:
1129e758758SYork Sun 	case FM1_DTSEC9:
1139e758758SYork Sun 	case FM1_DTSEC10:
1149e758758SYork Sun 		if (is_serdes_configured(SGMII_FM1_DTSEC1 + port - FM1_DTSEC1))
1159e758758SYork Sun 			return PHY_INTERFACE_MODE_SGMII;
1169e758758SYork Sun 		break;
1179e758758SYork Sun 	case FM2_DTSEC1:
1189e758758SYork Sun 	case FM2_DTSEC2:
1199e758758SYork Sun 	case FM2_DTSEC3:
1209e758758SYork Sun 	case FM2_DTSEC4:
1219e758758SYork Sun 	case FM2_DTSEC5:
1229e758758SYork Sun 	case FM2_DTSEC6:
1239e758758SYork Sun 	case FM2_DTSEC9:
1249e758758SYork Sun 	case FM2_DTSEC10:
1259e758758SYork Sun 		if (is_serdes_configured(SGMII_FM2_DTSEC1 + port - FM2_DTSEC1))
1269e758758SYork Sun 			return PHY_INTERFACE_MODE_SGMII;
1279e758758SYork Sun 		break;
1289e758758SYork Sun 	default:
1291c68d01eSShaohui Xie 		break;
1301c68d01eSShaohui Xie 	}
1311c68d01eSShaohui Xie 
1321c68d01eSShaohui Xie 	/* handle QSGMII */
1331c68d01eSShaohui Xie 	switch (port) {
1341c68d01eSShaohui Xie 	case FM1_DTSEC1:
1351c68d01eSShaohui Xie 	case FM1_DTSEC2:
1361c68d01eSShaohui Xie 	case FM1_DTSEC3:
1371c68d01eSShaohui Xie 	case FM1_DTSEC4:
1381c68d01eSShaohui Xie 		/* check lane G on SerDes1 */
1391c68d01eSShaohui Xie 		if (is_serdes_configured(QSGMII_FM1_A))
1401c68d01eSShaohui Xie 			return PHY_INTERFACE_MODE_QSGMII;
1411c68d01eSShaohui Xie 		break;
1421c68d01eSShaohui Xie 	case FM1_DTSEC5:
1431c68d01eSShaohui Xie 	case FM1_DTSEC6:
1441c68d01eSShaohui Xie 	case FM1_DTSEC9:
1451c68d01eSShaohui Xie 	case FM1_DTSEC10:
1461c68d01eSShaohui Xie 		/* check lane C on SerDes1 */
1471c68d01eSShaohui Xie 		if (is_serdes_configured(QSGMII_FM1_B))
1481c68d01eSShaohui Xie 			return PHY_INTERFACE_MODE_QSGMII;
1491c68d01eSShaohui Xie 		break;
1501c68d01eSShaohui Xie 	case FM2_DTSEC1:
1511c68d01eSShaohui Xie 	case FM2_DTSEC2:
1521c68d01eSShaohui Xie 	case FM2_DTSEC3:
1531c68d01eSShaohui Xie 	case FM2_DTSEC4:
1541c68d01eSShaohui Xie 		/* check lane G on SerDes2 */
1551c68d01eSShaohui Xie 		if (is_serdes_configured(QSGMII_FM2_A))
1561c68d01eSShaohui Xie 			return PHY_INTERFACE_MODE_QSGMII;
1571c68d01eSShaohui Xie 		break;
1581c68d01eSShaohui Xie 	case FM2_DTSEC5:
1591c68d01eSShaohui Xie 	case FM2_DTSEC6:
1601c68d01eSShaohui Xie 	case FM2_DTSEC9:
1611c68d01eSShaohui Xie 	case FM2_DTSEC10:
1621c68d01eSShaohui Xie 		/* check lane C on SerDes2 */
1631c68d01eSShaohui Xie 		if (is_serdes_configured(QSGMII_FM2_B))
1641c68d01eSShaohui Xie 			return PHY_INTERFACE_MODE_QSGMII;
1651c68d01eSShaohui Xie 		break;
1661c68d01eSShaohui Xie 	default:
1671c68d01eSShaohui Xie 		break;
1689e758758SYork Sun 	}
1699e758758SYork Sun 
1709e758758SYork Sun 	return PHY_INTERFACE_MODE_NONE;
1719e758758SYork Sun }
172