0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033 #ifndef MLX4_QP_H
0034 #define MLX4_QP_H
0035
0036 #include <linux/types.h>
0037 #include <linux/if_ether.h>
0038
0039 #include <linux/mlx4/device.h>
0040
0041 #define MLX4_INVALID_LKEY 0x100
0042
0043 enum mlx4_qp_optpar {
0044 MLX4_QP_OPTPAR_ALT_ADDR_PATH = 1 << 0,
0045 MLX4_QP_OPTPAR_RRE = 1 << 1,
0046 MLX4_QP_OPTPAR_RAE = 1 << 2,
0047 MLX4_QP_OPTPAR_RWE = 1 << 3,
0048 MLX4_QP_OPTPAR_PKEY_INDEX = 1 << 4,
0049 MLX4_QP_OPTPAR_Q_KEY = 1 << 5,
0050 MLX4_QP_OPTPAR_RNR_TIMEOUT = 1 << 6,
0051 MLX4_QP_OPTPAR_PRIMARY_ADDR_PATH = 1 << 7,
0052 MLX4_QP_OPTPAR_SRA_MAX = 1 << 8,
0053 MLX4_QP_OPTPAR_RRA_MAX = 1 << 9,
0054 MLX4_QP_OPTPAR_PM_STATE = 1 << 10,
0055 MLX4_QP_OPTPAR_RETRY_COUNT = 1 << 12,
0056 MLX4_QP_OPTPAR_RNR_RETRY = 1 << 13,
0057 MLX4_QP_OPTPAR_ACK_TIMEOUT = 1 << 14,
0058 MLX4_QP_OPTPAR_SCHED_QUEUE = 1 << 16,
0059 MLX4_QP_OPTPAR_COUNTER_INDEX = 1 << 20,
0060 MLX4_QP_OPTPAR_VLAN_STRIPPING = 1 << 21,
0061 };
0062
0063 enum mlx4_qp_state {
0064 MLX4_QP_STATE_RST = 0,
0065 MLX4_QP_STATE_INIT = 1,
0066 MLX4_QP_STATE_RTR = 2,
0067 MLX4_QP_STATE_RTS = 3,
0068 MLX4_QP_STATE_SQER = 4,
0069 MLX4_QP_STATE_SQD = 5,
0070 MLX4_QP_STATE_ERR = 6,
0071 MLX4_QP_STATE_SQ_DRAINING = 7,
0072 MLX4_QP_NUM_STATE
0073 };
0074
0075 enum {
0076 MLX4_QP_ST_RC = 0x0,
0077 MLX4_QP_ST_UC = 0x1,
0078 MLX4_QP_ST_RD = 0x2,
0079 MLX4_QP_ST_UD = 0x3,
0080 MLX4_QP_ST_XRC = 0x6,
0081 MLX4_QP_ST_MLX = 0x7
0082 };
0083
0084 enum {
0085 MLX4_QP_PM_MIGRATED = 0x3,
0086 MLX4_QP_PM_ARMED = 0x0,
0087 MLX4_QP_PM_REARM = 0x1
0088 };
0089
0090 enum {
0091
0092 MLX4_QP_BIT_SRE = 1 << 15,
0093 MLX4_QP_BIT_SWE = 1 << 14,
0094 MLX4_QP_BIT_SAE = 1 << 13,
0095
0096 MLX4_QP_BIT_RRE = 1 << 15,
0097 MLX4_QP_BIT_RWE = 1 << 14,
0098 MLX4_QP_BIT_RAE = 1 << 13,
0099 MLX4_QP_BIT_FPP = 1 << 3,
0100 MLX4_QP_BIT_RIC = 1 << 4,
0101 };
0102
0103 enum {
0104 MLX4_RSS_HASH_XOR = 0,
0105 MLX4_RSS_HASH_TOP = 1,
0106
0107 MLX4_RSS_UDP_IPV6 = 1 << 0,
0108 MLX4_RSS_UDP_IPV4 = 1 << 1,
0109 MLX4_RSS_TCP_IPV6 = 1 << 2,
0110 MLX4_RSS_IPV6 = 1 << 3,
0111 MLX4_RSS_TCP_IPV4 = 1 << 4,
0112 MLX4_RSS_IPV4 = 1 << 5,
0113
0114 MLX4_RSS_BY_OUTER_HEADERS = 0 << 6,
0115 MLX4_RSS_BY_INNER_HEADERS = 2 << 6,
0116 MLX4_RSS_BY_INNER_HEADERS_IPONLY = 3 << 6,
0117
0118
0119 MLX4_RSS_OFFSET_IN_QPC_PRI_PATH = 0x24,
0120
0121 MLX4_RSS_QPC_FLAG_OFFSET = 13,
0122 };
0123
0124 #define MLX4_EN_RSS_KEY_SIZE 40
0125
0126 struct mlx4_rss_context {
0127 __be32 base_qpn;
0128 __be32 default_qpn;
0129 u16 reserved;
0130 u8 hash_fn;
0131 u8 flags;
0132 __be32 rss_key[MLX4_EN_RSS_KEY_SIZE / sizeof(__be32)];
0133 __be32 base_qpn_udp;
0134 };
0135
0136 struct mlx4_qp_path {
0137 u8 fl;
0138 union {
0139 u8 vlan_control;
0140 u8 control;
0141 };
0142 u8 disable_pkey_check;
0143 u8 pkey_index;
0144 u8 counter_index;
0145 u8 grh_mylmc;
0146 __be16 rlid;
0147 u8 ackto;
0148 u8 mgid_index;
0149 u8 static_rate;
0150 u8 hop_limit;
0151 __be32 tclass_flowlabel;
0152 u8 rgid[16];
0153 u8 sched_queue;
0154 u8 vlan_index;
0155 u8 feup;
0156 u8 fvl_rx;
0157 u8 reserved4[2];
0158 u8 dmac[ETH_ALEN];
0159 };
0160
0161 enum {
0162 MLX4_FL_CV = 1 << 6,
0163 MLX4_FL_SV = 1 << 5,
0164 MLX4_FL_ETH_HIDE_CQE_VLAN = 1 << 2,
0165 MLX4_FL_ETH_SRC_CHECK_MC_LB = 1 << 1,
0166 MLX4_FL_ETH_SRC_CHECK_UC_LB = 1 << 0,
0167 };
0168
0169 enum {
0170 MLX4_CTRL_ETH_SRC_CHECK_IF_COUNTER = 1 << 7,
0171 };
0172
0173 enum {
0174 MLX4_VLAN_CTRL_ETH_TX_BLOCK_TAGGED = 1 << 6,
0175 MLX4_VLAN_CTRL_ETH_TX_BLOCK_PRIO_TAGGED = 1 << 5,
0176 MLX4_VLAN_CTRL_ETH_TX_BLOCK_UNTAGGED = 1 << 4,
0177 MLX4_VLAN_CTRL_ETH_RX_BLOCK_TAGGED = 1 << 2,
0178 MLX4_VLAN_CTRL_ETH_RX_BLOCK_PRIO_TAGGED = 1 << 1,
0179 MLX4_VLAN_CTRL_ETH_RX_BLOCK_UNTAGGED = 1 << 0
0180 };
0181
0182 enum {
0183 MLX4_FEUP_FORCE_ETH_UP = 1 << 6,
0184 MLX4_FSM_FORCE_ETH_SRC_MAC = 1 << 5,
0185 MLX4_FVL_FORCE_ETH_VLAN = 1 << 3
0186 };
0187
0188 enum {
0189 MLX4_FVL_RX_FORCE_ETH_VLAN = 1 << 0
0190 };
0191
0192 struct mlx4_qp_context {
0193 __be32 flags;
0194 __be32 pd;
0195 u8 mtu_msgmax;
0196 u8 rq_size_stride;
0197 u8 sq_size_stride;
0198 u8 rlkey_roce_mode;
0199 __be32 usr_page;
0200 __be32 local_qpn;
0201 __be32 remote_qpn;
0202 struct mlx4_qp_path pri_path;
0203 struct mlx4_qp_path alt_path;
0204 __be32 params1;
0205 u32 reserved1;
0206 __be32 next_send_psn;
0207 __be32 cqn_send;
0208 __be16 roce_entropy;
0209 __be16 reserved2[3];
0210 __be32 last_acked_psn;
0211 __be32 ssn;
0212 __be32 params2;
0213 __be32 rnr_nextrecvpsn;
0214 __be32 xrcd;
0215 __be32 cqn_recv;
0216 __be64 db_rec_addr;
0217 __be32 qkey;
0218 __be32 srqn;
0219 __be32 msn;
0220 __be16 rq_wqe_counter;
0221 __be16 sq_wqe_counter;
0222 u32 reserved3;
0223 __be16 rate_limit_params;
0224 u8 reserved4;
0225 u8 qos_vport;
0226 __be32 param3;
0227 __be32 nummmcpeers_basemkey;
0228 u8 log_page_size;
0229 u8 reserved5[2];
0230 u8 mtt_base_addr_h;
0231 __be32 mtt_base_addr_l;
0232 u32 reserved6[10];
0233 };
0234
0235 struct mlx4_update_qp_context {
0236 __be64 qp_mask;
0237 __be64 primary_addr_path_mask;
0238 __be64 secondary_addr_path_mask;
0239 u64 reserved1;
0240 struct mlx4_qp_context qp_context;
0241 u64 reserved2[58];
0242 };
0243
0244 enum {
0245 MLX4_UPD_QP_MASK_PM_STATE = 32,
0246 MLX4_UPD_QP_MASK_VSD = 33,
0247 MLX4_UPD_QP_MASK_QOS_VPP = 34,
0248 MLX4_UPD_QP_MASK_RATE_LIMIT = 35,
0249 };
0250
0251 enum {
0252 MLX4_UPD_QP_PATH_MASK_PKEY_INDEX = 0 + 32,
0253 MLX4_UPD_QP_PATH_MASK_FSM = 1 + 32,
0254 MLX4_UPD_QP_PATH_MASK_MAC_INDEX = 2 + 32,
0255 MLX4_UPD_QP_PATH_MASK_FVL = 3 + 32,
0256 MLX4_UPD_QP_PATH_MASK_CV = 4 + 32,
0257 MLX4_UPD_QP_PATH_MASK_VLAN_INDEX = 5 + 32,
0258 MLX4_UPD_QP_PATH_MASK_ETH_HIDE_CQE_VLAN = 6 + 32,
0259 MLX4_UPD_QP_PATH_MASK_ETH_TX_BLOCK_UNTAGGED = 7 + 32,
0260 MLX4_UPD_QP_PATH_MASK_ETH_TX_BLOCK_1P = 8 + 32,
0261 MLX4_UPD_QP_PATH_MASK_ETH_TX_BLOCK_TAGGED = 9 + 32,
0262 MLX4_UPD_QP_PATH_MASK_ETH_RX_BLOCK_UNTAGGED = 10 + 32,
0263 MLX4_UPD_QP_PATH_MASK_ETH_RX_BLOCK_1P = 11 + 32,
0264 MLX4_UPD_QP_PATH_MASK_ETH_RX_BLOCK_TAGGED = 12 + 32,
0265 MLX4_UPD_QP_PATH_MASK_FEUP = 13 + 32,
0266 MLX4_UPD_QP_PATH_MASK_SCHED_QUEUE = 14 + 32,
0267 MLX4_UPD_QP_PATH_MASK_IF_COUNTER_INDEX = 15 + 32,
0268 MLX4_UPD_QP_PATH_MASK_FVL_RX = 16 + 32,
0269 MLX4_UPD_QP_PATH_MASK_ETH_SRC_CHECK_UC_LB = 18 + 32,
0270 MLX4_UPD_QP_PATH_MASK_ETH_SRC_CHECK_MC_LB = 19 + 32,
0271 MLX4_UPD_QP_PATH_MASK_SV = 22 + 32,
0272 };
0273
0274 enum {
0275 MLX4_STRIP_VLAN = 1 << 30
0276 };
0277
0278
0279 #define MLX4_FW_VER_WQE_CTRL_NEC mlx4_fw_ver(2, 2, 232)
0280
0281 enum {
0282 MLX4_WQE_CTRL_NEC = 1 << 29,
0283 MLX4_WQE_CTRL_IIP = 1 << 28,
0284 MLX4_WQE_CTRL_ILP = 1 << 27,
0285 MLX4_WQE_CTRL_FENCE = 1 << 6,
0286 MLX4_WQE_CTRL_CQ_UPDATE = 3 << 2,
0287 MLX4_WQE_CTRL_SOLICITED = 1 << 1,
0288 MLX4_WQE_CTRL_IP_CSUM = 1 << 4,
0289 MLX4_WQE_CTRL_TCP_UDP_CSUM = 1 << 5,
0290 MLX4_WQE_CTRL_INS_CVLAN = 1 << 6,
0291 MLX4_WQE_CTRL_INS_SVLAN = 1 << 7,
0292 MLX4_WQE_CTRL_STRONG_ORDER = 1 << 7,
0293 MLX4_WQE_CTRL_FORCE_LOOPBACK = 1 << 0,
0294 };
0295
0296 union mlx4_wqe_qpn_vlan {
0297 struct {
0298 __be16 vlan_tag;
0299 u8 ins_vlan;
0300 u8 fence_size;
0301 };
0302 __be32 bf_qpn;
0303 };
0304
0305 struct mlx4_wqe_ctrl_seg {
0306 __be32 owner_opcode;
0307 union mlx4_wqe_qpn_vlan qpn_vlan;
0308
0309
0310
0311
0312
0313
0314
0315
0316
0317 union {
0318 __be32 srcrb_flags;
0319 __be16 srcrb_flags16[2];
0320 };
0321
0322
0323
0324
0325
0326 __be32 imm;
0327 };
0328
0329 enum {
0330 MLX4_WQE_MLX_VL15 = 1 << 17,
0331 MLX4_WQE_MLX_SLR = 1 << 16
0332 };
0333
0334 struct mlx4_wqe_mlx_seg {
0335 u8 owner;
0336 u8 reserved1[2];
0337 u8 opcode;
0338 __be16 sched_prio;
0339 u8 reserved2;
0340 u8 size;
0341
0342
0343
0344
0345
0346
0347
0348
0349
0350 __be32 flags;
0351 __be16 rlid;
0352 u16 reserved3;
0353 };
0354
0355 struct mlx4_wqe_datagram_seg {
0356 __be32 av[8];
0357 __be32 dqpn;
0358 __be32 qkey;
0359 __be16 vlan;
0360 u8 mac[ETH_ALEN];
0361 };
0362
0363 struct mlx4_wqe_lso_seg {
0364 __be32 mss_hdr_size;
0365 __be32 header[];
0366 };
0367
0368 enum mlx4_wqe_bind_seg_flags2 {
0369 MLX4_WQE_BIND_ZERO_BASED = (1 << 30),
0370 MLX4_WQE_BIND_TYPE_2 = (1 << 31),
0371 };
0372
0373 struct mlx4_wqe_bind_seg {
0374 __be32 flags1;
0375 __be32 flags2;
0376 __be32 new_rkey;
0377 __be32 lkey;
0378 __be64 addr;
0379 __be64 length;
0380 };
0381
0382 enum {
0383 MLX4_WQE_FMR_PERM_LOCAL_READ = 1 << 27,
0384 MLX4_WQE_FMR_PERM_LOCAL_WRITE = 1 << 28,
0385 MLX4_WQE_FMR_AND_BIND_PERM_REMOTE_READ = 1 << 29,
0386 MLX4_WQE_FMR_AND_BIND_PERM_REMOTE_WRITE = 1 << 30,
0387 MLX4_WQE_FMR_AND_BIND_PERM_ATOMIC = 1 << 31
0388 };
0389
0390 struct mlx4_wqe_fmr_seg {
0391 __be32 flags;
0392 __be32 mem_key;
0393 __be64 buf_list;
0394 __be64 start_addr;
0395 __be64 reg_len;
0396 __be32 offset;
0397 __be32 page_size;
0398 u32 reserved[2];
0399 };
0400
0401 struct mlx4_wqe_fmr_ext_seg {
0402 u8 flags;
0403 u8 reserved;
0404 __be16 app_mask;
0405 __be16 wire_app_tag;
0406 __be16 mem_app_tag;
0407 __be32 wire_ref_tag_base;
0408 __be32 mem_ref_tag_base;
0409 };
0410
0411 struct mlx4_wqe_local_inval_seg {
0412 u64 reserved1;
0413 __be32 mem_key;
0414 u32 reserved2;
0415 u64 reserved3[2];
0416 };
0417
0418 struct mlx4_wqe_raddr_seg {
0419 __be64 raddr;
0420 __be32 rkey;
0421 u32 reserved;
0422 };
0423
0424 struct mlx4_wqe_atomic_seg {
0425 __be64 swap_add;
0426 __be64 compare;
0427 };
0428
0429 struct mlx4_wqe_masked_atomic_seg {
0430 __be64 swap_add;
0431 __be64 compare;
0432 __be64 swap_add_mask;
0433 __be64 compare_mask;
0434 };
0435
0436 struct mlx4_wqe_data_seg {
0437 __be32 byte_count;
0438 __be32 lkey;
0439 __be64 addr;
0440 };
0441
0442 enum {
0443 MLX4_INLINE_ALIGN = 64,
0444 MLX4_INLINE_SEG = 1 << 31,
0445 };
0446
0447 struct mlx4_wqe_inline_seg {
0448 __be32 byte_count;
0449 };
0450
0451 enum mlx4_update_qp_attr {
0452 MLX4_UPDATE_QP_SMAC = 1 << 0,
0453 MLX4_UPDATE_QP_VSD = 1 << 1,
0454 MLX4_UPDATE_QP_RATE_LIMIT = 1 << 2,
0455 MLX4_UPDATE_QP_QOS_VPORT = 1 << 3,
0456 MLX4_UPDATE_QP_ETH_SRC_CHECK_MC_LB = 1 << 4,
0457 MLX4_UPDATE_QP_SUPPORTED_ATTRS = (1 << 5) - 1
0458 };
0459
0460 enum mlx4_update_qp_params_flags {
0461 MLX4_UPDATE_QP_PARAMS_FLAGS_ETH_CHECK_MC_LB = 1 << 0,
0462 MLX4_UPDATE_QP_PARAMS_FLAGS_VSD_ENABLE = 1 << 1,
0463 };
0464
0465 struct mlx4_update_qp_params {
0466 u8 smac_index;
0467 u8 qos_vport;
0468 u32 flags;
0469 u16 rate_unit;
0470 u16 rate_val;
0471 };
0472
0473 struct mlx4_qp *mlx4_qp_lookup(struct mlx4_dev *dev, u32 qpn);
0474 int mlx4_update_qp(struct mlx4_dev *dev, u32 qpn,
0475 enum mlx4_update_qp_attr attr,
0476 struct mlx4_update_qp_params *params);
0477 int mlx4_qp_modify(struct mlx4_dev *dev, struct mlx4_mtt *mtt,
0478 enum mlx4_qp_state cur_state, enum mlx4_qp_state new_state,
0479 struct mlx4_qp_context *context, enum mlx4_qp_optpar optpar,
0480 int sqd_event, struct mlx4_qp *qp);
0481
0482 int mlx4_qp_query(struct mlx4_dev *dev, struct mlx4_qp *qp,
0483 struct mlx4_qp_context *context);
0484
0485 int mlx4_qp_to_ready(struct mlx4_dev *dev, struct mlx4_mtt *mtt,
0486 struct mlx4_qp_context *context,
0487 struct mlx4_qp *qp, enum mlx4_qp_state *qp_state);
0488
0489 static inline struct mlx4_qp *__mlx4_qp_lookup(struct mlx4_dev *dev, u32 qpn)
0490 {
0491 return radix_tree_lookup(&dev->qp_table_tree, qpn & (dev->caps.num_qps - 1));
0492 }
0493
0494 void mlx4_qp_remove(struct mlx4_dev *dev, struct mlx4_qp *qp);
0495
0496 static inline u16 folded_qp(u32 q)
0497 {
0498 u16 res;
0499
0500 res = ((q & 0xff) ^ ((q & 0xff0000) >> 16)) | (q & 0xff00);
0501 return res;
0502 }
0503
0504 u16 mlx4_qp_roce_entropy(struct mlx4_dev *dev, u32 qpn);
0505
0506 #endif