summaryrefslogtreecommitdiff
path: root/drivers/staging/fsl_ppfe/include/pfe/cbus/emac_mtip.h
blob: 9c5d7919455dae90da2853b3cad81fbd76627bc3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
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
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
/*
 * Copyright 2015-2016 Freescale Semiconductor, Inc.
 * Copyright 2017 NXP
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef _EMAC_H_
#define _EMAC_H_

#include <linux/ethtool.h>

#define EMAC_IEVENT_REG		0x004
#define EMAC_IMASK_REG		0x008
#define EMAC_R_DES_ACTIVE_REG	0x010
#define EMAC_X_DES_ACTIVE_REG	0x014
#define EMAC_ECNTRL_REG		0x024
#define EMAC_MII_DATA_REG	0x040
#define EMAC_MII_CTRL_REG	0x044
#define EMAC_MIB_CTRL_STS_REG	0x064
#define EMAC_RCNTRL_REG		0x084
#define EMAC_TCNTRL_REG		0x0C4
#define EMAC_PHY_ADDR_LOW	0x0E4
#define EMAC_PHY_ADDR_HIGH	0x0E8
#define EMAC_GAUR		0x120
#define EMAC_GALR		0x124
#define EMAC_TFWR_STR_FWD	0x144
#define EMAC_RX_SECTION_FULL	0x190
#define EMAC_RX_SECTION_EMPTY	0x194
#define EMAC_TX_SECTION_EMPTY	0x1A0
#define EMAC_TRUNC_FL		0x1B0

#define RMON_T_DROP	0x200 /* Count of frames not cntd correctly */
#define RMON_T_PACKETS	0x204 /* RMON TX packet count */
#define RMON_T_BC_PKT	0x208 /* RMON TX broadcast pkts */
#define RMON_T_MC_PKT	0x20c /* RMON TX multicast pkts */
#define RMON_T_CRC_ALIGN	0x210 /* RMON TX pkts with CRC align err */
#define RMON_T_UNDERSIZE	0x214 /* RMON TX pkts < 64 bytes, good CRC */
#define RMON_T_OVERSIZE	0x218 /* RMON TX pkts > MAX_FL bytes good CRC */
#define RMON_T_FRAG	0x21c /* RMON TX pkts < 64 bytes, bad CRC */
#define RMON_T_JAB	0x220 /* RMON TX pkts > MAX_FL bytes, bad CRC */
#define RMON_T_COL	0x224 /* RMON TX collision count */
#define RMON_T_P64	0x228 /* RMON TX 64 byte pkts */
#define RMON_T_P65TO127	0x22c /* RMON TX 65 to 127 byte pkts */
#define RMON_T_P128TO255	0x230 /* RMON TX 128 to 255 byte pkts */
#define RMON_T_P256TO511	0x234 /* RMON TX 256 to 511 byte pkts */
#define RMON_T_P512TO1023	0x238 /* RMON TX 512 to 1023 byte pkts */
#define RMON_T_P1024TO2047	0x23c /* RMON TX 1024 to 2047 byte pkts */
#define RMON_T_P_GTE2048	0x240 /* RMON TX pkts > 2048 bytes */
#define RMON_T_OCTETS	0x244 /* RMON TX octets */
#define IEEE_T_DROP	0x248 /* Count of frames not counted crtly */
#define IEEE_T_FRAME_OK	0x24c /* Frames tx'd OK */
#define IEEE_T_1COL	0x250 /* Frames tx'd with single collision */
#define IEEE_T_MCOL	0x254 /* Frames tx'd with multiple collision */
#define IEEE_T_DEF	0x258 /* Frames tx'd after deferral delay */
#define IEEE_T_LCOL	0x25c /* Frames tx'd with late collision */
#define IEEE_T_EXCOL	0x260 /* Frames tx'd with excesv collisions */
#define IEEE_T_MACERR	0x264 /* Frames tx'd with TX FIFO underrun */
#define IEEE_T_CSERR	0x268 /* Frames tx'd with carrier sense err */
#define IEEE_T_SQE	0x26c /* Frames tx'd with SQE err */
#define IEEE_T_FDXFC	0x270 /* Flow control pause frames tx'd */
#define IEEE_T_OCTETS_OK	0x274 /* Octet count for frames tx'd w/o err */
#define RMON_R_PACKETS	0x284 /* RMON RX packet count */
#define RMON_R_BC_PKT	0x288 /* RMON RX broadcast pkts */
#define RMON_R_MC_PKT	0x28c /* RMON RX multicast pkts */
#define RMON_R_CRC_ALIGN	0x290 /* RMON RX pkts with CRC alignment err */
#define RMON_R_UNDERSIZE	0x294 /* RMON RX pkts < 64 bytes, good CRC */
#define RMON_R_OVERSIZE	0x298 /* RMON RX pkts > MAX_FL bytes good CRC */
#define RMON_R_FRAG	0x29c /* RMON RX pkts < 64 bytes, bad CRC */
#define RMON_R_JAB	0x2a0 /* RMON RX pkts > MAX_FL bytes, bad CRC */
#define RMON_R_RESVD_O	0x2a4 /* Reserved */
#define RMON_R_P64	0x2a8 /* RMON RX 64 byte pkts */
#define RMON_R_P65TO127	0x2ac /* RMON RX 65 to 127 byte pkts */
#define RMON_R_P128TO255	0x2b0 /* RMON RX 128 to 255 byte pkts */
#define RMON_R_P256TO511	0x2b4 /* RMON RX 256 to 511 byte pkts */
#define RMON_R_P512TO1023	0x2b8 /* RMON RX 512 to 1023 byte pkts */
#define RMON_R_P1024TO2047	0x2bc /* RMON RX 1024 to 2047 byte pkts */
#define RMON_R_P_GTE2048	0x2c0 /* RMON RX pkts > 2048 bytes */
#define RMON_R_OCTETS	0x2c4 /* RMON RX octets */
#define IEEE_R_DROP	0x2c8 /* Count frames not counted correctly */
#define IEEE_R_FRAME_OK	0x2cc /* Frames rx'd OK */
#define IEEE_R_CRC	0x2d0 /* Frames rx'd with CRC err */
#define IEEE_R_ALIGN	0x2d4 /* Frames rx'd with alignment err */
#define IEEE_R_MACERR	0x2d8 /* Receive FIFO overflow count */
#define IEEE_R_FDXFC	0x2dc /* Flow control pause frames rx'd */
#define IEEE_R_OCTETS_OK	0x2e0 /* Octet cnt for frames rx'd w/o err */

