Commit b3b7a525 authored by Luoyouming's avatar Luoyouming Committed by Zheng Zengkai
Browse files

RDMA/hns: Support cqe inline in user space

driver inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I5USIG



----------------------------------------------------------

Enable the CQEIE field and configure the CQEIS field of QPC.
And add compatibility handling.

Signed-off-by: default avatarLuoyouming <luoyouming@huawei.com>
Reviewed-by: default avatarYangyang Li <liyangyang20@huawei.com>
Reviewed-by: default avatarHaoyue Xu <xuhaoyue1@hisilicon.com>
Reviewed-by: default avatarYueHaibing <yuehaibing@huawei.com>
Signed-off-by: default avatarZheng Zengkai <zhengzengkai@huawei.com>
parent d67087cc
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -145,6 +145,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),
	HNS_ROCE_CAP_FLAG_RQ_INLINE		= BIT(20),
};

+12 −0
Original line number Diff line number Diff line
@@ -4726,6 +4726,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;
}

+2 −1
Original line number Diff line number Diff line
@@ -529,7 +529,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)
+5 −0
Original line number Diff line number Diff line
@@ -384,6 +384,11 @@ 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;
		resp.config |= HNS_ROCE_RSP_CQE_INLINE_FLAGS;
	}

	ret = hns_roce_uar_alloc(hr_dev, &context->uar);
	if (ret)
		goto error_fail_uar_alloc;
+2 −0
Original line number Diff line number Diff line
@@ -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 {