197549c34SHans Petter Selasky /* 297549c34SHans Petter Selasky * Copyright (c) 2007 Cisco Systems, Inc. All rights reserved. 397549c34SHans Petter Selasky * 497549c34SHans Petter Selasky * This software is available to you under a choice of one of two 597549c34SHans Petter Selasky * licenses. You may choose to be licensed under the terms of the GNU 697549c34SHans Petter Selasky * General Public License (GPL) Version 2, available from the file 797549c34SHans Petter Selasky * COPYING in the main directory of this source tree, or the 897549c34SHans Petter Selasky * OpenIB.org BSD license below: 997549c34SHans Petter Selasky * 1097549c34SHans Petter Selasky * Redistribution and use in source and binary forms, with or 1197549c34SHans Petter Selasky * without modification, are permitted provided that the following 1297549c34SHans Petter Selasky * conditions are met: 1397549c34SHans Petter Selasky * 1497549c34SHans Petter Selasky * - Redistributions of source code must retain the above 1597549c34SHans Petter Selasky * copyright notice, this list of conditions and the following 1697549c34SHans Petter Selasky * disclaimer. 1797549c34SHans Petter Selasky * 1897549c34SHans Petter Selasky * - Redistributions in binary form must reproduce the above 1997549c34SHans Petter Selasky * copyright notice, this list of conditions and the following 2097549c34SHans Petter Selasky * disclaimer in the documentation and/or other materials 2197549c34SHans Petter Selasky * provided with the distribution. 2297549c34SHans Petter Selasky * 2397549c34SHans Petter Selasky * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 2497549c34SHans Petter Selasky * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 2597549c34SHans Petter Selasky * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 2697549c34SHans Petter Selasky * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 2797549c34SHans Petter Selasky * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 2897549c34SHans Petter Selasky * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 2997549c34SHans Petter Selasky * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 3097549c34SHans Petter Selasky * SOFTWARE. 3197549c34SHans Petter Selasky */ 3297549c34SHans Petter Selasky 3397549c34SHans Petter Selasky #ifndef MLX4_QP_H 3497549c34SHans Petter Selasky #define MLX4_QP_H 3597549c34SHans Petter Selasky 3697549c34SHans Petter Selasky #include <linux/types.h> 3797549c34SHans Petter Selasky 3897549c34SHans Petter Selasky #include <dev/mlx4/device.h> 3997549c34SHans Petter Selasky 4097549c34SHans Petter Selasky #define MLX4_INVALID_LKEY 0x100 4197549c34SHans Petter Selasky #define DS_SIZE_ALIGNMENT 16 4297549c34SHans Petter Selasky 4397549c34SHans Petter Selasky #define SET_BYTE_COUNT(byte_count) cpu_to_be32(byte_count) 4497549c34SHans Petter Selasky #define SET_LSO_MSS(mss_hdr_size) cpu_to_be32(mss_hdr_size) 4597549c34SHans Petter Selasky #define DS_BYTE_COUNT_MASK cpu_to_be32(0x7fffffff) 4697549c34SHans Petter Selasky 4797549c34SHans Petter Selasky enum mlx4_qp_optpar { 4897549c34SHans Petter Selasky MLX4_QP_OPTPAR_ALT_ADDR_PATH = 1 << 0, 4997549c34SHans Petter Selasky MLX4_QP_OPTPAR_RRE = 1 << 1, 5097549c34SHans Petter Selasky MLX4_QP_OPTPAR_RAE = 1 << 2, 5197549c34SHans Petter Selasky MLX4_QP_OPTPAR_RWE = 1 << 3, 5297549c34SHans Petter Selasky MLX4_QP_OPTPAR_PKEY_INDEX = 1 << 4, 5397549c34SHans Petter Selasky MLX4_QP_OPTPAR_Q_KEY = 1 << 5, 5497549c34SHans Petter Selasky MLX4_QP_OPTPAR_RNR_TIMEOUT = 1 << 6, 5597549c34SHans Petter Selasky MLX4_QP_OPTPAR_PRIMARY_ADDR_PATH = 1 << 7, 5697549c34SHans Petter Selasky MLX4_QP_OPTPAR_SRA_MAX = 1 << 8, 5797549c34SHans Petter Selasky MLX4_QP_OPTPAR_RRA_MAX = 1 << 9, 5897549c34SHans Petter Selasky MLX4_QP_OPTPAR_PM_STATE = 1 << 10, 5997549c34SHans Petter Selasky MLX4_QP_OPTPAR_RETRY_COUNT = 1 << 12, 6097549c34SHans Petter Selasky MLX4_QP_OPTPAR_RNR_RETRY = 1 << 13, 6197549c34SHans Petter Selasky MLX4_QP_OPTPAR_ACK_TIMEOUT = 1 << 14, 6297549c34SHans Petter Selasky MLX4_QP_OPTPAR_SCHED_QUEUE = 1 << 16, 63*c3191c2eSHans Petter Selasky MLX4_QP_OPTPAR_COUNTER_INDEX = 1 << 20, 64*c3191c2eSHans Petter Selasky MLX4_QP_OPTPAR_VLAN_STRIPPING = 1 << 21, 6597549c34SHans Petter Selasky }; 6697549c34SHans Petter Selasky 6797549c34SHans Petter Selasky enum mlx4_qp_state { 6897549c34SHans Petter Selasky MLX4_QP_STATE_RST = 0, 6997549c34SHans Petter Selasky MLX4_QP_STATE_INIT = 1, 7097549c34SHans Petter Selasky MLX4_QP_STATE_RTR = 2, 7197549c34SHans Petter Selasky MLX4_QP_STATE_RTS = 3, 7297549c34SHans Petter Selasky MLX4_QP_STATE_SQER = 4, 7397549c34SHans Petter Selasky MLX4_QP_STATE_SQD = 5, 7497549c34SHans Petter Selasky MLX4_QP_STATE_ERR = 6, 7597549c34SHans Petter Selasky MLX4_QP_STATE_SQ_DRAINING = 7, 7697549c34SHans Petter Selasky MLX4_QP_NUM_STATE 7797549c34SHans Petter Selasky }; 7897549c34SHans Petter Selasky 7997549c34SHans Petter Selasky enum { 8097549c34SHans Petter Selasky MLX4_QP_ST_RC = 0x0, 8197549c34SHans Petter Selasky MLX4_QP_ST_UC = 0x1, 8297549c34SHans Petter Selasky MLX4_QP_ST_RD = 0x2, 8397549c34SHans Petter Selasky MLX4_QP_ST_UD = 0x3, 8497549c34SHans Petter Selasky MLX4_QP_ST_XRC = 0x6, 8597549c34SHans Petter Selasky MLX4_QP_ST_MLX = 0x7 8697549c34SHans Petter Selasky }; 8797549c34SHans Petter Selasky 8897549c34SHans Petter Selasky enum { 8997549c34SHans Petter Selasky MLX4_QP_PM_MIGRATED = 0x3, 9097549c34SHans Petter Selasky MLX4_QP_PM_ARMED = 0x0, 9197549c34SHans Petter Selasky MLX4_QP_PM_REARM = 0x1 9297549c34SHans Petter Selasky }; 9397549c34SHans Petter Selasky 9497549c34SHans Petter Selasky enum { 9597549c34SHans Petter Selasky /* params1 */ 9697549c34SHans Petter Selasky MLX4_QP_BIT_SRE = 1 << 15, 9797549c34SHans Petter Selasky MLX4_QP_BIT_SWE = 1 << 14, 9897549c34SHans Petter Selasky MLX4_QP_BIT_SAE = 1 << 13, 9997549c34SHans Petter Selasky /* params2 */ 10097549c34SHans Petter Selasky MLX4_QP_BIT_RRE = 1 << 15, 10197549c34SHans Petter Selasky MLX4_QP_BIT_RWE = 1 << 14, 10297549c34SHans Petter Selasky MLX4_QP_BIT_RAE = 1 << 13, 103*c3191c2eSHans Petter Selasky MLX4_QP_BIT_FPP = 1 << 3, 10497549c34SHans Petter Selasky MLX4_QP_BIT_RIC = 1 << 4, 10597549c34SHans Petter Selasky }; 10697549c34SHans Petter Selasky 10797549c34SHans Petter Selasky enum { 10897549c34SHans Petter Selasky MLX4_RSS_HASH_XOR = 0, 10997549c34SHans Petter Selasky MLX4_RSS_HASH_TOP = 1, 11097549c34SHans Petter Selasky 11197549c34SHans Petter Selasky MLX4_RSS_UDP_IPV6 = 1 << 0, 11297549c34SHans Petter Selasky MLX4_RSS_UDP_IPV4 = 1 << 1, 11397549c34SHans Petter Selasky MLX4_RSS_TCP_IPV6 = 1 << 2, 11497549c34SHans Petter Selasky MLX4_RSS_IPV6 = 1 << 3, 11597549c34SHans Petter Selasky MLX4_RSS_TCP_IPV4 = 1 << 4, 11697549c34SHans Petter Selasky MLX4_RSS_IPV4 = 1 << 5, 11797549c34SHans Petter Selasky 118*c3191c2eSHans Petter Selasky MLX4_RSS_BY_OUTER_HEADERS = 0 << 6, 119*c3191c2eSHans Petter Selasky MLX4_RSS_BY_INNER_HEADERS = 2 << 6, 120*c3191c2eSHans Petter Selasky MLX4_RSS_BY_INNER_HEADERS_IPONLY = 3 << 6, 121*c3191c2eSHans Petter Selasky 12297549c34SHans Petter Selasky /* offset of mlx4_rss_context within mlx4_qp_context.pri_path */ 12397549c34SHans Petter Selasky MLX4_RSS_OFFSET_IN_QPC_PRI_PATH = 0x24, 12497549c34SHans Petter Selasky /* offset of being RSS indirection QP within mlx4_qp_context.flags */ 12597549c34SHans Petter Selasky MLX4_RSS_QPC_FLAG_OFFSET = 13, 12697549c34SHans Petter Selasky }; 12797549c34SHans Petter Selasky 128*c3191c2eSHans Petter Selasky #define MLX4_EN_RSS_KEY_SIZE 40 129*c3191c2eSHans Petter Selasky 13097549c34SHans Petter Selasky struct mlx4_rss_context { 13197549c34SHans Petter Selasky __be32 base_qpn; 13297549c34SHans Petter Selasky __be32 default_qpn; 13397549c34SHans Petter Selasky u16 reserved; 13497549c34SHans Petter Selasky u8 hash_fn; 13597549c34SHans Petter Selasky u8 flags; 136*c3191c2eSHans Petter Selasky __be32 rss_key[MLX4_EN_RSS_KEY_SIZE / sizeof(__be32)]; 13797549c34SHans Petter Selasky __be32 base_qpn_udp; 13897549c34SHans Petter Selasky }; 13997549c34SHans Petter Selasky 14097549c34SHans Petter Selasky struct mlx4_qp_path { 14197549c34SHans Petter Selasky u8 fl; 142*c3191c2eSHans Petter Selasky union { 14397549c34SHans Petter Selasky u8 vlan_control; 144*c3191c2eSHans Petter Selasky u8 control; 145*c3191c2eSHans Petter Selasky }; 14697549c34SHans Petter Selasky u8 disable_pkey_check; 14797549c34SHans Petter Selasky u8 pkey_index; 14897549c34SHans Petter Selasky u8 counter_index; 14997549c34SHans Petter Selasky u8 grh_mylmc; 15097549c34SHans Petter Selasky __be16 rlid; 15197549c34SHans Petter Selasky u8 ackto; 15297549c34SHans Petter Selasky u8 mgid_index; 15397549c34SHans Petter Selasky u8 static_rate; 15497549c34SHans Petter Selasky u8 hop_limit; 15597549c34SHans Petter Selasky __be32 tclass_flowlabel; 15697549c34SHans Petter Selasky u8 rgid[16]; 15797549c34SHans Petter Selasky u8 sched_queue; 15897549c34SHans Petter Selasky u8 vlan_index; 15997549c34SHans Petter Selasky u8 feup; 16097549c34SHans Petter Selasky u8 fvl_rx; 16197549c34SHans Petter Selasky u8 reserved4[2]; 162*c3191c2eSHans Petter Selasky u8 dmac[ETH_ALEN]; 16397549c34SHans Petter Selasky }; 16497549c34SHans Petter Selasky 16597549c34SHans Petter Selasky enum { /* fl */ 16697549c34SHans Petter Selasky MLX4_FL_CV = 1 << 6, 167*c3191c2eSHans Petter Selasky MLX4_FL_SV = 1 << 5, 16897549c34SHans Petter Selasky MLX4_FL_ETH_HIDE_CQE_VLAN = 1 << 2, 16997549c34SHans Petter Selasky MLX4_FL_ETH_SRC_CHECK_MC_LB = 1 << 1, 17097549c34SHans Petter Selasky MLX4_FL_ETH_SRC_CHECK_UC_LB = 1 << 0, 17197549c34SHans Petter Selasky }; 172*c3191c2eSHans Petter Selasky 173*c3191c2eSHans Petter Selasky enum { /* control */ 174*c3191c2eSHans Petter Selasky MLX4_CTRL_ETH_SRC_CHECK_IF_COUNTER = 1 << 7, 175*c3191c2eSHans Petter Selasky }; 176*c3191c2eSHans Petter Selasky 17797549c34SHans Petter Selasky enum { /* vlan_control */ 17897549c34SHans Petter Selasky MLX4_VLAN_CTRL_ETH_TX_BLOCK_TAGGED = 1 << 6, 179*c3191c2eSHans Petter Selasky MLX4_VLAN_CTRL_ETH_TX_BLOCK_PRIO_TAGGED = 1 << 5, /* 802.1p priority tag */ 180*c3191c2eSHans Petter Selasky MLX4_VLAN_CTRL_ETH_TX_BLOCK_UNTAGGED = 1 << 4, 18197549c34SHans Petter Selasky MLX4_VLAN_CTRL_ETH_RX_BLOCK_TAGGED = 1 << 2, 182*c3191c2eSHans Petter Selasky MLX4_VLAN_CTRL_ETH_RX_BLOCK_PRIO_TAGGED = 1 << 1, /* 802.1p priority tag */ 18397549c34SHans Petter Selasky MLX4_VLAN_CTRL_ETH_RX_BLOCK_UNTAGGED = 1 << 0 18497549c34SHans Petter Selasky }; 18597549c34SHans Petter Selasky 18697549c34SHans Petter Selasky enum { /* feup */ 18797549c34SHans Petter Selasky MLX4_FEUP_FORCE_ETH_UP = 1 << 6, /* force Eth UP */ 18897549c34SHans Petter Selasky MLX4_FSM_FORCE_ETH_SRC_MAC = 1 << 5, /* force Source MAC */ 18997549c34SHans Petter Selasky MLX4_FVL_FORCE_ETH_VLAN = 1 << 3 /* force Eth vlan */ 19097549c34SHans Petter Selasky }; 19197549c34SHans Petter Selasky 19297549c34SHans Petter Selasky enum { /* fvl_rx */ 19397549c34SHans Petter Selasky MLX4_FVL_RX_FORCE_ETH_VLAN = 1 << 0 /* enforce Eth rx vlan */ 19497549c34SHans Petter Selasky }; 19597549c34SHans Petter Selasky 19697549c34SHans Petter Selasky struct mlx4_qp_context { 19797549c34SHans Petter Selasky __be32 flags; 19897549c34SHans Petter Selasky __be32 pd; 19997549c34SHans Petter Selasky u8 mtu_msgmax; 20097549c34SHans Petter Selasky u8 rq_size_stride; 20197549c34SHans Petter Selasky u8 sq_size_stride; 202*c3191c2eSHans Petter Selasky u8 rlkey_roce_mode; 20397549c34SHans Petter Selasky __be32 usr_page; 20497549c34SHans Petter Selasky __be32 local_qpn; 20597549c34SHans Petter Selasky __be32 remote_qpn; 20697549c34SHans Petter Selasky struct mlx4_qp_path pri_path; 20797549c34SHans Petter Selasky struct mlx4_qp_path alt_path; 20897549c34SHans Petter Selasky __be32 params1; 20997549c34SHans Petter Selasky u32 reserved1; 21097549c34SHans Petter Selasky __be32 next_send_psn; 21197549c34SHans Petter Selasky __be32 cqn_send; 212*c3191c2eSHans Petter Selasky __be16 roce_entropy; 213*c3191c2eSHans Petter Selasky __be16 reserved2[3]; 21497549c34SHans Petter Selasky __be32 last_acked_psn; 21597549c34SHans Petter Selasky __be32 ssn; 21697549c34SHans Petter Selasky __be32 params2; 21797549c34SHans Petter Selasky __be32 rnr_nextrecvpsn; 21897549c34SHans Petter Selasky __be32 xrcd; 21997549c34SHans Petter Selasky __be32 cqn_recv; 22097549c34SHans Petter Selasky __be64 db_rec_addr; 22197549c34SHans Petter Selasky __be32 qkey; 22297549c34SHans Petter Selasky __be32 srqn; 22397549c34SHans Petter Selasky __be32 msn; 22497549c34SHans Petter Selasky __be16 rq_wqe_counter; 22597549c34SHans Petter Selasky __be16 sq_wqe_counter; 226*c3191c2eSHans Petter Selasky u32 reserved3; 227*c3191c2eSHans Petter Selasky __be16 rate_limit_params; 228*c3191c2eSHans Petter Selasky u8 reserved4; 229*c3191c2eSHans Petter Selasky u8 qos_vport; 23097549c34SHans Petter Selasky __be32 param3; 23197549c34SHans Petter Selasky __be32 nummmcpeers_basemkey; 23297549c34SHans Petter Selasky u8 log_page_size; 233*c3191c2eSHans Petter Selasky u8 reserved5[2]; 23497549c34SHans Petter Selasky u8 mtt_base_addr_h; 23597549c34SHans Petter Selasky __be32 mtt_base_addr_l; 236*c3191c2eSHans Petter Selasky u32 reserved6[10]; 23797549c34SHans Petter Selasky }; 23897549c34SHans Petter Selasky 23997549c34SHans Petter Selasky struct mlx4_update_qp_context { 24097549c34SHans Petter Selasky __be64 qp_mask; 24197549c34SHans Petter Selasky __be64 primary_addr_path_mask; 24297549c34SHans Petter Selasky __be64 secondary_addr_path_mask; 24397549c34SHans Petter Selasky u64 reserved1; 24497549c34SHans Petter Selasky struct mlx4_qp_context qp_context; 24597549c34SHans Petter Selasky u64 reserved2[58]; 24697549c34SHans Petter Selasky }; 24797549c34SHans Petter Selasky 24897549c34SHans Petter Selasky enum { 24997549c34SHans Petter Selasky MLX4_UPD_QP_MASK_PM_STATE = 32, 25097549c34SHans Petter Selasky MLX4_UPD_QP_MASK_VSD = 33, 251*c3191c2eSHans Petter Selasky MLX4_UPD_QP_MASK_QOS_VPP = 34, 252*c3191c2eSHans Petter Selasky MLX4_UPD_QP_MASK_RATE_LIMIT = 35, 25397549c34SHans Petter Selasky }; 25497549c34SHans Petter Selasky 25597549c34SHans Petter Selasky enum { 25697549c34SHans Petter Selasky MLX4_UPD_QP_PATH_MASK_PKEY_INDEX = 0 + 32, 25797549c34SHans Petter Selasky MLX4_UPD_QP_PATH_MASK_FSM = 1 + 32, 25897549c34SHans Petter Selasky MLX4_UPD_QP_PATH_MASK_MAC_INDEX = 2 + 32, 25997549c34SHans Petter Selasky MLX4_UPD_QP_PATH_MASK_FVL = 3 + 32, 26097549c34SHans Petter Selasky MLX4_UPD_QP_PATH_MASK_CV = 4 + 32, 26197549c34SHans Petter Selasky MLX4_UPD_QP_PATH_MASK_VLAN_INDEX = 5 + 32, 26297549c34SHans Petter Selasky MLX4_UPD_QP_PATH_MASK_ETH_HIDE_CQE_VLAN = 6 + 32, 26397549c34SHans Petter Selasky MLX4_UPD_QP_PATH_MASK_ETH_TX_BLOCK_UNTAGGED = 7 + 32, 26497549c34SHans Petter Selasky MLX4_UPD_QP_PATH_MASK_ETH_TX_BLOCK_1P = 8 + 32, 26597549c34SHans Petter Selasky MLX4_UPD_QP_PATH_MASK_ETH_TX_BLOCK_TAGGED = 9 + 32, 26697549c34SHans Petter Selasky MLX4_UPD_QP_PATH_MASK_ETH_RX_BLOCK_UNTAGGED = 10 + 32, 26797549c34SHans Petter Selasky MLX4_UPD_QP_PATH_MASK_ETH_RX_BLOCK_1P = 11 + 32, 26897549c34SHans Petter Selasky MLX4_UPD_QP_PATH_MASK_ETH_RX_BLOCK_TAGGED = 12 + 32, 26997549c34SHans Petter Selasky MLX4_UPD_QP_PATH_MASK_FEUP = 13 + 32, 27097549c34SHans Petter Selasky MLX4_UPD_QP_PATH_MASK_SCHED_QUEUE = 14 + 32, 27197549c34SHans Petter Selasky MLX4_UPD_QP_PATH_MASK_IF_COUNTER_INDEX = 15 + 32, 27297549c34SHans Petter Selasky MLX4_UPD_QP_PATH_MASK_FVL_RX = 16 + 32, 27397549c34SHans Petter Selasky MLX4_UPD_QP_PATH_MASK_ETH_SRC_CHECK_UC_LB = 18 + 32, 27497549c34SHans Petter Selasky MLX4_UPD_QP_PATH_MASK_ETH_SRC_CHECK_MC_LB = 19 + 32, 275*c3191c2eSHans Petter Selasky MLX4_UPD_QP_PATH_MASK_SV = 22 + 32, 27697549c34SHans Petter Selasky }; 27797549c34SHans Petter Selasky 27897549c34SHans Petter Selasky enum { /* param3 */ 27997549c34SHans Petter Selasky MLX4_STRIP_VLAN = 1 << 30 28097549c34SHans Petter Selasky }; 28197549c34SHans Petter Selasky 28297549c34SHans Petter Selasky /* Which firmware version adds support for NEC (NoErrorCompletion) bit */ 28397549c34SHans Petter Selasky #define MLX4_FW_VER_WQE_CTRL_NEC mlx4_fw_ver(2, 2, 232) 28497549c34SHans Petter Selasky 28597549c34SHans Petter Selasky enum { 28697549c34SHans Petter Selasky MLX4_WQE_CTRL_OWN = 1 << 31, 28797549c34SHans Petter Selasky MLX4_WQE_CTRL_NEC = 1 << 29, 28897549c34SHans Petter Selasky MLX4_WQE_CTRL_RR = 1 << 6, 289*c3191c2eSHans Petter Selasky MLX4_WQE_CTRL_IIP = 1 << 28, 290*c3191c2eSHans Petter Selasky MLX4_WQE_CTRL_ILP = 1 << 27, 29197549c34SHans Petter Selasky MLX4_WQE_CTRL_FENCE = 1 << 6, 29297549c34SHans Petter Selasky MLX4_WQE_CTRL_CQ_UPDATE = 3 << 2, 29397549c34SHans Petter Selasky MLX4_WQE_CTRL_SOLICITED = 1 << 1, 29497549c34SHans Petter Selasky MLX4_WQE_CTRL_IP_CSUM = 1 << 4, 29597549c34SHans Petter Selasky MLX4_WQE_CTRL_TCP_UDP_CSUM = 1 << 5, 296*c3191c2eSHans Petter Selasky MLX4_WQE_CTRL_INS_CVLAN = 1 << 6, 297*c3191c2eSHans Petter Selasky MLX4_WQE_CTRL_INS_SVLAN = 1 << 7, 29897549c34SHans Petter Selasky MLX4_WQE_CTRL_STRONG_ORDER = 1 << 7, 29997549c34SHans Petter Selasky MLX4_WQE_CTRL_FORCE_LOOPBACK = 1 << 0, 30097549c34SHans Petter Selasky }; 30197549c34SHans Petter Selasky 30297549c34SHans Petter Selasky struct mlx4_wqe_ctrl_seg { 30397549c34SHans Petter Selasky __be32 owner_opcode; 304*c3191c2eSHans Petter Selasky union { 305*c3191c2eSHans Petter Selasky struct { 30697549c34SHans Petter Selasky __be16 vlan_tag; 30797549c34SHans Petter Selasky u8 ins_vlan; 30897549c34SHans Petter Selasky u8 fence_size; 309*c3191c2eSHans Petter Selasky }; 310*c3191c2eSHans Petter Selasky __be32 bf_qpn; 311*c3191c2eSHans Petter Selasky }; 31297549c34SHans Petter Selasky /* 31397549c34SHans Petter Selasky * High 24 bits are SRC remote buffer; low 8 bits are flags: 31497549c34SHans Petter Selasky * [7] SO (strong ordering) 31597549c34SHans Petter Selasky * [5] TCP/UDP checksum 31697549c34SHans Petter Selasky * [4] IP checksum 31797549c34SHans Petter Selasky * [3:2] C (generate completion queue entry) 31897549c34SHans Petter Selasky * [1] SE (solicited event) 31997549c34SHans Petter Selasky * [0] FL (force loopback) 32097549c34SHans Petter Selasky */ 32197549c34SHans Petter Selasky union { 32297549c34SHans Petter Selasky __be32 srcrb_flags; 32397549c34SHans Petter Selasky __be16 srcrb_flags16[2]; 32497549c34SHans Petter Selasky }; 32597549c34SHans Petter Selasky /* 32697549c34SHans Petter Selasky * imm is immediate data for send/RDMA write w/ immediate; 32797549c34SHans Petter Selasky * also invalidation key for send with invalidate; input 32897549c34SHans Petter Selasky * modifier for WQEs on CCQs. 32997549c34SHans Petter Selasky */ 33097549c34SHans Petter Selasky __be32 imm; 33197549c34SHans Petter Selasky }; 33297549c34SHans Petter Selasky 33397549c34SHans Petter Selasky enum { 33497549c34SHans Petter Selasky MLX4_WQE_MLX_VL15 = 1 << 17, 33597549c34SHans Petter Selasky MLX4_WQE_MLX_SLR = 1 << 16 33697549c34SHans Petter Selasky }; 33797549c34SHans Petter Selasky 33897549c34SHans Petter Selasky struct mlx4_wqe_mlx_seg { 33997549c34SHans Petter Selasky u8 owner; 34097549c34SHans Petter Selasky u8 reserved1[2]; 34197549c34SHans Petter Selasky u8 opcode; 34297549c34SHans Petter Selasky __be16 sched_prio; 34397549c34SHans Petter Selasky u8 reserved2; 34497549c34SHans Petter Selasky u8 size; 34597549c34SHans Petter Selasky /* 34697549c34SHans Petter Selasky * [17] VL15 34797549c34SHans Petter Selasky * [16] SLR 34897549c34SHans Petter Selasky * [15:12] static rate 34997549c34SHans Petter Selasky * [11:8] SL 35097549c34SHans Petter Selasky * [4] ICRC 35197549c34SHans Petter Selasky * [3:2] C 35297549c34SHans Petter Selasky * [0] FL (force loopback) 35397549c34SHans Petter Selasky */ 35497549c34SHans Petter Selasky __be32 flags; 35597549c34SHans Petter Selasky __be16 rlid; 35697549c34SHans Petter Selasky u16 reserved3; 35797549c34SHans Petter Selasky }; 35897549c34SHans Petter Selasky 35997549c34SHans Petter Selasky struct mlx4_wqe_datagram_seg { 36097549c34SHans Petter Selasky __be32 av[8]; 36197549c34SHans Petter Selasky __be32 dqpn; 36297549c34SHans Petter Selasky __be32 qkey; 36397549c34SHans Petter Selasky __be16 vlan; 364*c3191c2eSHans Petter Selasky u8 mac[ETH_ALEN]; 36597549c34SHans Petter Selasky }; 36697549c34SHans Petter Selasky 36797549c34SHans Petter Selasky struct mlx4_wqe_lso_seg { 36897549c34SHans Petter Selasky __be32 mss_hdr_size; 36997549c34SHans Petter Selasky __be32 header[0]; 37097549c34SHans Petter Selasky }; 37197549c34SHans Petter Selasky 37297549c34SHans Petter Selasky enum mlx4_wqe_bind_seg_flags2 { 37397549c34SHans Petter Selasky MLX4_WQE_BIND_ZERO_BASED = (1 << 30), 374*c3191c2eSHans Petter Selasky MLX4_WQE_BIND_TYPE_2 = (1 << 31), 37597549c34SHans Petter Selasky }; 37697549c34SHans Petter Selasky 37797549c34SHans Petter Selasky struct mlx4_wqe_bind_seg { 37897549c34SHans Petter Selasky __be32 flags1; 37997549c34SHans Petter Selasky __be32 flags2; 38097549c34SHans Petter Selasky __be32 new_rkey; 38197549c34SHans Petter Selasky __be32 lkey; 38297549c34SHans Petter Selasky __be64 addr; 38397549c34SHans Petter Selasky __be64 length; 38497549c34SHans Petter Selasky }; 38597549c34SHans Petter Selasky 38697549c34SHans Petter Selasky enum { 38797549c34SHans Petter Selasky MLX4_WQE_FMR_PERM_LOCAL_READ = 1 << 27, 38897549c34SHans Petter Selasky MLX4_WQE_FMR_PERM_LOCAL_WRITE = 1 << 28, 38997549c34SHans Petter Selasky MLX4_WQE_FMR_AND_BIND_PERM_REMOTE_READ = 1 << 29, 39097549c34SHans Petter Selasky MLX4_WQE_FMR_AND_BIND_PERM_REMOTE_WRITE = 1 << 30, 39197549c34SHans Petter Selasky MLX4_WQE_FMR_AND_BIND_PERM_ATOMIC = 1 << 31 39297549c34SHans Petter Selasky }; 39397549c34SHans Petter Selasky 39497549c34SHans Petter Selasky struct mlx4_wqe_fmr_seg { 39597549c34SHans Petter Selasky __be32 flags; 39697549c34SHans Petter Selasky __be32 mem_key; 39797549c34SHans Petter Selasky __be64 buf_list; 39897549c34SHans Petter Selasky __be64 start_addr; 39997549c34SHans Petter Selasky __be64 reg_len; 40097549c34SHans Petter Selasky __be32 offset; 40197549c34SHans Petter Selasky __be32 page_size; 40297549c34SHans Petter Selasky u32 reserved[2]; 40397549c34SHans Petter Selasky }; 40497549c34SHans Petter Selasky 40597549c34SHans Petter Selasky struct mlx4_wqe_fmr_ext_seg { 40697549c34SHans Petter Selasky u8 flags; 40797549c34SHans Petter Selasky u8 reserved; 40897549c34SHans Petter Selasky __be16 app_mask; 40997549c34SHans Petter Selasky __be16 wire_app_tag; 41097549c34SHans Petter Selasky __be16 mem_app_tag; 41197549c34SHans Petter Selasky __be32 wire_ref_tag_base; 41297549c34SHans Petter Selasky __be32 mem_ref_tag_base; 41397549c34SHans Petter Selasky }; 41497549c34SHans Petter Selasky 41597549c34SHans Petter Selasky struct mlx4_wqe_local_inval_seg { 41697549c34SHans Petter Selasky u64 reserved1; 41797549c34SHans Petter Selasky __be32 mem_key; 41897549c34SHans Petter Selasky u32 reserved2; 41997549c34SHans Petter Selasky u64 reserved3[2]; 42097549c34SHans Petter Selasky }; 42197549c34SHans Petter Selasky 42297549c34SHans Petter Selasky struct mlx4_wqe_raddr_seg { 42397549c34SHans Petter Selasky __be64 raddr; 42497549c34SHans Petter Selasky __be32 rkey; 42597549c34SHans Petter Selasky u32 reserved; 42697549c34SHans Petter Selasky }; 42797549c34SHans Petter Selasky 42897549c34SHans Petter Selasky struct mlx4_wqe_atomic_seg { 42997549c34SHans Petter Selasky __be64 swap_add; 43097549c34SHans Petter Selasky __be64 compare; 43197549c34SHans Petter Selasky }; 43297549c34SHans Petter Selasky 43397549c34SHans Petter Selasky struct mlx4_wqe_masked_atomic_seg { 43497549c34SHans Petter Selasky __be64 swap_add; 43597549c34SHans Petter Selasky __be64 compare; 43697549c34SHans Petter Selasky __be64 swap_add_mask; 43797549c34SHans Petter Selasky __be64 compare_mask; 43897549c34SHans Petter Selasky }; 43997549c34SHans Petter Selasky 44097549c34SHans Petter Selasky struct mlx4_wqe_data_seg { 44197549c34SHans Petter Selasky __be32 byte_count; 44297549c34SHans Petter Selasky __be32 lkey; 44397549c34SHans Petter Selasky __be64 addr; 44497549c34SHans Petter Selasky }; 44597549c34SHans Petter Selasky 44697549c34SHans Petter Selasky enum { 44797549c34SHans Petter Selasky MLX4_INLINE_ALIGN = 64, 44897549c34SHans Petter Selasky MLX4_INLINE_SEG = 1 << 31, 44997549c34SHans Petter Selasky }; 45097549c34SHans Petter Selasky 45197549c34SHans Petter Selasky struct mlx4_wqe_inline_seg { 45297549c34SHans Petter Selasky __be32 byte_count; 45397549c34SHans Petter Selasky }; 45497549c34SHans Petter Selasky 455*c3191c2eSHans Petter Selasky enum mlx4_update_qp_attr { 456*c3191c2eSHans Petter Selasky MLX4_UPDATE_QP_SMAC = 1 << 0, 457*c3191c2eSHans Petter Selasky MLX4_UPDATE_QP_VSD = 1 << 1, 458*c3191c2eSHans Petter Selasky MLX4_UPDATE_QP_RATE_LIMIT = 1 << 2, 459*c3191c2eSHans Petter Selasky MLX4_UPDATE_QP_QOS_VPORT = 1 << 3, 460*c3191c2eSHans Petter Selasky MLX4_UPDATE_QP_ETH_SRC_CHECK_MC_LB = 1 << 4, 461*c3191c2eSHans Petter Selasky MLX4_UPDATE_QP_SUPPORTED_ATTRS = (1 << 5) - 1 462*c3191c2eSHans Petter Selasky }; 463*c3191c2eSHans Petter Selasky 464*c3191c2eSHans Petter Selasky enum mlx4_update_qp_params_flags { 465*c3191c2eSHans Petter Selasky MLX4_UPDATE_QP_PARAMS_FLAGS_ETH_CHECK_MC_LB = 1 << 0, 466*c3191c2eSHans Petter Selasky MLX4_UPDATE_QP_PARAMS_FLAGS_VSD_ENABLE = 1 << 1, 467*c3191c2eSHans Petter Selasky }; 468*c3191c2eSHans Petter Selasky 469*c3191c2eSHans Petter Selasky struct mlx4_update_qp_params { 470*c3191c2eSHans Petter Selasky u8 smac_index; 471*c3191c2eSHans Petter Selasky u8 qos_vport; 472*c3191c2eSHans Petter Selasky u32 flags; 473*c3191c2eSHans Petter Selasky u16 rate_unit; 474*c3191c2eSHans Petter Selasky u16 rate_val; 475*c3191c2eSHans Petter Selasky }; 476*c3191c2eSHans Petter Selasky 477*c3191c2eSHans Petter Selasky int mlx4_update_qp(struct mlx4_dev *dev, u32 qpn, 478*c3191c2eSHans Petter Selasky enum mlx4_update_qp_attr attr, 479*c3191c2eSHans Petter Selasky struct mlx4_update_qp_params *params); 48097549c34SHans Petter Selasky int mlx4_qp_modify(struct mlx4_dev *dev, struct mlx4_mtt *mtt, 48197549c34SHans Petter Selasky enum mlx4_qp_state cur_state, enum mlx4_qp_state new_state, 48297549c34SHans Petter Selasky struct mlx4_qp_context *context, enum mlx4_qp_optpar optpar, 48397549c34SHans Petter Selasky int sqd_event, struct mlx4_qp *qp); 48497549c34SHans Petter Selasky 48597549c34SHans Petter Selasky int mlx4_qp_query(struct mlx4_dev *dev, struct mlx4_qp *qp, 48697549c34SHans Petter Selasky struct mlx4_qp_context *context); 48797549c34SHans Petter Selasky 48897549c34SHans Petter Selasky int mlx4_qp_to_ready(struct mlx4_dev *dev, struct mlx4_mtt *mtt, 48997549c34SHans Petter Selasky struct mlx4_qp_context *context, 49097549c34SHans Petter Selasky struct mlx4_qp *qp, enum mlx4_qp_state *qp_state); 49197549c34SHans Petter Selasky 49297549c34SHans Petter Selasky static inline struct mlx4_qp *__mlx4_qp_lookup(struct mlx4_dev *dev, u32 qpn) 49397549c34SHans Petter Selasky { 49497549c34SHans Petter Selasky return radix_tree_lookup(&dev->qp_table_tree, qpn & (dev->caps.num_qps - 1)); 49597549c34SHans Petter Selasky } 49697549c34SHans Petter Selasky 49797549c34SHans Petter Selasky void mlx4_qp_remove(struct mlx4_dev *dev, struct mlx4_qp *qp); 49897549c34SHans Petter Selasky 499*c3191c2eSHans Petter Selasky static inline u16 folded_qp(u32 q) 500*c3191c2eSHans Petter Selasky { 501*c3191c2eSHans Petter Selasky u16 res; 502*c3191c2eSHans Petter Selasky 503*c3191c2eSHans Petter Selasky res = ((q & 0xff) ^ ((q & 0xff0000) >> 16)) | (q & 0xff00); 504*c3191c2eSHans Petter Selasky return res; 505*c3191c2eSHans Petter Selasky } 506*c3191c2eSHans Petter Selasky 507*c3191c2eSHans Petter Selasky u16 mlx4_qp_roce_entropy(struct mlx4_dev *dev, u32 qpn); 508*c3191c2eSHans Petter Selasky 50997549c34SHans Petter Selasky #endif /* MLX4_QP_H */ 510