Skip to content

Commit b800e82

Browse files
shirazsaleemrleon
authored andcommitted
RDMA/irdma: Add GEN3 support for AEQ and CEQ
Extend support for GEN3 devices by programming the necessary hardware IRQ registers and the updated descriptor fields for the Asynchronous Event Queue (AEQ) and Completion Event Queue (CEQ). Introduce a RDMA virtual channel operation with the Control Plane (CP) to associate interrupt vectors appropriately with AEQ and CEQ. Add new Asynchronous Event (AE) definitions specific to GEN3. Additionally, refactor the AEQ and CEQ setup into the irdma_ctrl_init_hw device control initialization routine. This completes the PCI device level initialization for RDMA in the core driver. Signed-off-by: Shiraz Saleem <shiraz.saleem@intel.com> Signed-off-by: Tatyana Nikolova <tatyana.e.nikolova@intel.com> Link: https://patch.msgid.link/20250827152545.2056-6-tatyana.e.nikolova@intel.com Tested-by: Jacob Moroni <jmoroni@google.com> Signed-off-by: Leon Romanovsky <leon@kernel.org>
1 parent c7db0ab commit b800e82

9 files changed

Lines changed: 338 additions & 73 deletions

File tree

drivers/infiniband/hw/irdma/ctrl.c

