net/bnxt: increase counter support from 8K to 16K
[dpdk.git] / drivers / net / bnxt / tf_ulp / ulp_mark_mgr.c
index 04d441d..8b8dccf 100644 (file)
                                                BNXT_ULP_MARK_VALID)
 #define ULP_MARK_DB_ENTRY_IS_INVALID(mark_info) (!((mark_info)->flags &\
                                                   BNXT_ULP_MARK_VALID))
+#define ULP_MARK_DB_ENTRY_SET_VFR_ID(mark_info) ((mark_info)->flags |=\
+                                                BNXT_ULP_MARK_VFR_ID)
+#define ULP_MARK_DB_ENTRY_IS_VFR_ID(mark_info) ((mark_info)->flags &\
+                                               BNXT_ULP_MARK_VFR_ID)
 #define ULP_MARK_DB_ENTRY_IS_GLOBAL_HW_FID(mark_info) ((mark_info)->flags &\
                                                BNXT_ULP_MARK_GLOBAL_HW_FID)
 
@@ -75,7 +79,7 @@ ulp_mark_db_init(struct bnxt_ulp_context *ctxt)
                goto mem_error;
 
        /* Need to allocate 2 * Num flows to account for hash type bit.*/
-       mark_tbl->lfid_num_entries = dparms->lfid_entries;
+       mark_tbl->lfid_num_entries = dparms->mark_db_lfid_entries;
        mark_tbl->lfid_tbl = rte_zmalloc("ulp_rx_em_flow_mark_table",
                                         mark_tbl->lfid_num_entries *
                                         sizeof(struct bnxt_lfid_mark_info),
@@ -84,7 +88,10 @@ ulp_mark_db_init(struct bnxt_ulp_context *ctxt)
                goto mem_error;
 
        /* Need to allocate 2 * Num flows to account for hash type bit */
-       mark_tbl->gfid_num_entries = dparms->gfid_entries;
+       mark_tbl->gfid_num_entries = dparms->mark_db_gfid_entries;
+       if (!mark_tbl->gfid_num_entries)
+               goto gfid_not_required;
+
        mark_tbl->gfid_tbl = rte_zmalloc("ulp_rx_eem_flow_mark_table",
                                         mark_tbl->gfid_num_entries *
                                         sizeof(struct bnxt_gfid_mark_info),
@@ -107,14 +114,17 @@ ulp_mark_db_init(struct bnxt_ulp_context *ctxt)
                    mark_tbl->gfid_num_entries - 1,
                    mark_tbl->gfid_mask);
 
+gfid_not_required:
        /* Add the mark tbl to the ulp context. */
        bnxt_ulp_cntxt_ptr2_mark_db_set(ctxt, mark_tbl);
        return 0;
 
 mem_error:
-       rte_free(mark_tbl->gfid_tbl);
-       rte_free(mark_tbl->lfid_tbl);
-       rte_free(mark_tbl);
+       if (mark_tbl) {
+               rte_free(mark_tbl->gfid_tbl);
+               rte_free(mark_tbl->lfid_tbl);
+               rte_free(mark_tbl);
+       }
        BNXT_TF_DBG(DEBUG, "Failed to allocate memory for mark mgr\n");
        return -ENOMEM;
 }
@@ -153,6 +163,8 @@ ulp_mark_db_deinit(struct bnxt_ulp_context *ctxt)
  *
  * fid [in] The flow id that is returned by HW in BD
  *
+ * vfr_flag [out].it indicatesif mark is vfr_id or mark id
+ *
  * mark [out] The mark that is associated with the FID
  *
  */
@@ -160,6 +172,7 @@ int32_t
 ulp_mark_db_mark_get(struct bnxt_ulp_context *ctxt,
                     bool is_gfid,
                     uint32_t fid,
+                    uint32_t *vfr_flag,
                     uint32_t *mark)
 {
        struct bnxt_ulp_mark_tbl *mtbl;
@@ -181,18 +194,14 @@ ulp_mark_db_mark_get(struct bnxt_ulp_context *ctxt,
                    ULP_MARK_DB_ENTRY_IS_INVALID(&mtbl->gfid_tbl[idx]))
                        return -EINVAL;
 
-               BNXT_TF_DBG(DEBUG, "Get GFID[0x%0x] = 0x%0x\n",
-                           idx, mtbl->gfid_tbl[idx].mark_id);
-
+               *vfr_flag = ULP_MARK_DB_ENTRY_IS_VFR_ID(&mtbl->gfid_tbl[idx]);
                *mark = mtbl->gfid_tbl[idx].mark_id;
        } else {
                if (idx >= mtbl->lfid_num_entries ||
                    ULP_MARK_DB_ENTRY_IS_INVALID(&mtbl->lfid_tbl[idx]))
                        return -EINVAL;
 
-               BNXT_TF_DBG(DEBUG, "Get LFID[0x%0x] = 0x%0x\n",
-                           idx, mtbl->lfid_tbl[idx].mark_id);
-
+               *vfr_flag = ULP_MARK_DB_ENTRY_IS_VFR_ID(&mtbl->lfid_tbl[idx]);
                *mark = mtbl->lfid_tbl[idx].mark_id;
        }
 
@@ -249,8 +258,12 @@ ulp_mark_db_mark_add(struct bnxt_ulp_context *ctxt,
                        BNXT_TF_DBG(ERR, "Mark index greater than allocated\n");
                        return -EINVAL;
                }
+               BNXT_TF_DBG(DEBUG, "Set LFID[0x%0x] = 0x%0x\n", fid, mark);
                mtbl->lfid_tbl[fid].mark_id = mark;
                ULP_MARK_DB_ENTRY_SET_VALID(&mtbl->lfid_tbl[fid]);
+
+               if (mark_flag & BNXT_ULP_MARK_VFR_ID)
+                       ULP_MARK_DB_ENTRY_SET_VFR_ID(&mtbl->lfid_tbl[fid]);
        }
 
        return 0;