#define EMAC_SMAC_0_0	0x500 /*Supplemental MAC Address 0 (RW).*/
#define EMAC_SMAC_0_1	0x504 /*Supplemental MAC Address 0 (RW).*/

/* GEMAC definitions and settings */

#define EMAC_PORT_0	0
#define EMAC_PORT_1	1

/* GEMAC Bit definitions */
#define EMAC_IEVENT_HBERR		 0x80000000
#define EMAC_IEVENT_BABR		 0x40000000
#define EMAC_IEVENT_BABT		 0x20000000
#define EMAC_IEVENT_GRA			 0x10000000
#define EMAC_IEVENT_TXF			 0x08000000
#define EMAC_IEVENT_TXB			 0x04000000
#define EMAC_IEVENT_RXF			 0x02000000
#define EMAC_IEVENT_RXB			 0x01000000
#define EMAC_IEVENT_MII			 0x00800000
#define EMAC_IEVENT_EBERR		 0x00400000
#define EMAC_IEVENT_LC			 0x00200000
#define EMAC_IEVENT_RL			 0x00100000
#define EMAC_IEVENT_UN			 0x00080000

#define EMAC_IMASK_HBERR                 0x80000000
#define EMAC_IMASK_BABR                  0x40000000
#define EMAC_IMASKT_BABT                 0x20000000
#define EMAC_IMASK_GRA                   0x10000000
#define EMAC_IMASKT_TXF                  0x08000000
#define EMAC_IMASK_TXB                   0x04000000
#define EMAC_IMASKT_RXF                  0x02000000
#define EMAC_IMASK_RXB                   0x01000000
#define EMAC_IMASK_MII                   0x00800000
#define EMAC_IMASK_EBERR                 0x00400000
#define EMAC_IMASK_LC                    0x00200000
#define EMAC_IMASKT_RL                   0x00100000
#define EMAC_IMASK_UN                    0x00080000

#define EMAC_RCNTRL_MAX_FL_SHIFT         16
#define EMAC_RCNTRL_LOOP                 0x00000001
#define EMAC_RCNTRL_DRT                  0x00000002
#define EMAC_RCNTRL_MII_MODE             0x00000004
#define EMAC_RCNTRL_PROM                 0x00000008
#define EMAC_RCNTRL_BC_REJ               0x00000010
#define EMAC_RCNTRL_FCE                  0x00000020
#define EMAC_RCNTRL_RGMII                0x00000040
#define EMAC_RCNTRL_SGMII                0x00000080
#define EMAC_RCNTRL_RMII                 0x00000100
#define EMAC_RCNTRL_RMII_10T             0x00000200
#define EMAC_RCNTRL_CRC_FWD		 0x00004000

