summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/io/atge/atge_l1e_reg.h
blob: 0853b8eeca7ff3b4fadaeeac30395ff7fd44e100 (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
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright (c) 2012 Gary Mills
 *
 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef _ATGE_L1E_REG_H
#define	_ATGE_L1E_REG_H

#ifdef __cplusplus
	extern "C" {
#endif

/*
 * Number of RX Rings (or pages) we use.
 */
#define	L1E_RX_PAGES		2

#pragma	pack(1)
typedef	struct	rx_rs	{
	uint32_t	seqno;
	uint32_t	length;
	uint32_t	flags;
	uint32_t	vtags;
} rx_rs_t;

typedef	struct	rx_cmb {
	uint32_t	cmb[L1E_RX_PAGES];
} rx_cmb_t;
#pragma	pack()

/* Master configuration */
#define	L1E_MASTER_CFG			0x1400
#define	L1E_MASTER_RESET		0x00000001
#define	L1E_MASTER_MTIMER_ENB		0x00000002
#define	L1E_MASTER_IM_TX_TIMER_ENB	0x00000004
#define	L1E_MASTER_MANUAL_INT_ENB	0x00000008
#define	L1E_MASTER_IM_RX_TIMER_ENB	0x00000020
#define	L1E_MASTER_CHIP_REV_MASK	0x00FF0000
#define	L1E_MASTER_CHIP_ID_MASK		0xFF000000
#define	L1E_MASTER_CHIP_REV_SHIFT	16
#define	L1E_MASTER_CHIP_ID_SHIFT	24


/*
 * DMA CFG registers (L1E specific).
 */
#define	DMA_CFG_RD_REQ_PRI		0x00000400
#define	DMA_CFG_TXCMB_ENB		0x00100000
#define	DMA_CFG_RD_BURST_MASK		0x07
#define	DMA_CFG_RD_BURST_SHIFT		4
#define	DMA_CFG_WR_BURST_MASK		0x07
#define	DMA_CFG_WR_BURST_SHIFT		7

#define	L1E_TX_RING_CNT_MIN		32
#define	L1E_TX_RING_CNT_MAX		1020
#define	L1E_TX_RING_ALIGN		8
#define	L1E_RX_PAGE_ALIGN		32
#define	L1E_CMB_ALIGN			32
#define	L1E_MAX_FRAMELEN		ETHERMAX

#define	L1E_RX_PAGE_SZ_MIN		(8 * 1024)
#define	L1E_RX_PAGE_SZ_MAX		(1024 * 1024)
#define	L1E_RX_FRAMES_PAGE		128
#define	L1E_RX_PAGE_SZ	\
	(ROUNDUP(L1E_MAX_FRAMELEN, L1E_RX_PAGE_ALIGN) * L1E_RX_FRAMES_PAGE)
#define	L1E_TX_CMB_SZ			(sizeof (uint32_t))
#define	L1E_RX_CMB_SZ			(sizeof (uint32_t))

#define	L1E_PROC_MAX	\
	((L1E_RX_PAGE_SZ * L1E_RX_PAGES) / ETHERMAX)
#define	L1E_PROC_DEFAULT		(L1E_PROC_MAX / 4)

#define	L1E_INTRS                                               \
	(INTR_DMA_RD_TO_RST | INTR_DMA_WR_TO_RST |              \
	INTR_RX_PKT | INTR_TX_PKT | INTR_RX_FIFO_OFLOW |        \
	INTR_TX_FIFO_UNDERRUN | INTR_SMB)

#define	L1E_RSS_IDT_TABLE0		0x1560
#define	L1E_RSS_CPU			0x157C

#define	L1E_SRAM_RX_FIFO_LEN		0x1524

#define	L1E_PHY_STATUS			0x1418
#define	PHY_STATUS_100M			0x00020000

#define	L1E_SMB_STAT_TIMER		0x15C4

#define	GPHY_CTRL_EXT_RESET		0x0001
#define	GPHY_CTRL_PIPE_MOD		0x0002
#define	GPHY_CTRL_BERT_START		0x0010
#define	GPHY_CTRL_GL1E_25M_ENB		0x0020
#define	GPHY_CTRL_LPW_EXIT		0x0040
#define	GPHY_CTRL_PHY_IDDQ		0x0080
#define	GPHY_CTRL_PHY_IDDQ_DIS		0x0100
#define	GPHY_CTRL_PCLK_SEL_DIS		0x0200
#define	GPHY_CTRL_HIB_EN		0x0400
#define	GPHY_CTRL_HIB_PULSE		0x0800
#define	GPHY_CTRL_SEL_ANA_RESET		0x1000
#define	GPHY_CTRL_PHY_PLL_ON		0x2000
#define	GPHY_CTRL_PWDOWN_HW		0x4000

#define	RXF_VALID			0x01

#define	L1E_RXF0_PAGE0			0x15F4
#define	L1E_RXF0_PAGE1			0x15F5

#define	L1E_RXF0_PAGE0_ADDR_LO		0x1544
#define	L1E_RXF0_PAGE1_ADDR_LO		0x1548

#define	L1E_RXF_PAGE_SIZE		0x1558

#define	L1E_INT_TRIG_THRESH		0x15C8
#define	INT_TRIG_TX_THRESH_MASK		0x0000FFFF
#define	INT_TRIG_RX_THRESH_MASK		0xFFFF0000
#define	INT_TRIG_TX_THRESH_SHIFT	0
#define	INT_TRIG_RX_THRESH_SHIFT	16

#define	L1E_INT_TRIG_TIMER		0x15CC
#define	INT_TRIG_TX_TIMER_MASK		0x0000FFFF
#define	INT_TRIG_RX_TIMER_MASK		0x0000FFFF
#define	INT_TRIG_TX_TIMER_SHIFT		0
#define	INT_TRIG_RX_TIMER_SHIFT		16

#define	TX_COALSC_PKT_1e		0x15C8  /* W: L1E */
#define	RX_COALSC_PKT_1e		0x15CA  /* W: L1E */
#define	TX_COALSC_TO_1e			0x15CC  /* W: L1E */
#define	RX_COALSC_TO_1e			0x15CE  /* W: L1E */

#define	L1E_HOST_RXF0_PAGEOFF		0x1800
#define	L1E_TPD_CONS_IDX		0x1804
#define	L1E_HOST_RXF1_PAGEOFF		0x1808
#define	L1E_HOST_RXF2_PAGEOFF		0x180C
#define	L1E_HOST_RXF3_PAGEOFF		0x1810
#define	L1E_RXF0_CMB0_ADDR_LO		0x1820
#define	L1E_RXF0_CMB1_ADDR_LO		0x1824
#define	L1E_RXF1_CMB0_ADDR_LO		0x1828
#define	L1E_RXF1_CMB1_ADDR_LO		0x182C
#define	L1E_RXF2_CMB0_ADDR_LO		0x1830
#define	L1E_RXF2_CMB1_ADDR_LO		0x1834
#define	L1E_RXF3_CMB0_ADDR_LO		0x1838
#define	L1E_RXF3_CMB1_ADDR_LO		0x183C
#define	L1E_TX_CMB_ADDR_LO		0x1840
#define	L1E_SMB_ADDR_LO			0x1844

#define	L1E_RD_SEQNO_MASK		0x0000FFFF
#define	L1E_RD_HASH_MASK		0xFFFF0000
#define	L1E_RD_SEQNO_SHIFT		0
#define	L1E_RD_HASH_SHIFT		16
#define	L1E_RX_SEQNO(x)		\
	(((x) & L1E_RD_SEQNO_MASK) >> L1E_RD_SEQNO_SHIFT)
#define	L1E_RD_CSUM_MASK		0x0000FFFF
#define	L1E_RD_LEN_MASK			0x3FFF0000
#define	L1E_RD_CPU_MASK			0xC0000000
#define	L1E_RD_CSUM_SHIFT		0
#define	L1E_RD_LEN_SHIFT		16
#define	L1E_RD_CPU_SHIFT		30
#define	L1E_RX_CSUM(x)	\
	(((x) & L1E_RD_CSUM_MASK) >> L1E_RD_CSUM_SHIFT)
#define	L1E_RX_BYTES(x)	\
	(((x) & L1E_RD_LEN_MASK) >> L1E_RD_LEN_SHIFT)
#define	L1E_RX_CPU(x)	\
	(((x) & L1E_RD_CPU_MASK) >> L1E_RD_CPU_SHIFT)

#define	L1E_RD_RSS_IPV4			0x00000001
#define	L1E_RD_RSS_IPV4_TCP		0x00000002
#define	L1E_RD_RSS_IPV6			0x00000004
#define	L1E_RD_RSS_IPV6_TCP		0x00000008
#define	L1E_RD_IPV6			0x00000010
#define	L1E_RD_IPV4_FRAG		0x00000020
#define	L1E_RD_IPV4_DF			0x00000040
#define	L1E_RD_802_3			0x00000080
#define	L1E_RD_VLAN			0x00000100
#define	L1E_RD_ERROR			0x00000200
#define	L1E_RD_IPV4			0x00000400
#define	L1E_RD_UDP			0x00000800
#define	L1E_RD_TCP			0x00001000
#define	L1E_RD_BCAST			0x00002000
#define	L1E_RD_MCAST			0x00004000
#define	L1E_RD_PAUSE			0x00008000
#define	L1E_RD_CRC			0x00010000
#define	L1E_RD_CODE			0x00020000
#define	L1E_RD_DRIBBLE			0x00040000
#define	L1E_RD_RUNT			0x00080000
#define	L1E_RD_OFLOW			0x00100000
#define	L1E_RD_TRUNC			0x00200000
#define	L1E_RD_IPCSUM_NOK		0x00400000
#define	L1E_RD_TCP_UDPCSUM_NOK		0x00800000
#define	L1E_RD_LENGTH_NOK		0x01000000
#define	L1E_RD_DES_ADDR_FILTERED	0x02000000

/* TX descriptor fields */
#define	L1E_TD_VLAN_MASK		0xFFFF0000
#define	L1E_TD_PKT_INT			0x00008000
#define	L1E_TD_DMA_INT			0x00004000
#define	L1E_TD_VLAN_SHIFT		16
#define	L1E_TX_VLAN_TAG(x)	\
	(((x) << 4) | ((x) >> 13) | (((x) >> 9) & 8))
#define	L1E_TD_BUFLEN_SHIFT		0
#define	L1E_TD_MSS			0xFFF80000
#define	L1E_TD_TSO_HDR			0x00040000
#define	L1E_TD_TCPHDR_LEN		0x0003C000
#define	L1E_TD_IPHDR_LEN		0x00003C00
#define	L1E_TD_IPV6HDR_LEN2		0x00003C00
#define	L1E_TD_LLC_SNAP			0x00000200
#define	L1E_TD_VLAN_TAGGED		0x00000100
#define	L1E_TD_UDPCSUM			0x00000080
#define	L1E_TD_TCPCSUM			0x00000040
#define	L1E_TD_IPCSUM			0x00000020
#define	L1E_TD_IPV6HDR_LEN1		0x000000E0
#define	L1E_TD_TSO			0x00000010
#define	L1E_TD_CXSUM			0x00000008
#define	L1E_TD_INSERT_VLAN_TAG		0x00000004
#define	L1E_TD_IPV6			0x00000002

#define	L1E_TD_CSUM_PLOADOFFSET		0x00FF0000
#define	L1E_TD_CSUM_XSUMOFFSET		0xFF000000
#define	L1E_TD_CSUM_XSUMOFFSET_SHIFT	24
#define	L1E_TD_CSUM_PLOADOFFSET_SHIFT	16
#define	L1E_TD_MSS_SHIFT		19
#define	L1E_TD_TCPHDR_LEN_SHIFT		14
#define	L1E_TD_IPHDR_LEN_SHIFT		10

#define	L1E_JUMBO_FRAMELEN		8132

#define	L1E_TX_JUMBO_THRESH		0x1584
#define	TX_JUMBO_THRESH_MASK		0x000007FF
#define	TX_JUMBO_THRESH_SHIFT		0
#define	TX_JUMBO_THRESH_UNIT		8
#define	TX_JUMBO_THRESH_UNIT_SHIFT	3

/*
 * Statistics counters collected by the MAC.
 * AR81xx requires register access to get MAC statistics
 * and the format of statistics seems to be the same of L1
 * except for tx_abort field in TX stats. So keep it separate for simplicity.
 */
#define	L1E_RX_MIB_BASE			0x1700
#define	L1E_TX_MIB_BASE			0x1760

#pragma	pack(1)
typedef	struct smb {
	/* Rx stats. */
	uint32_t rx_frames;
	uint32_t rx_bcast_frames;
	uint32_t rx_mcast_frames;
	uint32_t rx_pause_frames;
	uint32_t rx_control_frames;
	uint32_t rx_crcerrs;
	uint32_t rx_lenerrs;
	uint32_t rx_bytes;
	uint32_t rx_runts;
	uint32_t rx_fragments;
	uint32_t rx_pkts_64;
	uint32_t rx_pkts_65_127;
	uint32_t rx_pkts_128_255;
	uint32_t rx_pkts_256_511;
	uint32_t rx_pkts_512_1023;
	uint32_t rx_pkts_1024_1518;
	uint32_t rx_pkts_1519_max;
	uint32_t rx_pkts_truncated;
	uint32_t rx_fifo_oflows;
	uint32_t rx_rrs_errs;
	uint32_t rx_alignerrs;
	uint32_t rx_bcast_bytes;
	uint32_t rx_mcast_bytes;
	uint32_t rx_pkts_filtered;
	/* Tx stats. */
	uint32_t tx_frames;
	uint32_t tx_bcast_frames;
	uint32_t tx_mcast_frames;
	uint32_t tx_pause_frames;
	uint32_t tx_excess_defer;
	uint32_t tx_control_frames;
	uint32_t tx_deferred;
	uint32_t tx_bytes;
	uint32_t tx_pkts_64;
	uint32_t tx_pkts_65_127;
	uint32_t tx_pkts_128_255;
	uint32_t tx_pkts_256_511;
	uint32_t tx_pkts_512_1023;
	uint32_t tx_pkts_1024_1518;
	uint32_t tx_pkts_1519_max;
	uint32_t tx_single_colls;
	uint32_t tx_multi_colls;
	uint32_t tx_late_colls;
	uint32_t tx_excess_colls;
	uint32_t tx_abort;
	uint32_t tx_underrun;
	uint32_t tx_desc_underrun;
	uint32_t tx_lenerrs;
	uint32_t tx_pkts_truncated;
	uint32_t tx_bcast_bytes;
	uint32_t tx_mcast_bytes;
} atge_l1e_smb_t;
#pragma	pack()

#ifdef __cplusplus
}
#endif

#endif	/* _ATGE_L1E_REG_H */