Skip to content

Commit a24a29c

Browse files
fsl-latifrleon
authored andcommitted
RDMA/irdma: Add Atomic Operations support
Extend irdma to support atomic operations, namely Compare and Swap and Fetch and Add, for GEN3 devices. Signed-off-by: Faisal Latif <faisal.latif@intel.com> Signed-off-by: Tatyana Nikolova <tatyana.e.nikolova@intel.com> Link: https://patch.msgid.link/20250827152545.2056-15-tatyana.e.nikolova@intel.com Tested-by: Jacob Moroni <jmoroni@google.com> Signed-off-by: Leon Romanovsky <leon@kernel.org>
1 parent eb31dfc commit a24a29c

8 files changed

Lines changed: 207 additions & 4 deletions

File tree

drivers/infiniband/hw/irdma/ctrl.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1110,6 +1110,8 @@ static void irdma_sc_qp_setctx_roce_gen_3(struct irdma_sc_qp *qp,
11101110
FIELD_PREP(IRDMAQPC_UDPRIVCQENABLE,
11111111
roce_info->udprivcq_en) |
11121112
FIELD_PREP(IRDMAQPC_PRIVEN, roce_info->priv_mode_en) |
1113+
FIELD_PREP(IRDMAQPC_REMOTE_ATOMIC_EN,
1114+
info->remote_atomics_en) |
11131115
FIELD_PREP(IRDMAQPC_TIMELYENABLE, roce_info->timely_en));
11141116
set_64bit_val(qp_ctx, 168,
11151117
FIELD_PREP(IRDMAQPC_QPCOMPCTX, info->qp_compl_ctx));
@@ -1490,6 +1492,8 @@ static int irdma_sc_alloc_stag(struct irdma_sc_dev *dev,
14901492
FIELD_PREP(IRDMA_CQPSQ_STAG_REMACCENABLED, info->remote_access) |
14911493
FIELD_PREP(IRDMA_CQPSQ_STAG_USEHMCFNIDX, info->use_hmc_fcn_index) |
14921494
FIELD_PREP(IRDMA_CQPSQ_STAG_USEPFRID, info->use_pf_rid) |
1495+
FIELD_PREP(IRDMA_CQPSQ_STAG_REMOTE_ATOMIC_EN,
1496+
info->remote_atomics_en) |
14931497
FIELD_PREP(IRDMA_CQPSQ_WQEVALID, cqp->polarity);
14941498
dma_wmb(); /* make sure WQE is written before valid bit is set */
14951499

@@ -1582,6 +1586,8 @@ static int irdma_sc_mr_reg_non_shared(struct irdma_sc_dev *dev,
15821586
FIELD_PREP(IRDMA_CQPSQ_STAG_VABASEDTO, addr_type) |
15831587
FIELD_PREP(IRDMA_CQPSQ_STAG_USEHMCFNIDX, info->use_hmc_fcn_index) |
15841588
FIELD_PREP(IRDMA_CQPSQ_STAG_USEPFRID, info->use_pf_rid) |
1589+
FIELD_PREP(IRDMA_CQPSQ_STAG_REMOTE_ATOMIC_EN,
1590+
info->remote_atomics_en) |
15851591
FIELD_PREP(IRDMA_CQPSQ_WQEVALID, cqp->polarity);
15861592
dma_wmb(); /* make sure WQE is written before valid bit is set */
15871593

@@ -1740,6 +1746,7 @@ int irdma_sc_mr_fast_register(struct irdma_sc_qp *qp,
17401746
FIELD_PREP(IRDMAQPSQ_READFENCE, info->read_fence) |
17411747
FIELD_PREP(IRDMAQPSQ_LOCALFENCE, info->local_fence) |
17421748
FIELD_PREP(IRDMAQPSQ_SIGCOMPL, info->signaled) |
1749+
FIELD_PREP(IRDMAQPSQ_REMOTE_ATOMICS_EN, info->remote_atomics_en) |
17431750
FIELD_PREP(IRDMAQPSQ_VALID, qp->qp_uk.swqe_polarity);
17441751
dma_wmb(); /* make sure WQE is written before valid bit is set */
17451752

@@ -5542,6 +5549,10 @@ int irdma_get_rdma_features(struct irdma_sc_dev *dev)
55425549
}
55435550
dev->feature_info[feat_type] = temp;
55445551
}
5552+
5553+
if (dev->feature_info[IRDMA_FTN_FLAGS] & IRDMA_ATOMICS_ALLOWED_BIT)
5554+
dev->hw_attrs.uk_attrs.feature_flags |= IRDMA_FEATURE_ATOMIC_OPS;
5555+
55455556
exit:
55465557
dma_free_coherent(dev->hw->device, feat_buf.size, feat_buf.va,
55475558
feat_buf.pa);

drivers/infiniband/hw/irdma/defs.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,8 @@ enum irdma_protocol_used {
189189
#define IRDMAQP_OP_RDMA_READ_LOC_INV 0x0b
190190
#define IRDMAQP_OP_NOP 0x0c
191191
#define IRDMAQP_OP_RDMA_WRITE_SOL 0x0d
192+
#define IRDMAQP_OP_ATOMIC_FETCH_ADD 0x0f
193+
#define IRDMAQP_OP_ATOMIC_COMPARE_SWAP_ADD 0x11
192194
#define IRDMAQP_OP_GEN_RTS_AE 0x30
193195

194196
enum irdma_cqp_op_type {
@@ -694,7 +696,8 @@ enum irdma_cqp_op_type {
694696
#define IRDMA_CQPSQ_STAG_USEPFRID BIT_ULL(61)
695697

696698
#define IRDMA_CQPSQ_STAG_PBA IRDMA_CQPHC_QPCTX
697-
#define IRDMA_CQPSQ_STAG_HMCFNIDX GENMASK_ULL(5, 0)
699+
#define IRDMA_CQPSQ_STAG_HMCFNIDX GENMASK_ULL(15, 0)
700+
#define IRDMA_CQPSQ_STAG_REMOTE_ATOMIC_EN BIT_ULL(61)
698701

699702
#define IRDMA_CQPSQ_STAG_FIRSTPMPBLIDX GENMASK_ULL(27, 0)
700703
#define IRDMA_CQPSQ_QUERYSTAG_IDX IRDMA_CQPSQ_STAG_IDX
@@ -981,6 +984,9 @@ enum irdma_cqp_op_type {
981984

982985
#define IRDMAQPSQ_REMTO IRDMA_CQPHC_QPCTX
983986

987+
#define IRDMAQPSQ_STAG GENMASK_ULL(31, 0)
988+
#define IRDMAQPSQ_REMOTE_STAG GENMASK_ULL(31, 0)
989+
984990
#define IRDMAQPSQ_STAGRIGHTS GENMASK_ULL(52, 48)
985991
#define IRDMAQPSQ_VABASEDTO BIT_ULL(53)
986992
#define IRDMAQPSQ_MEMWINDOWTYPE BIT_ULL(54)
@@ -991,6 +997,8 @@ enum irdma_cqp_op_type {
991997

992998
#define IRDMAQPSQ_BASEVA_TO_FBO IRDMA_CQPHC_QPCTX
993999

1000+
#define IRDMAQPSQ_REMOTE_ATOMICS_EN BIT_ULL(55)
1001+
9941002
#define IRDMAQPSQ_LOCSTAG GENMASK_ULL(31, 0)
9951003

9961004
#define IRDMAQPSQ_STAGKEY GENMASK_ULL(7, 0)

drivers/infiniband/hw/irdma/ig3rdma_hw.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -120,9 +120,6 @@ void ig3rdma_init_hw(struct irdma_sc_dev *dev)
120120
dev->hw_attrs.first_hw_vf_fpm_id = 0;
121121
dev->hw_attrs.max_hw_vf_fpm_id = IG3_MAX_APFS + IG3_MAX_AVFS;
122122
dev->hw_attrs.uk_attrs.feature_flags |= IRDMA_FEATURE_64_BYTE_CQE;
123-
if (dev->feature_info[IRDMA_FTN_FLAGS] & IRDMA_ATOMICS_ALLOWED_BIT)
124-
dev->hw_attrs.uk_attrs.feature_flags |=
125-
IRDMA_FEATURE_ATOMIC_OPS;
126123
dev->hw_attrs.uk_attrs.feature_flags |= IRDMA_FEATURE_CQE_TIMESTAMPING;
127124

128125
dev->hw_attrs.uk_attrs.feature_flags |= IRDMA_FEATURE_SRQ;

drivers/infiniband/hw/irdma/type.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1087,6 +1087,7 @@ struct irdma_qp_host_ctx_info {
10871087
u32 srq_id;
10881088
u32 rem_endpoint_idx;
10891089
u16 stats_idx;
1090+
bool remote_atomics_en:1;
10901091
bool srq_valid:1;
10911092
bool tcp_info_valid:1;
10921093
bool iwarp_info_valid:1;
@@ -1127,6 +1128,7 @@ struct irdma_allocate_stag_info {
11271128
bool use_hmc_fcn_index:1;
11281129
bool use_pf_rid:1;
11291130
bool all_memory:1;
1131+
bool remote_atomics_en:1;
11301132
u16 hmc_fcn_index;
11311133
};
11321134

@@ -1155,6 +1157,7 @@ struct irdma_reg_ns_stag_info {
11551157
u8 hmc_fcn_index;
11561158
bool use_pf_rid:1;
11571159
bool all_memory:1;
1160+
bool remote_atomics_en:1;
11581161
};
11591162

11601163
struct irdma_fast_reg_stag_info {
@@ -1178,6 +1181,7 @@ struct irdma_fast_reg_stag_info {
11781181
u8 hmc_fcn_index;
11791182
bool use_pf_rid:1;
11801183
bool defer_flag:1;
1184+
bool remote_atomics_en:1;
11811185
};
11821186

11831187
struct irdma_dealloc_stag_info {

drivers/infiniband/hw/irdma/uk.c

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,108 @@ int irdma_uk_rdma_write(struct irdma_qp_uk *qp, struct irdma_post_sq_info *info,
337337
return 0;
338338
}
339339

340+
/**
341+
* irdma_uk_atomic_fetch_add - atomic fetch and add operation
342+
* @qp: hw qp ptr
343+
* @info: post sq information
344+
* @post_sq: flag to post sq
345+
*/
346+
int irdma_uk_atomic_fetch_add(struct irdma_qp_uk *qp,
347+
struct irdma_post_sq_info *info, bool post_sq)
348+
{
349+
struct irdma_atomic_fetch_add *op_info;
350+
u32 total_size = 0;
351+
u16 quanta = 2;
352+
u32 wqe_idx;
353+
__le64 *wqe;
354+
u64 hdr;
355+
356+
op_info = &info->op.atomic_fetch_add;
357+
wqe = irdma_qp_get_next_send_wqe(qp, &wqe_idx, quanta, total_size,
358+
info);
359+
if (!wqe)
360+
return -ENOMEM;
361+
362+
set_64bit_val(wqe, 0, op_info->tagged_offset);
363+
set_64bit_val(wqe, 8,
364+
FIELD_PREP(IRDMAQPSQ_STAG, op_info->stag));
365+
set_64bit_val(wqe, 16, op_info->remote_tagged_offset);
366+
367+
hdr = FIELD_PREP(IRDMAQPSQ_ADDFRAGCNT, 1) |
368+
FIELD_PREP(IRDMAQPSQ_REMOTE_STAG, op_info->remote_stag) |
369+
FIELD_PREP(IRDMAQPSQ_OPCODE, IRDMAQP_OP_ATOMIC_FETCH_ADD) |
370+
FIELD_PREP(IRDMAQPSQ_READFENCE, info->read_fence) |
371+
FIELD_PREP(IRDMAQPSQ_LOCALFENCE, info->local_fence) |
372+
FIELD_PREP(IRDMAQPSQ_SIGCOMPL, info->signaled) |
373+
FIELD_PREP(IRDMAQPSQ_VALID, qp->swqe_polarity);
374+
375+
set_64bit_val(wqe, 32, op_info->fetch_add_data_bytes);
376+
set_64bit_val(wqe, 40, 0);
377+
set_64bit_val(wqe, 48, 0);
378+
set_64bit_val(wqe, 56,
379+
FIELD_PREP(IRDMAQPSQ_VALID, qp->swqe_polarity));
380+
381+
dma_wmb(); /* make sure WQE is populated before valid bit is set */
382+
383+
set_64bit_val(wqe, 24, hdr);
384+
385+
if (post_sq)
386+
irdma_uk_qp_post_wr(qp);
387+
388+
return 0;
389+
}
390+
391+
/**
392+
* irdma_uk_atomic_compare_swap - atomic compare and swap operation
393+
* @qp: hw qp ptr
394+
* @info: post sq information
395+
* @post_sq: flag to post sq
396+
*/
397+
int irdma_uk_atomic_compare_swap(struct irdma_qp_uk *qp,
398+
struct irdma_post_sq_info *info, bool post_sq)
399+
{
400+
struct irdma_atomic_compare_swap *op_info;
401+
u32 total_size = 0;
402+
u16 quanta = 2;
403+
u32 wqe_idx;
404+
__le64 *wqe;
405+
u64 hdr;
406+
407+
op_info = &info->op.atomic_compare_swap;
408+
wqe = irdma_qp_get_next_send_wqe(qp, &wqe_idx, quanta, total_size,
409+
info);
410+
if (!wqe)
411+
return -ENOMEM;
412+
413+
set_64bit_val(wqe, 0, op_info->tagged_offset);
414+
set_64bit_val(wqe, 8,
415+
FIELD_PREP(IRDMAQPSQ_STAG, op_info->stag));
416+
set_64bit_val(wqe, 16, op_info->remote_tagged_offset);
417+
418+
hdr = FIELD_PREP(IRDMAQPSQ_ADDFRAGCNT, 1) |
419+
FIELD_PREP(IRDMAQPSQ_REMOTE_STAG, op_info->remote_stag) |
420+
FIELD_PREP(IRDMAQPSQ_OPCODE, IRDMAQP_OP_ATOMIC_COMPARE_SWAP_ADD) |
421+
FIELD_PREP(IRDMAQPSQ_READFENCE, info->read_fence) |
422+
FIELD_PREP(IRDMAQPSQ_LOCALFENCE, info->local_fence) |
423+
FIELD_PREP(IRDMAQPSQ_SIGCOMPL, info->signaled) |
424+
FIELD_PREP(IRDMAQPSQ_VALID, qp->swqe_polarity);
425+
426+
set_64bit_val(wqe, 32, op_info->swap_data_bytes);
427+
set_64bit_val(wqe, 40, op_info->compare_data_bytes);
428+
set_64bit_val(wqe, 48, 0);
429+
set_64bit_val(wqe, 56,
430+
FIELD_PREP(IRDMAQPSQ_VALID, qp->swqe_polarity));
431+
432+
dma_wmb(); /* make sure WQE is populated before valid bit is set */
433+
434+
set_64bit_val(wqe, 24, hdr);
435+
436+
if (post_sq)
437+
irdma_uk_qp_post_wr(qp);
438+
439+
return 0;
440+
}
441+
340442
/**
341443
* irdma_uk_srq_post_receive - post a receive wqe to a shared rq
342444
* @srq: shared rq ptr

drivers/infiniband/hw/irdma/user.h

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@
4141
#define IRDMA_OP_TYPE_INV_STAG 0x0a
4242
#define IRDMA_OP_TYPE_RDMA_READ_INV_STAG 0x0b
4343
#define IRDMA_OP_TYPE_NOP 0x0c
44+
#define IRDMA_OP_TYPE_ATOMIC_FETCH_AND_ADD 0x0f
45+
#define IRDMA_OP_TYPE_ATOMIC_COMPARE_AND_SWAP 0x11
4446
#define IRDMA_OP_TYPE_REC 0x3e
4547
#define IRDMA_OP_TYPE_REC_IMM 0x3f
4648

@@ -205,6 +207,24 @@ struct irdma_bind_window {
205207
bool ena_writes:1;
206208
irdma_stag mw_stag;
207209
bool mem_window_type_1:1;
210+
bool remote_atomics_en:1;
211+
};
212+
213+
struct irdma_atomic_fetch_add {
214+
u64 tagged_offset;
215+
u64 remote_tagged_offset;
216+
u64 fetch_add_data_bytes;
217+
u32 stag;
218+
u32 remote_stag;
219+
};
220+
221+
struct irdma_atomic_compare_swap {
222+
u64 tagged_offset;
223+
u64 remote_tagged_offset;
224+
u64 swap_data_bytes;
225+
u64 compare_data_bytes;
226+
u32 stag;
227+
u32 remote_stag;
208228
};
209229

210230
struct irdma_inv_local_stag {
@@ -223,6 +243,7 @@ struct irdma_post_sq_info {
223243
bool report_rtt:1;
224244
bool udp_hdr:1;
225245
bool defer_flag:1;
246+
bool remote_atomic_en:1;
226247
u32 imm_data;
227248
u32 stag_to_inv;
228249
union {
@@ -231,6 +252,8 @@ struct irdma_post_sq_info {
231252
struct irdma_rdma_read rdma_read;
232253
struct irdma_bind_window bind_window;
233254
struct irdma_inv_local_stag inv_local_stag;
255+
struct irdma_atomic_fetch_add atomic_fetch_add;
256+
struct irdma_atomic_compare_swap atomic_compare_swap;
234257
} op;
235258
};
236259

@@ -259,6 +282,10 @@ struct irdma_cq_poll_info {
259282
bool imm_valid:1;
260283
};
261284

285+
int irdma_uk_atomic_compare_swap(struct irdma_qp_uk *qp,
286+
struct irdma_post_sq_info *info, bool post_sq);
287+
int irdma_uk_atomic_fetch_add(struct irdma_qp_uk *qp,
288+
struct irdma_post_sq_info *info, bool post_sq);
262289
int irdma_uk_inline_rdma_write(struct irdma_qp_uk *qp,
263290
struct irdma_post_sq_info *info, bool post_sq);
264291
int irdma_uk_inline_send(struct irdma_qp_uk *qp,

drivers/infiniband/hw/irdma/verbs.c

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,11 @@ static int irdma_query_device(struct ib_device *ibdev,
6060
props->max_srq = rf->max_srq - rf->used_srqs;
6161
props->max_srq_wr = IRDMA_MAX_SRQ_WRS;
6262
props->max_srq_sge = hw_attrs->uk_attrs.max_hw_wq_frags;
63+
if (hw_attrs->uk_attrs.feature_flags & IRDMA_FEATURE_ATOMIC_OPS)
64+
props->atomic_cap = IB_ATOMIC_HCA;
65+
else
66+
props->atomic_cap = IB_ATOMIC_NONE;
67+
props->masked_atomic_cap = props->atomic_cap;
6368
if (hw_attrs->uk_attrs.hw_rev >= IRDMA_GEN_3) {
6469
#define HCA_CORE_CLOCK_KHZ 1000000UL
6570
props->timestamp_mask = GENMASK(31, 0);
@@ -1145,13 +1150,17 @@ static int irdma_get_ib_acc_flags(struct irdma_qp *iwqp)
11451150
acc_flags |= IB_ACCESS_REMOTE_READ;
11461151
if (iwqp->roce_info.bind_en)
11471152
acc_flags |= IB_ACCESS_MW_BIND;
1153+
if (iwqp->ctx_info.remote_atomics_en)
1154+
acc_flags |= IB_ACCESS_REMOTE_ATOMIC;
11481155
} else {
11491156
if (iwqp->iwarp_info.wr_rdresp_en) {
11501157
acc_flags |= IB_ACCESS_LOCAL_WRITE;
11511158
acc_flags |= IB_ACCESS_REMOTE_WRITE;
11521159
}
11531160
if (iwqp->iwarp_info.rd_en)
11541161
acc_flags |= IB_ACCESS_REMOTE_READ;
1162+
if (iwqp->ctx_info.remote_atomics_en)
1163+
acc_flags |= IB_ACCESS_REMOTE_ATOMIC;
11551164
}
11561165
return acc_flags;
11571166
}
@@ -1448,6 +1457,9 @@ int irdma_modify_qp_roce(struct ib_qp *ibqp, struct ib_qp_attr *attr,
14481457
roce_info->wr_rdresp_en = true;
14491458
if (attr->qp_access_flags & IB_ACCESS_REMOTE_READ)
14501459
roce_info->rd_en = true;
1460+
if (dev->hw_attrs.uk_attrs.feature_flags & IRDMA_FEATURE_ATOMIC_OPS)
1461+
if (attr->qp_access_flags & IB_ACCESS_REMOTE_ATOMIC)
1462+
ctx_info->remote_atomics_en = true;
14511463
}
14521464

14531465
wait_event(iwqp->mod_qp_waitq, !atomic_read(&iwqp->hw_mod_qp_pend));
@@ -3250,6 +3262,8 @@ static int irdma_hwreg_mr(struct irdma_device *iwdev, struct irdma_mr *iwmr,
32503262
stag_info->total_len = iwmr->len;
32513263
stag_info->access_rights = irdma_get_mr_access(access,
32523264
iwdev->rf->sc_dev.hw_attrs.uk_attrs.hw_rev);
3265+
if (iwdev->rf->sc_dev.hw_attrs.uk_attrs.feature_flags & IRDMA_FEATURE_ATOMIC_OPS)
3266+
stag_info->remote_atomics_en = (access & IB_ACCESS_REMOTE_ATOMIC) ? 1 : 0;
32533267
stag_info->pd_id = iwpd->sc_pd.pd_id;
32543268
stag_info->all_memory = pd->flags & IB_PD_UNSAFE_GLOBAL_RKEY;
32553269
if (stag_info->access_rights & IRDMA_ACCESS_FLAGS_ZERO_BASED)
@@ -3949,6 +3963,40 @@ static int irdma_post_send(struct ib_qp *ibqp,
39493963
if (ib_wr->send_flags & IB_SEND_FENCE)
39503964
info.read_fence = true;
39513965
switch (ib_wr->opcode) {
3966+
case IB_WR_ATOMIC_CMP_AND_SWP:
3967+
if (unlikely(!(dev->hw_attrs.uk_attrs.feature_flags &
3968+
IRDMA_FEATURE_ATOMIC_OPS))) {
3969+
err = EINVAL;
3970+
break;
3971+
}
3972+
info.op_type = IRDMA_OP_TYPE_ATOMIC_COMPARE_AND_SWAP;
3973+
info.op.atomic_compare_swap.tagged_offset = ib_wr->sg_list[0].addr;
3974+
info.op.atomic_compare_swap.remote_tagged_offset =
3975+
atomic_wr(ib_wr)->remote_addr;
3976+
info.op.atomic_compare_swap.swap_data_bytes = atomic_wr(ib_wr)->swap;
3977+
info.op.atomic_compare_swap.compare_data_bytes =
3978+
atomic_wr(ib_wr)->compare_add;
3979+
info.op.atomic_compare_swap.stag = ib_wr->sg_list[0].lkey;
3980+
info.op.atomic_compare_swap.remote_stag = atomic_wr(ib_wr)->rkey;
3981+
err = irdma_uk_atomic_compare_swap(ukqp, &info, false);
3982+
break;
3983+
case IB_WR_ATOMIC_FETCH_AND_ADD:
3984+
if (unlikely(!(dev->hw_attrs.uk_attrs.feature_flags &
3985+
IRDMA_FEATURE_ATOMIC_OPS))) {
3986+
err = EINVAL;
3987+
break;
3988+
}
3989+
info.op_type = IRDMA_OP_TYPE_ATOMIC_FETCH_AND_ADD;
3990+
info.op.atomic_fetch_add.tagged_offset = ib_wr->sg_list[0].addr;
3991+
info.op.atomic_fetch_add.remote_tagged_offset =
3992+
atomic_wr(ib_wr)->remote_addr;
3993+
info.op.atomic_fetch_add.fetch_add_data_bytes =
3994+
atomic_wr(ib_wr)->compare_add;
3995+
info.op.atomic_fetch_add.stag = ib_wr->sg_list[0].lkey;
3996+
info.op.atomic_fetch_add.remote_stag =
3997+
atomic_wr(ib_wr)->rkey;
3998+
err = irdma_uk_atomic_fetch_add(ukqp, &info, false);
3999+
break;
39524000
case IB_WR_SEND_WITH_IMM:
39534001
if (ukqp->qp_caps & IRDMA_SEND_WITH_IMM) {
39544002
info.imm_data_valid = true;

drivers/infiniband/hw/irdma/verbs.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,12 @@ static inline void set_ib_wc_op_sq(struct irdma_cq_poll_info *cq_poll_info,
284284
case IRDMA_OP_TYPE_FAST_REG_NSMR:
285285
entry->opcode = IB_WC_REG_MR;
286286
break;
287+
case IRDMA_OP_TYPE_ATOMIC_COMPARE_AND_SWAP:
288+
entry->opcode = IB_WC_COMP_SWAP;
289+
break;
290+
case IRDMA_OP_TYPE_ATOMIC_FETCH_AND_ADD:
291+
entry->opcode = IB_WC_FETCH_ADD;
292+
break;
287293
case IRDMA_OP_TYPE_INV_STAG:
288294
entry->opcode = IB_WC_LOCAL_INV;
289295
break;

0 commit comments

Comments
 (0)