1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * This file contains HW queue descriptor formats, config register 4*4882a593Smuzhiyun * structures etc 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * Copyright (C) 2015 Cavium, Inc. 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #ifndef Q_STRUCT_H 10*4882a593Smuzhiyun #define Q_STRUCT_H 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun /* Load transaction types for reading segment bytes specified by 13*4882a593Smuzhiyun * NIC_SEND_GATHER_S[LD_TYPE]. 14*4882a593Smuzhiyun */ 15*4882a593Smuzhiyun enum nic_send_ld_type_e { 16*4882a593Smuzhiyun NIC_SEND_LD_TYPE_E_LDD = 0x0, 17*4882a593Smuzhiyun NIC_SEND_LD_TYPE_E_LDT = 0x1, 18*4882a593Smuzhiyun NIC_SEND_LD_TYPE_E_LDWB = 0x2, 19*4882a593Smuzhiyun NIC_SEND_LD_TYPE_E_ENUM_LAST = 0x3, 20*4882a593Smuzhiyun }; 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun enum ether_type_algorithm { 23*4882a593Smuzhiyun ETYPE_ALG_NONE = 0x0, 24*4882a593Smuzhiyun ETYPE_ALG_SKIP = 0x1, 25*4882a593Smuzhiyun ETYPE_ALG_ENDPARSE = 0x2, 26*4882a593Smuzhiyun ETYPE_ALG_VLAN = 0x3, 27*4882a593Smuzhiyun ETYPE_ALG_VLAN_STRIP = 0x4, 28*4882a593Smuzhiyun }; 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun enum layer3_type { 31*4882a593Smuzhiyun L3TYPE_NONE = 0x00, 32*4882a593Smuzhiyun L3TYPE_GRH = 0x01, 33*4882a593Smuzhiyun L3TYPE_IPV4 = 0x04, 34*4882a593Smuzhiyun L3TYPE_IPV4_OPTIONS = 0x05, 35*4882a593Smuzhiyun L3TYPE_IPV6 = 0x06, 36*4882a593Smuzhiyun L3TYPE_IPV6_OPTIONS = 0x07, 37*4882a593Smuzhiyun L3TYPE_ET_STOP = 0x0D, 38*4882a593Smuzhiyun L3TYPE_OTHER = 0x0E, 39*4882a593Smuzhiyun }; 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun enum layer4_type { 42*4882a593Smuzhiyun L4TYPE_NONE = 0x00, 43*4882a593Smuzhiyun L4TYPE_IPSEC_ESP = 0x01, 44*4882a593Smuzhiyun L4TYPE_IPFRAG = 0x02, 45*4882a593Smuzhiyun L4TYPE_IPCOMP = 0x03, 46*4882a593Smuzhiyun L4TYPE_TCP = 0x04, 47*4882a593Smuzhiyun L4TYPE_UDP = 0x05, 48*4882a593Smuzhiyun L4TYPE_SCTP = 0x06, 49*4882a593Smuzhiyun L4TYPE_GRE = 0x07, 50*4882a593Smuzhiyun L4TYPE_ROCE_BTH = 0x08, 51*4882a593Smuzhiyun L4TYPE_OTHER = 0x0E, 52*4882a593Smuzhiyun }; 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun /* CPI and RSSI configuration */ 55*4882a593Smuzhiyun enum cpi_algorithm_type { 56*4882a593Smuzhiyun CPI_ALG_NONE = 0x0, 57*4882a593Smuzhiyun CPI_ALG_VLAN = 0x1, 58*4882a593Smuzhiyun CPI_ALG_VLAN16 = 0x2, 59*4882a593Smuzhiyun CPI_ALG_DIFF = 0x3, 60*4882a593Smuzhiyun }; 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun enum rss_algorithm_type { 63*4882a593Smuzhiyun RSS_ALG_NONE = 0x00, 64*4882a593Smuzhiyun RSS_ALG_PORT = 0x01, 65*4882a593Smuzhiyun RSS_ALG_IP = 0x02, 66*4882a593Smuzhiyun RSS_ALG_TCP_IP = 0x03, 67*4882a593Smuzhiyun RSS_ALG_UDP_IP = 0x04, 68*4882a593Smuzhiyun RSS_ALG_SCTP_IP = 0x05, 69*4882a593Smuzhiyun RSS_ALG_GRE_IP = 0x06, 70*4882a593Smuzhiyun RSS_ALG_ROCE = 0x07, 71*4882a593Smuzhiyun }; 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun enum rss_hash_cfg { 74*4882a593Smuzhiyun RSS_HASH_L2ETC = 0x00, 75*4882a593Smuzhiyun RSS_HASH_IP = 0x01, 76*4882a593Smuzhiyun RSS_HASH_TCP = 0x02, 77*4882a593Smuzhiyun RSS_HASH_TCP_SYN_DIS = 0x03, 78*4882a593Smuzhiyun RSS_HASH_UDP = 0x04, 79*4882a593Smuzhiyun RSS_HASH_L4ETC = 0x05, 80*4882a593Smuzhiyun RSS_HASH_ROCE = 0x06, 81*4882a593Smuzhiyun RSS_L3_BIDI = 0x07, 82*4882a593Smuzhiyun RSS_L4_BIDI = 0x08, 83*4882a593Smuzhiyun }; 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun /* Completion queue entry types */ 86*4882a593Smuzhiyun enum cqe_type { 87*4882a593Smuzhiyun CQE_TYPE_INVALID = 0x0, 88*4882a593Smuzhiyun CQE_TYPE_RX = 0x2, 89*4882a593Smuzhiyun CQE_TYPE_RX_SPLIT = 0x3, 90*4882a593Smuzhiyun CQE_TYPE_RX_TCP = 0x4, 91*4882a593Smuzhiyun CQE_TYPE_SEND = 0x8, 92*4882a593Smuzhiyun CQE_TYPE_SEND_PTP = 0x9, 93*4882a593Smuzhiyun }; 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun enum cqe_rx_tcp_status { 96*4882a593Smuzhiyun CQE_RX_STATUS_VALID_TCP_CNXT = 0x00, 97*4882a593Smuzhiyun CQE_RX_STATUS_INVALID_TCP_CNXT = 0x0F, 98*4882a593Smuzhiyun }; 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun enum cqe_send_status { 101*4882a593Smuzhiyun CQE_SEND_STATUS_GOOD = 0x00, 102*4882a593Smuzhiyun CQE_SEND_STATUS_DESC_FAULT = 0x01, 103*4882a593Smuzhiyun CQE_SEND_STATUS_HDR_CONS_ERR = 0x11, 104*4882a593Smuzhiyun CQE_SEND_STATUS_SUBDESC_ERR = 0x12, 105*4882a593Smuzhiyun CQE_SEND_STATUS_IMM_SIZE_OFLOW = 0x80, 106*4882a593Smuzhiyun CQE_SEND_STATUS_CRC_SEQ_ERR = 0x81, 107*4882a593Smuzhiyun CQE_SEND_STATUS_DATA_SEQ_ERR = 0x82, 108*4882a593Smuzhiyun CQE_SEND_STATUS_MEM_SEQ_ERR = 0x83, 109*4882a593Smuzhiyun CQE_SEND_STATUS_LOCK_VIOL = 0x84, 110*4882a593Smuzhiyun CQE_SEND_STATUS_LOCK_UFLOW = 0x85, 111*4882a593Smuzhiyun CQE_SEND_STATUS_DATA_FAULT = 0x86, 112*4882a593Smuzhiyun CQE_SEND_STATUS_TSTMP_CONFLICT = 0x87, 113*4882a593Smuzhiyun CQE_SEND_STATUS_TSTMP_TIMEOUT = 0x88, 114*4882a593Smuzhiyun CQE_SEND_STATUS_MEM_FAULT = 0x89, 115*4882a593Smuzhiyun CQE_SEND_STATUS_CSUM_OVERLAP = 0x8A, 116*4882a593Smuzhiyun CQE_SEND_STATUS_CSUM_OVERFLOW = 0x8B, 117*4882a593Smuzhiyun }; 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun enum cqe_rx_tcp_end_reason { 120*4882a593Smuzhiyun CQE_RX_TCP_END_FIN_FLAG_DET = 0, 121*4882a593Smuzhiyun CQE_RX_TCP_END_INVALID_FLAG = 1, 122*4882a593Smuzhiyun CQE_RX_TCP_END_TIMEOUT = 2, 123*4882a593Smuzhiyun CQE_RX_TCP_END_OUT_OF_SEQ = 3, 124*4882a593Smuzhiyun CQE_RX_TCP_END_PKT_ERR = 4, 125*4882a593Smuzhiyun CQE_RX_TCP_END_QS_DISABLED = 0x0F, 126*4882a593Smuzhiyun }; 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun /* Packet protocol level error enumeration */ 129*4882a593Smuzhiyun enum cqe_rx_err_level { 130*4882a593Smuzhiyun CQE_RX_ERRLVL_RE = 0x0, 131*4882a593Smuzhiyun CQE_RX_ERRLVL_L2 = 0x1, 132*4882a593Smuzhiyun CQE_RX_ERRLVL_L3 = 0x2, 133*4882a593Smuzhiyun CQE_RX_ERRLVL_L4 = 0x3, 134*4882a593Smuzhiyun }; 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun /* Packet protocol level error type enumeration */ 137*4882a593Smuzhiyun enum cqe_rx_err_opcode { 138*4882a593Smuzhiyun CQE_RX_ERR_RE_NONE = 0x0, 139*4882a593Smuzhiyun CQE_RX_ERR_RE_PARTIAL = 0x1, 140*4882a593Smuzhiyun CQE_RX_ERR_RE_JABBER = 0x2, 141*4882a593Smuzhiyun CQE_RX_ERR_RE_FCS = 0x7, 142*4882a593Smuzhiyun CQE_RX_ERR_RE_TERMINATE = 0x9, 143*4882a593Smuzhiyun CQE_RX_ERR_RE_RX_CTL = 0xb, 144*4882a593Smuzhiyun CQE_RX_ERR_PREL2_ERR = 0x1f, 145*4882a593Smuzhiyun CQE_RX_ERR_L2_FRAGMENT = 0x20, 146*4882a593Smuzhiyun CQE_RX_ERR_L2_OVERRUN = 0x21, 147*4882a593Smuzhiyun CQE_RX_ERR_L2_PFCS = 0x22, 148*4882a593Smuzhiyun CQE_RX_ERR_L2_PUNY = 0x23, 149*4882a593Smuzhiyun CQE_RX_ERR_L2_MAL = 0x24, 150*4882a593Smuzhiyun CQE_RX_ERR_L2_OVERSIZE = 0x25, 151*4882a593Smuzhiyun CQE_RX_ERR_L2_UNDERSIZE = 0x26, 152*4882a593Smuzhiyun CQE_RX_ERR_L2_LENMISM = 0x27, 153*4882a593Smuzhiyun CQE_RX_ERR_L2_PCLP = 0x28, 154*4882a593Smuzhiyun CQE_RX_ERR_IP_NOT = 0x41, 155*4882a593Smuzhiyun CQE_RX_ERR_IP_CHK = 0x42, 156*4882a593Smuzhiyun CQE_RX_ERR_IP_MAL = 0x43, 157*4882a593Smuzhiyun CQE_RX_ERR_IP_MALD = 0x44, 158*4882a593Smuzhiyun CQE_RX_ERR_IP_HOP = 0x45, 159*4882a593Smuzhiyun CQE_RX_ERR_L3_ICRC = 0x46, 160*4882a593Smuzhiyun CQE_RX_ERR_L3_PCLP = 0x47, 161*4882a593Smuzhiyun CQE_RX_ERR_L4_MAL = 0x61, 162*4882a593Smuzhiyun CQE_RX_ERR_L4_CHK = 0x62, 163*4882a593Smuzhiyun CQE_RX_ERR_UDP_LEN = 0x63, 164*4882a593Smuzhiyun CQE_RX_ERR_L4_PORT = 0x64, 165*4882a593Smuzhiyun CQE_RX_ERR_TCP_FLAG = 0x65, 166*4882a593Smuzhiyun CQE_RX_ERR_TCP_OFFSET = 0x66, 167*4882a593Smuzhiyun CQE_RX_ERR_L4_PCLP = 0x67, 168*4882a593Smuzhiyun CQE_RX_ERR_RBDR_TRUNC = 0x70, 169*4882a593Smuzhiyun }; 170*4882a593Smuzhiyun 171*4882a593Smuzhiyun struct cqe_rx_t { 172*4882a593Smuzhiyun #if defined(__BIG_ENDIAN_BITFIELD) 173*4882a593Smuzhiyun u64 cqe_type:4; /* W0 */ 174*4882a593Smuzhiyun u64 stdn_fault:1; 175*4882a593Smuzhiyun u64 rsvd0:1; 176*4882a593Smuzhiyun u64 rq_qs:7; 177*4882a593Smuzhiyun u64 rq_idx:3; 178*4882a593Smuzhiyun u64 rsvd1:12; 179*4882a593Smuzhiyun u64 rss_alg:4; 180*4882a593Smuzhiyun u64 rsvd2:4; 181*4882a593Smuzhiyun u64 rb_cnt:4; 182*4882a593Smuzhiyun u64 vlan_found:1; 183*4882a593Smuzhiyun u64 vlan_stripped:1; 184*4882a593Smuzhiyun u64 vlan2_found:1; 185*4882a593Smuzhiyun u64 vlan2_stripped:1; 186*4882a593Smuzhiyun u64 l4_type:4; 187*4882a593Smuzhiyun u64 l3_type:4; 188*4882a593Smuzhiyun u64 l2_present:1; 189*4882a593Smuzhiyun u64 err_level:3; 190*4882a593Smuzhiyun u64 err_opcode:8; 191*4882a593Smuzhiyun 192*4882a593Smuzhiyun u64 pkt_len:16; /* W1 */ 193*4882a593Smuzhiyun u64 l2_ptr:8; 194*4882a593Smuzhiyun u64 l3_ptr:8; 195*4882a593Smuzhiyun u64 l4_ptr:8; 196*4882a593Smuzhiyun u64 cq_pkt_len:8; 197*4882a593Smuzhiyun u64 align_pad:3; 198*4882a593Smuzhiyun u64 rsvd3:1; 199*4882a593Smuzhiyun u64 chan:12; 200*4882a593Smuzhiyun 201*4882a593Smuzhiyun u64 rss_tag:32; /* W2 */ 202*4882a593Smuzhiyun u64 vlan_tci:16; 203*4882a593Smuzhiyun u64 vlan_ptr:8; 204*4882a593Smuzhiyun u64 vlan2_ptr:8; 205*4882a593Smuzhiyun 206*4882a593Smuzhiyun u64 rb3_sz:16; /* W3 */ 207*4882a593Smuzhiyun u64 rb2_sz:16; 208*4882a593Smuzhiyun u64 rb1_sz:16; 209*4882a593Smuzhiyun u64 rb0_sz:16; 210*4882a593Smuzhiyun 211*4882a593Smuzhiyun u64 rb7_sz:16; /* W4 */ 212*4882a593Smuzhiyun u64 rb6_sz:16; 213*4882a593Smuzhiyun u64 rb5_sz:16; 214*4882a593Smuzhiyun u64 rb4_sz:16; 215*4882a593Smuzhiyun 216*4882a593Smuzhiyun u64 rb11_sz:16; /* W5 */ 217*4882a593Smuzhiyun u64 rb10_sz:16; 218*4882a593Smuzhiyun u64 rb9_sz:16; 219*4882a593Smuzhiyun u64 rb8_sz:16; 220*4882a593Smuzhiyun #elif defined(__LITTLE_ENDIAN_BITFIELD) 221*4882a593Smuzhiyun u64 err_opcode:8; 222*4882a593Smuzhiyun u64 err_level:3; 223*4882a593Smuzhiyun u64 l2_present:1; 224*4882a593Smuzhiyun u64 l3_type:4; 225*4882a593Smuzhiyun u64 l4_type:4; 226*4882a593Smuzhiyun u64 vlan2_stripped:1; 227*4882a593Smuzhiyun u64 vlan2_found:1; 228*4882a593Smuzhiyun u64 vlan_stripped:1; 229*4882a593Smuzhiyun u64 vlan_found:1; 230*4882a593Smuzhiyun u64 rb_cnt:4; 231*4882a593Smuzhiyun u64 rsvd2:4; 232*4882a593Smuzhiyun u64 rss_alg:4; 233*4882a593Smuzhiyun u64 rsvd1:12; 234*4882a593Smuzhiyun u64 rq_idx:3; 235*4882a593Smuzhiyun u64 rq_qs:7; 236*4882a593Smuzhiyun u64 rsvd0:1; 237*4882a593Smuzhiyun u64 stdn_fault:1; 238*4882a593Smuzhiyun u64 cqe_type:4; /* W0 */ 239*4882a593Smuzhiyun u64 chan:12; 240*4882a593Smuzhiyun u64 rsvd3:1; 241*4882a593Smuzhiyun u64 align_pad:3; 242*4882a593Smuzhiyun u64 cq_pkt_len:8; 243*4882a593Smuzhiyun u64 l4_ptr:8; 244*4882a593Smuzhiyun u64 l3_ptr:8; 245*4882a593Smuzhiyun u64 l2_ptr:8; 246*4882a593Smuzhiyun u64 pkt_len:16; /* W1 */ 247*4882a593Smuzhiyun u64 vlan2_ptr:8; 248*4882a593Smuzhiyun u64 vlan_ptr:8; 249*4882a593Smuzhiyun u64 vlan_tci:16; 250*4882a593Smuzhiyun u64 rss_tag:32; /* W2 */ 251*4882a593Smuzhiyun u64 rb0_sz:16; 252*4882a593Smuzhiyun u64 rb1_sz:16; 253*4882a593Smuzhiyun u64 rb2_sz:16; 254*4882a593Smuzhiyun u64 rb3_sz:16; /* W3 */ 255*4882a593Smuzhiyun u64 rb4_sz:16; 256*4882a593Smuzhiyun u64 rb5_sz:16; 257*4882a593Smuzhiyun u64 rb6_sz:16; 258*4882a593Smuzhiyun u64 rb7_sz:16; /* W4 */ 259*4882a593Smuzhiyun u64 rb8_sz:16; 260*4882a593Smuzhiyun u64 rb9_sz:16; 261*4882a593Smuzhiyun u64 rb10_sz:16; 262*4882a593Smuzhiyun u64 rb11_sz:16; /* W5 */ 263*4882a593Smuzhiyun #endif 264*4882a593Smuzhiyun u64 rb0_ptr:64; 265*4882a593Smuzhiyun u64 rb1_ptr:64; 266*4882a593Smuzhiyun u64 rb2_ptr:64; 267*4882a593Smuzhiyun u64 rb3_ptr:64; 268*4882a593Smuzhiyun u64 rb4_ptr:64; 269*4882a593Smuzhiyun u64 rb5_ptr:64; 270*4882a593Smuzhiyun u64 rb6_ptr:64; 271*4882a593Smuzhiyun u64 rb7_ptr:64; 272*4882a593Smuzhiyun u64 rb8_ptr:64; 273*4882a593Smuzhiyun u64 rb9_ptr:64; 274*4882a593Smuzhiyun u64 rb10_ptr:64; 275*4882a593Smuzhiyun u64 rb11_ptr:64; 276*4882a593Smuzhiyun }; 277*4882a593Smuzhiyun 278*4882a593Smuzhiyun struct cqe_rx_tcp_err_t { 279*4882a593Smuzhiyun #if defined(__BIG_ENDIAN_BITFIELD) 280*4882a593Smuzhiyun u64 cqe_type:4; /* W0 */ 281*4882a593Smuzhiyun u64 rsvd0:60; 282*4882a593Smuzhiyun 283*4882a593Smuzhiyun u64 rsvd1:4; /* W1 */ 284*4882a593Smuzhiyun u64 partial_first:1; 285*4882a593Smuzhiyun u64 rsvd2:27; 286*4882a593Smuzhiyun u64 rbdr_bytes:8; 287*4882a593Smuzhiyun u64 rsvd3:24; 288*4882a593Smuzhiyun #elif defined(__LITTLE_ENDIAN_BITFIELD) 289*4882a593Smuzhiyun u64 rsvd0:60; 290*4882a593Smuzhiyun u64 cqe_type:4; 291*4882a593Smuzhiyun 292*4882a593Smuzhiyun u64 rsvd3:24; 293*4882a593Smuzhiyun u64 rbdr_bytes:8; 294*4882a593Smuzhiyun u64 rsvd2:27; 295*4882a593Smuzhiyun u64 partial_first:1; 296*4882a593Smuzhiyun u64 rsvd1:4; 297*4882a593Smuzhiyun #endif 298*4882a593Smuzhiyun }; 299*4882a593Smuzhiyun 300*4882a593Smuzhiyun struct cqe_rx_tcp_t { 301*4882a593Smuzhiyun #if defined(__BIG_ENDIAN_BITFIELD) 302*4882a593Smuzhiyun u64 cqe_type:4; /* W0 */ 303*4882a593Smuzhiyun u64 rsvd0:52; 304*4882a593Smuzhiyun u64 cq_tcp_status:8; 305*4882a593Smuzhiyun 306*4882a593Smuzhiyun u64 rsvd1:32; /* W1 */ 307*4882a593Smuzhiyun u64 tcp_cntx_bytes:8; 308*4882a593Smuzhiyun u64 rsvd2:8; 309*4882a593Smuzhiyun u64 tcp_err_bytes:16; 310*4882a593Smuzhiyun #elif defined(__LITTLE_ENDIAN_BITFIELD) 311*4882a593Smuzhiyun u64 cq_tcp_status:8; 312*4882a593Smuzhiyun u64 rsvd0:52; 313*4882a593Smuzhiyun u64 cqe_type:4; /* W0 */ 314*4882a593Smuzhiyun 315*4882a593Smuzhiyun u64 tcp_err_bytes:16; 316*4882a593Smuzhiyun u64 rsvd2:8; 317*4882a593Smuzhiyun u64 tcp_cntx_bytes:8; 318*4882a593Smuzhiyun u64 rsvd1:32; /* W1 */ 319*4882a593Smuzhiyun #endif 320*4882a593Smuzhiyun }; 321*4882a593Smuzhiyun 322*4882a593Smuzhiyun struct cqe_send_t { 323*4882a593Smuzhiyun #if defined(__BIG_ENDIAN_BITFIELD) 324*4882a593Smuzhiyun u64 cqe_type:4; /* W0 */ 325*4882a593Smuzhiyun u64 rsvd0:4; 326*4882a593Smuzhiyun u64 sqe_ptr:16; 327*4882a593Smuzhiyun u64 rsvd1:4; 328*4882a593Smuzhiyun u64 rsvd2:10; 329*4882a593Smuzhiyun u64 sq_qs:7; 330*4882a593Smuzhiyun u64 sq_idx:3; 331*4882a593Smuzhiyun u64 rsvd3:8; 332*4882a593Smuzhiyun u64 send_status:8; 333*4882a593Smuzhiyun 334*4882a593Smuzhiyun u64 ptp_timestamp:64; /* W1 */ 335*4882a593Smuzhiyun #elif defined(__LITTLE_ENDIAN_BITFIELD) 336*4882a593Smuzhiyun u64 send_status:8; 337*4882a593Smuzhiyun u64 rsvd3:8; 338*4882a593Smuzhiyun u64 sq_idx:3; 339*4882a593Smuzhiyun u64 sq_qs:7; 340*4882a593Smuzhiyun u64 rsvd2:10; 341*4882a593Smuzhiyun u64 rsvd1:4; 342*4882a593Smuzhiyun u64 sqe_ptr:16; 343*4882a593Smuzhiyun u64 rsvd0:4; 344*4882a593Smuzhiyun u64 cqe_type:4; /* W0 */ 345*4882a593Smuzhiyun 346*4882a593Smuzhiyun u64 ptp_timestamp:64; /* W1 */ 347*4882a593Smuzhiyun #endif 348*4882a593Smuzhiyun }; 349*4882a593Smuzhiyun 350*4882a593Smuzhiyun union cq_desc_t { 351*4882a593Smuzhiyun u64 u[64]; 352*4882a593Smuzhiyun struct cqe_send_t snd_hdr; 353*4882a593Smuzhiyun struct cqe_rx_t rx_hdr; 354*4882a593Smuzhiyun struct cqe_rx_tcp_t rx_tcp_hdr; 355*4882a593Smuzhiyun struct cqe_rx_tcp_err_t rx_tcp_err_hdr; 356*4882a593Smuzhiyun }; 357*4882a593Smuzhiyun 358*4882a593Smuzhiyun struct rbdr_entry_t { 359*4882a593Smuzhiyun u64 buf_addr; 360*4882a593Smuzhiyun }; 361*4882a593Smuzhiyun 362*4882a593Smuzhiyun /* TCP reassembly context */ 363*4882a593Smuzhiyun struct rbe_tcp_cnxt_t { 364*4882a593Smuzhiyun #if defined(__BIG_ENDIAN_BITFIELD) 365*4882a593Smuzhiyun u64 tcp_pkt_cnt:12; 366*4882a593Smuzhiyun u64 rsvd1:4; 367*4882a593Smuzhiyun u64 align_hdr_bytes:4; 368*4882a593Smuzhiyun u64 align_ptr_bytes:4; 369*4882a593Smuzhiyun u64 ptr_bytes:16; 370*4882a593Smuzhiyun u64 rsvd2:24; 371*4882a593Smuzhiyun u64 cqe_type:4; 372*4882a593Smuzhiyun u64 rsvd0:54; 373*4882a593Smuzhiyun u64 tcp_end_reason:2; 374*4882a593Smuzhiyun u64 tcp_status:4; 375*4882a593Smuzhiyun #elif defined(__LITTLE_ENDIAN_BITFIELD) 376*4882a593Smuzhiyun u64 tcp_status:4; 377*4882a593Smuzhiyun u64 tcp_end_reason:2; 378*4882a593Smuzhiyun u64 rsvd0:54; 379*4882a593Smuzhiyun u64 cqe_type:4; 380*4882a593Smuzhiyun u64 rsvd2:24; 381*4882a593Smuzhiyun u64 ptr_bytes:16; 382*4882a593Smuzhiyun u64 align_ptr_bytes:4; 383*4882a593Smuzhiyun u64 align_hdr_bytes:4; 384*4882a593Smuzhiyun u64 rsvd1:4; 385*4882a593Smuzhiyun u64 tcp_pkt_cnt:12; 386*4882a593Smuzhiyun #endif 387*4882a593Smuzhiyun }; 388*4882a593Smuzhiyun 389*4882a593Smuzhiyun /* Always Big endian */ 390*4882a593Smuzhiyun struct rx_hdr_t { 391*4882a593Smuzhiyun u64 opaque:32; 392*4882a593Smuzhiyun u64 rss_flow:8; 393*4882a593Smuzhiyun u64 skip_length:6; 394*4882a593Smuzhiyun u64 disable_rss:1; 395*4882a593Smuzhiyun u64 disable_tcp_reassembly:1; 396*4882a593Smuzhiyun u64 nodrop:1; 397*4882a593Smuzhiyun u64 dest_alg:2; 398*4882a593Smuzhiyun u64 rsvd0:2; 399*4882a593Smuzhiyun u64 dest_rq:11; 400*4882a593Smuzhiyun }; 401*4882a593Smuzhiyun 402*4882a593Smuzhiyun enum send_l4_csum_type { 403*4882a593Smuzhiyun SEND_L4_CSUM_DISABLE = 0x00, 404*4882a593Smuzhiyun SEND_L4_CSUM_UDP = 0x01, 405*4882a593Smuzhiyun SEND_L4_CSUM_TCP = 0x02, 406*4882a593Smuzhiyun SEND_L4_CSUM_SCTP = 0x03, 407*4882a593Smuzhiyun }; 408*4882a593Smuzhiyun 409*4882a593Smuzhiyun enum send_crc_alg { 410*4882a593Smuzhiyun SEND_CRCALG_CRC32 = 0x00, 411*4882a593Smuzhiyun SEND_CRCALG_CRC32C = 0x01, 412*4882a593Smuzhiyun SEND_CRCALG_ICRC = 0x02, 413*4882a593Smuzhiyun }; 414*4882a593Smuzhiyun 415*4882a593Smuzhiyun enum send_load_type { 416*4882a593Smuzhiyun SEND_LD_TYPE_LDD = 0x00, 417*4882a593Smuzhiyun SEND_LD_TYPE_LDT = 0x01, 418*4882a593Smuzhiyun SEND_LD_TYPE_LDWB = 0x02, 419*4882a593Smuzhiyun }; 420*4882a593Smuzhiyun 421*4882a593Smuzhiyun enum send_mem_alg_type { 422*4882a593Smuzhiyun SEND_MEMALG_SET = 0x00, 423*4882a593Smuzhiyun SEND_MEMALG_ADD = 0x08, 424*4882a593Smuzhiyun SEND_MEMALG_SUB = 0x09, 425*4882a593Smuzhiyun SEND_MEMALG_ADDLEN = 0x0A, 426*4882a593Smuzhiyun SEND_MEMALG_SUBLEN = 0x0B, 427*4882a593Smuzhiyun }; 428*4882a593Smuzhiyun 429*4882a593Smuzhiyun enum send_mem_dsz_type { 430*4882a593Smuzhiyun SEND_MEMDSZ_B64 = 0x00, 431*4882a593Smuzhiyun SEND_MEMDSZ_B32 = 0x01, 432*4882a593Smuzhiyun SEND_MEMDSZ_B8 = 0x03, 433*4882a593Smuzhiyun }; 434*4882a593Smuzhiyun 435*4882a593Smuzhiyun enum sq_subdesc_type { 436*4882a593Smuzhiyun SQ_DESC_TYPE_INVALID = 0x00, 437*4882a593Smuzhiyun SQ_DESC_TYPE_HEADER = 0x01, 438*4882a593Smuzhiyun SQ_DESC_TYPE_CRC = 0x02, 439*4882a593Smuzhiyun SQ_DESC_TYPE_IMMEDIATE = 0x03, 440*4882a593Smuzhiyun SQ_DESC_TYPE_GATHER = 0x04, 441*4882a593Smuzhiyun SQ_DESC_TYPE_MEMORY = 0x05, 442*4882a593Smuzhiyun }; 443*4882a593Smuzhiyun 444*4882a593Smuzhiyun struct sq_crc_subdesc { 445*4882a593Smuzhiyun #if defined(__BIG_ENDIAN_BITFIELD) 446*4882a593Smuzhiyun u64 rsvd1:32; 447*4882a593Smuzhiyun u64 crc_ival:32; 448*4882a593Smuzhiyun u64 subdesc_type:4; 449*4882a593Smuzhiyun u64 crc_alg:2; 450*4882a593Smuzhiyun u64 rsvd0:10; 451*4882a593Smuzhiyun u64 crc_insert_pos:16; 452*4882a593Smuzhiyun u64 hdr_start:16; 453*4882a593Smuzhiyun u64 crc_len:16; 454*4882a593Smuzhiyun #elif defined(__LITTLE_ENDIAN_BITFIELD) 455*4882a593Smuzhiyun u64 crc_len:16; 456*4882a593Smuzhiyun u64 hdr_start:16; 457*4882a593Smuzhiyun u64 crc_insert_pos:16; 458*4882a593Smuzhiyun u64 rsvd0:10; 459*4882a593Smuzhiyun u64 crc_alg:2; 460*4882a593Smuzhiyun u64 subdesc_type:4; 461*4882a593Smuzhiyun u64 crc_ival:32; 462*4882a593Smuzhiyun u64 rsvd1:32; 463*4882a593Smuzhiyun #endif 464*4882a593Smuzhiyun }; 465*4882a593Smuzhiyun 466*4882a593Smuzhiyun struct sq_gather_subdesc { 467*4882a593Smuzhiyun #if defined(__BIG_ENDIAN_BITFIELD) 468*4882a593Smuzhiyun u64 subdesc_type:4; /* W0 */ 469*4882a593Smuzhiyun u64 ld_type:2; 470*4882a593Smuzhiyun u64 rsvd0:42; 471*4882a593Smuzhiyun u64 size:16; 472*4882a593Smuzhiyun 473*4882a593Smuzhiyun u64 rsvd1:15; /* W1 */ 474*4882a593Smuzhiyun u64 addr:49; 475*4882a593Smuzhiyun #elif defined(__LITTLE_ENDIAN_BITFIELD) 476*4882a593Smuzhiyun u64 size:16; 477*4882a593Smuzhiyun u64 rsvd0:42; 478*4882a593Smuzhiyun u64 ld_type:2; 479*4882a593Smuzhiyun u64 subdesc_type:4; /* W0 */ 480*4882a593Smuzhiyun 481*4882a593Smuzhiyun u64 addr:49; 482*4882a593Smuzhiyun u64 rsvd1:15; /* W1 */ 483*4882a593Smuzhiyun #endif 484*4882a593Smuzhiyun }; 485*4882a593Smuzhiyun 486*4882a593Smuzhiyun /* SQ immediate subdescriptor */ 487*4882a593Smuzhiyun struct sq_imm_subdesc { 488*4882a593Smuzhiyun #if defined(__BIG_ENDIAN_BITFIELD) 489*4882a593Smuzhiyun u64 subdesc_type:4; /* W0 */ 490*4882a593Smuzhiyun u64 rsvd0:46; 491*4882a593Smuzhiyun u64 len:14; 492*4882a593Smuzhiyun 493*4882a593Smuzhiyun u64 data:64; /* W1 */ 494*4882a593Smuzhiyun #elif defined(__LITTLE_ENDIAN_BITFIELD) 495*4882a593Smuzhiyun u64 len:14; 496*4882a593Smuzhiyun u64 rsvd0:46; 497*4882a593Smuzhiyun u64 subdesc_type:4; /* W0 */ 498*4882a593Smuzhiyun 499*4882a593Smuzhiyun u64 data:64; /* W1 */ 500*4882a593Smuzhiyun #endif 501*4882a593Smuzhiyun }; 502*4882a593Smuzhiyun 503*4882a593Smuzhiyun struct sq_mem_subdesc { 504*4882a593Smuzhiyun #if defined(__BIG_ENDIAN_BITFIELD) 505*4882a593Smuzhiyun u64 subdesc_type:4; /* W0 */ 506*4882a593Smuzhiyun u64 mem_alg:4; 507*4882a593Smuzhiyun u64 mem_dsz:2; 508*4882a593Smuzhiyun u64 wmem:1; 509*4882a593Smuzhiyun u64 rsvd0:21; 510*4882a593Smuzhiyun u64 offset:32; 511*4882a593Smuzhiyun 512*4882a593Smuzhiyun u64 rsvd1:15; /* W1 */ 513*4882a593Smuzhiyun u64 addr:49; 514*4882a593Smuzhiyun #elif defined(__LITTLE_ENDIAN_BITFIELD) 515*4882a593Smuzhiyun u64 offset:32; 516*4882a593Smuzhiyun u64 rsvd0:21; 517*4882a593Smuzhiyun u64 wmem:1; 518*4882a593Smuzhiyun u64 mem_dsz:2; 519*4882a593Smuzhiyun u64 mem_alg:4; 520*4882a593Smuzhiyun u64 subdesc_type:4; /* W0 */ 521*4882a593Smuzhiyun 522*4882a593Smuzhiyun u64 addr:49; 523*4882a593Smuzhiyun u64 rsvd1:15; /* W1 */ 524*4882a593Smuzhiyun #endif 525*4882a593Smuzhiyun }; 526*4882a593Smuzhiyun 527*4882a593Smuzhiyun struct sq_hdr_subdesc { 528*4882a593Smuzhiyun #if defined(__BIG_ENDIAN_BITFIELD) 529*4882a593Smuzhiyun u64 subdesc_type:4; 530*4882a593Smuzhiyun u64 tso:1; 531*4882a593Smuzhiyun u64 post_cqe:1; /* Post CQE on no error also */ 532*4882a593Smuzhiyun u64 dont_send:1; 533*4882a593Smuzhiyun u64 tstmp:1; 534*4882a593Smuzhiyun u64 subdesc_cnt:8; 535*4882a593Smuzhiyun u64 csum_l4:2; 536*4882a593Smuzhiyun u64 csum_l3:1; 537*4882a593Smuzhiyun u64 csum_inner_l4:2; 538*4882a593Smuzhiyun u64 csum_inner_l3:1; 539*4882a593Smuzhiyun u64 rsvd0:2; 540*4882a593Smuzhiyun u64 l4_offset:8; 541*4882a593Smuzhiyun u64 l3_offset:8; 542*4882a593Smuzhiyun u64 rsvd1:4; 543*4882a593Smuzhiyun u64 tot_len:20; /* W0 */ 544*4882a593Smuzhiyun 545*4882a593Smuzhiyun u64 rsvd2:24; 546*4882a593Smuzhiyun u64 inner_l4_offset:8; 547*4882a593Smuzhiyun u64 inner_l3_offset:8; 548*4882a593Smuzhiyun u64 tso_start:8; 549*4882a593Smuzhiyun u64 rsvd3:2; 550*4882a593Smuzhiyun u64 tso_max_paysize:14; /* W1 */ 551*4882a593Smuzhiyun #elif defined(__LITTLE_ENDIAN_BITFIELD) 552*4882a593Smuzhiyun u64 tot_len:20; 553*4882a593Smuzhiyun u64 rsvd1:4; 554*4882a593Smuzhiyun u64 l3_offset:8; 555*4882a593Smuzhiyun u64 l4_offset:8; 556*4882a593Smuzhiyun u64 rsvd0:2; 557*4882a593Smuzhiyun u64 csum_inner_l3:1; 558*4882a593Smuzhiyun u64 csum_inner_l4:2; 559*4882a593Smuzhiyun u64 csum_l3:1; 560*4882a593Smuzhiyun u64 csum_l4:2; 561*4882a593Smuzhiyun u64 subdesc_cnt:8; 562*4882a593Smuzhiyun u64 tstmp:1; 563*4882a593Smuzhiyun u64 dont_send:1; 564*4882a593Smuzhiyun u64 post_cqe:1; /* Post CQE on no error also */ 565*4882a593Smuzhiyun u64 tso:1; 566*4882a593Smuzhiyun u64 subdesc_type:4; /* W0 */ 567*4882a593Smuzhiyun 568*4882a593Smuzhiyun u64 tso_max_paysize:14; 569*4882a593Smuzhiyun u64 rsvd3:2; 570*4882a593Smuzhiyun u64 tso_start:8; 571*4882a593Smuzhiyun u64 inner_l3_offset:8; 572*4882a593Smuzhiyun u64 inner_l4_offset:8; 573*4882a593Smuzhiyun u64 rsvd2:24; /* W1 */ 574*4882a593Smuzhiyun #endif 575*4882a593Smuzhiyun }; 576*4882a593Smuzhiyun 577*4882a593Smuzhiyun /* Queue config register formats */ 578*4882a593Smuzhiyun struct rq_cfg { 579*4882a593Smuzhiyun #if defined(__BIG_ENDIAN_BITFIELD) 580*4882a593Smuzhiyun u64 reserved_2_63:62; 581*4882a593Smuzhiyun u64 ena:1; 582*4882a593Smuzhiyun u64 tcp_ena:1; 583*4882a593Smuzhiyun #elif defined(__LITTLE_ENDIAN_BITFIELD) 584*4882a593Smuzhiyun u64 tcp_ena:1; 585*4882a593Smuzhiyun u64 ena:1; 586*4882a593Smuzhiyun u64 reserved_2_63:62; 587*4882a593Smuzhiyun #endif 588*4882a593Smuzhiyun }; 589*4882a593Smuzhiyun 590*4882a593Smuzhiyun struct cq_cfg { 591*4882a593Smuzhiyun #if defined(__BIG_ENDIAN_BITFIELD) 592*4882a593Smuzhiyun u64 reserved_43_63:21; 593*4882a593Smuzhiyun u64 ena:1; 594*4882a593Smuzhiyun u64 reset:1; 595*4882a593Smuzhiyun u64 caching:1; 596*4882a593Smuzhiyun u64 reserved_35_39:5; 597*4882a593Smuzhiyun u64 qsize:3; 598*4882a593Smuzhiyun u64 reserved_25_31:7; 599*4882a593Smuzhiyun u64 avg_con:9; 600*4882a593Smuzhiyun u64 reserved_0_15:16; 601*4882a593Smuzhiyun #elif defined(__LITTLE_ENDIAN_BITFIELD) 602*4882a593Smuzhiyun u64 reserved_0_15:16; 603*4882a593Smuzhiyun u64 avg_con:9; 604*4882a593Smuzhiyun u64 reserved_25_31:7; 605*4882a593Smuzhiyun u64 qsize:3; 606*4882a593Smuzhiyun u64 reserved_35_39:5; 607*4882a593Smuzhiyun u64 caching:1; 608*4882a593Smuzhiyun u64 reset:1; 609*4882a593Smuzhiyun u64 ena:1; 610*4882a593Smuzhiyun u64 reserved_43_63:21; 611*4882a593Smuzhiyun #endif 612*4882a593Smuzhiyun }; 613*4882a593Smuzhiyun 614*4882a593Smuzhiyun struct sq_cfg { 615*4882a593Smuzhiyun #if defined(__BIG_ENDIAN_BITFIELD) 616*4882a593Smuzhiyun u64 reserved_32_63:32; 617*4882a593Smuzhiyun u64 cq_limit:8; 618*4882a593Smuzhiyun u64 reserved_20_23:4; 619*4882a593Smuzhiyun u64 ena:1; 620*4882a593Smuzhiyun u64 reserved_18_18:1; 621*4882a593Smuzhiyun u64 reset:1; 622*4882a593Smuzhiyun u64 ldwb:1; 623*4882a593Smuzhiyun u64 reserved_11_15:5; 624*4882a593Smuzhiyun u64 qsize:3; 625*4882a593Smuzhiyun u64 reserved_3_7:5; 626*4882a593Smuzhiyun u64 tstmp_bgx_intf:3; 627*4882a593Smuzhiyun #elif defined(__LITTLE_ENDIAN_BITFIELD) 628*4882a593Smuzhiyun u64 tstmp_bgx_intf:3; 629*4882a593Smuzhiyun u64 reserved_3_7:5; 630*4882a593Smuzhiyun u64 qsize:3; 631*4882a593Smuzhiyun u64 reserved_11_15:5; 632*4882a593Smuzhiyun u64 ldwb:1; 633*4882a593Smuzhiyun u64 reset:1; 634*4882a593Smuzhiyun u64 reserved_18_18:1; 635*4882a593Smuzhiyun u64 ena:1; 636*4882a593Smuzhiyun u64 reserved_20_23:4; 637*4882a593Smuzhiyun u64 cq_limit:8; 638*4882a593Smuzhiyun u64 reserved_32_63:32; 639*4882a593Smuzhiyun #endif 640*4882a593Smuzhiyun }; 641*4882a593Smuzhiyun 642*4882a593Smuzhiyun struct rbdr_cfg { 643*4882a593Smuzhiyun #if defined(__BIG_ENDIAN_BITFIELD) 644*4882a593Smuzhiyun u64 reserved_45_63:19; 645*4882a593Smuzhiyun u64 ena:1; 646*4882a593Smuzhiyun u64 reset:1; 647*4882a593Smuzhiyun u64 ldwb:1; 648*4882a593Smuzhiyun u64 reserved_36_41:6; 649*4882a593Smuzhiyun u64 qsize:4; 650*4882a593Smuzhiyun u64 reserved_25_31:7; 651*4882a593Smuzhiyun u64 avg_con:9; 652*4882a593Smuzhiyun u64 reserved_12_15:4; 653*4882a593Smuzhiyun u64 lines:12; 654*4882a593Smuzhiyun #elif defined(__LITTLE_ENDIAN_BITFIELD) 655*4882a593Smuzhiyun u64 lines:12; 656*4882a593Smuzhiyun u64 reserved_12_15:4; 657*4882a593Smuzhiyun u64 avg_con:9; 658*4882a593Smuzhiyun u64 reserved_25_31:7; 659*4882a593Smuzhiyun u64 qsize:4; 660*4882a593Smuzhiyun u64 reserved_36_41:6; 661*4882a593Smuzhiyun u64 ldwb:1; 662*4882a593Smuzhiyun u64 reset:1; 663*4882a593Smuzhiyun u64 ena: 1; 664*4882a593Smuzhiyun u64 reserved_45_63:19; 665*4882a593Smuzhiyun #endif 666*4882a593Smuzhiyun }; 667*4882a593Smuzhiyun 668*4882a593Smuzhiyun struct qs_cfg { 669*4882a593Smuzhiyun #if defined(__BIG_ENDIAN_BITFIELD) 670*4882a593Smuzhiyun u64 reserved_32_63:32; 671*4882a593Smuzhiyun u64 ena:1; 672*4882a593Smuzhiyun u64 reserved_27_30:4; 673*4882a593Smuzhiyun u64 sq_ins_ena:1; 674*4882a593Smuzhiyun u64 sq_ins_pos:6; 675*4882a593Smuzhiyun u64 lock_ena:1; 676*4882a593Smuzhiyun u64 lock_viol_cqe_ena:1; 677*4882a593Smuzhiyun u64 send_tstmp_ena:1; 678*4882a593Smuzhiyun u64 be:1; 679*4882a593Smuzhiyun u64 reserved_7_15:9; 680*4882a593Smuzhiyun u64 vnic:7; 681*4882a593Smuzhiyun #elif defined(__LITTLE_ENDIAN_BITFIELD) 682*4882a593Smuzhiyun u64 vnic:7; 683*4882a593Smuzhiyun u64 reserved_7_15:9; 684*4882a593Smuzhiyun u64 be:1; 685*4882a593Smuzhiyun u64 send_tstmp_ena:1; 686*4882a593Smuzhiyun u64 lock_viol_cqe_ena:1; 687*4882a593Smuzhiyun u64 lock_ena:1; 688*4882a593Smuzhiyun u64 sq_ins_pos:6; 689*4882a593Smuzhiyun u64 sq_ins_ena:1; 690*4882a593Smuzhiyun u64 reserved_27_30:4; 691*4882a593Smuzhiyun u64 ena:1; 692*4882a593Smuzhiyun u64 reserved_32_63:32; 693*4882a593Smuzhiyun #endif 694*4882a593Smuzhiyun }; 695*4882a593Smuzhiyun 696*4882a593Smuzhiyun #endif /* Q_STRUCT_H */ 697