1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21/*
22 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
23 * Use is subject to license terms.
24 */
25
26#ifndef _ATGE_L1_REG_H
27#define	_ATGE_L1_REG_H
28
29#ifdef __cplusplus
30	extern "C" {
31#endif
32
33#pragma	pack(1)
34typedef	struct	l1_cmb {
35	uint32_t	intr_status;
36	uint32_t	rx_prod_cons;
37	uint32_t	tx_prod_cons;
38} l1_cmb_t;
39
40typedef	struct	l1_rx_desc {
41	uint64_t	addr;
42	uint32_t	len;
43} l1_rx_desc_t;
44
45typedef	struct	l1_rx_rdesc {
46	uint32_t	index;
47	uint32_t	len;
48	uint32_t	flags;
49	uint32_t	vtags;
50} l1_rx_rdesc_t;
51
52/*
53 * Statistics counters collected by the MAC
54 */
55typedef	struct l1_smb {
56	/* Rx stats. */
57	uint32_t rx_frames;
58	uint32_t rx_bcast_frames;
59	uint32_t rx_mcast_frames;
60	uint32_t rx_pause_frames;
61	uint32_t rx_control_frames;
62	uint32_t rx_crcerrs;
63	uint32_t rx_lenerrs;
64	uint32_t rx_bytes;
65	uint32_t rx_runts;
66	uint32_t rx_fragments;
67	uint32_t rx_pkts_64;
68	uint32_t rx_pkts_65_127;
69	uint32_t rx_pkts_128_255;
70	uint32_t rx_pkts_256_511;
71	uint32_t rx_pkts_512_1023;
72	uint32_t rx_pkts_1024_1518;
73	uint32_t rx_pkts_1519_max;
74	uint32_t rx_pkts_truncated;
75	uint32_t rx_fifo_oflows;
76	uint32_t rx_desc_oflows;
77	uint32_t rx_alignerrs;
78	uint32_t rx_bcast_bytes;
79	uint32_t rx_mcast_bytes;
80	uint32_t rx_pkts_filtered;
81	/* Tx stats. */
82	uint32_t tx_frames;
83	uint32_t tx_bcast_frames;
84	uint32_t tx_mcast_frames;
85	uint32_t tx_pause_frames;
86	uint32_t tx_excess_defer;
87	uint32_t tx_control_frames;
88	uint32_t tx_deferred;
89	uint32_t tx_bytes;
90	uint32_t tx_pkts_64;
91	uint32_t tx_pkts_65_127;
92	uint32_t tx_pkts_128_255;
93	uint32_t tx_pkts_256_511;
94	uint32_t tx_pkts_512_1023;
95	uint32_t tx_pkts_1024_1518;
96	uint32_t tx_pkts_1519_max;
97	uint32_t tx_single_colls;
98	uint32_t tx_multi_colls;
99	uint32_t tx_late_colls;
100	uint32_t tx_excess_colls;
101	uint32_t tx_underrun;
102	uint32_t tx_desc_underrun;
103	uint32_t tx_lenerrs;
104	uint32_t tx_pkts_truncated;
105	uint32_t tx_bcast_bytes;
106	uint32_t tx_mcast_bytes;
107	uint32_t updated;
108} atge_l1_smb_t;
109#pragma	pack()
110
111#define	L1_RX_RING_CNT		256
112#define	L1_RR_RING_CNT		(ATGE_TX_RING_CNT + L1_RX_RING_CNT)
113
114#define	L1_RING_ALIGN		16
115#define	L1_TX_RING_ALIGN	16
116#define	L1_RX_RING_ALIGN	16
117#define	L1_RR_RING_ALIGN	16
118#define	L1_CMB_ALIGN		16
119#define	L1_SMB_ALIGN		16
120
121#define	L1_CMB_BLOCK_SZ	sizeof (struct l1_cmb)
122#define	L1_SMB_BLOCK_SZ	sizeof (struct l1_smb)
123
124#define	L1_RX_RING_SZ		\
125	(sizeof (struct l1_rx_desc) * L1_RX_RING_CNT)
126
127#define	L1_RR_RING_SZ		\
128	(sizeof (struct l1_rx_rdesc) * L1_RR_RING_CNT)
129
130/*
131 * For RX
132 */
133#define	L1_RRD_CONS_SHIFT		16
134#define	L1_RRD_NSEGS_MASK		0x000000FF
135#define	L1_RRD_CONS_MASK		0xFFFF0000
136#define	L1_RRD_NSEGS_SHIFT		0
137#define	L1_RRD_LEN_MASK			0xFFFF0000
138#define	L1_RRD_CSUM_MASK		0x0000FFFF
139#define	L1_RRD_CSUM_SHIFT		0
140#define	L1_RRD_LEN_SHIFT		16
141#define	L1_RRD_ETHERNET			0x00000080
142#define	L1_RRD_VLAN			0x00000100
143#define	L1_RRD_ERROR			0x00000200
144#define	L1_RRD_IPV4			0x00000400
145#define	L1_RRD_UDP			0x00000800
146#define	L1_RRD_TCP			0x00001000
147#define	L1_RRD_BCAST			0x00002000
148#define	L1_RRD_MCAST			0x00004000
149#define	L1_RRD_PAUSE			0x00008000
150#define	L1_RRD_CRC			0x00010000
151#define	L1_RRD_CODE			0x00020000
152#define	L1_RRD_DRIBBLE			0x00040000
153#define	L1_RRD_RUNT			0x00080000
154#define	L1_RRD_OFLOW			0x00100000
155#define	L1_RRD_TRUNC			0x00200000
156#define	L1_RRD_IPCSUM_NOK		0x00400000
157#define	L1_RRD_TCP_UDPCSUM_NOK		0x00800000
158#define	L1_RRD_LENGTH_NOK		0x01000000
159#define	L1_RRD_DES_ADDR_FILTERED	0x02000000
160#define	RRD_PROD_MASK			0x0000FFFF
161#define	TPD_CONS_MASK			0xFFFF0000
162#define	TPD_CONS_SHIFT			16
163#define	CMB_UPDATED			0x00000001
164#define	RRD_PROD_SHIFT			0
165
166/*
167 * All descriptors and CMB/SMB share the same high address.
168 */
169#define	L1_DESC_ADDR_HI	0x1540
170#define	L1_DESC_RD_ADDR_LO	0x1544
171#define	L1_DESC_RRD_ADDR_LO	0x1548
172#define	L1_DESC_TPD_ADDR_LO	0x154C
173#define	L1_DESC_CMB_ADDR_LO	0x1550
174#define	L1_DESC_SMB_ADDR_LO	0x1554
175#define	L1_DESC_RRD_RD_CNT	0x1558
176#define	DESC_RRD_CNT_SHIFT	16
177#define	DESC_RRD_CNT_MASK	0x07FF0000
178#define	DESC_RD_CNT_SHIFT	0
179#define	DESC_RD_CNT_MASK	0x000007FF
180
181/*
182 * PHY registers.
183 */
184#define	L1_CSMB_CTRL		0x15D0
185#define	PHY_CDTS_STAT_OK	0x0000
186#define	PHY_CDTS_STAT_SHORT	0x0100
187#define	PHY_CDTS_STAT_OPEN	0x0200
188#define	PHY_CDTS_STAT_INVAL	0x0300
189#define	PHY_CDTS_STAT_MASK	0x0300
190
191/*
192 * DMA CFG registers (L1 specific)
193 */
194#define	DMA_CFG_RD_ENB		0x00000400
195#define	DMA_CFG_WR_ENB		0x00000800
196#define	DMA_CFG_RD_BURST_MASK	0x07
197#define	DMA_CFG_RD_BURST_SHIFT	4
198#define	DMA_CFG_WR_BURST_MASK	0x07
199#define	DMA_CFG_WR_BURST_SHIFT	7
200
201#define	RXQ_CFG_ENB		0x80000000
202
203#define	L1_RD_LEN_MASK		0x0000FFFF
204#define	L1_RD_LEN_SHIFT	0
205
206#define	L1_SRAM_RD_ADDR		0x1500
207#define	L1_SRAM_RD_LEN			0x1504
208#define	L1_SRAM_RRD_ADDR		0x1508
209#define	L1_SRAM_RRD_LEN		0x150C
210#define	L1_SRAM_TPD_ADDR		0x1510
211#define	L1_SRAM_TPD_LEN		0x1514
212#define	L1_SRAM_TRD_ADDR		0x1518
213#define	L1_SRAM_TRD_LEN		0x151C
214#define	L1_SRAM_RX_FIFO_ADDR		0x1520
215#define	L1_SRAM_RX_FIFO_LEN		0x1524
216#define	L1_SRAM_TX_FIFO_ADDR		0x1528
217#define	L1_SRAM_TX_FIFO_LEN		0x152C
218
219#define	RXQ_CFG_RD_BURST_MASK		0x000000FF
220#define	RXQ_CFG_RRD_BURST_THRESH_MASK	0x0000FF00
221#define	RXQ_CFG_RD_PREF_MIN_IPG_MASK	0x001F0000
222#define	RXQ_CFG_CUT_THROUGH_ENB		0x40000000
223#define	RXQ_CFG_ENB			0x80000000
224#define	RXQ_CFG_RD_BURST_SHIFT		0
225#define	RXQ_CFG_RD_BURST_DEFAULT	8
226#define	RXQ_CFG_RRD_BURST_THRESH_SHIFT	8
227#define	RXQ_CFG_RRD_BURST_THRESH_DEFAULT 8
228#define	RXQ_CFG_RD_PREF_MIN_IPG_SHIFT	16
229#define	RXQ_CFG_RD_PREF_MIN_IPG_DEFAULT	1
230
231#define	TXQ_CFG_ENB			0x00000020
232#define	TXQ_CFG_ENHANCED_MODE		0x00000040
233#define	TXQ_CFG_TPD_FETCH_THRESH_MASK	0x00003F00
234#define	TXQ_CFG_TX_FIFO_BURST_MASK	0xFFFF0000
235#define	TXQ_CFG_TPD_BURST_SHIFT		0
236#define	TXQ_CFG_TPD_BURST_DEFAULT	4
237#define	TXQ_CFG_TPD_FETCH_THRESH_SHIFT	8
238#define	TXQ_CFG_TPD_FETCH_DEFAULT	16
239#define	TXQ_CFG_TX_FIFO_BURST_SHIFT	16
240#define	TXQ_CFG_TX_FIFO_BURST_DEFAULT	256
241
242#define	L1_TX_JUMBO_TPD_TH_IPG		0x1584
243#define	TX_JUMBO_TPD_TH_MASK		0x000007FF
244#define	TX_JUMBO_TPD_IPG_MASK		0x001F0000
245#define	TX_JUMBO_TPD_TH_SHIFT		0
246#define	TX_JUMBO_TPD_IPG_SHIFT		16
247#define	TX_JUMBO_TPD_IPG_DEFAULT	1
248
249/* CMB DMA Write Threshold Register */
250#define	L1_CMB_WR_THRESH		0x15D4
251#define	CMB_WR_THRESH_RRD_MASK		0x000007FF
252#define	CMB_WR_THRESH_TPD_MASK		0x07FF0000
253#define	CMB_WR_THRESH_RRD_SHIFT		0
254#define	CMB_WR_THRESH_RRD_DEFAULT	4
255#define	CMB_WR_THRESH_TPD_SHIFT		16
256#define	CMB_WR_THRESH_TPD_DEFAULT	4
257
258/* SMB auto DMA timer register */
259#define	L1_SMB_TIMER			0x15E4
260
261#define	L1_CSMB_CTRL			0x15D0
262#define	CSMB_CTRL_CMB_KICK		0x00000001
263#define	CSMB_CTRL_SMB_KICK		0x00000002
264#define	CSMB_CTRL_CMB_ENB		0x00000004
265#define	CSMB_CTRL_SMB_ENB		0x00000008
266
267#define	INTR_TX_FIFO_UNDERRUN		0x00000040
268#define	INTR_RX_FIFO_OFLOW		0x00000008
269#define	INTR_TX_DMA			0x00040000
270#define	INTR_RX_DMA			0x00080000
271#define	INTR_CMB_RX			0x00100000
272#define	INTR_CMB_TX			0x00200000
273#define	INTR_MAC_RX			0x00400000
274#define	INTR_MAC_TX			0x00800000
275#define	INTR_UNDERRUN			0x01000000
276#define	INTR_FRAME_ERROR		0x02000000
277#define	INTR_FRAME_OK			0x04000000
278#define	INTR_CSUM_ERROR			0x08000000
279#define	INTR_PHY_LINK_DOWN		0x10000000
280#define	INTR_DIS_SMB			0x20000000
281#define	INTR_DIS_DMA			0x40000000
282#define	INTR_DIS_INT			0x80000000
283
284#define	L1_INTRS	\
285	(INTR_SMB | INTR_DMA_RD_TO_RST | INTR_DMA_WR_TO_RST |	\
286	INTR_CMB_TX | INTR_CMB_RX | INTR_RX_FIFO_OFLOW | INTR_TX_FIFO_UNDERRUN)
287
288#define	L1_RXQ_RRD_PAUSE_THRESH	0x15AC
289#define	RXQ_RRD_PAUSE_THRESH_HI_MASK	0x00000FFF
290#define	RXQ_RRD_PAUSE_THRESH_LO_MASK	0x0FFF0000
291#define	RXQ_RRD_PAUSE_THRESH_HI_SHIFT	0
292#define	RXQ_RRD_PAUSE_THRESH_LO_SHIFT	16
293
294/* RX/TX count-down timer to trigger CMB-write. */
295#define	L1_CMB_WR_TIMER			0x15D8
296#define	CMB_WR_TIMER_RX_MASK		0x0000FFFF
297#define	CMB_WR_TIMER_TX_MASK		0xFFFF0000
298#define	CMB_WR_TIMER_RX_SHIFT		0
299#define	CMB_WR_TIMER_TX_SHIFT		16
300
301/*
302 * Useful macros.
303 */
304#define	L1_RX_NSEGS(x)	\
305	(((x) & L1_RRD_NSEGS_MASK) >> L1_RRD_NSEGS_SHIFT)
306#define	L1_RX_CONS(x)	\
307	(((x) & L1_RRD_CONS_MASK) >> L1_RRD_CONS_SHIFT)
308#define	L1_RX_CSUM(x)	\
309	(((x) & L1_RRD_CSUM_MASK) >> L1_RRD_CSUM_SHIFT)
310#define	L1_RX_BYTES(x)	\
311	(((x) & L1_RRD_LEN_MASK) >> L1_RRD_LEN_SHIFT)
312
313
314#ifdef __cplusplus
315}
316#endif
317
318#endif	/* _ATGE_L1_REG_H */
319