net/bnxt: remove cache table ID from mapper class table
authorKishore Padmanabha <kishore.padmanabha@broadcom.com>
Fri, 12 Jun 2020 12:50:00 +0000 (18:20 +0530)
committerFerruh Yigit <ferruh.yigit@intel.com>
Tue, 30 Jun 2020 12:52:30 +0000 (14:52 +0200)
The cache table id is not needed anymore since the value can
be calculated from resource sub type and direction.

Signed-off-by: Kishore Padmanabha <kishore.padmanabha@broadcom.com>
Signed-off-by: Somnath Kotur <somnath.kotur@broadcom.com>
Reviewed-by: Mike Baucom <michael.baucom@broadcom.com>
Reviewed-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
drivers/net/bnxt/tf_ulp/ulp_mapper.c
drivers/net/bnxt/tf_ulp/ulp_mapper.h
drivers/net/bnxt/tf_ulp/ulp_template_db.c
drivers/net/bnxt/tf_ulp/ulp_template_struct.h

index c3c96d8..828b489 100644 (file)
@@ -324,13 +324,14 @@ ulp_mapper_ident_fields_get(struct bnxt_ulp_mapper_class_tbl_info *tbl,
 
 static struct bnxt_ulp_mapper_cache_entry *
 ulp_mapper_cache_entry_get(struct bnxt_ulp_context *ulp,
-                          enum bnxt_ulp_cache_tbl_id id,
+                          uint32_t id,
                           uint16_t key)
 {
        struct bnxt_ulp_mapper_data *mapper_data;
 
        mapper_data = bnxt_ulp_cntxt_ptr2_mapper_data_get(ulp);
-       if (!mapper_data || !mapper_data->cache_tbl[id]) {
+       if (!mapper_data || id >= BNXT_ULP_CACHE_TBL_MAX_SZ ||
+           !mapper_data->cache_tbl[id]) {
                BNXT_TF_DBG(ERR, "Unable to acquire the cache tbl (%d)\n", id);
                return NULL;
        }
@@ -987,6 +988,98 @@ error:
        return rc;
 }
 
+static int32_t
+ulp_mapper_mark_gfid_process(struct bnxt_ulp_mapper_parms *parms,
+                            struct bnxt_ulp_mapper_class_tbl_info *tbl,
+                            uint64_t flow_id)
+{
+       struct ulp_flow_db_res_params fid_parms;
+       uint32_t vfr_flag, mark, gfid, mark_flag;
+       int32_t rc = 0;
+
+       vfr_flag = ULP_COMP_FLD_IDX_RD(parms, BNXT_ULP_CF_IDX_VFR_FLAG);
+       if (!(tbl->mark_enable &&
+             (ULP_BITMAP_ISSET(parms->act_bitmap->bits,
+                             BNXT_ULP_ACTION_BIT_MARK) || vfr_flag)))
+               return rc; /* no need to perform gfid process */
+
+       /* Get the mark id details from action property */
+       memcpy(&mark, &parms->act_prop->act_details[BNXT_ULP_ACT_PROP_IDX_MARK],
+              sizeof(mark));
+       mark = tfp_be_to_cpu_32(mark);
+
+       TF_GET_GFID_FROM_FLOW_ID(flow_id, gfid);
+       mark_flag  = BNXT_ULP_MARK_GLOBAL_HW_FID;
+       mark_flag |= (vfr_flag) ? BNXT_ULP_MARK_VFR_ID : 0;
+       rc = ulp_mark_db_mark_add(parms->ulp_ctx, mark_flag,
+                                 gfid, mark);
+       if (rc) {
+               BNXT_TF_DBG(ERR, "Failed to add mark to flow\n");
+               return rc;
+       }
+       fid_parms.direction = tbl->direction;
+       fid_parms.resource_func = BNXT_ULP_RESOURCE_FUNC_HW_FID;
+       fid_parms.critical_resource = 0;
+       fid_parms.resource_type = mark_flag;
+       fid_parms.resource_hndl = gfid;
+       rc = ulp_flow_db_resource_add(parms->ulp_ctx,
+                                     parms->tbl_idx,
+                                     parms->fid,
+                                     &fid_parms);
+       if (rc)
+               BNXT_TF_DBG(ERR, "Fail to link res to flow rc = %d\n", rc);
+       return rc;
+}
+
+static int32_t
+ulp_mapper_mark_act_ptr_process(struct bnxt_ulp_mapper_parms *parms,
+                               struct bnxt_ulp_mapper_class_tbl_info *tbl)
+{
+       struct ulp_flow_db_res_params fid_parms;
+       uint32_t vfr_flag, act_idx, mark, mark_flag;
+       uint64_t val64;
+       int32_t rc = 0;
+
+       vfr_flag = ULP_COMP_FLD_IDX_RD(parms, BNXT_ULP_CF_IDX_VFR_FLAG);
+       if (!(tbl->mark_enable &&
+             (ULP_BITMAP_ISSET(parms->act_bitmap->bits,
+                               BNXT_ULP_ACTION_BIT_MARK) || vfr_flag)))
+               return rc; /* no need to perform mark action process */
+
+       /* Get the mark id details from action property */
+       memcpy(&mark, &parms->act_prop->act_details[BNXT_ULP_ACT_PROP_IDX_MARK],
+              sizeof(mark));
+       mark = tfp_be_to_cpu_32(mark);
+
+       if (!ulp_regfile_read(parms->regfile,
+                             BNXT_ULP_REGFILE_INDEX_ACTION_PTR_MAIN,
+                             &val64)) {
+               BNXT_TF_DBG(ERR, "read action ptr main failed\n");
+               return -EINVAL;
+       }
+       act_idx = tfp_be_to_cpu_64(val64);
+       mark_flag  = BNXT_ULP_MARK_LOCAL_HW_FID;
+       mark_flag |= (vfr_flag) ? BNXT_ULP_MARK_VFR_ID : 0;
+       rc = ulp_mark_db_mark_add(parms->ulp_ctx, mark_flag,
+                                 act_idx, mark);
+       if (rc) {
+               BNXT_TF_DBG(ERR, "Failed to add mark to flow\n");
+               return rc;
+       }
+       fid_parms.direction = tbl->direction;
+       fid_parms.resource_func = BNXT_ULP_RESOURCE_FUNC_HW_FID;
+       fid_parms.critical_resource = 0;
+       fid_parms.resource_type = mark_flag;
+       fid_parms.resource_hndl = act_idx;
+       rc = ulp_flow_db_resource_add(parms->ulp_ctx,
+                                     parms->tbl_idx,
+                                     parms->fid,
+                                     &fid_parms);
+       if (rc)
+               BNXT_TF_DBG(ERR, "Fail to link res to flow rc = %d\n", rc);
+       return rc;
+}
+
 /*
  * Function to process the action Info. Iterate through the list
  * action info templates and process it.
@@ -1370,6 +1463,18 @@ ulp_mapper_em_tbl_process(struct bnxt_ulp_mapper_parms *parms,
                return rc;
        }
 
+       /* Mark action process */
+       if (parms->device_params->global_fid_enable &&
+           tbl->resource_type == TF_MEM_EXTERNAL)
+               rc = ulp_mapper_mark_gfid_process(parms, tbl, iparms.flow_id);
+       else if (!parms->device_params->global_fid_enable &&
+                tbl->resource_type == TF_MEM_INTERNAL)
+               rc = ulp_mapper_mark_act_ptr_process(parms, tbl);
+       if (rc) {
+               BNXT_TF_DBG(ERR, "Failed to add mark to flow\n");
+               goto error;
+       }
+
        /* Link the EM resource to the flow in the flow db */
        memset(&fid_parms, 0, sizeof(fid_parms));
        fid_parms.direction             = tbl->direction;
@@ -1575,8 +1680,15 @@ ulp_mapper_cache_tbl_process(struct bnxt_ulp_mapper_parms *parms,
         */
        cache_key = ulp_blob_data_get(&key, &tmplen);
        ckey = (uint16_t *)cache_key;
+
+       /*
+        * The id computed based on resource sub type and direction where
+        * dir is the bit0 and rest of the bits come from resource
+        * sub type.
+        */
        cache_entry = ulp_mapper_cache_entry_get(parms->ulp_ctx,
-                                                tbl->cache_tbl_id,
+                                                (tbl->resource_sub_type << 1 |
+                                                (tbl->direction & 0x1)),
                                                 *ckey);
 
        /*
@@ -1640,12 +1752,13 @@ ulp_mapper_cache_tbl_process(struct bnxt_ulp_mapper_parms *parms,
        fid_parms.resource_func = tbl->resource_func;
 
        /*
-        * Cache resource type is composed of both table_type and cache_tbl_id
-        * need to set it appropriately via setter.
+        * Cache resource type is composed of table_type, resource
+        * sub type and direction, it needs to set appropriately via setter.
         */
        ulp_mapper_cache_res_type_set(&fid_parms,
                                      tbl->resource_type,
-                                     tbl->cache_tbl_id);
+                                     (tbl->resource_sub_type << 1 |
+                                      (tbl->direction & 0x1)));
        fid_parms.resource_hndl = (uint64_t)*ckey;
        fid_parms.critical_resource = tbl->critical_resource;
        rc = ulp_flow_db_resource_add(parms->ulp_ctx,
index 4294227..b0b895e 100644 (file)
@@ -75,6 +75,7 @@ struct bnxt_ulp_mapper_parms {
        struct bnxt_ulp_mapper_data             *mapper_data;
        enum bnxt_ulp_cache_table_opc           tcam_tbl_opc;
        struct bnxt_ulp_mapper_cache_entry      *cache_ptr;
+       struct bnxt_ulp_device_params           *device_params;
 };
 
 struct bnxt_ulp_mapper_create_parms {
index 9b793a2..140f96a 100644 (file)
@@ -606,7 +606,6 @@ struct bnxt_ulp_mapper_class_tbl_info ulp_class_tbl_list[] = {
        .ident_nums = 1,
        .mark_enable = BNXT_ULP_MARK_ENABLE_NO,
        .critical_resource = 0,
-       .cache_tbl_id = BNXT_ULP_CACHE_TBL_ID_L2_CNTXT_TCAM_INGRESS,
        .regfile_wr_idx = BNXT_ULP_REGFILE_INDEX_NOT_USED
        },
        {
@@ -627,7 +626,6 @@ struct bnxt_ulp_mapper_class_tbl_info ulp_class_tbl_list[] = {
        .ident_nums = 0,
        .mark_enable = BNXT_ULP_MARK_ENABLE_NO,
        .critical_resource = 0,
-       .cache_tbl_id = 0,
        .regfile_wr_idx = BNXT_ULP_REGFILE_INDEX_NOT_USED
        },
        {
@@ -648,7 +646,6 @@ struct bnxt_ulp_mapper_class_tbl_info ulp_class_tbl_list[] = {
        .ident_nums = 1,
        .mark_enable = BNXT_ULP_MARK_ENABLE_NO,
        .critical_resource = 0,
-       .cache_tbl_id = BNXT_ULP_CACHE_TBL_ID_PROFILE_TCAM_INGRESS,
        .regfile_wr_idx = BNXT_ULP_REGFILE_INDEX_NOT_USED
        },
        {
@@ -669,7 +666,6 @@ struct bnxt_ulp_mapper_class_tbl_info ulp_class_tbl_list[] = {
        .ident_nums = 0,
        .mark_enable = BNXT_ULP_MARK_ENABLE_NO,
        .critical_resource = 0,
-       .cache_tbl_id = 0,
        .regfile_wr_idx = BNXT_ULP_REGFILE_INDEX_NOT_USED
        },
        {
@@ -690,7 +686,6 @@ struct bnxt_ulp_mapper_class_tbl_info ulp_class_tbl_list[] = {
        .ident_nums = 0,
        .mark_enable = BNXT_ULP_MARK_ENABLE_YES,
        .critical_resource = 1,
-       .cache_tbl_id = 0,
        .regfile_wr_idx = BNXT_ULP_REGFILE_INDEX_NOT_USED
        }
 };
index ce449d0..eebe035 100644 (file)
@@ -182,8 +182,6 @@ struct bnxt_ulp_mapper_class_tbl_info {
 
        uint8_t         mark_enable;
        enum bnxt_ulp_regfile_index     regfile_wr_idx;
-
-       enum bnxt_ulp_cache_tbl_id cache_tbl_id;
 };
 
 struct bnxt_ulp_mapper_act_tbl_info {