linux/drivers/net/ethernet/huawei/hinic/hinic_hw_wqe.h
<<
>>
Prefs
   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
 197enum 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
 204enum hinic_vlan_offload {
 205        HINIC_VLAN_OFF_DISABLE = 0,
 206        HINIC_VLAN_OFF_ENABLE  = 1,
 207};
 208
 209enum hinic_pkt_parsed {
 210        HINIC_PKT_NOT_PARSED = 0,
 211        HINIC_PKT_PARSED     = 1,
 212};
 213
 214enum 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
 221enum hinic_media_type {
 222        HINIC_MEDIA_UNKNOWN = 0,
 223};
 224
 225enum hinic_l2type {
 226        HINIC_L2TYPE_ETH = 0,
 227};
 228
 229enum hinc_tunnel_l4type {
 230        HINIC_TUNNEL_L4TYPE_UNKNOWN = 0,
 231};
 232
 233struct hinic_cmdq_header {
 234        u32     header_info;
 235        u32     saved_data;
 236};
 237
 238struct hinic_status {
 239        u32 status_info;
 240};
 241
 242struct hinic_ctrl {
 243        u32 ctrl_info;
 244};
 245
 246struct hinic_sge_resp {
 247        struct hinic_sge        sge;
 248        u32                     rsvd;
 249};
 250
 251struct hinic_cmdq_completion {
 252        /* HW Format */
 253        union {
 254                struct hinic_sge_resp   sge_resp;
 255                u64                     direct_resp;
 256        };
 257};
 258
 259struct hinic_scmd_bufdesc {
 260        u32     buf_len;
 261        u32     rsvd;
 262        u8      data[HINIC_SCMD_DATA_LEN];
 263};
 264
 265struct hinic_lcmd_bufdesc {
 266        struct hinic_sge        sge;
 267        u32                     rsvd1;
 268        u64                     rsvd2;
 269        u64                     rsvd3;
 270};
 271
 272struct 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
 281struct 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
 289struct hinic_cmdq_direct_wqe {
 290        struct hinic_cmdq_wqe_scmd      wqe_scmd;
 291};
 292
 293struct 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
 301struct hinic_sq_ctrl {
 302        u32     ctrl_info;
 303        u32     queue_info;
 304};
 305
 306struct 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
 315struct hinic_sq_bufdesc {
 316        struct hinic_sge sge;
 317        u32     rsvd;
 318};
 319
 320struct 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
 326struct 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
 338struct hinic_rq_ctrl {
 339        u32     ctrl_info;
 340};
 341
 342struct hinic_rq_cqe_sect {
 343        struct hinic_sge        sge;
 344        u32                     rsvd;
 345};
 346
 347struct hinic_rq_bufdesc {
 348        u32     hi_addr;
 349        u32     lo_addr;
 350};
 351
 352struct 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
 359struct 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