hinic_hw_wqe.h (13674B)
1/* SPDX-License-Identifier: GPL-2.0-only */ 2/* 3 * Huawei HiNIC PCI Express Linux driver 4 * Copyright(c) 2017 Huawei Technologies Co., Ltd 5 */ 6 7#ifndef HINIC_HW_WQE_H 8#define HINIC_HW_WQE_H 9 10#include "hinic_common.h" 11 12#define HINIC_CMDQ_CTRL_PI_SHIFT 0 13#define HINIC_CMDQ_CTRL_CMD_SHIFT 16 14#define HINIC_CMDQ_CTRL_MOD_SHIFT 24 15#define HINIC_CMDQ_CTRL_ACK_TYPE_SHIFT 29 16#define HINIC_CMDQ_CTRL_HW_BUSY_BIT_SHIFT 31 17 18#define HINIC_CMDQ_CTRL_PI_MASK 0xFFFF 19#define HINIC_CMDQ_CTRL_CMD_MASK 0xFF 20#define HINIC_CMDQ_CTRL_MOD_MASK 0x1F 21#define HINIC_CMDQ_CTRL_ACK_TYPE_MASK 0x3 22#define HINIC_CMDQ_CTRL_HW_BUSY_BIT_MASK 0x1 23 24#define HINIC_CMDQ_CTRL_SET(val, member) \ 25 (((u32)(val) & HINIC_CMDQ_CTRL_##member##_MASK) \ 26 << HINIC_CMDQ_CTRL_##member##_SHIFT) 27 28#define HINIC_CMDQ_CTRL_GET(val, member) \ 29 (((val) >> HINIC_CMDQ_CTRL_##member##_SHIFT) \ 30 & HINIC_CMDQ_CTRL_##member##_MASK) 31 32#define HINIC_CMDQ_WQE_HEADER_BUFDESC_LEN_SHIFT 0 33#define HINIC_CMDQ_WQE_HEADER_COMPLETE_FMT_SHIFT 15 34#define HINIC_CMDQ_WQE_HEADER_DATA_FMT_SHIFT 22 35#define HINIC_CMDQ_WQE_HEADER_COMPLETE_REQ_SHIFT 23 36#define HINIC_CMDQ_WQE_HEADER_COMPLETE_SECT_LEN_SHIFT 27 37#define HINIC_CMDQ_WQE_HEADER_CTRL_LEN_SHIFT 29 38#define HINIC_CMDQ_WQE_HEADER_TOGGLED_WRAPPED_SHIFT 31 39 40#define HINIC_CMDQ_WQE_HEADER_BUFDESC_LEN_MASK 0xFF 41#define HINIC_CMDQ_WQE_HEADER_COMPLETE_FMT_MASK 0x1 42#define HINIC_CMDQ_WQE_HEADER_DATA_FMT_MASK 0x1 43#define HINIC_CMDQ_WQE_HEADER_COMPLETE_REQ_MASK 0x1 44#define HINIC_CMDQ_WQE_HEADER_COMPLETE_SECT_LEN_MASK 0x3 45#define HINIC_CMDQ_WQE_HEADER_CTRL_LEN_MASK 0x3 46#define HINIC_CMDQ_WQE_HEADER_TOGGLED_WRAPPED_MASK 0x1 47 48#define HINIC_CMDQ_WQE_HEADER_SET(val, member) \ 49 (((u32)(val) & HINIC_CMDQ_WQE_HEADER_##member##_MASK) \ 50 << HINIC_CMDQ_WQE_HEADER_##member##_SHIFT) 51 52#define HINIC_CMDQ_WQE_HEADER_GET(val, member) \ 53 (((val) >> HINIC_CMDQ_WQE_HEADER_##member##_SHIFT) \ 54 & HINIC_CMDQ_WQE_HEADER_##member##_MASK) 55 56#define HINIC_SQ_CTRL_BUFDESC_SECT_LEN_SHIFT 0 57#define HINIC_SQ_CTRL_TASKSECT_LEN_SHIFT 16 58#define HINIC_SQ_CTRL_DATA_FORMAT_SHIFT 22 59#define HINIC_SQ_CTRL_LEN_SHIFT 29 60 61#define HINIC_SQ_CTRL_BUFDESC_SECT_LEN_MASK 0xFF 62#define HINIC_SQ_CTRL_TASKSECT_LEN_MASK 0x1F 63#define HINIC_SQ_CTRL_DATA_FORMAT_MASK 0x1 64#define HINIC_SQ_CTRL_LEN_MASK 0x3 65 66#define HINIC_SQ_CTRL_QUEUE_INFO_PLDOFF_SHIFT 2 67#define HINIC_SQ_CTRL_QUEUE_INFO_UFO_SHIFT 10 68#define HINIC_SQ_CTRL_QUEUE_INFO_TSO_SHIFT 11 69#define HINIC_SQ_CTRL_QUEUE_INFO_TCPUDP_CS_SHIFT 12 70#define HINIC_SQ_CTRL_QUEUE_INFO_MSS_SHIFT 13 71#define HINIC_SQ_CTRL_QUEUE_INFO_SCTP_SHIFT 27 72#define HINIC_SQ_CTRL_QUEUE_INFO_UC_SHIFT 28 73#define HINIC_SQ_CTRL_QUEUE_INFO_PRI_SHIFT 29 74 75#define HINIC_SQ_CTRL_QUEUE_INFO_PLDOFF_MASK 0xFF 76#define HINIC_SQ_CTRL_QUEUE_INFO_UFO_MASK 0x1 77#define HINIC_SQ_CTRL_QUEUE_INFO_TSO_MASK 0x1 78#define HINIC_SQ_CTRL_QUEUE_INFO_TCPUDP_CS_MASK 0x1 79#define HINIC_SQ_CTRL_QUEUE_INFO_MSS_MASK 0x3FFF 80#define HINIC_SQ_CTRL_QUEUE_INFO_SCTP_MASK 0x1 81#define HINIC_SQ_CTRL_QUEUE_INFO_UC_MASK 0x1 82#define HINIC_SQ_CTRL_QUEUE_INFO_PRI_MASK 0x7 83 84#define HINIC_SQ_CTRL_SET(val, member) \ 85 (((u32)(val) & HINIC_SQ_CTRL_##member##_MASK) \ 86 << HINIC_SQ_CTRL_##member##_SHIFT) 87 88#define HINIC_SQ_CTRL_GET(val, member) \ 89 (((val) >> HINIC_SQ_CTRL_##member##_SHIFT) \ 90 & HINIC_SQ_CTRL_##member##_MASK) 91 92#define HINIC_SQ_CTRL_CLEAR(val, member) \ 93 ((u32)(val) & (~(HINIC_SQ_CTRL_##member##_MASK \ 94 << HINIC_SQ_CTRL_##member##_SHIFT))) 95 96#define HINIC_SQ_TASK_INFO0_L2HDR_LEN_SHIFT 0 97#define HINIC_SQ_TASK_INFO0_L4_OFFLOAD_SHIFT 8 98#define HINIC_SQ_TASK_INFO0_INNER_L3TYPE_SHIFT 10 99#define HINIC_SQ_TASK_INFO0_VLAN_OFFLOAD_SHIFT 12 100#define HINIC_SQ_TASK_INFO0_PARSE_FLAG_SHIFT 13 101/* 1 bit reserved */ 102#define HINIC_SQ_TASK_INFO0_TSO_FLAG_SHIFT 15 103#define HINIC_SQ_TASK_INFO0_VLAN_TAG_SHIFT 16 104 105#define HINIC_SQ_TASK_INFO0_L2HDR_LEN_MASK 0xFF 106#define HINIC_SQ_TASK_INFO0_L4_OFFLOAD_MASK 0x3 107#define HINIC_SQ_TASK_INFO0_INNER_L3TYPE_MASK 0x3 108#define HINIC_SQ_TASK_INFO0_VLAN_OFFLOAD_MASK 0x1 109#define HINIC_SQ_TASK_INFO0_PARSE_FLAG_MASK 0x1 110/* 1 bit reserved */ 111#define HINIC_SQ_TASK_INFO0_TSO_FLAG_MASK 0x1 112#define HINIC_SQ_TASK_INFO0_VLAN_TAG_MASK 0xFFFF 113 114#define HINIC_SQ_TASK_INFO0_SET(val, member) \ 115 (((u32)(val) & HINIC_SQ_TASK_INFO0_##member##_MASK) << \ 116 HINIC_SQ_TASK_INFO0_##member##_SHIFT) 117 118/* 8 bits reserved */ 119#define HINIC_SQ_TASK_INFO1_MEDIA_TYPE_SHIFT 8 120#define HINIC_SQ_TASK_INFO1_INNER_L4LEN_SHIFT 16 121#define HINIC_SQ_TASK_INFO1_INNER_L3LEN_SHIFT 24 122 123/* 8 bits reserved */ 124#define HINIC_SQ_TASK_INFO1_MEDIA_TYPE_MASK 0xFF 125#define HINIC_SQ_TASK_INFO1_INNER_L4LEN_MASK 0xFF 126#define HINIC_SQ_TASK_INFO1_INNER_L3LEN_MASK 0xFF 127 128#define HINIC_SQ_TASK_INFO1_SET(val, member) \ 129 (((u32)(val) & HINIC_SQ_TASK_INFO1_##member##_MASK) << \ 130 HINIC_SQ_TASK_INFO1_##member##_SHIFT) 131 132#define HINIC_SQ_TASK_INFO2_TUNNEL_L4LEN_SHIFT 0 133#define HINIC_SQ_TASK_INFO2_OUTER_L3LEN_SHIFT 8 134#define HINIC_SQ_TASK_INFO2_TUNNEL_L4TYPE_SHIFT 16 135/* 1 bit reserved */ 136#define HINIC_SQ_TASK_INFO2_OUTER_L3TYPE_SHIFT 24 137/* 8 bits reserved */ 138 139#define HINIC_SQ_TASK_INFO2_TUNNEL_L4LEN_MASK 0xFF 140#define HINIC_SQ_TASK_INFO2_OUTER_L3LEN_MASK 0xFF 141#define HINIC_SQ_TASK_INFO2_TUNNEL_L4TYPE_MASK 0x7 142/* 1 bit reserved */ 143#define HINIC_SQ_TASK_INFO2_OUTER_L3TYPE_MASK 0x3 144/* 8 bits reserved */ 145 146#define HINIC_SQ_TASK_INFO2_SET(val, member) \ 147 (((u32)(val) & HINIC_SQ_TASK_INFO2_##member##_MASK) << \ 148 HINIC_SQ_TASK_INFO2_##member##_SHIFT) 149 150/* 31 bits reserved */ 151#define HINIC_SQ_TASK_INFO4_L2TYPE_SHIFT 31 152 153/* 31 bits reserved */ 154#define HINIC_SQ_TASK_INFO4_L2TYPE_MASK 0x1 155 156#define HINIC_SQ_TASK_INFO4_SET(val, member) \ 157 (((u32)(val) & HINIC_SQ_TASK_INFO4_##member##_MASK) << \ 158 HINIC_SQ_TASK_INFO4_##member##_SHIFT) 159 160#define HINIC_RQ_CQE_STATUS_RXDONE_SHIFT 31 161 162#define HINIC_RQ_CQE_STATUS_RXDONE_MASK 0x1 163 164#define HINIC_RQ_CQE_STATUS_CSUM_ERR_SHIFT 0 165 166#define HINIC_RQ_CQE_STATUS_CSUM_ERR_MASK 0xFFFFU 167 168#define HINIC_RQ_CQE_STATUS_GET(val, member) \ 169 (((val) >> HINIC_RQ_CQE_STATUS_##member##_SHIFT) & \ 170 HINIC_RQ_CQE_STATUS_##member##_MASK) 171 172#define HINIC_RQ_CQE_STATUS_CLEAR(val, member) \ 173 ((val) & (~(HINIC_RQ_CQE_STATUS_##member##_MASK << \ 174 HINIC_RQ_CQE_STATUS_##member##_SHIFT))) 175 176#define HINIC_RQ_CQE_SGE_LEN_SHIFT 16 177 178#define HINIC_RQ_CQE_SGE_LEN_MASK 0xFFFF 179 180#define HINIC_RQ_CQE_SGE_GET(val, member) \ 181 (((val) >> HINIC_RQ_CQE_SGE_##member##_SHIFT) & \ 182 HINIC_RQ_CQE_SGE_##member##_MASK) 183 184#define HINIC_RQ_CTRL_BUFDESC_SECT_LEN_SHIFT 0 185#define HINIC_RQ_CTRL_COMPLETE_FORMAT_SHIFT 15 186#define HINIC_RQ_CTRL_COMPLETE_LEN_SHIFT 27 187#define HINIC_RQ_CTRL_LEN_SHIFT 29 188 189#define HINIC_RQ_CTRL_BUFDESC_SECT_LEN_MASK 0xFF 190#define HINIC_RQ_CTRL_COMPLETE_FORMAT_MASK 0x1 191#define HINIC_RQ_CTRL_COMPLETE_LEN_MASK 0x3 192#define HINIC_RQ_CTRL_LEN_MASK 0x3 193 194#define HINIC_RQ_CTRL_SET(val, member) \ 195 (((u32)(val) & HINIC_RQ_CTRL_##member##_MASK) << \ 196 HINIC_RQ_CTRL_##member##_SHIFT) 197 198#define HINIC_SQ_WQE_SIZE(nr_sges) \ 199 (sizeof(struct hinic_sq_ctrl) + \ 200 sizeof(struct hinic_sq_task) + \ 201 (nr_sges) * sizeof(struct hinic_sq_bufdesc)) 202 203#define HINIC_SCMD_DATA_LEN 16 204 205#define HINIC_MAX_SQ_BUFDESCS 17 206 207#define HINIC_SQ_WQE_MAX_SIZE 320 208#define HINIC_RQ_WQE_SIZE 32 209 210#define HINIC_MSS_DEFAULT 0x3E00 211#define HINIC_MSS_MIN 0x50 212 213#define RQ_CQE_STATUS_NUM_LRO_SHIFT 16 214#define RQ_CQE_STATUS_NUM_LRO_MASK 0xFFU 215 216#define RQ_CQE_STATUS_GET(val, member) (((val) >> \ 217 RQ_CQE_STATUS_##member##_SHIFT) & \ 218 RQ_CQE_STATUS_##member##_MASK) 219 220#define HINIC_GET_RX_NUM_LRO(status) \ 221 RQ_CQE_STATUS_GET(status, NUM_LRO) 222 223#define RQ_CQE_OFFOLAD_TYPE_PKT_TYPE_SHIFT 0 224#define RQ_CQE_OFFOLAD_TYPE_PKT_TYPE_MASK 0xFFFU 225#define RQ_CQE_OFFOLAD_TYPE_VLAN_EN_SHIFT 21 226#define RQ_CQE_OFFOLAD_TYPE_VLAN_EN_MASK 0x1U 227 228#define RQ_CQE_OFFOLAD_TYPE_GET(val, member) (((val) >> \ 229 RQ_CQE_OFFOLAD_TYPE_##member##_SHIFT) & \ 230 RQ_CQE_OFFOLAD_TYPE_##member##_MASK) 231 232#define HINIC_GET_RX_PKT_TYPE(offload_type) \ 233 RQ_CQE_OFFOLAD_TYPE_GET(offload_type, PKT_TYPE) 234 235#define HINIC_GET_RX_VLAN_OFFLOAD_EN(offload_type) \ 236 RQ_CQE_OFFOLAD_TYPE_GET(offload_type, VLAN_EN) 237 238#define RQ_CQE_SGE_VLAN_MASK 0xFFFFU 239#define RQ_CQE_SGE_VLAN_SHIFT 0 240 241#define RQ_CQE_SGE_GET(val, member) (((val) >> \ 242 RQ_CQE_SGE_##member##_SHIFT) & \ 243 RQ_CQE_SGE_##member##_MASK) 244 245#define HINIC_GET_RX_VLAN_TAG(vlan_len) \ 246 RQ_CQE_SGE_GET(vlan_len, VLAN) 247 248#define HINIC_RSS_TYPE_VALID_SHIFT 23 249#define HINIC_RSS_TYPE_TCP_IPV6_EXT_SHIFT 24 250#define HINIC_RSS_TYPE_IPV6_EXT_SHIFT 25 251#define HINIC_RSS_TYPE_TCP_IPV6_SHIFT 26 252#define HINIC_RSS_TYPE_IPV6_SHIFT 27 253#define HINIC_RSS_TYPE_TCP_IPV4_SHIFT 28 254#define HINIC_RSS_TYPE_IPV4_SHIFT 29 255#define HINIC_RSS_TYPE_UDP_IPV6_SHIFT 30 256#define HINIC_RSS_TYPE_UDP_IPV4_SHIFT 31 257 258#define HINIC_RSS_TYPE_SET(val, member) \ 259 (((u32)(val) & 0x1) << HINIC_RSS_TYPE_##member##_SHIFT) 260 261#define HINIC_RSS_TYPE_GET(val, member) \ 262 (((u32)(val) >> HINIC_RSS_TYPE_##member##_SHIFT) & 0x1) 263 264enum hinic_l4offload_type { 265 HINIC_L4_OFF_DISABLE = 0, 266 HINIC_TCP_OFFLOAD_ENABLE = 1, 267 HINIC_SCTP_OFFLOAD_ENABLE = 2, 268 HINIC_UDP_OFFLOAD_ENABLE = 3, 269}; 270 271enum hinic_vlan_offload { 272 HINIC_VLAN_OFF_DISABLE = 0, 273 HINIC_VLAN_OFF_ENABLE = 1, 274}; 275 276enum hinic_pkt_parsed { 277 HINIC_PKT_NOT_PARSED = 0, 278 HINIC_PKT_PARSED = 1, 279}; 280 281enum hinic_l3_offload_type { 282 L3TYPE_UNKNOWN = 0, 283 IPV6_PKT = 1, 284 IPV4_PKT_NO_CHKSUM_OFFLOAD = 2, 285 IPV4_PKT_WITH_CHKSUM_OFFLOAD = 3, 286}; 287 288enum hinic_l4_offload_type { 289 OFFLOAD_DISABLE = 0, 290 TCP_OFFLOAD_ENABLE = 1, 291 SCTP_OFFLOAD_ENABLE = 2, 292 UDP_OFFLOAD_ENABLE = 3, 293}; 294 295enum hinic_l4_tunnel_type { 296 NOT_TUNNEL, 297 TUNNEL_UDP_NO_CSUM, 298 TUNNEL_UDP_CSUM, 299}; 300 301enum hinic_outer_l3type { 302 HINIC_OUTER_L3TYPE_UNKNOWN = 0, 303 HINIC_OUTER_L3TYPE_IPV6 = 1, 304 HINIC_OUTER_L3TYPE_IPV4_NO_CHKSUM = 2, 305 HINIC_OUTER_L3TYPE_IPV4_CHKSUM = 3, 306}; 307 308enum hinic_media_type { 309 HINIC_MEDIA_UNKNOWN = 0, 310}; 311 312enum hinic_l2type { 313 HINIC_L2TYPE_ETH = 0, 314}; 315 316enum hinc_tunnel_l4type { 317 HINIC_TUNNEL_L4TYPE_UNKNOWN = 0, 318}; 319 320struct hinic_cmdq_header { 321 u32 header_info; 322 u32 saved_data; 323}; 324 325struct hinic_status { 326 u32 status_info; 327}; 328 329struct hinic_ctrl { 330 u32 ctrl_info; 331}; 332 333struct hinic_sge_resp { 334 struct hinic_sge sge; 335 u32 rsvd; 336}; 337 338struct hinic_cmdq_completion { 339 /* HW Format */ 340 union { 341 struct hinic_sge_resp sge_resp; 342 u64 direct_resp; 343 }; 344}; 345 346struct hinic_scmd_bufdesc { 347 u32 buf_len; 348 u32 rsvd; 349 u8 data[HINIC_SCMD_DATA_LEN]; 350}; 351 352struct hinic_lcmd_bufdesc { 353 struct hinic_sge sge; 354 u32 rsvd1; 355 u64 rsvd2; 356 u64 rsvd3; 357}; 358 359struct hinic_cmdq_wqe_scmd { 360 struct hinic_cmdq_header header; 361 u64 rsvd; 362 struct hinic_status status; 363 struct hinic_ctrl ctrl; 364 struct hinic_cmdq_completion completion; 365 struct hinic_scmd_bufdesc buf_desc; 366}; 367 368struct hinic_cmdq_wqe_lcmd { 369 struct hinic_cmdq_header header; 370 struct hinic_status status; 371 struct hinic_ctrl ctrl; 372 struct hinic_cmdq_completion completion; 373 struct hinic_lcmd_bufdesc buf_desc; 374}; 375 376struct hinic_cmdq_direct_wqe { 377 struct hinic_cmdq_wqe_scmd wqe_scmd; 378}; 379 380struct hinic_cmdq_wqe { 381 /* HW Format */ 382 union { 383 struct hinic_cmdq_direct_wqe direct_wqe; 384 struct hinic_cmdq_wqe_lcmd wqe_lcmd; 385 }; 386}; 387 388struct hinic_sq_ctrl { 389 u32 ctrl_info; 390 u32 queue_info; 391}; 392 393struct hinic_sq_task { 394 u32 pkt_info0; 395 u32 pkt_info1; 396 u32 pkt_info2; 397 u32 ufo_v6_identify; 398 u32 pkt_info4; 399 u32 zero_pad; 400}; 401 402struct hinic_sq_bufdesc { 403 struct hinic_sge sge; 404 u32 rsvd; 405}; 406 407struct hinic_sq_wqe { 408 struct hinic_sq_ctrl ctrl; 409 struct hinic_sq_task task; 410 struct hinic_sq_bufdesc buf_descs[HINIC_MAX_SQ_BUFDESCS]; 411}; 412 413struct hinic_rq_cqe { 414 u32 status; 415 u32 len; 416 417 u32 offload_type; 418 u32 rsvd3; 419 u32 rsvd4; 420 u32 rsvd5; 421 u32 rsvd6; 422 u32 rsvd7; 423}; 424 425struct hinic_rq_ctrl { 426 u32 ctrl_info; 427}; 428 429struct hinic_rq_cqe_sect { 430 struct hinic_sge sge; 431 u32 rsvd; 432}; 433 434struct hinic_rq_bufdesc { 435 u32 hi_addr; 436 u32 lo_addr; 437}; 438 439struct hinic_rq_wqe { 440 struct hinic_rq_ctrl ctrl; 441 u32 rsvd; 442 struct hinic_rq_cqe_sect cqe_sect; 443 struct hinic_rq_bufdesc buf_desc; 444}; 445 446struct hinic_hw_wqe { 447 /* HW Format */ 448 union { 449 struct hinic_cmdq_wqe cmdq_wqe; 450 struct hinic_sq_wqe sq_wqe; 451 struct hinic_rq_wqe rq_wqe; 452 }; 453}; 454 455#endif