RDMA/hns: Add gsi qp support for modifying qp in hip08
authoroulijun <oulijun@huawei.com>
Wed, 10 Jan 2018 06:39:49 +0000 (14:39 +0800)
committerJason Gunthorpe <jgg@mellanox.com>
Wed, 17 Jan 2018 03:38:18 +0000 (20:38 -0700)
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>
drivers/infiniband/hw/hns/hns_roce_device.h
drivers/infiniband/hw/hns/hns_roce_hw_v2.c

index 4afa070b20fdfd6d4f8f75fc6d280db1635f9f0b..42c3b5a2d441d64d9e435f784c45ed24a31adb64 100644 (file)
@@ -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;
index faf91eea9cf0113b32c3ab0eef889a736c3ab5cc..c919ffc1b34b04d452764cc32f8e08b8b55fc6a9 100644 (file)
@@ -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);