Skip to content

Commit 9a1d687

Browse files
shirazsaleemrleon
authored andcommitted
RDMA/irdma: Support 64-byte CQEs and GEN3 CQE opcode decoding
Introduce support for 64-byte CQEs in GEN3 devices. Additionally, implement GEN3-specific CQE opcode decoding. 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-12-tatyana.e.nikolova@intel.com Tested-by: Jacob Moroni <jmoroni@google.com> Signed-off-by: Leon Romanovsky <leon@kernel.org>
1 parent 419afdd commit 9a1d687

5 files changed

Lines changed: 48 additions & 9 deletions

File tree

drivers/infiniband/hw/irdma/hw.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1117,13 +1117,15 @@ static int irdma_create_ccq(struct irdma_pci_f *rf)
11171117
struct irdma_sc_dev *dev = &rf->sc_dev;
11181118
struct irdma_ccq_init_info info = {};
11191119
struct irdma_ccq *ccq = &rf->ccq;
1120+
int ccq_size;
11201121
int status;
11211122

11221123
dev->ccq = &ccq->sc_cq;
11231124
dev->ccq->dev = dev;
11241125
info.dev = dev;
1126+
ccq_size = (rf->rdma_ver >= IRDMA_GEN_3) ? IW_GEN_3_CCQ_SIZE : IW_CCQ_SIZE;
11251127
ccq->shadow_area.size = sizeof(struct irdma_cq_shadow_area);
1126-
ccq->mem_cq.size = ALIGN(sizeof(struct irdma_cqe) * IW_CCQ_SIZE,
1128+
ccq->mem_cq.size = ALIGN(sizeof(struct irdma_cqe) * ccq_size,
11271129
IRDMA_CQ0_ALIGNMENT);
11281130
ccq->mem_cq.va = dma_alloc_coherent(dev->hw->device, ccq->mem_cq.size,
11291131
&ccq->mem_cq.pa, GFP_KERNEL);
@@ -1140,7 +1142,7 @@ static int irdma_create_ccq(struct irdma_pci_f *rf)
11401142
/* populate the ccq init info */
11411143
info.cq_base = ccq->mem_cq.va;
11421144
info.cq_pa = ccq->mem_cq.pa;
1143-
info.num_elem = IW_CCQ_SIZE;
1145+
info.num_elem = ccq_size;
11441146
info.shadow_area = ccq->shadow_area.va;
11451147
info.shadow_area_pa = ccq->shadow_area.pa;
11461148
info.ceqe_mask = false;

drivers/infiniband/hw/irdma/main.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,8 @@ extern struct iidc_rdma_core_auxiliary_drv ig3rdma_core_auxiliary_drv;
6666
#define IRDMA_MACIP_ADD 1
6767
#define IRDMA_MACIP_DELETE 2
6868

69-
#define IW_CCQ_SIZE (IRDMA_CQP_SW_SQSIZE_2048 + 1)
69+
#define IW_GEN_3_CCQ_SIZE (2 * IRDMA_CQP_SW_SQSIZE_2048 + 2)
70+
#define IW_CCQ_SIZE (IRDMA_CQP_SW_SQSIZE_2048 + 2)
7071
#define IW_CEQ_SIZE 2048
7172
#define IW_AEQ_SIZE 2048
7273

drivers/infiniband/hw/irdma/utils.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2338,7 +2338,10 @@ bool irdma_cq_empty(struct irdma_cq *iwcq)
23382338
u8 polarity;
23392339

23402340
ukcq = &iwcq->sc_cq.cq_uk;
2341-
cqe = IRDMA_GET_CURRENT_CQ_ELEM(ukcq);
2341+
if (ukcq->avoid_mem_cflct)
2342+
cqe = IRDMA_GET_CURRENT_EXTENDED_CQ_ELEM(ukcq);
2343+
else
2344+
cqe = IRDMA_GET_CURRENT_CQ_ELEM(ukcq);
23422345
get_64bit_val(cqe, 24, &qword3);
23432346
polarity = (u8)FIELD_GET(IRDMA_CQ_VALID, qword3);
23442347

drivers/infiniband/hw/irdma/verbs.c

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1971,8 +1971,13 @@ static int irdma_resize_cq(struct ib_cq *ibcq, int entries,
19711971

19721972
if (!iwcq->user_mode) {
19731973
entries++;
1974-
if (rf->sc_dev.hw_attrs.uk_attrs.hw_rev >= IRDMA_GEN_2)
1974+
1975+
if (!iwcq->sc_cq.cq_uk.avoid_mem_cflct &&
1976+
dev->hw_attrs.uk_attrs.hw_rev >= IRDMA_GEN_2)
19751977
entries *= 2;
1978+
1979+
if (entries & 1)
1980+
entries += 1; /* cq size must be an even number */
19761981
}
19771982

19781983
info.cq_size = max(entries, 4);
@@ -2115,6 +2120,7 @@ static int irdma_create_cq(struct ib_cq *ibcq,
21152120
unsigned long flags;
21162121
int err_code;
21172122
int entries = attr->cqe;
2123+
bool cqe_64byte_ena;
21182124

21192125
err_code = cq_validate_flags(attr->flags, dev->hw_attrs.uk_attrs.hw_rev);
21202126
if (err_code)
@@ -2138,6 +2144,9 @@ static int irdma_create_cq(struct ib_cq *ibcq,
21382144
info.dev = dev;
21392145
ukinfo->cq_size = max(entries, 4);
21402146
ukinfo->cq_id = cq_num;
2147+
cqe_64byte_ena = dev->hw_attrs.uk_attrs.feature_flags & IRDMA_FEATURE_64_BYTE_CQE ?
2148+
true : false;
2149+
ukinfo->avoid_mem_cflct = cqe_64byte_ena;
21412150
iwcq->ibcq.cqe = info.cq_uk_init_info.cq_size;
21422151
if (attr->comp_vector < rf->ceqs_count)
21432152
info.ceq_id = attr->comp_vector;
@@ -2213,11 +2222,18 @@ static int irdma_create_cq(struct ib_cq *ibcq,
22132222
}
22142223

22152224
entries++;
2216-
if (dev->hw_attrs.uk_attrs.hw_rev >= IRDMA_GEN_2)
2225+
if (!cqe_64byte_ena && dev->hw_attrs.uk_attrs.hw_rev >= IRDMA_GEN_2)
22172226
entries *= 2;
2227+
2228+
if (entries & 1)
2229+
entries += 1; /* cq size must be an even number */
2230+
22182231
ukinfo->cq_size = entries;
22192232

2220-
rsize = info.cq_uk_init_info.cq_size * sizeof(struct irdma_cqe);
2233+
if (cqe_64byte_ena)
2234+
rsize = info.cq_uk_init_info.cq_size * sizeof(struct irdma_extended_cqe);
2235+
else
2236+
rsize = info.cq_uk_init_info.cq_size * sizeof(struct irdma_cqe);
22212237
iwcq->kmem.size = ALIGN(round_up(rsize, 256), 256);
22222238
iwcq->kmem.va = dma_alloc_coherent(dev->hw->device,
22232239
iwcq->kmem.size,
@@ -3784,8 +3800,12 @@ static void irdma_process_cqe(struct ib_wc *entry,
37843800
if (cq_poll_info->q_type == IRDMA_CQE_QTYPE_SQ) {
37853801
set_ib_wc_op_sq(cq_poll_info, entry);
37863802
} else {
3787-
set_ib_wc_op_rq(cq_poll_info, entry,
3788-
qp->qp_uk.qp_caps & IRDMA_SEND_WITH_IMM);
3803+
if (qp->dev->hw_attrs.uk_attrs.hw_rev <= IRDMA_GEN_2)
3804+
set_ib_wc_op_rq(cq_poll_info, entry,
3805+
qp->qp_uk.qp_caps & IRDMA_SEND_WITH_IMM ?
3806+
true : false);
3807+
else
3808+
set_ib_wc_op_rq_gen_3(cq_poll_info, entry);
37893809
if (qp->qp_uk.qp_type != IRDMA_QP_TYPE_ROCE_UD &&
37903810
cq_poll_info->stag_invalid_set) {
37913811
entry->ex.invalidate_rkey = cq_poll_info->inv_stag;

drivers/infiniband/hw/irdma/verbs.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,19 @@ static inline void set_ib_wc_op_sq(struct irdma_cq_poll_info *cq_poll_info,
267267
}
268268
}
269269

270+
static inline void set_ib_wc_op_rq_gen_3(struct irdma_cq_poll_info *info,
271+
struct ib_wc *entry)
272+
{
273+
switch (info->op_type) {
274+
case IRDMA_OP_TYPE_RDMA_WRITE:
275+
case IRDMA_OP_TYPE_RDMA_WRITE_SOL:
276+
entry->opcode = IB_WC_RECV_RDMA_WITH_IMM;
277+
break;
278+
default:
279+
entry->opcode = IB_WC_RECV;
280+
}
281+
}
282+
270283
static inline void set_ib_wc_op_rq(struct irdma_cq_poll_info *cq_poll_info,
271284
struct ib_wc *entry, bool send_imm_support)
272285
{

0 commit comments

Comments
 (0)