xref: /rk3399_rockchip-uboot/drivers/net/fm/ls1043.c (revision 5cafcbab580bac6c7f44ca4a164c422b7e1ecf20)
1e8297341SShaohui Xie /*
2e8297341SShaohui Xie  * Copyright 2015 Freescale Semiconductor, Inc.
3e8297341SShaohui Xie  *
4e8297341SShaohui Xie  * SPDX-License-Identifier:	GPL-2.0+
5e8297341SShaohui Xie  */
6e8297341SShaohui Xie #include <common.h>
7e8297341SShaohui Xie #include <phy.h>
8e8297341SShaohui Xie #include <fm_eth.h>
9e8297341SShaohui Xie #include <asm/io.h>
10e8297341SShaohui Xie #include <asm/arch/fsl_serdes.h>
11e8297341SShaohui Xie 
12e8297341SShaohui Xie #define FSL_CHASSIS2_RCWSR13_EC1		0xe0000000 /* bits 416..418 */
13e8297341SShaohui Xie #define FSL_CHASSIS2_RCWSR13_EC1_DTSEC3_RGMII	0x00000000
14e8297341SShaohui Xie #define FSL_CHASSIS2_RCWSR13_EC1_GPIO		0x20000000
15e8297341SShaohui Xie #define FSL_CHASSIS2_RCWSR13_EC1_FTM		0xa0000000
16e8297341SShaohui Xie #define FSL_CHASSIS2_RCWSR13_EC2		0x1c000000 /* bits 419..421 */
17e8297341SShaohui Xie #define FSL_CHASSIS2_RCWSR13_EC2_DTSEC4_RGMII	0x00000000
18e8297341SShaohui Xie #define FSL_CHASSIS2_RCWSR13_EC2_GPIO		0x04000000
19e8297341SShaohui Xie #define FSL_CHASSIS2_RCWSR13_EC2_1588		0x08000000
20e8297341SShaohui Xie #define FSL_CHASSIS2_RCWSR13_EC2_FTM		0x14000000
21e8297341SShaohui Xie 
22e8297341SShaohui Xie u32 port_to_devdisr[] = {
23e8297341SShaohui Xie 	[FM1_DTSEC1] = FSL_CHASSIS2_DEVDISR2_DTSEC1_1,
24e8297341SShaohui Xie 	[FM1_DTSEC2] = FSL_CHASSIS2_DEVDISR2_DTSEC1_2,
25e8297341SShaohui Xie 	[FM1_DTSEC3] = FSL_CHASSIS2_DEVDISR2_DTSEC1_3,
26e8297341SShaohui Xie 	[FM1_DTSEC4] = FSL_CHASSIS2_DEVDISR2_DTSEC1_4,
27e8297341SShaohui Xie 	[FM1_DTSEC5] = FSL_CHASSIS2_DEVDISR2_DTSEC1_5,
28e8297341SShaohui Xie 	[FM1_DTSEC6] = FSL_CHASSIS2_DEVDISR2_DTSEC1_6,
29e8297341SShaohui Xie 	[FM1_DTSEC9] = FSL_CHASSIS2_DEVDISR2_DTSEC1_9,
30e8297341SShaohui Xie 	[FM1_DTSEC10] = FSL_CHASSIS2_DEVDISR2_DTSEC1_10,
31e8297341SShaohui Xie 	[FM1_10GEC1] = FSL_CHASSIS2_DEVDISR2_10GEC1_1,
32e8297341SShaohui Xie 	[FM1_10GEC2] = FSL_CHASSIS2_DEVDISR2_10GEC1_2,
33e8297341SShaohui Xie 	[FM1_10GEC3] = FSL_CHASSIS2_DEVDISR2_10GEC1_3,
34e8297341SShaohui Xie 	[FM1_10GEC4] = FSL_CHASSIS2_DEVDISR2_10GEC1_4,
35e8297341SShaohui Xie };
36e8297341SShaohui Xie 
is_device_disabled(enum fm_port port)37e8297341SShaohui Xie static int is_device_disabled(enum fm_port port)
38e8297341SShaohui Xie {
39e8297341SShaohui Xie 	struct ccsr_gur *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR);
40e8297341SShaohui Xie 	u32 devdisr2 = in_be32(&gur->devdisr2);
41e8297341SShaohui Xie 
42e8297341SShaohui Xie 	return port_to_devdisr[port] & devdisr2;
43e8297341SShaohui Xie }
44e8297341SShaohui Xie 
fman_disable_port(enum fm_port port)45e8297341SShaohui Xie void fman_disable_port(enum fm_port port)
46e8297341SShaohui Xie {
47e8297341SShaohui Xie 	struct ccsr_gur *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR);
48e8297341SShaohui Xie 
49e8297341SShaohui Xie 	setbits_be32(&gur->devdisr2, port_to_devdisr[port]);
50e8297341SShaohui Xie }
51e8297341SShaohui Xie 
fman_port_enet_if(enum fm_port port)52e8297341SShaohui Xie phy_interface_t fman_port_enet_if(enum fm_port port)
53e8297341SShaohui Xie {
54e8297341SShaohui Xie 	struct ccsr_gur *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR);
55e8297341SShaohui Xie 	u32 rcwsr13 = in_be32(&gur->rcwsr[13]);
56e8297341SShaohui Xie 
57862d9296SMingkai Hu 	if (is_device_disabled(port))
58e8297341SShaohui Xie 		return PHY_INTERFACE_MODE_NONE;
59e8297341SShaohui Xie 
60e8297341SShaohui Xie 	if ((port == FM1_10GEC1) && (is_serdes_configured(XFI_FM1_MAC9)))
61e8297341SShaohui Xie 		return PHY_INTERFACE_MODE_XGMII;
62e8297341SShaohui Xie 
63e8297341SShaohui Xie 	if ((port == FM1_DTSEC9) && (is_serdes_configured(XFI_FM1_MAC9)))
64e8297341SShaohui Xie 		return PHY_INTERFACE_MODE_NONE;
65e8297341SShaohui Xie 
66e8297341SShaohui Xie 	if (port == FM1_DTSEC3)
67e8297341SShaohui Xie 		if ((rcwsr13 & FSL_CHASSIS2_RCWSR13_EC1) ==
68e8297341SShaohui Xie 				FSL_CHASSIS2_RCWSR13_EC1_DTSEC3_RGMII) {
69*5a78a472SMadalin Bucur 			return PHY_INTERFACE_MODE_RGMII_TXID;
70e8297341SShaohui Xie 		}
71e8297341SShaohui Xie 	if (port == FM1_DTSEC4)
72e8297341SShaohui Xie 		if ((rcwsr13 & FSL_CHASSIS2_RCWSR13_EC2) ==
73e8297341SShaohui Xie 				FSL_CHASSIS2_RCWSR13_EC2_DTSEC4_RGMII) {
74*5a78a472SMadalin Bucur 			return PHY_INTERFACE_MODE_RGMII_TXID;
75e8297341SShaohui Xie 		}
76e8297341SShaohui Xie 
77e8297341SShaohui Xie 	/* handle SGMII */
78e8297341SShaohui Xie 	switch (port) {
79e8297341SShaohui Xie 	case FM1_DTSEC1:
80e8297341SShaohui Xie 	case FM1_DTSEC2:
81e8297341SShaohui Xie 		if ((port == FM1_DTSEC2) &&
82e8297341SShaohui Xie 		    is_serdes_configured(SGMII_2500_FM1_DTSEC2))
83e8297341SShaohui Xie 			return PHY_INTERFACE_MODE_SGMII_2500;
84e8297341SShaohui Xie 	case FM1_DTSEC5:
85e8297341SShaohui Xie 	case FM1_DTSEC6:
86e8297341SShaohui Xie 	case FM1_DTSEC9:
87e8297341SShaohui Xie 		if (is_serdes_configured(SGMII_FM1_DTSEC1 + port - FM1_DTSEC1))
88e8297341SShaohui Xie 			return PHY_INTERFACE_MODE_SGMII;
89e8297341SShaohui Xie 		else if ((port == FM1_DTSEC9) &&
90e8297341SShaohui Xie 			 is_serdes_configured(SGMII_2500_FM1_DTSEC9))
91e8297341SShaohui Xie 			return PHY_INTERFACE_MODE_SGMII_2500;
92e8297341SShaohui Xie 		break;
93e8297341SShaohui Xie 	default:
94e8297341SShaohui Xie 		break;
95e8297341SShaohui Xie 	}
96e8297341SShaohui Xie 
97e8297341SShaohui Xie 	/* handle QSGMII */
98e8297341SShaohui Xie 	switch (port) {
99e8297341SShaohui Xie 	case FM1_DTSEC1:
100e8297341SShaohui Xie 	case FM1_DTSEC2:
101e8297341SShaohui Xie 	case FM1_DTSEC5:
102e8297341SShaohui Xie 	case FM1_DTSEC6:
103e8297341SShaohui Xie 		/* only MAC 1,2,5,6 available for QSGMII */
104e8297341SShaohui Xie 		if (is_serdes_configured(QSGMII_FM1_A))
105e8297341SShaohui Xie 			return PHY_INTERFACE_MODE_QSGMII;
106e8297341SShaohui Xie 		break;
107e8297341SShaohui Xie 	default:
108e8297341SShaohui Xie 		break;
109e8297341SShaohui Xie 	}
110e8297341SShaohui Xie 
111e8297341SShaohui Xie 	return PHY_INTERFACE_MODE_NONE;
112e8297341SShaohui Xie }
113