summaryrefslogtreecommitdiff
path: root/sys/dev/pci/if_xgereg.h
blob: fac200e6d1c122d46e6a90d2859224eaee3f8081 (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
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
/*	$OpenBSD: if_xgereg.h,v 1.1 2006/05/01 00:34:12 brad Exp $	*/
/*	$NetBSD: if_xgereg.h,v 1.1 2005/09/09 10:30:27 ragge Exp $	*/

/*
 * Copyright (c) 2004, SUNET, Swedish University Computer Network.
 * All rights reserved.
 *
 * Written by Anders Magnusson for SUNET, Swedish University Computer Network.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *      This product includes software developed for the NetBSD Project by
 *      SUNET, Swedish University Computer Network.
 * 4. The name of SUNET may not be used to endorse or promote products
 *    derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY SUNET ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL SUNET
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

/*
 * Defines for the Neterion Xframe adapter.
 */

/* PCI address space */
#define	XGE_PIF_BAR	0x10
#define	XGE_TXP_BAR	0x18

/* PIF register address calculation */
#define	DCSRB(x) (0x0000+(x))	/* 10GbE Device Control and Status Registers */
#define	PCIXB(x) (0x0800+(x))	/* PCI-X Interface Functional Registers */
#define	TDMAB(x) (0x1000+(x))	/* Transmit DMA Functional Registers */
#define	RDMAB(x) (0x1800+(x))	/* Receive DMA Functional Registers */
#define	MACRB(x) (0x2000+(x))	/* MAC functional registers */
#define	RLDRB(x) (0x2800+(x))	/* RLDRAM memory controller */
#define	XGXSB(x) (0x3000+(x))	/* XGXS functional Registers */

/*
 * Control and Status Registers
 */
#define	GENERAL_INT_STATUS	DCSRB(0x0000)
#define	GENERAL_INT_MASK	DCSRB(0x0008)
#define	SW_RESET		DCSRB(0x0100)
#define	 XGXS_RESET(x)		((uint64_t)(x) << 32)
#define	ADAPTER_STATUS		DCSRB(0x0108)
#define	 TDMA_READY		(1ULL<<63)
#define	 RDMA_READY		(1ULL<<62)
#define	 PFC_READY		(1ULL<<61)
#define	 TMAC_BUF_EMPTY		(1ULL<<60)
#define	 PIC_QUIESCENT		(1ULL<<58)
#define	 RMAC_REMOTE_FAULT	(1ULL<<57)
#define	 RMAC_LOCAL_FAULT	(1ULL<<56)
#define	 MC_DRAM_READY		(1ULL<<39)
#define	 MC_QUEUES_READY	(1ULL<<38)
#define	 M_PLL_LOCK		(1ULL<<33)
#define	 P_PLL_LOCK		(1ULL<<32)
#define	ADAPTER_CONTROL		DCSRB(0x0110)
#define	 ADAPTER_EN		(1ULL<<56)
#define	 EOI_TX_ON		(1ULL<<48)
#define	 LED_ON			(1ULL<<40)
#define	 WAIT_INT_EN		(1ULL<<15)
#define	 ECC_ENABLE_N		(1ULL<<8)

/* for debug of ADAPTER_STATUS */
#define	QUIESCENT (TDMA_READY|RDMA_READY|PFC_READY|TMAC_BUF_EMPTY|\
	PIC_QUIESCENT|MC_DRAM_READY|MC_QUEUES_READY|M_PLL_LOCK|P_PLL_LOCK)
#define	QUIESCENT_BMSK	\
	"\177\20b\x3fTDMA_READY\0b\x3eRDMA_READY\0b\x3dPFC_READY\0" \
	"b\x3cTMAC_BUF_EMPTY\0b\x3aPIC_QUIESCENT\0\x39RMAC_REMOTE_FAULT\0" \
	"b\x38RMAC_LOCAL_FAULT\0b\x27MC_DRAM_READY\0b\x26MC_QUEUES_READY\0" \
	"b\x21M_PLL_LOCK\0b\x20P_PLL_LOCK"

