RDMA/hns: Add profile support for hip08 driver
authorWei Hu(Xavier) <xavier.huwei@huawei.com>
Wed, 30 Aug 2017 09:23:04 +0000 (17:23 +0800)
committerDoug Ledford <dledford@redhat.com>
Wed, 27 Sep 2017 12:34:55 +0000 (08:34 -0400)
The profile's content mainly set some specifications and obtain
some hardware resources by implementing the relative commands.
Because max sge num of send queue is not the same with receive
queue in hip08, we modified the calculation of props->max_sge
in query_device ops.

Signed-off-by: Lijun Ou <oulijun@huawei.com>
Signed-off-by: Shaobo Xu <xushaobo2@huawei.com>
Signed-off-by: Wei Hu (Xavier) <xavier.huwei@huawei.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/hw/hns/hns_roce_device.h
drivers/infiniband/hw/hns/hns_roce_hw_v1.c
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

index 87c2e07..8ec6d6e 100644 (file)
@@ -477,6 +477,7 @@ struct hns_roce_caps {
        u32             max_wqes;       /* 16k */
        u32             max_sq_desc_sz; /* 64 */
        u32             max_rq_desc_sz; /* 64 */
+       u32             max_srq_desc_sz;
        int             max_qp_init_rdma;
        int             max_qp_dest_rdma;
        int             num_cqs;
@@ -487,6 +488,7 @@ struct hns_roce_caps {
        int             num_other_vectors;
        int             num_mtpts;
        u32             num_mtt_segs;
+       u32             num_cqe_segs;
        int             reserved_mrws;
        int             reserved_uars;
        int             num_pds;
@@ -502,13 +504,17 @@ struct hns_roce_caps {
        int             aeqe_depth;
        int             ceqe_depth[HNS_ROCE_COMP_VEC_NUM];
        enum ib_mtu     max_mtu;
+       u32             qpc_bt_num;
+       u32             srqc_bt_num;
+       u32             cqc_bt_num;
+       u32             mpt_bt_num;
 };
 
 struct hns_roce_hw {
        int (*reset)(struct hns_roce_dev *hr_dev, bool enable);
        int (*cmq_init)(struct hns_roce_dev *hr_dev);
        void (*cmq_exit)(struct hns_roce_dev *hr_dev);
-       void (*hw_profile)(struct hns_roce_dev *hr_dev);
+       int (*hw_profile)(struct hns_roce_dev *hr_dev);
        int (*hw_init)(struct hns_roce_dev *hr_dev);
        void (*hw_exit)(struct hns_roce_dev *hr_dev);
        void (*set_gid)(struct hns_roce_dev *hr_dev, u8 port, int gid_index,
index 22cc3fb..267e400 100644 (file)
@@ -1459,7 +1459,7 @@ static void hns_roce_des_qp_free(struct hns_roce_dev *hr_dev)
        destroy_workqueue(des_qp->qp_wq);
 }
 
-void hns_roce_v1_profile(struct hns_roce_dev *hr_dev)
+int hns_roce_v1_profile(struct hns_roce_dev *hr_dev)
 {
        int i = 0;
        struct hns_roce_caps *caps = &hr_dev->caps;
@@ -1525,6 +1525,8 @@ void hns_roce_v1_profile(struct hns_roce_dev *hr_dev)
        caps->local_ca_ack_delay = le32_to_cpu(roce_read(hr_dev,
                                                         ROCEE_ACK_DELAY_REG));
        caps->max_mtu = IB_MTU_2048;
+
+       return 0;
 }
 
 int hns_roce_v1_init(struct hns_roce_dev *hr_dev)
index b610f3a..af3cb30 100644 (file)
@@ -308,9 +308,255 @@ int hns_roce_cmq_send(struct hns_roce_dev *hr_dev,
        return ret;
 }
 
+int hns_roce_cmq_query_hw_info(struct hns_roce_dev *hr_dev)
+{
+       struct hns_roce_query_version *resp;
+       struct hns_roce_cmq_desc desc;
+       int ret;
+
+       hns_roce_cmq_setup_basic_desc(&desc, HNS_ROCE_OPC_QUERY_HW_VER, true);
+       ret = hns_roce_cmq_send(hr_dev, &desc, 1);
+       if (ret)
+               return ret;
+
+       resp = (struct hns_roce_query_version *)desc.data;
+       hr_dev->hw_rev = le32_to_cpu(resp->rocee_hw_version);
+       hr_dev->vendor_id = le32_to_cpu(resp->rocee_vendor_id);
+
+       return 0;
+}
+
+static int hns_roce_config_global_param(struct hns_roce_dev *hr_dev)
+{
+       struct hns_roce_cfg_global_param *req;
+       struct hns_roce_cmq_desc desc;
+
+       hns_roce_cmq_setup_basic_desc(&desc, HNS_ROCE_OPC_CFG_GLOBAL_PARAM,
+                                     false);
+
+       req = (struct hns_roce_cfg_global_param *)desc.data;
+       memset(req, 0, sizeof(*req));
+       roce_set_field(req->time_cfg_udp_port,
+                      CFG_GLOBAL_PARAM_DATA_0_ROCEE_TIME_1US_CFG_M,
+                      CFG_GLOBAL_PARAM_DATA_0_ROCEE_TIME_1US_CFG_S, 0x3e8);
+       roce_set_field(req->time_cfg_udp_port,
+                      CFG_GLOBAL_PARAM_DATA_0_ROCEE_UDP_PORT_M,
+                      CFG_GLOBAL_PARAM_DATA_0_ROCEE_UDP_PORT_S, 0x12b7);
+
+       return hns_roce_cmq_send(hr_dev, &desc, 1);
+}
+
+static int hns_roce_query_pf_resource(struct hns_roce_dev *hr_dev)
+{
+       struct hns_roce_cmq_desc desc[2];
+       struct hns_roce_pf_res *res;
+       int ret;
+       int i;
+
+       for (i = 0; i < 2; i++) {
+               hns_roce_cmq_setup_basic_desc(&desc[i],
+                                             HNS_ROCE_OPC_QUERY_PF_RES, true);
+
+               if (i == 0)
+                       desc[i].flag |= cpu_to_le16(HNS_ROCE_CMD_FLAG_NEXT);
+               else
+                       desc[i].flag &= ~cpu_to_le16(HNS_ROCE_CMD_FLAG_NEXT);
+       }
+
+       ret = hns_roce_cmq_send(hr_dev, desc, 2);
+       if (ret)
+               return ret;
+
+       res = (struct hns_roce_pf_res *)desc[0].data;
+
+       hr_dev->caps.qpc_bt_num = roce_get_field(res->qpc_bt_idx_num,
+                                                PF_RES_DATA_1_PF_QPC_BT_NUM_M,
+                                                PF_RES_DATA_1_PF_QPC_BT_NUM_S);
+       hr_dev->caps.srqc_bt_num = roce_get_field(res->srqc_bt_idx_num,
+                                               PF_RES_DATA_2_PF_SRQC_BT_NUM_M,
+                                               PF_RES_DATA_2_PF_SRQC_BT_NUM_S);
+       hr_dev->caps.cqc_bt_num = roce_get_field(res->cqc_bt_idx_num,
+                                                PF_RES_DATA_3_PF_CQC_BT_NUM_M,
+                                                PF_RES_DATA_3_PF_CQC_BT_NUM_S);
+       hr_dev->caps.mpt_bt_num = roce_get_field(res->mpt_bt_idx_num,
+                                                PF_RES_DATA_4_PF_MPT_BT_NUM_M,
+                                                PF_RES_DATA_4_PF_MPT_BT_NUM_S);
+
+       return 0;
+}
+
+static int hns_roce_alloc_vf_resource(struct hns_roce_dev *hr_dev)
+{
+       struct hns_roce_cmq_desc desc[2];
+       struct hns_roce_vf_res_a *req_a;
+       struct hns_roce_vf_res_b *req_b;
+       int i;
+
+       req_a = (struct hns_roce_vf_res_a *)desc[0].data;
+       req_b = (struct hns_roce_vf_res_b *)desc[1].data;
+       memset(req_a, 0, sizeof(*req_a));
+       memset(req_b, 0, sizeof(*req_b));
+       for (i = 0; i < 2; i++) {
+               hns_roce_cmq_setup_basic_desc(&desc[i],
+                                             HNS_ROCE_OPC_ALLOC_VF_RES, false);
+
+               if (i == 0)
+                       desc[i].flag |= cpu_to_le16(HNS_ROCE_CMD_FLAG_NEXT);
+               else
+                       desc[i].flag &= ~cpu_to_le16(HNS_ROCE_CMD_FLAG_NEXT);
+
+               if (i == 0) {
+                       roce_set_field(req_a->vf_qpc_bt_idx_num,
+                                      VF_RES_A_DATA_1_VF_QPC_BT_IDX_M,
+                                      VF_RES_A_DATA_1_VF_QPC_BT_IDX_S, 0);
+                       roce_set_field(req_a->vf_qpc_bt_idx_num,
+                                      VF_RES_A_DATA_1_VF_QPC_BT_NUM_M,
+                                      VF_RES_A_DATA_1_VF_QPC_BT_NUM_S,
+                                      HNS_ROCE_VF_QPC_BT_NUM);
+
+                       roce_set_field(req_a->vf_srqc_bt_idx_num,
+                                      VF_RES_A_DATA_2_VF_SRQC_BT_IDX_M,
+                                      VF_RES_A_DATA_2_VF_SRQC_BT_IDX_S, 0);
+                       roce_set_field(req_a->vf_srqc_bt_idx_num,
+                                      VF_RES_A_DATA_2_VF_SRQC_BT_NUM_M,
+                                      VF_RES_A_DATA_2_VF_SRQC_BT_NUM_S,
+                                      HNS_ROCE_VF_SRQC_BT_NUM);
+
+                       roce_set_field(req_a->vf_cqc_bt_idx_num,
+                                      VF_RES_A_DATA_3_VF_CQC_BT_IDX_M,
+                                      VF_RES_A_DATA_3_VF_CQC_BT_IDX_S, 0);
+                       roce_set_field(req_a->vf_cqc_bt_idx_num,
+                                      VF_RES_A_DATA_3_VF_CQC_BT_NUM_M,
+                                      VF_RES_A_DATA_3_VF_CQC_BT_NUM_S,
+                                      HNS_ROCE_VF_CQC_BT_NUM);
+
+                       roce_set_field(req_a->vf_mpt_bt_idx_num,
+                                      VF_RES_A_DATA_4_VF_MPT_BT_IDX_M,
+                                      VF_RES_A_DATA_4_VF_MPT_BT_IDX_S, 0);
+                       roce_set_field(req_a->vf_mpt_bt_idx_num,
+                                      VF_RES_A_DATA_4_VF_MPT_BT_NUM_M,
+                                      VF_RES_A_DATA_4_VF_MPT_BT_NUM_S,
+                                      HNS_ROCE_VF_MPT_BT_NUM);
+
+                       roce_set_field(req_a->vf_eqc_bt_idx_num,
+                                      VF_RES_A_DATA_5_VF_EQC_IDX_M,
+                                      VF_RES_A_DATA_5_VF_EQC_IDX_S, 0);
+                       roce_set_field(req_a->vf_eqc_bt_idx_num,
+                                      VF_RES_A_DATA_5_VF_EQC_NUM_M,
+                                      VF_RES_A_DATA_5_VF_EQC_NUM_S,
+                                      HNS_ROCE_VF_EQC_NUM);
+               } else {
+                       roce_set_field(req_b->vf_smac_idx_num,
+                                      VF_RES_B_DATA_1_VF_SMAC_IDX_M,
+                                      VF_RES_B_DATA_1_VF_SMAC_IDX_S, 0);
+                       roce_set_field(req_b->vf_smac_idx_num,
+                                      VF_RES_B_DATA_1_VF_SMAC_NUM_M,
+                                      VF_RES_B_DATA_1_VF_SMAC_NUM_S,
+                                      HNS_ROCE_VF_SMAC_NUM);
+
+                       roce_set_field(req_b->vf_sgid_idx_num,
+                                      VF_RES_B_DATA_2_VF_SGID_IDX_M,
+                                      VF_RES_B_DATA_2_VF_SGID_IDX_S, 0);
+                       roce_set_field(req_b->vf_sgid_idx_num,
+                                      VF_RES_B_DATA_2_VF_SGID_NUM_M,
+                                      VF_RES_B_DATA_2_VF_SGID_NUM_S,
+                                      HNS_ROCE_VF_SGID_NUM);
+
+                       roce_set_field(req_b->vf_qid_idx_sl_num,
+                                      VF_RES_B_DATA_3_VF_QID_IDX_M,
+                                      VF_RES_B_DATA_3_VF_QID_IDX_S, 0);
+                       roce_set_field(req_b->vf_qid_idx_sl_num,
+                                      VF_RES_B_DATA_3_VF_SL_NUM_M,
+                                      VF_RES_B_DATA_3_VF_SL_NUM_S,
+                                      HNS_ROCE_VF_SL_NUM);
+               }
+       }
+
+       return hns_roce_cmq_send(hr_dev, desc, 2);
+}
+
+static int hns_roce_v2_profile(struct hns_roce_dev *hr_dev)
+{
+       struct hns_roce_caps *caps = &hr_dev->caps;
+       int ret;
+
+       ret = hns_roce_cmq_query_hw_info(hr_dev);
+       if (ret) {
+               dev_err(hr_dev->dev, "Query firmware version fail, ret = %d.\n",
+                       ret);
+               return ret;
+       }
+
+       ret = hns_roce_config_global_param(hr_dev);
+       if (ret) {
+               dev_err(hr_dev->dev, "Configure global param fail, ret = %d.\n",
+                       ret);
+       }
+
+       /* Get pf resource owned by every pf */
+       ret = hns_roce_query_pf_resource(hr_dev);
+       if (ret) {
+               dev_err(hr_dev->dev, "Query pf resource fail, ret = %d.\n",
+                       ret);
+               return ret;
+       }
+
+       ret = hns_roce_alloc_vf_resource(hr_dev);
+       if (ret) {
+               dev_err(hr_dev->dev, "Allocate vf resource fail, ret = %d.\n",
+                       ret);
+               return ret;
+       }
+
+       hr_dev->vendor_part_id = 0;
+       hr_dev->sys_image_guid = 0;
+
+       caps->num_qps           = HNS_ROCE_V2_MAX_QP_NUM;
+       caps->max_wqes          = HNS_ROCE_V2_MAX_WQE_NUM;
+       caps->num_cqs           = HNS_ROCE_V2_MAX_CQ_NUM;
+       caps->max_cqes          = HNS_ROCE_V2_MAX_CQE_NUM;
+       caps->max_sq_sg         = HNS_ROCE_V2_MAX_SQ_SGE_NUM;
+       caps->max_rq_sg         = HNS_ROCE_V2_MAX_RQ_SGE_NUM;
+       caps->max_sq_inline     = HNS_ROCE_V2_MAX_SQ_INLINE;
+       caps->num_uars          = HNS_ROCE_V2_UAR_NUM;
+       caps->phy_num_uars      = HNS_ROCE_V2_PHY_UAR_NUM;
+       caps->num_aeq_vectors   = 1;
+       caps->num_comp_vectors  = 63;
+       caps->num_other_vectors = 0;
+       caps->num_mtpts         = HNS_ROCE_V2_MAX_MTPT_NUM;
+       caps->num_mtt_segs      = HNS_ROCE_V2_MAX_MTT_SEGS;
+       caps->num_cqe_segs      = HNS_ROCE_V2_MAX_CQE_SEGS;
+       caps->num_pds           = HNS_ROCE_V2_MAX_PD_NUM;
+       caps->max_qp_init_rdma  = HNS_ROCE_V2_MAX_QP_INIT_RDMA;
+       caps->max_qp_dest_rdma  = HNS_ROCE_V2_MAX_QP_DEST_RDMA;
+       caps->max_sq_desc_sz    = HNS_ROCE_V2_MAX_SQ_DESC_SZ;
+       caps->max_rq_desc_sz    = HNS_ROCE_V2_MAX_RQ_DESC_SZ;
+       caps->max_srq_desc_sz   = HNS_ROCE_V2_MAX_SRQ_DESC_SZ;
+       caps->qpc_entry_sz      = HNS_ROCE_V2_QPC_ENTRY_SZ;
+       caps->irrl_entry_sz     = HNS_ROCE_V2_IRRL_ENTRY_SZ;
+       caps->cqc_entry_sz      = HNS_ROCE_V2_CQC_ENTRY_SZ;
+       caps->mtpt_entry_sz     = HNS_ROCE_V2_MTPT_ENTRY_SZ;
+       caps->mtt_entry_sz      = HNS_ROCE_V2_MTT_ENTRY_SZ;
+       caps->cq_entry_sz       = HNS_ROCE_V2_CQE_ENTRY_SIZE;
+       caps->page_size_cap     = HNS_ROCE_V2_PAGE_SIZE_SUPPORTED;
+       caps->reserved_lkey     = 0;
+       caps->reserved_pds      = 0;
+       caps->reserved_mrws     = 1;
+       caps->reserved_uars     = 0;
+       caps->reserved_cqs      = 0;
+
+       caps->pkey_table_len[0] = 1;
+       caps->gid_table_len[0] = 2;
+       caps->local_ca_ack_delay = 0;
+       caps->max_mtu = IB_MTU_4096;
+
+       return 0;
+}
+
 static const struct hns_roce_hw hns_roce_hw_v2 = {
        .cmq_init = hns_roce_v2_cmq_init,
        .cmq_exit = hns_roce_v2_cmq_exit,
+       .hw_profile = hns_roce_v2_profile,
 };
 
 static const struct pci_device_id hns_roce_hw_v2_pci_tbl[] = {
index 781ae74..3dcc800 100644 (file)
 #ifndef _HNS_ROCE_HW_V2_H
 #define _HNS_ROCE_HW_V2_H
 
+#include <linux/bitops.h>
+
+#define HNS_ROCE_VF_QPC_BT_NUM                 256
+#define HNS_ROCE_VF_SRQC_BT_NUM                        64
+#define HNS_ROCE_VF_CQC_BT_NUM                 64
+#define HNS_ROCE_VF_MPT_BT_NUM                 64
+#define HNS_ROCE_VF_EQC_NUM                    64
+#define HNS_ROCE_VF_SMAC_NUM                   32
+#define HNS_ROCE_VF_SGID_NUM                   32
+#define HNS_ROCE_VF_SL_NUM                     8
+
+#define HNS_ROCE_V2_MAX_QP_NUM                 0x2000
+#define HNS_ROCE_V2_MAX_WQE_NUM                        0x8000
+#define HNS_ROCE_V2_MAX_CQ_NUM                 0x8000
+#define HNS_ROCE_V2_MAX_CQE_NUM                        0x400000
+#define HNS_ROCE_V2_MAX_RQ_SGE_NUM             0x100
+#define HNS_ROCE_V2_MAX_SQ_SGE_NUM             0xff
+#define HNS_ROCE_V2_MAX_SQ_INLINE              0x20
+#define HNS_ROCE_V2_UAR_NUM                    256
+#define HNS_ROCE_V2_PHY_UAR_NUM                        1
+#define HNS_ROCE_V2_MAX_MTPT_NUM               0x8000
+#define HNS_ROCE_V2_MAX_MTT_SEGS               0x100000
+#define HNS_ROCE_V2_MAX_CQE_SEGS               0x10000
+#define HNS_ROCE_V2_MAX_PD_NUM                 0x400000
+#define HNS_ROCE_V2_MAX_QP_INIT_RDMA           128
+#define HNS_ROCE_V2_MAX_QP_DEST_RDMA           128
+#define HNS_ROCE_V2_MAX_SQ_DESC_SZ             64
+#define HNS_ROCE_V2_MAX_RQ_DESC_SZ             16
+#define HNS_ROCE_V2_MAX_SRQ_DESC_SZ            64
+#define HNS_ROCE_V2_QPC_ENTRY_SZ               256
+#define HNS_ROCE_V2_IRRL_ENTRY_SZ              64
+#define HNS_ROCE_V2_CQC_ENTRY_SZ               64
+#define HNS_ROCE_V2_MTPT_ENTRY_SZ              64
+#define HNS_ROCE_V2_MTT_ENTRY_SZ               64
+#define HNS_ROCE_V2_CQE_ENTRY_SIZE             32
+#define HNS_ROCE_V2_PAGE_SIZE_SUPPORTED                0xFFFFF000
+#define HNS_ROCE_V2_MAX_INNER_MTPT_NUM         2
 #define HNS_ROCE_CMQ_TX_TIMEOUT                        200
 
 #define HNS_ROCE_CMD_FLAG_IN_VALID_SHIFT       0
@@ -75,6 +112,130 @@ enum hns_roce_cmd_return_status {
        CMD_QUEUE_FULL          = 3,
 };
 
+struct hns_roce_query_version {
+       __le16 rocee_vendor_id;
+       __le16 rocee_hw_version;
+       __le32 rsv[5];
+};
+
+struct hns_roce_cfg_global_param {
+       __le32 time_cfg_udp_port;
+       __le32 rsv[5];
+};
+
+#define CFG_GLOBAL_PARAM_DATA_0_ROCEE_TIME_1US_CFG_S 0
+#define CFG_GLOBAL_PARAM_DATA_0_ROCEE_TIME_1US_CFG_M GENMASK(9, 0)
+
+#define CFG_GLOBAL_PARAM_DATA_0_ROCEE_UDP_PORT_S 16
+#define CFG_GLOBAL_PARAM_DATA_0_ROCEE_UDP_PORT_M GENMASK(31, 16)
+
+struct hns_roce_pf_res {
+       __le32  rsv;
+       __le32  qpc_bt_idx_num;
+       __le32  srqc_bt_idx_num;
+       __le32  cqc_bt_idx_num;
+       __le32  mpt_bt_idx_num;
+       __le32  eqc_bt_idx_num;
+};
+
+#define PF_RES_DATA_1_PF_QPC_BT_IDX_S 0
+#define PF_RES_DATA_1_PF_QPC_BT_IDX_M GENMASK(10, 0)
+
+#define PF_RES_DATA_1_PF_QPC_BT_NUM_S 16
+#define PF_RES_DATA_1_PF_QPC_BT_NUM_M GENMASK(27, 16)
+
+#define PF_RES_DATA_2_PF_SRQC_BT_IDX_S 0
+#define PF_RES_DATA_2_PF_SRQC_BT_IDX_M GENMASK(8, 0)
+
+#define PF_RES_DATA_2_PF_SRQC_BT_NUM_S 16
+#define PF_RES_DATA_2_PF_SRQC_BT_NUM_M GENMASK(25, 16)
+
+#define PF_RES_DATA_3_PF_CQC_BT_IDX_S 0
+#define PF_RES_DATA_3_PF_CQC_BT_IDX_M GENMASK(8, 0)
+
+#define PF_RES_DATA_3_PF_CQC_BT_NUM_S 16
+#define PF_RES_DATA_3_PF_CQC_BT_NUM_M GENMASK(25, 16)
+
+#define PF_RES_DATA_4_PF_MPT_BT_IDX_S 0
+#define PF_RES_DATA_4_PF_MPT_BT_IDX_M GENMASK(8, 0)
+
+#define PF_RES_DATA_4_PF_MPT_BT_NUM_S 16
+#define PF_RES_DATA_4_PF_MPT_BT_NUM_M GENMASK(25, 16)
+
+#define PF_RES_DATA_5_PF_EQC_BT_IDX_S 0
+#define PF_RES_DATA_5_PF_EQC_BT_IDX_M GENMASK(8, 0)
+
+#define PF_RES_DATA_5_PF_EQC_BT_NUM_S 16
+#define PF_RES_DATA_5_PF_EQC_BT_NUM_M GENMASK(25, 16)
+
+struct hns_roce_vf_res_a {
+       u32 vf_id;
+       u32 vf_qpc_bt_idx_num;
+       u32 vf_srqc_bt_idx_num;
+       u32 vf_cqc_bt_idx_num;
+       u32 vf_mpt_bt_idx_num;
+       u32 vf_eqc_bt_idx_num;
+};
+
+#define VF_RES_A_DATA_1_VF_QPC_BT_IDX_S 0
+#define VF_RES_A_DATA_1_VF_QPC_BT_IDX_M GENMASK(10, 0)
+
+#define VF_RES_A_DATA_1_VF_QPC_BT_NUM_S 16
+#define VF_RES_A_DATA_1_VF_QPC_BT_NUM_M GENMASK(27, 16)
+
+#define VF_RES_A_DATA_2_VF_SRQC_BT_IDX_S 0
+#define VF_RES_A_DATA_2_VF_SRQC_BT_IDX_M GENMASK(8, 0)
+
+#define VF_RES_A_DATA_2_VF_SRQC_BT_NUM_S 16
+#define VF_RES_A_DATA_2_VF_SRQC_BT_NUM_M GENMASK(25, 16)
+
+#define VF_RES_A_DATA_3_VF_CQC_BT_IDX_S 0
+#define VF_RES_A_DATA_3_VF_CQC_BT_IDX_M GENMASK(8, 0)
+
+#define VF_RES_A_DATA_3_VF_CQC_BT_NUM_S 16
+#define VF_RES_A_DATA_3_VF_CQC_BT_NUM_M GENMASK(25, 16)
+
+#define VF_RES_A_DATA_4_VF_MPT_BT_IDX_S 0
+#define VF_RES_A_DATA_4_VF_MPT_BT_IDX_M GENMASK(8, 0)
+
+#define VF_RES_A_DATA_4_VF_MPT_BT_NUM_S 16
+#define VF_RES_A_DATA_4_VF_MPT_BT_NUM_M GENMASK(25, 16)
+
+#define VF_RES_A_DATA_5_VF_EQC_IDX_S 0
+#define VF_RES_A_DATA_5_VF_EQC_IDX_M GENMASK(8, 0)
+
+#define VF_RES_A_DATA_5_VF_EQC_NUM_S 16
+#define VF_RES_A_DATA_5_VF_EQC_NUM_M GENMASK(25, 16)
+
+struct hns_roce_vf_res_b {
+       u32 rsv0;
+       u32 vf_smac_idx_num;
+       u32 vf_sgid_idx_num;
+       u32 vf_qid_idx_sl_num;
+       u32 rsv[2];
+};
+
+#define VF_RES_B_DATA_0_VF_ID_S 0
+#define VF_RES_B_DATA_0_VF_ID_M GENMASK(7, 0)
+
+#define VF_RES_B_DATA_1_VF_SMAC_IDX_S 0
+#define VF_RES_B_DATA_1_VF_SMAC_IDX_M GENMASK(7, 0)
+
+#define VF_RES_B_DATA_1_VF_SMAC_NUM_S 8
+#define VF_RES_B_DATA_1_VF_SMAC_NUM_M GENMASK(16, 8)
+
+#define VF_RES_B_DATA_2_VF_SGID_IDX_S 0
+#define VF_RES_B_DATA_2_VF_SGID_IDX_M GENMASK(7, 0)
+
+#define VF_RES_B_DATA_2_VF_SGID_NUM_S 8
+#define VF_RES_B_DATA_2_VF_SGID_NUM_M GENMASK(16, 8)
+
+#define VF_RES_B_DATA_3_VF_QID_IDX_S 0
+#define VF_RES_B_DATA_3_VF_QID_IDX_M GENMASK(9, 0)
+
+#define VF_RES_B_DATA_3_VF_SL_NUM_S 16
+#define VF_RES_B_DATA_3_VF_SL_NUM_M GENMASK(19, 16)
+
 struct hns_roce_cmq_desc {
        u16 opcode;
        u16 flag;
index 4f5a6fd..db6593e 100644 (file)
@@ -202,7 +202,7 @@ static int hns_roce_query_device(struct ib_device *ib_dev,
        props->max_qp_wr = hr_dev->caps.max_wqes;
        props->device_cap_flags = IB_DEVICE_PORT_ACTIVE_EVENT |
                                  IB_DEVICE_RC_RNR_NAK_GEN;
-       props->max_sge = hr_dev->caps.max_sq_sg;
+       props->max_sge = max(hr_dev->caps.max_sq_sg, hr_dev->caps.max_rq_sg);
        props->max_sge_rd = 1;
        props->max_cq = hr_dev->caps.num_cqs;
        props->max_cqe = hr_dev->caps.max_cqes;
@@ -686,7 +686,11 @@ int hns_roce_init(struct hns_roce_dev *hr_dev)
                }
        }
 
-       hr_dev->hw->hw_profile(hr_dev);
+       ret = hr_dev->hw->hw_profile(hr_dev);
+       if (ret) {
+               dev_err(dev, "Get RoCE engine profile failed!\n");
+               goto error_failed_cmd_init;
+       }
 
        ret = hns_roce_cmd_init(hr_dev);
        if (ret) {