net/bnxt: update ULP to handle action/index tables
authorMike Baucom <michael.baucom@broadcom.com>
Sat, 25 Apr 2020 03:47:24 +0000 (09:17 +0530)
committerFerruh Yigit <ferruh.yigit@intel.com>
Tue, 5 May 2020 13:53:57 +0000 (15:53 +0200)
The ulp required to be changed to properly call the index table
management routines and use the index for external memory indices.
The ulp no longer has to account for stride as the tf_core returns the
actual offset, not a 0 based index.

Signed-off-by: Mike Baucom <michael.baucom@broadcom.com>
Reviewed-by: Kishore Padmanabha <kishore.padmanabha@broadcom.com>
Reviewed-by: Venkat Duvvuru <venkatkumar.duvvuru@broadcom.com>
Reviewed-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
drivers/net/bnxt/tf_ulp/ulp_mapper.c

index dc7b7ca..9ea6fdb 100644 (file)
@@ -401,7 +401,7 @@ ulp_mapper_tcam_entry_free(struct bnxt_ulp_context *ulp  __rte_unused,
 }
 
 static inline int32_t
-ulp_mapper_index_entry_free(struct bnxt_ulp_context *ulp  __rte_unused,
+ulp_mapper_index_entry_free(struct bnxt_ulp_context *ulp,
                            struct tf *tfp,
                            struct ulp_flow_db_res_params *res)
 {
@@ -411,6 +411,12 @@ ulp_mapper_index_entry_free(struct bnxt_ulp_context *ulp  __rte_unused,
                .idx    = (uint32_t)res->resource_hndl
        };
 
+       /*
+        * Just set the table scope, it will be ignored if not necessary
+        * by the tf_free_tbl_entry
+        */
+       bnxt_ulp_cntxt_tbl_scope_id_get(ulp, &fparms.tbl_scope_id);
+
        return tf_free_tbl_entry(tfp, &fparms);
 }
 
@@ -805,6 +811,9 @@ ulp_mapper_action_alloc_and_set(struct bnxt_ulp_mapper_parms *parms,
        int32_t                                 rc = 0;
        int32_t trc;
        uint64_t                                idx;
+       uint32_t tbl_scope_id;
+
+       bnxt_ulp_cntxt_tbl_scope_id_get(parms->ulp_ctx, &tbl_scope_id);
 
        /* Set the allocation parameters for the table*/
        alloc_parms.dir = atbls->direction;
@@ -812,6 +821,7 @@ ulp_mapper_action_alloc_and_set(struct bnxt_ulp_mapper_parms *parms,
        alloc_parms.search_enable = atbls->srch_b4_alloc;
        alloc_parms.result = ulp_blob_data_get(blob,
                                               &alloc_parms.result_sz_in_bytes);
+       alloc_parms.tbl_scope_id = tbl_scope_id;
        if (!alloc_parms.result) {
                BNXT_TF_DBG(ERR, "blob is not populated\n");
                return -EINVAL;
@@ -826,14 +836,10 @@ ulp_mapper_action_alloc_and_set(struct bnxt_ulp_mapper_parms *parms,
        }
 
        /* Need to calculate the idx for the result record */
-       /*
-        * TBD: Need to get the stride from tflib instead of having to
-        * understand the construction of the pointer
-        */
        uint64_t tmpidx = alloc_parms.idx;
 
        if (atbls->table_type == TF_TBL_TYPE_EXT)
-               tmpidx = (alloc_parms.idx * TF_ACTION_RECORD_SZ) >> 4;
+               tmpidx = TF_ACT_REC_OFFSET_2_PTR(alloc_parms.idx);
        else
                tmpidx = alloc_parms.idx;
 
@@ -863,10 +869,7 @@ ulp_mapper_action_alloc_and_set(struct bnxt_ulp_mapper_parms *parms,
                set_parm.data_sz_in_bytes = length / 8;
 
                if (set_parm.type == TF_TBL_TYPE_EXT)
-                       bnxt_ulp_cntxt_tbl_scope_id_get(parms->ulp_ctx,
-                                                       &set_parm.tbl_scope_id);
-               else
-                       set_parm.tbl_scope_id = 0;
+                       set_parm.tbl_scope_id = tbl_scope_id;
 
                /* set the table entry */
                rc = tf_set_tbl_entry(parms->tfp, &set_parm);
@@ -1396,9 +1399,11 @@ ulp_mapper_index_tbl_process(struct bnxt_ulp_mapper_parms *parms,
        struct tf_alloc_tbl_entry_parms aparms = { 0 };
        struct tf_set_tbl_entry_parms   sparms = { 0 };
        struct tf_free_tbl_entry_parms  free_parms = { 0 };
-
+       uint32_t tbl_scope_id;
        struct tf *tfp = bnxt_ulp_cntxt_tfp_get(parms->ulp_ctx);
 
+       bnxt_ulp_cntxt_tbl_scope_id_get(parms->ulp_ctx, &tbl_scope_id);
+
        if (!ulp_blob_init(&data, tbl->result_bit_size, parms->order)) {
                BNXT_TF_DBG(ERR, "Failed initial index table blob\n");
                return -EINVAL;
@@ -1427,6 +1432,7 @@ ulp_mapper_index_tbl_process(struct bnxt_ulp_mapper_parms *parms,
        aparms.search_enable    = tbl->srch_b4_alloc;
        aparms.result           = ulp_blob_data_get(&data, &tmplen);
        aparms.result_sz_in_bytes = ULP_SZ_BITS2BYTES(tbl->result_bit_size);
+       aparms.tbl_scope_id     = tbl_scope_id;
 
        /* All failures after the alloc succeeds require a free */
        rc = tf_alloc_tbl_entry(tfp, &aparms);
@@ -1454,6 +1460,7 @@ ulp_mapper_index_tbl_process(struct bnxt_ulp_mapper_parms *parms,
                sparms.data_sz_in_bytes =
                        ULP_SZ_BITS2BYTES(tbl->result_bit_size);
                sparms.idx              = aparms.idx;
+               sparms.tbl_scope_id     = tbl_scope_id;
 
                rc = tf_set_tbl_entry(tfp, &sparms);
                if (rc) {
@@ -1494,6 +1501,7 @@ error:
        free_parms.dir  = tbl->direction;
        free_parms.type = tbl->table_type;
        free_parms.idx  = aparms.idx;
+       free_parms.tbl_scope_id = tbl_scope_id;
 
        trc = tf_free_tbl_entry(tfp, &free_parms);
        if (trc)