/*
 * PCI-X registers
 */
/* Interrupt control registers */
#define	PIC_INT_STATUS		PCIXB(0)
#define	PIC_INT_MASK		PCIXB(0x008)
#define	TXPIC_INT_MASK		PCIXB(0x018)
#define	RXPIC_INT_MASK		PCIXB(0x030)
#define	FLASH_INT_MASK		PCIXB(0x048)
#define	MDIO_INT_MASK		PCIXB(0x060)
#define	IIC_INT_MASK		PCIXB(0x078)
#define	GPIO_INT_MASK		PCIXB(0x098)
#define	TX_TRAFFIC_INT		PCIXB(0x0e0)
#define	TX_TRAFFIC_MASK		PCIXB(0x0e8)
#define	RX_TRAFFIC_INT		PCIXB(0x0f0)
#define	RX_TRAFFIC_MASK		PCIXB(0x0f8)
#define	PIC_CONTROL		PCIXB(0x100)

/* Byte swapping for little-endian */
#define	SWAPPER_CTRL		PCIXB(0x108)
#define	 PIF_R_FE		(1ULL<<63)
#define	 PIF_R_SE		(1ULL<<62)
#define	 PIF_W_FE		(1ULL<<55)
#define	 PIF_W_SE		(1ULL<<54)
#define	 TxP_FE			(1ULL<<47)
#define	 TxP_SE			(1ULL<<46)
#define	 TxD_R_FE		(1ULL<<45)
#define	 TxD_R_SE		(1ULL<<44)
#define	 TxD_W_FE		(1ULL<<43)
#define	 TxD_W_SE		(1ULL<<42)
#define	 TxF_R_FE		(1ULL<<41)
#define	 TxF_R_SE		(1ULL<<40)
#define	 RxD_R_FE		(1ULL<<31)
#define	 RxD_R_SE		(1ULL<<30)
#define	 RxD_W_FE		(1ULL<<29)
#define	 RxD_W_SE		(1ULL<<28)
#define	 RxF_W_FE		(1ULL<<27)
#define	 RxF_W_SE		(1ULL<<26)
#define	 XMSI_FE		(1ULL<<23)
#define	 XMSI_SE		(1ULL<<22)
#define	 STATS_FE		(1ULL<<15)
#define	 STATS_SE		(1ULL<<14)

/* Diagnostic register to check byte-swapping conf */
#define	PIF_RD_SWAPPER_Fb	PCIXB(0x110)
#define	 SWAPPER_MAGIC		0x0123456789abcdefULL

/* Stats registers */
#define	STAT_CFG		PCIXB(0x1d0)
#define	STAT_ADDR		PCIXB(0x1d8)

/* DTE-XGXS Interface */
#define	MDIO_CONTROL		PCIXB(0x1e0)
#define	DTX_CONTROL		PCIXB(0x1e8)
#define	I2C_CONTROL		PCIXB(0x1f0)
#define	GPIO_CONTROL		PCIXB(0x1f8)

/*
 * Transmit DMA registers.
 */
#define	TXDMA_INT_MASK		TDMAB(0x008)
#define	PFC_ERR_MASK		TDMAB(0x018)
#define	TDA_ERR_MASK		TDMAB(0x030)
#define	PCC_ERR_MASK		TDMAB(0x048)
#define	TTI_ERR_MASK		TDMAB(0x060)
#define	LSO_ERR_MASK		TDMAB(0x078)
#define	TPA_ERR_MASK		TDMAB(0x090)
#define	SM_ERR_MASK		TDMAB(0x0a8)

