16349Sqs148142 /* 26349Sqs148142 * CDDL HEADER START 36349Sqs148142 * 46349Sqs148142 * The contents of this file are subject to the terms of the 56349Sqs148142 * Common Development and Distribution License (the "License"). 66349Sqs148142 * You may not use this file except in compliance with the License. 76349Sqs148142 * 86349Sqs148142 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 96349Sqs148142 * or http://www.opensolaris.org/os/licensing. 106349Sqs148142 * See the License for the specific language governing permissions 116349Sqs148142 * and limitations under the License. 126349Sqs148142 * 136349Sqs148142 * When distributing Covered Code, include this CDDL HEADER in each 146349Sqs148142 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 156349Sqs148142 * If applicable, add the following below this CDDL HEADER, with the 166349Sqs148142 * fields enclosed by brackets "[]" replaced with your own identifying 176349Sqs148142 * information: Portions Copyright [yyyy] [name of copyright owner] 186349Sqs148142 * 196349Sqs148142 * CDDL HEADER END 206349Sqs148142 */ 216349Sqs148142 226349Sqs148142 /* 236349Sqs148142 * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 246349Sqs148142 * Use is subject to license terms. 256349Sqs148142 */ 266349Sqs148142 276349Sqs148142 #ifndef _HXGE_PFC_H 286349Sqs148142 #define _HXGE_PFC_H 296349Sqs148142 306349Sqs148142 #pragma ident "%Z%%M% %I% %E% SMI" 316349Sqs148142 326349Sqs148142 #ifdef __cplusplus 336349Sqs148142 extern "C" { 346349Sqs148142 #endif 356349Sqs148142 366349Sqs148142 /* 0 and 4095 are reserved */ 376349Sqs148142 #define VLAN_ID_MIN 1 386349Sqs148142 #define VLAN_ID_MAX 4094 396349Sqs148142 #define VLAN_ID_IMPLICIT 0 406349Sqs148142 416349Sqs148142 #define HXGE_MAC_DEFAULT_ADDR_SLOT 0 426349Sqs148142 436349Sqs148142 #define HASH_BITS 8 446349Sqs148142 #define NMCFILTER_BITS (1 << HASH_BITS) 456349Sqs148142 #define HASH_REG_WIDTH 16 466349Sqs148142 #define NMCFILTER_REGS (NMCFILTER_BITS / HASH_REG_WIDTH) 476349Sqs148142 /* Number of multicast filter regs */ 486349Sqs148142 #define MAC_MAX_HASH_ENTRY NMCFILTER_REGS 496349Sqs148142 506349Sqs148142 #define REG_PIO_WRITE64(handle, offset, value) \ 516349Sqs148142 HXGE_REG_WR64((handle), (offset), (value)) 526349Sqs148142 #define REG_PIO_READ64(handle, offset, val_p) \ 536349Sqs148142 HXGE_REG_RD64((handle), (offset), (val_p)) 546349Sqs148142 556349Sqs148142 #define TCAM_CTL_RWC_TCAM_WR 0x0 566349Sqs148142 #define TCAM_CTL_RWC_TCAM_CMP 0x2 576349Sqs148142 #define TCAM_CTL_RWC_RAM_WR 0x4 586349Sqs148142 #define TCAM_CTL_RWC_RAM_RD 0x5 596349Sqs148142 #define TCAM_CTL_RWC_RWC_STAT 0x1 606349Sqs148142 #define TCAM_CTL_RWC_RWC_MATCH 0x1 616349Sqs148142 626349Sqs148142 #define WRITE_TCAM_REG_CTL(handle, ctl) \ 636349Sqs148142 REG_PIO_WRITE64(handle, PFC_TCAM_CTRL, ctl) 646349Sqs148142 656349Sqs148142 #define READ_TCAM_REG_CTL(handle, val_p) \ 666349Sqs148142 REG_PIO_READ64(handle, PFC_TCAM_CTRL, val_p) 676349Sqs148142 686349Sqs148142 #define WRITE_TCAM_REG_KEY0(handle, key) \ 696349Sqs148142 REG_PIO_WRITE64(handle, PFC_TCAM_KEY0, key) 706349Sqs148142 #define WRITE_TCAM_REG_KEY1(handle, key) \ 716349Sqs148142 REG_PIO_WRITE64(handle, PFC_TCAM_KEY1, key) 726349Sqs148142 #define WRITE_TCAM_REG_MASK0(handle, mask) \ 736349Sqs148142 REG_PIO_WRITE64(handle, PFC_TCAM_MASK0, mask) 746349Sqs148142 #define WRITE_TCAM_REG_MASK1(handle, mask) \ 756349Sqs148142 REG_PIO_WRITE64(handle, PFC_TCAM_MASK1, mask) 766349Sqs148142 776349Sqs148142 #define READ_TCAM_REG_KEY0(handle, val_p) \ 786349Sqs148142 REG_PIO_READ64(handle, PFC_TCAM_KEY0, val_p) 796349Sqs148142 #define READ_TCAM_REG_KEY1(handle, val_p) \ 806349Sqs148142 REG_PIO_READ64(handle, PFC_TCAM_KEY1, val_p) 816349Sqs148142 #define READ_TCAM_REG_MASK0(handle, val_p) \ 826349Sqs148142 REG_PIO_READ64(handle, PFC_TCAM_MASK0, val_p) 836349Sqs148142 #define READ_TCAM_REG_MASK1(handle, val_p) \ 846349Sqs148142 REG_PIO_READ64(handle, PFC_TCAM_MASK1, val_p) 856349Sqs148142 866349Sqs148142 typedef union _hxge_tcam_res_t { 876349Sqs148142 uint64_t value; 886349Sqs148142 struct { 896349Sqs148142 #if defined(_BIG_ENDIAN) 90*6864Sqs148142 uint32_t padding:32; 91*6864Sqs148142 uint32_t padding_l:2; 92*6864Sqs148142 uint32_t reserved:15; 93*6864Sqs148142 uint32_t parity:1; 94*6864Sqs148142 uint32_t hit_count:4; 95*6864Sqs148142 uint32_t channel_d:2; 96*6864Sqs148142 uint32_t channel_c:2; 97*6864Sqs148142 uint32_t channel_b:2; 98*6864Sqs148142 uint32_t channel_a:2; 99*6864Sqs148142 uint32_t source_hash:1; 100*6864Sqs148142 uint32_t discard:1; 1016349Sqs148142 #else 102*6864Sqs148142 uint32_t discard:1; 103*6864Sqs148142 uint32_t source_hash:1; 104*6864Sqs148142 uint32_t channel_a:2; 105*6864Sqs148142 uint32_t channel_b:2; 106*6864Sqs148142 uint32_t channel_c:2; 107*6864Sqs148142 uint32_t channel_d:2; 108*6864Sqs148142 uint32_t hit_count:4; 109*6864Sqs148142 uint32_t parity:1; 110*6864Sqs148142 uint32_t reserved:15; 111*6864Sqs148142 uint32_t padding_l:2; 112*6864Sqs148142 uint32_t padding:32; 1136349Sqs148142 #endif 1146349Sqs148142 } bits; 1156349Sqs148142 } hxge_tcam_res_t, *p_hxge_tcam_res_t; 1166349Sqs148142 1176349Sqs148142 typedef struct tcam_reg { 1186349Sqs148142 #if defined(_BIG_ENDIAN) 1196349Sqs148142 uint64_t reg1; /* 99:64 */ 1206349Sqs148142 uint64_t reg0; /* 63:0 */ 1216349Sqs148142 #else 1226349Sqs148142 uint64_t reg0; /* 63:0 */ 1236349Sqs148142 uint64_t reg1; /* 99:64 */ 1246349Sqs148142 #endif 1256349Sqs148142 } hxge_tcam_reg_t; 1266349Sqs148142 1276349Sqs148142 typedef struct hxge_tcam_ipv4_S { 1286349Sqs148142 #if defined(_BIG_ENDIAN) 129*6864Sqs148142 uint32_t class_code:4; /* 99:96 */ 130*6864Sqs148142 uint32_t class_code_l:1; /* 95:95 */ 1316349Sqs148142 uint32_t blade_id:4; /* 94:91 */ 1326349Sqs148142 uint32_t rsrvd2:2; /* 90:89 */ 1336349Sqs148142 uint32_t noport:1; /* 88 */ 1346349Sqs148142 uint32_t protocol:8; /* 87:80 */ 135*6864Sqs148142 uint32_t l4_hdr:16; /* 79:64 */ 136*6864Sqs148142 uint32_t l4_hdr_l:16; /* 63:48 */ 1376349Sqs148142 uint32_t rsrvd:16; /* 47:32 */ 1386349Sqs148142 uint32_t ip_daddr; /* 31:0 */ 1396349Sqs148142 #else 1406349Sqs148142 uint32_t ip_daddr; /* 31:0 */ 1416349Sqs148142 uint32_t rsrvd:16; /* 47:32 */ 142*6864Sqs148142 uint32_t l4_hdr_l:16; /* 63:48 */ 143*6864Sqs148142 uint32_t l4_hdr:16; /* 79:64 */ 1446349Sqs148142 uint32_t protocol:8; /* 87:80 */ 1456349Sqs148142 uint32_t noport:1; /* 88 */ 1466349Sqs148142 uint32_t rsrvd2:2; /* 90:89 */ 1476349Sqs148142 uint32_t blade_id:4; /* 94:91 */ 148*6864Sqs148142 uint32_t class_code_l:1; /* 95:95 */ 149*6864Sqs148142 uint32_t class_code:4; /* 99:96 */ 1506349Sqs148142 #endif 1516349Sqs148142 } hxge_tcam_ipv4_t; 1526349Sqs148142 1536349Sqs148142 typedef struct hxge_tcam_ipv6_S { 1546349Sqs148142 #if defined(_BIG_ENDIAN) 155*6864Sqs148142 uint32_t class_code:4; /* 99:96 */ 156*6864Sqs148142 uint32_t class_code_l:1; /* 95:95 */ 1576349Sqs148142 uint32_t blade_id:4; /* 94:91 */ 158*6864Sqs148142 uint32_t rsrvd2:3; /* 90:88 */ 159*6864Sqs148142 uint32_t protocol:8; /* 87:80 */ 160*6864Sqs148142 uint32_t l4_hdr:16; /* 79:64 */ 161*6864Sqs148142 uint32_t l4_hdr_l:16; /* 63:48 */ 162*6864Sqs148142 uint32_t rsrvd:16; /* 47:32 */ 163*6864Sqs148142 uint32_t rsrvd_l:32; /* 31:0 */ 1646349Sqs148142 #else 165*6864Sqs148142 uint32_t rsrvd_l:32; /* 31:0 */ 166*6864Sqs148142 uint32_t rsrvd:16; /* 47:32 */ 167*6864Sqs148142 uint32_t l4_hdr_l:16; /* 63:48 */ 168*6864Sqs148142 uint32_t l4_hdr:16; /* 79:64 */ 169*6864Sqs148142 uint32_t protocol:8; /* 87:80 */ 170*6864Sqs148142 uint32_t rsrvd2:3; /* 90:88 */ 1716349Sqs148142 uint32_t blade_id:4; /* 94:91 */ 172*6864Sqs148142 uint32_t class_code_l:1; /* 95:95 */ 173*6864Sqs148142 uint32_t class_code:4; /* 99:96 */ 1746349Sqs148142 #endif 1756349Sqs148142 } hxge_tcam_ipv6_t; 1766349Sqs148142 1776349Sqs148142 typedef struct hxge_tcam_enet_S { 1786349Sqs148142 #if defined(_BIG_ENDIAN) 179*6864Sqs148142 uint8_t class_code:4; /* 99:96 */ 180*6864Sqs148142 uint8_t class_code_l:1; /* 95:95 */ 1816349Sqs148142 uint8_t blade_id:4; /* 94:91 */ 1826349Sqs148142 uint8_t rsrvd:3; /* 90:88 */ 1836349Sqs148142 uint8_t eframe[11]; /* 87:0 */ 1846349Sqs148142 #else 1856349Sqs148142 uint8_t eframe[11]; /* 87:0 */ 1866349Sqs148142 uint8_t rsrvd:3; /* 90:88 */ 1876349Sqs148142 uint8_t blade_id:4; /* 94:91 */ 188*6864Sqs148142 uint8_t class_code_l:1; /* 95:95 */ 189*6864Sqs148142 uint8_t class_code:4; /* 99:96 */ 1906349Sqs148142 #endif 1916349Sqs148142 } hxge_tcam_ether_t; 1926349Sqs148142 1936349Sqs148142 typedef struct hxge_tcam_spread_S { 1946349Sqs148142 #if defined(_BIG_ENDIAN) 195*6864Sqs148142 uint32_t unused:28; /* 127:100 */ 196*6864Sqs148142 uint32_t class_code:4; /* 99:96 */ 197*6864Sqs148142 uint32_t class_code_l:1; /* 95:95 */ 198*6864Sqs148142 uint32_t blade_id:4; /* 94:91 */ 199*6864Sqs148142 uint32_t wild1:27; /* 90:64 */ 200*6864Sqs148142 uint32_t wild; /* 63:32 */ 201*6864Sqs148142 uint32_t wild_l; /* 31:0 */ 2026349Sqs148142 #else 203*6864Sqs148142 uint32_t wild_l; /* 31:0 */ 204*6864Sqs148142 uint32_t wild; /* 63:32 */ 205*6864Sqs148142 uint32_t wild1:27; /* 90:64 */ 206*6864Sqs148142 uint32_t blade_id:4; /* 94:91 */ 207*6864Sqs148142 uint32_t class_code_l:1; /* 95:95 */ 208*6864Sqs148142 uint32_t class_code:4; /* 99:96 */ 209*6864Sqs148142 uint32_t unused:28; /* 127:100 */ 2106349Sqs148142 #endif 2116349Sqs148142 } hxge_tcam_spread_t; 2126349Sqs148142 2136349Sqs148142 typedef struct hxge_tcam_entry_S { 2146349Sqs148142 union _hxge_tcam_entry { 2156349Sqs148142 hxge_tcam_ipv4_t ipv4; 2166349Sqs148142 hxge_tcam_ipv6_t ipv6; 2176349Sqs148142 hxge_tcam_ether_t enet; 2186349Sqs148142 hxge_tcam_reg_t regs; 2196349Sqs148142 hxge_tcam_spread_t spread; 2206349Sqs148142 } key, mask; 2216349Sqs148142 hxge_tcam_res_t match_action; 2226349Sqs148142 uint16_t ether_type; 2236349Sqs148142 } hxge_tcam_entry_t; 2246349Sqs148142 2256349Sqs148142 #define key_reg0 key.regs.reg0 2266349Sqs148142 #define key_reg1 key.regs.reg1 2276349Sqs148142 #define mask_reg0 mask.regs.reg0 2286349Sqs148142 #define mask_reg1 mask.regs.reg1 2296349Sqs148142 2306349Sqs148142 #define key0 key.regs.reg0 2316349Sqs148142 #define key1 key.regs.reg1 2326349Sqs148142 #define mask0 mask.regs.reg0 2336349Sqs148142 #define mask1 mask.regs.reg1 2346349Sqs148142 2356349Sqs148142 #define ip4_class_key key.ipv4.class_code 236*6864Sqs148142 #define ip4_class_key_l key.ipv4.class_code_l 2376349Sqs148142 #define ip4_blade_id_key key.ipv4.blade_id 2386349Sqs148142 #define ip4_noport_key key.ipv4.noport 2396349Sqs148142 #define ip4_proto_key key.ipv4.protocol 2406349Sqs148142 #define ip4_l4_hdr_key key.ipv4.l4_hdr 241*6864Sqs148142 #define ip4_l4_hdr_key_l key.ipv4.l4_hdr_l 2426349Sqs148142 #define ip4_dest_key key.ipv4.ip_daddr 2436349Sqs148142 2446349Sqs148142 #define ip4_class_mask mask.ipv4.class_code 245*6864Sqs148142 #define ip4_class_mask_l mask.ipv4.class_code_l 2466349Sqs148142 #define ip4_blade_id_mask mask.ipv4.blade_id 2476349Sqs148142 #define ip4_noport_mask mask.ipv4.noport 2486349Sqs148142 #define ip4_proto_mask mask.ipv4.protocol 2496349Sqs148142 #define ip4_l4_hdr_mask mask.ipv4.l4_hdr 250*6864Sqs148142 #define ip4_l4_hdr_mask_l mask.ipv4.l4_hdr_l 2516349Sqs148142 #define ip4_dest_mask mask.ipv4.ip_daddr 2526349Sqs148142 2536349Sqs148142 #define ip6_class_key key.ipv6.class_code 254*6864Sqs148142 #define ip6_class_key_l key.ipv6.class_code_l 2556349Sqs148142 #define ip6_blade_id_key key.ipv6.blade_id 2566349Sqs148142 #define ip6_proto_key key.ipv6.protocol 2576349Sqs148142 #define ip6_l4_hdr_key key.ipv6.l4_hdr 258*6864Sqs148142 #define ip6_l4_hdr_key_l key.ipv6.l4_hdr_l 2596349Sqs148142 2606349Sqs148142 #define ip6_class_mask mask.ipv6.class_code 261*6864Sqs148142 #define ip6_class_mask_l mask.ipv6.class_code_l 2626349Sqs148142 #define ip6_blade_id_mask mask.ipv6.blade_id 2636349Sqs148142 #define ip6_proto_mask mask.ipv6.protocol 2646349Sqs148142 #define ip6_l4_hdr_mask mask.ipv6.l4_hdr 265*6864Sqs148142 #define ip6_l4_hdr_mask_l mask.ipv6.l4_hdr_l 2666349Sqs148142 2676349Sqs148142 #define ether_class_key key.enet.class_code 268*6864Sqs148142 #define ether_class_key_l key.enet.class_code_l 2696349Sqs148142 #define ether_blade_id_key key.enet.blade_id 2706349Sqs148142 #define ether_ethframe_key key.enet.eframe 2716349Sqs148142 2726349Sqs148142 #define ether_class_mask mask.enet.class_code 273*6864Sqs148142 #define ether_class_mask_l mask.enet.class_code_l 2746349Sqs148142 #define ether_blade_id_mask mask.enet.blade_id 2756349Sqs148142 #define ether_ethframe_mask mask.enet.eframe 2766349Sqs148142 2776349Sqs148142 typedef struct _pfc_errlog { 2786349Sqs148142 uint32_t tcp_ctrl_drop; /* pfc_drop_log */ 2796349Sqs148142 uint32_t l2_addr_drop; 2806349Sqs148142 uint32_t class_code_drop; 2816349Sqs148142 uint32_t tcam_drop; 2826349Sqs148142 uint32_t vlan_drop; 2836349Sqs148142 2846349Sqs148142 uint32_t vlan_par_err_log; /* pfc_vlan_par_err_log */ 2856349Sqs148142 uint32_t tcam_par_err_log; /* pfc_tcam_par_err_log */ 2866349Sqs148142 } pfc_errlog_t, *p_pfc_errlog_t; 2876349Sqs148142 2886349Sqs148142 typedef struct _pfc_stats { 2896349Sqs148142 uint32_t pkt_drop; /* pfc_int_status */ 2906349Sqs148142 uint32_t tcam_parity_err; 2916349Sqs148142 uint32_t vlan_parity_err; 2926349Sqs148142 2936349Sqs148142 uint32_t bad_cs_count; /* pfc_bad_cs_counter */ 2946349Sqs148142 uint32_t drop_count; /* pfc_drop_counter */ 2956349Sqs148142 pfc_errlog_t errlog; 2966349Sqs148142 } hxge_pfc_stats_t, *p_hxge_pfc_stats_t; 2976349Sqs148142 2986349Sqs148142 typedef enum pfc_tcam_class { 2996349Sqs148142 TCAM_CLASS_INVALID = 0, 3006349Sqs148142 TCAM_CLASS_DUMMY = 1, 3016349Sqs148142 TCAM_CLASS_ETYPE_1 = 2, 3026349Sqs148142 TCAM_CLASS_ETYPE_2, 3036349Sqs148142 TCAM_CLASS_RESERVED_4, 3046349Sqs148142 TCAM_CLASS_RESERVED_5, 3056349Sqs148142 TCAM_CLASS_RESERVED_6, 3066349Sqs148142 TCAM_CLASS_RESERVED_7, 3076349Sqs148142 TCAM_CLASS_TCP_IPV4, 3086349Sqs148142 TCAM_CLASS_UDP_IPV4, 3096349Sqs148142 TCAM_CLASS_AH_ESP_IPV4, 3106349Sqs148142 TCAM_CLASS_SCTP_IPV4, 3116349Sqs148142 TCAM_CLASS_TCP_IPV6, 3126349Sqs148142 TCAM_CLASS_UDP_IPV6, 3136349Sqs148142 TCAM_CLASS_AH_ESP_IPV6, 3146349Sqs148142 TCAM_CLASS_SCTP_IPV6, 3156349Sqs148142 TCAM_CLASS_ARP, 3166349Sqs148142 TCAM_CLASS_RARP, 3176349Sqs148142 TCAM_CLASS_DUMMY_12, 3186349Sqs148142 TCAM_CLASS_DUMMY_13, 3196349Sqs148142 TCAM_CLASS_DUMMY_14, 3206349Sqs148142 TCAM_CLASS_DUMMY_15, 3216349Sqs148142 TCAM_CLASS_MAX 3226349Sqs148142 } tcam_class_t; 3236349Sqs148142 3246349Sqs148142 typedef struct _tcam_key_cfg_t { 3256349Sqs148142 boolean_t lookup_enable; 3266349Sqs148142 boolean_t discard; 3276349Sqs148142 } tcam_key_cfg_t; 3286349Sqs148142 3296349Sqs148142 typedef struct _hash_filter_t { 3306349Sqs148142 uint_t hash_ref_cnt; 3316349Sqs148142 uint16_t hash_filter_regs[NMCFILTER_REGS]; 3326349Sqs148142 uint32_t hash_bit_ref_cnt[NMCFILTER_BITS]; 3336349Sqs148142 } hash_filter_t, *p_hash_filter_t; 3346349Sqs148142 3356349Sqs148142 #define HXGE_ETHER_FLOWS (FLOW_ETHER_DHOST | FLOW_ETHER_SHOST | \ 3366349Sqs148142 FLOW_ETHER_TYPE) 3376349Sqs148142 #define HXGE_VLAN_FLOWS (FLOW_ETHER_TPID | FLOW_ETHER_TCI) 3386349Sqs148142 #define HXGE_ETHERNET_FLOWS (HXGE_ETHER_FLOWS | HXGE_VLAN_FLOWS) 3396349Sqs148142 #define HXGE_PORT_FLOWS (FLOW_ULP_PORT_REMOTE | FLOW_ULP_PORT_LOCAL) 3406349Sqs148142 #define HXGE_ADDR_FLOWS (FLOW_IP_REMOTE | FLOW_IP_LOCAL) 3416349Sqs148142 #define HXGE_IP_FLOWS (FLOW_IP_VERSION | FLOW_IP_PROTOCOL | \ 3426349Sqs148142 HXGE_PORT_FLOWS | HXGE_ADDR_FLOWS) 3436349Sqs148142 #define HXGE_SUPPORTED_FLOWS (HXGE_ETHERNET_FLOWS | HXGE_IP_FLOWS) 3446349Sqs148142 3456349Sqs148142 #define CLS_CODE_MASK 0x1f 3466349Sqs148142 #define BLADE_ID_MASK 0xf 3476349Sqs148142 #define PID_MASK 0xff 3486349Sqs148142 #define IP_PORT_MASK 0xffff 3496349Sqs148142 3506349Sqs148142 #define IP_ADDR_SA_MASK 0xFFFFFFFF 3516349Sqs148142 #define IP_ADDR_DA_MASK IP_ADDR_SA_MASK 3526349Sqs148142 #define L4PT_SPI_MASK IP_ADDR_SA_MASK 3536349Sqs148142 3546349Sqs148142 #define BLADE_ID_OFFSET 127 /* Last entry in HCR_REG */ 3556349Sqs148142 3566349Sqs148142 #ifdef __cplusplus 3576349Sqs148142 } 3586349Sqs148142 #endif 3596349Sqs148142 3606349Sqs148142 #endif /* !_HXGE_PFC_H */ 361