xref: /illumos-gate/usr/src/uts/common/io/atge/atge_l1_reg.h (revision 56f33205c9ed776c3c909e07d52e94610a675740)
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)
34 typedef	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 
40 typedef	struct	l1_rx_desc {
41 	uint64_t	addr;
42 	uint32_t	len;
43 } l1_rx_desc_t;
44 
45 typedef	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  */
55 typedef	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