/* Transmit FIFO config */
#define	TX_FIFO_P0		TDMAB(0x0108)
#define	TX_FIFO_P1		TDMAB(0x0110)
#define	TX_FIFO_P2		TDMAB(0x0118)
#define	TX_FIFO_P3		TDMAB(0x0120)
#define	 TX_FIFO_ENABLE		(1ULL<<63)
#define	 TX_FIFO_NUM0(x)	((uint64_t)(x) << 56)
#define	 TX_FIFO_LEN0(x)	((uint64_t)((x)-1) << 32)	
#define	 TX_FIFO_NUM1(x)	((uint64_t)(x) << 24)
#define	 TX_FIFO_LEN1(x)	((uint64_t)((x)-1) << 0)	

/* Transmit interrupts */
#define	TTI_COMMAND_MEM		TDMAB(0x150)
#define	 TTI_CMD_MEM_WE		(1ULL<<56)
#define	 TTI_CMD_MEM_STROBE	(1ULL<<48)
#define	TTI_DATA1_MEM		TDMAB(0x158)
#define	 TX_TIMER_VAL(x)	((uint64_t)(x) << 32)
#define	 TX_TIMER_AC		(1ULL<<25)
#define	 TX_TIMER_CI		(1ULL<<24)
#define	 TX_URNG_A(x)		((uint64_t)(x) << 16)
#define	 TX_URNG_B(x)		((uint64_t)(x) << 8)
#define	 TX_URNG_C(x)		((uint64_t)(x) << 0)
#define	TTI_DATA2_MEM		TDMAB(0x160)
#define	 TX_UFC_A(x)		((uint64_t)(x) << 48)
#define	 TX_UFC_B(x)		((uint64_t)(x) << 32)
#define	 TX_UFC_C(x)		((uint64_t)(x) << 16)
#define	 TX_UFC_D(x)		((uint64_t)(x) << 0)


/* Transmit protocol assist */
#define	TX_PA_CFG		TDMAB(0x0168)
#define	 TX_PA_CFG_IFR		(1ULL<<62)	/* Ignore frame error */
#define	 TX_PA_CFG_ISO		(1ULL<<61)	/* Ignore snap OUI */
#define	 TX_PA_CFG_ILC		(1ULL<<60)	/* Ignore LLC ctrl */
#define	 TX_PA_CFG_ILE		(1ULL<<57)	/* Ignore L2 error */

/*
 * Transmit descriptor list (TxDL) pointer and control.
 * There may be up to 8192 TxDL's per FIFO, but with a NIC total
 * of 8192. The TxDL's are located in the NIC memory.
 * Each TxDL can have up to 256 Transmit descriptors (TxD)
 * that are located in host memory.
 *
 * The txdl struct fields must be written in order.
 */
#ifdef notdef  /* Use bus_space stuff instead */
struct txdl {
	uint64_t txdl_pointer;	/* address of TxD's */
	uint64_t txdl_control;
};
#endif
#define	TXDLOFF1(x)	(16*(x))	/* byte offset in txdl for list */
#define	TXDLOFF2(x)	(16*(x)+8)	/* byte offset in txdl for list */
#define	TXDL_NUMTXD(x)	((uint64_t)(x) << 56)	/* # of TxD's in the list */
#define	TXDL_LGC_FIRST	(1ULL << 49)	/* First special list */
#define	TXDL_LGC_LAST	(1ULL << 48)	/* Last special list */
#define	TXDL_SFF	(1ULL << 40)	/* List is a special function list */
#define	TXDL_PAR	0		/* Pointer address register */
#define	TXDL_LCR	8		/* List control register */

struct txd {
	uint64_t txd_control1;
	uint64_t txd_control2;
	uint64_t txd_bufaddr;
	uint64_t txd_hostctrl;
};
#define	TXD_CTL1_OWN	(1ULL << 56)	/* Owner, 0 == host, 1 == NIC */
#define	TXD_CTL1_GCF	(1ULL << 41)	/* First frame or LSO */
#define	TXD_CTL1_GCL	(1ULL << 40)	/* Last frame or LSO */
#define	TXD_CTL1_LSO	(1ULL << 33)	/* LSO should be performed */
#define	TXD_CTL1_COF	(1ULL << 32)	/* UDP Checksum over fragments */
#define	TXD_CTL1_MSS(x)	((uint64_t)(x) << 16)

