eal: remove sys/queue.h from public headers
[dpdk.git] / drivers / net / bnxt / tf_core / tf_tcam_shared.c
index 9cd5533..c120c6f 100644 (file)
@@ -279,18 +279,6 @@ tf_tcam_shared_bind(struct tf *tfp,
                if (rc)
                        return rc;
 
-               rc = tf_tcam_shared_get_slices(tfp,
-                                              dev,
-                                              &num_slices);
-               if (rc)
-                       return rc;
-
-               if (num_slices > 1) {
-                       TFP_DRV_LOG(ERR,
-                                   "Only single slice supported\n");
-                       return -EOPNOTSUPP;
-               }
-
                tf_tcam_shared_create_db(&tcam_shared_wc);
 
 
@@ -330,6 +318,18 @@ tf_tcam_shared_bind(struct tf *tfp,
 
                        tf_session_set_tcam_shared_db(tfp, (void *)tcam_shared_wc);
                }
+
+               rc = tf_tcam_shared_get_slices(tfp,
+                                              dev,
+                                              &num_slices);
+               if (rc)
+                       return rc;
+
+               if (num_slices > 1) {
+                       TFP_DRV_LOG(ERR,
+                                   "Only single slice supported\n");
+                       return -EOPNOTSUPP;
+               }
        }
 done:
        return rc;
@@ -972,9 +972,9 @@ tf_tcam_shared_move_entry(struct tf *tfp,
        sparms.idx = dphy_idx;
        sparms.key = gparms.key;
        sparms.mask = gparms.mask;
-       sparms.key_size = gparms.key_size;
+       sparms.key_size = key_sz_bytes;
        sparms.result = gparms.result;
-       sparms.result_size = gparms.result_size;
+       sparms.result_size = remap_sz_bytes;
 
        rc = tf_msg_tcam_entry_set(tfp, dev, &sparms);
        if (rc) {
@@ -1153,8 +1153,9 @@ done:
        return rc;
 }
 
-int tf_tcam_shared_move_p4(struct tf *tfp,
-                          struct tf_move_tcam_shared_entries_parms *parms)
+int
+tf_tcam_shared_move_p4(struct tf *tfp,
+                      struct tf_move_tcam_shared_entries_parms *parms)
 {
        int rc = 0;
        rc = tf_tcam_shared_move(tfp,
@@ -1166,8 +1167,9 @@ int tf_tcam_shared_move_p4(struct tf *tfp,
 }
 
 
-int tf_tcam_shared_move_p58(struct tf *tfp,
-                           struct tf_move_tcam_shared_entries_parms *parms)
+int
+tf_tcam_shared_move_p58(struct tf *tfp,
+                       struct tf_move_tcam_shared_entries_parms *parms)
 {
        int rc = 0;
        rc = tf_tcam_shared_move(tfp,
@@ -1177,3 +1179,104 @@ int tf_tcam_shared_move_p58(struct tf *tfp,
                                 true); /* set enable bit */
        return rc;
 }
+
+int
+tf_tcam_shared_clear(struct tf *tfp,
+                    struct tf_clear_tcam_shared_entries_parms *parms)
+{
+       int rc = 0;
+       struct tf_session *tfs;
+       struct tf_dev_info *dev;
+       uint16_t start;
+       int phy_idx;
+       enum tf_tcam_shared_wc_pool_id id;
+       struct tf_tcam_free_parms nparms;
+       uint16_t hcapi_type;
+       struct tf_rm_alloc_info info;
+       void *tcam_shared_db_ptr = NULL;
+       struct tf_tcam_shared_wc_pools *tcam_shared_wc;
+       int i, cnt;
+
+       TF_CHECK_PARMS2(tfp, parms);
+
+       /* Retrieve the session information */
+       rc = tf_session_get_session_internal(tfp, &tfs);
+       if (rc)
+               return rc;
+
+       if (!tf_session_is_shared_session(tfs) ||
+           (parms->tcam_tbl_type != TF_TCAM_TBL_TYPE_WC_TCAM_HIGH &&
+            parms->tcam_tbl_type != TF_TCAM_TBL_TYPE_WC_TCAM_LOW))
+               return -EOPNOTSUPP;
+
+       if (!tf_tcam_db_valid(tfp, parms->dir)) {
+               TFP_DRV_LOG(ERR,
+                           "%s: tcam shared pool doesn't exist\n",
+                           tf_dir_2_str(parms->dir));
+               return -ENOMEM;
+       }
+
+       rc = tf_session_get_tcam_shared_db(tfp, (void *)&tcam_shared_db_ptr);
+       if (rc) {
+               TFP_DRV_LOG(ERR,
+                           "Failed to get tcam_shared_db from session, rc:%s\n",
+                           strerror(-rc));
+               return rc;
+       }
+       tcam_shared_wc = (struct tf_tcam_shared_wc_pools *)tcam_shared_db_ptr;
+
+
+       if (parms->tcam_tbl_type == TF_TCAM_TBL_TYPE_WC_TCAM_HIGH)
+               id = TF_TCAM_SHARED_WC_POOL_HI;
+       else
+               id = TF_TCAM_SHARED_WC_POOL_LO;
+
+
+       /* Retrieve the device information */
+       rc = tf_session_get_device(tfs, &dev);
+       if (rc)
+               return rc;
+
+       rc = tf_tcam_shared_get_rm_info(tfp,
+                                       parms->dir,
+                                       &hcapi_type,
+                                       &info);
+       if (rc) {
+               TFP_DRV_LOG(ERR,
+                           "%s: TCAM rm info get failed\n",
+                           tf_dir_2_str(parms->dir));
+               return rc;
+       }
+
+       start = tcam_shared_wc->db[parms->dir][id].info.start;
+       cnt = tcam_shared_wc->db[parms->dir][id].info.stride;
+
+       /* Override HI/LO type with parent WC TCAM type */
+       nparms.dir = parms->dir;
+       nparms.type = TF_TCAM_TBL_TYPE_WC_TCAM;
+       nparms.hcapi_type = hcapi_type;
+
+       for (i = 0; i < cnt; i++) {
+               phy_idx = start + i;
+               nparms.idx = phy_idx;
+
+               /* Clear entry */
+               rc = tf_msg_tcam_entry_free(tfp, dev, &nparms);
+               if (rc) {
+                       /* Log error */
+                       TFP_DRV_LOG(ERR,
+                                   "%s: %s: log%d free failed, rc:%s\n",
+                                   tf_dir_2_str(nparms.dir),
+                                   tf_tcam_tbl_2_str(nparms.type),
+                                   phy_idx,
+                                   strerror(-rc));
+                       return rc;
+               }
+       }
+
+       TFP_DRV_LOG(DEBUG,
+                   "%s: TCAM shared clear pool(%s)\n",
+                   tf_dir_2_str(nparms.dir),
+                   tf_pool_2_str(id));
+       return 0;
+}