diff options
Diffstat (limited to 'drivers/infiniband/hw/mlx5/qp.c')
| -rw-r--r-- | drivers/infiniband/hw/mlx5/qp.c | 35 | 
1 files changed, 29 insertions, 6 deletions
| diff --git a/drivers/infiniband/hw/mlx5/qp.c b/drivers/infiniband/hw/mlx5/qp.c index ec4b3f6a8222..9282eb10bfae 100644 --- a/drivers/infiniband/hw/mlx5/qp.c +++ b/drivers/infiniband/hw/mlx5/qp.c @@ -67,7 +67,7 @@ struct mlx5_modify_raw_qp_param {  	struct mlx5_rate_limit rl;  	u8 rq_q_ctr_id; -	u16 port; +	u32 port;  };  static void get_cqs(enum ib_qp_type qp_type, @@ -1078,7 +1078,7 @@ static int _create_kernel_qp(struct mlx5_ib_dev *dev,  	qpc = MLX5_ADDR_OF(create_qp_in, *in, qpc);  	MLX5_SET(qpc, qpc, uar_page, uar_index); -	MLX5_SET(qpc, qpc, ts_format, MLX5_QPC_TIMESTAMP_FORMAT_DEFAULT); +	MLX5_SET(qpc, qpc, ts_format, mlx5_get_qp_default_ts(dev->mdev));  	MLX5_SET(qpc, qpc, log_page_size, qp->buf.page_shift - MLX5_ADAPTER_PAGE_SHIFT);  	/* Set "fast registration enabled" for all kernel QPs */ @@ -1188,7 +1188,8 @@ static int get_rq_ts_format(struct mlx5_ib_dev *dev, struct mlx5_ib_cq *send_cq)  		}  		return MLX5_RQC_TIMESTAMP_FORMAT_FREE_RUNNING;  	} -	return MLX5_RQC_TIMESTAMP_FORMAT_DEFAULT; +	return fr_supported ? MLX5_RQC_TIMESTAMP_FORMAT_FREE_RUNNING : +			      MLX5_RQC_TIMESTAMP_FORMAT_DEFAULT;  }  static int get_sq_ts_format(struct mlx5_ib_dev *dev, struct mlx5_ib_cq *send_cq) @@ -1206,7 +1207,8 @@ static int get_sq_ts_format(struct mlx5_ib_dev *dev, struct mlx5_ib_cq *send_cq)  		}  		return MLX5_SQC_TIMESTAMP_FORMAT_FREE_RUNNING;  	} -	return MLX5_SQC_TIMESTAMP_FORMAT_DEFAULT; +	return fr_supported ? MLX5_SQC_TIMESTAMP_FORMAT_FREE_RUNNING : +			      MLX5_SQC_TIMESTAMP_FORMAT_DEFAULT;  }  static int get_qp_ts_format(struct mlx5_ib_dev *dev, struct mlx5_ib_cq *send_cq, @@ -1217,7 +1219,8 @@ static int get_qp_ts_format(struct mlx5_ib_dev *dev, struct mlx5_ib_cq *send_cq,  			MLX5_QP_TIMESTAMP_FORMAT_CAP_FREE_RUNNING ||  		MLX5_CAP_ROCE(dev->mdev, qp_ts_format) ==  			MLX5_QP_TIMESTAMP_FORMAT_CAP_FREE_RUNNING_AND_REAL_TIME; -	int ts_format = MLX5_QPC_TIMESTAMP_FORMAT_DEFAULT; +	int ts_format = fr_supported ? MLX5_QPC_TIMESTAMP_FORMAT_FREE_RUNNING : +				       MLX5_QPC_TIMESTAMP_FORMAT_DEFAULT;  	if (recv_cq &&  	    recv_cq->create_flags & IB_UVERBS_CQ_FLAGS_TIMESTAMP_COMPLETION) @@ -1930,6 +1933,7 @@ static int create_xrc_tgt_qp(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp,  	if (qp->flags & IB_QP_CREATE_MANAGED_RECV)  		MLX5_SET(qpc, qpc, cd_slave_receive, 1); +	MLX5_SET(qpc, qpc, ts_format, mlx5_get_qp_default_ts(dev->mdev));  	MLX5_SET(qpc, qpc, rq_type, MLX5_SRQ_RQ);  	MLX5_SET(qpc, qpc, no_sq, 1);  	MLX5_SET(qpc, qpc, cqn_rcv, to_mcq(devr->c0)->mcq.cqn); @@ -3142,6 +3146,19 @@ enum {  	MLX5_PATH_FLAG_COUNTER	= 1 << 2,  }; +static int mlx5_to_ib_rate_map(u8 rate) +{ +	static const int rates[] = { IB_RATE_PORT_CURRENT, IB_RATE_56_GBPS, +				     IB_RATE_25_GBPS,	   IB_RATE_100_GBPS, +				     IB_RATE_200_GBPS,	   IB_RATE_50_GBPS, +				     IB_RATE_400_GBPS }; + +	if (rate < ARRAY_SIZE(rates)) +		return rates[rate]; + +	return rate - MLX5_STAT_RATE_OFFSET; +} +  static int ib_to_mlx5_rate_map(u8 rate)  {  	switch (rate) { @@ -4481,7 +4498,7 @@ static void to_rdma_ah_attr(struct mlx5_ib_dev *ibdev,  	rdma_ah_set_path_bits(ah_attr, MLX5_GET(ads, path, mlid));  	static_rate = MLX5_GET(ads, path, stat_rate); -	rdma_ah_set_static_rate(ah_attr, static_rate ? static_rate - 5 : 0); +	rdma_ah_set_static_rate(ah_attr, mlx5_to_ib_rate_map(static_rate));  	if (MLX5_GET(ads, path, grh) ||  	    ah_attr->type == RDMA_AH_ATTR_TYPE_ROCE) {  		rdma_ah_set_grh(ah_attr, NULL, MLX5_GET(ads, path, flow_label), @@ -4873,6 +4890,7 @@ static int  create_rq(struct mlx5_ib_rwq *rwq, struct ib_pd *pd,  	struct mlx5_ib_dev *dev;  	int has_net_offloads;  	__be64 *rq_pas0; +	int ts_format;  	void *in;  	void *rqc;  	void *wq; @@ -4881,6 +4899,10 @@ static int  create_rq(struct mlx5_ib_rwq *rwq, struct ib_pd *pd,  	dev = to_mdev(pd->device); +	ts_format = get_rq_ts_format(dev, to_mcq(init_attr->cq)); +	if (ts_format < 0) +		return ts_format; +  	inlen = MLX5_ST_SZ_BYTES(create_rq_in) + sizeof(u64) * rwq->rq_num_pas;  	in = kvzalloc(inlen, GFP_KERNEL);  	if (!in) @@ -4890,6 +4912,7 @@ static int  create_rq(struct mlx5_ib_rwq *rwq, struct ib_pd *pd,  	rqc = MLX5_ADDR_OF(create_rq_in, in, ctx);  	MLX5_SET(rqc,  rqc, mem_rq_type,  		 MLX5_RQC_MEM_RQ_TYPE_MEMORY_RQ_INLINE); +	MLX5_SET(rqc, rqc, ts_format, ts_format);  	MLX5_SET(rqc, rqc, user_index, rwq->user_index);  	MLX5_SET(rqc,  rqc, cqn, to_mcq(init_attr->cq)->mcq.cqn);  	MLX5_SET(rqc,  rqc, state, MLX5_RQC_STATE_RST); | 