#define	TXD_CTL2_INTLST	(1ULL << 16)	/* Per-list interrupt */
#define	TXD_CTL2_UTIL	(1ULL << 17)	/* Utilization interrupt */
#define	TXD_CTL2_CIPv4	(1ULL << 58)	/* Calculate IPv4 header checksum */
#define	TXD_CTL2_CTCP	(1ULL << 57)	/* Calculate TCP checksum */
#define	TXD_CTL2_CUDP	(1ULL << 56)	/* Calculate UDP checksum */
/*
 * Receive DMA registers
 */
/* Receive interrupt registers */
#define	RXDMA_INT_MASK		RDMAB(0x008)
#define	RDA_ERR_MASK		RDMAB(0x018)
#define	RC_ERR_MASK		RDMAB(0x030)
#define	PRC_PCIX_ERR_MASK	RDMAB(0x048)
#define	RPA_ERR_MASK		RDMAB(0x060)
#define	RTI_ERR_MASK		RDMAB(0x078)

#define	RX_QUEUE_PRIORITY	RDMAB(0x100)
#define	RX_W_ROUND_ROBIN_0	RDMAB(0x108)
#define	RX_W_ROUND_ROBIN_1	RDMAB(0x110)
#define	RX_W_ROUND_ROBIN_2	RDMAB(0x118)
#define	RX_W_ROUND_ROBIN_3	RDMAB(0x120)
#define	RX_W_ROUND_ROBIN_4	RDMAB(0x128)
#define	PRC_RXD0_0		RDMAB(0x130)
#define	PRC_CTRL_0		RDMAB(0x170)
#define	 RC_IN_SVC		(1ULL << 56)
#define	 RING_MODE_1		(0ULL << 48)
#define	 RING_MODE_3		(1ULL << 48)
#define	 RING_MODE_5		(2ULL << 48)
#define	 RC_NO_SNOOP_D		(1ULL << 41)
#define	 RC_NO_SNOOP_B		(1ULL << 40)
#define	PRC_ALARM_ACTION	RDMAB(0x1b0)
#define	RTI_COMMAND_MEM		RDMAB(0x1b8)
#define	 RTI_CMD_MEM_WE		(1ULL << 56)
#define	 RTI_CMD_MEM_STROBE	(1ULL << 48)
#define	RTI_DATA1_MEM		RDMAB(0x1c0)
#define	 RX_TIMER_VAL(x)	((uint64_t)(x) << 32)
#define	 RX_TIMER_AC		(1ULL << 25)
#define	 RX_URNG_A(x)		((uint64_t)(x) << 16)
#define	 RX_URNG_B(x)		((uint64_t)(x) << 8)
#define	 RX_URNG_C(x)		((uint64_t)(x) << 0)
#define	RTI_DATA2_MEM		RDMAB(0x1c8)
#define	 RX_UFC_A(x)		((uint64_t)(x) << 48)
#define	 RX_UFC_B(x)		((uint64_t)(x) << 32)
#define	 RX_UFC_C(x)		((uint64_t)(x) << 16)
#define	 RX_UFC_D(x)		((uint64_t)(x) << 0)
#define	RX_PA_CFG		RDMAB(0x1d0)
/*
 * Receive descriptor (RxD) format.
 * There are three formats of receive descriptors, 1, 3 and 5 buffer format.
 */
#define	RX_MODE_1 1
#define	RX_MODE_3 3
#define	RX_MODE_5 5

struct rxd1 {
	uint64_t rxd_hcontrol;
	uint64_t rxd_control1;
	uint64_t rxd_control2;  
	uint64_t rxd_buf0;
};