Lines changed: 64 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2566,6 +2566,9 @@ static int irdma_sc_cq_create(struct irdma_sc_cq *cq, u64 scratch,
25662566
FIELD_PREP(IRDMA_CQPSQ_CQ_LPBLSIZE, cq->pbl_chunk_size) |
25672567
FIELD_PREP(IRDMA_CQPSQ_CQ_CHKOVERFLOW, check_overflow) |
25682568
FIELD_PREP(IRDMA_CQPSQ_CQ_VIRTMAP, cq->virtual_map) |
2569+
FIELD_PREP(IRDMA_CQPSQ_CQ_CQID_HIGH, cq->cq_uk.cq_id >> 22) |
2570+
FIELD_PREP(IRDMA_CQPSQ_CQ_CEQID_HIGH,
2571+
(cq->ceq_id_valid ? cq->ceq_id : 0) >> 10) |
25692572
FIELD_PREP(IRDMA_CQPSQ_CQ_ENCEQEMASK, cq->ceqe_mask) |
25702573
FIELD_PREP(IRDMA_CQPSQ_CQ_CEQIDVALID, cq->ceq_id_valid) |
25712574
FIELD_PREP(IRDMA_CQPSQ_TPHEN, cq->tph_en) |
@@ -3928,7 +3931,7 @@ int irdma_sc_ceq_init(struct irdma_sc_ceq *ceq,
39283931
ceq->pbl_list = (ceq->virtual_map ? info->pbl_list : NULL);
39293932
ceq->tph_en = info->tph_en;
39303933
ceq->tph_val = info->tph_val;
3931-
ceq->vsi = info->vsi;
3934+
ceq->vsi_idx = info->vsi_idx;
39323935
ceq->polarity = 1;
39333936
IRDMA_RING_INIT(ceq->ceq_ring, ceq->elem_cnt);
39343937
ceq->dev->ceq[info->ceq_id] = ceq;
@@ -3961,13 +3964,16 @@ static int irdma_sc_ceq_create(struct irdma_sc_ceq *ceq, u64 scratch,
39613964
(ceq->virtual_map ? ceq->first_pm_pbl_idx : 0));
39623965
set_64bit_val(wqe, 56,
39633966
FIELD_PREP(IRDMA_CQPSQ_TPHVAL, ceq->tph_val) |
3964-
FIELD_PREP(IRDMA_CQPSQ_VSIIDX, ceq->vsi->vsi_idx));
3967+
FIELD_PREP(IRDMA_CQPSQ_PASID, ceq->pasid) |
3968+
FIELD_PREP(IRDMA_CQPSQ_VSIIDX, ceq->vsi_idx));
39653969
hdr = FIELD_PREP(IRDMA_CQPSQ_CEQ_CEQID, ceq->ceq_id) |
3970+
FIELD_PREP(IRDMA_CQPSQ_CEQ_CEQID_HIGH, ceq->ceq_id >> 10) |
39663971
FIELD_PREP(IRDMA_CQPSQ_OPCODE, IRDMA_CQP_OP_CREATE_CEQ) |
39673972
FIELD_PREP(IRDMA_CQPSQ_CEQ_LPBLSIZE, ceq->pbl_chunk_size) |
39683973
FIELD_PREP(IRDMA_CQPSQ_CEQ_VMAP, ceq->virtual_map) |
39693974
FIELD_PREP(IRDMA_CQPSQ_CEQ_ITRNOEXPIRE, ceq->itr_no_expire) |
39703975
FIELD_PREP(IRDMA_CQPSQ_TPHEN, ceq->tph_en) |
3976+
FIELD_PREP(IRDMA_CQPSQ_PASID_VALID, ceq->pasid_valid) |
39713977
FIELD_PREP(IRDMA_CQPSQ_WQEVALID, cqp->polarity);
39723978
dma_wmb(); /* make sure WQE is written before valid bit is set */
39733979

@@ -4022,7 +4028,7 @@ int irdma_sc_cceq_create(struct irdma_sc_ceq *ceq, u64 scratch)
40224028
int ret_code;
40234029
struct irdma_sc_dev *dev = ceq->dev;
40244030

4025-
dev->ccq->vsi = ceq->vsi;
4031+
dev->ccq->vsi_idx = ceq->vsi_idx;
40264032
if (ceq->reg_cq) {
40274033
ret_code = irdma_sc_add_cq_ctx(ceq, ceq->dev->ccq);
40284034
if (ret_code)
@@ -4055,11 +4061,14 @@ int irdma_sc_ceq_destroy(struct irdma_sc_ceq *ceq, u64 scratch, bool post_sq)
40554061

40564062
set_64bit_val(wqe, 16, ceq->elem_cnt);
40574063
set_64bit_val(wqe, 48, ceq->first_pm_pbl_idx);
4064+
set_64bit_val(wqe, 56,
4065+
FIELD_PREP(IRDMA_CQPSQ_PASID, ceq->pasid));
40584066
hdr = ceq->ceq_id |
40594067
FIELD_PREP(IRDMA_CQPSQ_OPCODE, IRDMA_CQP_OP_DESTROY_CEQ) |
40604068
FIELD_PREP(IRDMA_CQPSQ_CEQ_LPBLSIZE, ceq->pbl_chunk_size) |
40614069
FIELD_PREP(IRDMA_CQPSQ_CEQ_VMAP, ceq->virtual_map) |
40624070
FIELD_PREP(IRDMA_CQPSQ_TPHEN, ceq->tph_en) |
4071+
FIELD_PREP(IRDMA_CQPSQ_PASID_VALID, ceq->pasid_valid) |
40634072
FIELD_PREP(IRDMA_CQPSQ_WQEVALID, cqp->polarity);
40644073
dma_wmb(); /* make sure WQE is written before valid bit is set */
40654074

@@ -4223,10 +4232,13 @@ static int irdma_sc_aeq_create(struct irdma_sc_aeq *aeq, u64 scratch,
42234232
(aeq->virtual_map ? 0 : aeq->aeq_elem_pa));
42244233
set_64bit_val(wqe, 48,
42254234
(aeq->virtual_map ? aeq->first_pm_pbl_idx : 0));
4235+
set_64bit_val(wqe, 56,
4236+
FIELD_PREP(IRDMA_CQPSQ_PASID, aeq->pasid));
42264237

42274238
hdr = FIELD_PREP(IRDMA_CQPSQ_OPCODE, IRDMA_CQP_OP_CREATE_AEQ) |
42284239
FIELD_PREP(IRDMA_CQPSQ_AEQ_LPBLSIZE, aeq->pbl_chunk_size) |
42294240
FIELD_PREP(IRDMA_CQPSQ_AEQ_VMAP, aeq->virtual_map) |
4241+
FIELD_PREP(IRDMA_CQPSQ_PASID_VALID, aeq->pasid_valid) |
42304242
FIELD_PREP(IRDMA_CQPSQ_WQEVALID, cqp->polarity);
42314243
dma_wmb(); /* make sure WQE is written before valid bit is set */
42324244

@@ -4255,17 +4267,21 @@ static int irdma_sc_aeq_destroy(struct irdma_sc_aeq *aeq, u64 scratch,
42554267
u64 hdr;
42564268

42574269
dev = aeq->dev;
4258-
writel(0, dev->hw_regs[IRDMA_PFINT_AEQCTL]);
4270+
if (dev->privileged)
4271+
writel(0, dev->hw_regs[IRDMA_PFINT_AEQCTL]);
42594272

42604273
cqp = dev->cqp;
42614274
wqe = irdma_sc_cqp_get_next_send_wqe(cqp, scratch);
42624275
if (!wqe)
42634276
return -ENOMEM;
42644277
set_64bit_val(wqe, 16, aeq->elem_cnt);
42654278
set_64bit_val(wqe, 48, aeq->first_pm_pbl_idx);
4279+
set_64bit_val(wqe, 56,
4280+
FIELD_PREP(IRDMA_CQPSQ_PASID, aeq->pasid));
42664281
hdr = FIELD_PREP(IRDMA_CQPSQ_OPCODE, IRDMA_CQP_OP_DESTROY_AEQ) |
42674282
FIELD_PREP(IRDMA_CQPSQ_AEQ_LPBLSIZE, aeq->pbl_chunk_size) |
42684283
FIELD_PREP(IRDMA_CQPSQ_AEQ_VMAP, aeq->virtual_map) |
4284+
FIELD_PREP(IRDMA_CQPSQ_PASID_VALID, aeq->pasid_valid) |
42694285
FIELD_PREP(IRDMA_CQPSQ_WQEVALID, cqp->polarity);
42704286
dma_wmb(); /* make sure WQE is written before valid bit is set */
42714287

@@ -4306,18 +4322,39 @@ int irdma_sc_get_next_aeqe(struct irdma_sc_aeq *aeq,
43064322
print_hex_dump_debug("WQE: AEQ_ENTRY WQE", DUMP_PREFIX_OFFSET, 16, 8,
43074323
aeqe, 16, false);
43084324

4309-
ae_src = (u8)FIELD_GET(IRDMA_AEQE_AESRC, temp);
4310-
info->wqe_idx = (u16)FIELD_GET(IRDMA_AEQE_WQDESCIDX, temp);
4311-
info->qp_cq_id = (u32)FIELD_GET(IRDMA_AEQE_QPCQID_LOW, temp) |
4325+
if (aeq->dev->hw_attrs.uk_attrs.hw_rev >= IRDMA_GEN_3) {
4326+
ae_src = (u8)FIELD_GET(IRDMA_AEQE_AESRC_GEN_3, temp);
4327+
info->wqe_idx = (u16)FIELD_GET(IRDMA_AEQE_WQDESCIDX_GEN_3,
4328+
temp);
4329+
info->qp_cq_id = (u32)FIELD_GET(IRDMA_AEQE_QPCQID_GEN_3, temp);
4330+
info->ae_id = (u16)FIELD_GET(IRDMA_AEQE_AECODE_GEN_3, temp);
4331+
info->tcp_state = (u8)FIELD_GET(IRDMA_AEQE_TCPSTATE_GEN_3, compl_ctx);
4332+
info->iwarp_state = (u8)FIELD_GET(IRDMA_AEQE_IWSTATE_GEN_3, temp);
4333+
info->q2_data_written = (u8)FIELD_GET(IRDMA_AEQE_Q2DATA_GEN_3, compl_ctx);
4334+
info->aeqe_overflow = (bool)FIELD_GET(IRDMA_AEQE_OVERFLOW_GEN_3, temp);
4335+
info->compl_ctx = FIELD_GET(IRDMA_AEQE_CMPL_CTXT, compl_ctx);
4336+
compl_ctx = FIELD_GET(IRDMA_AEQE_CMPL_CTXT, compl_ctx) << IRDMA_AEQE_CMPL_CTXT_S;
4337+
} else {
4338+
ae_src = (u8)FIELD_GET(IRDMA_AEQE_AESRC, temp);
4339+
info->wqe_idx = (u16)FIELD_GET(IRDMA_AEQE_WQDESCIDX, temp);
4340+
info->qp_cq_id = (u32)FIELD_GET(IRDMA_AEQE_QPCQID_LOW, temp) |
43124341
((u32)FIELD_GET(IRDMA_AEQE_QPCQID_HI, temp) << 18);
4313-
info->ae_id = (u16)FIELD_GET(IRDMA_AEQE_AECODE, temp);
4314-
info->tcp_state = (u8)FIELD_GET(IRDMA_AEQE_TCPSTATE, temp);
4315-
info->iwarp_state = (u8)FIELD_GET(IRDMA_AEQE_IWSTATE, temp);
4316-
info->q2_data_written = (u8)FIELD_GET(IRDMA_AEQE_Q2DATA, temp);
4317-
info->aeqe_overflow = (bool)FIELD_GET(IRDMA_AEQE_OVERFLOW, temp);
4342+
info->ae_id = (u16)FIELD_GET(IRDMA_AEQE_AECODE, temp);
4343+
info->tcp_state = (u8)FIELD_GET(IRDMA_AEQE_TCPSTATE, temp);
4344+
info->iwarp_state = (u8)FIELD_GET(IRDMA_AEQE_IWSTATE, temp);
4345+
info->q2_data_written = (u8)FIELD_GET(IRDMA_AEQE_Q2DATA, temp);
4346+
info->aeqe_overflow = (bool)FIELD_GET(IRDMA_AEQE_OVERFLOW,
4347+
temp);
4348+
}
43184349

43194350
info->ae_src = ae_src;
43204351
switch (info->ae_id) {
4352+
case IRDMA_AE_SRQ_LIMIT:
4353+
info->srq = true;
4354+
/* [63:6] from CMPL_CTXT, [5:0] from WQDESCIDX. */
4355+
info->compl_ctx = compl_ctx | info->wqe_idx;
4356+
ae_src = IRDMA_AE_SOURCE_RSVD;
4357+
break;
43214358
case IRDMA_AE_PRIV_OPERATION_DENIED:
43224359
case IRDMA_AE_AMP_INVALIDATE_TYPE1_MW:
43234360
case IRDMA_AE_AMP_MWBIND_ZERO_BASED_TYPE1_MW:
@@ -4350,6 +4387,10 @@ int irdma_sc_get_next_aeqe(struct irdma_sc_aeq *aeq,
43504387
case IRDMA_AE_LLP_RECEIVED_MPA_CRC_ERROR:
43514388
case IRDMA_AE_LLP_SEGMENT_TOO_SMALL:
43524389
case IRDMA_AE_LLP_TOO_MANY_RETRIES:
4390+
case IRDMA_AE_LLP_TOO_MANY_RNRS:
4391+
case IRDMA_AE_REMOTE_QP_CATASTROPHIC:
4392+
case IRDMA_AE_LOCAL_QP_CATASTROPHIC:
4393+
case IRDMA_AE_RCE_QP_CATASTROPHIC:
43534394
case IRDMA_AE_LLP_DOUBT_REACHABILITY:
43544395
case IRDMA_AE_LLP_CONNECTION_ESTABLISHED:
43554396
case IRDMA_AE_RESET_SENT:
@@ -4395,6 +4436,7 @@ int irdma_sc_get_next_aeqe(struct irdma_sc_aeq *aeq,
43954436
info->qp = true;
43964437
info->rq = true;
43974438
info->compl_ctx = compl_ctx;
4439+
info->err_rq_idx_valid = true;
43984440
break;
43994441
case IRDMA_AE_SOURCE_CQ:
44004442
case IRDMA_AE_SOURCE_CQ_0110:
@@ -4410,8 +4452,18 @@ int irdma_sc_get_next_aeqe(struct irdma_sc_aeq *aeq,
44104452
info->compl_ctx = compl_ctx;
44114453
break;
44124454
case IRDMA_AE_SOURCE_IN_RR_WR:
4455+
info->qp = true;
4456+
if (aeq->dev->hw_attrs.uk_attrs.hw_rev >= IRDMA_GEN_3)
4457+
info->err_rq_idx_valid = true;
4458+
info->compl_ctx = compl_ctx;
4459+
info->in_rdrsp_wr = true;
4460+
break;
44134461
case IRDMA_AE_SOURCE_IN_RR_WR_1011:
44144462
info->qp = true;
4463+
if (aeq->dev->hw_attrs.uk_attrs.hw_rev >= IRDMA_GEN_3) {
4464+
info->sq = true;
4465+
info->err_rq_idx_valid = true;
4466+
}
44154467
info->compl_ctx = compl_ctx;
44164468
info->in_rdrsp_wr = true;
44174469
break;

drivers/infiniband/hw/irdma/defs.h

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -319,13 +319,18 @@ enum irdma_cqp_op_type {
319319
#define IRDMA_AE_STAG_ZERO_INVALID 0x0206
320320
#define IRDMA_AE_IB_RREQ_AND_Q1_FULL 0x0207
321321
#define IRDMA_AE_IB_INVALID_REQUEST 0x0208
322+
#define IRDMA_AE_SRQ_LIMIT 0x0209
322323
#define IRDMA_AE_WQE_UNEXPECTED_OPCODE 0x020a
323324
#define IRDMA_AE_WQE_INVALID_PARAMETER 0x020b
324325
#define IRDMA_AE_WQE_INVALID_FRAG_DATA 0x020c
325326
#define IRDMA_AE_IB_REMOTE_ACCESS_ERROR 0x020d
326327
#define IRDMA_AE_IB_REMOTE_OP_ERROR 0x020e
328+
#define IRDMA_AE_SRQ_CATASTROPHIC_ERROR 0x020f
327329
#define IRDMA_AE_WQE_LSMM_TOO_LONG 0x0220
330+
#define IRDMA_AE_ATOMIC_ALIGNMENT 0x0221
331+
#define IRDMA_AE_ATOMIC_MASK 0x0222
328332
#define IRDMA_AE_INVALID_REQUEST 0x0223
333+
#define IRDMA_AE_PCIE_ATOMIC_DISABLE 0x0224
329334
#define IRDMA_AE_DDP_INVALID_MSN_GAP_IN_MSN 0x0301
330335
#define IRDMA_AE_DDP_UBE_DDP_MESSAGE_TOO_LONG_FOR_AVAILABLE_BUFFER 0x0303
331336
#define IRDMA_AE_DDP_UBE_INVALID_DDP_VERSION 0x0304
@@ -366,8 +371,12 @@ enum irdma_cqp_op_type {
366371
#define IRDMA_AE_LCE_QP_CATASTROPHIC 0x0700
367372
#define IRDMA_AE_LCE_FUNCTION_CATASTROPHIC 0x0701
368373
#define IRDMA_AE_LCE_CQ_CATASTROPHIC 0x0702
374+
#define IRDMA_AE_REMOTE_QP_CATASTROPHIC 0x0703
375+
#define IRDMA_AE_LOCAL_QP_CATASTROPHIC 0x0704
376+
#define IRDMA_AE_RCE_QP_CATASTROPHIC 0x0705
369377
#define IRDMA_AE_QP_SUSPEND_COMPLETE 0x0900
370378
#define IRDMA_AE_CQP_DEFERRED_COMPLETE 0x0901
379+
#define IRDMA_AE_ADAPTER_CATASTROPHIC 0x0B0B
371380

372381
#define FLD_LS_64(dev, val, field) \
373382
(((u64)(val) << (dev)->hw_shifts[field ## _S]) & (dev)->hw_masks[field ## _M])
@@ -535,6 +544,17 @@ enum irdma_cqp_op_type {
535544
#define IRDMA_AEQE_Q2DATA GENMASK_ULL(62, 61)
536545
#define IRDMA_AEQE_VALID BIT_ULL(63)
537546

547+
#define IRDMA_AEQE_Q2DATA_GEN_3 GENMASK_ULL(5, 4)
548+
#define IRDMA_AEQE_TCPSTATE_GEN_3 GENMASK_ULL(3, 0)
549+
#define IRDMA_AEQE_QPCQID_GEN_3 GENMASK_ULL(24, 0)
550+
#define IRDMA_AEQE_AECODE_GEN_3 GENMASK_ULL(61, 50)
551+
#define IRDMA_AEQE_OVERFLOW_GEN_3 BIT_ULL(62)
552+
#define IRDMA_AEQE_WQDESCIDX_GEN_3 GENMASK_ULL(49, 32)
553+
#define IRDMA_AEQE_IWSTATE_GEN_3 GENMASK_ULL(31, 29)
554+
#define IRDMA_AEQE_AESRC_GEN_3 GENMASK_ULL(28, 25)
555+
#define IRDMA_AEQE_CMPL_CTXT_S 6
556+
#define IRDMA_AEQE_CMPL_CTXT GENMASK_ULL(63, 6)
557+
538558
#define IRDMA_UDA_QPSQ_NEXT_HDR GENMASK_ULL(23, 16)
539559
#define IRDMA_UDA_QPSQ_OPCODE GENMASK_ULL(37, 32)
540560
#define IRDMA_UDA_QPSQ_L4LEN GENMASK_ULL(45, 42)
@@ -557,11 +577,14 @@ enum irdma_cqp_op_type {
557577
#define IRDMA_CQPSQ_WQEVALID BIT_ULL(63)
558578
#define IRDMA_CQPSQ_TPHVAL GENMASK_ULL(7, 0)
559579

560-
#define IRDMA_CQPSQ_VSIIDX GENMASK_ULL(17, 8)
580+
#define IRDMA_CQPSQ_VSIIDX GENMASK_ULL(23, 8)
561581
#define IRDMA_CQPSQ_TPHEN BIT_ULL(60)
562582

563583
#define IRDMA_CQPSQ_PBUFADDR IRDMA_CQPHC_QPCTX
564584

585+
#define IRDMA_CQPSQ_PASID GENMASK_ULL(51, 32)
586+
#define IRDMA_CQPSQ_PASID_VALID BIT_ULL(62)
587+
565588
/* Create/Modify/Destroy QP */
566589

567590
#define IRDMA_CQPSQ_QP_NEWMSS GENMASK_ULL(45, 32)
@@ -597,6 +620,8 @@ enum irdma_cqp_op_type {
597620
#define IRDMA_CQPSQ_CQ_CQCTX GENMASK_ULL(62, 0)
598621
#define IRDMA_CQPSQ_CQ_SHADOW_READ_THRESHOLD GENMASK(17, 0)
599622

623+
#define IRDMA_CQPSQ_CQ_CQID_HIGH GENMASK_ULL(52, 50)
624+
#define IRDMA_CQPSQ_CQ_CEQID_HIGH GENMASK_ULL(59, 54)
600625
#define IRDMA_CQPSQ_CQ_OP GENMASK_ULL(37, 32)
601626
#define IRDMA_CQPSQ_CQ_CQRESIZE BIT_ULL(43)
602627
#define IRDMA_CQPSQ_CQ_LPBLSIZE GENMASK_ULL(45, 44)
@@ -676,6 +701,8 @@ enum irdma_cqp_op_type {
676701
#define IRDMA_CQPSQ_CEQ_CEQSIZE GENMASK_ULL(21, 0)
677702
#define IRDMA_CQPSQ_CEQ_CEQID GENMASK_ULL(9, 0)
678703

704+
#define IRDMA_CQPSQ_CEQ_CEQID_HIGH GENMASK_ULL(15, 10)
705+
679706
#define IRDMA_CQPSQ_CEQ_LPBLSIZE IRDMA_CQPSQ_CQ_LPBLSIZE
680707
#define IRDMA_CQPSQ_CEQ_VMAP BIT_ULL(47)
681708
#define IRDMA_CQPSQ_CEQ_ITRNOEXPIRE BIT_ULL(46)

0 commit comments

Comments
 (0)