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
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
|
/*
* 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_COMMON_H
#define _SYS_NXGE_NXGE_COMMON_H
#ifdef __cplusplus
extern "C" {
#endif
#define NXGE_DMA_START B_TRUE
#define NXGE_DMA_STOP B_FALSE
/*
* Default DMA configurations.
*/
#define NXGE_RDMA_PER_NIU_PORT (NXGE_MAX_RDCS/NXGE_PORTS_NIU)
#define NXGE_TDMA_PER_NIU_PORT (NXGE_MAX_TDCS_NIU/NXGE_PORTS_NIU)
#define NXGE_RDMA_PER_NEP_PORT (NXGE_MAX_RDCS/NXGE_PORTS_NEPTUNE)
#define NXGE_TDMA_PER_NEP_PORT (NXGE_MAX_TDCS/NXGE_PORTS_NEPTUNE)
#define NXGE_RDCGRP_PER_NIU_PORT (NXGE_MAX_RDC_GROUPS/NXGE_PORTS_NIU)
#define NXGE_RDCGRP_PER_NEP_PORT (NXGE_MAX_RDC_GROUPS/NXGE_PORTS_NEPTUNE)
#define NXGE_TIMER_RESO 2
#define NXGE_TIMER_LDG 2
/*
* Receive and Transmit DMA definitions
*/
#if defined(sun4v) && defined(NIU_LP_WORKAROUND)
/*
* N2/NIU: Maximum descriptors if we need to call
* Hypervisor to set up the logical pages
* and the driver must use contiguous memory.
*/
#define NXGE_NIU_MAX_ENTRY (1 << 9) /* 512 */
#define NXGE_NIU_CONTIG_RBR_MAX (NXGE_NIU_MAX_ENTRY)
#define NXGE_NIU_CONTIG_RCR_MAX (NXGE_NIU_MAX_ENTRY)
#define NXGE_NIU_CONTIG_TX_MAX (NXGE_NIU_MAX_ENTRY)
#endif
#ifdef _DMA_USES_VIRTADDR
#ifdef NIU_PA_WORKAROUND
#define NXGE_DMA_BLOCK (16 * 64 * 4)
#else
#define NXGE_DMA_BLOCK 1
#endif
#else
#define NXGE_DMA_BLOCK (64 * 64)
#endif
#define NXGE_RBR_RBB_MIN (128)
#define NXGE_RBR_RBB_MAX (64 * 128 -1)
#if defined(sun4v) && defined(NIU_LP_WORKAROUND)
#define NXGE_RBR_RBB_DEFAULT 512
#define NXGE_RBR_SPARE 0
#else
#if defined(__i386)
#define NXGE_RBR_RBB_DEFAULT 256
#else
#define NXGE_RBR_RBB_DEFAULT (64 * 16) /* x86 hello */
#endif
#define NXGE_RBR_SPARE 0
#endif
#define NXGE_RCR_MIN (NXGE_RBR_RBB_MIN * 2)
#if defined(sun4v) && defined(NIU_LP_WORKAROUND)
#define NXGE_RCR_MAX (8192)
#define NXGE_RCR_DEFAULT (512)
#define NXGE_TX_RING_DEFAULT (512)
#else
#ifndef NIU_PA_WORKAROUND
#define NXGE_RCR_MAX (65355) /* MAX hardware supported */
#if defined(_BIG_ENDIAN)
#define NXGE_RCR_DEFAULT (NXGE_RBR_RBB_DEFAULT * 8)
#else
#ifdef USE_RX_BIG_BUF
#define NXGE_RCR_DEFAULT (NXGE_RBR_RBB_DEFAULT * 8)
#else
#define NXGE_RCR_DEFAULT (NXGE_RBR_RBB_DEFAULT * 4)
#endif
#endif
#if defined(__i386)
#define NXGE_TX_RING_DEFAULT (256)
#else
#define NXGE_TX_RING_DEFAULT (1024)
#endif
#define NXGE_TX_RING_MAX (64 * 128 - 1)
#else
#if defined(__i386)
#define NXGE_RCR_DEFAULT (256)
#define NXGE_TX_RING_DEFAULT (256)
#else
#define NXGE_RCR_DEFAULT (512)
#define NXGE_TX_RING_DEFAULT (512)
#endif
#define NXGE_RCR_MAX (1024)
#define NXGE_TX_RING_MAX (1024)
#endif
#endif
#define NXGE_TX_RECLAIM 32
/* per receive DMA channel configuration data structure */
typedef struct nxge_rdc_cfg {
uint32_t flag; /* 0: not configured, 1: configured */
struct nxge_hw_list *nxge_hw_p;
uint32_t partition_id;
uint32_t port; /* function number */
uint32_t rx_group_id;
/* Partitioning, DMC function zero. */
uint32_t rx_log_page_vld_page0; /* TRUE or FALSE */
uint32_t rx_log_page_vld_page1; /* TRUE or FALSE */
uint64_t rx_log_mask1;
uint64_t rx_log_value1;
uint64_t rx_log_mask2;
uint64_t rx_log_value2;
uint64_t rx_log_page_relo1;
uint64_t rx_log_page_relo2;
uint64_t rx_log_page_hdl;
/* WRED parameters, DMC function zero */
uint32_t red_enable;
uint32_t thre_syn;
uint32_t win_syn;
uint32_t threshold;
uint32_t win_non_syn;
/* RXDMA configuration, DMC */
char *rdc_mbaddr_p; /* mailbox address */
uint32_t min_flag; /* TRUE for 18 bytes header */
/* Software Reserved Packet Buffer Offset, DMC */
uint32_t sw_offset;
/* RBR Configuration A */
uint64_t rbr_staddr; /* starting address of RBR */
uint32_t rbr_nblks; /* # of RBR entries */
uint32_t rbr_len; /* # of RBR entries in 64B lines */
/* RBR Configuration B */
uint32_t bksize; /* Block size is fixed. */
#define RBR_BKSIZE_4K 0
#define RBR_BKSIZE_4K_BYTES (4 * 1024)
#define RBR_BKSIZE_8K 1
#define RBR_BKSIZE_8K_BYTES (8 * 1024)
#define RBR_BKSIZE_16K 2
#define RBR_BKSIZE_16K_BYTES (16 * 1024)
#define RBR_BKSIZE_32K 3
#define RBR_BKSIZE_32K_BYTES (32 * 1024)
uint32_t bufsz2;
#define RBR_BUFSZ2_2K 0
#define RBR_BUFSZ2_2K_BYTES (2 * 1024)
#define RBR_BUFSZ2_4K 1
#define RBR_BUFSZ2_4K_BYTES (4 * 1024)
#define RBR_BUFSZ2_8K 2
#define RBR_BUFSZ2_8K_BYTES (8 * 1024)
#define RBR_BUFSZ2_16K 3
#define RBR_BUFSZ2_16K_BYTES (16 * 1024)
uint32_t bufsz1;
#define RBR_BUFSZ1_1K 0
#define RBR_BUFSZ1_1K_BYTES 1024
#define RBR_BUFSZ1_2K 1
#define RBR_BUFSZ1_2K_BYTES (2 * 1024)
#define RBR_BUFSZ1_4K 2
#define RBR_BUFSZ1_4K_BYTES (4 * 1024)
#define RBR_BUFSZ1_8K 3
#define RBR_BUFSZ1_8K_BYTES (8 * 1024)
uint32_t bufsz0;
#define RBR_BUFSZ0_256B 0
#define RBR_BUFSZ0_256_BYTES 256
#define RBR_BUFSZ0_512B 1
#define RBR_BUFSZ0_512B_BYTES 512
#define RBR_BUFSZ0_1K 2
#define RBR_BUFSZ0_1K_BYTES (1024)
#define RBR_BUFSZ0_2K 3
#define RBR_BUFSZ0_2K_BYTES (2 * 1024)
/* Receive buffers added by the software */
uint32_t bkadd; /* maximum size is 1 million */
/* Receive Completion Ring Configuration A */
uint32_t rcr_len; /* # of 64B blocks, each RCR is 8B */
uint64_t rcr_staddr;
/* Receive Completion Ring Configuration B */
uint32_t pthres; /* packet threshold */
uint32_t entout; /* enable timeout */
uint32_t timeout; /* timeout value */
/* Logical Device Group Number */
uint16_t rx_ldg;
uint16_t rx_ld_state_flags;
/* Receive DMA Channel Event Mask */
uint64_t rx_dma_ent_mask;
/* 32 bit (set to 1) or 64 bit (set to 0) addressing mode */
uint32_t rx_addr_md;
} nxge_rdc_cfg_t, *p_nxge_rdc_cfg_t;
/*
* Per Transmit DMA Channel Configuration Data Structure (32 TDC)
*/
typedef struct nxge_tdc_cfg {
uint32_t flag; /* 0: not configured 1: configured */
struct nxge_hw_list *nxge_hw_p;
uint32_t port; /* function number */
/* partitioning, DMC function zero (All 0s for non-partitioning) */
uint32_t tx_log_page_vld_page0; /* TRUE or FALSE */
uint32_t tx_log_page_vld_page1; /* TRUE or FALSE */
uint64_t tx_log_mask1;
uint64_t tx_log_value1;
uint64_t tx_log_mask2;
uint64_t tx_log_value2;
uint64_t tx_log_page_relo1;
uint64_t tx_log_page_relo2;
uint64_t tx_log_page_hdl;
/* Transmit Ring Configuration */
uint64_t tx_staddr;
uint64_t tx_rng_len; /* in 64 B Blocks */
#define TX_MAX_BUF_SIZE 4096
/* TXDMA configuration, DMC */
char *tdc_mbaddr_p; /* mailbox address */
/* Logical Device Group Number */
uint16_t tx_ldg;
uint16_t tx_ld_state_flags;
/* TXDMA event flags */
uint64_t tx_event_mask;
/* Transmit threshold before reclamation */
uint32_t tx_rng_threshold;
#define TX_RING_THRESHOLD (TX_DEFAULT_MAX_GPS/4)
#define TX_RING_JUMBO_THRESHOLD (TX_DEFAULT_JUMBO_MAX_GPS/4)
/* For reclaim: a wrap-around counter (packets transmitted) */
uint32_t tx_pkt_cnt;
/* last packet with the mark bit set */
uint32_t tx_lastmark;
} nxge_tdc_cfg_t, *p_nxge_tdc_cfg_t;
#define RDC_TABLE_ENTRY_METHOD_SEQ 0
#define RDC_TABLE_ENTRY_METHOD_REP 1
/* per transmit DMA channel table group data structure */
typedef struct nxge_tdc_grp {
uint32_t start_tdc; /* assume assigned in sequence */
uint8_t max_tdcs;
dc_map_t map;
uint8_t grp_index; /* nxge_t.tx_set.group[grp_index] */
} nxge_tdc_grp_t, *p_nxge_tdc_grp_t;
/* per receive DMA channel table group data structure */
typedef struct nxge_rdc_grp {
boolean_t flag; /* 0: not configured 1: configured */
uint8_t port;
uint32_t start_rdc; /* assume assigned in sequence */
uint8_t max_rdcs;
uint8_t def_rdc;
dc_map_t map;
uint16_t config_method;
uint8_t grp_index; /* nxge_t.rx_set.group[grp_index] */
} nxge_rdc_grp_t, *p_nxge_rdc_grp_t;
#define RDC_MAP_IN(map, rdc) \
(map |= (1 << rdc))
#define RDC_MAP_OUT(map, rdc) \
(map &= (~(1 << rdc)))
/* Common RDC and TDC configuration of DMC */
typedef struct _nxge_dma_common_cfg_t {
uint16_t rdc_red_ran_init; /* RED initial seed value */
/* Transmit Ring */
} nxge_dma_common_cfg_t, *p_nxge_dma_common_cfg_t;
/*
* VLAN and MAC table configurations:
* Each VLAN ID should belong to at most one RDC group.
* Each port could own multiple RDC groups.
* Each MAC should belong to one RDC group.
*/
typedef struct nxge_mv_cfg {
uint8_t flag; /* 0:unconfigure 1:configured */
uint8_t rdctbl; /* RDC channel table group */
uint8_t mpr_npr; /* MAC and VLAN preference */
} nxge_mv_cfg_t, *p_nxge_mv_cfg_t;
typedef struct nxge_param_map {
#if defined(_BIG_ENDIAN)
uint32_t rsrvd2:2; /* [30:31] rsrvd */
uint32_t remove:1; /* [29] Remove */
uint32_t pref:1; /* [28] preference */
uint32_t rsrv:4; /* [27:24] preference */
uint32_t map_to:8; /* [23:16] map to resource */
uint32_t param_id:16; /* [15:0] Param ID */
#else
uint32_t param_id:16; /* [15:0] Param ID */
uint32_t map_to:8; /* [23:16] map to resource */
uint32_t rsrv:4; /* [27:24] preference */
uint32_t pref:1; /* [28] preference */
uint32_t remove:1; /* [29] Remove */
uint32_t rsrvd2:2; /* [30:31] rsrvd */
#endif
} nxge_param_map_t, *p_nxge_param_map_t;
typedef struct nxge_rcr_param {
#if defined(_BIG_ENDIAN)
uint32_t rsrvd2:2; /* [30:31] rsrvd */
uint32_t remove:1; /* [29] Remove */
uint32_t rsrv:5; /* [28:24] preference */
uint32_t rdc:8; /* [23:16] rdc # */
uint32_t cfg_val:16; /* [15:0] interrupt parameter */
#else
uint32_t cfg_val:16; /* [15:0] interrupt parameter */
uint32_t rdc:8; /* [23:16] rdc # */
uint32_t rsrv:5; /* [28:24] preference */
uint32_t remove:1; /* [29] Remove */
uint32_t rsrvd2:2; /* [30:31] rsrvd */
#endif
} nxge_rcr_param_t, *p_nxge_rcr_param_t;
/*
* These are the properties of the TxDMA channels for this
* port (instance).
* <start> is the index of the first TDC that is being managed
* by this port.
* <count> is the number of TDCs being managed by this port.
* <owned> is the number of TDCs currently being utilized by this port.
*
* <owned> may be less than <count> in hybrid I/O systems.
*/
typedef struct {
int start; /* start TDC (0 - 31) */
int count; /* 8 - 32 */
int owned; /* 1 - count */
} tdc_cfg_t;
/* Needs to have entries in the ndd table */
/*
* Hardware properties created by fcode.
* In order for those properties visible to the user
* command ndd, we need to add the following properties
* to the ndd defined parameter array and data structures.
*
* Use default static configuration for x86.
*/
typedef struct nxge_hw_pt_cfg {
uint32_t function_number; /* function number */
tdc_cfg_t tdc;
uint32_t start_rdc; /* start RDC (0 - 31) */
uint32_t max_rdcs; /* max rdc in sequence */
uint32_t ninterrupts; /* obp interrupts(mac/mif/syserr) */
uint32_t mac_ldvid;
uint32_t mif_ldvid;
uint32_t ser_ldvid;
uint32_t def_rdc; /* default RDC */
uint32_t drr_wt; /* port DRR weight */
uint32_t max_grpids; /* max group ID */
uint32_t grpids[NXGE_MAX_RDCS]; /* RDC group IDs */
uint32_t max_rdc_grpids; /* max RDC group ID */
uint32_t start_ldg; /* starting logical group # */
uint32_t max_ldgs; /* max logical device group */
uint32_t max_ldvs; /* max logical devices */
uint32_t start_mac_entry; /* where to put the first mac */
uint32_t max_macs; /* the max mac entry allowed */
uint32_t mac_pref; /* preference over VLAN */
uint32_t def_mac_txdma_grpid; /* default TDC group ID */
uint32_t def_mac_rxdma_grpid; /* default RDC group ID */
uint32_t vlan_pref; /* preference over MAC */
/* Expand if we have more hardware or default configurations */
uint16_t ldg[NXGE_INT_MAX_LDG];
uint16_t ldg_chn_start;
} nxge_hw_pt_cfg_t, *p_nxge_hw_pt_cfg_t;
/* per port configuration */
typedef struct nxge_dma_pt_cfg {
uint8_t mac_port; /* MAC port (function) */
nxge_hw_pt_cfg_t hw_config; /* hardware configuration */
uint32_t alloc_buf_size;
uint32_t rbr_size;
uint32_t rcr_size;
/*
* Configuration for hardware initialization based on the
* hardware properties or the default properties.
*/
uint32_t tx_dma_map; /* Transmit DMA channel bit map */
/* Transmit DMA channel: device wise */
nxge_tdc_grp_t tdc_grps[NXGE_MAX_TDC_GROUPS];
/* Receive DMA channel */
nxge_rdc_grp_t rdc_grps[NXGE_MAX_RDC_GROUPS];
uint16_t rcr_timeout[NXGE_MAX_RDCS];
uint16_t rcr_threshold[NXGE_MAX_RDCS];
uint8_t rcr_full_header;
uint16_t rx_drr_weight;
/* Add more stuff later */
} nxge_dma_pt_cfg_t, *p_nxge_dma_pt_cfg_t;
/* classification configuration */
typedef struct nxge_class_pt_cfg {
/* MAC table */
nxge_mv_cfg_t mac_host_info[NXGE_MAX_MACS];
/* VLAN table */
nxge_mv_cfg_t vlan_tbl[NXGE_MAX_VLANS];
/* class config value */
uint32_t init_h1;
uint16_t init_h2;
uint8_t mcast_rdcgrp;
uint8_t mac_rdcgrp;
uint32_t class_cfg[TCAM_CLASS_MAX];
} nxge_class_pt_cfg_t, *p_nxge_class_pt_cfg_t;
/* per Neptune sharable resources among ports */
typedef struct nxge_common {
uint32_t partition_id;
boolean_t mode32;
/* DMA Channels: RDC and TDC */
nxge_rdc_cfg_t rdc_config[NXGE_MAX_RDCS];
nxge_tdc_cfg_t tdc_config[NXGE_MAX_TDCS];
nxge_dma_common_cfg_t dma_common_config;
uint32_t timer_res;
boolean_t ld_sys_error_set;
uint8_t sys_error_owner;
/* Layer 2/3/4 */
uint16_t class2_etype;
uint16_t class3_etype;
/* FCRAM (hashing) */
uint32_t hash1_initval;
uint32_t hash2_initval;
} nxge_common_t, *p_nxge_common_t;
/*
* Partition (logical domain) configuration per Neptune/NIU.
*/
typedef struct nxge_part_cfg {
uint32_t rdc_grpbits; /* RDC group bit masks */
uint32_t tdc_bitmap; /* bounded TDC */
nxge_dma_pt_cfg_t pt_config[NXGE_MAX_PORTS];
/* Flow Classification Partition (flow partition select register) */
uint8_t hash_lookup; /* external lookup is available */
uint8_t base_mask; /* select bits in base_h1 to replace */
/* bits [19:15} in Hash 1. */
uint8_t base_h1; /* value to replace Hash 1 [19:15]. */
/* Add more here */
uint32_t attributes; /* permission and attribute bits */
#define FZC_SERVICE_ENTITY 0x01
#define FZC_READ_WRITE 0x02
#define FZC_READ_ONLY 0x04
} nxge_part_cfg_t, *p_nxge_part_cfg_t;
typedef struct nxge_usr_l3_cls {
uint64_t cls;
uint16_t tcam_ref_cnt;
uint8_t pid;
uint8_t flow_pkt_type;
uint8_t valid;
} nxge_usr_l3_cls_t, *p_nxge_usr_l3_cls_t;
typedef struct nxge_hw_list {
struct nxge_hw_list *next;
nxge_os_mutex_t nxge_cfg_lock;
nxge_os_mutex_t nxge_tcam_lock;
nxge_os_mutex_t nxge_vlan_lock;
nxge_os_mutex_t nxge_mdio_lock;
nxge_dev_info_t *parent_devp;
#if defined(sun4v)
/*
* With Hybrid I/O, a VR (virtualization region) is the moral
* equivalent of a device function as seen in the service domain.
* And, a guest domain can map up to 8 VRs for a single NIU for both
* of the physical ports. Hence, need space for up to the maximum
* number of VRs (functions) for the guest domain driver.
*
* For non-sun4v platforms, NXGE_MAX_PORTS provides the correct
* number of functions for the device. For sun4v platforms,
* NXGE_MAX_FUNCTIONS will be defined by the number of
* VRs that the guest domain can map.
*
* NOTE: This solution only works for one NIU and will need to
* revisit this for KT-NIU.
*/
#define NXGE_MAX_GUEST_FUNCTIONS 8
#define NXGE_MAX_FUNCTIONS NXGE_MAX_GUEST_FUNCTIONS
#else
#define NXGE_MAX_FUNCTIONS NXGE_MAX_PORTS
#endif
struct _nxge_t *nxge_p[NXGE_MAX_FUNCTIONS];
uint32_t ndevs;
uint32_t flags;
uint32_t magic;
uint32_t niu_type;
uint32_t platform_type;
uint8_t xcvr_addr[NXGE_MAX_PORTS];
uintptr_t hio;
void *tcam;
uint32_t tcam_size;
uint64_t tcam_l2_prog_cls[NXGE_L2_PROG_CLS];
nxge_usr_l3_cls_t tcam_l3_prog_cls[NXGE_L3_PROG_CLS];
} nxge_hw_list_t, *p_nxge_hw_list_t;
#ifdef __cplusplus
}
#endif
#endif /* _SYS_NXGE_NXGE_COMMON_H */
|