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