]> git.droids-corp.org - dpdk.git/commitdiff
net/bnxt: modify VNIC accounting
authorKalesh AP <kalesh-anakkur.purayil@broadcom.com>
Sun, 20 Dec 2020 05:24:27 +0000 (21:24 -0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Wed, 13 Jan 2021 18:24:30 +0000 (19:24 +0100)
Modify VNIC accounting when enabling RFS on newer chips.
Unlike legacy chips, newer chips don't need additional VNIC resources
for ntuple filter. Fix the code accordingly so that we don't reserve
and allocate additional VNICs on newer chips.

Signed-off-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
Reviewed-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
drivers/net/bnxt/bnxt.h
drivers/net/bnxt/bnxt_ethdev.c
drivers/net/bnxt/bnxt_flow.c
drivers/net/bnxt/bnxt_hwrm.c
drivers/net/bnxt/bnxt_hwrm.h

index 14f52b2c4f60c10633fb496b696a9266813e52e2..276d807c7b132325be38c90903269105e15b42b4 100644 (file)
@@ -643,6 +643,9 @@ struct bnxt {
 #define BNXT_FLAG_DFLT_MAC_SET                 BIT(26)
 #define BNXT_FLAG_TRUFLOW_EN                   BIT(27)
 #define BNXT_FLAG_GFID_ENABLE                  BIT(28)
+#define BNXT_FLAG_RFS_NEEDS_VNIC               BIT(29)
+#define BNXT_FLAG_FLOW_CFA_RFS_RING_TBL_IDX_V2 BIT(30)
+#define BNXT_RFS_NEEDS_VNIC(bp)        ((bp)->flags & BNXT_FLAG_RFS_NEEDS_VNIC)
 #define BNXT_PF(bp)            (!((bp)->flags & BNXT_FLAG_VF))
 #define BNXT_VF(bp)            ((bp)->flags & BNXT_FLAG_VF)
 #define BNXT_NPAR(bp)          ((bp)->flags & BNXT_FLAG_NPAR_PF)
index 02ab87bba60981e74fae9f8c0fd77a5681341c75..8ca4fb1515faa37ab2e292bd0f3d2a96ba00dc74 100644 (file)
@@ -748,11 +748,17 @@ skip_cosq_cfg:
                goto err_out;
        }
 
+       /* default vnic 0 */
+       rc = bnxt_setup_one_vnic(bp, 0);
+       if (rc)
+               goto err_out;
        /* VNIC configuration */
-       for (i = 0; i < bp->nr_vnics; i++) {
-               rc = bnxt_setup_one_vnic(bp, i);
-               if (rc)
-                       goto err_out;
+       if (BNXT_RFS_NEEDS_VNIC(bp)) {
+               for (i = 1; i < bp->nr_vnics; i++) {
+                       rc = bnxt_setup_one_vnic(bp, i);
+                       if (rc)
+                               goto err_out;
+               }
        }
 
        rc = bnxt_hwrm_cfa_l2_set_rx_mask(bp, &bp->vnic_info[0], 0, NULL);
@@ -4698,6 +4704,10 @@ static int bnxt_init_fw(struct bnxt *bp)
        if (rc)
                return rc;
 
+       rc = bnxt_hwrm_cfa_adv_flow_mgmt_qcaps(bp);
+       if (rc)
+               return rc;
+
        bnxt_hwrm_port_mac_qcfg(bp);
 
        bnxt_hwrm_parent_pf_qcfg(bp);
index 127d51c45b652ed47e5a0b441be3bc47fe1cc0b0..07d359edf69c2a03e6984e7f87f31227ec81a2ac 100644 (file)
@@ -1056,6 +1056,13 @@ start:
                }
                PMD_DRV_LOG(DEBUG, "Queue index %d\n", act_q->index);
 
+               if (use_ntuple && !BNXT_RFS_NEEDS_VNIC(bp)) {
+                       filter->flags =
+                               HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_FLAGS_DEST_RFS_RING_IDX;
+                       filter->dst_id = act_q->index;
+                       goto skip_vnic_alloc;
+               }
+
                vnic_id = attr->group;
                if (!vnic_id) {
                        PMD_DRV_LOG(DEBUG, "Group id is 0\n");
@@ -1127,7 +1134,7 @@ use_vnic:
                PMD_DRV_LOG(DEBUG,
                            "Setting vnic ff_idx %d\n", vnic->ff_pool_idx);
                filter->dst_id = vnic->fw_vnic_id;
-
+skip_vnic_alloc:
                /* For ntuple filter, create the L2 filter with default VNIC.
                 * The user specified redirect queue will be set while creating
                 * the ntuple filter in hardware.
@@ -1808,7 +1815,10 @@ bnxt_flow_create(struct rte_eth_dev *dev,
                }
        }
 
-       vnic = find_matching_vnic(bp, filter);
+       if (BNXT_RFS_NEEDS_VNIC(bp))
+               vnic = find_matching_vnic(bp, filter);
+       else
+               vnic = BNXT_GET_DEFAULT_VNIC(bp);
 done:
        if (!ret || update_flow) {
                flow->filter = filter;
index 350fe2f97e5f77068bb7710a04b9685ed1467494..56e2e33a940ec607a80a43cfb7ad65df34598cf2 100644 (file)
@@ -5834,3 +5834,35 @@ int bnxt_hwrm_cfa_pair_free(struct bnxt *bp, struct bnxt_representor *rep_bp)
                    rep_bp->vf_id);
        return rc;
 }
+
+int bnxt_hwrm_cfa_adv_flow_mgmt_qcaps(struct bnxt *bp)
+{
+       struct hwrm_cfa_adv_flow_mgnt_qcaps_output *resp =
+                                       bp->hwrm_cmd_resp_addr;
+       struct hwrm_cfa_adv_flow_mgnt_qcaps_input req = {0};
+       uint32_t flags = 0;
+       int rc = 0;
+
+       if (!(bp->fw_cap & BNXT_FW_CAP_ADV_FLOW_MGMT))
+               return 0;
+
+       if (!(BNXT_PF(bp) || BNXT_VF_IS_TRUSTED(bp))) {
+               PMD_DRV_LOG(DEBUG,
+                           "Not a PF or trusted VF. Command not supported\n");
+               return 0;
+       }
+
+       HWRM_PREP(&req, HWRM_CFA_ADV_FLOW_MGNT_QCAPS, BNXT_USE_CHIMP_MB);
+       rc = bnxt_hwrm_send_message(bp, &req, sizeof(req), BNXT_USE_CHIMP_MB);
+
+       HWRM_CHECK_RESULT();
+       flags = rte_le_to_cpu_32(resp->flags);
+       HWRM_UNLOCK();
+
+       if (flags & HWRM_CFA_ADV_FLOW_MGNT_QCAPS_RFS_RING_TBL_IDX_V2_SUPPORTED)
+               bp->flags |= BNXT_FLAG_FLOW_CFA_RFS_RING_TBL_IDX_V2;
+       else
+               bp->flags |= BNXT_FLAG_RFS_NEEDS_VNIC;
+
+       return rc;
+}
index 4b32907730789227be9ab68ffe2b9d86f0b4683e..7deea29caedc48cf49bf4b48065160d5fb048157 100644 (file)
@@ -55,8 +55,8 @@ struct hwrm_func_qstats_output;
 #define HWRM_PORT_PHY_CFG_IN_EN_AUTO_LINK_SPEED_MASK \
        HWRM_PORT_PHY_CFG_INPUT_ENABLES_AUTO_LINK_SPEED_MASK
 
-#define HWRM_CFA_ADV_FLOW_MGNT_QCAPS_L2_HDR_SRC_FILTER_EN \
-HWRM_CFA_ADV_FLOW_MGNT_QCAPS_OUTPUT_FLAGS_L2_HEADER_SOURCE_FIELDS_SUPPORTED
+#define HWRM_CFA_ADV_FLOW_MGNT_QCAPS_RFS_RING_TBL_IDX_V2_SUPPORTED \
+       HWRM_CFA_ADV_FLOW_MGNT_QCAPS_OUTPUT_FLAGS_RFS_RING_TBL_IDX_V2_SUPPORTED
 
 #define HWRM_SPEC_CODE_1_8_4           0x10804
 #define HWRM_SPEC_CODE_1_9_0           0x10900
@@ -300,4 +300,5 @@ int bnxt_hwrm_first_vf_id_query(struct bnxt *bp, uint16_t fid,
                                uint16_t *first_vf_id);
 int bnxt_hwrm_cfa_pair_alloc(struct bnxt *bp, struct bnxt_representor *rep);
 int bnxt_hwrm_cfa_pair_free(struct bnxt *bp, struct bnxt_representor *rep);
+int bnxt_hwrm_cfa_adv_flow_mgmt_qcaps(struct bnxt *bp);
 #endif