RDMA/hns: Support cqe inline in user space
authorLuoyouming <luoyouming@huawei.com>
Sat, 24 Dec 2022 10:22:01 +0000 (18:22 +0800)
committerJason Gunthorpe <jgg@nvidia.com>
Mon, 9 Jan 2023 14:45:28 +0000 (10:45 -0400)
Enable the CQEIE field and configure the CQEIS field of QPC.  And add
compatibility handling.

Link: https://lore.kernel.org/r/20221224102201.3114536-4-xuhaoyue1@hisilicon.com
Signed-off-by: Luoyouming <luoyouming@huawei.com>
Signed-off-by: Haoyue Xu <xuhaoyue1@hisilicon.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
drivers/infiniband/hw/hns/hns_roce_device.h
drivers/infiniband/hw/hns/hns_roce_hw_v2.c
drivers/infiniband/hw/hns/hns_roce_hw_v2.h
drivers/infiniband/hw/hns/hns_roce_main.c
include/uapi/rdma/hns-abi.h

index e9957fc..84239b9 100644 (file)
@@ -144,6 +144,7 @@ enum {
        HNS_ROCE_CAP_FLAG_DIRECT_WQE            = BIT(12),
        HNS_ROCE_CAP_FLAG_SDI_MODE              = BIT(14),
        HNS_ROCE_CAP_FLAG_STASH                 = BIT(17),
+       HNS_ROCE_CAP_FLAG_CQE_INLINE            = BIT(19),
 };
 
 #define HNS_ROCE_DB_TYPE_COUNT                 2
index c0b487b..dbf97fe 100644 (file)
@@ -4704,6 +4704,18 @@ static int modify_qp_init_to_rtr(struct ib_qp *ibqp,
                hr_reg_clear(qpc_mask, QPC_RQIE);
        }
 
+       if (udata &&
+           (ibqp->qp_type == IB_QPT_RC || ibqp->qp_type == IB_QPT_XRC_TGT) &&
+           (uctx->config & HNS_ROCE_CQE_INLINE_FLAGS)) {
+               hr_reg_write_bool(context, QPC_CQEIE,
+                                 hr_dev->caps.flags &
+                                 HNS_ROCE_CAP_FLAG_CQE_INLINE);
+               hr_reg_clear(qpc_mask, QPC_CQEIE);
+
+               hr_reg_write(context, QPC_CQEIS, 0);
+               hr_reg_clear(qpc_mask, QPC_CQEIS);
+       }
+
        return 0;
 }
 
index b1b3e1e..af9d002 100644 (file)
@@ -531,7 +531,8 @@ struct hns_roce_v2_qp_context {
 #define QPC_RQ_RTY_TX_ERR QPC_FIELD_LOC(607, 607)
 #define QPC_RX_CQN QPC_FIELD_LOC(631, 608)
 #define QPC_XRC_QP_TYPE QPC_FIELD_LOC(632, 632)
-#define QPC_RSV3 QPC_FIELD_LOC(634, 633)
+#define QPC_CQEIE QPC_FIELD_LOC(633, 633)
+#define QPC_CQEIS QPC_FIELD_LOC(634, 634)
 #define QPC_MIN_RNR_TIME QPC_FIELD_LOC(639, 635)
 #define QPC_RQ_PRODUCER_IDX QPC_FIELD_LOC(655, 640)
 #define QPC_RQ_CONSUMER_IDX QPC_FIELD_LOC(671, 656)
index 3e3ece0..485e110 100644 (file)
@@ -385,6 +385,12 @@ static int hns_roce_alloc_ucontext(struct ib_ucontext *uctx,
                        resp.config |= HNS_ROCE_RSP_RQ_INLINE_FLAGS;
        }
 
+       if (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_CQE_INLINE) {
+               context->config |= ucmd.config & HNS_ROCE_CQE_INLINE_FLAGS;
+               if (context->config & HNS_ROCE_CQE_INLINE_FLAGS)
+                       resp.config |= HNS_ROCE_RSP_CQE_INLINE_FLAGS;
+       }
+
        ret = hns_roce_uar_alloc(hr_dev, &context->uar);
        if (ret)
                goto error_fail_uar_alloc;
index 6c09408..2e68a8b 100644 (file)
@@ -88,11 +88,13 @@ struct hns_roce_ib_create_qp_resp {
 enum {
        HNS_ROCE_EXSGE_FLAGS = 1 << 0,
        HNS_ROCE_RQ_INLINE_FLAGS = 1 << 1,
+       HNS_ROCE_CQE_INLINE_FLAGS = 1 << 2,
 };
 
 enum {
        HNS_ROCE_RSP_EXSGE_FLAGS = 1 << 0,
        HNS_ROCE_RSP_RQ_INLINE_FLAGS = 1 << 1,
+       HNS_ROCE_RSP_CQE_INLINE_FLAGS = 1 << 2,
 };
 
 struct hns_roce_ib_alloc_ucontext_resp {