]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
RDMA/bnxt_re: Enable app allocated QPs
authorSriharsha Basavapatna <sriharsha.basavapatna@broadcom.com>
Tue, 19 May 2026 15:00:41 +0000 (20:30 +0530)
committerJason Gunthorpe <jgg@nvidia.com>
Sun, 24 May 2026 15:32:21 +0000 (12:32 -0300)
The driver supports a new comp_mask: REQ_MASK_FIXED_QUE_ATTR.
The application sets this comp_mask bit in the CREATE_QP ureq
to indicate direct control of the QP. The driver goes through
the required processing for app allocated QPs (previous patches).
Only variable WQE mode is supported for these QPs.

This patch removes an unused comp_mask:
BNXT_RE_QP_REQ_MASK_VAR_WQE_SQ_SLOTS

Link: https://patch.msgid.link/r/20260519150041.7251-10-sriharsha.basavapatna@broadcom.com
Signed-off-by: Sriharsha Basavapatna <sriharsha.basavapatna@broadcom.com>
Reviewed-by: Selvin Xavier <selvin.xavier@broadcom.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
drivers/infiniband/hw/bnxt_re/ib_verbs.c
include/uapi/rdma/bnxt_re-abi.h

index a5583f0125ed0f70b2aaa30711c5e647455d9ad1..5dbfa49d1c6fa2b1b22814b61d0b2abd2b18bbe0 100644 (file)
@@ -1717,11 +1717,11 @@ static int bnxt_re_init_qp_attr(struct bnxt_re_qp *qp, struct bnxt_re_pd *pd,
                                struct ib_qp_init_attr *init_attr,
                                struct bnxt_re_ucontext *uctx,
                                struct bnxt_re_qp_req *ureq,
-                               struct bnxt_re_dbr_obj *dbr_obj)
+                               struct bnxt_re_dbr_obj *dbr_obj,
+                               bool fixed_que_attr)
 {
        struct bnxt_qplib_dev_attr *dev_attr;
        struct bnxt_qplib_qp *qplqp;
-       bool fixed_que_attr = false;
        struct bnxt_re_dev *rdev;
        struct bnxt_re_cq *cq;
        int rc = 0, qptype;
@@ -1741,6 +1741,13 @@ static int bnxt_re_init_qp_attr(struct bnxt_re_qp *qp, struct bnxt_re_pd *pd,
                return qptype;
        qplqp->type = (u8)qptype;
        qplqp->wqe_mode = bnxt_re_is_var_size_supported(rdev, uctx);
+       if (fixed_que_attr) {
+               if (qplqp->wqe_mode != BNXT_QPLIB_WQE_MODE_VARIABLE)
+                       return -EOPNOTSUPP;
+               if (!ureq->sq_npsn ||
+                   ureq->sq_npsn > roundup_pow_of_two(ureq->sq_slots / 2))
+                       return -EINVAL;
+       }
        qplqp->dev_cap_flags = dev_attr->dev_cap_flags;
        qplqp->cctx = rdev->chip_ctx;
        if (init_attr->qp_type == IB_QPT_RC) {
@@ -1925,6 +1932,7 @@ int bnxt_re_create_qp(struct ib_qp *ib_qp, struct ib_qp_init_attr *qp_init_attr,
        struct bnxt_qplib_dev_attr *dev_attr;
        struct uverbs_attr_bundle *attrs;
        struct bnxt_re_ucontext *uctx;
+       bool fixed_que_attr = false;
        struct bnxt_re_qp_req ureq;
        struct bnxt_re_dev *rdev;
        struct bnxt_re_pd *pd;
@@ -1941,7 +1949,8 @@ int bnxt_re_create_qp(struct ib_qp *ib_qp, struct ib_qp_init_attr *qp_init_attr,
 
        uctx = rdma_udata_to_drv_context(udata, struct bnxt_re_ucontext, ib_uctx);
        if (udata) {
-               rc = ib_copy_validate_udata_in_cm(udata, ureq, qp_handle, 0);
+               rc = ib_copy_validate_udata_in_cm(udata, ureq, qp_handle,
+                                                 BNXT_RE_QP_REQ_MASK_FIXED_QUE_ATTR);
                if (rc)
                        return rc;
 
@@ -1955,6 +1964,8 @@ int bnxt_re_create_qp(struct ib_qp *ib_qp, struct ib_qp_init_attr *qp_init_attr,
                        kref_get(&dbr_obj->usecnt);
                        qp->dbr_obj = dbr_obj;
                }
+               if (ureq.comp_mask & BNXT_RE_QP_REQ_MASK_FIXED_QUE_ATTR)
+                       fixed_que_attr = true;
        }
 
        rc = bnxt_re_test_qp_limits(rdev, qp_init_attr, dev_attr);
@@ -1965,7 +1976,7 @@ int bnxt_re_create_qp(struct ib_qp *ib_qp, struct ib_qp_init_attr *qp_init_attr,
 
        qp->rdev = rdev;
        rc = bnxt_re_init_qp_attr(qp, pd, qp_init_attr, uctx, &ureq,
-                                 dbr_obj);
+                                 dbr_obj, fixed_que_attr);
        if (rc)
                goto fail;
 
index 4da8cda337dcbd1ea9781789c357f65a8d71dba5..a4599d7b736aa46bc29b27269f5df74c9988fdd6 100644 (file)
@@ -126,7 +126,7 @@ struct bnxt_re_resize_cq_req {
 };
 
 enum bnxt_re_qp_mask {
-       BNXT_RE_QP_REQ_MASK_VAR_WQE_SQ_SLOTS = 0x1,
+       BNXT_RE_QP_REQ_MASK_FIXED_QUE_ATTR = 0x1,
 };
 
 struct bnxt_re_qp_req {