uts: make emu10k non-verbose
[unleashed.git] / include / sys / nxge / nxge_common.h
blob191bc27f4fd9a077ac9ef1f5293f44f9cfad51d7
1 /*
2 * CDDL HEADER START
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.
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.
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]
19 * CDDL HEADER END
22 * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
26 #ifndef _SYS_NXGE_NXGE_COMMON_H
27 #define _SYS_NXGE_NXGE_COMMON_H
29 #ifdef __cplusplus
30 extern "C" {
31 #endif
33 #define NXGE_DMA_START B_TRUE
34 #define NXGE_DMA_STOP B_FALSE
37 * Default DMA configurations.
39 #define NXGE_RDMA_PER_NIU_PORT (NXGE_MAX_RDCS/NXGE_PORTS_NIU)
40 #define NXGE_TDMA_PER_NIU_PORT (NXGE_MAX_TDCS_NIU/NXGE_PORTS_NIU)
41 #define NXGE_RDMA_PER_NEP_PORT (NXGE_MAX_RDCS/NXGE_PORTS_NEPTUNE)
42 #define NXGE_TDMA_PER_NEP_PORT (NXGE_MAX_TDCS/NXGE_PORTS_NEPTUNE)
43 #define NXGE_RDCGRP_PER_NIU_PORT (NXGE_MAX_RDC_GROUPS/NXGE_PORTS_NIU)
44 #define NXGE_RDCGRP_PER_NEP_PORT (NXGE_MAX_RDC_GROUPS/NXGE_PORTS_NEPTUNE)
46 #define NXGE_TIMER_RESO 2
48 #define NXGE_TIMER_LDG 2
51 * Receive and Transmit DMA definitions
53 #if defined(sun4v) && defined(NIU_LP_WORKAROUND)
55 * N2/NIU: Maximum descriptors if we need to call
56 * Hypervisor to set up the logical pages
57 * and the driver must use contiguous memory.
59 #define NXGE_NIU_MAX_ENTRY (1 << 9) /* 512 */
60 #define NXGE_NIU_CONTIG_RBR_MAX (NXGE_NIU_MAX_ENTRY)
61 #define NXGE_NIU_CONTIG_RCR_MAX (NXGE_NIU_MAX_ENTRY)
62 #define NXGE_NIU_CONTIG_TX_MAX (NXGE_NIU_MAX_ENTRY)
63 #endif
65 #ifdef _DMA_USES_VIRTADDR
66 #ifdef NIU_PA_WORKAROUND
67 #define NXGE_DMA_BLOCK (16 * 64 * 4)
68 #else
69 #define NXGE_DMA_BLOCK 1
70 #endif
71 #else
72 #define NXGE_DMA_BLOCK (64 * 64)
73 #endif
75 #define NXGE_RBR_RBB_MIN (128)
76 #define NXGE_RBR_RBB_MAX (64 * 128 -1)
78 #if defined(sun4v) && defined(NIU_LP_WORKAROUND)
79 #define NXGE_RBR_RBB_DEFAULT 512
80 #define NXGE_RBR_SPARE 0
81 #else
82 #if defined(__i386)
83 #define NXGE_RBR_RBB_DEFAULT 256
84 #else
85 #define NXGE_RBR_RBB_DEFAULT (64 * 16) /* x86 hello */
86 #endif
87 #define NXGE_RBR_SPARE 0
88 #endif
91 #define NXGE_RCR_MIN (NXGE_RBR_RBB_MIN * 2)
93 #if defined(sun4v) && defined(NIU_LP_WORKAROUND)
94 #define NXGE_RCR_MAX (8192)
95 #define NXGE_RCR_DEFAULT (512)
96 #define NXGE_TX_RING_DEFAULT (512)
97 #else
98 #ifndef NIU_PA_WORKAROUND
99 #define NXGE_RCR_MAX (65355) /* MAX hardware supported */
100 #if defined(_BIG_ENDIAN)
101 #define NXGE_RCR_DEFAULT (NXGE_RBR_RBB_DEFAULT * 8)
102 #else
103 #ifdef USE_RX_BIG_BUF
104 #define NXGE_RCR_DEFAULT (NXGE_RBR_RBB_DEFAULT * 8)
105 #else
106 #define NXGE_RCR_DEFAULT (NXGE_RBR_RBB_DEFAULT * 4)
107 #endif
108 #endif
109 #if defined(__i386)
110 #define NXGE_TX_RING_DEFAULT (256)
111 #else
112 #define NXGE_TX_RING_DEFAULT (1024)
113 #endif
114 #define NXGE_TX_RING_MAX (64 * 128 - 1)
115 #else
116 #if defined(__i386)
117 #define NXGE_RCR_DEFAULT (256)
118 #define NXGE_TX_RING_DEFAULT (256)
119 #else
120 #define NXGE_RCR_DEFAULT (512)
121 #define NXGE_TX_RING_DEFAULT (512)
122 #endif
123 #define NXGE_RCR_MAX (1024)
124 #define NXGE_TX_RING_MAX (1024)
125 #endif
126 #endif
128 #define NXGE_TX_RECLAIM 32
130 /* per receive DMA channel configuration data structure */
131 typedef struct nxge_rdc_cfg {
132 uint32_t flag; /* 0: not configured, 1: configured */
133 struct nxge_hw_list *nxge_hw_p;
134 uint32_t partition_id;
135 uint32_t port; /* function number */
136 uint32_t rx_group_id;
138 /* Partitioning, DMC function zero. */
139 uint32_t rx_log_page_vld_page0; /* TRUE or FALSE */
140 uint32_t rx_log_page_vld_page1; /* TRUE or FALSE */
141 uint64_t rx_log_mask1;
142 uint64_t rx_log_value1;
143 uint64_t rx_log_mask2;
144 uint64_t rx_log_value2;
145 uint64_t rx_log_page_relo1;
146 uint64_t rx_log_page_relo2;
147 uint64_t rx_log_page_hdl;
149 /* WRED parameters, DMC function zero */
150 uint32_t red_enable;
152 uint32_t thre_syn;
153 uint32_t win_syn;
154 uint32_t threshold;
155 uint32_t win_non_syn;
157 /* RXDMA configuration, DMC */
158 char *rdc_mbaddr_p; /* mailbox address */
159 uint32_t min_flag; /* TRUE for 18 bytes header */
161 /* Software Reserved Packet Buffer Offset, DMC */
162 uint32_t sw_offset;
164 /* RBR Configuration A */
165 uint64_t rbr_staddr; /* starting address of RBR */
166 uint32_t rbr_nblks; /* # of RBR entries */
167 uint32_t rbr_len; /* # of RBR entries in 64B lines */
169 /* RBR Configuration B */
170 uint32_t bksize; /* Block size is fixed. */
171 #define RBR_BKSIZE_4K 0
172 #define RBR_BKSIZE_4K_BYTES (4 * 1024)
173 #define RBR_BKSIZE_8K 1
174 #define RBR_BKSIZE_8K_BYTES (8 * 1024)
175 #define RBR_BKSIZE_16K 2
176 #define RBR_BKSIZE_16K_BYTES (16 * 1024)
177 #define RBR_BKSIZE_32K 3
178 #define RBR_BKSIZE_32K_BYTES (32 * 1024)
180 uint32_t bufsz2;
181 #define RBR_BUFSZ2_2K 0
182 #define RBR_BUFSZ2_2K_BYTES (2 * 1024)
183 #define RBR_BUFSZ2_4K 1
184 #define RBR_BUFSZ2_4K_BYTES (4 * 1024)
185 #define RBR_BUFSZ2_8K 2
186 #define RBR_BUFSZ2_8K_BYTES (8 * 1024)
187 #define RBR_BUFSZ2_16K 3
188 #define RBR_BUFSZ2_16K_BYTES (16 * 1024)
190 uint32_t bufsz1;
191 #define RBR_BUFSZ1_1K 0
192 #define RBR_BUFSZ1_1K_BYTES 1024
193 #define RBR_BUFSZ1_2K 1
194 #define RBR_BUFSZ1_2K_BYTES (2 * 1024)
195 #define RBR_BUFSZ1_4K 2
196 #define RBR_BUFSZ1_4K_BYTES (4 * 1024)
197 #define RBR_BUFSZ1_8K 3
198 #define RBR_BUFSZ1_8K_BYTES (8 * 1024)
200 uint32_t bufsz0;
201 #define RBR_BUFSZ0_256B 0
202 #define RBR_BUFSZ0_256_BYTES 256
203 #define RBR_BUFSZ0_512B 1
204 #define RBR_BUFSZ0_512B_BYTES 512
205 #define RBR_BUFSZ0_1K 2
206 #define RBR_BUFSZ0_1K_BYTES (1024)
207 #define RBR_BUFSZ0_2K 3
208 #define RBR_BUFSZ0_2K_BYTES (2 * 1024)
210 /* Receive buffers added by the software */
211 uint32_t bkadd; /* maximum size is 1 million */
213 /* Receive Completion Ring Configuration A */
214 uint32_t rcr_len; /* # of 64B blocks, each RCR is 8B */
215 uint64_t rcr_staddr;
217 /* Receive Completion Ring Configuration B */
218 uint32_t pthres; /* packet threshold */
219 uint32_t entout; /* enable timeout */
220 uint32_t timeout; /* timeout value */
222 /* Logical Device Group Number */
223 uint16_t rx_ldg;
224 uint16_t rx_ld_state_flags;
226 /* Receive DMA Channel Event Mask */
227 uint64_t rx_dma_ent_mask;
229 /* 32 bit (set to 1) or 64 bit (set to 0) addressing mode */
230 uint32_t rx_addr_md;
231 } nxge_rdc_cfg_t, *p_nxge_rdc_cfg_t;
234 * Per Transmit DMA Channel Configuration Data Structure (32 TDC)
236 typedef struct nxge_tdc_cfg {
237 uint32_t flag; /* 0: not configured 1: configured */
238 struct nxge_hw_list *nxge_hw_p;
239 uint32_t port; /* function number */
240 /* partitioning, DMC function zero (All 0s for non-partitioning) */
241 uint32_t tx_log_page_vld_page0; /* TRUE or FALSE */
242 uint32_t tx_log_page_vld_page1; /* TRUE or FALSE */
243 uint64_t tx_log_mask1;
244 uint64_t tx_log_value1;
245 uint64_t tx_log_mask2;
246 uint64_t tx_log_value2;
247 uint64_t tx_log_page_relo1;
248 uint64_t tx_log_page_relo2;
249 uint64_t tx_log_page_hdl;
251 /* Transmit Ring Configuration */
252 uint64_t tx_staddr;
253 uint64_t tx_rng_len; /* in 64 B Blocks */
254 #define TX_MAX_BUF_SIZE 4096
256 /* TXDMA configuration, DMC */
257 char *tdc_mbaddr_p; /* mailbox address */
259 /* Logical Device Group Number */
260 uint16_t tx_ldg;
261 uint16_t tx_ld_state_flags;
263 /* TXDMA event flags */
264 uint64_t tx_event_mask;
266 /* Transmit threshold before reclamation */
267 uint32_t tx_rng_threshold;
268 #define TX_RING_THRESHOLD (TX_DEFAULT_MAX_GPS/4)
269 #define TX_RING_JUMBO_THRESHOLD (TX_DEFAULT_JUMBO_MAX_GPS/4)
271 /* For reclaim: a wrap-around counter (packets transmitted) */
272 uint32_t tx_pkt_cnt;
273 /* last packet with the mark bit set */
274 uint32_t tx_lastmark;
275 } nxge_tdc_cfg_t, *p_nxge_tdc_cfg_t;
277 #define RDC_TABLE_ENTRY_METHOD_SEQ 0
278 #define RDC_TABLE_ENTRY_METHOD_REP 1
280 /* per transmit DMA channel table group data structure */
281 typedef struct nxge_tdc_grp {
282 uint32_t start_tdc; /* assume assigned in sequence */
283 uint8_t max_tdcs;
284 dc_map_t map;
285 uint8_t grp_index; /* nxge_t.tx_set.group[grp_index] */
286 } nxge_tdc_grp_t, *p_nxge_tdc_grp_t;
288 /* per receive DMA channel table group data structure */
289 typedef struct nxge_rdc_grp {
290 boolean_t flag; /* 0: not configured 1: configured */
291 uint8_t port;
292 uint32_t start_rdc; /* assume assigned in sequence */
293 uint8_t max_rdcs;
294 uint8_t def_rdc;
295 dc_map_t map;
296 uint16_t config_method;
297 uint8_t grp_index; /* nxge_t.rx_set.group[grp_index] */
298 } nxge_rdc_grp_t, *p_nxge_rdc_grp_t;
300 #define RDC_MAP_IN(map, rdc) \
301 (map |= (1 << rdc))
303 #define RDC_MAP_OUT(map, rdc) \
304 (map &= (~(1 << rdc)))
306 /* Common RDC and TDC configuration of DMC */
307 typedef struct _nxge_dma_common_cfg_t {
308 uint16_t rdc_red_ran_init; /* RED initial seed value */
310 /* Transmit Ring */
311 } nxge_dma_common_cfg_t, *p_nxge_dma_common_cfg_t;
314 * VLAN and MAC table configurations:
315 * Each VLAN ID should belong to at most one RDC group.
316 * Each port could own multiple RDC groups.
317 * Each MAC should belong to one RDC group.
319 typedef struct nxge_mv_cfg {
320 uint8_t flag; /* 0:unconfigure 1:configured */
321 uint8_t rdctbl; /* RDC channel table group */
322 uint8_t mpr_npr; /* MAC and VLAN preference */
323 } nxge_mv_cfg_t, *p_nxge_mv_cfg_t;
325 typedef struct nxge_param_map {
326 #if defined(_BIG_ENDIAN)
327 uint32_t rsrvd2:2; /* [30:31] rsrvd */
328 uint32_t remove:1; /* [29] Remove */
329 uint32_t pref:1; /* [28] preference */
330 uint32_t rsrv:4; /* [27:24] preference */
331 uint32_t map_to:8; /* [23:16] map to resource */
332 uint32_t param_id:16; /* [15:0] Param ID */
333 #else
334 uint32_t param_id:16; /* [15:0] Param ID */
335 uint32_t map_to:8; /* [23:16] map to resource */
336 uint32_t rsrv:4; /* [27:24] preference */
337 uint32_t pref:1; /* [28] preference */
338 uint32_t remove:1; /* [29] Remove */
339 uint32_t rsrvd2:2; /* [30:31] rsrvd */
340 #endif
341 } nxge_param_map_t, *p_nxge_param_map_t;
343 typedef struct nxge_rcr_param {
344 #if defined(_BIG_ENDIAN)
345 uint32_t rsrvd2:2; /* [30:31] rsrvd */
346 uint32_t remove:1; /* [29] Remove */
347 uint32_t rsrv:5; /* [28:24] preference */
348 uint32_t rdc:8; /* [23:16] rdc # */
349 uint32_t cfg_val:16; /* [15:0] interrupt parameter */
350 #else
351 uint32_t cfg_val:16; /* [15:0] interrupt parameter */
352 uint32_t rdc:8; /* [23:16] rdc # */
353 uint32_t rsrv:5; /* [28:24] preference */
354 uint32_t remove:1; /* [29] Remove */
355 uint32_t rsrvd2:2; /* [30:31] rsrvd */
356 #endif
357 } nxge_rcr_param_t, *p_nxge_rcr_param_t;
360 * These are the properties of the TxDMA channels for this
361 * port (instance).
362 * <start> is the index of the first TDC that is being managed
363 * by this port.
364 * <count> is the number of TDCs being managed by this port.
365 * <owned> is the number of TDCs currently being utilized by this port.
367 * <owned> may be less than <count> in hybrid I/O systems.
369 typedef struct {
370 int start; /* start TDC (0 - 31) */
371 int count; /* 8 - 32 */
372 int owned; /* 1 - count */
373 } tdc_cfg_t;
375 /* Needs to have entries in the ndd table */
377 * Hardware properties created by fcode.
378 * In order for those properties visible to the user
379 * command ndd, we need to add the following properties
380 * to the ndd defined parameter array and data structures.
382 * Use default static configuration for x86.
384 typedef struct nxge_hw_pt_cfg {
385 uint32_t function_number; /* function number */
386 tdc_cfg_t tdc;
387 uint32_t start_rdc; /* start RDC (0 - 31) */
388 uint32_t max_rdcs; /* max rdc in sequence */
389 uint32_t ninterrupts; /* obp interrupts(mac/mif/syserr) */
390 uint32_t mac_ldvid;
391 uint32_t mif_ldvid;
392 uint32_t ser_ldvid;
393 uint32_t def_rdc; /* default RDC */
394 uint32_t drr_wt; /* port DRR weight */
395 uint32_t max_grpids; /* max group ID */
396 uint32_t grpids[NXGE_MAX_RDCS]; /* RDC group IDs */
397 uint32_t max_rdc_grpids; /* max RDC group ID */
398 uint32_t start_ldg; /* starting logical group # */
399 uint32_t max_ldgs; /* max logical device group */
400 uint32_t max_ldvs; /* max logical devices */
401 uint32_t start_mac_entry; /* where to put the first mac */
402 uint32_t max_macs; /* the max mac entry allowed */
403 uint32_t mac_pref; /* preference over VLAN */
404 uint32_t def_mac_txdma_grpid; /* default TDC group ID */
405 uint32_t def_mac_rxdma_grpid; /* default RDC group ID */
406 uint32_t vlan_pref; /* preference over MAC */
408 /* Expand if we have more hardware or default configurations */
409 uint16_t ldg[NXGE_INT_MAX_LDG];
410 uint16_t ldg_chn_start;
411 } nxge_hw_pt_cfg_t, *p_nxge_hw_pt_cfg_t;
414 /* per port configuration */
415 typedef struct nxge_dma_pt_cfg {
416 uint8_t mac_port; /* MAC port (function) */
417 nxge_hw_pt_cfg_t hw_config; /* hardware configuration */
419 uint32_t alloc_buf_size;
420 uint32_t rbr_size;
421 uint32_t rcr_size;
424 * Configuration for hardware initialization based on the
425 * hardware properties or the default properties.
427 uint32_t tx_dma_map; /* Transmit DMA channel bit map */
429 /* Transmit DMA channel: device wise */
430 nxge_tdc_grp_t tdc_grps[NXGE_MAX_TDC_GROUPS];
432 /* Receive DMA channel */
433 nxge_rdc_grp_t rdc_grps[NXGE_MAX_RDC_GROUPS];
435 uint16_t rcr_timeout[NXGE_MAX_RDCS];
436 uint16_t rcr_threshold[NXGE_MAX_RDCS];
437 uint8_t rcr_full_header;
438 uint16_t rx_drr_weight;
440 /* Add more stuff later */
441 } nxge_dma_pt_cfg_t, *p_nxge_dma_pt_cfg_t;
443 /* classification configuration */
444 typedef struct nxge_class_pt_cfg {
446 /* MAC table */
447 nxge_mv_cfg_t mac_host_info[NXGE_MAX_MACS];
449 /* VLAN table */
450 nxge_mv_cfg_t vlan_tbl[NXGE_MAX_VLANS];
451 /* class config value */
452 uint32_t init_h1;
453 uint16_t init_h2;
454 uint8_t mcast_rdcgrp;
455 uint8_t mac_rdcgrp;
456 uint32_t class_cfg[TCAM_CLASS_MAX];
457 } nxge_class_pt_cfg_t, *p_nxge_class_pt_cfg_t;
459 /* per Neptune sharable resources among ports */
460 typedef struct nxge_common {
461 uint32_t partition_id;
462 boolean_t mode32;
463 /* DMA Channels: RDC and TDC */
464 nxge_rdc_cfg_t rdc_config[NXGE_MAX_RDCS];
465 nxge_tdc_cfg_t tdc_config[NXGE_MAX_TDCS];
466 nxge_dma_common_cfg_t dma_common_config;
468 uint32_t timer_res;
469 boolean_t ld_sys_error_set;
470 uint8_t sys_error_owner;
472 /* Layer 2/3/4 */
473 uint16_t class2_etype;
474 uint16_t class3_etype;
476 /* FCRAM (hashing) */
477 uint32_t hash1_initval;
478 uint32_t hash2_initval;
479 } nxge_common_t, *p_nxge_common_t;
482 * Partition (logical domain) configuration per Neptune/NIU.
484 typedef struct nxge_part_cfg {
485 uint32_t rdc_grpbits; /* RDC group bit masks */
486 uint32_t tdc_bitmap; /* bounded TDC */
487 nxge_dma_pt_cfg_t pt_config[NXGE_MAX_PORTS];
489 /* Flow Classification Partition (flow partition select register) */
490 uint8_t hash_lookup; /* external lookup is available */
491 uint8_t base_mask; /* select bits in base_h1 to replace */
492 /* bits [19:15} in Hash 1. */
493 uint8_t base_h1; /* value to replace Hash 1 [19:15]. */
495 /* Add more here */
496 uint32_t attributes; /* permission and attribute bits */
497 #define FZC_SERVICE_ENTITY 0x01
498 #define FZC_READ_WRITE 0x02
499 #define FZC_READ_ONLY 0x04
500 } nxge_part_cfg_t, *p_nxge_part_cfg_t;
502 typedef struct nxge_usr_l3_cls {
503 uint64_t cls;
504 uint16_t tcam_ref_cnt;
505 uint8_t pid;
506 uint8_t flow_pkt_type;
507 uint8_t valid;
508 } nxge_usr_l3_cls_t, *p_nxge_usr_l3_cls_t;
510 typedef struct nxge_hw_list {
511 struct nxge_hw_list *next;
512 nxge_os_mutex_t nxge_cfg_lock;
513 nxge_os_mutex_t nxge_tcam_lock;
514 nxge_os_mutex_t nxge_vlan_lock;
515 nxge_os_mutex_t nxge_mdio_lock;
517 nxge_dev_info_t *parent_devp;
518 #if defined(sun4v)
520 * With Hybrid I/O, a VR (virtualization region) is the moral
521 * equivalent of a device function as seen in the service domain.
522 * And, a guest domain can map up to 8 VRs for a single NIU for both
523 * of the physical ports. Hence, need space for up to the maximum
524 * number of VRs (functions) for the guest domain driver.
526 * For non-sun4v platforms, NXGE_MAX_PORTS provides the correct
527 * number of functions for the device. For sun4v platforms,
528 * NXGE_MAX_FUNCTIONS will be defined by the number of
529 * VRs that the guest domain can map.
531 * NOTE: This solution only works for one NIU and will need to
532 * revisit this for KT-NIU.
534 #define NXGE_MAX_GUEST_FUNCTIONS 8
535 #define NXGE_MAX_FUNCTIONS NXGE_MAX_GUEST_FUNCTIONS
536 #else
537 #define NXGE_MAX_FUNCTIONS NXGE_MAX_PORTS
538 #endif
539 struct _nxge_t *nxge_p[NXGE_MAX_FUNCTIONS];
540 uint32_t ndevs;
541 uint32_t flags;
542 uint32_t magic;
543 uint32_t niu_type;
544 uint32_t platform_type;
545 uint8_t xcvr_addr[NXGE_MAX_PORTS];
546 uintptr_t hio;
547 void *tcam;
548 uint32_t tcam_size;
549 uint64_t tcam_l2_prog_cls[NXGE_L2_PROG_CLS];
550 nxge_usr_l3_cls_t tcam_l3_prog_cls[NXGE_L3_PROG_CLS];
551 } nxge_hw_list_t, *p_nxge_hw_list_t;
553 #ifdef __cplusplus
555 #endif
557 #endif /* _SYS_NXGE_NXGE_COMMON_H */