summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/sys/nxge/nxge_defs.h
blob: e12795328143737544667e4c4e929ddd44c3fec4 (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
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
/*
 * 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 2009 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef	_SYS_NXGE_NXGE_DEFS_H
#define	_SYS_NXGE_NXGE_DEFS_H

#ifdef	__cplusplus
extern "C" {
#endif

/*
 * Block Address Assignment (24-bit base address)
 * (bits [23:20]: block	 [19]: set to 1 for FZC	)
 */
#define	PIO			0x000000
#define	FZC_PIO			0x080000
#define	RESERVED_1		0x100000
#define	FZC_MAC			0x180000
#define	RESERVED_2		0x200000
#define	FZC_IPP			0x280000
#define	FFLP			0x300000
#define	FZC_FFLP		0x380000
#define	PIO_VADDR		0x400000
#define	RESERVED_3		0x480000
#define	ZCP			0x500000
#define	FZC_ZCP			0x580000
#define	DMC			0x600000
#define	FZC_DMC			0x680000
#define	TXC			0x700000
#define	FZC_TXC			0x780000
#define	PIO_LDSV		0x800000
#define	RESERVED_4		0x880000
#define	PIO_LDGIM		0x900000
#define	RESERVED_5		0x980000
#define	PIO_IMASK0		0xa00000
#define	RESERVED_6		0xa80000
#define	PIO_IMASK1		0xb00000
#define	RESERVED_7_START	0xb80000
#define	RESERVED_7_END		0xc00000
#define	FZC_PROM		0xc80000
#define	RESERVED_8		0xd00000
#define	FZC_PIM			0xd80000
#define	RESERVED_9_START 	0xe00000
#define	RESERVED_9_END 		0xf80000

/* PIO		(0x000000) */


/* FZC_PIO	(0x080000) */
#define	LDGITMRES		(FZC_PIO + 0x00008)	/* timer resolution */
#define	SID			(FZC_PIO + 0x10200)	/* 64 LDG, INT data */
#define	LDG_NUM			(FZC_PIO + 0x20000)	/* 69 LDs */



/* FZC_IPP 	(0x280000) */


/* FFLP		(0x300000), Header Parser */

/* PIO_VADDR	(0x400000), PIO Virtaul DMA Address */
/* ?? how to access DMA via PIO_VADDR? */
#define	VADDR			(PIO_VADDR + 0x00000) /* ?? not for driver */


/* ZCP		(0x500000), Neptune Only */


/* FZC_ZCP	(0x580000), Neptune Only */


/* DMC 		(0x600000), register offset (32 DMA channels) */

/* Transmit Ring Register Offset (32 Channels) */
#define	TX_RNG_CFIG		(DMC + 0x40000)
#define	TX_RING_HDH		(DMC + 0x40008)
#define	TX_RING_HDL		(DMC + 0x40010)
#define	TX_RING_KICK		(DMC + 0x40018)
/* Transmit Operations (32 Channels) */
#define	TX_ENT_MSK		(DMC + 0x40020)
#define	TX_CS			(DMC + 0x40028)
#define	TXDMA_MBH		(DMC + 0x40030)
#define	TXDMA_MBL		(DMC + 0x40038)
#define	TX_DMA_PRE_ST		(DMC + 0x40040)
#define	TX_RNG_ERR_LOGH		(DMC + 0x40048)
#define	TX_RNG_ERR_LOGL		(DMC + 0x40050)
#if OLD
#define	SH_TX_RNG_ERR_LOGH	(DMC + 0x40058)
#define	SH_TX_RNG_ERR_LOGL	(DMC + 0x40060)
#endif

/* FZC_DMC RED Initial Random Value register offset (global) */
#define	RED_RAN_INIT		(FZC_DMC + 0x00068)

#define	RX_ADDR_MD		(FZC_DMC + 0x00070)

/* FZC_DMC Ethernet Timeout Countue register offset (global) */
#define	EING_TIMEOUT		(FZC_DMC + 0x00078)

/* RDC Table */
#define	RDC_TBL			(FZC_DMC + 0x10000)	/* 256 * 8 */

/* FZC_DMC partitioning support register offset (32 channels) */

#define	TX_LOG_PAGE_VLD		(FZC_DMC + 0x40000)
#define	TX_LOG_MASK1		(FZC_DMC + 0x40008)
#define	TX_LOG_VAL1		(FZC_DMC + 0x40010)
#define	TX_LOG_MASK2		(FZC_DMC + 0x40018)
#define	TX_LOG_VAL2		(FZC_DMC + 0x40020)
#define	TX_LOG_PAGE_RELO1	(FZC_DMC + 0x40028)
#define	TX_LOG_PAGE_RELO2	(FZC_DMC + 0x40030)
#define	TX_LOG_PAGE_HDL		(FZC_DMC + 0x40038)

#define	TX_ADDR_MOD		(FZC_DMC + 0x41000) /* only one? */


/* FZC_DMC RED Parameters register offset (32 channels) */
#define	RDC_RED_PARA1		(FZC_DMC + 0x30000)
#define	RDC_RED_PARA2		(FZC_DMC + 0x30008)
/* FZC_DMC RED Discard Cound Register offset (32 channels) */
#define	RED_DIS_CNT		(FZC_DMC + 0x30010)

#if OLD /* This has been moved to TXC */
/* Transmit Ring Scheduler (per port) */
#define	TX_DMA_MAP0		(FZC_DMC + 0x50000)
#define	TX_DMA_MAP1		(FZC_DMC + 0x50008)
#define	TX_DMA_MAP2		(FZC_DMC + 0x50010)
#define	TX_DMA_MAP3		(FZC_DMC + 0x50018)
#endif

/* Transmit Ring Scheduler: DRR Weight (32 Channels) */
#define	DRR_WT			(FZC_DMC + 0x51000)
#if OLD
#define	TXRNG_USE		(FZC_DMC + 0x51008)
#endif

/* TXC		(0x700000)??	*/


/* FZC_TXC	(0x780000)??	*/


/*
 * PIO_LDSV	(0x800000)
 * Logical Device State Vector 0, 1, 2.
 * (69 logical devices, 8192 apart, partitioning control)
 */
#define	LDSV0			(PIO_LDSV + 0x00000)	/* RO (64 - 69) */
#define	LDSV1			(PIO_LDSV + 0x00008)	/* RO (32 - 63) */
#define	LDSV2			(PIO_LDSV + 0x00010)	/* RO ( 0 - 31) */

/*
 * PIO_LDGIM	(0x900000)
 * Logical Device Group Interrupt Management (64 groups).
 * (count 64, step 8192)
 */
#define	LDGIMGN			(PIO_LDGIMGN + 0x00000)	/* RW */

/*
 * PIO_IMASK0	(0xA000000)
 *
 * Logical Device Masks 0, 1.
 * (64 logical devices, 8192 apart, partitioning control)
 */
#define	LD_IM0			(PIO_IMASK0 + 0x00000)	/* RW ( 0 - 63) */

/*
 * PIO_IMASK0	(0xB000000)
 *
 * Logical Device Masks 0, 1.
 * (5 logical devices, 8192 apart, partitioning control)
 */
#define	LD_IM1			(PIO_IMASK1 + 0x00000)	/* RW (64 - 69) */


/* DMC/TMC CSR size */
#define	DMA_CSR_SLL		9	/* Used to calculate VR addresses */
#define	DMA_CSR_SIZE		(1 << DMA_CSR_SLL) /* 512 */
#define	DMA_CSR_MASK		0xff	/* Used to calculate VR addresses */
	/*
	 * That is, each DMA CSR set must fit into a 512 byte space.
	 * If you subtract DMC (0x60000) from each DMA register definition,
	 * what you have left over is currently less than 255 (0xff)
	 */
#define	DMA_CSR_MIN_PAGE_SIZE	(2 * DMA_CSR_SIZE) /* 1024 */
	/*
	 * There are 2 subpages per page in a VR.
	 */
#define	VDMA_CSR_SIZE		(8 * DMA_CSR_MIN_PAGE_SIZE) /* 0x2000 */
	/*
	 * There are 8 pages in a VR.
	 */

/*
 * Define the Default RBR, RCR
 */
#define	RBR_DEFAULT_MAX_BLKS	8192	/* each entry (16 blockaddr/64B) */
#define	RBR_NBLK_PER_LINE	16	/* 16 block addresses per 64 B line */
#define	RBR_DEFAULT_MAX_LEN	(RBR_DEFAULT_MAX_BLKS)
#define	RBR_DEFAULT_MIN_LEN	1
#define	RCR_DEFAULT_MAX		8192

#define	SW_OFFSET_NO_OFFSET		0
#define	SW_OFFSET_64			1	/* 64 bytes */
#define	SW_OFFSET_128			2	/* 128 bytes */
/* The following additional offsets are defined for Neptune-L and RF-NIU */
#define	SW_OFFSET_192			3
#define	SW_OFFSET_256			4
#define	SW_OFFSET_320			5
#define	SW_OFFSET_384			6
#define	SW_OFFSET_448			7

#define	TDC_DEFAULT_MAX		8192
/*
 * RBR block descriptor is 32 bits (bits [43:12]
 */
#define	RBR_BKADDR_SHIFT	12


#define	RCR_DEFAULT_MAX_BLKS	4096	/* each entry (8 blockaddr/64B) */
#define	RCR_NBLK_PER_LINE	8	/* 8 block addresses per 64 B line */
#define	RCR_DEFAULT_MAX_LEN	(RCR_DEFAULT_MAX_BLKS)
#define	RCR_DEFAULT_MIN_LEN	1

/*  DMA Channels.  */
#define	NXGE_MAX_DMCS		(NXGE_MAX_RDCS + NXGE_MAX_TDCS)
#define	NXGE_MAX_RDCS		16
#define	NXGE_MAX_TDCS		24
#define	NXGE_MAX_TDCS_NIU	16
/*
 * original mapping from Hypervisor
 */
#ifdef	ORIGINAL
#define	NXGE_N2_RXDMA_START_LDG	0
#define	NXGE_N2_TXDMA_START_LDG	16
#define	NXGE_N2_MIF_LDG		32
#define	NXGE_N2_MAC_0_LDG	33
#define	NXGE_N2_MAC_1_LDG	34
#define	NXGE_N2_SYS_ERROR_LDG	35
#endif

#define	NXGE_N2_RXDMA_START_LDG	19
#define	NXGE_N2_TXDMA_START_LDG	27
#define	NXGE_N2_MIF_LDG		17
#define	NXGE_N2_MAC_0_LDG	16
#define	NXGE_N2_MAC_1_LDG	35
#define	NXGE_N2_SYS_ERROR_LDG	18
#define	NXGE_N2_LDG_GAP		17

#define	NXGE_MAX_RDC_GRPS	8

/*
 * Max. ports per Neptune and NIU
 */
#define	NXGE_MAX_PORTS			4
#define	NXGE_PORTS_NEPTUNE		4
#define	NXGE_PORTS_NIU			2

/*
 * Virtualization Regions.
 */
#define	NXGE_MAX_VRS			8

/*
 * TDC groups are used exclusively for the purpose of Hybrid I/O
 * TX needs one group for each VR
 */
#define	NXGE_MAX_TDC_GROUPS		(NXGE_MAX_VRS)

/* Max. RDC table groups */
#define	NXGE_MAX_RDC_GROUPS		8
#define	NXGE_MAX_RDCS			16
#define	NXGE_MAX_DMAS			32

#define	NXGE_MAX_MACS_XMACS		16
#define	NXGE_MAX_MACS_BMACS		8
#define	NXGE_MAX_MACS			(NXGE_MAX_PORTS * NXGE_MAX_MACS_XMACS)

#define	NXGE_MAX_VLANS			4096
#define	VLAN_ETHERTYPE			(0x8100)


/* Scaling factor for RBR (receive block ring) */
#define	RBR_SCALE_1		0
#define	RBR_SCALE_2		1
#define	RBR_SCALE_3		2
#define	RBR_SCALE_4		3
#define	RBR_SCALE_5		4
#define	RBR_SCALE_6		5
#define	RBR_SCALE_7		6
#define	RBR_SCALE_8		7


#define	MAX_PORTS_PER_NXGE	4
#define	MAX_MACS		32

#define	TX_GATHER_POINTER_SZ	8
#define	TX_GP_PER_BLOCK		8
#define	TX_DEFAULT_MAX_GPS	1024	/* Max. # of gather pointers */
#define	TX_DEFAULT_JUMBO_MAX_GPS 4096	/* Max. # of gather pointers */
#define	TX_DEFAULT_MAX_LEN	(TX_DEFAULT_MAX_GPS/TX_GP_PER_BLOCK)
#define	TX_DEFAULT_JUMBO_MAX_LEN (TX_DEFAULT_JUMBO_MAX_GPS/TX_GP_PER_BLOCK)

#define	TX_RING_THRESHOLD		(TX_DEFAULT_MAX_GPS/4)
#define	TX_RING_JUMBO_THRESHOLD		(TX_DEFAULT_JUMBO_MAX_GPS/4)

#define	TRANSMIT_HEADER_SIZE		16	/* 16 B frame header */

#define	TX_DESC_SAD_SHIFT	0
#define	TX_DESC_SAD_MASK	0x00000FFFFFFFFFFFULL	/* start address */
#define	TX_DESC_TR_LEN_SHIFT	44
#define	TX_DESC_TR_LEN_MASK	0x00FFF00000000000ULL	/* Transfer Length */
#define	TX_DESC_NUM_PTR_SHIFT	58
#define	TX_DESC_NUM_PTR_MASK	0x2C00000000000000ULL	/* gather pointers */
#define	TX_DESC_MASK_SHIFT	62
#define	TX_DESC_MASK_MASK	0x4000000000000000ULL	/* Mark bit */
#define	TX_DESC_SOP_SHIF	63
#define	TX_DESC_NUM_MASK	0x8000000000000000ULL	/* Start of packet */

#define	TCAM_FLOW_KEY_MAX_CLASS		12
#define	TCAM_L3_MAX_USER_CLASS		4
#define	TCAM_MAX_ENTRY			256
#define	TCAM_NIU_TCAM_MAX_ENTRY		128
#define	TCAM_NXGE_TCAM_MAX_ENTRY	256
#define	NXGE_L2_PROG_CLS		2
#define	NXGE_L3_PROG_CLS		4



/* TCAM entry formats */
#define	TCAM_IPV4_5TUPLE_FORMAT	0x00
#define	TCAM_IPV6_5TUPLE_FORMAT	0x01
#define	TCAM_ETHERTYPE_FORMAT	0x02


/* TCAM */
#define	TCAM_SELECT_IPV6	0x01
#define	TCAM_LOOKUP		0x04
#define	TCAM_DISCARD		0x08

/* FLOW Key */
#define	FLOW_L4_1_34_BYTES	0x10
#define	FLOW_L4_1_78_BYTES	0x11
#define	FLOW_L4_0_12_BYTES	(0x10 << 2)
#define	FLOW_L4_0_56_BYTES	(0x11 << 2)
#define	FLOW_PROTO_NEXT		0x10
#define	FLOW_IPDA		0x20
#define	FLOW_IPSA		0x40
#define	FLOW_VLAN		0x80
#define	FLOW_L2DA		0x100
#define	FLOW_PORT		0x200

/* TCAM */
#define	MAX_EFRAME	11

#define	TCAM_USE_L2RDC_FLOW_LOOKUP	0x00
#define	TCAM_USE_OFFSET_DONE		0x01
#define	TCAM_OVERRIDE_L2_FLOW_LOOKUP	0x02
#define	TCAM_OVERRIDE_L2_USE_OFFSET	0x03

/*
 * FCRAM (Hashing):
 *	1. IPv4 exact match
 *	2. IPv6 exact match
 *	3. IPv4 Optimistic match
 *	4. IPv6 Optimistic match
 *
 */
#define	FCRAM_IPV4_EXT_MATCH	0x00
#define	FCRAM_IPV6_EXT_MATCH	0x01
#define	FCRAM_IPV4_OPTI_MATCH	0x02
#define	FCRAM_IPV6_OPTI_MATCH	0x03


#define	NXGE_HASH_MAX_ENTRY	256


#define	MAC_ADDR_LENGTH		6

/* convert values */
#define	NXGE_BASE(x, y)		(((y) << (x ## _SHIFT)) & (x ## _MASK))
#define	NXGE_VAL(x, y)		(((y) & (x ## _MASK)) >> (x ## _SHIFT))

/*
 * Locate the DMA channel start offset (PIO_VADDR)
 * (DMA virtual address space of the PIO block)
 */
#define	TDMC_PIOVADDR_OFFSET(channel)	(2 * DMA_CSR_SIZE * channel)
#define	RDMC_PIOVADDR_OFFSET(channel)	(TDMC_OFFSET(channel) + DMA_CSR_SIZE)

/*
 * PIO access using the DMC block directly (DMC)
 */
#define	DMC_OFFSET(channel)	(DMA_CSR_SIZE * channel)
#define	TDMC_OFFSET(channel)	(TX_RNG_CFIG + DMA_CSR_SIZE * channel)

/*
 * Number of logical pages.
 */
#define	NXGE_MAX_LOGICAL_PAGES		2

#ifdef	SOLARIS
#ifndef	i386
#define	_BIT_FIELDS_BIG_ENDIAN		_BIT_FIELDS_HTOL
#else
#define	_BIT_FIELDS_LITTLE_ENDIAN	_BIT_FIELDS_LTOH
#endif
#else
#define	_BIT_FIELDS_LITTLE_ENDIAN	_LITTLE_ENDIAN_BITFIELD
#endif

#define	MAX_PIO_RETRIES		32

#define	IS_PORT_NUM_VALID(portn)\
	(portn < 4)

/*
 * The following macros expect unsigned input values.
 */
#define	TXDMA_CHANNEL_VALID(cn)		(cn < NXGE_MAX_TDCS)
#define	TXDMA_PAGE_VALID(pn)		(pn < NXGE_MAX_LOGICAL_PAGES)
#define	TXDMA_FUNC_VALID(fn)		(fn < MAX_PORTS_PER_NXGE)
#define	FUNC_VALID(n)			(n < MAX_PORTS_PER_NXGE)

/*
 * DMA channel binding definitions.
 */
#define	VIR_PAGE_INDEX_MAX		8
#define	VIR_SUB_REGIONS			2
#define	VIR_DMA_BIND			1

#define	SUBREGION_VALID(n)		(n < VIR_SUB_REGIONS)
#define	VIR_PAGE_INDEX_VALID(n)		(n < VIR_PAGE_INDEX_MAX)
#define	VRXDMA_CHANNEL_VALID(n)		(n < NXGE_MAX_RDCS)

/*
 * Logical device definitions.
 */
#define	NXGE_INT_MAX_LD		69
#define	NXGE_INT_MAX_LDG	64

#define	NXGE_RDMA_LD_START	 0
#define	NXGE_TDMA_LD_START	32
#define	NXGE_MIF_LD		63
#define	NXGE_MAC_LD_PORT0	64
#define	NXGE_MAC_LD_PORT1	65
#define	NXGE_MAC_LD_PORT2	66
#define	NXGE_MAC_LD_PORT3	67
#define	NXGE_SYS_ERROR_LD	68

#define	LDG_VALID(n)			(n < NXGE_INT_MAX_LDG)
#define	LD_VALID(n)			(n < NXGE_INT_MAX_LD)
#define	LD_RXDMA_LD_VALID(n)		(n < NXGE_MAX_RDCS)
#define	LD_TXDMA_LD_VALID(n)		(n >= NXGE_MAX_RDCS && \
					((n - NXGE_MAX_RDCS) < NXGE_MAX_TDCS)))
#define	LD_MAC_VALID(n)			(IS_PORT_NUM_VALID(n))

#define	LD_TIMER_MAX			0x3f
#define	LD_INTTIMER_VALID(n)		(n <= LD_TIMER_MAX)

/* System Interrupt Data */
#define	SID_VECTOR_MAX			0x1f
#define	SID_VECTOR_VALID(n)		(n <= SID_VECTOR_MAX)

#define	NXGE_COMPILE_32

#ifdef	__cplusplus
}
#endif

#endif	/* _SYS_NXGE_NXGE_DEFS_H */