net/hns3: fix dumping VF register information
authorWei Hu (Xavier) <xavier.huwei@huawei.com>
Thu, 9 Jan 2020 03:15:57 +0000 (11:15 +0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 17 Jan 2020 18:46:26 +0000 (19:46 +0100)
Currently, when the API interface named rte_eth_dev_get_reg_info is
called by upper applications based on VF device, it returns error.

We can read registers directly to get ring and interrupt related
information in hns3 PF/VF PMD driver. But for some other internal table
entries and common configuration information, we can get them only
through the command interface between driver and firmware in PF driver,
and VF driver has not the related access permission.

This patch fixes it by preventing getting these information through the
command interface based on VF device in 'get_reg' ops implementation
function.

Fixes: 936eda25e8da ("net/hns3: support dump register")
Cc: stable@dpdk.org
Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
Signed-off-by: Wei Hu (Xavier) <xavier.huwei@huawei.com>
drivers/net/hns3/hns3_regs.c

index 2340503..a3f2a51 100644 (file)
@@ -118,15 +118,9 @@ hns3_get_regs_length(struct hns3_hw *hw, uint32_t *length)
        struct hns3_adapter *hns = HNS3_DEV_HW_TO_ADAPTER(hw);
        int cmdq_lines, common_lines, ring_lines, tqp_intr_lines;
        uint32_t regs_num_32_bit, regs_num_64_bit;
+       uint32_t len;
        int ret;
 
-       ret = hns3_get_regs_num(hw, &regs_num_32_bit, &regs_num_64_bit);
-       if (ret) {
-               hns3_err(hw, "Get register number failed, ret = %d.",
-                        ret);
-               return -ENOTSUP;
-       }
-
        cmdq_lines = sizeof(cmdq_reg_addrs) / REG_LEN_PER_LINE + 1;
        if (hns->is_vf)
                common_lines =
@@ -136,11 +130,21 @@ hns3_get_regs_length(struct hns3_hw *hw, uint32_t *length)
        ring_lines = sizeof(ring_reg_addrs) / REG_LEN_PER_LINE + 1;
        tqp_intr_lines = sizeof(tqp_intr_reg_addrs) / REG_LEN_PER_LINE + 1;
 
-       *length = (cmdq_lines + common_lines + ring_lines * hw->tqps_num +
-                  tqp_intr_lines * hw->num_msi) * REG_LEN_PER_LINE +
-                 regs_num_32_bit * sizeof(uint32_t) +
-                 regs_num_64_bit * sizeof(uint64_t);
+       len = (cmdq_lines + common_lines + ring_lines * hw->tqps_num +
+             tqp_intr_lines * hw->num_msi) * REG_LEN_PER_LINE;
 
+       if (!hns->is_vf) {
+               ret = hns3_get_regs_num(hw, &regs_num_32_bit, &regs_num_64_bit);
+               if (ret) {
+                       hns3_err(hw, "Get register number failed, ret = %d.",
+                                ret);
+                       return -ENOTSUP;
+               }
+               len += regs_num_32_bit * sizeof(uint32_t) +
+                      regs_num_64_bit * sizeof(uint64_t);
+       }
+
+       *length = len;
        return 0;
 }
 
@@ -346,6 +350,9 @@ hns3_get_regs(struct rte_eth_dev *eth_dev, struct rte_dev_reg_info *regs)
        /* fetching per-PF registers values from PF PCIe register space */
        hns3_direct_access_regs(hw, data);
 
+       if (hns->is_vf)
+               return 0;
+
        ret = hns3_get_regs_num(hw, &regs_num_32_bit, &regs_num_64_bit);
        if (ret) {
                hns3_err(hw, "Get register number failed, ret = %d", ret);