RDMA/mlx5: Refactor get_ts_format functions to simplify code
QPC, SQC and RQC timestamp formats and capabilities are always equal because they represent general hardware support. So instead of code duplication, let's merge them into general enum and logic. Signed-off-by: Aharon Landau <aharonl@nvidia.com> Reviewed-by: Maor Gottlieb <maorg@nvidia.com> Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
This commit is contained in:
parent
009c9aa5be
commit
9a1ac95a59
|
@ -1173,69 +1173,59 @@ static void destroy_flow_rule_vport_sq(struct mlx5_ib_sq *sq)
|
|||
sq->flow_rule = NULL;
|
||||
}
|
||||
|
||||
static int get_rq_ts_format(struct mlx5_ib_dev *dev, struct mlx5_ib_cq *send_cq)
|
||||
static bool fr_supported(int ts_cap)
|
||||
{
|
||||
bool fr_supported =
|
||||
MLX5_CAP_GEN(dev->mdev, rq_ts_format) ==
|
||||
MLX5_RQ_TIMESTAMP_FORMAT_CAP_FREE_RUNNING ||
|
||||
MLX5_CAP_GEN(dev->mdev, rq_ts_format) ==
|
||||
MLX5_RQ_TIMESTAMP_FORMAT_CAP_FREE_RUNNING_AND_REAL_TIME;
|
||||
return ts_cap == MLX5_TIMESTAMP_FORMAT_CAP_FREE_RUNNING ||
|
||||
ts_cap == MLX5_TIMESTAMP_FORMAT_CAP_FREE_RUNNING_AND_REAL_TIME;
|
||||
}
|
||||
|
||||
if (send_cq->create_flags & IB_UVERBS_CQ_FLAGS_TIMESTAMP_COMPLETION) {
|
||||
if (!fr_supported) {
|
||||
mlx5_ib_dbg(dev, "Free running TS format is not supported\n");
|
||||
static int get_ts_format(struct mlx5_ib_dev *dev, struct mlx5_ib_cq *cq,
|
||||
bool fr_sup)
|
||||
{
|
||||
if (cq->create_flags & IB_UVERBS_CQ_FLAGS_TIMESTAMP_COMPLETION) {
|
||||
if (!fr_sup) {
|
||||
mlx5_ib_dbg(dev,
|
||||
"Free running TS format is not supported\n");
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
return MLX5_RQC_TIMESTAMP_FORMAT_FREE_RUNNING;
|
||||
return MLX5_TIMESTAMP_FORMAT_FREE_RUNNING;
|
||||
}
|
||||
return fr_supported ? MLX5_RQC_TIMESTAMP_FORMAT_FREE_RUNNING :
|
||||
MLX5_RQC_TIMESTAMP_FORMAT_DEFAULT;
|
||||
return fr_sup ? MLX5_TIMESTAMP_FORMAT_FREE_RUNNING :
|
||||
MLX5_TIMESTAMP_FORMAT_DEFAULT;
|
||||
}
|
||||
|
||||
static int get_rq_ts_format(struct mlx5_ib_dev *dev, struct mlx5_ib_cq *recv_cq)
|
||||
{
|
||||
u8 ts_cap = MLX5_CAP_GEN(dev->mdev, rq_ts_format);
|
||||
|
||||
return get_ts_format(dev, recv_cq, fr_supported(ts_cap));
|
||||
}
|
||||
|
||||
static int get_sq_ts_format(struct mlx5_ib_dev *dev, struct mlx5_ib_cq *send_cq)
|
||||
{
|
||||
bool fr_supported =
|
||||
MLX5_CAP_GEN(dev->mdev, sq_ts_format) ==
|
||||
MLX5_SQ_TIMESTAMP_FORMAT_CAP_FREE_RUNNING ||
|
||||
MLX5_CAP_GEN(dev->mdev, sq_ts_format) ==
|
||||
MLX5_SQ_TIMESTAMP_FORMAT_CAP_FREE_RUNNING_AND_REAL_TIME;
|
||||
u8 ts_cap = MLX5_CAP_GEN(dev->mdev, sq_ts_format);
|
||||
|
||||
if (send_cq->create_flags & IB_UVERBS_CQ_FLAGS_TIMESTAMP_COMPLETION) {
|
||||
if (!fr_supported) {
|
||||
mlx5_ib_dbg(dev, "Free running TS format is not supported\n");
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
return MLX5_SQC_TIMESTAMP_FORMAT_FREE_RUNNING;
|
||||
}
|
||||
return fr_supported ? MLX5_SQC_TIMESTAMP_FORMAT_FREE_RUNNING :
|
||||
MLX5_SQC_TIMESTAMP_FORMAT_DEFAULT;
|
||||
return get_ts_format(dev, send_cq, fr_supported(ts_cap));
|
||||
}
|
||||
|
||||
static int get_qp_ts_format(struct mlx5_ib_dev *dev, struct mlx5_ib_cq *send_cq,
|
||||
struct mlx5_ib_cq *recv_cq)
|
||||
{
|
||||
bool fr_supported =
|
||||
MLX5_CAP_ROCE(dev->mdev, qp_ts_format) ==
|
||||
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 = fr_supported ? MLX5_QPC_TIMESTAMP_FORMAT_FREE_RUNNING :
|
||||
MLX5_QPC_TIMESTAMP_FORMAT_DEFAULT;
|
||||
u8 ts_cap = MLX5_CAP_ROCE(dev->mdev, qp_ts_format);
|
||||
bool fr_sup = fr_supported(ts_cap);
|
||||
u8 default_ts = fr_sup ? MLX5_TIMESTAMP_FORMAT_FREE_RUNNING :
|
||||
MLX5_TIMESTAMP_FORMAT_DEFAULT;
|
||||
int send_ts_format =
|
||||
send_cq ? get_ts_format(dev, send_cq, fr_sup) :
|
||||
default_ts;
|
||||
int recv_ts_format =
|
||||
recv_cq ? get_ts_format(dev, recv_cq, fr_sup) :
|
||||
default_ts;
|
||||
|
||||
if (recv_cq &&
|
||||
recv_cq->create_flags & IB_UVERBS_CQ_FLAGS_TIMESTAMP_COMPLETION)
|
||||
ts_format = MLX5_QPC_TIMESTAMP_FORMAT_FREE_RUNNING;
|
||||
|
||||
if (send_cq &&
|
||||
send_cq->create_flags & IB_UVERBS_CQ_FLAGS_TIMESTAMP_COMPLETION)
|
||||
ts_format = MLX5_QPC_TIMESTAMP_FORMAT_FREE_RUNNING;
|
||||
|
||||
if (ts_format == MLX5_QPC_TIMESTAMP_FORMAT_FREE_RUNNING &&
|
||||
!fr_supported) {
|
||||
mlx5_ib_dbg(dev, "Free running TS format is not supported\n");
|
||||
if (send_ts_format < 0 || recv_ts_format < 0)
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
return ts_format;
|
||||
|
||||
return send_ts_format == default_ts ? recv_ts_format : send_ts_format;
|
||||
}
|
||||
|
||||
static int create_raw_packet_qp_sq(struct mlx5_ib_dev *dev,
|
||||
|
|
|
@ -644,8 +644,8 @@ int mlx5e_create_rq(struct mlx5e_rq *rq, struct mlx5e_rq_param *param)
|
|||
return -ENOMEM;
|
||||
|
||||
ts_format = mlx5_is_real_time_rq(mdev) ?
|
||||
MLX5_RQC_TIMESTAMP_FORMAT_REAL_TIME :
|
||||
MLX5_RQC_TIMESTAMP_FORMAT_FREE_RUNNING;
|
||||
MLX5_TIMESTAMP_FORMAT_REAL_TIME :
|
||||
MLX5_TIMESTAMP_FORMAT_FREE_RUNNING;
|
||||
rqc = MLX5_ADDR_OF(create_rq_in, in, ctx);
|
||||
wq = MLX5_ADDR_OF(rqc, rqc, wq);
|
||||
|
||||
|
@ -1188,8 +1188,8 @@ static int mlx5e_create_sq(struct mlx5_core_dev *mdev,
|
|||
return -ENOMEM;
|
||||
|
||||
ts_format = mlx5_is_real_time_sq(mdev) ?
|
||||
MLX5_SQC_TIMESTAMP_FORMAT_REAL_TIME :
|
||||
MLX5_SQC_TIMESTAMP_FORMAT_FREE_RUNNING;
|
||||
MLX5_TIMESTAMP_FORMAT_REAL_TIME :
|
||||
MLX5_TIMESTAMP_FORMAT_FREE_RUNNING;
|
||||
sqc = MLX5_ADDR_OF(create_sq_in, in, ctx);
|
||||
wq = MLX5_ADDR_OF(sqc, sqc, wq);
|
||||
|
||||
|
|
|
@ -37,16 +37,18 @@ static inline bool mlx5_is_real_time_rq(struct mlx5_core_dev *mdev)
|
|||
{
|
||||
u8 rq_ts_format_cap = MLX5_CAP_GEN(mdev, rq_ts_format);
|
||||
|
||||
return (rq_ts_format_cap == MLX5_RQ_TIMESTAMP_FORMAT_CAP_REAL_TIME ||
|
||||
rq_ts_format_cap == MLX5_RQ_TIMESTAMP_FORMAT_CAP_FREE_RUNNING_AND_REAL_TIME);
|
||||
return (rq_ts_format_cap == MLX5_TIMESTAMP_FORMAT_CAP_REAL_TIME ||
|
||||
rq_ts_format_cap ==
|
||||
MLX5_TIMESTAMP_FORMAT_CAP_FREE_RUNNING_AND_REAL_TIME);
|
||||
}
|
||||
|
||||
static inline bool mlx5_is_real_time_sq(struct mlx5_core_dev *mdev)
|
||||
{
|
||||
u8 sq_ts_format_cap = MLX5_CAP_GEN(mdev, sq_ts_format);
|
||||
|
||||
return (sq_ts_format_cap == MLX5_SQ_TIMESTAMP_FORMAT_CAP_REAL_TIME ||
|
||||
sq_ts_format_cap == MLX5_SQ_TIMESTAMP_FORMAT_CAP_FREE_RUNNING_AND_REAL_TIME);
|
||||
return (sq_ts_format_cap == MLX5_TIMESTAMP_FORMAT_CAP_REAL_TIME ||
|
||||
sq_ts_format_cap ==
|
||||
MLX5_TIMESTAMP_FORMAT_CAP_FREE_RUNNING_AND_REAL_TIME);
|
||||
}
|
||||
|
||||
typedef ktime_t (*cqe_ts_to_ns)(struct mlx5_clock *, u64);
|
||||
|
|
|
@ -953,9 +953,9 @@ struct mlx5_ifc_per_protocol_networking_offload_caps_bits {
|
|||
};
|
||||
|
||||
enum {
|
||||
MLX5_QP_TIMESTAMP_FORMAT_CAP_FREE_RUNNING = 0x0,
|
||||
MLX5_QP_TIMESTAMP_FORMAT_CAP_REAL_TIME = 0x1,
|
||||
MLX5_QP_TIMESTAMP_FORMAT_CAP_FREE_RUNNING_AND_REAL_TIME = 0x2,
|
||||
MLX5_TIMESTAMP_FORMAT_CAP_FREE_RUNNING = 0x0,
|
||||
MLX5_TIMESTAMP_FORMAT_CAP_REAL_TIME = 0x1,
|
||||
MLX5_TIMESTAMP_FORMAT_CAP_FREE_RUNNING_AND_REAL_TIME = 0x2,
|
||||
};
|
||||
|
||||
struct mlx5_ifc_roce_cap_bits {
|
||||
|
@ -1296,18 +1296,6 @@ enum {
|
|||
MLX5_STEERING_FORMAT_CONNECTX_6DX = 1,
|
||||
};
|
||||
|
||||
enum {
|
||||
MLX5_SQ_TIMESTAMP_FORMAT_CAP_FREE_RUNNING = 0x0,
|
||||
MLX5_SQ_TIMESTAMP_FORMAT_CAP_REAL_TIME = 0x1,
|
||||
MLX5_SQ_TIMESTAMP_FORMAT_CAP_FREE_RUNNING_AND_REAL_TIME = 0x2,
|
||||
};
|
||||
|
||||
enum {
|
||||
MLX5_RQ_TIMESTAMP_FORMAT_CAP_FREE_RUNNING = 0x0,
|
||||
MLX5_RQ_TIMESTAMP_FORMAT_CAP_REAL_TIME = 0x1,
|
||||
MLX5_RQ_TIMESTAMP_FORMAT_CAP_FREE_RUNNING_AND_REAL_TIME = 0x2,
|
||||
};
|
||||
|
||||
struct mlx5_ifc_cmd_hca_cap_bits {
|
||||
u8 reserved_at_0[0x1f];
|
||||
u8 vhca_resource_manager[0x1];
|
||||
|
@ -2944,9 +2932,9 @@ enum {
|
|||
};
|
||||
|
||||
enum {
|
||||
MLX5_QPC_TIMESTAMP_FORMAT_FREE_RUNNING = 0x0,
|
||||
MLX5_QPC_TIMESTAMP_FORMAT_DEFAULT = 0x1,
|
||||
MLX5_QPC_TIMESTAMP_FORMAT_REAL_TIME = 0x2,
|
||||
MLX5_TIMESTAMP_FORMAT_FREE_RUNNING = 0x0,
|
||||
MLX5_TIMESTAMP_FORMAT_DEFAULT = 0x1,
|
||||
MLX5_TIMESTAMP_FORMAT_REAL_TIME = 0x2,
|
||||
};
|
||||
|
||||
struct mlx5_ifc_qpc_bits {
|
||||
|
@ -3396,12 +3384,6 @@ enum {
|
|||
MLX5_SQC_STATE_ERR = 0x3,
|
||||
};
|
||||
|
||||
enum {
|
||||
MLX5_SQC_TIMESTAMP_FORMAT_FREE_RUNNING = 0x0,
|
||||
MLX5_SQC_TIMESTAMP_FORMAT_DEFAULT = 0x1,
|
||||
MLX5_SQC_TIMESTAMP_FORMAT_REAL_TIME = 0x2,
|
||||
};
|
||||
|
||||
struct mlx5_ifc_sqc_bits {
|
||||
u8 rlky[0x1];
|
||||
u8 cd_master[0x1];
|
||||
|
@ -3507,12 +3489,6 @@ enum {
|
|||
MLX5_RQC_STATE_ERR = 0x3,
|
||||
};
|
||||
|
||||
enum {
|
||||
MLX5_RQC_TIMESTAMP_FORMAT_FREE_RUNNING = 0x0,
|
||||
MLX5_RQC_TIMESTAMP_FORMAT_DEFAULT = 0x1,
|
||||
MLX5_RQC_TIMESTAMP_FORMAT_REAL_TIME = 0x2,
|
||||
};
|
||||
|
||||
struct mlx5_ifc_rqc_bits {
|
||||
u8 rlky[0x1];
|
||||
u8 delay_drop_en[0x1];
|
||||
|
|
|
@ -550,8 +550,8 @@ static inline const char *mlx5_qp_state_str(int state)
|
|||
static inline int mlx5_get_qp_default_ts(struct mlx5_core_dev *dev)
|
||||
{
|
||||
return !MLX5_CAP_ROCE(dev, qp_ts_format) ?
|
||||
MLX5_QPC_TIMESTAMP_FORMAT_FREE_RUNNING :
|
||||
MLX5_QPC_TIMESTAMP_FORMAT_DEFAULT;
|
||||
MLX5_TIMESTAMP_FORMAT_FREE_RUNNING :
|
||||
MLX5_TIMESTAMP_FORMAT_DEFAULT;
|
||||
}
|
||||
|
||||
#endif /* MLX5_QP_H */
|
||||
|
|
Loading…
Reference in New Issue