octeontx2-af: Cleanup loopback device checks
authorGeetha sowjanya <gakula@marvell.com>
Wed, 31 Jan 2024 07:54:41 +0000 (13:24 +0530)
committerDavid S. Miller <davem@davemloft.net>
Fri, 2 Feb 2024 12:12:35 +0000 (12:12 +0000)
PCI device IDs of RVU device IDs are configurable and
RVU PF0's (ie AF's) are currently assumed as VFs that
identify loopback functionality ie LBKVFs. But in some
cases these VFs can be setup for different functionality.
Hence remove assumptions that AF's VFs are always LBK VFs
by renaming 'is_afvf' as 'is_lbkvf' explicitly and also
identify LBK VF using PCI dev ID. Similar change is done
for other VF types.

Signed-off-by: Geetha sowjanya <gakula@marvell.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/marvell/octeontx2/af/rvu.c
drivers/net/ethernet/marvell/octeontx2/af/rvu.h
drivers/net/ethernet/marvell/octeontx2/af/rvu_nix.c
drivers/net/ethernet/marvell/octeontx2/af/rvu_npc.c
drivers/net/ethernet/marvell/octeontx2/af/rvu_sdp.c

index 7048167707d151aab6a52b305ed7f6b5bd191721..edd12d09dc89a300a8fca35b7d9ba0b61f460fee 100644 (file)
@@ -1484,7 +1484,7 @@ int rvu_get_nix_blkaddr(struct rvu *rvu, u16 pcifunc)
        /* All CGX mapped PFs are set with assigned NIX block during init */
        if (is_pf_cgxmapped(rvu, rvu_get_pf(pcifunc))) {
                blkaddr = pf->nix_blkaddr;
-       } else if (is_afvf(pcifunc)) {
+       } else if (is_lbk_vf(rvu, pcifunc)) {
                vf = pcifunc - 1;
                /* Assign NIX based on VF number. All even numbered VFs get
                 * NIX0 and odd numbered gets NIX1
@@ -2034,7 +2034,7 @@ int rvu_mbox_handler_set_vf_perm(struct rvu *rvu, struct set_vf_perm *req,
        u16 target;
 
        /* Only PF can add VF permissions */
-       if ((pcifunc & RVU_PFVF_FUNC_MASK) || is_afvf(pcifunc))
+       if ((pcifunc & RVU_PFVF_FUNC_MASK) || is_lbk_vf(rvu, pcifunc))
                return -EOPNOTSUPP;
 
        target = (pcifunc & ~RVU_PFVF_FUNC_MASK) | (req->vf + 1);
@@ -3154,6 +3154,7 @@ static int rvu_enable_sriov(struct rvu *rvu)
 {
        struct pci_dev *pdev = rvu->pdev;
        int err, chans, vfs;
+       int pos = 0;
 
        if (!rvu_afvf_msix_vectors_num_ok(rvu)) {
                dev_warn(&pdev->dev,
@@ -3161,6 +3162,12 @@ static int rvu_enable_sriov(struct rvu *rvu)
                return 0;
        }
 
+       /* Get RVU VFs device id */
+       pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_SRIOV);
+       if (!pos)
+               return 0;
+       pci_read_config_word(pdev, pos + PCI_SRIOV_VF_DID, &rvu->vf_devid);
+
        chans = rvu_get_num_lbk_chans();
        if (chans < 0)
                return chans;
index 6971f441c22b9891d9fdca88437ed5a787f57570..a1d5fc65b92d4ca2b1dccf1720fb8be25125e198 100644 (file)
@@ -514,6 +514,7 @@ struct rvu {
        struct mutex            rsrc_lock; /* Serialize resource alloc/free */
        struct mutex            alias_lock; /* Serialize bar2 alias access */
        int                     vfs; /* Number of VFs attached to RVU */
+       u16                     vf_devid; /* VF devices id */
        int                     nix_blkaddr[MAX_NIX_BLKS];
 
        /* Mbox */
@@ -743,9 +744,11 @@ static inline bool is_rvu_supports_nix1(struct rvu *rvu)
 /* Function Prototypes
  * RVU
  */
-static inline bool is_afvf(u16 pcifunc)
+#define        RVU_LBK_VF_DEVID        0xA0F8
+static inline bool is_lbk_vf(struct rvu *rvu, u16 pcifunc)
 {
-       return !(pcifunc & ~RVU_PFVF_FUNC_MASK);
+       return (!(pcifunc & ~RVU_PFVF_FUNC_MASK) &&
+               (rvu->vf_devid == RVU_LBK_VF_DEVID));
 }
 
 static inline bool is_vf(u16 pcifunc)
@@ -805,7 +808,7 @@ void rvu_aq_free(struct rvu *rvu, struct admin_queue *aq);
 int rvu_sdp_init(struct rvu *rvu);
 bool is_sdp_pfvf(u16 pcifunc);
 bool is_sdp_pf(u16 pcifunc);
-bool is_sdp_vf(u16 pcifunc);
+bool is_sdp_vf(struct rvu *rvu, u16 pcifunc);
 
 /* CGX APIs */
 static inline bool is_pf_cgxmapped(struct rvu *rvu, u8 pf)
index 09e7d84f8025cf96b98580dc0cdeabd631b0061c..d39001cdc707ee3f72e80a9be503b438e8ff9eca 100644 (file)
@@ -545,7 +545,7 @@ void rvu_nix_flr_free_bpids(struct rvu *rvu, u16 pcifunc)
        struct nix_hw *nix_hw;
        struct nix_bp *bp;
 
-       if (!is_afvf(pcifunc))
+       if (!is_lbk_vf(rvu, pcifunc))
                return;
 
        err = nix_get_struct_ptrs(rvu, pcifunc, &nix_hw, &blkaddr);
@@ -580,7 +580,7 @@ int rvu_mbox_handler_nix_bp_disable(struct rvu *rvu,
        u64 cfg;
 
        pf = rvu_get_pf(pcifunc);
-       type = is_afvf(pcifunc) ? NIX_INTF_TYPE_LBK : NIX_INTF_TYPE_CGX;
+       type = is_lbk_vf(rvu, pcifunc) ? NIX_INTF_TYPE_LBK : NIX_INTF_TYPE_CGX;
        if (!is_pf_cgxmapped(rvu, pf) && type != NIX_INTF_TYPE_LBK)
                return 0;
 
@@ -703,7 +703,7 @@ int rvu_mbox_handler_nix_bp_enable(struct rvu *rvu,
        u64 cfg;
 
        pf = rvu_get_pf(pcifunc);
-       type = is_afvf(pcifunc) ? NIX_INTF_TYPE_LBK : NIX_INTF_TYPE_CGX;
+       type = is_lbk_vf(rvu, pcifunc) ? NIX_INTF_TYPE_LBK : NIX_INTF_TYPE_CGX;
        if (is_sdp_pfvf(pcifunc))
                type = NIX_INTF_TYPE_SDP;
 
@@ -1614,7 +1614,7 @@ int rvu_mbox_handler_nix_lf_alloc(struct rvu *rvu,
        cfg = NPC_TX_DEF_PKIND;
        rvu_write64(rvu, blkaddr, NIX_AF_LFX_TX_PARSE_CFG(nixlf), cfg);
 
-       intf = is_afvf(pcifunc) ? NIX_INTF_TYPE_LBK : NIX_INTF_TYPE_CGX;
+       intf = is_lbk_vf(rvu, pcifunc) ? NIX_INTF_TYPE_LBK : NIX_INTF_TYPE_CGX;
        if (is_sdp_pfvf(pcifunc))
                intf = NIX_INTF_TYPE_SDP;
 
@@ -1990,7 +1990,7 @@ static int nix_get_tx_link(struct rvu *rvu, u16 pcifunc)
        int pf = rvu_get_pf(pcifunc);
        u8 cgx_id = 0, lmac_id = 0;
 
-       if (is_afvf(pcifunc)) {/* LBK links */
+       if (is_lbk_vf(rvu, pcifunc)) {/* LBK links */
                return hw->cgx_links;
        } else if (is_pf_cgxmapped(rvu, pf)) {
                rvu_get_cgx_lmac_id(rvu->pf2cgxlmac_map[pf], &cgx_id, &lmac_id);
@@ -2007,7 +2007,7 @@ static void nix_get_txschq_range(struct rvu *rvu, u16 pcifunc,
        struct rvu_hwinfo *hw = rvu->hw;
        int pf = rvu_get_pf(pcifunc);
 
-       if (is_afvf(pcifunc)) { /* LBK links */
+       if (is_lbk_vf(rvu, pcifunc)) { /* LBK links */
                *start = hw->cap.nix_txsch_per_cgx_lmac * link;
                *end = *start + hw->cap.nix_txsch_per_lbk_lmac;
        } else if (is_pf_cgxmapped(rvu, pf)) { /* CGX links */
@@ -3447,7 +3447,7 @@ static int nix_update_mce_rule(struct rvu *rvu, u16 pcifunc,
        int pf;
 
        /* skip multicast pkt replication for AF's VFs & SDP links */
-       if (is_afvf(pcifunc) || is_sdp_pfvf(pcifunc))
+       if (is_lbk_vf(rvu, pcifunc) || is_sdp_pfvf(pcifunc))
                return 0;
 
        if (!hw->cap.nix_rx_multicast)
@@ -3794,7 +3794,7 @@ int rvu_mbox_handler_nix_get_hw_info(struct rvu *rvu, struct msg_req *req,
        if (blkaddr < 0)
                return NIX_AF_ERR_AF_LF_INVALID;
 
-       if (is_afvf(pcifunc))
+       if (is_lbk_vf(rvu, pcifunc))
                rvu_get_lbk_link_max_frs(rvu, &rsp->max_mtu);
        else
                rvu_get_lmac_link_max_frs(rvu, &rsp->max_mtu);
@@ -4518,7 +4518,7 @@ int rvu_mbox_handler_nix_set_hw_frs(struct rvu *rvu, struct nix_frs_cfg *req,
        if (!nix_hw)
                return NIX_AF_ERR_INVALID_NIXBLK;
 
-       if (is_afvf(pcifunc))
+       if (is_lbk_vf(rvu, pcifunc))
                rvu_get_lbk_link_max_frs(rvu, &max_mtu);
        else
                rvu_get_lmac_link_max_frs(rvu, &max_mtu);
index 167145bdcb75d3f852134fcaa44fc2f307c42478..da3573b0dfc291b8d55324aaff6372b9337576a8 100644 (file)
@@ -417,7 +417,7 @@ static void npc_fixup_vf_rule(struct rvu *rvu, struct npc_mcam *mcam,
        owner = mcam->entry2pfvf_map[index];
        target_func = (entry->action >> 4) & 0xffff;
        /* do nothing when target is LBK/PF or owner is not PF */
-       if (is_pffunc_af(owner) || is_afvf(target_func) ||
+       if (is_pffunc_af(owner) || is_lbk_vf(rvu, target_func) ||
            (owner & RVU_PFVF_FUNC_MASK) ||
            !(target_func & RVU_PFVF_FUNC_MASK))
                return;
@@ -626,7 +626,7 @@ void rvu_npc_install_ucast_entry(struct rvu *rvu, u16 pcifunc,
        int blkaddr, index;
 
        /* AF's and SDP VFs work in promiscuous mode */
-       if (is_afvf(pcifunc) || is_sdp_vf(pcifunc))
+       if (is_lbk_vf(rvu, pcifunc) || is_sdp_vf(rvu, pcifunc))
                return;
 
        blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NPC, 0);
@@ -791,7 +791,7 @@ void rvu_npc_install_bcast_match_entry(struct rvu *rvu, u16 pcifunc,
                return;
 
        /* Skip LBK VFs */
-       if (is_afvf(pcifunc))
+       if (is_lbk_vf(rvu, pcifunc))
                return;
 
        /* If pkt replication is not supported,
@@ -871,7 +871,7 @@ void rvu_npc_install_allmulti_entry(struct rvu *rvu, u16 pcifunc, int nixlf,
        u16 vf_func;
 
        /* Only CGX PF/VF can add allmulticast entry */
-       if (is_afvf(pcifunc) && is_sdp_vf(pcifunc))
+       if (is_lbk_vf(rvu, pcifunc) && is_sdp_vf(rvu, pcifunc))
                return;
 
        blkaddr = rvu_get_blkaddr(rvu, BLKTYPE_NPC, 0);
index ae50d56258ec6c4fd95f863c8f078a0fef351de9..1edfda0ae3e8823004831838181fbbf03cd135d8 100644 (file)
@@ -40,8 +40,12 @@ bool is_sdp_pf(u16 pcifunc)
                !(pcifunc & RVU_PFVF_FUNC_MASK));
 }
 
-bool is_sdp_vf(u16 pcifunc)
+#define        RVU_SDP_VF_DEVID        0xA0F7
+bool is_sdp_vf(struct rvu *rvu, u16 pcifunc)
 {
+       if (!(pcifunc & ~RVU_PFVF_FUNC_MASK))
+               return (rvu->vf_devid == RVU_SDP_VF_DEVID);
+
        return (is_sdp_pfvf(pcifunc) &&
                !!(pcifunc & RVU_PFVF_FUNC_MASK));
 }