From: Peng Zhang <peng.zh...@corigine.com>

In single PF case, all the VFs belong to the PF0, so the first VF ID
of the PF is always 0.
But in multiple PF case, VFs are shared by the PFs, and the first VF ID
of the PF is different, so it is necessary to get the right ID.

Signed-off-by: Peng Zhang <peng.zh...@corigine.com>
Reviewed-by: Chaoyong He <chaoyong...@corigine.com>
Reviewed-by: Long Wu <long...@corigine.com>
---
 drivers/net/nfp/flower/nfp_flower.c             | 2 +-
 drivers/net/nfp/flower/nfp_flower_cmsg.h        | 1 +
 drivers/net/nfp/flower/nfp_flower_ctrl.c        | 7 +++++--
 drivers/net/nfp/flower/nfp_flower_representor.c | 2 +-
 drivers/net/nfp/nfp_ethdev.c                    | 1 +
 drivers/net/nfp/nfp_net_common.h                | 2 ++
 6 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/drivers/net/nfp/flower/nfp_flower.c 
b/drivers/net/nfp/flower/nfp_flower.c
index 87bd9dda2e..602f45d1dd 100644
--- a/drivers/net/nfp/flower/nfp_flower.c
+++ b/drivers/net/nfp/flower/nfp_flower.c
@@ -116,7 +116,7 @@ nfp_flower_get_repr(struct nfp_net_hw_priv *hw_priv,
                port =  NFP_FLOWER_CMSG_PORT_PHYS_PORT_NUM(port_id);
                return app_fw_flower->phy_reprs[port];
        case NFP_FLOWER_CMSG_PORT_TYPE_PCIE_PORT:
-               port = NFP_FLOWER_CMSG_PORT_VNIC(port_id);
+               port = NFP_FLOWER_CMSG_PORT_VNIC_OFFSET(port_id, 
hw_priv->pf_dev->vf_base_id);
                return app_fw_flower->vf_reprs[port];
        default:
                break;
diff --git a/drivers/net/nfp/flower/nfp_flower_cmsg.h 
b/drivers/net/nfp/flower/nfp_flower_cmsg.h
index bb03234035..93183153aa 100644
--- a/drivers/net/nfp/flower/nfp_flower_cmsg.h
+++ b/drivers/net/nfp/flower/nfp_flower_cmsg.h
@@ -422,6 +422,7 @@ enum nfp_flower_cmsg_port_vnic_type {
 #define NFP_FLOWER_CMSG_PORT_PCI(x)             (((x) >> 14) & 0x3)  /* 
[14,15] */
 #define NFP_FLOWER_CMSG_PORT_VNIC_TYPE(x)       (((x) >> 12) & 0x3)  /* 
[12,13] */
 #define NFP_FLOWER_CMSG_PORT_VNIC(x)            (((x) >> 6) & 0x3f)  /* [6,11] 
*/
+#define NFP_FLOWER_CMSG_PORT_VNIC_OFFSET(x, offset)    
(NFP_FLOWER_CMSG_PORT_VNIC(x) - (offset))
 #define NFP_FLOWER_CMSG_PORT_PCIE_Q(x)          ((x) & 0x3f)         /* [0,5] 
*/
 #define NFP_FLOWER_CMSG_PORT_PHYS_PORT_NUM(x)   ((x) & 0xff)         /* [0,7] 
*/
 
diff --git a/drivers/net/nfp/flower/nfp_flower_ctrl.c 
b/drivers/net/nfp/flower/nfp_flower_ctrl.c
index 01a680eb6d..a46b849d1b 100644
--- a/drivers/net/nfp/flower/nfp_flower_ctrl.c
+++ b/drivers/net/nfp/flower/nfp_flower_ctrl.c
@@ -419,6 +419,7 @@ nfp_flower_cmsg_port_mod_rx(struct nfp_net_hw_priv *hw_priv,
                struct rte_mbuf *pkt_burst)
 {
        uint32_t port;
+       uint32_t index;
        struct nfp_flower_representor *repr;
        struct nfp_flower_cmsg_port_mod *msg;
        struct nfp_app_fw_flower *app_fw_flower;
@@ -430,11 +431,13 @@ nfp_flower_cmsg_port_mod_rx(struct nfp_net_hw_priv 
*hw_priv,
 
        switch (NFP_FLOWER_CMSG_PORT_TYPE(port)) {
        case NFP_FLOWER_CMSG_PORT_TYPE_PHYS_PORT:
-               repr = 
app_fw_flower->phy_reprs[NFP_FLOWER_CMSG_PORT_PHYS_PORT_NUM(port)];
+               index = NFP_FLOWER_CMSG_PORT_PHYS_PORT_NUM(port);
+               repr = app_fw_flower->phy_reprs[index];
                break;
        case NFP_FLOWER_CMSG_PORT_TYPE_PCIE_PORT:
+               index = NFP_FLOWER_CMSG_PORT_VNIC_OFFSET(port, 
hw_priv->pf_dev->vf_base_id);
                if (NFP_FLOWER_CMSG_PORT_VNIC_TYPE(port) == 
NFP_FLOWER_CMSG_PORT_VNIC_TYPE_VF)
-                       repr =  
app_fw_flower->vf_reprs[NFP_FLOWER_CMSG_PORT_VNIC(port)];
+                       repr =  app_fw_flower->vf_reprs[index];
                else
                        repr = app_fw_flower->pf_repr;
                break;
diff --git a/drivers/net/nfp/flower/nfp_flower_representor.c 
b/drivers/net/nfp/flower/nfp_flower_representor.c
index 59dc5854b5..e6fef45ddd 100644
--- a/drivers/net/nfp/flower/nfp_flower_representor.c
+++ b/drivers/net/nfp/flower/nfp_flower_representor.c
@@ -877,7 +877,7 @@ nfp_flower_repr_alloc(struct nfp_app_fw_flower 
*app_fw_flower,
        for (i = 0; i < app_fw_flower->num_vf_reprs; i++) {
                flower_repr.repr_type = NFP_REPR_TYPE_VF;
                flower_repr.port_id = nfp_get_pcie_port_id(pf_dev->cpp,
-                               NFP_FLOWER_CMSG_PORT_VNIC_TYPE_VF, i, 0);
+                               NFP_FLOWER_CMSG_PORT_VNIC_TYPE_VF, i + 
pf_dev->vf_base_id, 0);
                flower_repr.nfp_idx = 0;
                flower_repr.vf_id = i;
 
diff --git a/drivers/net/nfp/nfp_ethdev.c b/drivers/net/nfp/nfp_ethdev.c
index e67ff3a0a0..482d23eb5c 100644
--- a/drivers/net/nfp/nfp_ethdev.c
+++ b/drivers/net/nfp/nfp_ethdev.c
@@ -1924,6 +1924,7 @@ nfp_pf_get_sriov_vf(struct nfp_pf_dev *pf_dev,
                return -ERANGE;
        }
 
+       pf_dev->vf_base_id = offset;
        pf_dev->sriov_vf = sriov_vf;
 
        return 0;
diff --git a/drivers/net/nfp/nfp_net_common.h b/drivers/net/nfp/nfp_net_common.h
index 7efd0161af..d3c70a21d4 100644
--- a/drivers/net/nfp/nfp_net_common.h
+++ b/drivers/net/nfp/nfp_net_common.h
@@ -147,6 +147,8 @@ struct nfp_pf_dev {
        uint16_t sriov_vf;
 
        uint8_t total_phyports;
+       /** Id of first VF that belongs to this PF */
+       uint8_t vf_base_id;
 };
 
 #define NFP_NET_FLOW_LIMIT    1024
-- 
2.39.1

Reply via email to