Skip to content

Commit 68ad4d1

Browse files
committed
Merge branch 'mlx5_timestamp' into rdma.git for-next
Leon Romanovsky says: ==================== Add an extra timestamp format for mlx5_ib device. ==================== Based on the mlx5-next branch at git://git.kernel.org/pub/scm/linux/kernel/git/mellanox/linux due to dependencies. Signed-off-by: Jason Gunthorpe <[email protected]> * branch 'mlx5_timestamp': RDMA/mlx5: Fail QP creation if the device can not support the CQE TS net/mlx5: Add new timestamp mode bits
2 parents 7232c13 + 2fe8d4b commit 68ad4d1

File tree

2 files changed

+145
-13
lines changed

2 files changed

+145
-13
lines changed

drivers/infiniband/hw/mlx5/qp.c

Lines changed: 96 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1078,6 +1078,7 @@ static int _create_kernel_qp(struct mlx5_ib_dev *dev,
10781078

10791079
qpc = MLX5_ADDR_OF(create_qp_in, *in, qpc);
10801080
MLX5_SET(qpc, qpc, uar_page, uar_index);
1081+
MLX5_SET(qpc, qpc, ts_format, MLX5_QPC_TIMESTAMP_FORMAT_DEFAULT);
10811082
MLX5_SET(qpc, qpc, log_page_size, qp->buf.page_shift - MLX5_ADAPTER_PAGE_SHIFT);
10821083

10831084
/* Set "fast registration enabled" for all kernel QPs */
@@ -1172,10 +1173,72 @@ static void destroy_flow_rule_vport_sq(struct mlx5_ib_sq *sq)
11721173
sq->flow_rule = NULL;
11731174
}
11741175

