net/bnxt: update external action record pool
authorFarah Smith <farah.smith@broadcom.com>
Sat, 25 Apr 2020 03:47:23 +0000 (09:17 +0530)
committerFerruh Yigit <ferruh.yigit@intel.com>
Tue, 5 May 2020 13:53:57 +0000 (15:53 +0200)
- Added support variable sized action records
- Additional error checking on table scope params
- Single external pool supported per direction
- Changed to return action record pointer
- Allows action pool to fully utilize the number of flows

Signed-off-by: Farah Smith <farah.smith@broadcom.com>
Signed-off-by: Mike Baucom <michael.baucom@broadcom.com>
Reviewed-by: Peter Spreadborough <peter.spreadborough@broadcom.com>
Reviewed-by: Kishore Padmanabha <kishore.padmanabha@broadcom.com>
drivers/net/bnxt/tf_core/tf_core.c
drivers/net/bnxt/tf_core/tf_core.h
drivers/net/bnxt/tf_core/tf_rm.c
drivers/net/bnxt/tf_core/tf_session.h
drivers/net/bnxt/tf_core/tf_tbl.c
drivers/net/bnxt/tf_core/tf_tbl.h

index fc7d638..cf9f36a 100644 (file)
@@ -175,9 +175,6 @@ tf_open_session(struct tf                    *tfp,
        /* Setup hash seeds */
        tf_seeds_init(session);
 
-       /* Initialize external pool data structures */
-       tf_init_tbl_pool(session);
-
        session->ref_count++;
 
        /* Return session ID */
index 6a1f3a1..4b60973 100644 (file)
@@ -83,7 +83,7 @@ enum tf_mem {
 
 /** EEM record AR helper
  *
- * Helpers to handle the Action Record Pointer in the EEM Record Entry.
+ * Helper to handle the Action Record Pointer in the EEM Record Entry.
  *
  * Convert absolute offset to action record pointer in EEM record entry
  * Convert action record pointer in EEM record entry to absolute offset
@@ -91,8 +91,6 @@ enum tf_mem {
 #define TF_ACT_REC_OFFSET_2_PTR(offset) ((offset) >> 4)
 #define TF_ACT_REC_PTR_2_OFFSET(offset) ((offset) << 4)
 
-#define TF_ACT_REC_INDEX_2_OFFSET(idx) ((idx) << 9)
-
 /*
  * Helper Macros
  */
@@ -943,8 +941,6 @@ enum tf_tbl_type {
         * scope. Internal types are not.
         */
        TF_TBL_TYPE_EXT,
-       /** Future - external pool of size0 entries */
-       TF_TBL_TYPE_EXT_0,
        TF_TBL_TYPE_MAX
 };
 
@@ -959,6 +955,10 @@ struct tf_alloc_tbl_entry_parms {
         * [in] Type of the allocation
         */
        enum tf_tbl_type type;
+       /**
+        * [in] Table scope identifier (ignored unless TF_TBL_TYPE_EXT)
+        */
+       uint32_t tbl_scope_id;
        /**
         * [in] Enable search for matching entry. If the table type is
         * internal the shadow copy will be searched before
@@ -1028,6 +1028,10 @@ struct tf_free_tbl_entry_parms {
         * [in] Type of the allocation type
         */
        enum tf_tbl_type type;
+       /**
+        * [in] Table scope identifier (ignored unless TF_TBL_TYPE_EXT)
+        */
+       uint32_t tbl_scope_id;
        /**
         * [in] Index to free
         */
@@ -1070,7 +1074,6 @@ int tf_free_tbl_entry(struct tf *tfp,
 struct tf_set_tbl_entry_parms {
        /**
         * [in] Table scope identifier
-        *
         */
        uint32_t tbl_scope_id;
        /**
index a5e96f2..38b1e71 100644 (file)
@@ -3104,7 +3104,6 @@ tf_rm_lookup_tbl_type_pool(struct tf_session *tfs,
                break;
        /* No bitalloc pools for these types */
        case TF_TBL_TYPE_EXT:
-       case TF_TBL_TYPE_EXT_0:
        default:
                break;
        }
@@ -3211,7 +3210,6 @@ tf_rm_convert_tbl_type(enum tf_tbl_type type,
        case TF_TBL_TYPE_ACT_MODIFY_IPV6_SRC:
        case TF_TBL_TYPE_VNIC_SVIF:
        case TF_TBL_TYPE_EXT:   /* No pools for this type */
-       case TF_TBL_TYPE_EXT_0: /* No pools for this type */
        default:
                *hcapi_type = -1;
                rc = -EOPNOTSUPP;
@@ -3277,7 +3275,6 @@ tf_rm_convert_index(struct tf_session *tfs,
        /* Not yet supported */
        case TF_TBL_TYPE_VNIC_SVIF:
        case TF_TBL_TYPE_EXT:   /* No pools for this type */
-       case TF_TBL_TYPE_EXT_0: /* No pools for this type */
        default:
                return -EOPNOTSUPP;
        }
index fed34f1..50ef2d5 100644 (file)
@@ -289,12 +289,6 @@ struct tf_session {
 
        /** Table scope array */
        struct tf_tbl_scope_cb tbl_scopes[TF_NUM_TBL_SCOPE];
-
-       /** Each external pool is associated with a single table scope
-        *  For each external pool store the associated table scope in
-        *  this data structure
-        */
-       uint32_t ext_pool_2_scope[TF_DIR_MAX][TF_EXT_POOL_CNT_MAX];
 };
 
 #endif /* _TF_SESSION_H_ */
index 17df274..236affe 100644 (file)
@@ -701,6 +701,21 @@ tf_em_validate_num_entries(struct tf_tbl_scope_cb *tbl_scope_cb,
                }
        }
 
+       if (parms->rx_num_flows_in_k != 0 &&
+           (parms->rx_max_key_sz_in_bits / 8 == 0)) {
+               PMD_DRV_LOG(ERR,
+                           "EEM: Rx key size required: %u\n",
+                           (parms->rx_max_key_sz_in_bits));
+               return -EINVAL;
+       }
+
+       if (parms->tx_num_flows_in_k != 0 &&
+           (parms->tx_max_key_sz_in_bits / 8 == 0)) {
+               PMD_DRV_LOG(ERR,
+                           "EEM: Tx key size required: %u\n",
+                           (parms->tx_max_key_sz_in_bits));
+               return -EINVAL;
+       }
        /* Rx */
        tbl_scope_cb->em_ctx_info[TF_DIR_RX].em_tables[KEY0_TABLE].num_entries =
                parms->rx_num_flows_in_k * TF_KILOBYTE;
@@ -715,7 +730,7 @@ tf_em_validate_num_entries(struct tf_tbl_scope_cb *tbl_scope_cb,
        tbl_scope_cb->em_ctx_info[TF_DIR_RX].em_tables[RECORD_TABLE].num_entries =
                parms->rx_num_flows_in_k * TF_KILOBYTE;
        tbl_scope_cb->em_ctx_info[TF_DIR_RX].em_tables[RECORD_TABLE].entry_size =
-               parms->tx_max_action_entry_sz_in_bits / 8;
+               parms->rx_max_action_entry_sz_in_bits / 8;
 
        tbl_scope_cb->em_ctx_info[TF_DIR_RX].em_tables[EFC_TABLE].num_entries =
                0;
@@ -954,14 +969,10 @@ tf_free_tbl_entry_shadow(struct tf_session *tfs,
 /**
  * Create External Tbl pool of memory indexes.
  *
- * [in] session
- *   Pointer to session
  * [in] dir
  *   direction
  * [in] tbl_scope_cb
  *   pointer to the table scope
- * [in] tbl_scope_id
- *   id of the table scope
  * [in] num_entries
  *   number of entries to write
  * [in] entry_sz_bytes
@@ -973,18 +984,16 @@ tf_free_tbl_entry_shadow(struct tf_session *tfs,
  *          - Failure, entry not allocated, out of resources
  */
 static int
-tf_create_tbl_pool_external(struct tf_session *session,
-                           enum tf_dir dir,
+tf_create_tbl_pool_external(enum tf_dir dir,
                            struct tf_tbl_scope_cb *tbl_scope_cb,
-                           uint32_t table_scope_id,
                            uint32_t num_entries,
                            uint32_t entry_sz_bytes)
-
 {
        struct tfp_calloc_parms parms;
-       uint32_t i, j;
+       uint32_t i;
+       int32_t j;
        int rc = 0;
-       struct stack *pool = &tbl_scope_cb->ext_pool[dir][TF_EXT_POOL_0];
+       struct stack *pool = &tbl_scope_cb->ext_act_pool[dir];
 
        parms.nitems = num_entries;
        parms.size = sizeof(uint32_t);
@@ -1009,18 +1018,23 @@ tf_create_tbl_pool_external(struct tf_session *session,
        /* Save the  malloced memory address so that it can
         * be freed when the table scope is freed.
         */
-       tbl_scope_cb->ext_pool_mem[dir][TF_EXT_POOL_0] =
-               (uint32_t *)parms.mem_va;
+       tbl_scope_cb->ext_act_pool_mem[dir] = (uint32_t *)parms.mem_va;
 
-       /* Fill pool with indexes
+       /* Fill pool with indexes in reverse
         */
-       j = num_entries * entry_sz_bytes - 1;
+       j = (num_entries - 1) * entry_sz_bytes;
 
        for (i = 0; i < num_entries; i++) {
                rc = stack_push(pool, j);
                if (rc != 0) {
-                       PMD_DRV_LOG(ERR, "%d TBL: stack failure %s\n",
-                                   dir, strerror(-rc));
+                       PMD_DRV_LOG(ERR, "%s TBL: stack failure %s\n",
+                                   tf_dir_2_str(dir), strerror(-rc));
+                       goto cleanup;
+               }
+
+               if (j < 0) {
+                       PMD_DRV_LOG(ERR, "%d TBL: invalid offset (%d)\n",
+                                   dir, j);
                        goto cleanup;
                }
                j -= entry_sz_bytes;
@@ -1032,10 +1046,6 @@ tf_create_tbl_pool_external(struct tf_session *session,
                            dir, strerror(-rc));
                goto cleanup;
        }
-       /* Set the table scope associated with the pool
-        */
-       session->ext_pool_2_scope[dir][TF_EXT_POOL_0] = table_scope_id;
-
        return 0;
 cleanup:
        tfp_free((void *)parms.mem_va);
@@ -1045,8 +1055,6 @@ cleanup:
 /**
  * Destroy External Tbl pool of memory indexes.
  *
- * [in] session
- *   Pointer to session
  * [in] dir
  *   direction
  * [in] tbl_scope_cb
@@ -1054,18 +1062,13 @@ cleanup:
  *
  */
 static void
-tf_destroy_tbl_pool_external(struct tf_session *session,
-                           enum tf_dir dir,
-                           struct tf_tbl_scope_cb *tbl_scope_cb)
+tf_destroy_tbl_pool_external(enum tf_dir dir,
+                            struct tf_tbl_scope_cb *tbl_scope_cb)
 {
-       uint32_t *ext_pool_mem =
-               tbl_scope_cb->ext_pool_mem[dir][TF_EXT_POOL_0];
+       uint32_t *ext_act_pool_mem =
+               tbl_scope_cb->ext_act_pool_mem[dir];
 
-       tfp_free(ext_pool_mem);
-
-       /* Set the table scope associated with the pool
-        */
-       session->ext_pool_2_scope[dir][TF_EXT_POOL_0] = TF_TBL_SCOPE_INVALID;
+       tfp_free(ext_act_pool_mem);
 }
 
 /**
@@ -1088,7 +1091,6 @@ tf_alloc_tbl_entry_pool_external(struct tf *tfp,
        int rc;
        uint32_t index;
        struct tf_session *tfs;
-       uint32_t tbl_scope_id;
        struct tf_tbl_scope_cb *tbl_scope_cb;
        struct stack *pool;
 
@@ -1107,26 +1109,17 @@ tf_alloc_tbl_entry_pool_external(struct tf *tfp,
 
        tfs = (struct tf_session *)(tfp->session->core_data);
 
-       if (parms->type != TF_TBL_TYPE_EXT) {
-               PMD_DRV_LOG(ERR,
-                           "dir:%d, Type not supported, type:%d\n",
-                           parms->dir,
-                           parms->type);
-               return -EOPNOTSUPP;
-       }
-
        /* Get the pool info from the table scope
         */
-       tbl_scope_id = tfs->ext_pool_2_scope[parms->dir][TF_EXT_POOL_0];
-       tbl_scope_cb = tbl_scope_cb_find(tfs, tbl_scope_id);
+       tbl_scope_cb = tbl_scope_cb_find(tfs, parms->tbl_scope_id);
 
        if (tbl_scope_cb == NULL) {
                PMD_DRV_LOG(ERR,
-                           "dir:%d, table scope not allocated\n",
-                           parms->dir);
+                                       "%s, table scope not allocated\n",
+                                       tf_dir_2_str(parms->dir));
                return -EINVAL;
        }
-       pool = &tbl_scope_cb->ext_pool[parms->dir][TF_EXT_POOL_0];
+       pool = &tbl_scope_cb->ext_act_pool[parms->dir];
 
        /* Allocate an element
         */
@@ -1246,12 +1239,11 @@ tf_alloc_tbl_entry_pool_internal(struct tf *tfp,
  */
 static int
 tf_free_tbl_entry_pool_external(struct tf *tfp,
-                      struct tf_free_tbl_entry_parms *parms)
+                               struct tf_free_tbl_entry_parms *parms)
 {
        int rc = 0;
        struct tf_session *tfs;
        uint32_t index;
-       uint32_t tbl_scope_id;
        struct tf_tbl_scope_cb *tbl_scope_cb;
        struct stack *pool;
 
@@ -1270,26 +1262,17 @@ tf_free_tbl_entry_pool_external(struct tf *tfp,
 
        tfs = (struct tf_session *)(tfp->session->core_data);
 
-       if (parms->type != TF_TBL_TYPE_EXT) {
-               PMD_DRV_LOG(ERR,
-                           "dir:%d, Type not supported, type:%d\n",
-                           parms->dir,
-                           parms->type);
-               return -EOPNOTSUPP;
-       }
-
        /* Get the pool info from the table scope
         */
-       tbl_scope_id = tfs->ext_pool_2_scope[parms->dir][TF_EXT_POOL_0];
-       tbl_scope_cb = tbl_scope_cb_find(tfs, tbl_scope_id);
+       tbl_scope_cb = tbl_scope_cb_find(tfs, parms->tbl_scope_id);
 
        if (tbl_scope_cb == NULL) {
                PMD_DRV_LOG(ERR,
-                           "dir:%d, table scope error\n",
+                           "dir:%d, Session info invalid\n",
                            parms->dir);
                return -EINVAL;
        }
-       pool = &tbl_scope_cb->ext_pool[parms->dir][TF_EXT_POOL_0];
+       pool = &tbl_scope_cb->ext_act_pool[parms->dir];
 
        index = parms->idx;
 
@@ -1390,18 +1373,6 @@ tf_free_tbl_entry_pool_internal(struct tf *tfp,
        return rc;
 }
 
-/* API defined in tf_tbl.h */
-void
-tf_init_tbl_pool(struct tf_session *session)
-{
-       enum tf_dir dir;
-
-       for (dir = 0; dir < TF_DIR_MAX; dir++) {
-               session->ext_pool_2_scope[dir][TF_EXT_POOL_0] =
-                       TF_TBL_SCOPE_INVALID;
-       }
-}
-
 /* API defined in tf_em.h */
 struct tf_tbl_scope_cb *
 tbl_scope_cb_find(struct tf_session *session,
@@ -1447,8 +1418,7 @@ tf_free_eem_tbl_scope_cb(struct tf *tfp,
        for (dir = 0; dir < TF_DIR_MAX; dir++) {
                /* Free associated external pools
                 */
-               tf_destroy_tbl_pool_external(session,
-                                            dir,
+               tf_destroy_tbl_pool_external(dir,
                                             tbl_scope_cb);
                tf_msg_em_op(tfp,
                             dir,
@@ -1551,12 +1521,10 @@ tf_alloc_eem_tbl_scope(struct tf *tfp,
                 * Initially, this is a single fixed size pool for all external
                 * actions related to a single table scope.
                 */
-               rc = tf_create_tbl_pool_external(session,
-                                                dir,
-                                                tbl_scope_cb,
-                                                index,
-                                                TF_EXT_POOL_ENTRY_CNT,
-                                                TF_EXT_POOL_ENTRY_SZ_BYTES);
+               rc = tf_create_tbl_pool_external(dir,
+                                           tbl_scope_cb,
+                                           em_tables[RECORD_TABLE].num_entries,
+                                           em_tables[RECORD_TABLE].entry_size);
                if (rc) {
                        PMD_DRV_LOG(ERR,
                                    "%d TBL: Unable to allocate idx pools %s\n",
@@ -1600,13 +1568,12 @@ tf_set_tbl_entry(struct tf *tfp,
 
        if (parms->type == TF_TBL_TYPE_EXT) {
                void *base_addr;
-               uint32_t offset = TF_ACT_REC_INDEX_2_OFFSET(parms->idx);
+               uint32_t offset = parms->idx;
                uint32_t tbl_scope_id;
 
                session = (struct tf_session *)(tfp->session->core_data);
 
-               tbl_scope_id =
-                       session->ext_pool_2_scope[parms->dir][TF_EXT_POOL_0];
+               tbl_scope_id = parms->tbl_scope_id;
 
                if (tbl_scope_id == TF_TBL_SCOPE_INVALID)  {
                        PMD_DRV_LOG(ERR,
@@ -1618,7 +1585,6 @@ tf_set_tbl_entry(struct tf *tfp,
                /* Get the table scope control block associated with the
                 * external pool
                 */
-
                tbl_scope_cb = tbl_scope_cb_find(session, tbl_scope_id);
 
                if (tbl_scope_cb == NULL)
index 5d3ea71..bdc6288 100644 (file)
@@ -72,8 +72,8 @@ struct tf_tbl_scope_cb {
        int index;
        struct tf_em_ctx_mem_info  em_ctx_info[TF_DIR_MAX];
        struct tf_em_caps          em_caps[TF_DIR_MAX];
-       struct stack               ext_pool[TF_DIR_MAX][TF_EXT_POOL_CNT_MAX];
-       uint32_t              *ext_pool_mem[TF_DIR_MAX][TF_EXT_POOL_CNT_MAX];
+       struct stack               ext_act_pool[TF_DIR_MAX];
+       uint32_t                  *ext_act_pool_mem[TF_DIR_MAX];
 };
 
 /** Hardware Page sizes supported for EEM: 4K, 8K, 64K, 256K, 1M, 2M, 4M, 1G.