RDMA/hns: Add gsi qp support for modifying qp in hip08
It needs to Assign the values for some fields in qp context when qp type is gsi qp type in hip08. Signed-off-by: Lijun Ou <oulijun@huawei.com> Signed-off-by: Yixian Liu <liuyixian@huawei.com> Signed-off-by: Wei Hu (Xavier) <xavier.huwei@huawei.com> Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
This commit is contained in:
parent
b66efc9320
commit
0fa95a9a71
|
@ -485,6 +485,7 @@ struct hns_roce_qp {
|
|||
u32 access_flags;
|
||||
u32 atomic_rd_en;
|
||||
u32 pkey_index;
|
||||
u32 qkey;
|
||||
void (*event)(struct hns_roce_qp *,
|
||||
enum hns_roce_event);
|
||||
unsigned long qpn;
|
||||
|
|
|
@ -1975,6 +1975,7 @@ static void set_access_flags(struct hns_roce_qp *hr_qp,
|
|||
|
||||
static void modify_qp_reset_to_init(struct ib_qp *ibqp,
|
||||
const struct ib_qp_attr *attr,
|
||||
int attr_mask,
|
||||
struct hns_roce_v2_qp_context *context,
|
||||
struct hns_roce_v2_qp_context *qpc_mask)
|
||||
{
|
||||
|
@ -1991,9 +1992,18 @@ static void modify_qp_reset_to_init(struct ib_qp *ibqp,
|
|||
roce_set_field(qpc_mask->byte_4_sqpn_tst, V2_QPC_BYTE_4_TST_M,
|
||||
V2_QPC_BYTE_4_TST_S, 0);
|
||||
|
||||
roce_set_field(context->byte_4_sqpn_tst, V2_QPC_BYTE_4_SGE_SHIFT_M,
|
||||
V2_QPC_BYTE_4_SGE_SHIFT_S, hr_qp->sq.max_gs > 2 ?
|
||||
ilog2((unsigned int)hr_qp->sge.sge_cnt) : 0);
|
||||
if (ibqp->qp_type == IB_QPT_GSI)
|
||||
roce_set_field(context->byte_4_sqpn_tst,
|
||||
V2_QPC_BYTE_4_SGE_SHIFT_M,
|
||||
V2_QPC_BYTE_4_SGE_SHIFT_S,
|
||||
ilog2((unsigned int)hr_qp->sge.sge_cnt));
|
||||
else
|
||||
roce_set_field(context->byte_4_sqpn_tst,
|
||||
V2_QPC_BYTE_4_SGE_SHIFT_M,
|
||||
V2_QPC_BYTE_4_SGE_SHIFT_S,
|
||||
hr_qp->sq.max_gs > 2 ?
|
||||
ilog2((unsigned int)hr_qp->sge.sge_cnt) : 0);
|
||||
|
||||
roce_set_field(qpc_mask->byte_4_sqpn_tst, V2_QPC_BYTE_4_SGE_SHIFT_M,
|
||||
V2_QPC_BYTE_4_SGE_SHIFT_S, 0);
|
||||
|
||||
|
@ -2058,6 +2068,12 @@ static void modify_qp_reset_to_init(struct ib_qp *ibqp,
|
|||
roce_set_bit(qpc_mask->byte_28_at_fl, V2_QPC_BYTE_28_CNP_TX_FLAG_S, 0);
|
||||
roce_set_bit(qpc_mask->byte_28_at_fl, V2_QPC_BYTE_28_CE_FLAG_S, 0);
|
||||
|
||||
if (attr_mask & IB_QP_QKEY) {
|
||||
context->qkey_xrcd = attr->qkey;
|
||||
qpc_mask->qkey_xrcd = 0;
|
||||
hr_qp->qkey = attr->qkey;
|
||||
}
|
||||
|
||||
roce_set_bit(context->byte_76_srqn_op_en, V2_QPC_BYTE_76_RQIE_S, 1);
|
||||
roce_set_bit(qpc_mask->byte_76_srqn_op_en, V2_QPC_BYTE_76_RQIE_S, 0);
|
||||
|
||||
|
@ -2279,9 +2295,17 @@ static void modify_qp_init_to_init(struct ib_qp *ibqp,
|
|||
roce_set_field(qpc_mask->byte_4_sqpn_tst, V2_QPC_BYTE_4_TST_M,
|
||||
V2_QPC_BYTE_4_TST_S, 0);
|
||||
|
||||
roce_set_field(context->byte_4_sqpn_tst, V2_QPC_BYTE_4_SGE_SHIFT_M,
|
||||
V2_QPC_BYTE_4_SGE_SHIFT_S, hr_qp->sq.max_gs > 2 ?
|
||||
ilog2((unsigned int)hr_qp->sge.sge_cnt) : 0);
|
||||
if (ibqp->qp_type == IB_QPT_GSI)
|
||||
roce_set_field(context->byte_4_sqpn_tst,
|
||||
V2_QPC_BYTE_4_SGE_SHIFT_M,
|
||||
V2_QPC_BYTE_4_SGE_SHIFT_S,
|
||||
ilog2((unsigned int)hr_qp->sge.sge_cnt));
|
||||
else
|
||||
roce_set_field(context->byte_4_sqpn_tst,
|
||||
V2_QPC_BYTE_4_SGE_SHIFT_M,
|
||||
V2_QPC_BYTE_4_SGE_SHIFT_S, hr_qp->sq.max_gs > 2 ?
|
||||
ilog2((unsigned int)hr_qp->sge.sge_cnt) : 0);
|
||||
|
||||
roce_set_field(qpc_mask->byte_4_sqpn_tst, V2_QPC_BYTE_4_SGE_SHIFT_M,
|
||||
V2_QPC_BYTE_4_SGE_SHIFT_S, 0);
|
||||
|
||||
|
@ -2358,10 +2382,10 @@ static void modify_qp_init_to_init(struct ib_qp *ibqp,
|
|||
V2_QPC_BYTE_76_SRQN_M, V2_QPC_BYTE_76_SRQN_S, 0);
|
||||
}
|
||||
|
||||
if (attr_mask & IB_QP_PKEY_INDEX)
|
||||
context->qkey_xrcd = attr->pkey_index;
|
||||
else
|
||||
context->qkey_xrcd = hr_qp->pkey_index;
|
||||
if (attr_mask & IB_QP_QKEY) {
|
||||
context->qkey_xrcd = attr->qkey;
|
||||
qpc_mask->qkey_xrcd = 0;
|
||||
}
|
||||
|
||||
roce_set_field(context->byte_4_sqpn_tst, V2_QPC_BYTE_4_SQPN_M,
|
||||
V2_QPC_BYTE_4_SQPN_S, hr_qp->qpn);
|
||||
|
@ -2457,7 +2481,8 @@ static int modify_qp_init_to_rtr(struct ib_qp *ibqp,
|
|||
roce_set_field(context->byte_20_smac_sgid_idx,
|
||||
V2_QPC_BYTE_20_SGE_HOP_NUM_M,
|
||||
V2_QPC_BYTE_20_SGE_HOP_NUM_S,
|
||||
hr_qp->sq.max_gs > 2 ? hr_dev->caps.mtt_hop_num : 0);
|
||||
((ibqp->qp_type == IB_QPT_GSI) || hr_qp->sq.max_gs > 2) ?
|
||||
hr_dev->caps.mtt_hop_num : 0);
|
||||
roce_set_field(qpc_mask->byte_20_smac_sgid_idx,
|
||||
V2_QPC_BYTE_20_SGE_HOP_NUM_M,
|
||||
V2_QPC_BYTE_20_SGE_HOP_NUM_S, 0);
|
||||
|
@ -2617,8 +2642,13 @@ static int modify_qp_init_to_rtr(struct ib_qp *ibqp,
|
|||
roce_set_field(qpc_mask->byte_24_mtu_tc, V2_QPC_BYTE_24_TC_M,
|
||||
V2_QPC_BYTE_24_TC_S, 0);
|
||||
|
||||
roce_set_field(context->byte_24_mtu_tc, V2_QPC_BYTE_24_MTU_M,
|
||||
V2_QPC_BYTE_24_MTU_S, attr->path_mtu);
|
||||
if (ibqp->qp_type == IB_QPT_GSI || ibqp->qp_type == IB_QPT_UD)
|
||||
roce_set_field(context->byte_24_mtu_tc, V2_QPC_BYTE_24_MTU_M,
|
||||
V2_QPC_BYTE_24_MTU_S, IB_MTU_4096);
|
||||
else
|
||||
roce_set_field(context->byte_24_mtu_tc, V2_QPC_BYTE_24_MTU_M,
|
||||
V2_QPC_BYTE_24_MTU_S, attr->path_mtu);
|
||||
|
||||
roce_set_field(qpc_mask->byte_24_mtu_tc, V2_QPC_BYTE_24_MTU_M,
|
||||
V2_QPC_BYTE_24_MTU_S, 0);
|
||||
|
||||
|
@ -2725,13 +2755,14 @@ static int modify_qp_rtr_to_rts(struct ib_qp *ibqp,
|
|||
V2_QPC_BYTE_168_SQ_CUR_BLK_ADDR_S, 0);
|
||||
|
||||
page_size = 1 << (hr_dev->caps.mtt_buf_pg_sz + PAGE_SHIFT);
|
||||
context->sq_cur_sge_blk_addr = hr_qp->sq.max_gs > 2 ?
|
||||
context->sq_cur_sge_blk_addr =
|
||||
((ibqp->qp_type == IB_QPT_GSI) || hr_qp->sq.max_gs > 2) ?
|
||||
((u32)(mtts[hr_qp->sge.offset / page_size]
|
||||
>> PAGE_ADDR_SHIFT)) : 0;
|
||||
roce_set_field(context->byte_184_irrl_idx,
|
||||
V2_QPC_BYTE_184_SQ_CUR_SGE_BLK_ADDR_M,
|
||||
V2_QPC_BYTE_184_SQ_CUR_SGE_BLK_ADDR_S,
|
||||
hr_qp->sq.max_gs > 2 ?
|
||||
((ibqp->qp_type == IB_QPT_GSI) || hr_qp->sq.max_gs > 2) ?
|
||||
(mtts[hr_qp->sge.offset / page_size] >>
|
||||
(32 + PAGE_ADDR_SHIFT)) : 0);
|
||||
qpc_mask->sq_cur_sge_blk_addr = 0;
|
||||
|
@ -2902,7 +2933,8 @@ static int hns_roce_v2_modify_qp(struct ib_qp *ibqp,
|
|||
*/
|
||||
memset(qpc_mask, 0xff, sizeof(*qpc_mask));
|
||||
if (cur_state == IB_QPS_RESET && new_state == IB_QPS_INIT) {
|
||||
modify_qp_reset_to_init(ibqp, attr, context, qpc_mask);
|
||||
modify_qp_reset_to_init(ibqp, attr, attr_mask, context,
|
||||
qpc_mask);
|
||||
} else if (cur_state == IB_QPS_INIT && new_state == IB_QPS_INIT) {
|
||||
modify_qp_init_to_init(ibqp, attr, attr_mask, context,
|
||||
qpc_mask);
|
||||
|
|
Loading…
Reference in New Issue