#define EMAC_TCNTRL_GTS                  0x00000001
#define EMAC_TCNTRL_HBC                  0x00000002
#define EMAC_TCNTRL_FDEN                 0x00000004
#define EMAC_TCNTRL_TFC_PAUSE            0x00000008
#define EMAC_TCNTRL_RFC_PAUSE            0x00000010

#define EMAC_ECNTRL_RESET                0x00000001      /* reset the EMAC */
#define EMAC_ECNTRL_ETHER_EN             0x00000002      /* enable the EMAC */
#define EMAC_ECNTRL_MAGIC_ENA		 0x00000004
#define EMAC_ECNTRL_SLEEP		 0x00000008
#define EMAC_ECNTRL_SPEED                0x00000020
#define EMAC_ECNTRL_DBSWAP               0x00000100

#define EMAC_X_WMRK_STRFWD               0x00000100

#define EMAC_X_DES_ACTIVE_TDAR           0x01000000
#define EMAC_R_DES_ACTIVE_RDAR           0x01000000

#define EMAC_RX_SECTION_EMPTY_V		0x00010006
/*
 * The possible operating speeds of the MAC, currently supporting 10, 100 and
 * 1000Mb modes.
 */
enum mac_speed {SPEED_10M, SPEED_100M, SPEED_1000M, SPEED_1000M_PCS};

/* MII-related definitios */
#define EMAC_MII_DATA_ST         0x40000000      /* Start of frame delimiter */
#define EMAC_MII_DATA_OP_RD      0x20000000      /* Perform a read operation */
#define EMAC_MII_DATA_OP_CL45_RD 0x30000000      /* Perform a read operation */
#define EMAC_MII_DATA_OP_WR      0x10000000      /* Perform a write operation */
#define EMAC_MII_DATA_OP_CL45_WR 0x10000000      /* Perform a write operation */
#define EMAC_MII_DATA_PA_MSK     0x0f800000      /* PHY Address field mask */
#define EMAC_MII_DATA_RA_MSK     0x007c0000      /* PHY Register field mask */
#define EMAC_MII_DATA_TA         0x00020000      /* Turnaround */
#define EMAC_MII_DATA_DATAMSK    0x0000ffff      /* PHY data field */

#define EMAC_MII_DATA_RA_SHIFT   18      /* MII Register address bits */
#define EMAC_MII_DATA_RA_MASK	 0x1F      /* MII Register address mask */
#define EMAC_MII_DATA_PA_SHIFT   23      /* MII PHY address bits */
#define EMAC_MII_DATA_PA_MASK    0x1F      /* MII PHY address mask */

#define EMAC_MII_DATA_RA(v) (((v) & EMAC_MII_DATA_RA_MASK) << \
				EMAC_MII_DATA_RA_SHIFT)
#define EMAC_MII_DATA_PA(v) (((v) & EMAC_MII_DATA_RA_MASK) << \
				EMAC_MII_DATA_PA_SHIFT)
#define EMAC_MII_DATA(v)    ((v) & 0xffff)

#define EMAC_MII_SPEED_SHIFT	1
#define EMAC_HOLDTIME_SHIFT	8
#define EMAC_HOLDTIME_MASK	0x7
#define EMAC_HOLDTIME(v)	(((v) & EMAC_HOLDTIME_MASK) << \
					EMAC_HOLDTIME_SHIFT)

/*
 * The Address organisation for the MAC device.  All addresses are split into
 * two 32-bit register fields.  The first one (bottom) is the lower 32-bits of
 * the address and the other field are the high order bits - this may be 16-bits
 * in the case of MAC addresses, or 32-bits for the hash address.
 * In terms of memory storage, the first item (bottom) is assumed to be at a
 * lower address location than 'top'. i.e. top should be at address location of
 * 'bottom' + 4 bytes.
 */
struct pfe_mac_addr {
	u32 bottom;     /* Lower 32-bits of address. */
	u32 top;        /* Upper 32-bits of address. */
};

/*
 * The following is the organisation of the address filters section of the MAC
 * registers.  The Cadence MAC contains four possible specific address match
 * addresses, if an incoming frame corresponds to any one of these four
 * addresses then the frame will be copied to memory.
 * It is not necessary for all four of the address match registers to be
 * programmed, this is application dependent.
 */
struct spec_addr {
	struct pfe_mac_addr one;        /* Specific address register 1. */
	struct pfe_mac_addr two;        /* Specific address register 2. */
	struct pfe_mac_addr three;      /* Specific address register 3. */
	struct pfe_mac_addr four;       /* Specific address register 4. */
};

struct gemac_cfg {
	u32 mode;
	u32 speed;
	u32 duplex;
};

/* EMAC Hash size */
#define EMAC_HASH_REG_BITS       64

#define EMAC_SPEC_ADDR_MAX	4

#endif /* _EMAC_H_ */