/* 4k struct for 5 buffer mode */
#define	NDESC_1BUFMODE		127	/* # desc/page for 5-buffer mode */
struct rxd1_4k {
	struct rxd1 r4_rxd[NDESC_1BUFMODE];
	uint64_t pad[3];
	uint64_t r4_next; /* phys address of next 4k buffer */
};

struct rxd3 {
	uint64_t rxd_hcontrol;
	uint64_t rxd_control1;
	uint64_t rxd_control2;
	uint64_t rxd_buf0;
	uint64_t rxd_buf1;      
	uint64_t rxd_buf2;      
};

struct rxd5 {
	uint64_t rxd_control3;
	uint64_t rxd_control1;
	uint64_t rxd_control2;
	uint64_t rxd_buf0;
	uint64_t rxd_buf1;
	uint64_t rxd_buf2;
	uint64_t rxd_buf3;
	uint64_t rxd_buf4;
};

/* 4k struct for 5 buffer mode */
#define	NDESC_5BUFMODE		63	/* # desc/page for 5-buffer mode */
#define	XGE_PAGE		4096	/* page size used for receive */
struct rxd5_4k {
	struct rxd5 r4_rxd[NDESC_5BUFMODE];
	uint64_t pad[7];
	uint64_t r4_next; /* phys address of next 4k buffer */
};

#define	RXD_MKCTL3(h,bs3,bs4)	\
	(((uint64_t)(h) << 32) | ((uint64_t)(bs3) << 16) | (uint64_t)(bs4))
#define	RXD_MKCTL2(bs0,bs1,bs2)	\
	(((uint64_t)(bs0) << 48) | ((uint64_t)(bs1) << 32) | \
	((uint64_t)(bs2) << 16))

#define	RXD_CTL2_BUF0SIZ(x)	(((x) >> 48) & 0xffff)
#define	RXD_CTL2_BUF1SIZ(x)	(((x) >> 32) & 0xffff)
#define	RXD_CTL2_BUF2SIZ(x)	(((x) >> 16) & 0xffff)
#define	RXD_CTL3_BUF3SIZ(x)	(((x) >> 16) & 0xffff)
#define	RXD_CTL3_BUF4SIZ(x)	((x) & 0xffff)
#define	RXD_CTL1_OWN		(1ULL << 56)
#define	RXD_CTL1_XCODE(x)	(((x) >> 48) & 0xf)	/* Status bits */
#define	 RXD_CTL1_X_OK		0
#define	 RXD_CTL1_X_PERR	1	/* Parity error */
#define	 RXD_CTL1_X_ABORT	2	/* Abort during xfer */
#define	 RXD_CTL1_X_PA		3	/* Parity error and abort */
#define	 RXD_CTL1_X_RDA		4	/* RDA failure */
#define	 RXD_CTL1_X_UP		5	/* Unknown protocol */
#define	 RXD_CTL1_X_FI		6	/* Frame integrity (FCS) error */
#define	 RXD_CTL1_X_BSZ		7	/* Buffer size error */
#define	 RXD_CTL1_X_ECC		8	/* Internal ECC */
#define	 RXD_CTL1_X_UNK		15	/* Unknown error */
#define	RXD_CTL1_PROTOS(x)	(((x) >> 32) & 0xff)
#define	 RXD_CTL1_P_VLAN	0x80	/* VLAN tagged */
#define	 RXD_CTL1_P_MSK		0x60	/* Mask for frame type */
#define	  RXD_CTL1_P_DIX	0x00
#define	  RXD_CTL1_P_LLC	0x20
#define	  RXD_CTL1_P_SNAP	0x40
#define	  RXD_CTL1_P_IPX	0x60
#define	 RXD_CTL1_P_IPv4	0x10
#define	 RXD_CTL1_P_IPv6	0x08
#define	 RXD_CTL1_P_IPFRAG	0x04
#define	 RXD_CTL1_P_TCP		0x02
#define	 RXD_CTL1_P_UDP		0x01
#define	RXD_CTL1_L3CSUM(x)	(((x) >> 16) & 0xffff)
#define	RXD_CTL1_L4CSUM(x)	((x) & 0xffff)
#define	RXD_CTL2_VLANTAG(x)	((x) & 0xffff)

