1 /* 2 * Huawei HiNIC PCI Express Linux driver 3 * Copyright(c) 2017 Huawei Technologies Co., Ltd 4 * 5 * This program is free software; you can redistribute it and/or modify it 6 * under the terms and conditions of the GNU General Public License, 7 * version 2, as published by the Free Software Foundation. 8 * 9 * This program is distributed in the hope it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * for more details. 13 * 14 */ 15 16 #ifndef HINIC_HW_WQE_H 17 #define HINIC_HW_WQE_H 18 19 #include "hinic_common.h" 20 21 #define HINIC_CMDQ_CTRL_PI_SHIFT 0 22 #define HINIC_CMDQ_CTRL_CMD_SHIFT 16 23 #define HINIC_CMDQ_CTRL_MOD_SHIFT 24 24 #define HINIC_CMDQ_CTRL_ACK_TYPE_SHIFT 29 25 #define HINIC_CMDQ_CTRL_HW_BUSY_BIT_SHIFT 31 26 27 #define HINIC_CMDQ_CTRL_PI_MASK 0xFFFF 28 #define HINIC_CMDQ_CTRL_CMD_MASK 0xFF 29 #define HINIC_CMDQ_CTRL_MOD_MASK 0x1F 30 #define HINIC_CMDQ_CTRL_ACK_TYPE_MASK 0x3 31 #define HINIC_CMDQ_CTRL_HW_BUSY_BIT_MASK 0x1 32 33 #define HINIC_CMDQ_CTRL_SET(val, member) \ 34 (((u32)(val) & HINIC_CMDQ_CTRL_##member##_MASK) \ 35 << HINIC_CMDQ_CTRL_##member##_SHIFT) 36 37 #define HINIC_CMDQ_CTRL_GET(val, member) \ 38 (((val) >> HINIC_CMDQ_CTRL_##member##_SHIFT) \ 39 & HINIC_CMDQ_CTRL_##member##_MASK) 40 41 #define HINIC_CMDQ_WQE_HEADER_BUFDESC_LEN_SHIFT 0 42 #define HINIC_CMDQ_WQE_HEADER_COMPLETE_FMT_SHIFT 15 43 #define HINIC_CMDQ_WQE_HEADER_DATA_FMT_SHIFT 22 44 #define HINIC_CMDQ_WQE_HEADER_COMPLETE_REQ_SHIFT 23 45 #define HINIC_CMDQ_WQE_HEADER_COMPLETE_SECT_LEN_SHIFT 27 46 #define HINIC_CMDQ_WQE_HEADER_CTRL_LEN_SHIFT 29 47 #define HINIC_CMDQ_WQE_HEADER_TOGGLED_WRAPPED_SHIFT 31 48 49 #define HINIC_CMDQ_WQE_HEADER_BUFDESC_LEN_MASK 0xFF 50 #define HINIC_CMDQ_WQE_HEADER_COMPLETE_FMT_MASK 0x1 51 #define HINIC_CMDQ_WQE_HEADER_DATA_FMT_MASK 0x1 52 #define HINIC_CMDQ_WQE_HEADER_COMPLETE_REQ_MASK 0x1 53 #define HINIC_CMDQ_WQE_HEADER_COMPLETE_SECT_LEN_MASK 0x3 54 #define HINIC_CMDQ_WQE_HEADER_CTRL_LEN_MASK 0x3 55 #define HINIC_CMDQ_WQE_HEADER_TOGGLED_WRAPPED_MASK 0x1 56 57 #define HINIC_CMDQ_WQE_HEADER_SET(val, member) \ 58 (((u32)(val) & HINIC_CMDQ_WQE_HEADER_##member##_MASK) \ 59 << HINIC_CMDQ_WQE_HEADER_##member##_SHIFT) 60 61 #define HINIC_CMDQ_WQE_HEADER_GET(val, member) \ 62 (((val) >> HINIC_CMDQ_WQE_HEADER_##member##_SHIFT) \ 63 & HINIC_CMDQ_WQE_HEADER_##member##_MASK) 64 65 #define HINIC_SQ_CTRL_BUFDESC_SECT_LEN_SHIFT 0 66 #define HINIC_SQ_CTRL_TASKSECT_LEN_SHIFT 16 67 #define HINIC_SQ_CTRL_DATA_FORMAT_SHIFT 22 68 #define HINIC_SQ_CTRL_LEN_SHIFT 29 69 70 #define HINIC_SQ_CTRL_BUFDESC_SECT_LEN_MASK 0xFF 71 #define HINIC_SQ_CTRL_TASKSECT_LEN_MASK 0x1F 72 #define HINIC_SQ_CTRL_DATA_FORMAT_MASK 0x1 73 #define HINIC_SQ_CTRL_LEN_MASK 0x3 74 75 #define HINIC_SQ_CTRL_QUEUE_INFO_MSS_SHIFT 13 76 77 #define HINIC_SQ_CTRL_QUEUE_INFO_MSS_MASK 0x3FFF 78 79 #define HINIC_SQ_CTRL_SET(val, member) \ 80 (((u32)(val) & HINIC_SQ_CTRL_##member##_MASK) \ 81 << HINIC_SQ_CTRL_##member##_SHIFT) 82 83 #define HINIC_SQ_CTRL_GET(val, member) \ 84 (((val) >> HINIC_SQ_CTRL_##member##_SHIFT) \ 85 & HINIC_SQ_CTRL_##member##_MASK) 86 87 #define HINIC_SQ_TASK_INFO0_L2HDR_LEN_SHIFT 0 88 #define HINIC_SQ_TASK_INFO0_L4_OFFLOAD_SHIFT 8 89 #define HINIC_SQ_TASK_INFO0_INNER_L3TYPE_SHIFT 10 90 #define HINIC_SQ_TASK_INFO0_VLAN_OFFLOAD_SHIFT 12 91 #define HINIC_SQ_TASK_INFO0_PARSE_FLAG_SHIFT 13 92 /* 1 bit reserved */ 93 #define HINIC_SQ_TASK_INFO0_TSO_FLAG_SHIFT 15 94 #define HINIC_SQ_TASK_INFO0_VLAN_TAG_SHIFT 16 95 96 #define HINIC_SQ_TASK_INFO0_L2HDR_LEN_MASK 0xFF 97 #define HINIC_SQ_TASK_INFO0_L4_OFFLOAD_MASK 0x3 98 #define HINIC_SQ_TASK_INFO0_INNER_L3TYPE_MASK 0x3 99 #define HINIC_SQ_TASK_INFO0_VLAN_OFFLOAD_MASK 0x1 100 #define HINIC_SQ_TASK_INFO0_PARSE_FLAG_MASK 0x1 101 /* 1 bit reserved */ 102 #define HINIC_SQ_TASK_INFO0_TSO_FLAG_MASK 0x1 103 #define HINIC_SQ_TASK_INFO0_VLAN_TAG_MASK 0xFFFF 104 105 #define HINIC_SQ_TASK_INFO0_SET(val, member) \ 106 (((u32)(val) & HINIC_SQ_TASK_INFO0_##member##_MASK) << \ 107 HINIC_SQ_TASK_INFO0_##member##_SHIFT) 108 109 /* 8 bits reserved */ 110 #define HINIC_SQ_TASK_INFO1_MEDIA_TYPE_SHIFT 8 111 #define HINIC_SQ_TASK_INFO1_INNER_L4_LEN_SHIFT 16 112 #define HINIC_SQ_TASK_INFO1_INNER_L3_LEN_SHIFT 24 113 114 /* 8 bits reserved */ 115 #define HINIC_SQ_TASK_INFO1_MEDIA_TYPE_MASK 0xFF 116 #define HINIC_SQ_TASK_INFO1_INNER_L4_LEN_MASK 0xFF 117 #define HINIC_SQ_TASK_INFO1_INNER_L3_LEN_MASK 0xFF 118 119 #define HINIC_SQ_TASK_INFO1_SET(val, member) \ 120 (((u32)(val) & HINIC_SQ_TASK_INFO1_##member##_MASK) << \ 121 HINIC_SQ_TASK_INFO1_##member##_SHIFT) 122 123 #define HINIC_SQ_TASK_INFO2_TUNNEL_L4_LEN_SHIFT 0 124 #define HINIC_SQ_TASK_INFO2_OUTER_L3_LEN_SHIFT 12 125 #define HINIC_SQ_TASK_INFO2_TUNNEL_L4TYPE_SHIFT 19 126 /* 1 bit reserved */ 127 #define HINIC_SQ_TASK_INFO2_OUTER_L3TYPE_SHIFT 22 128 /* 8 bits reserved */ 129 130 #define HINIC_SQ_TASK_INFO2_TUNNEL_L4_LEN_MASK 0xFFF 131 #define HINIC_SQ_TASK_INFO2_OUTER_L3_LEN_MASK 0x7F 132 #define HINIC_SQ_TASK_INFO2_TUNNEL_L4TYPE_MASK 0x3 133 /* 1 bit reserved */ 134 #define HINIC_SQ_TASK_INFO2_OUTER_L3TYPE_MASK 0x3 135 /* 8 bits reserved */ 136 137 #define HINIC_SQ_TASK_INFO2_SET(val, member) \ 138 (((u32)(val) & HINIC_SQ_TASK_INFO2_##member##_MASK) << \ 139 HINIC_SQ_TASK_INFO2_##member##_SHIFT) 140 141 /* 31 bits reserved */ 142 #define HINIC_SQ_TASK_INFO4_L2TYPE_SHIFT 31 143 144 /* 31 bits reserved */ 145 #define HINIC_SQ_TASK_INFO4_L2TYPE_MASK 0x1 146 147 #define HINIC_SQ_TASK_INFO4_SET(val, member) \ 148 (((u32)(val) & HINIC_SQ_TASK_INFO4_##member##_MASK) << \ 149 HINIC_SQ_TASK_INFO4_##member##_SHIFT) 150 151 #define HINIC_RQ_CQE_STATUS_RXDONE_SHIFT 31 152 153 #define HINIC_RQ_CQE_STATUS_RXDONE_MASK 0x1 154 155 #define HINIC_RQ_CQE_STATUS_GET(val, member) \ 156 (((val) >> HINIC_RQ_CQE_STATUS_##member##_SHIFT) & \ 157 HINIC_RQ_CQE_STATUS_##member##_MASK) 158 159 #define HINIC_RQ_CQE_STATUS_CLEAR(val, member) \ 160 ((val) & (~(HINIC_RQ_CQE_STATUS_##member##_MASK << \ 161 HINIC_RQ_CQE_STATUS_##member##_SHIFT))) 162 163 #define HINIC_RQ_CQE_SGE_LEN_SHIFT 16 164 165 #define HINIC_RQ_CQE_SGE_LEN_MASK 0xFFFF 166 167 #define HINIC_RQ_CQE_SGE_GET(val, member) \ 168 (((val) >> HINIC_RQ_CQE_SGE_##member##_SHIFT) & \ 169 HINIC_RQ_CQE_SGE_##member##_MASK) 170 171 #define HINIC_RQ_CTRL_BUFDESC_SECT_LEN_SHIFT 0 172 #define HINIC_RQ_CTRL_COMPLETE_FORMAT_SHIFT 15 173 #define HINIC_RQ_CTRL_COMPLETE_LEN_SHIFT 27 174 #define HINIC_RQ_CTRL_LEN_SHIFT 29 175 176 #define HINIC_RQ_CTRL_BUFDESC_SECT_LEN_MASK 0xFF 177 #define HINIC_RQ_CTRL_COMPLETE_FORMAT_MASK 0x1 178 #define HINIC_RQ_CTRL_COMPLETE_LEN_MASK 0x3 179 #define HINIC_RQ_CTRL_LEN_MASK 0x3 180 181 #define HINIC_RQ_CTRL_SET(val, member) \ 182 (((u32)(val) & HINIC_RQ_CTRL_##member##_MASK) << \ 183 HINIC_RQ_CTRL_##member##_SHIFT) 184 185 #define HINIC_SQ_WQE_SIZE(nr_sges) \ 186 (sizeof(struct hinic_sq_ctrl) + \ 187 sizeof(struct hinic_sq_task) + \ 188 (nr_sges) * sizeof(struct hinic_sq_bufdesc)) 189 190 #define HINIC_SCMD_DATA_LEN 16 191 192 #define HINIC_MAX_SQ_BUFDESCS 17 193 194 #define HINIC_SQ_WQE_MAX_SIZE 320 195 #define HINIC_RQ_WQE_SIZE 32 196 197 enum hinic_l4offload_type { 198 HINIC_L4_OFF_DISABLE = 0, 199 HINIC_TCP_OFFLOAD_ENABLE = 1, 200 HINIC_SCTP_OFFLOAD_ENABLE = 2, 201 HINIC_UDP_OFFLOAD_ENABLE = 3, 202 }; 203 204 enum hinic_vlan_offload { 205 HINIC_VLAN_OFF_DISABLE = 0, 206 HINIC_VLAN_OFF_ENABLE = 1, 207 }; 208 209 enum hinic_pkt_parsed { 210 HINIC_PKT_NOT_PARSED = 0, 211 HINIC_PKT_PARSED = 1, 212 }; 213 214 enum hinic_outer_l3type { 215 HINIC_OUTER_L3TYPE_UNKNOWN = 0, 216 HINIC_OUTER_L3TYPE_IPV6 = 1, 217 HINIC_OUTER_L3TYPE_IPV4_NO_CHKSUM = 2, 218 HINIC_OUTER_L3TYPE_IPV4_CHKSUM = 3, 219 }; 220 221 enum hinic_media_type { 222 HINIC_MEDIA_UNKNOWN = 0, 223 }; 224 225 enum hinic_l2type { 226 HINIC_L2TYPE_ETH = 0, 227 }; 228 229 enum hinc_tunnel_l4type { 230 HINIC_TUNNEL_L4TYPE_UNKNOWN = 0, 231 }; 232 233 struct hinic_cmdq_header { 234 u32 header_info; 235 u32 saved_data; 236 }; 237 238 struct hinic_status { 239 u32 status_info; 240 }; 241 242 struct hinic_ctrl { 243 u32 ctrl_info; 244 }; 245 246 struct hinic_sge_resp { 247 struct hinic_sge sge; 248 u32 rsvd; 249 }; 250 251 struct hinic_cmdq_completion { 252 /* HW Format */ 253 union { 254 struct hinic_sge_resp sge_resp; 255 u64 direct_resp; 256 }; 257 }; 258 259 struct hinic_scmd_bufdesc { 260 u32 buf_len; 261 u32 rsvd; 262 u8 data[HINIC_SCMD_DATA_LEN]; 263 }; 264 265 struct hinic_lcmd_bufdesc { 266 struct hinic_sge sge; 267 u32 rsvd1; 268 u64 rsvd2; 269 u64 rsvd3; 270 }; 271 272 struct hinic_cmdq_wqe_scmd { 273 struct hinic_cmdq_header header; 274 u64 rsvd; 275 struct hinic_status status; 276 struct hinic_ctrl ctrl; 277 struct hinic_cmdq_completion completion; 278 struct hinic_scmd_bufdesc buf_desc; 279 }; 280 281 struct hinic_cmdq_wqe_lcmd { 282 struct hinic_cmdq_header header; 283 struct hinic_status status; 284 struct hinic_ctrl ctrl; 285 struct hinic_cmdq_completion completion; 286 struct hinic_lcmd_bufdesc buf_desc; 287 }; 288 289 struct hinic_cmdq_direct_wqe { 290 struct hinic_cmdq_wqe_scmd wqe_scmd; 291 }; 292 293 struct hinic_cmdq_wqe { 294 /* HW Format */ 295 union { 296 struct hinic_cmdq_direct_wqe direct_wqe; 297 struct hinic_cmdq_wqe_lcmd wqe_lcmd; 298 }; 299 }; 300 301 struct hinic_sq_ctrl { 302 u32 ctrl_info; 303 u32 queue_info; 304 }; 305 306 struct hinic_sq_task { 307 u32 pkt_info0; 308 u32 pkt_info1; 309 u32 pkt_info2; 310 u32 ufo_v6_identify; 311 u32 pkt_info4; 312 u32 zero_pad; 313 }; 314 315 struct hinic_sq_bufdesc { 316 struct hinic_sge sge; 317 u32 rsvd; 318 }; 319 320 struct hinic_sq_wqe { 321 struct hinic_sq_ctrl ctrl; 322 struct hinic_sq_task task; 323 struct hinic_sq_bufdesc buf_descs[HINIC_MAX_SQ_BUFDESCS]; 324 }; 325 326 struct hinic_rq_cqe { 327 u32 status; 328 u32 len; 329 330 u32 rsvd2; 331 u32 rsvd3; 332 u32 rsvd4; 333 u32 rsvd5; 334 u32 rsvd6; 335 u32 rsvd7; 336 }; 337 338 struct hinic_rq_ctrl { 339 u32 ctrl_info; 340 }; 341 342 struct hinic_rq_cqe_sect { 343 struct hinic_sge sge; 344 u32 rsvd; 345 }; 346 347 struct hinic_rq_bufdesc { 348 u32 hi_addr; 349 u32 lo_addr; 350 }; 351 352 struct hinic_rq_wqe { 353 struct hinic_rq_ctrl ctrl; 354 u32 rsvd; 355 struct hinic_rq_cqe_sect cqe_sect; 356 struct hinic_rq_bufdesc buf_desc; 357 }; 358 359 struct hinic_hw_wqe { 360 /* HW Format */ 361 union { 362 struct hinic_cmdq_wqe cmdq_wqe; 363 struct hinic_sq_wqe sq_wqe; 364 struct hinic_rq_wqe rq_wqe; 365 }; 366 }; 367 368 #endif 369