1176+
static int get_rq_ts_format(struct mlx5_ib_dev *dev, struct mlx5_ib_cq *send_cq)
1177+
{
1178+
bool fr_supported =
1179+
MLX5_CAP_GEN(dev->mdev, rq_ts_format) ==
1180+
MLX5_RQ_TIMESTAMP_FORMAT_CAP_FREE_RUNNING ||
1181+
MLX5_CAP_GEN(dev->mdev, rq_ts_format) ==
1182+
MLX5_RQ_TIMESTAMP_FORMAT_CAP_FREE_RUNNING_AND_REAL_TIME;
1183+
1184+
if (send_cq->create_flags & IB_UVERBS_CQ_FLAGS_TIMESTAMP_COMPLETION) {
1185+
if (!fr_supported) {
1186+
mlx5_ib_dbg(dev, "Free running TS format is not supported\n");
1187+
return -EOPNOTSUPP;
1188+
}
1189+
return MLX5_RQC_TIMESTAMP_FORMAT_FREE_RUNNING;
1190+
}
1191+
return MLX5_RQC_TIMESTAMP_FORMAT_DEFAULT;
1192+
}
1193+
1194+
static int get_sq_ts_format(struct mlx5_ib_dev *dev, struct mlx5_ib_cq *send_cq)
1195+
{
1196+
bool fr_supported =
1197+
MLX5_CAP_GEN(dev->mdev, sq_ts_format) ==
1198+
MLX5_SQ_TIMESTAMP_FORMAT_CAP_FREE_RUNNING ||
1199+
MLX5_CAP_GEN(dev->mdev, sq_ts_format) ==
1200+
MLX5_SQ_TIMESTAMP_FORMAT_CAP_FREE_RUNNING_AND_REAL_TIME;
1201+
1202+
if (send_cq->create_flags & IB_UVERBS_CQ_FLAGS_TIMESTAMP_COMPLETION) {
1203+
if (!fr_supported) {
1204+
mlx5_ib_dbg(dev, "Free running TS format is not supported\n");
1205+
return -EOPNOTSUPP;
1206+
}
1207+
return MLX5_SQC_TIMESTAMP_FORMAT_FREE_RUNNING;
1208+
}
1209+
return MLX5_SQC_TIMESTAMP_FORMAT_DEFAULT;
1210+
}
1211+
1212+
static int get_qp_ts_format(struct mlx5_ib_dev *dev, struct mlx5_ib_cq *send_cq,
1213+
struct mlx5_ib_cq *recv_cq)
1214+
{
1215+
bool fr_supported =
1216+
MLX5_CAP_ROCE(dev->mdev, qp_ts_format) ==
1217+
MLX5_QP_TIMESTAMP_FORMAT_CAP_FREE_RUNNING ||
1218+
MLX5_CAP_ROCE(dev->mdev, qp_ts_format) ==
1219+
MLX5_QP_TIMESTAMP_FORMAT_CAP_FREE_RUNNING_AND_REAL_TIME;
1220+
int ts_format = MLX5_QPC_TIMESTAMP_FORMAT_DEFAULT;
1221+
1222+
if (recv_cq &&
1223+
recv_cq->create_flags & IB_UVERBS_CQ_FLAGS_TIMESTAMP_COMPLETION)
1224+
ts_format = MLX5_QPC_TIMESTAMP_FORMAT_FREE_RUNNING;
1225+
1226+
if (send_cq &&
1227+
send_cq->create_flags & IB_UVERBS_CQ_FLAGS_TIMESTAMP_COMPLETION)
1228+
ts_format = MLX5_QPC_TIMESTAMP_FORMAT_FREE_RUNNING;
1229+
1230+
if (ts_format == MLX5_QPC_TIMESTAMP_FORMAT_FREE_RUNNING &&
1231+
!fr_supported) {
1232+
mlx5_ib_dbg(dev, "Free running TS format is not supported\n");
1233+
return -EOPNOTSUPP;
1234+
}
1235+
return ts_format;
1236+
}
1237+
11751238
static int create_raw_packet_qp_sq(struct mlx5_ib_dev *dev,
11761239
struct ib_udata *udata,
11771240
struct mlx5_ib_sq *sq, void *qpin,
1178-
struct ib_pd *pd)
1241+
struct ib_pd *pd, struct mlx5_ib_cq *cq)
11791242
{
11801243
struct mlx5_ib_ubuffer *ubuffer = &sq->ubuffer;
11811244
__be64 *pas;
@@ -1187,6 +1250,11 @@ static int create_raw_packet_qp_sq(struct mlx5_ib_dev *dev,
11871250
int err;
11881251
unsigned int page_offset_quantized;
11891252
unsigned long page_size;
1253+
int ts_format;
1254+
1255+
ts_format = get_sq_ts_format(dev, cq);
1256+
if (ts_format < 0)
1257+
return ts_format;
11901258

11911259
sq->ubuffer.umem = ib_umem_get(&dev->ib_dev, ubuffer->buf_addr,
11921260
ubuffer->buf_size, 0);
@@ -1215,6 +1283,7 @@ static int create_raw_packet_qp_sq(struct mlx5_ib_dev *dev,
12151283
if (MLX5_CAP_ETH(dev->mdev, multi_pkt_send_wqe))
12161284
MLX5_SET(sqc, sqc, allow_multi_pkt_send_wqe, 1);
12171285
MLX5_SET(sqc, sqc, state, MLX5_SQC_STATE_RST);
1286+
MLX5_SET(sqc, sqc, ts_format, ts_format);
12181287
MLX5_SET(sqc, sqc, user_index, MLX5_GET(qpc, qpc, user_index));
12191288
MLX5_SET(sqc, sqc, cqn, MLX5_GET(qpc, qpc, cqn_snd));
12201289
MLX5_SET(sqc, sqc, tis_lst_sz, 1);
@@ -1263,7 +1332,7 @@ static void destroy_raw_packet_qp_sq(struct mlx5_ib_dev *dev,
12631332

12641333
static int create_raw_packet_qp_rq(struct mlx5_ib_dev *dev,
12651334
struct mlx5_ib_rq *rq, void *qpin,
1266-
struct ib_pd *pd)
1335+
struct ib_pd *pd, struct mlx5_ib_cq *cq)
12671336
{
12681337
struct mlx5_ib_qp *mqp = rq->base.container_mibqp;
12691338
__be64 *pas;
@@ -1274,9 +1343,14 @@ static int create_raw_packet_qp_rq(struct mlx5_ib_dev *dev,
12741343
struct ib_umem *umem = rq->base.ubuffer.umem;
12751344
unsigned int page_offset_quantized;
12761345
unsigned long page_size = 0;
1346+
int ts_format;
12771347
size_t inlen;
12781348
int err;
12791349

1350+
ts_format = get_rq_ts_format(dev, cq);
1351+
if (ts_format < 0)
1352+
return ts_format;
1353+
12801354
page_size = mlx5_umem_find_best_quantized_pgoff(umem, wq, log_wq_pg_sz,
12811355
MLX5_ADAPTER_PAGE_SHIFT,
12821356
page_offset, 64,
@@ -1296,6 +1370,7 @@ static int create_raw_packet_qp_rq(struct mlx5_ib_dev *dev,
12961370
MLX5_SET(rqc, rqc, vsd, 1);
12971371
MLX5_SET(rqc, rqc, mem_rq_type, MLX5_RQC_MEM_RQ_TYPE_MEMORY_RQ_INLINE);
12981372
MLX5_SET(rqc, rqc, state, MLX5_RQC_STATE_RST);
1373+
MLX5_SET(rqc, rqc, ts_format, ts_format);
12991374
MLX5_SET(rqc, rqc, flush_in_error_en, 1);
13001375
MLX5_SET(rqc, rqc, user_index, MLX5_GET(qpc, qpc, user_index));
13011376
MLX5_SET(rqc, rqc, cqn, MLX5_GET(qpc, qpc, cqn_rcv));
@@ -1393,10 +1468,10 @@ static int create_raw_packet_qp_tir(struct mlx5_ib_dev *dev,
13931468
}
13941469

13951470
static int create_raw_packet_qp(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp,
1396-
u32 *in, size_t inlen,
1397-
struct ib_pd *pd,
1471+
u32 *in, size_t inlen, struct ib_pd *pd,
13981472
struct ib_udata *udata,
1399-
struct mlx5_ib_create_qp_resp *resp)
1473+
struct mlx5_ib_create_qp_resp *resp,
1474+
struct ib_qp_init_attr *init_attr)
14001475
{
14011476
struct mlx5_ib_raw_packet_qp *raw_packet_qp = &qp->raw_packet_qp;
14021477
struct mlx5_ib_sq *sq = &raw_packet_qp->sq;
@@ -1415,7 +1490,8 @@ static int create_raw_packet_qp(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp,
14151490
if (err)
14161491
return err;
14171492

1418-
err = create_raw_packet_qp_sq(dev, udata, sq, in, pd);
1493+
err = create_raw_packet_qp_sq(dev, udata, sq, in, pd,
1494+
to_mcq(init_attr->send_cq));
14191495
if (err)
14201496
goto err_destroy_tis;
14211497

@@ -1437,7 +1513,8 @@ static int create_raw_packet_qp(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp,
14371513
rq->flags |= MLX5_IB_RQ_CVLAN_STRIPPING;
14381514
if (qp->flags & IB_QP_CREATE_PCI_WRITE_END_PADDING)
14391515
rq->flags |= MLX5_IB_RQ_PCI_WRITE_END_PADDING;
1440-
err = create_raw_packet_qp_rq(dev, rq, in, pd);
1516+
err = create_raw_packet_qp_rq(dev, rq, in, pd,
1517+
to_mcq(init_attr->recv_cq));
14411518
if (err)
14421519
goto err_destroy_sq;
14431520

@@ -1907,6 +1984,7 @@ static int create_user_qp(struct mlx5_ib_dev *dev, struct ib_pd *pd,
19071984
struct mlx5_ib_cq *recv_cq;
19081985
unsigned long flags;
19091986
struct mlx5_ib_qp_base *base;
1987+
int ts_format;
19101988
int mlx5_st;
19111989
void *qpc;
19121990
u32 *in;
@@ -1944,6 +2022,13 @@ static int create_user_qp(struct mlx5_ib_dev *dev, struct ib_pd *pd,
19442022
if (ucmd->sq_wqe_count > (1 << MLX5_CAP_GEN(mdev, log_max_qp_sz)))
19452023
return -EINVAL;
19462024

2025+
if (init_attr->qp_type != IB_QPT_RAW_PACKET) {
2026+
ts_format = get_qp_ts_format(dev, to_mcq(init_attr->send_cq),
2027+
to_mcq(init_attr->recv_cq));
2028+
if (ts_format < 0)
2029+
return ts_format;
2030+
}
2031+
19472032
err = _create_user_qp(dev, pd, qp, udata, init_attr, &in, &params->resp,
19482033
&inlen, base, ucmd);
19492034
if (err)
@@ -1992,6 +2077,9 @@ static int create_user_qp(struct mlx5_ib_dev *dev, struct ib_pd *pd,
19922077
MLX5_SET(qpc, qpc, log_rq_size, ilog2(qp->rq.wqe_cnt));
19932078
}
19942079

2080+
if (init_attr->qp_type != IB_QPT_RAW_PACKET)
2081+
MLX5_SET(qpc, qpc, ts_format, ts_format);
2082+
19952083
MLX5_SET(qpc, qpc, rq_type, get_rx_type(qp, init_attr));
19962084

19972085
if (qp->sq.wqe_cnt) {
@@ -2046,7 +2134,7 @@ static int create_user_qp(struct mlx5_ib_dev *dev, struct ib_pd *pd,
20462134
qp->raw_packet_qp.sq.ubuffer.buf_addr = ucmd->sq_buf_addr;
20472135
raw_packet_qp_copy_info(qp, &qp->raw_packet_qp);
20482136
err = create_raw_packet_qp(dev, qp, in, inlen, pd, udata,
2049-
&params->resp);
2137+
&params->resp, init_attr);
20502138
} else
20512139
err = mlx5_qpc_create_qp(dev, &base->mqp, in, inlen, out);
20522140

include/linux/mlx5/mlx5_ifc.h

Lines changed: 49 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -932,11 +932,18 @@ struct mlx5_ifc_per_protocol_networking_offload_caps_bits {
932932
u8 reserved_at_200[0x600];
933933
};
934934

935+
enum {
936+
MLX5_QP_TIMESTAMP_FORMAT_CAP_FREE_RUNNING = 0x0,
937+
MLX5_QP_TIMESTAMP_FORMAT_CAP_REAL_TIME = 0x1,
938+
MLX5_QP_TIMESTAMP_FORMAT_CAP_FREE_RUNNING_AND_REAL_TIME = 0x2,
939+
};
940+
935941
struct mlx5_ifc_roce_cap_bits {
936942
u8 roce_apm[0x1];
937943
u8 reserved_at_1[0x3];
938944
u8 sw_r_roce_src_udp_port[0x1];
939-
u8 reserved_at_5[0x1b];
945+
u8 reserved_at_5[0x19];
946+
u8 qp_ts_format[0x2];
940947

941948
u8 reserved_at_20[0x60];
942949

@@ -1253,6 +1260,18 @@ enum {
12531260
MLX5_STEERING_FORMAT_CONNECTX_6DX = 1,
12541261
};
12551262

1263+
enum {
1264+
MLX5_SQ_TIMESTAMP_FORMAT_CAP_FREE_RUNNING = 0x0,
1265+
MLX5_SQ_TIMESTAMP_FORMAT_CAP_REAL_TIME = 0x1,
1266+
MLX5_SQ_TIMESTAMP_FORMAT_CAP_FREE_RUNNING_AND_REAL_TIME = 0x2,
1267+
};
1268+
1269+
enum {
1270+
MLX5_RQ_TIMESTAMP_FORMAT_CAP_FREE_RUNNING = 0x0,
1271+
MLX5_RQ_TIMESTAMP_FORMAT_CAP_REAL_TIME = 0x1,
1272+
MLX5_RQ_TIMESTAMP_FORMAT_CAP_FREE_RUNNING_AND_REAL_TIME = 0x2,
1273+
};
1274+
12561275
struct mlx5_ifc_cmd_hca_cap_bits {
12571276
u8 reserved_at_0[0x1f];
12581277
u8 vhca_resource_manager[0x1];
@@ -1564,7 +1583,8 @@ struct mlx5_ifc_cmd_hca_cap_bits {
15641583

15651584
u8 general_obj_types[0x40];
15661585

1567-
u8 reserved_at_440[0x4];
1586+
u8 sq_ts_format[0x2];
1587+
u8 rq_ts_format[0x2];
15681588
u8 steering_format_version[0x4];
15691589
u8 create_qp_start_hint[0x18];
15701590

@@ -2869,6 +2889,12 @@ enum {
28692889
MLX5_QPC_CS_RES_UP_TO_64B = 0x2,
28702890
};
28712891

2892+
enum {
2893+
MLX5_QPC_TIMESTAMP_FORMAT_FREE_RUNNING = 0x0,
2894+
MLX5_QPC_TIMESTAMP_FORMAT_DEFAULT = 0x1,
2895+
MLX5_QPC_TIMESTAMP_FORMAT_REAL_TIME = 0x2,
2896+
};
2897+
28722898
struct mlx5_ifc_qpc_bits {
28732899
u8 state[0x4];
28742900
u8 lag_tx_port_affinity[0x4];
@@ -2897,7 +2923,9 @@ struct mlx5_ifc_qpc_bits {
28972923
u8 log_rq_stride[0x3];
28982924
u8 no_sq[0x1];
28992925
u8 log_sq_size[0x4];
2900-
u8 reserved_at_55[0x6];
2926+
u8 reserved_at_55[0x3];
2927+
u8 ts_format[0x2];
2928+
u8 reserved_at_5a[0x1];
29012929
u8 rlky[0x1];
29022930
u8 ulp_stateless_offload_mode[0x4];
29032931

@@ -3313,6 +3341,12 @@ enum {
33133341
MLX5_SQC_STATE_ERR = 0x3,
33143342
};
33153343

3344+
enum {
3345+
MLX5_SQC_TIMESTAMP_FORMAT_FREE_RUNNING = 0x0,
3346+
MLX5_SQC_TIMESTAMP_FORMAT_DEFAULT = 0x1,
3347+
MLX5_SQC_TIMESTAMP_FORMAT_REAL_TIME = 0x2,
3348+
};
3349+
33163350
struct mlx5_ifc_sqc_bits {
33173351
u8 rlky[0x1];
33183352
u8 cd_master[0x1];
@@ -3324,7 +3358,9 @@ struct mlx5_ifc_sqc_bits {
33243358
u8 reg_umr[0x1];
33253359
u8 allow_swp[0x1];
33263360
u8 hairpin[0x1];
3327-
u8 reserved_at_f[0x11];
3361+
u8 reserved_at_f[0xb];
3362+
u8 ts_format[0x2];
3363+
u8 reserved_at_1c[0x4];
33283364

33293365
u8 reserved_at_20[0x8];
33303366
u8 user_index[0x18];
@@ -3415,6 +3451,12 @@ enum {
34153451
MLX5_RQC_STATE_ERR = 0x3,
34163452
};
34173453

3454+
enum {
3455+
MLX5_RQC_TIMESTAMP_FORMAT_FREE_RUNNING = 0x0,
3456+
MLX5_RQC_TIMESTAMP_FORMAT_DEFAULT = 0x1,
3457+
MLX5_RQC_TIMESTAMP_FORMAT_REAL_TIME = 0x2,
3458+
};
3459+
34183460
struct mlx5_ifc_rqc_bits {
34193461
u8 rlky[0x1];
34203462
u8 delay_drop_en[0x1];
@@ -3425,7 +3467,9 @@ struct mlx5_ifc_rqc_bits {
34253467
u8 reserved_at_c[0x1];
34263468
u8 flush_in_error_en[0x1];
34273469
u8 hairpin[0x1];
3428-
u8 reserved_at_f[0x11];
3470+
u8 reserved_at_f[0xb];
3471+
u8 ts_format[0x2];
3472+
u8 reserved_at_1c[0x4];
34293473

34303474
u8 reserved_at_20[0x8];
34313475
u8 user_index[0x18];

0 commit comments

Comments
 (0)