RDMA/mlx5: Refactor get_ts_format functions to simplify code
authorAharon Landau <aharonl@nvidia.com>
Wed, 16 Jun 2021 07:57:38 +0000 (10:57 +0300)
committerLeon Romanovsky <leonro@nvidia.com>
Tue, 22 Jun 2021 06:35:16 +0000 (09:35 +0300)
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>
drivers/infiniband/hw/mlx5/qp.c
drivers/net/ethernet/mellanox/mlx5/core/en_main.c
drivers/net/ethernet/mellanox/mlx5/core/lib/clock.h
include/linux/mlx5/mlx5_ifc.h
include/linux/mlx5/qp.h

index 9282eb10bfaed2ff7cbee86ca0e51ac3da3af2df..0e3babac62db63c353f94beed08c5f884fefd5f2 100644 (file)
@@ -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;
-
-       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");
+       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 (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,
index ec6bafe7a2e596c5b1d78be4c00aa8adc1efae18..039427a2a6c1f1415cb148af6e137be127e4ece8 100644 (file)
@@ -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);
 
index ceae6bc378e00d5bf2cd49ce1392d317c73274f2..bd95b9f8d14395c30e57ce74098dd06c8b724e96 100644 (file)
@@ -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);
index eb86e80e4643f775ac155ab06818ae53a04658a8..668e1d016066d6c698f086e419ef53c46da49915 100644 (file)
@@ -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];
index b7deb790f25769ba0d92d91c3483a63c815dd27d..61e48d459b23c308df9338921678ff862344a2e9 100644 (file)
@@ -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 */