/*
 * MAC Configuration/Status
 */
#define	MAC_INT_STATUS		MACRB(0x000)
#define	 MAC_TMAC_INT		(1ULL<<63)
#define	 MAC_RMAC_INT		(1ULL<<62)
#define	MAC_INT_MASK		MACRB(0x008)
#define	MAC_TMAC_ERR_MASK	MACRB(0x018)
#define	MAC_RMAC_ERR_REG	MACRB(0x028)
#define	 RMAC_LINK_STATE_CHANGE_INT (1ULL<<32)
#define	MAC_RMAC_ERR_MASK	MACRB(0x030)

#define	MAC_CFG			MACRB(0x0100)
#define	 TMAC_EN		(1ULL<<63)
#define	 RMAC_EN		(1ULL<<62)
#define	 UTILZATION_CALC_SEL	(1ULL<<61)
#define	 TMAC_LOOPBACK		(1ULL<<60)
#define	 TMAC_APPEND_PAD	(1ULL<<59)
#define	 RMAC_STRIP_FCS		(1ULL<<58)
#define	 RMAC_STRIP_PAD		(1ULL<<57)
#define	 RMAC_PROM_EN		(1ULL<<56)
#define	 RMAC_DISCARD_PFRM	(1ULL<<55)
#define	 RMAC_BCAST_EN		(1ULL<<54)
#define	 RMAC_ALL_ADDR_EN	(1ULL<<53)
#define	RMAC_MAX_PYLD_LEN	MACRB(0x0110)
#define	 RMAC_PYLD_LEN(x)	((uint64_t)(x) << 48)
#define	RMAC_CFG_KEY		MACRB(0x0120)
#define	 RMAC_KEY_VALUE		(0x4c0dULL<<48)
#define	RMAC_ADDR_CMD_MEM	MACRB(0x0128)
#define	 RMAC_ADDR_CMD_MEM_WE	(1ULL<<56)
#define	 RMAC_ADDR_CMD_MEM_STR	(1ULL<<48)
#define	 RMAC_ADDR_CMD_MEM_OFF(x) ((uint64_t)(x) << 32)
#define	MAX_MCAST_ADDR		64	/* slots in mcast table */
#define	RMAC_ADDR_DATA0_MEM	MACRB(0x0130)
#define	RMAC_ADDR_DATA1_MEM	MACRB(0x0138)
#define	RMAC_PAUSE_CFG		MACRB(0x150)
#define	 RMAC_PAUSE_GEN_EN	(1ULL<<63)
#define	 RMAC_PAUSE_RCV_EN	(1ULL<<62)

/*
 * RLDRAM registers.
 */
#define	MC_INT_MASK		RLDRB(0x008)
#define	MC_ERR_MASK		RLDRB(0x018)

#define	RX_QUEUE_CFG		RLDRB(0x100)
#define	 MC_QUEUE(q,s)		((uint64_t)(s)<<(56-(q*8)))
#define	MC_RLDRAM_MRS		RLDRB(0x108)
#define	 MC_QUEUE_SIZE_ENABLE	(1ULL<<24)
#define	 MC_RLDRAM_MRS_ENABLE	(1ULL<<16)

/*
 * XGXS registers.
 */
/* XGXS control/statue */
#define	XGXS_INT_MASK		XGXSB(0x008)
#define	XGXS_TXGXS_ERR_MASK	XGXSB(0x018)
#define	XGXS_RXGXS_ERR_MASK	XGXSB(0x030)
#define	XGXS_CFG		XGXSB(0x0100)