Blame view

board/freescale/t104xrdb/eth.c 4.22 KB
83d290c56   Tom Rini   SPDX: Convert all...
1
  // SPDX-License-Identifier: GPL-2.0+
714fd406d   Priyanka Jain   powerpc/t104xrdb:...
2
3
  /*
   * Copyright 2014 Freescale Semiconductor, Inc.
714fd406d   Priyanka Jain   powerpc/t104xrdb:...
4
5
6
7
   */
  
  #include <common.h>
  #include <netdev.h>
db4a1767c   Codrin Ciubotariu   board/T1040rdb: A...
8
  #include <asm/fsl_serdes.h>
714fd406d   Priyanka Jain   powerpc/t104xrdb:...
9
10
11
12
  #include <asm/immap_85xx.h>
  #include <fm_eth.h>
  #include <fsl_mdio.h>
  #include <malloc.h>
8225b2fd8   Shaohui Xie   net: Move some he...
13
  #include <fsl_dtsec.h>
db4a1767c   Codrin Ciubotariu   board/T1040rdb: A...
14
  #include <vsc9953.h>
714fd406d   Priyanka Jain   powerpc/t104xrdb:...
15
16
17
18
19
20
21
22
23
  
  #include "../common/fman.h"
  
  int board_eth_init(bd_t *bis)
  {
  #ifdef CONFIG_FMAN_ENET
  	struct memac_mdio_info memac_mdio_info;
  	unsigned int i;
  	int phy_addr = 0;
db4a1767c   Codrin Ciubotariu   board/T1040rdb: A...
24
25
26
27
  #ifdef CONFIG_VSC9953
  	phy_interface_t phy_int;
  	struct mii_dev *bus;
  #endif
714fd406d   Priyanka Jain   powerpc/t104xrdb:...
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
  	printf("Initializing Fman
  ");
  
  	memac_mdio_info.regs =
  		(struct memac_mdio_controller *)CONFIG_SYS_FM1_DTSEC_MDIO_ADDR;
  	memac_mdio_info.name = DEFAULT_FM_MDIO_NAME;
  
  	/* Register the real 1G MDIO bus */
  	fm_memac_mdio_init(bis, &memac_mdio_info);
  
  	/*
  	 * Program on board RGMII, SGMII PHY addresses.
  	 */
  	for (i = FM1_DTSEC1; i < FM1_DTSEC1 + CONFIG_SYS_NUM_FM1_DTSEC; i++) {
  		int idx = i - FM1_DTSEC1;
  
  		switch (fm_info_get_enet_if(i)) {
6fcddd098   York Sun   powerpc: T1040RDB...
45
  #if defined(CONFIG_TARGET_T1040RDB) || defined(CONFIG_TARGET_T1040D4RDB)
714fd406d   Priyanka Jain   powerpc/t104xrdb:...
46
  		case PHY_INTERFACE_MODE_SGMII:
4b6067ae9   Priyanka Jain   powerpc/T104xD4RD...
47
48
49
  			/* T1040RDB & T1040D4RDB only supports SGMII on
  			 * DTSEC3
  			 */
714fd406d   Priyanka Jain   powerpc/t104xrdb:...
50
51
  			fm_info_set_phy_address(FM1_DTSEC3,
  						CONFIG_SYS_SGMII1_PHY_ADDR);
b0615f0bd   Shaohui Xie   powerpc/t1040rdb:...
52
  			break;
714fd406d   Priyanka Jain   powerpc/t104xrdb:...
53
  #endif
0167369cf   York Sun   powerpc: T1042RDB...
54
  #ifdef CONFIG_TARGET_T1042RDB
363fb32ac   vijay rai   powerpc/t104xrdb:...
55
56
57
58
59
60
61
62
63
  		case PHY_INTERFACE_MODE_SGMII:
  			/* T1042RDB doesn't supports SGMII on DTSEC1 & DTSEC2 */
  			if ((FM1_DTSEC1 == i) || (FM1_DTSEC2 == i))
  				fm_info_set_phy_address(i, 0);
  			/* T1042RDB only supports SGMII on DTSEC3 */
  			fm_info_set_phy_address(FM1_DTSEC3,
  						CONFIG_SYS_SGMII1_PHY_ADDR);
  			break;
  #endif
319ed24a8   York Sun   powerpc: T1042D4R...
64
  #ifdef CONFIG_TARGET_T1042D4RDB
4b6067ae9   Priyanka Jain   powerpc/T104xD4RD...
65
66
67
68
69
70
71
72
73
74
75
76
77
  		case PHY_INTERFACE_MODE_SGMII:
  			/* T1042D4RDB supports SGMII on DTSEC1, DTSEC2
  			 *  & DTSEC3
  			 */
  			if (FM1_DTSEC1 == i)
  				phy_addr = CONFIG_SYS_SGMII1_PHY_ADDR;
  			if (FM1_DTSEC2 == i)
  				phy_addr = CONFIG_SYS_SGMII2_PHY_ADDR;
  			if (FM1_DTSEC3 == i)
  				phy_addr = CONFIG_SYS_SGMII3_PHY_ADDR;
  			fm_info_set_phy_address(i, phy_addr);
  			break;
  #endif
714fd406d   Priyanka Jain   powerpc/t104xrdb:...
78
  		case PHY_INTERFACE_MODE_RGMII:
78368804d   Madalin Bucur   board: freescale:...
79
80
81
  		case PHY_INTERFACE_MODE_RGMII_TXID:
  		case PHY_INTERFACE_MODE_RGMII_RXID:
  		case PHY_INTERFACE_MODE_RGMII_ID:
714fd406d   Priyanka Jain   powerpc/t104xrdb:...
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
  			if (FM1_DTSEC4 == i)
  				phy_addr = CONFIG_SYS_RGMII1_PHY_ADDR;
  			if (FM1_DTSEC5 == i)
  				phy_addr = CONFIG_SYS_RGMII2_PHY_ADDR;
  			fm_info_set_phy_address(i, phy_addr);
  			break;
  		case PHY_INTERFACE_MODE_QSGMII:
  			fm_info_set_phy_address(i, 0);
  			break;
  		case PHY_INTERFACE_MODE_NONE:
  			fm_info_set_phy_address(i, 0);
  			break;
  		default:
  			printf("Fman1: DTSEC%u set to unknown interface %i
  ",
  			       idx + 1, fm_info_get_enet_if(i));
  			fm_info_set_phy_address(i, 0);
  			break;
  		}
9b478bef2   Codrin Ciubotariu   board/T104xrdb: T...
101
102
103
104
105
106
107
  		if (fm_info_get_enet_if(i) == PHY_INTERFACE_MODE_QSGMII ||
  		    fm_info_get_enet_if(i) == PHY_INTERFACE_MODE_NONE)
  			fm_info_set_mdio(i, NULL);
  		else
  			fm_info_set_mdio(i,
  					 miiphy_get_dev_by_name(
  							DEFAULT_FM_MDIO_NAME));
714fd406d   Priyanka Jain   powerpc/t104xrdb:...
108
  	}
db4a1767c   Codrin Ciubotariu   board/T1040rdb: A...
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
  #ifdef CONFIG_VSC9953
  	/* SerDes configured for QSGMII */
  	if (serdes_get_first_lane(FSL_SRDS_1, QSGMII_SW1_A) >= 0) {
  		for (i = 0; i < 4; i++) {
  			bus = miiphy_get_dev_by_name(DEFAULT_FM_MDIO_NAME);
  			phy_addr = CONFIG_SYS_FM1_QSGMII11_PHY_ADDR + i;
  			phy_int = PHY_INTERFACE_MODE_QSGMII;
  
  			vsc9953_port_info_set_mdio(i, bus);
  			vsc9953_port_info_set_phy_address(i, phy_addr);
  			vsc9953_port_info_set_phy_int(i, phy_int);
  			vsc9953_port_enable(i);
  		}
  	}
  	if (serdes_get_first_lane(FSL_SRDS_1, QSGMII_SW1_B) >= 0) {
  		for (i = 4; i < 8; i++) {
  			bus = miiphy_get_dev_by_name(DEFAULT_FM_MDIO_NAME);
  			phy_addr = CONFIG_SYS_FM1_QSGMII21_PHY_ADDR + i - 4;
  			phy_int = PHY_INTERFACE_MODE_QSGMII;
  
  			vsc9953_port_info_set_mdio(i, bus);
  			vsc9953_port_info_set_phy_address(i, phy_addr);
  			vsc9953_port_info_set_phy_int(i, phy_int);
  			vsc9953_port_enable(i);
  		}
  	}
  
  	/* Connect DTSEC1 to L2 switch if it doesn't have a PHY */
  	if (serdes_get_first_lane(FSL_SRDS_1, SGMII_FM1_DTSEC1) < 0)
  		vsc9953_port_enable(8);
  
  	/* Connect DTSEC2 to L2 switch if it doesn't have a PHY */
  	if (serdes_get_first_lane(FSL_SRDS_1, SGMII_FM1_DTSEC2) < 0) {
  		/* Enable L2 On MAC2 using SCFG */
  		struct ccsr_scfg *scfg = (struct ccsr_scfg *)
  				CONFIG_SYS_MPC85xx_SCFG;
  
  		out_be32(&scfg->esgmiiselcr, in_be32(&scfg->esgmiiselcr) |
  			 (0x80000000));
  		vsc9953_port_enable(9);
  	}
  #endif
714fd406d   Priyanka Jain   powerpc/t104xrdb:...
151
152
153
154
155
  	cpu_eth_init(bis);
  #endif
  
  	return pci_eth_init(bis);
  }