@@ -1,5 +1,5 @@
/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2021-2023 Broadcom
+ * Copyright(c) 2021-2024 Broadcom
* All rights reserved.
*/
@@ -12,22 +12,13 @@
#include "tf_session.h"
#include "tf_util.h"
#include "cfa_tcam_mgr.h"
-#include "cfa_tcam_mgr_hwop_msg.h"
#include "cfa_tcam_mgr_device.h"
-#include "cfa_tcam_mgr_session.h"
+#include "cfa_tcam_mgr_hwop_msg.h"
#include "cfa_tcam_mgr_p58.h"
#include "cfa_tcam_mgr_p4.h"
#define TF_TCAM_SLICE_INVALID (-1)
-static struct cfa_tcam_mgr_entry_data *entry_data[TF_TCAM_MAX_SESSIONS];
-
-static int global_data_initialized[TF_TCAM_MAX_SESSIONS];
-int cfa_tcam_mgr_max_entries[TF_TCAM_MAX_SESSIONS];
-
-struct cfa_tcam_mgr_table_data
-cfa_tcam_mgr_tables[TF_TCAM_MAX_SESSIONS][TF_DIR_MAX][CFA_TCAM_MGR_TBL_TYPE_MAX];
-
static int physical_table_types[CFA_TCAM_MGR_TBL_TYPE_MAX] = {
[CFA_TCAM_MGR_TBL_TYPE_L2_CTXT_TCAM_HIGH_APPS] =
TF_TCAM_TBL_TYPE_L2_CTXT_TCAM_HIGH,
@@ -109,7 +100,7 @@ cfa_tcam_mgr_get_num_slices(unsigned int key_size, unsigned int slice_width)
{
int num_slices = 0;
- if (key_size == 0)
+ if (!key_size)
return -CFA_TCAM_MGR_ERR_CODE(INVAL);
num_slices = ((key_size - 1U) / slice_width) + 1U;
@@ -132,36 +123,43 @@ cfa_tcam_mgr_get_num_slices(unsigned int key_size, unsigned int slice_width)
}
static struct cfa_tcam_mgr_entry_data *
-cfa_tcam_mgr_entry_get(int sess_idx, uint16_t id)
+cfa_tcam_mgr_entry_get(struct cfa_tcam_mgr_data *tcam_mgr_data, uint16_t id)
{
- if (id > cfa_tcam_mgr_max_entries[sess_idx])
+ if (id > tcam_mgr_data->cfa_tcam_mgr_max_entries)
return NULL;
- return &entry_data[sess_idx][id];
+ return &tcam_mgr_data->entry_data[id];
}
/* Insert an entry into the entry table */
static int
-cfa_tcam_mgr_entry_insert(int sess_idx, uint16_t id,
+cfa_tcam_mgr_entry_insert(struct cfa_tcam_mgr_data *tcam_mgr_data,
+ struct tf *tfp __rte_unused, uint16_t id,
struct cfa_tcam_mgr_entry_data *entry)
{
- if (id > cfa_tcam_mgr_max_entries[sess_idx])
+ if (id > tcam_mgr_data->cfa_tcam_mgr_max_entries)
return -CFA_TCAM_MGR_ERR_CODE(INVAL);
- memcpy(&entry_data[sess_idx][id], entry,
- sizeof(entry_data[sess_idx][id]));
+ memcpy(&tcam_mgr_data->entry_data[id], entry,
+ sizeof(tcam_mgr_data->entry_data[id]));
+
+ CFA_TCAM_MGR_TRACE(INFO, "Added entry %d to table\n", id);
return 0;
}
/* Delete an entry from the entry table */
static int
-cfa_tcam_mgr_entry_delete(int sess_idx, uint16_t id)
+cfa_tcam_mgr_entry_delete(struct cfa_tcam_mgr_data *tcam_mgr_data,
+ struct tf *tfp __rte_unused, uint16_t id)
{
- if (id > cfa_tcam_mgr_max_entries[sess_idx])
+ if (id > tcam_mgr_data->cfa_tcam_mgr_max_entries)
return -CFA_TCAM_MGR_ERR_CODE(INVAL);
- memset(&entry_data[sess_idx][id], 0, sizeof(entry_data[sess_idx][id]));
+ memset(&tcam_mgr_data->entry_data[id], 0,
+ sizeof(tcam_mgr_data->entry_data[id]));
+
+ CFA_TCAM_MGR_TRACE(INFO, "Deleted entry %d from table.\n", id);
return 0;
}
@@ -170,11 +168,12 @@ cfa_tcam_mgr_entry_delete(int sess_idx, uint16_t id)
* TCAM supports.
*/
static int
-cfa_tcam_mgr_row_size_get(int sess_idx, enum tf_dir dir,
+cfa_tcam_mgr_row_size_get(struct cfa_tcam_mgr_data *tcam_mgr_data,
+ enum tf_dir dir,
enum cfa_tcam_mgr_tbl_type type)
{
return sizeof(struct cfa_tcam_mgr_table_rows_0) +
- (cfa_tcam_mgr_tables[sess_idx][dir][type].max_slices *
+ (tcam_mgr_data->cfa_tcam_mgr_tables[dir][type].max_slices *
sizeof(((struct cfa_tcam_mgr_table_rows_0 *)0)->entries[0]));
}
@@ -188,18 +187,19 @@ cfa_tcam_mgr_row_ptr_get(void *base, int index, int row_size)
* Searches a table to find the direction and type of an entry.
*/
static int
-cfa_tcam_mgr_entry_find_in_table(int sess_idx, int id, enum tf_dir dir,
+cfa_tcam_mgr_entry_find_in_table(struct cfa_tcam_mgr_data *tcam_mgr_data,
+ int id, enum tf_dir dir,
enum cfa_tcam_mgr_tbl_type type)
{
struct cfa_tcam_mgr_table_data *table_data;
- struct cfa_tcam_mgr_table_rows_0 *row;
int max_slices, row_idx, row_size, slice;
+ struct cfa_tcam_mgr_table_rows_0 *row;
- table_data = &cfa_tcam_mgr_tables[sess_idx][dir][type];
+ table_data = &tcam_mgr_data->cfa_tcam_mgr_tables[dir][type];
if (table_data->max_entries > 0 &&
table_data->hcapi_type > 0) {
max_slices = table_data->max_slices;
- row_size = cfa_tcam_mgr_row_size_get(sess_idx, dir, type);
+ row_size = cfa_tcam_mgr_row_size_get(tcam_mgr_data, dir, type);
for (row_idx = table_data->start_row;
row_idx <= table_data->end_row;
row_idx++) {
@@ -225,19 +225,24 @@ cfa_tcam_mgr_entry_find_in_table(int sess_idx, int id, enum tf_dir dir,
* Searches all the tables to find the direction and type of an entry.
*/
static int
-cfa_tcam_mgr_entry_find(int sess_idx, int id, enum tf_dir *tbl_dir,
+cfa_tcam_mgr_entry_find(struct cfa_tcam_mgr_data *tcam_mgr_data, int id,
+ enum tf_dir *tbl_dir,
enum cfa_tcam_mgr_tbl_type *tbl_type)
{
- enum tf_dir dir;
enum cfa_tcam_mgr_tbl_type type;
int rc = -CFA_TCAM_MGR_ERR_CODE(NOENT);
+ enum tf_dir dir;
- for (dir = TF_DIR_RX; dir < ARRAY_SIZE(cfa_tcam_mgr_tables[sess_idx]); dir++) {
+ for (dir = TF_DIR_RX; dir <
+ ARRAY_SIZE(tcam_mgr_data->cfa_tcam_mgr_tables);
+ dir++) {
for (type = CFA_TCAM_MGR_TBL_TYPE_START;
- type < ARRAY_SIZE(cfa_tcam_mgr_tables[sess_idx][dir]);
+ type <
+ ARRAY_SIZE(tcam_mgr_data->cfa_tcam_mgr_tables[dir]);
type++) {
- rc = cfa_tcam_mgr_entry_find_in_table(sess_idx, id, dir, type);
- if (rc == 0) {
+ rc = cfa_tcam_mgr_entry_find_in_table(tcam_mgr_data,
+ id, dir, type);
+ if (!rc) {
*tbl_dir = dir;
*tbl_type = type;
return rc;
@@ -262,11 +267,11 @@ cfa_tcam_mgr_row_is_entry_free(struct cfa_tcam_mgr_table_rows_0 *row,
return j;
}
}
- return -1;
+ return -CFA_TCAM_MGR_ERR_CODE(INVAL);
}
static int
-cfa_tcam_mgr_entry_move(int sess_idx, struct cfa_tcam_mgr_context *context,
+cfa_tcam_mgr_entry_move(struct cfa_tcam_mgr_data *tcam_mgr_data, struct tf *tfp,
enum tf_dir dir, enum cfa_tcam_mgr_tbl_type type,
int entry_id,
struct cfa_tcam_mgr_table_data *table_data,
@@ -280,15 +285,15 @@ cfa_tcam_mgr_entry_move(int sess_idx, struct cfa_tcam_mgr_context *context,
struct cfa_tcam_mgr_set_parms sparms = { 0 };
struct cfa_tcam_mgr_free_parms fparms = { 0 };
struct cfa_tcam_mgr_entry_data *entry;
- uint8_t key[CFA_TCAM_MGR_MAX_KEY_SIZE];
- uint8_t mask[CFA_TCAM_MGR_MAX_KEY_SIZE];
uint8_t result[CFA_TCAM_MGR_MAX_KEY_SIZE];
+ uint8_t mask[CFA_TCAM_MGR_MAX_KEY_SIZE];
+ uint8_t key[CFA_TCAM_MGR_MAX_KEY_SIZE];
int j, rc;
- entry = cfa_tcam_mgr_entry_get(sess_idx, entry_id);
- if (entry == NULL)
- return -1;
+ entry = cfa_tcam_mgr_entry_get(tcam_mgr_data, entry_id);
+ if (!entry)
+ return -CFA_TCAM_MGR_ERR_CODE(INVAL);
gparms.dir = dir;
gparms.type = type;
@@ -300,11 +305,11 @@ cfa_tcam_mgr_entry_move(int sess_idx, struct cfa_tcam_mgr_context *context,
gparms.key_size = sizeof(key);
gparms.result_size = sizeof(result);
- rc = cfa_tcam_mgr_entry_get_msg(sess_idx, context, &gparms,
+ rc = cfa_tcam_mgr_entry_get_msg(tcam_mgr_data, tfp, &gparms,
source_row_index,
entry->slice * source_row->entry_size,
table_data->max_slices);
- if (rc != 0)
+ if (rc)
return rc;
sparms.dir = dir;
@@ -332,18 +337,19 @@ cfa_tcam_mgr_entry_move(int sess_idx, struct cfa_tcam_mgr_context *context,
if (dest_row_slice < 0)
return -CFA_TCAM_MGR_ERR_CODE(PERM);
- rc = cfa_tcam_mgr_entry_set_msg(sess_idx, context, &sparms,
+ rc = cfa_tcam_mgr_entry_set_msg(tcam_mgr_data, tfp, &sparms,
dest_row_index,
dest_row_slice * dest_row->entry_size,
table_data->max_slices);
- if (rc != 0)
+ if (rc)
return rc;
if (free_source_entry) {
fparms.dir = dir;
fparms.type = type;
fparms.hcapi_type = table_data->hcapi_type;
- rc = cfa_tcam_mgr_entry_free_msg(sess_idx, context, &fparms,
+ rc = cfa_tcam_mgr_entry_free_msg(tcam_mgr_data,
+ tfp, &fparms,
source_row_index,
entry->slice *
dest_row->entry_size,
@@ -352,15 +358,15 @@ cfa_tcam_mgr_entry_move(int sess_idx, struct cfa_tcam_mgr_context *context,
source_row->entry_size,
table_data->result_size,
table_data->max_slices);
- if (rc != 0) {
+ if (rc) {
CFA_TCAM_MGR_LOG_DIR_TYPE(ERR,
dir, type,
- "Failed to free entry ID %d at"
- " row %d, slice %d for sess_idx %d. rc: %d.\n",
+ "Failed to free entry ID:%d"
+ " at row:%d slice:%d"
+ " rc:%d\n",
gparms.id,
source_row_index,
entry->slice,
- sess_idx,
-rc);
}
}
@@ -371,13 +377,17 @@ cfa_tcam_mgr_entry_move(int sess_idx, struct cfa_tcam_mgr_context *context,
entry->row = dest_row_index;
entry->slice = dest_row_slice;
+#ifdef CFA_TCAM_MGR_TRACING
+ cfa_tcam_mgr_rows_dump(tfp, dir, type);
+#endif
+
return 0;
}
static int
-cfa_tcam_mgr_row_move(int sess_idx, struct cfa_tcam_mgr_context *context,
+cfa_tcam_mgr_row_move(struct cfa_tcam_mgr_data *tcam_mgr_data, struct tf *tfp,
enum tf_dir dir, enum cfa_tcam_mgr_tbl_type type,
- struct cfa_tcam_mgr_table_data *table_data,
+ struct cfa_tcam_mgr_table_data *tbl_data,
int dest_row_index,
struct cfa_tcam_mgr_table_rows_0 *dest_row,
int source_row_index,
@@ -392,30 +402,32 @@ cfa_tcam_mgr_row_move(int sess_idx, struct cfa_tcam_mgr_context *context,
fparms.dir = dir;
fparms.type = type;
- fparms.hcapi_type = table_data->hcapi_type;
+ fparms.hcapi_type = tbl_data->hcapi_type;
for (j = 0;
- j < (table_data->max_slices / source_row->entry_size);
+ j < (tbl_data->max_slices / source_row->entry_size);
j++) {
if (ROW_ENTRY_INUSE(source_row, j)) {
- cfa_tcam_mgr_entry_move(sess_idx, context, dir, type,
+ cfa_tcam_mgr_entry_move(tcam_mgr_data, tfp,
+ dir, type,
source_row->entries[j],
- table_data,
+ tbl_data,
dest_row_index, j, dest_row,
source_row_index, source_row,
true);
} else {
/* Slice not in use, write an empty slice. */
- rc = cfa_tcam_mgr_entry_free_msg(sess_idx, context, &fparms,
- dest_row_index,
- j *
- dest_row->entry_size,
- table_data->row_width /
- table_data->max_slices *
- dest_row->entry_size,
- table_data->result_size,
- table_data->max_slices);
- if (rc != 0)
+ rc = cfa_tcam_mgr_entry_free_msg(tcam_mgr_data,
+ tfp, &fparms,
+ dest_row_index,
+ j *
+ dest_row->entry_size,
+ tbl_data->row_width /
+ tbl_data->max_slices *
+ dest_row->entry_size,
+ tbl_data->result_size,
+ tbl_data->max_slices);
+ if (rc)
return rc;
}
}
@@ -425,7 +437,7 @@ cfa_tcam_mgr_row_move(int sess_idx, struct cfa_tcam_mgr_context *context,
/* Install entry into in-memory tables, not into TCAM (yet). */
static void
-cfa_tcam_mgr_row_entry_install(int sess_idx,
+cfa_tcam_mgr_row_entry_install(struct tf *tfp __rte_unused,
struct cfa_tcam_mgr_table_rows_0 *row,
struct cfa_tcam_mgr_alloc_parms *parms,
struct cfa_tcam_mgr_entry_data *entry,
@@ -433,12 +445,6 @@ cfa_tcam_mgr_row_entry_install(int sess_idx,
int key_slices,
int row_index, int slice)
{
- if (global_data_initialized[sess_idx] == 0) {
- CFA_TCAM_MGR_LOG(INFO, "PANIC: No TCAM data created for sess_idx %d\n",
- sess_idx);
- return;
- }
-
if (slice == TF_TCAM_SLICE_INVALID) {
slice = 0;
row->entry_size = key_slices;
@@ -449,36 +455,55 @@ cfa_tcam_mgr_row_entry_install(int sess_idx,
row->entries[slice] = id;
entry->row = row_index;
entry->slice = slice;
+
+ CFA_TCAM_MGR_TRACE(INFO,
+ "Entry %d installed row:%d slice:%d prio:%d\n",
+ id, row_index, slice, row->priority);
+#ifdef CFA_TCAM_MGR_TRACING
+ cfa_tcam_mgr_rows_dump(tfp, parms->dir, parms->type);
+#endif
}
/* Finds an empty row that can be used and reserve for entry. If necessary,
* entries will be shuffled in order to make room.
*/
static struct cfa_tcam_mgr_table_rows_0 *
-cfa_tcam_mgr_empty_row_alloc(int sess_idx, struct cfa_tcam_mgr_context *context,
+cfa_tcam_mgr_empty_row_alloc(struct cfa_tcam_mgr_data *tcam_mgr_data,
+ struct tf *tfp,
struct cfa_tcam_mgr_alloc_parms *parms,
struct cfa_tcam_mgr_entry_data *entry,
- uint16_t id,
- int key_slices)
+ uint16_t id, int key_slices)
{
+ int to_row_idx, from_row_idx, slice, start_row, end_row;
struct cfa_tcam_mgr_table_rows_0 *tcam_rows;
+ struct cfa_tcam_mgr_table_data *table_data;
struct cfa_tcam_mgr_table_rows_0 *from_row;
struct cfa_tcam_mgr_table_rows_0 *to_row;
struct cfa_tcam_mgr_table_rows_0 *row;
- struct cfa_tcam_mgr_table_data *table_data;
int i, max_slices, row_size;
- int to_row_idx, from_row_idx, slice, start_row, end_row;
- int empty_row = -1;
int target_row = -1;
+ int empty_row = -1;
- table_data = &cfa_tcam_mgr_tables[sess_idx][parms->dir][parms->type];
+ table_data =
+ &tcam_mgr_data->cfa_tcam_mgr_tables[parms->dir][parms->type];
- start_row = table_data->start_row;
- end_row = table_data->end_row;
+ start_row = table_data->start_row;
+ end_row = table_data->end_row;
max_slices = table_data->max_slices;
- tcam_rows = table_data->tcam_rows;
+ tcam_rows = table_data->tcam_rows;
- row_size = cfa_tcam_mgr_row_size_get(sess_idx, parms->dir, parms->type);
+ row_size = cfa_tcam_mgr_row_size_get(tcam_mgr_data, parms->dir,
+ parms->type);
+ /*
+ * Note: The rows are ordered from highest priority to lowest priority.
+ * That is, the first row in the table will have the highest priority
+ * and the last row in the table will have the lowest priority.
+ */
+
+ CFA_TCAM_MGR_TRACE(INFO, "Trying to alloc space for entry with "
+ "priority %d and width %d slices.\n",
+ parms->priority,
+ key_slices);
/*
* First check for partially used entries, but only if the key needs
@@ -497,10 +522,11 @@ cfa_tcam_mgr_empty_row_alloc(int sess_idx, struct cfa_tcam_mgr_context *context,
max_slices,
key_slices);
if (slice >= 0) {
- cfa_tcam_mgr_row_entry_install(sess_idx, row, parms,
+ cfa_tcam_mgr_row_entry_install(tfp,
+ row, parms,
entry, id,
- key_slices,
- i, slice);
+ key_slices, i,
+ slice);
return row;
}
}
@@ -519,11 +545,10 @@ cfa_tcam_mgr_empty_row_alloc(int sess_idx, struct cfa_tcam_mgr_context *context,
for (i = start_row; i <= end_row; i++) {
row = cfa_tcam_mgr_row_ptr_get(tcam_rows, i, row_size);
if (!ROW_INUSE(row)) {
- cfa_tcam_mgr_row_entry_install(sess_idx,
+ cfa_tcam_mgr_row_entry_install(tfp,
row, parms,
- entry,
- id, key_slices,
- i,
+ entry, id,
+ key_slices, i,
TF_TCAM_SLICE_INVALID);
return row;
}
@@ -563,7 +588,7 @@ cfa_tcam_mgr_empty_row_alloc(int sess_idx, struct cfa_tcam_mgr_context *context,
* just install new entry in empty_row.
*/
row = cfa_tcam_mgr_row_ptr_get(tcam_rows, empty_row, row_size);
- cfa_tcam_mgr_row_entry_install(sess_idx, row, parms, entry, id,
+ cfa_tcam_mgr_row_entry_install(tfp, row, parms, entry, id,
key_slices, empty_row,
TF_TCAM_SLICE_INVALID);
return row;
@@ -587,15 +612,19 @@ cfa_tcam_mgr_empty_row_alloc(int sess_idx, struct cfa_tcam_mgr_context *context,
from_row_idx = i;
from_row = row;
}
- cfa_tcam_mgr_row_move(sess_idx, context, parms->dir, parms->type,
+ cfa_tcam_mgr_row_move(tcam_mgr_data, tfp, parms->dir,
+ parms->type,
table_data, to_row_idx, to_row,
from_row_idx, from_row);
+ CFA_TCAM_MGR_TRACE(INFO, "Moved row %d to row %d.\n",
+ from_row_idx, to_row_idx);
+
to_row = from_row;
to_row_idx = from_row_idx;
}
to_row = cfa_tcam_mgr_row_ptr_get(tcam_rows, target_row, row_size);
memset(to_row, 0, row_size);
- cfa_tcam_mgr_row_entry_install(sess_idx, to_row, parms, entry, id,
+ cfa_tcam_mgr_row_entry_install(tfp, to_row, parms, entry, id,
key_slices, target_row,
TF_TCAM_SLICE_INVALID);
@@ -607,24 +636,26 @@ cfa_tcam_mgr_empty_row_alloc(int sess_idx, struct cfa_tcam_mgr_context *context,
* used necessary for the entries that are installed.
*/
static void
-cfa_tcam_mgr_rows_combine(int sess_idx, struct cfa_tcam_mgr_context *context,
+cfa_tcam_mgr_rows_combine(struct cfa_tcam_mgr_data *tcam_mgr_data,
+ struct tf *tfp,
struct cfa_tcam_mgr_free_parms *parms,
struct cfa_tcam_mgr_table_data *table_data,
int changed_row_index)
{
+ int to_row_idx, from_row_idx, start_row, end_row, max_slices;
struct cfa_tcam_mgr_table_rows_0 *from_row = NULL;
- struct cfa_tcam_mgr_table_rows_0 *to_row;
struct cfa_tcam_mgr_table_rows_0 *tcam_rows;
- int i, j, row_size;
- int to_row_idx, from_row_idx, start_row, end_row, max_slices;
+ struct cfa_tcam_mgr_table_rows_0 *to_row;
bool entry_moved = false;
+ int i, j, row_size;
start_row = table_data->start_row;
end_row = table_data->end_row;
max_slices = table_data->max_slices;
tcam_rows = table_data->tcam_rows;
- row_size = cfa_tcam_mgr_row_size_get(sess_idx, parms->dir, parms->type);
+ row_size = cfa_tcam_mgr_row_size_get(tcam_mgr_data, parms->dir,
+ parms->type);
from_row_idx = changed_row_index;
from_row = cfa_tcam_mgr_row_ptr_get(tcam_rows, from_row_idx, row_size);
@@ -658,8 +689,8 @@ cfa_tcam_mgr_rows_combine(int sess_idx, struct cfa_tcam_mgr_context *context,
j++) {
if (!ROW_ENTRY_INUSE(to_row, j)) {
cfa_tcam_mgr_entry_move
- (sess_idx,
- context,
+ (tcam_mgr_data,
+ tfp,
parms->dir,
parms->type,
from_row->entries[i],
@@ -680,14 +711,14 @@ cfa_tcam_mgr_rows_combine(int sess_idx, struct cfa_tcam_mgr_context *context,
#ifdef TF_FLOW_SCALE_QUERY
/* CFA update usage state when moved entries */
if (entry_moved) {
- if (tf_tcam_usage_update(context->tfp->session->session_id.id,
+ if (tf_tcam_usage_update(tfp,
parms->dir,
parms->type,
to_row,
TF_RESC_ALLOC)) {
CFA_TCAM_MGR_TRACE(DEBUG, "TF tcam usage update failed\n");
}
- if (tf_tcam_usage_update(context->tfp->session->session_id.id,
+ if (tf_tcam_usage_update(tfp,
parms->dir,
parms->type,
from_row,
@@ -707,29 +738,28 @@ cfa_tcam_mgr_rows_combine(int sess_idx, struct cfa_tcam_mgr_context *context,
/*
* This function will ensure that all rows, except those of the highest
- * priority, at the end of the table. When this function is finished, all the
+ * priority, are at the end of the table. When this function is finished, all
* empty rows should be between the highest priority rows at the beginning of
* the table and the rest of the rows with lower priorities.
- */
-/*
- * Will need to free the row left newly empty as a result of moving.
*
+ * Will need to free the row left newly empty as a result of moving.
* Return row to free to caller. If new_row_to_free < 0, then no new row to
* free.
*/
static void
-cfa_tcam_mgr_rows_compact(int sess_idx, struct cfa_tcam_mgr_context *context,
+cfa_tcam_mgr_rows_compact(struct cfa_tcam_mgr_data *tcam_mgr_data,
+ struct tf *tfp,
struct cfa_tcam_mgr_free_parms *parms,
struct cfa_tcam_mgr_table_data *table_data,
int *new_row_to_free,
int changed_row_index)
{
+ int to_row_idx = 0, from_row_idx = 0, start_row = 0, end_row = 0;
struct cfa_tcam_mgr_table_rows_0 *from_row = NULL;
+ struct cfa_tcam_mgr_table_rows_0 *tcam_rows;
struct cfa_tcam_mgr_table_rows_0 *to_row;
struct cfa_tcam_mgr_table_rows_0 *row;
- struct cfa_tcam_mgr_table_rows_0 *tcam_rows;
int i, row_size, priority;
- int to_row_idx = 0, from_row_idx = 0, start_row = 0, end_row = 0;
*new_row_to_free = -1;
@@ -737,7 +767,8 @@ cfa_tcam_mgr_rows_compact(int sess_idx, struct cfa_tcam_mgr_context *context,
end_row = table_data->end_row;
tcam_rows = table_data->tcam_rows;
- row_size = cfa_tcam_mgr_row_size_get(sess_idx, parms->dir, parms->type);
+ row_size = cfa_tcam_mgr_row_size_get(tcam_mgr_data, parms->dir,
+ parms->type);
/*
* The row is no longer in use, so see if rows need to be moved in order
@@ -791,14 +822,21 @@ cfa_tcam_mgr_rows_compact(int sess_idx, struct cfa_tcam_mgr_context *context,
* to fill the newly empty (by free or by move)
* row.
*/
- if (from_row != NULL) {
- cfa_tcam_mgr_row_move(sess_idx, context,
+ if (from_row) {
+ cfa_tcam_mgr_row_move(tcam_mgr_data,
+ tfp,
parms->dir,
parms->type,
table_data,
- to_row_idx, to_row,
+ to_row_idx,
+ to_row,
from_row_idx,
from_row);
+ CFA_TCAM_MGR_TRACE(INFO,
+ "Moved row %d "
+ "to row %d.\n",
+ from_row_idx,
+ to_row_idx);
*new_row_to_free = from_row_idx;
to_row = from_row;
to_row_idx = from_row_idx;
@@ -811,11 +849,12 @@ cfa_tcam_mgr_rows_compact(int sess_idx, struct cfa_tcam_mgr_context *context,
}
}
- if (from_row != NULL) {
- cfa_tcam_mgr_row_move(sess_idx, context, parms->dir, parms->type,
- table_data,
- to_row_idx, to_row,
- from_row_idx, from_row);
+ if (from_row) {
+ cfa_tcam_mgr_row_move(tcam_mgr_data, tfp, parms->dir,
+ parms->type, table_data, to_row_idx,
+ to_row, from_row_idx, from_row);
+ CFA_TCAM_MGR_TRACE(INFO, "Moved row %d to row %d.\n",
+ from_row_idx, to_row_idx);
*new_row_to_free = from_row_idx;
}
}
@@ -824,46 +863,51 @@ cfa_tcam_mgr_rows_compact(int sess_idx, struct cfa_tcam_mgr_context *context,
* This function is to set table limits for the logical TCAM tables.
*/
static int
-cfa_tcam_mgr_table_limits_set(int sess_idx, struct cfa_tcam_mgr_init_parms *parms)
+cfa_tcam_mgr_table_limits_set(struct cfa_tcam_mgr_data *tcam_mgr_data,
+ struct cfa_tcam_mgr_init_parms *parms)
{
struct cfa_tcam_mgr_table_data *table_data;
unsigned int dir, type;
int start, stride;
- if (parms == NULL)
+ if (!parms)
return 0;
- for (dir = 0; dir < ARRAY_SIZE(cfa_tcam_mgr_tables[sess_idx]); dir++)
+ for (dir = 0; dir < ARRAY_SIZE(tcam_mgr_data->cfa_tcam_mgr_tables);
+ dir++)
for (type = 0;
- type < ARRAY_SIZE(cfa_tcam_mgr_tables[sess_idx][dir]);
+ type <
+ ARRAY_SIZE(tcam_mgr_data->cfa_tcam_mgr_tables[dir]);
type++) {
- table_data = &cfa_tcam_mgr_tables[sess_idx][dir][type];
+ table_data =
+ &tcam_mgr_data->cfa_tcam_mgr_tables[dir][type];
/*
* If num_rows is zero, then TCAM Manager did not
* allocate any row storage for that table so cannot
* manage it.
*/
- if (table_data->num_rows == 0)
+ if (!table_data->num_rows)
continue;
start = parms->resc[dir][type].start;
stride = parms->resc[dir][type].stride;
if (start % table_data->max_slices > 0) {
CFA_TCAM_MGR_LOG_DIR_TYPE(ERR, dir, type,
- "Start of resources (%d) for table (%d) "
- "does not begin on row boundary.\n",
- start, sess_idx);
+ "Start of resources"
+ " (%d) does not begin"
+ " on row boundary.\n",
+ start);
CFA_TCAM_MGR_LOG_DIR(ERR, dir,
- "Start is %d, number of slices "
- "is %d.\n",
+ "Start is %d, number of"
+ " slices is %d.\n",
start,
table_data->max_slices);
return -CFA_TCAM_MGR_ERR_CODE(INVAL);
}
if (stride % table_data->max_slices > 0) {
CFA_TCAM_MGR_LOG_DIR_TYPE(ERR, dir, type,
- "Stride of resources (%d) for table (%d)"
+ "Stride of resources (%d) "
" does not end on row boundary.\n",
- stride, sess_idx);
+ stride);
CFA_TCAM_MGR_LOG_DIR(ERR, dir,
"Stride is %d, number of "
"slices is %d.\n",
@@ -871,7 +915,7 @@ cfa_tcam_mgr_table_limits_set(int sess_idx, struct cfa_tcam_mgr_init_parms *parm
table_data->max_slices);
return -CFA_TCAM_MGR_ERR_CODE(INVAL);
}
- if (stride == 0) {
+ if (!stride) {
table_data->start_row = 0;
table_data->end_row = 0;
table_data->max_entries = 0;
@@ -890,49 +934,123 @@ cfa_tcam_mgr_table_limits_set(int sess_idx, struct cfa_tcam_mgr_init_parms *parm
return 0;
}
+static int
+cfa_tcam_mgr_bitmap_alloc(struct tf *tfp __rte_unused,
+ struct cfa_tcam_mgr_data *tcam_mgr_data)
+{
+ struct tfp_calloc_parms cparms;
+ uint64_t session_bmp_size;
+ struct bitalloc *session_bmp;
+ int32_t first_idx;
+ int max_entries;
+ int rc;
+
+ if (!tcam_mgr_data->cfa_tcam_mgr_max_entries)
+ return -CFA_TCAM_MGR_ERR_CODE(INVAL);
+
+ max_entries = tcam_mgr_data->cfa_tcam_mgr_max_entries;
+ session_bmp_size = (sizeof(uint64_t) *
+ (((max_entries - 1) / sizeof(uint64_t)) + 1));
+
+ cparms.nitems = 1;
+ cparms.size = session_bmp_size;
+ cparms.alignment = 0;
+ rc = tfp_calloc(&cparms);
+ if (rc) {
+ /* Log error */
+ TFP_DRV_LOG(ERR,
+ "Failed to allocate session bmp, rc:%s\n",
+ strerror(-rc));
+ return -CFA_TCAM_MGR_ERR_CODE(NOMEM);
+ }
+
+ session_bmp = (struct bitalloc *)cparms.mem_va;
+ rc = ba_init(session_bmp, max_entries, true);
+
+ tcam_mgr_data->session_bmp = session_bmp;
+ tcam_mgr_data->session_bmp_size = max_entries;
+
+ /* Allocate first index to avoid idx 0 */
+ first_idx = ba_alloc(tcam_mgr_data->session_bmp);
+ if (first_idx == BA_FAIL)
+ return -CFA_TCAM_MGR_ERR_CODE(NOSPC);
+
+ TFP_DRV_LOG(INFO,
+ "session bitmap size is %" PRIX64 "\n",
+ tcam_mgr_data->session_bmp_size);
+
+ return 0;
+}
+
+static void
+cfa_tcam_mgr_uninit(struct tf *tfp,
+ enum cfa_tcam_mgr_device_type type)
+{
+ switch (type) {
+ case CFA_TCAM_MGR_DEVICE_TYPE_P4:
+ cfa_tcam_mgr_uninit_p4(tfp);
+ break;
+ case CFA_TCAM_MGR_DEVICE_TYPE_P5:
+ cfa_tcam_mgr_uninit_p58(tfp);
+ break;
+ default:
+ CFA_TCAM_MGR_LOG(ERR, "No such device %d\n", type);
+ return;
+ }
+}
+
int
-cfa_tcam_mgr_init(int sess_idx, enum cfa_tcam_mgr_device_type type,
+cfa_tcam_mgr_init(struct tf *tfp, enum cfa_tcam_mgr_device_type type,
struct cfa_tcam_mgr_init_parms *parms)
{
struct cfa_tcam_mgr_table_data *table_data;
+ struct cfa_tcam_mgr_data *tcam_mgr_data;
unsigned int dir, tbl_type;
+ struct tf_session *tfs;
int rc;
+ rc = tf_session_get_session_internal(tfp, &tfs);
+ if (rc)
+ return rc;
+
switch (type) {
case CFA_TCAM_MGR_DEVICE_TYPE_P4:
- case CFA_TCAM_MGR_DEVICE_TYPE_SR:
- rc = cfa_tcam_mgr_init_p4(sess_idx, &entry_data[sess_idx]);
+ rc = cfa_tcam_mgr_init_p4(tfp);
break;
case CFA_TCAM_MGR_DEVICE_TYPE_P5:
- rc = cfa_tcam_mgr_init_p58(sess_idx, &entry_data[sess_idx]);
+ rc = cfa_tcam_mgr_init_p58(tfp);
break;
default:
- CFA_TCAM_MGR_LOG(ERR, "No such device %d for sess_idx %d\n",
- type, sess_idx);
+ CFA_TCAM_MGR_LOG(ERR, "No such device %d\n", type);
return -CFA_TCAM_MGR_ERR_CODE(NODEV);
}
- if (rc < 0)
+ if (rc)
return rc;
- rc = cfa_tcam_mgr_table_limits_set(sess_idx, parms);
- if (rc < 0)
+ tcam_mgr_data = tfs->tcam_mgr_handle;
+ rc = cfa_tcam_mgr_table_limits_set(tcam_mgr_data, parms);
+ if (rc)
return rc;
/* Now calculate the max entries per table and global max entries based
* on the updated table limits.
*/
- cfa_tcam_mgr_max_entries[sess_idx] = 0;
- for (dir = 0; dir < ARRAY_SIZE(cfa_tcam_mgr_tables[sess_idx]); dir++)
+ tcam_mgr_data->cfa_tcam_mgr_max_entries = 0;
+ for (dir = 0; dir < ARRAY_SIZE(tcam_mgr_data->cfa_tcam_mgr_tables);
+ dir++)
for (tbl_type = 0;
- tbl_type < ARRAY_SIZE(cfa_tcam_mgr_tables[sess_idx][dir]);
+ tbl_type <
+ ARRAY_SIZE(tcam_mgr_data->cfa_tcam_mgr_tables[dir]);
tbl_type++) {
- table_data = &cfa_tcam_mgr_tables[sess_idx][dir][tbl_type];
+ table_data =
+ &tcam_mgr_data->cfa_tcam_mgr_tables[dir]
+ [tbl_type];
/*
* If num_rows is zero, then TCAM Manager did not
* allocate any row storage for that table so cannot
* manage it.
*/
- if (table_data->num_rows == 0) {
+ if (!table_data->num_rows) {
table_data->start_row = 0;
table_data->end_row = 0;
table_data->max_entries = 0;
@@ -940,14 +1058,13 @@ cfa_tcam_mgr_init(int sess_idx, enum cfa_tcam_mgr_device_type type,
table_data->num_rows) {
CFA_TCAM_MGR_LOG_DIR_TYPE(EMERG, dir, tbl_type,
"End row is out of "
- "range (%d >= %d) for sess_idx %d\n",
+ "range (%d >= %d)\n",
table_data->end_row,
- table_data->num_rows,
- sess_idx);
+ table_data->num_rows);
return -CFA_TCAM_MGR_ERR_CODE(FAULT);
- } else if (table_data->max_entries == 0 &&
- table_data->start_row == 0 &&
- table_data->end_row == 0) {
+ } else if (!table_data->max_entries &&
+ !table_data->start_row &&
+ !table_data->end_row) {
/* Nothing to do */
} else {
table_data->max_entries =
@@ -955,51 +1072,45 @@ cfa_tcam_mgr_init(int sess_idx, enum cfa_tcam_mgr_device_type type,
(table_data->end_row -
table_data->start_row + 1);
}
- cfa_tcam_mgr_max_entries[sess_idx] += table_data->max_entries;
+ tcam_mgr_data->cfa_tcam_mgr_max_entries +=
+ table_data->max_entries;
}
- rc = cfa_tcam_mgr_hwops_init(type);
- if (rc < 0)
+ rc = cfa_tcam_mgr_hwops_init(tcam_mgr_data, type);
+ if (rc)
return rc;
- rc = cfa_tcam_mgr_session_init(sess_idx, type);
- if (rc < 0)
+ rc = cfa_tcam_mgr_bitmap_alloc(tfp, tcam_mgr_data);
+ if (rc)
return rc;
- global_data_initialized[sess_idx] = 1;
-
- if (parms != NULL)
- parms->max_entries = cfa_tcam_mgr_max_entries[sess_idx];
+ if (parms)
+ parms->max_entries = tcam_mgr_data->cfa_tcam_mgr_max_entries;
- CFA_TCAM_MGR_LOG(DEBUG, "Global TCAM table initialized for sess_idx %d max entries %d.\n",
- sess_idx, cfa_tcam_mgr_max_entries[sess_idx]);
+ CFA_TCAM_MGR_LOG(DEBUG, "Global TCAM tbl initialized max entries %d\n",
+ tcam_mgr_data->cfa_tcam_mgr_max_entries);
return 0;
}
int
-cfa_tcam_mgr_qcaps(struct cfa_tcam_mgr_context *context __rte_unused,
+cfa_tcam_mgr_qcaps(struct tf *tfp __rte_unused,
struct cfa_tcam_mgr_qcaps_parms *parms)
{
+ struct cfa_tcam_mgr_data *tcam_mgr_data;
+ struct tf_session *tfs;
unsigned int type;
- int rc, sess_idx;
- uint32_t session_id;
+ int rc;
- CFA_TCAM_MGR_CHECK_PARMS2(context, parms);
+ CFA_TCAM_MGR_CHECK_PARMS2(tfp, parms);
- rc = cfa_tcam_mgr_get_session_from_context(context, &session_id);
- if (rc < 0)
+ rc = tf_session_get_session_internal(tfp, &tfs);
+ if (rc)
return rc;
- sess_idx = cfa_tcam_mgr_session_find(session_id);
- if (sess_idx < 0) {
- CFA_TCAM_MGR_LOG_0(ERR, "Session not found.\n");
- return sess_idx;
- }
-
- if (global_data_initialized[sess_idx] == 0) {
- CFA_TCAM_MGR_LOG(ERR, "PANIC: No TCAM data created for sess_idx %d\n",
- sess_idx);
+ tcam_mgr_data = tfs->tcam_mgr_handle;
+ if (!tcam_mgr_data) {
+ CFA_TCAM_MGR_LOG_0(ERR, "No TCAM data created for session.\n");
return -CFA_TCAM_MGR_ERR_CODE(PERM);
}
@@ -1011,12 +1122,91 @@ cfa_tcam_mgr_qcaps(struct cfa_tcam_mgr_context *context __rte_unused,
parms->rx_tcam_supported = 0;
parms->tx_tcam_supported = 0;
for (type = 0; type < CFA_TCAM_MGR_TBL_TYPE_MAX; type++) {
- if (cfa_tcam_mgr_tables[sess_idx][TF_DIR_RX][type].max_entries > 0 &&
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_RX][type].hcapi_type > 0)
- parms->rx_tcam_supported |= 1 << cfa_tcam_mgr_get_phys_table_type(type);
- if (cfa_tcam_mgr_tables[sess_idx][TF_DIR_TX][type].max_entries > 0 &&
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_TX][type].hcapi_type > 0)
- parms->tx_tcam_supported |= 1 << cfa_tcam_mgr_get_phys_table_type(type);
+ if (tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_RX]
+ [type].max_entries > 0 &&
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_RX]
+ [type].hcapi_type > 0)
+ parms->rx_tcam_supported |=
+ 1 << cfa_tcam_mgr_get_phys_table_type(type);
+ if (tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_TX]
+ [type].max_entries > 0 &&
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_TX]
+ [type].hcapi_type > 0)
+ parms->tx_tcam_supported |=
+ 1 << cfa_tcam_mgr_get_phys_table_type(type);
+ }
+
+ return 0;
+}
+
+static
+int cfa_tcam_mgr_validate_tcam_cnt(struct tf *tfp __rte_unused,
+ struct cfa_tcam_mgr_data *tcam_mgr_data,
+ uint16_t tcam_cnt[]
+ [CFA_TCAM_MGR_TBL_TYPE_MAX])
+{
+ struct cfa_tcam_mgr_table_data *table_data;
+ unsigned int dir, type;
+ uint16_t requested_cnt;
+
+ /* Validate session request */
+ for (dir = 0; dir < ARRAY_SIZE(tcam_mgr_data->cfa_tcam_mgr_tables);
+ dir++) {
+ for (type = 0;
+ type < ARRAY_SIZE(tcam_mgr_data->cfa_tcam_mgr_tables[dir]);
+ type++) {
+ table_data =
+ &tcam_mgr_data->cfa_tcam_mgr_tables[dir][type];
+ requested_cnt = tcam_cnt[dir][type];
+ /* Only check if table supported (max_entries > 0). */
+ if (table_data->max_entries > 0 &&
+ requested_cnt > table_data->max_entries) {
+ CFA_TCAM_MGR_TRACE(ERR,
+ "%s: %s Requested %d, available %d\n",
+ tf_dir_2_str(dir),
+ cfa_tcam_mgr_tbl_2_str(type),
+ requested_cnt,
+ table_data->max_entries);
+ return -CFA_TCAM_MGR_ERR_CODE(NOSPC);
+ }
+ }
+ }
+
+ return 0;
+}
+
+static int cfa_tcam_mgr_free_entries(struct tf *tfp)
+{
+ struct cfa_tcam_mgr_free_parms free_parms;
+ struct cfa_tcam_mgr_data *tcam_mgr_data;
+ struct tf_session *tfs;
+ int entry_id = 0;
+ int rc = 0;
+
+ CFA_TCAM_MGR_TRACE(DEBUG, "%s: Unbinding session\n", __func__);
+
+ rc = tf_session_get_session_internal(tfp, &tfs);
+ if (rc)
+ return rc;
+
+ tcam_mgr_data = tfs->tcam_mgr_handle;
+ memset(&free_parms, 0, sizeof(free_parms));
+
+ /*
+ * Since we are freeing all pending TCAM entries (which is typically
+ * done during tcam_unbind), we don't know the type of each entry.
+ * So we set the type to MAX as a hint to cfa_tcam_mgr_free() to
+ * figure out the actual type. We need to set it through each
+ * iteration in the loop below; otherwise, the type determined for
+ * the first entry would be used for subsequent entries that may or
+ * may not be of the same type, resulting in errors.
+ */
+
+ while ((entry_id = ba_find_next_inuse_free(tcam_mgr_data->session_bmp,
+ 0)) >= 0) {
+ free_parms.id = entry_id;
+ free_parms.type = CFA_TCAM_MGR_TBL_TYPE_MAX;
+ cfa_tcam_mgr_free(tfp, &free_parms);
}
return 0;
@@ -1027,7 +1217,7 @@ cfa_tcam_mgr_qcaps(struct cfa_tcam_mgr_context *context __rte_unused,
* and also update the sizes in the tcam count array
*/
static int
-cfa_tcam_mgr_shared_wc_bind(uint32_t sess_idx, bool dual_ha_app,
+cfa_tcam_mgr_shared_wc_bind(struct tf *tfp, bool dual_ha_app,
uint16_t tcam_cnt[][CFA_TCAM_MGR_TBL_TYPE_MAX])
{
uint16_t start_row, end_row, max_entries, slices;
@@ -1036,13 +1226,13 @@ cfa_tcam_mgr_shared_wc_bind(uint32_t sess_idx, bool dual_ha_app,
int rc;
for (dir = 0; dir < TF_DIR_MAX; dir++) {
- rc = cfa_tcam_mgr_tables_get(sess_idx, dir,
+ rc = cfa_tcam_mgr_tables_get(tfp, dir,
CFA_TCAM_MGR_TBL_TYPE_WC_TCAM_APPS,
&start_row, &end_row, &max_entries, &slices);
if (rc)
return rc;
if (max_entries) {
- rc = cfa_tcam_mgr_tables_set(sess_idx, dir,
+ rc = cfa_tcam_mgr_tables_set(tfp, dir,
CFA_TCAM_MGR_TBL_TYPE_WC_TCAM_HIGH_APPS,
start_row,
start_row +
@@ -1050,7 +1240,7 @@ cfa_tcam_mgr_shared_wc_bind(uint32_t sess_idx, bool dual_ha_app,
max_entries / num_pools);
if (rc)
return rc;
- rc = cfa_tcam_mgr_tables_set(sess_idx, dir,
+ rc = cfa_tcam_mgr_tables_set(tfp, dir,
CFA_TCAM_MGR_TBL_TYPE_WC_TCAM_LOW_APPS,
start_row +
((max_entries / slices) / num_pools),
@@ -1059,7 +1249,7 @@ cfa_tcam_mgr_shared_wc_bind(uint32_t sess_idx, bool dual_ha_app,
max_entries / num_pools);
if (rc)
return rc;
- rc = cfa_tcam_mgr_tables_set(sess_idx, dir,
+ rc = cfa_tcam_mgr_tables_set(tfp, dir,
CFA_TCAM_MGR_TBL_TYPE_WC_TCAM_APPS,
0, 0, 0);
if (rc)
@@ -1076,24 +1266,24 @@ cfa_tcam_mgr_shared_wc_bind(uint32_t sess_idx, bool dual_ha_app,
}
int
-cfa_tcam_mgr_bind(struct cfa_tcam_mgr_context *context,
+cfa_tcam_mgr_bind(struct tf *tfp,
struct cfa_tcam_mgr_cfg_parms *parms)
{
- struct cfa_tcam_mgr_table_data *table_data;
+ struct cfa_tcam_mgr_table_data *table_data;
+ enum cfa_tcam_mgr_device_type device_type;
+ struct cfa_tcam_mgr_data *tcam_mgr_data;
struct tf_dev_info *dev;
- unsigned int dir;
- int rc, sess_idx;
- uint32_t session_id;
struct tf_session *tfs;
- unsigned int type;
int prev_max_entries;
+ unsigned int type;
int start, stride;
- enum cfa_tcam_mgr_device_type device_type;
+ unsigned int dir;
+ int rc;
- CFA_TCAM_MGR_CHECK_PARMS2(context, parms);
+ CFA_TCAM_MGR_CHECK_PARMS2(tfp, parms);
/* Retrieve the session information */
- rc = tf_session_get_session_internal(context->tfp, &tfs);
+ rc = tf_session_get_session_internal(tfp, &tfs);
if (rc)
return rc;
@@ -1106,9 +1296,6 @@ cfa_tcam_mgr_bind(struct cfa_tcam_mgr_context *context,
case TF_DEVICE_TYPE_P4:
device_type = CFA_TCAM_MGR_DEVICE_TYPE_P4;
break;
- case TF_DEVICE_TYPE_SR:
- device_type = CFA_TCAM_MGR_DEVICE_TYPE_SR;
- break;
case TF_DEVICE_TYPE_P5:
device_type = CFA_TCAM_MGR_DEVICE_TYPE_P5;
break;
@@ -1117,27 +1304,21 @@ cfa_tcam_mgr_bind(struct cfa_tcam_mgr_context *context,
return -CFA_TCAM_MGR_ERR_CODE(NODEV);
}
- rc = cfa_tcam_mgr_get_session_from_context(context, &session_id);
- if (rc < 0)
- return rc;
-
- sess_idx = cfa_tcam_mgr_session_add(session_id);
- if (sess_idx < 0)
- return sess_idx;
-
- if (global_data_initialized[sess_idx] == 0) {
- rc = cfa_tcam_mgr_init(sess_idx, device_type, NULL);
- if (rc < 0)
+ tcam_mgr_data = tfs->tcam_mgr_handle;
+ if (!tcam_mgr_data) {
+ rc = cfa_tcam_mgr_init(tfp, device_type, NULL);
+ if (rc)
return rc;
+ tcam_mgr_data = tfs->tcam_mgr_handle;
}
- if (parms->num_elements != ARRAY_SIZE(cfa_tcam_mgr_tables[sess_idx][dir])) {
+ if (parms->num_elements !=
+ ARRAY_SIZE(tcam_mgr_data->cfa_tcam_mgr_tables[dir])) {
CFA_TCAM_MGR_LOG(ERR,
"Session element count (%d) differs "
- "from table count (%zu) for sess_idx %d.\n",
+ "from table count (%zu)\n",
parms->num_elements,
- ARRAY_SIZE(cfa_tcam_mgr_tables[sess_idx][dir]),
- sess_idx);
+ ARRAY_SIZE(tcam_mgr_data->cfa_tcam_mgr_tables[dir]));
return -CFA_TCAM_MGR_ERR_CODE(INVAL);
}
@@ -1145,48 +1326,51 @@ cfa_tcam_mgr_bind(struct cfa_tcam_mgr_context *context,
* Only managing one session. resv_res contains the resources allocated
* to this session by the resource manager. Update the limits on TCAMs.
*/
- for (dir = 0; dir < ARRAY_SIZE(cfa_tcam_mgr_tables[sess_idx]); dir++) {
+ for (dir = 0; dir < ARRAY_SIZE(tcam_mgr_data->cfa_tcam_mgr_tables);
+ dir++) {
for (type = 0;
- type < ARRAY_SIZE(cfa_tcam_mgr_tables[sess_idx][dir]);
+ type <
+ ARRAY_SIZE(tcam_mgr_data->cfa_tcam_mgr_tables[dir]);
type++) {
- table_data = &cfa_tcam_mgr_tables[sess_idx][dir][type];
+ table_data =
+ &tcam_mgr_data->cfa_tcam_mgr_tables[dir][type];
prev_max_entries = table_data->max_entries;
/*
* In AFM logical tables, max_entries is initialized to
* zero. These logical tables are not used when TCAM
* Manager is in the core so skip.
*/
- if (prev_max_entries == 0)
+ if (!prev_max_entries)
continue;
start = parms->resv_res[dir][type].start;
stride = parms->resv_res[dir][type].stride;
if (start % table_data->max_slices > 0) {
CFA_TCAM_MGR_LOG_DIR_TYPE(ERR, dir, type,
- "Start of resources (%d) for table(%d) "
- "does not begin on row boundary.\n",
- start, sess_idx);
+ "%s: %s Resource:%d not row bounded\n",
+ tf_dir_2_str(dir),
+ cfa_tcam_mgr_tbl_2_str(type),
+ start);
CFA_TCAM_MGR_LOG_DIR(ERR, dir,
- "Start is %d, number of slices "
- "is %d.\n",
- start,
+ "%s: Start:%d, num slices:%d\n",
+ tf_dir_2_str(dir), start,
table_data->max_slices);
- (void)cfa_tcam_mgr_session_free(session_id, context);
+ cfa_tcam_mgr_free_entries(tfp);
return -CFA_TCAM_MGR_ERR_CODE(INVAL);
}
if (stride % table_data->max_slices > 0) {
CFA_TCAM_MGR_LOG_DIR_TYPE(ERR, dir, type,
- "Stride of resources (%d) for table(%d) "
- "does not end on row boundary.\n",
- stride, sess_idx);
+ "%s: %s Resource:%d not row bound\n",
+ tf_dir_2_str(dir),
+ cfa_tcam_mgr_tbl_2_str(type),
+ stride);
CFA_TCAM_MGR_LOG_DIR(ERR, dir,
- "Stride is %d, number of "
- "slices is %d.\n",
- stride,
+ "%s: Stride:%d num slices:%d\n",
+ tf_dir_2_str(dir), stride,
table_data->max_slices);
- (void)cfa_tcam_mgr_session_free(session_id, context);
+ cfa_tcam_mgr_free_entries(tfp);
return -CFA_TCAM_MGR_ERR_CODE(INVAL);
}
- if (stride == 0) {
+ if (!stride) {
table_data->start_row = 0;
table_data->end_row = 0;
table_data->max_entries = 0;
@@ -1200,25 +1384,34 @@ cfa_tcam_mgr_bind(struct cfa_tcam_mgr_context *context,
(table_data->end_row -
table_data->start_row + 1);
}
- cfa_tcam_mgr_max_entries[sess_idx] += (table_data->max_entries -
- prev_max_entries);
+ tcam_mgr_data->cfa_tcam_mgr_max_entries +=
+ (table_data->max_entries - prev_max_entries);
}
}
+ CFA_TCAM_MGR_LOG(DEBUG, "TCAM table bind for max entries %d.\n",
+ tcam_mgr_data->cfa_tcam_mgr_max_entries);
+
if (tf_session_is_shared_hotup_session(tfs)) {
- rc = cfa_tcam_mgr_shared_wc_bind(sess_idx, false, parms->tcam_cnt);
+ rc = cfa_tcam_mgr_shared_wc_bind(tfp, false,
+ parms->tcam_cnt);
if (rc) {
- (void)cfa_tcam_mgr_session_free(session_id, context);
+ cfa_tcam_mgr_free_entries(tfp);
return rc;
}
}
- rc = cfa_tcam_mgr_session_cfg(session_id, parms->tcam_cnt);
- if (rc < 0) {
- (void)cfa_tcam_mgr_session_free(session_id, context);
+ rc = cfa_tcam_mgr_validate_tcam_cnt(tfp, tcam_mgr_data,
+ parms->tcam_cnt);
+ if (rc) {
+ cfa_tcam_mgr_free_entries(tfp);
return rc;
}
+#ifdef CFA_TCAM_MGR_TRACING
+ cfa_tcam_mgr_tables_dump(tfp, TF_DIR_MAX, CFA_TCAM_MGR_TBL_TYPE_MAX);
+#endif
+
#ifdef TF_FLOW_SCALE_QUERY
/* Initialize the WC TCAM usage state */
tf_tcam_usage_init(tfp);
@@ -1228,48 +1421,106 @@ cfa_tcam_mgr_bind(struct cfa_tcam_mgr_context *context,
}
int
-cfa_tcam_mgr_unbind(struct cfa_tcam_mgr_context *context)
+cfa_tcam_mgr_unbind(struct tf *tfp)
{
- int rc, sess_idx;
- uint32_t session_id;
+ enum cfa_tcam_mgr_device_type device_type;
+ struct cfa_tcam_mgr_data *tcam_mgr_data;
+ struct tf_dev_info *dev;
+ struct tf_session *tfs;
+ int rc;
- CFA_TCAM_MGR_CHECK_PARMS1(context);
+ CFA_TCAM_MGR_CHECK_PARMS1(tfp);
- rc = cfa_tcam_mgr_get_session_from_context(context, &session_id);
- if (rc < 0)
+ rc = tf_session_get_session_internal(tfp, &tfs);
+ if (rc)
+ return rc;
+
+ /* Retrieve the device information */
+ rc = tf_session_get_device(tfs, &dev);
+ if (rc)
return rc;
- sess_idx = cfa_tcam_mgr_session_find(session_id);
- if (sess_idx < 0) {
- CFA_TCAM_MGR_LOG_0(ERR, "Session not found.\n");
- return sess_idx;
+ switch (dev->type) {
+ case TF_DEVICE_TYPE_P4:
+ device_type = CFA_TCAM_MGR_DEVICE_TYPE_P4;
+ break;
+ case TF_DEVICE_TYPE_P5:
+ device_type = CFA_TCAM_MGR_DEVICE_TYPE_P5;
+ break;
+ default:
+ CFA_TCAM_MGR_TRACE(DEBUG,
+ "%s: TF tcam get dev type failed\n",
+ __func__);
+ return -CFA_TCAM_MGR_ERR_CODE(NODEV);
}
- if (global_data_initialized[sess_idx] == 0) {
- CFA_TCAM_MGR_LOG(INFO, "PANIC: No TCAM data created for sess_idx %d\n",
- sess_idx);
+ tcam_mgr_data = tfs->tcam_mgr_handle;
+ if (!tcam_mgr_data) {
+ CFA_TCAM_MGR_TRACE(ERROR,
+ "%s: No TCAM data created for session\n",
+ __func__);
return -CFA_TCAM_MGR_ERR_CODE(PERM);
}
- (void)cfa_tcam_mgr_session_free(session_id, context);
+ cfa_tcam_mgr_free_entries(tfp);
+ cfa_tcam_mgr_uninit(tfp, device_type);
+
+ return 0;
+}
+
+static int cfa_tcam_mgr_alloc_entry(struct tf *tfp __rte_unused,
+ struct cfa_tcam_mgr_data *tcam_mgr_data,
+ enum tf_dir dir __rte_unused)
+{
+ int32_t free_idx;
+
+ /* Scan bitmap to get the free pool */
+ free_idx = ba_alloc(tcam_mgr_data->session_bmp);
+ if (free_idx == BA_FAIL) {
+ CFA_TCAM_MGR_TRACE(ERROR,
+ "%s: Table full (session)\n", __func__);
+ return -CFA_TCAM_MGR_ERR_CODE(NOSPC);
+ }
+
+ return free_idx;
+}
+
+static int cfa_tcam_mgr_free_entry(struct tf *tfp __rte_unused,
+ struct cfa_tcam_mgr_data *tcam_mgr_data,
+ unsigned int entry_id,
+ enum tf_dir dir __rte_unused,
+ enum cfa_tcam_mgr_tbl_type type __rte_unused)
+{
+ int rc = 0;
+
+ if (entry_id >= tcam_mgr_data->session_bmp_size)
+ return -CFA_TCAM_MGR_ERR_CODE(INVAL);
+
+ rc = ba_free(tcam_mgr_data->session_bmp, entry_id);
+ if (rc)
+ return rc;
+
+ CFA_TCAM_MGR_TRACE(INFO,
+ "%s: Remove session from entry %d\n",
+ __func__, entry_id);
- global_data_initialized[sess_idx] = 0;
return 0;
}
int
-cfa_tcam_mgr_alloc(struct cfa_tcam_mgr_context *context,
+cfa_tcam_mgr_alloc(struct tf *tfp,
struct cfa_tcam_mgr_alloc_parms *parms)
{
- struct cfa_tcam_mgr_entry_data entry;
+ struct cfa_tcam_mgr_table_data *table_data;
+ struct cfa_tcam_mgr_data *tcam_mgr_data;
struct cfa_tcam_mgr_table_rows_0 *row;
- struct cfa_tcam_mgr_table_data *table_data;
+ struct cfa_tcam_mgr_entry_data entry;
+ struct tf_session *tfs;
+ int key_slices, rc;
int dir, tbl_type;
- int key_slices, rc, sess_idx;
int new_entry_id;
- uint32_t session_id;
- CFA_TCAM_MGR_CHECK_PARMS2(context, parms);
+ CFA_TCAM_MGR_CHECK_PARMS2(tfp, parms);
dir = parms->dir;
tbl_type = parms->type;
@@ -1289,40 +1540,31 @@ cfa_tcam_mgr_alloc(struct cfa_tcam_mgr_context *context,
#if TF_TCAM_PRIORITY_MAX < UINT16_MAX
if (parms->priority > TF_TCAM_PRIORITY_MAX) {
CFA_TCAM_MGR_LOG_DIR(ERR, dir,
- "Priority (%u) out of range (%u -%u).\n",
- parms->priority,
+ "%s: Priority:%u out of range (%u-%u).\n",
+ tf_dir_2_str(dir), parms->priority,
TF_TCAM_PRIORITY_MIN,
TF_TCAM_PRIORITY_MAX);
}
#endif
- /* Check for session limits */
- rc = cfa_tcam_mgr_get_session_from_context(context, &session_id);
- if (rc < 0)
+ rc = tf_session_get_session_internal(tfp, &tfs);
+ if (rc)
return rc;
- sess_idx = cfa_tcam_mgr_session_find(session_id);
- if (sess_idx < 0) {
- CFA_TCAM_MGR_LOG(ERR, "Session 0x%08x not found.\n",
- session_id);
- return -CFA_TCAM_MGR_ERR_CODE(NODEV);
- }
-
- if (global_data_initialized[sess_idx] == 0) {
- CFA_TCAM_MGR_LOG(ERR, "PANIC: No TCAM data created for sess_idx %d\n",
- sess_idx);
+ tcam_mgr_data = tfs->tcam_mgr_handle;
+ if (!tcam_mgr_data) {
+ CFA_TCAM_MGR_LOG(ERR, "No TCAM data created for session\n");
return -CFA_TCAM_MGR_ERR_CODE(PERM);
}
- table_data = &cfa_tcam_mgr_tables[sess_idx][dir][tbl_type];
+ table_data = &tcam_mgr_data->cfa_tcam_mgr_tables[dir][tbl_type];
- if (parms->key_size == 0 ||
+ if (!parms->key_size ||
parms->key_size > table_data->row_width) {
CFA_TCAM_MGR_LOG_DIR(ERR, dir,
- "Invalid key size:%d (range 1-%d) sess_idx %d.\n",
+ "Invalid key size:%d (range 1-%d).\n",
parms->key_size,
- table_data->row_width,
- sess_idx);
+ table_data->row_width);
return -CFA_TCAM_MGR_ERR_CODE(INVAL);
}
@@ -1330,48 +1572,46 @@ cfa_tcam_mgr_alloc(struct cfa_tcam_mgr_context *context,
if (table_data->used_entries >=
table_data->max_entries) {
CFA_TCAM_MGR_LOG_DIR_TYPE(ERR, dir, tbl_type,
- "Table full sess_idx %d.\n",
- sess_idx);
+ "Table full.\n");
return -CFA_TCAM_MGR_ERR_CODE(NOSPC);
}
/* There is room, now increment counts and allocate an entry. */
- new_entry_id = cfa_tcam_mgr_session_entry_alloc(session_id,
- parms->dir,
- parms->type);
+ new_entry_id = cfa_tcam_mgr_alloc_entry(tfp, tcam_mgr_data, parms->dir);
if (new_entry_id < 0)
return new_entry_id;
memset(&entry, 0, sizeof(entry));
entry.ref_cnt++;
+ CFA_TCAM_MGR_TRACE(INFO, "Allocated entry ID %d.\n", new_entry_id);
+
key_slices = cfa_tcam_mgr_get_num_slices(parms->key_size,
(table_data->row_width /
table_data->max_slices));
- row = cfa_tcam_mgr_empty_row_alloc(sess_idx, context, parms, &entry,
+ row = cfa_tcam_mgr_empty_row_alloc(tcam_mgr_data, tfp, parms, &entry,
new_entry_id, key_slices);
- if (row == NULL) {
+ if (!row) {
CFA_TCAM_MGR_LOG_DIR_TYPE(ERR, parms->dir, parms->type,
- "Table full (HW) sess_idx %d.\n",
- sess_idx);
- (void)cfa_tcam_mgr_session_entry_free(session_id, new_entry_id,
- parms->dir, parms->type);
+ "Table full (HW).\n");
+ cfa_tcam_mgr_free_entry(tfp, tcam_mgr_data, new_entry_id,
+ parms->dir, parms->type);
return -CFA_TCAM_MGR_ERR_CODE(NOSPC);
}
- memcpy(&entry_data[sess_idx][new_entry_id],
+ memcpy(&tcam_mgr_data->entry_data[new_entry_id],
&entry,
- sizeof(entry_data[sess_idx][new_entry_id]));
+ sizeof(tcam_mgr_data->entry_data[new_entry_id]));
table_data->used_entries += 1;
- cfa_tcam_mgr_entry_insert(sess_idx, new_entry_id, &entry);
+ cfa_tcam_mgr_entry_insert(tcam_mgr_data, tfp, new_entry_id, &entry);
parms->id = new_entry_id;
#ifdef TF_FLOW_SCALE_QUERY
/* CFA update usage state */
- if (tf_tcam_usage_update(session_id,
+ if (tf_tcam_usage_update(tfp,
parms->dir,
parms->type,
row,
@@ -1384,46 +1624,38 @@ cfa_tcam_mgr_alloc(struct cfa_tcam_mgr_context *context,
}
int
-cfa_tcam_mgr_free(struct cfa_tcam_mgr_context *context,
+cfa_tcam_mgr_free(struct tf *tfp,
struct cfa_tcam_mgr_free_parms *parms)
{
+ struct cfa_tcam_mgr_table_data *table_data;
+ struct cfa_tcam_mgr_data *tcam_mgr_data;
struct cfa_tcam_mgr_entry_data *entry;
struct cfa_tcam_mgr_table_rows_0 *row;
- struct cfa_tcam_mgr_table_data *table_data;
- int row_size, rc, sess_idx, new_row_to_free;
- uint32_t session_id;
+ int row_size, rc, new_row_to_free;
+ struct tf_session *tfs;
uint16_t id;
- CFA_TCAM_MGR_CHECK_PARMS2(context, parms);
+ CFA_TCAM_MGR_CHECK_PARMS2(tfp, parms);
- rc = cfa_tcam_mgr_get_session_from_context(context, &session_id);
- if (rc < 0)
+ rc = tf_session_get_session_internal(tfp, &tfs);
+ if (rc)
return rc;
- sess_idx = cfa_tcam_mgr_session_find(session_id);
- if (sess_idx < 0) {
- CFA_TCAM_MGR_LOG(ERR, "Session 0x%08x not found.\n",
- session_id);
- return sess_idx;
- }
-
- if (global_data_initialized[sess_idx] == 0) {
- CFA_TCAM_MGR_LOG(INFO, "PANIC: No TCAM data created for sess_idx %d\n",
- sess_idx);
+ tcam_mgr_data = tfs->tcam_mgr_handle;
+ if (!tcam_mgr_data) {
+ CFA_TCAM_MGR_LOG(ERR, "No TCAM data created for session\n");
return -CFA_TCAM_MGR_ERR_CODE(PERM);
}
id = parms->id;
- entry = cfa_tcam_mgr_entry_get(sess_idx, id);
- if (entry == NULL) {
- CFA_TCAM_MGR_LOG(INFO, "Entry %d not found for sess_idx %d.\n",
- id, sess_idx);
+ entry = cfa_tcam_mgr_entry_get(tcam_mgr_data, id);
+ if (!entry) {
+ CFA_TCAM_MGR_LOG(INFO, "Entry %d not found\n", id);
return -CFA_TCAM_MGR_ERR_CODE(INVAL);
}
- if (entry->ref_cnt == 0) {
- CFA_TCAM_MGR_LOG(ERR, "Entry %d not in use for sess_idx %d.\n",
- id, sess_idx);
+ if (!entry->ref_cnt) {
+ CFA_TCAM_MGR_LOG(ERR, "Entry %d not in use.\n", id);
return -CFA_TCAM_MGR_ERR_CODE(INVAL);
}
@@ -1439,30 +1671,38 @@ cfa_tcam_mgr_free(struct cfa_tcam_mgr_context *context,
*/
if (parms->type == CFA_TCAM_MGR_TBL_TYPE_MAX) {
/* Need to search for the entry in the tables */
- rc = cfa_tcam_mgr_entry_find(sess_idx, id, &parms->dir, &parms->type);
- if (rc < 0) {
- CFA_TCAM_MGR_LOG(ERR, "Entry %d not in tables for sess_idx %d.\n",
- id, sess_idx);
+ rc = cfa_tcam_mgr_entry_find(tcam_mgr_data, id, &parms->dir,
+ &parms->type);
+ if (rc) {
+ CFA_TCAM_MGR_LOG(ERR,
+ "Entry %d not in tables\n", id);
return rc;
}
+ CFA_TCAM_MGR_TRACE(INFO, "%s: id: %d dir: 0x%x type: 0x%x\n",
+ __func__, id, parms->dir, parms->type);
}
- table_data = &cfa_tcam_mgr_tables[sess_idx][parms->dir][parms->type];
+ table_data =
+ &tcam_mgr_data->cfa_tcam_mgr_tables[parms->dir][parms->type];
parms->hcapi_type = table_data->hcapi_type;
- row_size = cfa_tcam_mgr_row_size_get(sess_idx, parms->dir, parms->type);
+ row_size = cfa_tcam_mgr_row_size_get(tcam_mgr_data, parms->dir,
+ parms->type);
row = cfa_tcam_mgr_row_ptr_get(table_data->tcam_rows, entry->row,
row_size);
entry->ref_cnt--;
- (void)cfa_tcam_mgr_session_entry_free(session_id, id,
- parms->dir, parms->type);
+ cfa_tcam_mgr_free_entry(tfp, tcam_mgr_data, id, parms->dir,
+ parms->type);
- if (entry->ref_cnt == 0) {
- cfa_tcam_mgr_entry_free_msg(sess_idx, context, parms,
- entry->row,
+ if (!entry->ref_cnt) {
+ CFA_TCAM_MGR_TRACE(INFO,
+ "Freeing entry %d, row %d, slice %d.\n",
+ id, entry->row, entry->slice);
+ cfa_tcam_mgr_entry_free_msg(tcam_mgr_data, tfp,
+ parms, entry->row,
entry->slice * row->entry_size,
table_data->row_width /
table_data->max_slices *
@@ -1473,7 +1713,7 @@ cfa_tcam_mgr_free(struct cfa_tcam_mgr_context *context,
#ifdef TF_FLOW_SCALE_QUERY
/* CFA update usage state */
- if (tf_tcam_usage_update(session_id,
+ if (tf_tcam_usage_update(tfp,
parms->dir,
parms->type,
row,
@@ -1483,71 +1723,72 @@ cfa_tcam_mgr_free(struct cfa_tcam_mgr_context *context,
#endif /* TF_FLOW_SCALE_QUERY */
new_row_to_free = entry->row;
- cfa_tcam_mgr_rows_combine(sess_idx, context, parms, table_data,
- new_row_to_free);
+ cfa_tcam_mgr_rows_combine(tcam_mgr_data, tfp, parms,
+ table_data, new_row_to_free);
if (!ROW_INUSE(row)) {
- cfa_tcam_mgr_rows_compact(sess_idx, context,
+ cfa_tcam_mgr_rows_compact(tcam_mgr_data, tfp,
parms, table_data,
&new_row_to_free,
new_row_to_free);
if (new_row_to_free >= 0)
- cfa_tcam_mgr_entry_free_msg(sess_idx, context, parms,
+ cfa_tcam_mgr_entry_free_msg(tcam_mgr_data,
+ tfp, parms,
new_row_to_free, 0,
table_data->row_width,
table_data->result_size,
table_data->max_slices);
}
- cfa_tcam_mgr_entry_delete(sess_idx, id);
+ cfa_tcam_mgr_entry_delete(tcam_mgr_data, tfp, id);
table_data->used_entries -= 1;
+ CFA_TCAM_MGR_TRACE(INFO, "Freed entry %d.\n", id);
+ } else {
+ CFA_TCAM_MGR_TRACE(INFO, "Entry %d ref cnt = %d.\n",
+ id,
+ entry->ref_cnt);
}
return 0;
}
int
-cfa_tcam_mgr_set(struct cfa_tcam_mgr_context *context,
+cfa_tcam_mgr_set(struct tf *tfp,
struct cfa_tcam_mgr_set_parms *parms)
{
+ struct cfa_tcam_mgr_table_data *table_data;
+ struct cfa_tcam_mgr_data *tcam_mgr_data;
struct cfa_tcam_mgr_entry_data *entry;
struct cfa_tcam_mgr_table_rows_0 *row;
- struct cfa_tcam_mgr_table_data *table_data;
- int rc;
- int row_size, sess_idx;
int entry_size_in_bytes;
- uint32_t session_id;
+ struct tf_session *tfs;
+ int row_size;
+ int rc;
- CFA_TCAM_MGR_CHECK_PARMS2(context, parms);
+ CFA_TCAM_MGR_CHECK_PARMS2(tfp, parms);
- rc = cfa_tcam_mgr_get_session_from_context(context, &session_id);
- if (rc < 0)
+ rc = tf_session_get_session_internal(tfp, &tfs);
+ if (rc)
return rc;
- sess_idx = cfa_tcam_mgr_session_find(session_id);
- if (sess_idx < 0) {
- CFA_TCAM_MGR_LOG(ERR, "Session 0x%08x not found.\n",
- session_id);
- return sess_idx;
- }
-
- if (global_data_initialized[sess_idx] == 0) {
- CFA_TCAM_MGR_LOG(ERR, "PANIC: No TCAM data created for sess_idx %d\n",
- sess_idx);
+ tcam_mgr_data = tfs->tcam_mgr_handle;
+ if (!tcam_mgr_data) {
+ CFA_TCAM_MGR_LOG(ERR, "No TCAM data created for session\n");
return -CFA_TCAM_MGR_ERR_CODE(PERM);
}
- entry = cfa_tcam_mgr_entry_get(sess_idx, parms->id);
- if (entry == NULL) {
- CFA_TCAM_MGR_LOG(ERR, "Entry %d not found for sess_idx %d.\n",
- parms->id, sess_idx);
+ entry = cfa_tcam_mgr_entry_get(tcam_mgr_data, parms->id);
+ if (!entry) {
+ CFA_TCAM_MGR_LOG(ERR, "Entry %d not found.\n", parms->id);
return -CFA_TCAM_MGR_ERR_CODE(INVAL);
}
- table_data = &cfa_tcam_mgr_tables[sess_idx][parms->dir][parms->type];
+ table_data =
+ &tcam_mgr_data->cfa_tcam_mgr_tables[parms->dir][parms->type];
parms->hcapi_type = table_data->hcapi_type;
- row_size = cfa_tcam_mgr_row_size_get(sess_idx, parms->dir, parms->type);
+ row_size = cfa_tcam_mgr_row_size_get(tcam_mgr_data, parms->dir,
+ parms->type);
row = cfa_tcam_mgr_row_ptr_get(table_data->tcam_rows, entry->row,
row_size);
@@ -1558,71 +1799,68 @@ cfa_tcam_mgr_set(struct cfa_tcam_mgr_context *context,
CFA_TCAM_MGR_LOG(ERR,
"Key size(%d) is different from entry "
"size(%d).\n",
- parms->key_size,
- entry_size_in_bytes);
+ parms->key_size, entry_size_in_bytes);
return -CFA_TCAM_MGR_ERR_CODE(INVAL);
}
- rc = cfa_tcam_mgr_entry_set_msg(sess_idx, context, parms,
+ rc = cfa_tcam_mgr_entry_set_msg(tcam_mgr_data, tfp, parms,
entry->row,
entry->slice * row->entry_size,
table_data->max_slices);
- if (rc < 0) {
+ if (rc) {
CFA_TCAM_MGR_LOG_0(ERR, "Failed to set TCAM data.\n");
return rc;
}
+ CFA_TCAM_MGR_TRACE(INFO, "Set data for entry %d\n", parms->id);
+
return 0;
}
int
-cfa_tcam_mgr_get(struct cfa_tcam_mgr_context *context __rte_unused,
+cfa_tcam_mgr_get(struct tf *tfp __rte_unused,
struct cfa_tcam_mgr_get_parms *parms)
{
+ struct cfa_tcam_mgr_table_data *table_data;
+ struct cfa_tcam_mgr_data *tcam_mgr_data;
struct cfa_tcam_mgr_entry_data *entry;
struct cfa_tcam_mgr_table_rows_0 *row;
- struct cfa_tcam_mgr_table_data *table_data;
+ struct tf_session *tfs;
+ int row_size;
int rc;
- int row_size, sess_idx;
- uint32_t session_id;
- CFA_TCAM_MGR_CHECK_PARMS2(context, parms);
+ CFA_TCAM_MGR_CHECK_PARMS2(tfp, parms);
- rc = cfa_tcam_mgr_get_session_from_context(context, &session_id);
- if (rc < 0)
+ rc = tf_session_get_session_internal(tfp, &tfs);
+ if (rc)
return rc;
- sess_idx = cfa_tcam_mgr_session_find(session_id);
- if (sess_idx < 0) {
- CFA_TCAM_MGR_LOG(ERR, "Session 0x%08x not found.\n",
- session_id);
- return sess_idx;
- }
-
- if (global_data_initialized[sess_idx] == 0) {
- CFA_TCAM_MGR_LOG(ERR, "PANIC: No TCAM data created for sess_idx %d\n",
- sess_idx);
+ tcam_mgr_data = tfs->tcam_mgr_handle;
+ if (!tcam_mgr_data) {
+ CFA_TCAM_MGR_LOG(ERR, "No TCAM data created for session\n");
return -CFA_TCAM_MGR_ERR_CODE(PERM);
}
- entry = cfa_tcam_mgr_entry_get(sess_idx, parms->id);
- if (entry == NULL) {
+ entry = cfa_tcam_mgr_entry_get(tcam_mgr_data, parms->id);
+ if (!entry) {
CFA_TCAM_MGR_LOG(ERR, "Entry %d not found.\n", parms->id);
return -CFA_TCAM_MGR_ERR_CODE(INVAL);
}
- table_data = &cfa_tcam_mgr_tables[sess_idx][parms->dir][parms->type];
+ table_data =
+ &tcam_mgr_data->cfa_tcam_mgr_tables[parms->dir][parms->type];
parms->hcapi_type = table_data->hcapi_type;
- row_size = cfa_tcam_mgr_row_size_get(sess_idx, parms->dir, parms->type);
+ row_size = cfa_tcam_mgr_row_size_get(tcam_mgr_data, parms->dir,
+ parms->type);
row = cfa_tcam_mgr_row_ptr_get(table_data->tcam_rows, entry->row,
row_size);
- rc = cfa_tcam_mgr_entry_get_msg(sess_idx, context, parms,
+ rc = cfa_tcam_mgr_entry_get_msg(tcam_mgr_data, tfp, parms,
entry->row,
entry->slice * row->entry_size,
table_data->max_slices);
- if (rc < 0) {
+ if (rc) {
CFA_TCAM_MGR_LOG_0(ERR, "Failed to read from TCAM.\n");
return rc;
}
@@ -1630,49 +1868,44 @@ cfa_tcam_mgr_get(struct cfa_tcam_mgr_context *context __rte_unused,
return 0;
}
-int cfa_tcam_mgr_shared_clear(struct cfa_tcam_mgr_context *context,
- struct cfa_tcam_mgr_shared_clear_parms *parms)
+int cfa_tcam_mgr_shared_clear(struct tf *tfp,
+ struct cfa_tcam_mgr_shared_clear_parms *parms)
{
- int rc;
- uint16_t row, slice = 0;
- int sess_idx;
- uint32_t session_id;
- struct cfa_tcam_mgr_free_parms fparms;
- struct cfa_tcam_mgr_table_data *table_data;
uint16_t start_row, end_row, max_entries, max_slices;
+ struct cfa_tcam_mgr_table_data *table_data;
+ struct cfa_tcam_mgr_data *tcam_mgr_data;
+ struct cfa_tcam_mgr_free_parms fparms;
+ uint16_t row, slice = 0;
+ struct tf_session *tfs;
+ int rc;
- CFA_TCAM_MGR_CHECK_PARMS2(context, parms);
+ CFA_TCAM_MGR_CHECK_PARMS2(tfp, parms);
- rc = cfa_tcam_mgr_get_session_from_context(context, &session_id);
- if (rc < 0)
+ rc = tf_session_get_session_internal(tfp, &tfs);
+ if (rc)
return rc;
- sess_idx = cfa_tcam_mgr_session_find(session_id);
- if (sess_idx < 0) {
- CFA_TCAM_MGR_LOG(ERR, "Session 0x%08x not found.\n",
- session_id);
- return sess_idx;
- }
-
- if (global_data_initialized[sess_idx] == 0) {
- CFA_TCAM_MGR_LOG(ERR, "PANIC: No TCAM data created for sess_idx %d\n",
- sess_idx);
+ tcam_mgr_data = tfs->tcam_mgr_handle;
+ if (!tcam_mgr_data) {
+ CFA_TCAM_MGR_LOG(ERR, "No TCAM data created for session\n");
return -CFA_TCAM_MGR_ERR_CODE(PERM);
}
- table_data = &cfa_tcam_mgr_tables[sess_idx][parms->dir][parms->type];
+ table_data =
+ &tcam_mgr_data->cfa_tcam_mgr_tables[parms->dir][parms->type];
fparms.dir = parms->dir;
fparms.type = parms->type;
fparms.hcapi_type = table_data->hcapi_type;
fparms.id = 0;
- rc = cfa_tcam_mgr_tables_get(sess_idx, parms->dir, parms->type,
- &start_row, &end_row, &max_entries, &max_slices);
+ rc = cfa_tcam_mgr_tables_get(tfp, parms->dir, parms->type,
+ &start_row, &end_row, &max_entries,
+ &max_slices);
if (rc)
return rc;
for (row = start_row; row <= end_row; row++) {
- cfa_tcam_mgr_entry_free_msg(sess_idx, context, &fparms,
+ cfa_tcam_mgr_entry_free_msg(tcam_mgr_data, tfp, &fparms,
row,
slice,
table_data->row_width,
@@ -1683,16 +1916,11 @@ int cfa_tcam_mgr_shared_clear(struct cfa_tcam_mgr_context *context,
}
static void
-cfa_tcam_mgr_mv_used_entries_cnt(int sess_idx, enum tf_dir dir,
- struct cfa_tcam_mgr_table_data *dst_table_data,
+cfa_tcam_mgr_mv_used_entries_cnt(struct cfa_tcam_mgr_table_data *dst_table_data,
struct cfa_tcam_mgr_table_data *src_table_data)
{
dst_table_data->used_entries++;
src_table_data->used_entries--;
-
- cfa_tcam_mgr_mv_session_used_entries_cnt(sess_idx, dir,
- CFA_TCAM_MGR_TBL_TYPE_WC_TCAM_LOW_APPS,
- CFA_TCAM_MGR_TBL_TYPE_WC_TCAM_HIGH_APPS);
}
/*
@@ -1700,33 +1928,34 @@ cfa_tcam_mgr_mv_used_entries_cnt(int sess_idx, enum tf_dir dir,
* This happens when secondary is becoming primary
*/
static int
-cfa_tcam_mgr_shared_entry_move(int sess_idx, struct cfa_tcam_mgr_context *context,
- enum tf_dir dir, enum cfa_tcam_mgr_tbl_type type,
- int entry_id,
- struct cfa_tcam_mgr_table_data *dst_table_data,
- struct cfa_tcam_mgr_table_data *table_data,
- int dst_row_index, int dst_row_slice,
- struct cfa_tcam_mgr_table_rows_0 *dst_row,
- int src_row_index,
- struct cfa_tcam_mgr_table_rows_0 *src_row)
+cfa_tcam_mgr_shared_entry_move(struct cfa_tcam_mgr_data *tcam_mgr_data,
+ struct tf *tfp,
+ enum tf_dir dir, enum cfa_tcam_mgr_tbl_type type,
+ int entry_id,
+ struct cfa_tcam_mgr_table_data *dst_table_data,
+ struct cfa_tcam_mgr_table_data *table_data,
+ int dst_row_index, int dst_row_slice,
+ struct cfa_tcam_mgr_table_rows_0 *dst_row,
+ int src_row_index,
+ struct cfa_tcam_mgr_table_rows_0 *src_row)
{
+ struct cfa_tcam_mgr_free_parms fparms = { 0 };
struct cfa_tcam_mgr_get_parms gparms = { 0 };
struct cfa_tcam_mgr_set_parms sparms = { 0 };
- struct cfa_tcam_mgr_free_parms fparms = { 0 };
- struct cfa_tcam_mgr_entry_data *entry;
- uint8_t key[CFA_TCAM_MGR_MAX_KEY_SIZE];
- uint8_t mask[CFA_TCAM_MGR_MAX_KEY_SIZE];
uint8_t result[CFA_TCAM_MGR_MAX_KEY_SIZE];
+ uint8_t mask[CFA_TCAM_MGR_MAX_KEY_SIZE];
+ uint8_t key[CFA_TCAM_MGR_MAX_KEY_SIZE];
+ struct cfa_tcam_mgr_entry_data *entry;
+ int rc;
+
/*
* Copy entry size before moving else if
* slice number is non zero and entry size is zero it will cause issues
*/
dst_row->entry_size = src_row->entry_size;
- int rc;
-
- entry = cfa_tcam_mgr_entry_get(sess_idx, entry_id);
- if (entry == NULL)
+ entry = cfa_tcam_mgr_entry_get(tcam_mgr_data, entry_id);
+ if (!entry)
return -1;
gparms.dir = dir;
@@ -1739,11 +1968,11 @@ cfa_tcam_mgr_shared_entry_move(int sess_idx, struct cfa_tcam_mgr_context *contex
gparms.key_size = sizeof(key);
gparms.result_size = sizeof(result);
- rc = cfa_tcam_mgr_entry_get_msg(sess_idx, context, &gparms,
+ rc = cfa_tcam_mgr_entry_get_msg(tcam_mgr_data, tfp, &gparms,
src_row_index,
entry->slice * src_row->entry_size,
table_data->max_slices);
- if (rc != 0)
+ if (rc)
return rc;
sparms.dir = dir;
@@ -1756,17 +1985,17 @@ cfa_tcam_mgr_shared_entry_move(int sess_idx, struct cfa_tcam_mgr_context *contex
sparms.key_size = gparms.key_size;
sparms.result_size = gparms.result_size;
- rc = cfa_tcam_mgr_entry_set_msg(sess_idx, context, &sparms,
+ rc = cfa_tcam_mgr_entry_set_msg(tcam_mgr_data, tfp, &sparms,
dst_row_index,
dst_row_slice * dst_row->entry_size,
table_data->max_slices);
- if (rc != 0)
+ if (rc)
return rc;
fparms.dir = dir;
fparms.type = type;
fparms.hcapi_type = table_data->hcapi_type;
- rc = cfa_tcam_mgr_entry_free_msg(sess_idx, context, &fparms,
+ rc = cfa_tcam_mgr_entry_free_msg(tcam_mgr_data, tfp, &fparms,
src_row_index,
entry->slice *
dst_row->entry_size,
@@ -1775,17 +2004,15 @@ cfa_tcam_mgr_shared_entry_move(int sess_idx, struct cfa_tcam_mgr_context *contex
src_row->entry_size,
table_data->result_size,
table_data->max_slices);
- if (rc != 0) {
+ if (rc)
CFA_TCAM_MGR_LOG_DIR_TYPE(ERR,
dir, type,
"Failed to free entry ID %d at"
- " row %d, slice %d for sess_idx %d. rc: %d.\n",
+ " row %d, slice %d. rc: %d.\n",
gparms.id,
src_row_index,
entry->slice,
- sess_idx,
-rc);
- }
#ifdef CFA_TCAM_MGR_TRACING
CFA_TCAM_MGR_TRACE(INFO, "Moved entry %d from row %d, slice %d to "
@@ -1801,54 +2028,50 @@ cfa_tcam_mgr_shared_entry_move(int sess_idx, struct cfa_tcam_mgr_context *contex
entry->row = dst_row_index;
entry->slice = dst_row_slice;
- cfa_tcam_mgr_mv_used_entries_cnt(sess_idx, dir, dst_table_data, table_data);
+ cfa_tcam_mgr_mv_used_entries_cnt(dst_table_data, table_data);
#ifdef CFA_TCAM_MGR_TRACING
- cfa_tcam_mgr_rows_dump(sess_idx, dir, type);
- cfa_tcam_mgr_rows_dump(sess_idx, dir, CFA_TCAM_MGR_TBL_TYPE_WC_TCAM_LOW_APPS);
+ cfa_tcam_mgr_rows_dump(tfp, dir, type);
+ cfa_tcam_mgr_rows_dump(tfp, dir,
+ CFA_TCAM_MGR_TBL_TYPE_WC_TCAM_LOW_APPS);
#endif
return 0;
}
-int cfa_tcam_mgr_shared_move(struct cfa_tcam_mgr_context *context,
- struct cfa_tcam_mgr_shared_move_parms *parms)
+int cfa_tcam_mgr_shared_move(struct tf *tfp,
+ struct cfa_tcam_mgr_shared_move_parms *parms)
{
- int rc;
- int sess_idx;
- uint32_t session_id;
- uint16_t src_row, dst_row, row_size, slice;
struct cfa_tcam_mgr_table_rows_0 *src_table_row;
struct cfa_tcam_mgr_table_rows_0 *dst_table_row;
struct cfa_tcam_mgr_table_data *src_table_data;
struct cfa_tcam_mgr_table_data *dst_table_data;
+ uint16_t src_row, dst_row, row_size, slice;
+ struct cfa_tcam_mgr_data *tcam_mgr_data;
+ struct tf_session *tfs;
+ int rc;
- CFA_TCAM_MGR_CHECK_PARMS2(context, parms);
+ CFA_TCAM_MGR_CHECK_PARMS2(tfp, parms);
- rc = cfa_tcam_mgr_get_session_from_context(context, &session_id);
+ rc = tf_session_get_session_internal(tfp, &tfs);
if (rc < 0)
return rc;
- sess_idx = cfa_tcam_mgr_session_find(session_id);
- if (sess_idx < 0) {
- CFA_TCAM_MGR_LOG(ERR, "Session 0x%08x not found.\n",
- session_id);
- return sess_idx;
- }
-
- if (global_data_initialized[sess_idx] == 0) {
- CFA_TCAM_MGR_LOG(ERR, "PANIC: No TCAM data created for sess_idx %d\n",
- sess_idx);
+ tcam_mgr_data = tfs->tcam_mgr_handle;
+ if (!tcam_mgr_data) {
+ CFA_TCAM_MGR_LOG(ERR, "No TCAM data created for session\n");
return -CFA_TCAM_MGR_ERR_CODE(PERM);
}
src_table_data =
- &cfa_tcam_mgr_tables[sess_idx][parms->dir][CFA_TCAM_MGR_TBL_TYPE_WC_TCAM_HIGH_APPS];
+ &tcam_mgr_data->cfa_tcam_mgr_tables[parms->dir]
+ [CFA_TCAM_MGR_TBL_TYPE_WC_TCAM_HIGH_APPS];
dst_table_data =
- &cfa_tcam_mgr_tables[sess_idx][parms->dir][CFA_TCAM_MGR_TBL_TYPE_WC_TCAM_LOW_APPS];
+ &tcam_mgr_data->cfa_tcam_mgr_tables[parms->dir]
+ [CFA_TCAM_MGR_TBL_TYPE_WC_TCAM_LOW_APPS];
row_size =
- cfa_tcam_mgr_row_size_get(sess_idx,
+ cfa_tcam_mgr_row_size_get(tcam_mgr_data,
parms->dir,
CFA_TCAM_MGR_TBL_TYPE_WC_TCAM_HIGH_APPS);
@@ -1868,13 +2091,13 @@ int cfa_tcam_mgr_shared_move(struct cfa_tcam_mgr_context *context,
#ifdef CFA_TCAM_MGR_TRACING
CFA_TCAM_MGR_TRACE(INFO, "Move entry id %d "
"from src_row %d, slice %d "
- "to dst_row %d, slice %d.\n",
+ "to dst_row %d, slice %d\n",
src_table_row->entries[slice],
src_row, slice,
dst_row, slice);
#endif
- rc = cfa_tcam_mgr_shared_entry_move(sess_idx,
- context,
+ rc = cfa_tcam_mgr_shared_entry_move(tcam_mgr_data,
+ tfp,
parms->dir,
CFA_TCAM_MGR_TBL_TYPE_WC_TCAM_HIGH_APPS,
src_table_row->entries[slice],
@@ -1893,15 +2116,15 @@ int cfa_tcam_mgr_shared_move(struct cfa_tcam_mgr_context *context,
}
static void
-cfa_tcam_mgr_tbl_get(int sess_idx, enum tf_dir dir,
- enum cfa_tcam_mgr_tbl_type type,
- uint16_t *start_row,
- uint16_t *end_row,
- uint16_t *max_entries,
- uint16_t *slices)
+cfa_tcam_mgr_tbl_get(struct cfa_tcam_mgr_data *tcam_mgr_data, enum tf_dir dir,
+ enum cfa_tcam_mgr_tbl_type type,
+ uint16_t *start_row,
+ uint16_t *end_row,
+ uint16_t *max_entries,
+ uint16_t *slices)
{
struct cfa_tcam_mgr_table_data *table_data =
- &cfa_tcam_mgr_tables[sess_idx][dir][type];
+ &tcam_mgr_data->cfa_tcam_mgr_tables[dir][type];
/* Get start, end and max for tcam type*/
*start_row = table_data->start_row;
@@ -1911,51 +2134,59 @@ cfa_tcam_mgr_tbl_get(int sess_idx, enum tf_dir dir,
}
int
-cfa_tcam_mgr_tables_get(int sess_idx, enum tf_dir dir,
+cfa_tcam_mgr_tables_get(struct tf *tfp, enum tf_dir dir,
enum cfa_tcam_mgr_tbl_type type,
uint16_t *start_row,
uint16_t *end_row,
uint16_t *max_entries,
uint16_t *slices)
{
+ struct cfa_tcam_mgr_data *tcam_mgr_data;
+ struct tf_session *tfs;
+ int rc;
+
CFA_TCAM_MGR_CHECK_PARMS3(start_row, end_row, max_entries);
- if (global_data_initialized[sess_idx] == 0) {
- CFA_TCAM_MGR_LOG(ERR, "PANIC: TCAM not initialized for sess_idx %d.\n",
- sess_idx);
- return -CFA_TCAM_MGR_ERR_CODE(INVAL);
+ rc = tf_session_get_session_internal(tfp, &tfs);
+ if (rc)
+ return rc;
+
+ tcam_mgr_data = tfs->tcam_mgr_handle;
+ if (!tcam_mgr_data) {
+ CFA_TCAM_MGR_LOG_0(ERR, "No TCAM data created for session.\n");
+ return -CFA_TCAM_MGR_ERR_CODE(PERM);
}
if (dir >= TF_DIR_MAX) {
- CFA_TCAM_MGR_LOG(ERR, "Must specify valid dir (0-%d) forsess_idx %d.\n",
- TF_DIR_MAX - 1, sess_idx);
+ CFA_TCAM_MGR_LOG(ERR, "Must specify valid dir (0-%d).\n",
+ TF_DIR_MAX - 1);
return -CFA_TCAM_MGR_ERR_CODE(INVAL);
}
if (type >= CFA_TCAM_MGR_TBL_TYPE_MAX) {
- CFA_TCAM_MGR_LOG(ERR, "Must specify valid tbl type (0-%d) forsess_idx %d.\n",
- CFA_TCAM_MGR_TBL_TYPE_MAX - 1, sess_idx);
+ CFA_TCAM_MGR_LOG(ERR, "Must specify valid tbl type (0-%d).\n",
+ CFA_TCAM_MGR_TBL_TYPE_MAX - 1);
return -CFA_TCAM_MGR_ERR_CODE(INVAL);
}
- cfa_tcam_mgr_tbl_get(sess_idx, dir,
- type,
- start_row,
- end_row,
- max_entries,
- slices);
+ cfa_tcam_mgr_tbl_get(tcam_mgr_data, dir,
+ type,
+ start_row,
+ end_row,
+ max_entries,
+ slices);
return 0;
}
static void
-cfa_tcam_mgr_tbl_set(int sess_idx, enum tf_dir dir,
- enum cfa_tcam_mgr_tbl_type type,
- uint16_t start_row,
- uint16_t end_row,
- uint16_t max_entries)
+cfa_tcam_mgr_tbl_set(struct cfa_tcam_mgr_data *tcam_mgr_data, enum tf_dir dir,
+ enum cfa_tcam_mgr_tbl_type type,
+ uint16_t start_row,
+ uint16_t end_row,
+ uint16_t max_entries)
{
struct cfa_tcam_mgr_table_data *table_data =
- &cfa_tcam_mgr_tables[sess_idx][dir][type];
+ &tcam_mgr_data->cfa_tcam_mgr_tables[dir][type];
/* Update start, end and max for tcam type*/
table_data->start_row = start_row;
@@ -1964,52 +2195,58 @@ cfa_tcam_mgr_tbl_set(int sess_idx, enum tf_dir dir,
}
int
-cfa_tcam_mgr_tables_set(int sess_idx, enum tf_dir dir,
+cfa_tcam_mgr_tables_set(struct tf *tfp, enum tf_dir dir,
enum cfa_tcam_mgr_tbl_type type,
uint16_t start_row,
uint16_t end_row,
uint16_t max_entries)
{
- if (global_data_initialized[sess_idx] == 0) {
- CFA_TCAM_MGR_LOG(ERR, "PANIC: TCAM not initialized for sess_idx %d.\n",
- sess_idx);
- return -CFA_TCAM_MGR_ERR_CODE(INVAL);
+ struct cfa_tcam_mgr_data *tcam_mgr_data;
+ struct tf_session *tfs;
+ int rc;
+
+ rc = tf_session_get_session_internal(tfp, &tfs);
+ if (rc)
+ return rc;
+
+ tcam_mgr_data = tfs->tcam_mgr_handle;
+ if (!tcam_mgr_data) {
+ CFA_TCAM_MGR_LOG_0(ERR, "No TCAM data created for session.\n");
+ return -CFA_TCAM_MGR_ERR_CODE(PERM);
}
if (dir >= TF_DIR_MAX) {
- CFA_TCAM_MGR_LOG(ERR, "Must specify valid dir (0-%d) forsess_idx %d.\n",
- TF_DIR_MAX - 1, sess_idx);
+ CFA_TCAM_MGR_LOG(ERR, "Must specify valid dir (0-%d).\n",
+ TF_DIR_MAX - 1);
return -CFA_TCAM_MGR_ERR_CODE(INVAL);
}
if (type >= CFA_TCAM_MGR_TBL_TYPE_MAX) {
- CFA_TCAM_MGR_LOG(ERR, "Must specify valid tbl type (0-%d) forsess_idx %d.\n",
- CFA_TCAM_MGR_TBL_TYPE_MAX - 1, sess_idx);
+ CFA_TCAM_MGR_LOG(ERR, "Must specify valid tbl type (0-%d).\n",
+ CFA_TCAM_MGR_TBL_TYPE_MAX - 1);
return -CFA_TCAM_MGR_ERR_CODE(INVAL);
}
- cfa_tcam_mgr_tbl_set(sess_idx, dir,
- type,
- start_row,
- end_row,
- max_entries);
+ cfa_tcam_mgr_tbl_set(tcam_mgr_data, dir,
+ type,
+ start_row,
+ end_row,
+ max_entries);
return 0;
}
void
-cfa_tcam_mgr_rows_dump(int sess_idx, enum tf_dir dir,
+cfa_tcam_mgr_rows_dump(struct tf *tfp, enum tf_dir dir,
enum cfa_tcam_mgr_tbl_type type)
{
- struct cfa_tcam_mgr_table_data *table_data;
struct cfa_tcam_mgr_table_rows_0 *table_row;
- int i, row, row_size;
+ struct cfa_tcam_mgr_table_data *table_data;
+ struct cfa_tcam_mgr_data *tcam_mgr_data;
+ struct tf_session *tfs;
bool row_found = false;
bool empty_row = false;
-
- if (global_data_initialized[sess_idx] == 0) {
- printf("PANIC: TCAM not initialized for sess_idx %d.\n", sess_idx);
- return;
- }
+ int i, row, row_size;
+ int rc;
if (dir >= TF_DIR_MAX) {
printf("Must specify a valid direction (0-%d).\n",
@@ -2022,14 +2259,24 @@ cfa_tcam_mgr_rows_dump(int sess_idx, enum tf_dir dir,
return;
}
- table_data = &cfa_tcam_mgr_tables[sess_idx][dir][type];
- row_size = cfa_tcam_mgr_row_size_get(sess_idx, dir, type);
+ rc = tf_session_get_session_internal(tfp, &tfs);
+ if (rc)
+ return;
+
+ tcam_mgr_data = tfs->tcam_mgr_handle;
+ if (!tcam_mgr_data) {
+ printf("No TCAM data created for session\n");
+ return;
+ }
+
+ table_data = &tcam_mgr_data->cfa_tcam_mgr_tables[dir][type];
+ row_size = cfa_tcam_mgr_row_size_get(tcam_mgr_data, dir, type);
printf("\nTCAM Rows:\n");
printf("Rows for direction %s, Logical table type %s\n",
tf_dir_2_str(dir), cfa_tcam_mgr_tbl_2_str(type));
- printf("Managed rows %d-%d for sess_idx %d:\n",
- table_data->start_row, table_data->end_row, sess_idx);
+ printf("Managed rows %d-%d:\n",
+ table_data->start_row, table_data->end_row);
printf("Index Pri Size Entry IDs\n");
printf(" Sl 0");
@@ -2066,11 +2313,12 @@ cfa_tcam_mgr_rows_dump(int sess_idx, enum tf_dir dir,
}
static void
-cfa_tcam_mgr_table_dump(int sess_idx, enum tf_dir dir,
+cfa_tcam_mgr_table_dump(struct cfa_tcam_mgr_data *tcam_mgr_data,
+ struct tf *tfp __rte_unused, enum tf_dir dir,
enum cfa_tcam_mgr_tbl_type type)
{
struct cfa_tcam_mgr_table_data *table_data =
- &cfa_tcam_mgr_tables[sess_idx][dir][type];
+ &tcam_mgr_data->cfa_tcam_mgr_tables[dir][type];
printf("%3s %-22s %5u %5u %5u %5u %6u %7u %2u\n",
tf_dir_2_str(dir),
@@ -2089,16 +2337,26 @@ cfa_tcam_mgr_table_dump(int sess_idx, enum tf_dir dir,
"MaxEnt UsedEnt Slices\n"
void
-cfa_tcam_mgr_tables_dump(int sess_idx, enum tf_dir dir,
+cfa_tcam_mgr_tables_dump(struct tf *tfp, enum tf_dir dir,
enum cfa_tcam_mgr_tbl_type type)
{
- if (global_data_initialized[sess_idx] == 0) {
- printf("PANIC: TCAM not initialized for sess_idx %d.\n", sess_idx);
+ struct cfa_tcam_mgr_data *tcam_mgr_data;
+ struct tf_session *tfs;
+ int rc;
+
+ printf("\nTCAM Table(s):\n");
+ printf(TABLE_DUMP_HEADER);
+
+ rc = tf_session_get_session_internal(tfp, &tfs);
+ if (rc)
+ return;
+
+ tcam_mgr_data = tfs->tcam_mgr_handle;
+ if (!tcam_mgr_data) {
+ printf("No TCAM data created for session\n");
return;
}
- printf("\nTCAM Table(s) for sess_idx %d:\n", sess_idx);
- printf(TABLE_DUMP_HEADER);
if (dir >= TF_DIR_MAX) {
/* Iterate over all directions */
for (dir = 0; dir < TF_DIR_MAX; dir++) {
@@ -2107,44 +2365,53 @@ cfa_tcam_mgr_tables_dump(int sess_idx, enum tf_dir dir,
for (type = 0;
type < CFA_TCAM_MGR_TBL_TYPE_MAX;
type++) {
- cfa_tcam_mgr_table_dump(sess_idx, dir, type);
+ cfa_tcam_mgr_table_dump(tcam_mgr_data,
+ tfp, dir, type);
}
} else {
/* Display a specific type */
- cfa_tcam_mgr_table_dump(sess_idx, dir, type);
+ cfa_tcam_mgr_table_dump(tcam_mgr_data, tfp,
+ dir, type);
}
}
} else if (type >= CFA_TCAM_MGR_TBL_TYPE_MAX) {
/* Iterate over all types for a direction */
for (type = 0; type < CFA_TCAM_MGR_TBL_TYPE_MAX; type++)
- cfa_tcam_mgr_table_dump(sess_idx, dir, type);
+ cfa_tcam_mgr_table_dump(tcam_mgr_data, tfp, dir, type);
} else {
/* Display a specific direction and type */
- cfa_tcam_mgr_table_dump(sess_idx, dir, type);
+ cfa_tcam_mgr_table_dump(tcam_mgr_data, tfp, dir, type);
}
}
#define ENTRY_DUMP_HEADER "Entry RefCnt Row Slice\n"
void
-cfa_tcam_mgr_entries_dump(int sess_idx)
+cfa_tcam_mgr_entries_dump(struct tf *tfp)
{
+ struct cfa_tcam_mgr_data *tcam_mgr_data;
struct cfa_tcam_mgr_entry_data *entry;
bool entry_found = false;
+ struct tf_session *tfs;
uint16_t id;
+ int rc;
+
+ rc = tf_session_get_session_internal(tfp, &tfs);
+ if (rc)
+ return;
- if (global_data_initialized[sess_idx] == 0) {
- CFA_TCAM_MGR_LOG(INFO, "PANIC: No TCAM data created for sess_idx %d\n",
- sess_idx);
+ tcam_mgr_data = tfs->tcam_mgr_handle;
+ if (!tcam_mgr_data) {
+ printf("No TCAM data created for session\n");
return;
}
printf("\nGlobal Maximum Entries: %d\n\n",
- cfa_tcam_mgr_max_entries[sess_idx]);
+ tcam_mgr_data->cfa_tcam_mgr_max_entries);
printf("TCAM Entry Table:\n");
- for (id = 0; id < cfa_tcam_mgr_max_entries[sess_idx]; id++) {
- if (entry_data[sess_idx][id].ref_cnt > 0) {
- entry = &entry_data[sess_idx][id];
+ for (id = 0; id < tcam_mgr_data->cfa_tcam_mgr_max_entries; id++) {
+ if (tcam_mgr_data->entry_data[id].ref_cnt > 0) {
+ entry = &tcam_mgr_data->entry_data[id];
if (!entry_found)
printf(ENTRY_DUMP_HEADER);
printf("%5u %5u %5u %5u",
@@ -1,5 +1,5 @@
/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2021-2023 Broadcom
+ * Copyright(c) 2021-2024 Broadcom
* All rights reserved.
*/
@@ -15,10 +15,6 @@
* The TCAM module provides processing of Internal TCAM types.
*/
-#ifndef TF_TCAM_MAX_SESSIONS
-#define TF_TCAM_MAX_SESSIONS 16
-#endif
-
#define ENTRY_ID_INVALID UINT16_MAX
#define TF_TCAM_PRIORITY_MIN 0
@@ -45,6 +41,15 @@
TFP_DRV_LOG(level, "%s: %s " fmt, tf_dir_2_str(dir), \
cfa_tcam_mgr_tbl_2_str(type))
+/* #define CFA_TCAM_MGR_TRACING */
+
+#ifdef CFA_TCAM_MGR_TRACING
+#define CFA_TCAM_MGR_TRACE(level, fmt, args...) \
+ printf("%s: " fmt, __func__, ## args)
+#else
+#define CFA_TCAM_MGR_TRACE(level, fmt, args...)
+#endif
+
#define CFA_TCAM_MGR_ERR_CODE(type) E ## type
/**
@@ -79,9 +84,10 @@
} \
} while (0)
+#define CFA_TCAM_MGR_TBL_TYPE_START 0
+
+/* Logical TCAM tables */
enum cfa_tcam_mgr_tbl_type {
- /* Logical TCAM tables */
- CFA_TCAM_MGR_TBL_TYPE_START,
CFA_TCAM_MGR_TBL_TYPE_L2_CTXT_TCAM_HIGH_AFM =
CFA_TCAM_MGR_TBL_TYPE_START,
CFA_TCAM_MGR_TBL_TYPE_L2_CTXT_TCAM_HIGH_APPS,
@@ -106,15 +112,10 @@ enum cfa_tcam_mgr_tbl_type {
enum cfa_tcam_mgr_device_type {
CFA_TCAM_MGR_DEVICE_TYPE_P4 = 0,
- CFA_TCAM_MGR_DEVICE_TYPE_SR,
CFA_TCAM_MGR_DEVICE_TYPE_P5,
CFA_TCAM_MGR_DEVICE_TYPE_MAX
};
-struct cfa_tcam_mgr_context {
- struct tf *tfp;
-};
-
/**
* TCAM Manager initialization parameters
*/
@@ -361,7 +362,7 @@ cfa_tcam_mgr_tbl_2_str(enum cfa_tcam_mgr_tbl_type tcam_type);
* - (<0) on failure.
*/
int
-cfa_tcam_mgr_init(int sess_idx, enum cfa_tcam_mgr_device_type type,
+cfa_tcam_mgr_init(struct tf *tfp, enum cfa_tcam_mgr_device_type type,
struct cfa_tcam_mgr_init_parms *parms);
/**
@@ -391,7 +392,7 @@ cfa_tcam_mgr_get_phys_table_type(enum cfa_tcam_mgr_tbl_type type);
* - (<0) on failure.
*/
int
-cfa_tcam_mgr_qcaps(struct cfa_tcam_mgr_context *context __rte_unused,
+cfa_tcam_mgr_qcaps(struct tf *tfp __rte_unused,
struct cfa_tcam_mgr_qcaps_parms *parms);
/**
@@ -408,7 +409,7 @@ cfa_tcam_mgr_qcaps(struct cfa_tcam_mgr_context *context __rte_unused,
* - (0) if successful.
* - (-EINVAL) on failure.
*/
-int cfa_tcam_mgr_bind(struct cfa_tcam_mgr_context *context,
+int cfa_tcam_mgr_bind(struct tf *tfp,
struct cfa_tcam_mgr_cfg_parms *parms);
/**
@@ -424,7 +425,7 @@ int cfa_tcam_mgr_bind(struct cfa_tcam_mgr_context *context,
* - (0) if successful.
* - (-EINVAL) on failure.
*/
-int cfa_tcam_mgr_unbind(struct cfa_tcam_mgr_context *context);
+int cfa_tcam_mgr_unbind(struct tf *tfp);
/**
* Allocates the requested tcam type from the internal RM DB.
@@ -439,7 +440,7 @@ int cfa_tcam_mgr_unbind(struct cfa_tcam_mgr_context *context);
* - (0) if successful.
* - (-EINVAL) on failure.
*/
-int cfa_tcam_mgr_alloc(struct cfa_tcam_mgr_context *context,
+int cfa_tcam_mgr_alloc(struct tf *tfp,
struct cfa_tcam_mgr_alloc_parms *parms);
/**
@@ -456,7 +457,7 @@ int cfa_tcam_mgr_alloc(struct cfa_tcam_mgr_context *context,
* - (0) if successful.
* - (-EINVAL) on failure.
*/
-int cfa_tcam_mgr_free(struct cfa_tcam_mgr_context *context,
+int cfa_tcam_mgr_free(struct tf *tfp,
struct cfa_tcam_mgr_free_parms *parms);
/**
@@ -473,7 +474,7 @@ int cfa_tcam_mgr_free(struct cfa_tcam_mgr_context *context,
* - (0) if successful.
* - (-EINVAL) on failure.
*/
-int cfa_tcam_mgr_set(struct cfa_tcam_mgr_context *context,
+int cfa_tcam_mgr_set(struct tf *tfp,
struct cfa_tcam_mgr_set_parms *parms);
/**
@@ -490,30 +491,33 @@ int cfa_tcam_mgr_set(struct cfa_tcam_mgr_context *context,
* - (0) if successful.
* - (-EINVAL) on failure.
*/
-int cfa_tcam_mgr_get(struct cfa_tcam_mgr_context *context,
+int cfa_tcam_mgr_get(struct tf *tfp,
struct cfa_tcam_mgr_get_parms *parms);
int
-cfa_tcam_mgr_tables_get(int sess_idx, enum tf_dir dir,
+cfa_tcam_mgr_tables_get(struct tf *tfp, enum tf_dir dir,
enum cfa_tcam_mgr_tbl_type type,
uint16_t *start_row,
uint16_t *end_row,
uint16_t *max_entries,
uint16_t *slices);
int
-cfa_tcam_mgr_tables_set(int sess_idx, enum tf_dir dir,
+cfa_tcam_mgr_tables_set(struct tf *tfp, enum tf_dir dir,
enum cfa_tcam_mgr_tbl_type type,
uint16_t start_row,
uint16_t end_row,
uint16_t max_entries);
-int cfa_tcam_mgr_shared_clear(struct cfa_tcam_mgr_context *context,
+int cfa_tcam_mgr_shared_clear(struct tf *tfp,
struct cfa_tcam_mgr_shared_clear_parms *parms);
-int cfa_tcam_mgr_shared_move(struct cfa_tcam_mgr_context *context,
+int cfa_tcam_mgr_shared_move(struct tf *tfp,
struct cfa_tcam_mgr_shared_move_parms *parms);
-void cfa_tcam_mgr_rows_dump(int sess_idx, enum tf_dir dir, enum cfa_tcam_mgr_tbl_type type);
-void cfa_tcam_mgr_tables_dump(int sess_idx, enum tf_dir dir, enum cfa_tcam_mgr_tbl_type type);
-void cfa_tcam_mgr_entries_dump(int sess_idx);
+void cfa_tcam_mgr_rows_dump(struct tf *tfp, enum tf_dir dir,
+ enum cfa_tcam_mgr_tbl_type type);
+void cfa_tcam_mgr_tables_dump(struct tf *tfp, enum tf_dir dir,
+ enum cfa_tcam_mgr_tbl_type type);
+void cfa_tcam_mgr_entries_dump(struct tf *tfp);
+
#endif /* _CFA_TCAM_MGR_H */
@@ -1,5 +1,5 @@
/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2021-2023 Broadcom
+ * Copyright(c) 2021-2024 Broadcom
* All rights reserved.
*/
@@ -8,6 +8,34 @@
#include <inttypes.h>
#include "cfa_tcam_mgr.h"
+#include "bitalloc.h"
+
+struct cfa_tcam_mgr_data;
+
+/* HW OP definitions */
+typedef int (*cfa_tcam_mgr_hwop_set_func_t)(struct cfa_tcam_mgr_data
+ *tcam_mgr_data,
+ struct cfa_tcam_mgr_set_parms
+ *parms, int row, int slice,
+ int max_slices);
+typedef int (*cfa_tcam_mgr_hwop_get_func_t)(struct cfa_tcam_mgr_data
+ *tcam_mgr_data,
+ struct cfa_tcam_mgr_get_parms
+ *parms, int row, int slice,
+ int max_slices);
+typedef int (*cfa_tcam_mgr_hwop_free_func_t)(struct cfa_tcam_mgr_data
+ *tcam_mgr_data,
+ struct cfa_tcam_mgr_free_parms
+ *parms, int row, int slice,
+ int max_slices);
+
+struct cfa_tcam_mgr_hwops_funcs {
+ cfa_tcam_mgr_hwop_set_func_t set;
+ cfa_tcam_mgr_hwop_get_func_t get;
+ cfa_tcam_mgr_hwop_free_func_t free;
+};
+
+/* End: HW OP definitions */
/*
* This identifier is to be used for one-off variable sizes. Do not use it for
@@ -42,8 +70,7 @@ TF_TCAM_TABLE_ROWS_DEF(2);
TF_TCAM_TABLE_ROWS_DEF(4);
TF_TCAM_TABLE_ROWS_DEF(8);
-/*
- * The following macros are for setting the entry status in a row entry.
+/* The following macros are for setting the entry status in a row entry.
* row is (struct cfa_tcam_mgr_table_rows_0 *)
*/
#define ROW_ENTRY_INUSE(row, entry) ((row)->entry_inuse & (1U << (entry)))
@@ -64,6 +91,13 @@ TF_TCAM_TABLE_ROWS_DEF(8);
VEB_TCAM_RX_MAX_ENTRIES + \
VEB_TCAM_TX_MAX_ENTRIES)
+#define TCAM_SET_END_ROW(n) ((n) ? (n) - 1 : 0)
+
+#define L2_CTXT_TCAM_RX_APP_LO_START (L2_CTXT_TCAM_RX_NUM_ROWS / 2)
+#define L2_CTXT_TCAM_RX_APP_HI_END (L2_CTXT_TCAM_RX_APP_LO_START - 1)
+#define L2_CTXT_TCAM_TX_APP_LO_START (L2_CTXT_TCAM_TX_NUM_ROWS / 2)
+#define L2_CTXT_TCAM_TX_APP_HI_END (L2_CTXT_TCAM_TX_APP_LO_START - 1)
+
struct cfa_tcam_mgr_entry_data {
uint16_t row;
uint8_t slice;
@@ -73,38 +107,28 @@ struct cfa_tcam_mgr_entry_data {
struct cfa_tcam_mgr_table_data {
struct cfa_tcam_mgr_table_rows_0 *tcam_rows;
uint16_t hcapi_type;
- uint16_t num_rows; /* Rows in physical TCAM */
- uint16_t start_row; /* Where the logical TCAM starts */
- uint16_t end_row; /* Where the logical TCAM ends */
+ uint16_t num_rows; /* Rows in physical TCAM */
+ uint16_t start_row; /* Where the logical TCAM starts */
+ uint16_t end_row; /* Where the logical TCAM ends */
uint16_t max_entries;
uint16_t used_entries;
- uint8_t row_width; /* bytes */
- uint8_t result_size; /* bytes */
+ uint8_t row_width; /* bytes */
+ uint8_t result_size; /* bytes */
uint8_t max_slices;
};
-extern int cfa_tcam_mgr_max_entries[TF_TCAM_MAX_SESSIONS];
-
-extern struct cfa_tcam_mgr_table_data
-cfa_tcam_mgr_tables[TF_TCAM_MAX_SESSIONS][TF_DIR_MAX][CFA_TCAM_MGR_TBL_TYPE_MAX];
-
-/* HW OP definitions begin here */
-typedef int (*cfa_tcam_mgr_hwop_set_func_t)(int sess_idx,
- struct cfa_tcam_mgr_set_parms
- *parms, int row, int slice,
- int max_slices);
-typedef int (*cfa_tcam_mgr_hwop_get_func_t)(int sess_idx,
- struct cfa_tcam_mgr_get_parms
- *parms, int row, int slice,
- int max_slices);
-typedef int (*cfa_tcam_mgr_hwop_free_func_t)(int sess_idx,
- struct cfa_tcam_mgr_free_parms
- *parms, int row, int slice,
- int max_slices);
-
-struct cfa_tcam_mgr_hwops_funcs {
- cfa_tcam_mgr_hwop_set_func_t set;
- cfa_tcam_mgr_hwop_get_func_t get;
- cfa_tcam_mgr_hwop_free_func_t free;
+struct cfa_tcam_mgr_data {
+ int cfa_tcam_mgr_max_entries;
+ struct cfa_tcam_mgr_table_data
+ cfa_tcam_mgr_tables[TF_DIR_MAX][CFA_TCAM_MGR_TBL_TYPE_MAX];
+ void *table_rows;
+ struct cfa_tcam_mgr_entry_data *entry_data;
+ struct bitalloc *session_bmp;
+ uint64_t session_bmp_size;
+ void *row_tables[TF_DIR_MAX][TF_TCAM_TBL_TYPE_MAX];
+ void *rx_row_data;
+ void *tx_row_data;
+ struct cfa_tcam_mgr_hwops_funcs hwop_funcs;
};
+
#endif /* CFA_TCAM_MGR_DEVICE_H */
@@ -1,5 +1,5 @@
/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2021-2023 Broadcom
+ * Copyright(c) 2021-2024 Broadcom
* All rights reserved.
*/
@@ -14,8 +14,8 @@
#include "tf_tcam.h"
#include "hcapi_cfa_defs.h"
#include "cfa_tcam_mgr.h"
-#include "cfa_tcam_mgr_hwop_msg.h"
#include "cfa_tcam_mgr_device.h"
+#include "cfa_tcam_mgr_hwop_msg.h"
#include "cfa_tcam_mgr_p58.h"
#include "cfa_tcam_mgr_p4.h"
#include "tf_session.h"
@@ -23,20 +23,18 @@
#include "tfp.h"
#include "tf_util.h"
-/*
- * The free hwop will free more than a single slice so cannot be used.
- */
-struct cfa_tcam_mgr_hwops_funcs hwop_funcs;
-
int
-cfa_tcam_mgr_hwops_init(enum cfa_tcam_mgr_device_type type)
+cfa_tcam_mgr_hwops_init(struct cfa_tcam_mgr_data *tcam_mgr_data,
+ enum cfa_tcam_mgr_device_type type)
{
+ struct cfa_tcam_mgr_hwops_funcs *hwop_funcs =
+ &tcam_mgr_data->hwop_funcs;
+
switch (type) {
case CFA_TCAM_MGR_DEVICE_TYPE_P4:
- case CFA_TCAM_MGR_DEVICE_TYPE_SR:
- return cfa_tcam_mgr_hwops_get_funcs_p4(&hwop_funcs);
+ return cfa_tcam_mgr_hwops_get_funcs_p4(hwop_funcs);
case CFA_TCAM_MGR_DEVICE_TYPE_P5:
- return cfa_tcam_mgr_hwops_get_funcs_p58(&hwop_funcs);
+ return cfa_tcam_mgr_hwops_get_funcs_p58(hwop_funcs);
default:
CFA_TCAM_MGR_LOG(ERR, "No such device\n");
return -CFA_TCAM_MGR_ERR_CODE(NODEV);
@@ -51,27 +49,27 @@ cfa_tcam_mgr_hwops_init(enum cfa_tcam_mgr_device_type type)
*/
int
-cfa_tcam_mgr_entry_set_msg(int sess_idx, struct cfa_tcam_mgr_context *context
- __rte_unused,
+cfa_tcam_mgr_entry_set_msg(struct cfa_tcam_mgr_data *tcam_mgr_data,
+ struct tf *tfp __rte_unused,
struct cfa_tcam_mgr_set_parms *parms,
int row, int slice,
int max_slices __rte_unused)
{
+ enum tf_tcam_tbl_type type =
+ cfa_tcam_mgr_get_phys_table_type(parms->type);
cfa_tcam_mgr_hwop_set_func_t set_func;
-
- set_func = hwop_funcs.set;
- if (set_func == NULL)
- return -CFA_TCAM_MGR_ERR_CODE(PERM);
-
struct tf_tcam_set_parms sparms;
- struct tf_session *tfs;
struct tf_dev_info *dev;
+ struct tf_session *tfs;
int rc;
- enum tf_tcam_tbl_type type =
- cfa_tcam_mgr_get_phys_table_type(parms->type);
+
+ set_func = tcam_mgr_data->hwop_funcs.set;
+ if (!set_func)
+ return -CFA_TCAM_MGR_ERR_CODE(INVAL);
+
/* Retrieve the session information */
- rc = tf_session_get_session_internal(context->tfp, &tfs);
+ rc = tf_session_get_session_internal(tfp, &tfs);
if (rc)
return rc;
@@ -91,63 +89,75 @@ cfa_tcam_mgr_entry_set_msg(int sess_idx, struct cfa_tcam_mgr_context *context
sparms.result = parms->result;
sparms.result_size = parms->result_size;
- rc = tf_msg_tcam_entry_set(context->tfp, dev, &sparms);
+#ifdef CFA_TCAM_MGR_TRACING
+ CFA_TCAM_MGR_LOG_DIR_TYPE(INFO, parms->dir, parms->type,
+ "%s: %s row:%d slice:%d "
+ "set tcam physical idx 0x%x\n",
+ tf_dir_2_str(parms->dir),
+ cfa_tcam_mgr_tbl_2_str(parms->type),
+ row, slice, sparms.idx);
+#endif
+
+ rc = tf_msg_tcam_entry_set(tfp, dev, &sparms);
if (rc) {
- /* Log error */
CFA_TCAM_MGR_LOG_DIR_TYPE(ERR, parms->dir, parms->type,
- "Entry %d set failed, rc:%d\n",
+ "%s: %s entry:%d "
+ "set tcam failed, rc:%d\n",
+ tf_dir_2_str(parms->dir),
+ cfa_tcam_mgr_tbl_2_str(parms->type),
parms->id, -rc);
return rc;
}
- return set_func(sess_idx, parms, row, slice, max_slices);
+ return set_func(tcam_mgr_data, parms, row, slice, max_slices);
}
int
-cfa_tcam_mgr_entry_get_msg(int sess_idx, struct cfa_tcam_mgr_context *context
- __rte_unused,
+cfa_tcam_mgr_entry_get_msg(struct cfa_tcam_mgr_data *tcam_mgr_data,
+ struct tf *tfp __rte_unused,
struct cfa_tcam_mgr_get_parms *parms,
int row, int slice,
int max_slices __rte_unused)
{
cfa_tcam_mgr_hwop_get_func_t get_func;
- get_func = hwop_funcs.get;
- if (get_func == NULL)
+ get_func = tcam_mgr_data->hwop_funcs.get;
+ if (!get_func)
return -CFA_TCAM_MGR_ERR_CODE(PERM);
- return get_func(sess_idx, parms, row, slice, max_slices);
+ return get_func(tcam_mgr_data, parms, row, slice, max_slices);
}
int
-cfa_tcam_mgr_entry_free_msg(int sess_idx, struct cfa_tcam_mgr_context *context
- __rte_unused,
+cfa_tcam_mgr_entry_free_msg(struct cfa_tcam_mgr_data *tcam_mgr_data,
+ struct tf *tfp __rte_unused,
struct cfa_tcam_mgr_free_parms *parms,
int row, int slice,
int key_size,
int result_size,
int max_slices)
{
+ enum tf_tcam_tbl_type type =
+ cfa_tcam_mgr_get_phys_table_type(parms->type);
+ uint8_t mask[CFA_TCAM_MGR_MAX_KEY_SIZE] = { 0 };
+ uint8_t key[CFA_TCAM_MGR_MAX_KEY_SIZE] = { 0 };
cfa_tcam_mgr_hwop_free_func_t free_func;
-
- free_func = hwop_funcs.free;
- if (free_func == NULL)
- return -CFA_TCAM_MGR_ERR_CODE(PERM);
-
+ struct tf_tcam_set_parms sparms;
struct tf_dev_info *dev;
struct tf_session *tfs;
int rc;
- enum tf_tcam_tbl_type type =
- cfa_tcam_mgr_get_phys_table_type(parms->type);
- /* Free will clear an entire row. */
- /* Use set message to clear an individual entry */
- struct tf_tcam_set_parms sparms;
- uint8_t key[CFA_TCAM_MGR_MAX_KEY_SIZE] = { 0 };
- uint8_t mask[CFA_TCAM_MGR_MAX_KEY_SIZE] = { 0 };
+ free_func = tcam_mgr_data->hwop_funcs.free;
+ if (!free_func)
+ return -CFA_TCAM_MGR_ERR_CODE(PERM);
+
+ /*
+ * The free hwop will free more than a single slice (an entire row),
+ * so cannot be used. Use set message to clear an individual entry
+ */
/* Retrieve the session information */
- rc = tf_session_get_session_internal(context->tfp, &tfs);
+ rc = tf_session_get_session_internal(tfp, &tfs);
if (rc)
return rc;
@@ -158,7 +168,9 @@ cfa_tcam_mgr_entry_free_msg(int sess_idx, struct cfa_tcam_mgr_context *context
if (key_size > CFA_TCAM_MGR_MAX_KEY_SIZE) {
CFA_TCAM_MGR_LOG_DIR_TYPE(ERR, parms->dir, parms->type,
- "Entry %d key size is %d greater than:%d\n",
+ "%s: %s entry:%d key size:%d > %d\n",
+ tf_dir_2_str(parms->dir),
+ cfa_tcam_mgr_tbl_2_str(parms->type),
parms->id, key_size,
CFA_TCAM_MGR_MAX_KEY_SIZE);
return -EINVAL;
@@ -166,7 +178,9 @@ cfa_tcam_mgr_entry_free_msg(int sess_idx, struct cfa_tcam_mgr_context *context
if (result_size > CFA_TCAM_MGR_MAX_KEY_SIZE) {
CFA_TCAM_MGR_LOG_DIR_TYPE(ERR, parms->dir, parms->type,
- "Entry %d result size is %d greater than:%d\n",
+ "%s: %s entry:%d res size:%d > %d\n",
+ tf_dir_2_str(parms->dir),
+ cfa_tcam_mgr_tbl_2_str(parms->type),
parms->id, result_size,
CFA_TCAM_MGR_MAX_KEY_SIZE);
return -EINVAL;
@@ -186,16 +200,27 @@ cfa_tcam_mgr_entry_free_msg(int sess_idx, struct cfa_tcam_mgr_context *context
sparms.key_size = key_size;
sparms.result_size = result_size;
- rc = tf_msg_tcam_entry_set(context->tfp, dev, &sparms);
+#ifdef CFA_TCAM_MGR_TRACING
+ CFA_TCAM_MGR_LOG_DIR_TYPE(INFO, parms->dir, parms->type,
+ "%s: %s row:%d slice:%d free idx:%d "
+ "key_sz:%d result_sz:%d\n",
+ tf_dir_2_str(parms->dir),
+ cfa_tcam_mgr_tbl_2_str(parms->type),
+ row, slice, sparms.idx, key_size,
+ result_size);
+#endif
+
+ rc = tf_msg_tcam_entry_set(tfp, dev, &sparms);
if (rc) {
/* Log error */
CFA_TCAM_MGR_LOG_DIR_TYPE(ERR, parms->dir, parms->type,
- "Row %d, slice %d set failed, "
- "rc:%d.\n",
- row,
- slice,
- rc);
+ "%s: %s row:%d slice:%d set failed, "
+ "rc:%d\n",
+ tf_dir_2_str(parms->dir),
+ cfa_tcam_mgr_tbl_2_str(parms->type),
+ row, slice, rc);
return rc;
}
- return free_func(sess_idx, parms, row, slice, max_slices);
+
+ return free_func(tcam_mgr_data, parms, row, slice, max_slices);
}
@@ -1,5 +1,5 @@
/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2021-2023 Broadcom
+ * Copyright(c) 2021-2024 Broadcom
* All rights reserved.
*/
@@ -7,22 +7,24 @@
#define CFA_TCAM_MGR_HWOP_MSG_H
int
-cfa_tcam_mgr_hwops_init(enum cfa_tcam_mgr_device_type type);
+cfa_tcam_mgr_hwops_init(struct cfa_tcam_mgr_data *tcam_mgr_data,
+ enum cfa_tcam_mgr_device_type type);
int
-cfa_tcam_mgr_entry_set_msg(int sess_idx,
- struct cfa_tcam_mgr_context *context,
+cfa_tcam_mgr_entry_set_msg(struct cfa_tcam_mgr_data *tcam_mgr_data,
+ struct tf *tfp,
struct cfa_tcam_mgr_set_parms *parms,
int row, int slice, int max_slices);
int
-cfa_tcam_mgr_entry_get_msg(int sess_idx,
- struct cfa_tcam_mgr_context *context,
+cfa_tcam_mgr_entry_get_msg(struct cfa_tcam_mgr_data *tcam_mgr_data,
+ struct tf *tfp,
struct cfa_tcam_mgr_get_parms *parms,
int row, int slice, int max_slices);
int
-cfa_tcam_mgr_entry_free_msg(int sess_idx,
- struct cfa_tcam_mgr_context *context,
+cfa_tcam_mgr_entry_free_msg(struct cfa_tcam_mgr_data *tcam_mgr_data,
+ struct tf *tfp,
struct cfa_tcam_mgr_free_parms *parms,
int row, int slice, int key_size,
int result_size, int max_slices);
+
#endif /* CFA_TCAM_MGR_HWOP_MSG_H */
@@ -1,5 +1,5 @@
/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2021-2023 Broadcom
+ * Copyright(c) 2021-2024 Broadcom
* All rights reserved.
*/
@@ -12,6 +12,7 @@
#include "tfp.h"
#include "assert.h"
#include "tf_util.h"
+#include "tf_session.h"
/*
* Sizings of the TCAMs on P4
@@ -126,38 +127,40 @@
* Array sizes have 1 added to avoid zero length arrays.
*/
-static struct cfa_tcam_mgr_table_rows_1
- cfa_tcam_mgr_table_rows_L2_CTXT_TCAM_RX[TF_TCAM_MAX_SESSIONS][L2_CTXT_TCAM_RX_NUM_ROWS + 1];
-static struct cfa_tcam_mgr_table_rows_1
- cfa_tcam_mgr_table_rows_L2_CTXT_TCAM_TX[TF_TCAM_MAX_SESSIONS][L2_CTXT_TCAM_TX_NUM_ROWS + 1];
-static struct cfa_tcam_mgr_table_rows_1
- cfa_tcam_mgr_table_rows_PROF_TCAM_RX[TF_TCAM_MAX_SESSIONS][PROF_TCAM_RX_NUM_ROWS + 1];
-static struct cfa_tcam_mgr_table_rows_1
- cfa_tcam_mgr_table_rows_PROF_TCAM_TX[TF_TCAM_MAX_SESSIONS][PROF_TCAM_TX_NUM_ROWS + 1];
-static struct cfa_tcam_mgr_table_rows_4
- cfa_tcam_mgr_table_rows_WC_TCAM_RX[TF_TCAM_MAX_SESSIONS][WC_TCAM_RX_NUM_ROWS + 1];
-static struct cfa_tcam_mgr_table_rows_4
- cfa_tcam_mgr_table_rows_WC_TCAM_TX[TF_TCAM_MAX_SESSIONS][WC_TCAM_TX_NUM_ROWS + 1];
-static struct cfa_tcam_mgr_table_rows_1
- cfa_tcam_mgr_table_rows_SP_TCAM_RX[TF_TCAM_MAX_SESSIONS][SP_TCAM_RX_NUM_ROWS + 1];
-static struct cfa_tcam_mgr_table_rows_1
- cfa_tcam_mgr_table_rows_SP_TCAM_TX[TF_TCAM_MAX_SESSIONS][SP_TCAM_TX_NUM_ROWS + 1];
-static struct cfa_tcam_mgr_table_rows_1
- cfa_tcam_mgr_table_rows_CT_RULE_TCAM_RX[TF_TCAM_MAX_SESSIONS][CT_RULE_TCAM_RX_NUM_ROWS + 1];
-static struct cfa_tcam_mgr_table_rows_1
- cfa_tcam_mgr_table_rows_CT_RULE_TCAM_TX[TF_TCAM_MAX_SESSIONS][CT_RULE_TCAM_TX_NUM_ROWS + 1];
-static struct cfa_tcam_mgr_table_rows_1
- cfa_tcam_mgr_table_rows_VEB_TCAM_RX[TF_TCAM_MAX_SESSIONS][VEB_TCAM_RX_NUM_ROWS + 1];
-static struct cfa_tcam_mgr_table_rows_1
- cfa_tcam_mgr_table_rows_VEB_TCAM_TX[TF_TCAM_MAX_SESSIONS][VEB_TCAM_TX_NUM_ROWS + 1];
-static struct cfa_tcam_mgr_table_rows_4
- cfa_tcam_mgr_table_rows_WC_TCAM_RX_HIGH[TF_TCAM_MAX_SESSIONS][WC_TCAM_RX_NUM_ROWS + 1];
-static struct cfa_tcam_mgr_table_rows_4
- cfa_tcam_mgr_table_rows_WC_TCAM_RX_LOW[TF_TCAM_MAX_SESSIONS][WC_TCAM_RX_NUM_ROWS + 1];
-static struct cfa_tcam_mgr_table_rows_4
- cfa_tcam_mgr_table_rows_WC_TCAM_TX_HIGH[TF_TCAM_MAX_SESSIONS][WC_TCAM_TX_NUM_ROWS + 1];
-static struct cfa_tcam_mgr_table_rows_4
- cfa_tcam_mgr_table_rows_WC_TCAM_TX_LOW[TF_TCAM_MAX_SESSIONS][WC_TCAM_TX_NUM_ROWS + 1];
+struct cfa_tcam_mgr_table_rows_p4 {
+ struct cfa_tcam_mgr_table_rows_1
+ table_rows_L2_CTXT_TCAM_RX[L2_CTXT_TCAM_RX_NUM_ROWS + 1];
+ struct cfa_tcam_mgr_table_rows_1
+ table_rows_L2_CTXT_TCAM_TX[L2_CTXT_TCAM_TX_NUM_ROWS + 1];
+ struct cfa_tcam_mgr_table_rows_1
+ table_rows_PROF_TCAM_RX[PROF_TCAM_RX_NUM_ROWS + 1];
+ struct cfa_tcam_mgr_table_rows_1
+ table_rows_PROF_TCAM_TX[PROF_TCAM_TX_NUM_ROWS + 1];
+ struct cfa_tcam_mgr_table_rows_4
+ table_rows_WC_TCAM_RX[WC_TCAM_RX_NUM_ROWS + 1];
+ struct cfa_tcam_mgr_table_rows_4
+ table_rows_WC_TCAM_TX[WC_TCAM_TX_NUM_ROWS + 1];
+ struct cfa_tcam_mgr_table_rows_1
+ table_rows_SP_TCAM_RX[SP_TCAM_RX_NUM_ROWS + 1];
+ struct cfa_tcam_mgr_table_rows_1
+ table_rows_SP_TCAM_TX[SP_TCAM_TX_NUM_ROWS + 1];
+ struct cfa_tcam_mgr_table_rows_1
+ table_rows_CT_RULE_TCAM_RX[CT_RULE_TCAM_RX_NUM_ROWS + 1];
+ struct cfa_tcam_mgr_table_rows_1
+ table_rows_CT_RULE_TCAM_TX[CT_RULE_TCAM_TX_NUM_ROWS + 1];
+ struct cfa_tcam_mgr_table_rows_1
+ table_rows_VEB_TCAM_RX[VEB_TCAM_RX_NUM_ROWS + 1];
+ struct cfa_tcam_mgr_table_rows_1
+ table_rows_VEB_TCAM_TX[VEB_TCAM_TX_NUM_ROWS + 1];
+ struct cfa_tcam_mgr_table_rows_4
+ table_rows_WC_TCAM_RX_HIGH[WC_TCAM_RX_NUM_ROWS + 1];
+ struct cfa_tcam_mgr_table_rows_4
+ table_rows_WC_TCAM_RX_LOW[WC_TCAM_RX_NUM_ROWS + 1];
+ struct cfa_tcam_mgr_table_rows_4
+ table_rows_WC_TCAM_TX_HIGH[WC_TCAM_TX_NUM_ROWS + 1];
+ struct cfa_tcam_mgr_table_rows_4
+ table_rows_WC_TCAM_TX_LOW[WC_TCAM_TX_NUM_ROWS + 1];
+};
struct cfa_tcam_mgr_table_data
cfa_tcam_mgr_tables_p4[TF_DIR_MAX][CFA_TCAM_MGR_TBL_TYPE_MAX] = {
@@ -177,7 +180,7 @@ cfa_tcam_mgr_tables_p4[TF_DIR_MAX][CFA_TCAM_MGR_TBL_TYPE_MAX] = {
.row_width = L2_CTXT_TCAM_RX_ROW_WIDTH,
.num_rows = L2_CTXT_TCAM_RX_NUM_ROWS,
.start_row = 0,
- .end_row = (L2_CTXT_TCAM_RX_NUM_ROWS / 2) - 1,
+ .end_row = L2_CTXT_TCAM_RX_APP_HI_END,
.max_entries = (L2_CTXT_TCAM_RX_MAX_ENTRIES / 2),
.result_size = L2_CTXT_TCAM_RX_RESULT_SIZE,
.hcapi_type = CFA_RESOURCE_TYPE_P4_L2_CTXT_TCAM_HIGH,
@@ -196,7 +199,7 @@ cfa_tcam_mgr_tables_p4[TF_DIR_MAX][CFA_TCAM_MGR_TBL_TYPE_MAX] = {
.max_slices = L2_CTXT_TCAM_RX_MAX_SLICES,
.row_width = L2_CTXT_TCAM_RX_ROW_WIDTH,
.num_rows = L2_CTXT_TCAM_RX_NUM_ROWS,
- .start_row = (L2_CTXT_TCAM_RX_NUM_ROWS / 2),
+ .start_row = L2_CTXT_TCAM_RX_APP_LO_START,
.end_row = L2_CTXT_TCAM_RX_NUM_ROWS - 1,
.max_entries = (L2_CTXT_TCAM_RX_MAX_ENTRIES / 2),
.result_size = L2_CTXT_TCAM_RX_RESULT_SIZE,
@@ -277,7 +280,8 @@ cfa_tcam_mgr_tables_p4[TF_DIR_MAX][CFA_TCAM_MGR_TBL_TYPE_MAX] = {
.num_rows = CT_RULE_TCAM_RX_NUM_ROWS,
.start_row = 0,
#if CT_RULE_TCAM_RX_NUM_ROWS > 0
- .end_row = CT_RULE_TCAM_RX_NUM_ROWS - 1,
+ .end_row =
+ TCAM_SET_END_ROW(CT_RULE_TCAM_RX_NUM_ROWS),
#else
.end_row = CT_RULE_TCAM_RX_NUM_ROWS,
#endif
@@ -299,7 +303,8 @@ cfa_tcam_mgr_tables_p4[TF_DIR_MAX][CFA_TCAM_MGR_TBL_TYPE_MAX] = {
.num_rows = VEB_TCAM_RX_NUM_ROWS,
.start_row = 0,
#if VEB_TCAM_RX_NUM_ROWS > 0
- .end_row = VEB_TCAM_RX_NUM_ROWS - 1,
+ .end_row =
+ TCAM_SET_END_ROW(VEB_TCAM_RX_NUM_ROWS),
#else
.end_row = VEB_TCAM_RX_NUM_ROWS,
#endif
@@ -363,7 +368,7 @@ cfa_tcam_mgr_tables_p4[TF_DIR_MAX][CFA_TCAM_MGR_TBL_TYPE_MAX] = {
.row_width = L2_CTXT_TCAM_TX_ROW_WIDTH,
.num_rows = L2_CTXT_TCAM_TX_NUM_ROWS,
.start_row = 0,
- .end_row = (L2_CTXT_TCAM_TX_NUM_ROWS / 2) - 1,
+ .end_row = L2_CTXT_TCAM_TX_APP_HI_END,
.max_entries = (L2_CTXT_TCAM_TX_MAX_ENTRIES / 2),
.result_size = L2_CTXT_TCAM_TX_RESULT_SIZE,
.hcapi_type = CFA_RESOURCE_TYPE_P4_L2_CTXT_TCAM_HIGH,
@@ -382,7 +387,7 @@ cfa_tcam_mgr_tables_p4[TF_DIR_MAX][CFA_TCAM_MGR_TBL_TYPE_MAX] = {
.max_slices = L2_CTXT_TCAM_TX_MAX_SLICES,
.row_width = L2_CTXT_TCAM_TX_ROW_WIDTH,
.num_rows = L2_CTXT_TCAM_TX_NUM_ROWS,
- .start_row = (L2_CTXT_TCAM_TX_NUM_ROWS / 2),
+ .start_row = L2_CTXT_TCAM_TX_APP_LO_START,
.end_row = L2_CTXT_TCAM_TX_NUM_ROWS - 1,
.max_entries = (L2_CTXT_TCAM_TX_MAX_ENTRIES / 2),
.result_size = L2_CTXT_TCAM_TX_RESULT_SIZE,
@@ -463,7 +468,8 @@ cfa_tcam_mgr_tables_p4[TF_DIR_MAX][CFA_TCAM_MGR_TBL_TYPE_MAX] = {
.num_rows = CT_RULE_TCAM_TX_NUM_ROWS,
.start_row = 0,
#if CT_RULE_TCAM_TX_NUM_ROWS > 0
- .end_row = CT_RULE_TCAM_TX_NUM_ROWS - 1,
+ .end_row =
+ TCAM_SET_END_ROW(CT_RULE_TCAM_TX_NUM_ROWS),
#else
.end_row = CT_RULE_TCAM_TX_NUM_ROWS,
#endif
@@ -487,6 +493,7 @@ cfa_tcam_mgr_tables_p4[TF_DIR_MAX][CFA_TCAM_MGR_TBL_TYPE_MAX] = {
.end_row = VEB_TCAM_TX_NUM_ROWS - 1,
.max_entries = VEB_TCAM_TX_MAX_ENTRIES,
.result_size = VEB_TCAM_RX_RESULT_SIZE,
+/* .hcapi_type = */
},
{ /* AFM */
.max_slices = WC_TCAM_TX_MAX_SLICES,
@@ -531,221 +538,311 @@ cfa_tcam_mgr_tables_p4[TF_DIR_MAX][CFA_TCAM_MGR_TBL_TYPE_MAX] = {
},
};
-static struct cfa_tcam_mgr_entry_data entry_data_p4[TF_TCAM_MAX_SESSIONS][TF_TCAM_MAX_ENTRIES];
-
-static struct sbmp session_bmp_p4[TF_TCAM_MAX_SESSIONS][TF_TCAM_MAX_ENTRIES];
+static int cfa_tcam_mgr_row_data_alloc(struct cfa_tcam_mgr_data *tcam_mgr_data);
+static void cfa_tcam_mgr_row_data_free(struct cfa_tcam_mgr_data *tcam_mgr_data);
-int
-cfa_tcam_mgr_sess_table_get_p4(int sess_idx, struct sbmp **session_bmp)
+static void cfa_tcam_mgr_data_free(struct tf_session *tfs)
{
- *session_bmp = session_bmp_p4[sess_idx];
- return 0;
+ struct cfa_tcam_mgr_data *tcam_mgr_data = tfs->tcam_mgr_handle;
+
+ if (!tcam_mgr_data)
+ return;
+
+ tfp_free(tcam_mgr_data->table_rows);
+ tfp_free(tcam_mgr_data->entry_data);
+ tfp_free(tcam_mgr_data->session_bmp);
+ cfa_tcam_mgr_row_data_free(tcam_mgr_data);
+
+ tfp_free(tcam_mgr_data);
+ tfs->tcam_mgr_handle = NULL;
}
int
-cfa_tcam_mgr_init_p4(int sess_idx, struct cfa_tcam_mgr_entry_data **global_entry_data)
+cfa_tcam_mgr_init_p4(struct tf *tfp)
{
- int max_row_width = 0;
+ struct cfa_tcam_mgr_table_rows_p4 *table_rows;
+ struct cfa_tcam_mgr_data *tcam_mgr_data;
+ struct tfp_calloc_parms cparms;
int max_result_size = 0;
+ struct tf_session *tfs;
+ int max_row_width = 0;
int dir, type;
+ int rc;
+
+ rc = tf_session_get_session_internal(tfp, &tfs);
+ if (rc)
+ return rc;
+
+ cparms.nitems = 1;
+ cparms.size = sizeof(struct cfa_tcam_mgr_data);
+ cparms.alignment = 0;
+ rc = tfp_calloc(&cparms);
+ if (rc) {
+ /* Log error */
+ TFP_DRV_LOG(ERR,
+ "Failed to allocate block, rc:%s\n",
+ strerror(-rc));
+ return rc;
+ }
- *global_entry_data = entry_data_p4[sess_idx];
+ tfs->tcam_mgr_handle = (struct cfa_tcam_mgr_data *)cparms.mem_va;
+ tcam_mgr_data = tfs->tcam_mgr_handle;
- memcpy(&cfa_tcam_mgr_tables[sess_idx],
+ cparms.nitems = 1;
+ cparms.size = sizeof(struct cfa_tcam_mgr_table_rows_p4);
+ cparms.alignment = 0;
+ rc = tfp_calloc(&cparms);
+ if (rc) {
+ /* Log error */
+ TFP_DRV_LOG(ERR,
+ "Failed to allocate block, rc:%s\n",
+ strerror(-rc));
+ tfp_free(tfs->tcam_mgr_handle);
+ tfs->tcam_mgr_handle = NULL;
+ return rc;
+ }
+ tcam_mgr_data->table_rows =
+ (struct cfa_tcam_mgr_table_rows_p4 *)cparms.mem_va;
+ table_rows = tcam_mgr_data->table_rows;
+
+ cparms.nitems = TF_TCAM_MAX_ENTRIES;
+ cparms.size = sizeof(struct cfa_tcam_mgr_entry_data);
+ cparms.alignment = 0;
+ rc = tfp_calloc(&cparms);
+ if (rc) {
+ /* Log error */
+ TFP_DRV_LOG(ERR,
+ "Failed to allocate block, rc:%s\n",
+ strerror(-rc));
+ goto fail;
+ }
+ tcam_mgr_data->entry_data =
+ (struct cfa_tcam_mgr_entry_data *)cparms.mem_va;
+
+ rc = cfa_tcam_mgr_row_data_alloc(tcam_mgr_data);
+ if (rc) {
+ /* Log error */
+ TFP_DRV_LOG(ERR,
+ "Failed to allocate tcam_mgr_row_data, rc:%s\n",
+ strerror(-rc));
+ goto fail;
+ }
+
+ memcpy(&tcam_mgr_data->cfa_tcam_mgr_tables,
&cfa_tcam_mgr_tables_p4,
- sizeof(cfa_tcam_mgr_tables[sess_idx]));
+ sizeof(tcam_mgr_data->cfa_tcam_mgr_tables));
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_RX]
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_RX]
[CFA_TCAM_MGR_TBL_TYPE_L2_CTXT_TCAM_HIGH_AFM].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_L2_CTXT_TCAM_RX[sess_idx];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_RX]
+ &table_rows->table_rows_L2_CTXT_TCAM_RX[0];
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_RX]
[CFA_TCAM_MGR_TBL_TYPE_L2_CTXT_TCAM_HIGH_APPS].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_L2_CTXT_TCAM_RX[sess_idx];
+ &table_rows->table_rows_L2_CTXT_TCAM_RX[0];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_TX]
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_TX]
[CFA_TCAM_MGR_TBL_TYPE_L2_CTXT_TCAM_HIGH_AFM].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_L2_CTXT_TCAM_TX[sess_idx];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_TX]
+ &table_rows->table_rows_L2_CTXT_TCAM_TX[0];
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_TX]
[CFA_TCAM_MGR_TBL_TYPE_L2_CTXT_TCAM_HIGH_APPS].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_L2_CTXT_TCAM_TX[sess_idx];
+ &table_rows->table_rows_L2_CTXT_TCAM_TX[0];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_RX]
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_RX]
[CFA_TCAM_MGR_TBL_TYPE_L2_CTXT_TCAM_LOW_AFM].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_L2_CTXT_TCAM_RX[sess_idx];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_RX]
+ &table_rows->table_rows_L2_CTXT_TCAM_RX[0];
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_RX]
[CFA_TCAM_MGR_TBL_TYPE_L2_CTXT_TCAM_LOW_APPS].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_L2_CTXT_TCAM_RX[sess_idx];
+ &table_rows->table_rows_L2_CTXT_TCAM_RX[0];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_TX]
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_TX]
[CFA_TCAM_MGR_TBL_TYPE_L2_CTXT_TCAM_LOW_AFM].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_L2_CTXT_TCAM_TX[sess_idx];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_TX]
+ &table_rows->table_rows_L2_CTXT_TCAM_TX[0];
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_TX]
[CFA_TCAM_MGR_TBL_TYPE_L2_CTXT_TCAM_LOW_APPS].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_L2_CTXT_TCAM_TX[sess_idx];
+ &table_rows->table_rows_L2_CTXT_TCAM_TX[0];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_RX]
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_RX]
[CFA_TCAM_MGR_TBL_TYPE_PROF_TCAM_AFM].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_PROF_TCAM_RX[sess_idx];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_RX]
+ &table_rows->table_rows_PROF_TCAM_RX[0];
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_RX]
[CFA_TCAM_MGR_TBL_TYPE_PROF_TCAM_APPS].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_PROF_TCAM_RX[sess_idx];
+ &table_rows->table_rows_PROF_TCAM_RX[0];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_TX]
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_TX]
[CFA_TCAM_MGR_TBL_TYPE_PROF_TCAM_AFM].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_PROF_TCAM_TX[sess_idx];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_TX]
+ &table_rows->table_rows_PROF_TCAM_TX[0];
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_TX]
[CFA_TCAM_MGR_TBL_TYPE_PROF_TCAM_APPS].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_PROF_TCAM_TX[sess_idx];
+ &table_rows->table_rows_PROF_TCAM_TX[0];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_RX]
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_RX]
[CFA_TCAM_MGR_TBL_TYPE_WC_TCAM_AFM].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_WC_TCAM_RX[sess_idx];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_RX]
+ &table_rows->table_rows_WC_TCAM_RX[0];
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_RX]
[CFA_TCAM_MGR_TBL_TYPE_WC_TCAM_APPS].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_WC_TCAM_RX[sess_idx];
+ &table_rows->table_rows_WC_TCAM_RX[0];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_TX]
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_TX]
[CFA_TCAM_MGR_TBL_TYPE_WC_TCAM_AFM].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_WC_TCAM_TX[sess_idx];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_TX]
+ &table_rows->table_rows_WC_TCAM_TX[0];
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_TX]
[CFA_TCAM_MGR_TBL_TYPE_WC_TCAM_APPS].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_WC_TCAM_TX[sess_idx];
+ &table_rows->table_rows_WC_TCAM_TX[0];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_RX]
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_RX]
[CFA_TCAM_MGR_TBL_TYPE_SP_TCAM_AFM].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_SP_TCAM_RX[sess_idx];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_RX]
+ &table_rows->table_rows_SP_TCAM_RX[0];
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_RX]
[CFA_TCAM_MGR_TBL_TYPE_SP_TCAM_APPS].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_SP_TCAM_RX[sess_idx];
+ &table_rows->table_rows_SP_TCAM_RX[0];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_TX]
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_TX]
[CFA_TCAM_MGR_TBL_TYPE_SP_TCAM_AFM].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_SP_TCAM_TX[sess_idx];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_TX]
+ &table_rows->table_rows_SP_TCAM_TX[0];
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_TX]
[CFA_TCAM_MGR_TBL_TYPE_SP_TCAM_APPS].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_SP_TCAM_TX[sess_idx];
+ &table_rows->table_rows_SP_TCAM_TX[0];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_RX]
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_RX]
[CFA_TCAM_MGR_TBL_TYPE_CT_RULE_TCAM_AFM].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_CT_RULE_TCAM_RX[sess_idx];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_RX]
+ &table_rows->table_rows_CT_RULE_TCAM_RX[0];
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_RX]
[CFA_TCAM_MGR_TBL_TYPE_CT_RULE_TCAM_APPS].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_CT_RULE_TCAM_RX[sess_idx];
+ &table_rows->table_rows_CT_RULE_TCAM_RX[0];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_TX]
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_TX]
[CFA_TCAM_MGR_TBL_TYPE_CT_RULE_TCAM_AFM].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_CT_RULE_TCAM_TX[sess_idx];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_TX]
+ &table_rows->table_rows_CT_RULE_TCAM_TX[0];
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_TX]
[CFA_TCAM_MGR_TBL_TYPE_CT_RULE_TCAM_APPS].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_CT_RULE_TCAM_TX[sess_idx];
+ &table_rows->table_rows_CT_RULE_TCAM_TX[0];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_RX]
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_RX]
[CFA_TCAM_MGR_TBL_TYPE_VEB_TCAM_AFM].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_VEB_TCAM_RX[sess_idx];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_RX]
+ &table_rows->table_rows_VEB_TCAM_RX[0];
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_RX]
[CFA_TCAM_MGR_TBL_TYPE_VEB_TCAM_APPS].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_VEB_TCAM_RX[sess_idx];
+ &table_rows->table_rows_VEB_TCAM_RX[0];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_TX]
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_TX]
[CFA_TCAM_MGR_TBL_TYPE_VEB_TCAM_AFM].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_VEB_TCAM_TX[sess_idx];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_TX]
+ &table_rows->table_rows_VEB_TCAM_TX[0];
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_TX]
[CFA_TCAM_MGR_TBL_TYPE_VEB_TCAM_APPS].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_VEB_TCAM_TX[sess_idx];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_RX]
+ &table_rows->table_rows_VEB_TCAM_TX[0];
+
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_RX]
[CFA_TCAM_MGR_TBL_TYPE_WC_TCAM_HIGH_AFM].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_WC_TCAM_RX_HIGH[sess_idx];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_RX]
+ &table_rows->table_rows_WC_TCAM_RX_HIGH[0];
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_RX]
[CFA_TCAM_MGR_TBL_TYPE_WC_TCAM_HIGH_APPS].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_WC_TCAM_RX_HIGH[sess_idx];
+ &table_rows->table_rows_WC_TCAM_RX_HIGH[0];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_TX]
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_TX]
[CFA_TCAM_MGR_TBL_TYPE_WC_TCAM_HIGH_AFM].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_WC_TCAM_TX_HIGH[sess_idx];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_TX]
+ &table_rows->table_rows_WC_TCAM_TX_HIGH[0];
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_TX]
[CFA_TCAM_MGR_TBL_TYPE_WC_TCAM_HIGH_APPS].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_WC_TCAM_TX_HIGH[sess_idx];
+ &table_rows->table_rows_WC_TCAM_TX_HIGH[0];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_RX]
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_RX]
[CFA_TCAM_MGR_TBL_TYPE_WC_TCAM_LOW_AFM].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_WC_TCAM_RX_LOW[sess_idx];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_RX]
+ &table_rows->table_rows_WC_TCAM_RX_LOW[0];
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_RX]
[CFA_TCAM_MGR_TBL_TYPE_WC_TCAM_LOW_APPS].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_WC_TCAM_RX_LOW[sess_idx];
+ &table_rows->table_rows_WC_TCAM_RX_LOW[0];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_TX]
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_TX]
[CFA_TCAM_MGR_TBL_TYPE_WC_TCAM_LOW_AFM].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_WC_TCAM_TX_LOW[sess_idx];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_TX]
+ &table_rows->table_rows_WC_TCAM_TX_LOW[0];
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_TX]
[CFA_TCAM_MGR_TBL_TYPE_WC_TCAM_LOW_APPS].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_WC_TCAM_TX_LOW[sess_idx];
+ &table_rows->table_rows_WC_TCAM_TX_LOW[0];
for (dir = 0; dir < TF_DIR_MAX; dir++) {
for (type = 0; type < CFA_TCAM_MGR_TBL_TYPE_MAX; type++) {
- if (cfa_tcam_mgr_tables[sess_idx][dir][type].row_width >
- max_row_width)
+ if (tcam_mgr_data->cfa_tcam_mgr_tables[dir]
+ [type].row_width >
+ max_row_width)
max_row_width =
- cfa_tcam_mgr_tables[sess_idx][dir][type].row_width;
- if (cfa_tcam_mgr_tables[sess_idx][dir][type].result_size >
- max_result_size)
+ tcam_mgr_data->cfa_tcam_mgr_tables[dir]
+ [type].row_width;
+ if (tcam_mgr_data->cfa_tcam_mgr_tables[dir]
+ [type].result_size >
+ max_result_size)
max_result_size =
- cfa_tcam_mgr_tables[sess_idx][dir][type].result_size;
+ tcam_mgr_data->cfa_tcam_mgr_tables[dir]
+ [type].result_size;
}
}
if (max_row_width != MAX_ROW_WIDTH) {
CFA_TCAM_MGR_LOG(ERR,
- "MAX_ROW_WIDTH (%d) does not match actual "
- "value (%d).\n",
- MAX_ROW_WIDTH,
- max_row_width);
- return -CFA_TCAM_MGR_ERR_CODE(INVAL);
+ "MAX_ROW_WIDTH:%d does not match val:%d\n",
+ MAX_ROW_WIDTH, max_row_width);
+ rc = -CFA_TCAM_MGR_ERR_CODE(INVAL);
+ goto fail;
}
if (max_result_size != MAX_RESULT_SIZE) {
CFA_TCAM_MGR_LOG(ERR,
- "MAX_RESULT_SIZE (%d) does not match actual "
- "value (%d).\n",
- MAX_RESULT_SIZE,
- max_result_size);
- return -CFA_TCAM_MGR_ERR_CODE(INVAL);
+ "MAX_RESULT_SIZE:%d does not match val:%d\n",
+ MAX_RESULT_SIZE, max_result_size);
+ rc = -CFA_TCAM_MGR_ERR_CODE(INVAL);
+ goto fail;
}
+
return 0;
+
+fail:
+ cfa_tcam_mgr_data_free(tfs);
+ return rc;
+}
+
+void cfa_tcam_mgr_uninit_p4(struct tf *tfp)
+{
+ struct tf_session *tfs;
+ int rc;
+
+ rc = tf_session_get_session_internal(tfp, &tfs);
+ if (rc)
+ return;
+
+ cfa_tcam_mgr_data_free(tfs);
}
/* HW OP declarations begin here */
@@ -776,133 +873,182 @@ struct cfa_tcam_mgr_TCAM_row_data {
(CT_RULE_TCAM_TX_MAX_SLICES * CT_RULE_TCAM_TX_NUM_ROWS)
#define VEB_TX_MAX_ROWS (VEB_TCAM_TX_MAX_SLICES * VEB_TCAM_TX_NUM_ROWS)
-static int cfa_tcam_mgr_max_rows[TF_TCAM_TBL_TYPE_MAX] = {
- L2_CTXT_RX_MAX_ROWS,
- L2_CTXT_RX_MAX_ROWS,
- PROF_RX_MAX_ROWS,
- WC_RX_MAX_ROWS,
- SP_RX_MAX_ROWS,
- CT_RULE_RX_MAX_ROWS,
- VEB_RX_MAX_ROWS,
- WC_RX_MAX_ROWS,
- WC_RX_MAX_ROWS
+struct cfa_tcam_mgr_rx_row_data {
+ struct cfa_tcam_mgr_TCAM_row_data
+ cfa_tcam_mgr_L2_CTXT_TCAM_RX_row_data[L2_CTXT_RX_MAX_ROWS + 1];
+ struct cfa_tcam_mgr_TCAM_row_data
+ cfa_tcam_mgr_PROF_TCAM_RX_row_data[PROF_RX_MAX_ROWS + 1];
+ struct cfa_tcam_mgr_TCAM_row_data
+ cfa_tcam_mgr_WC_TCAM_RX_row_data[WC_RX_MAX_ROWS + 1];
+ struct cfa_tcam_mgr_TCAM_row_data
+ cfa_tcam_mgr_SP_TCAM_RX_row_data[SP_RX_MAX_ROWS + 1];
+ struct cfa_tcam_mgr_TCAM_row_data
+ cfa_tcam_mgr_CT_RULE_TCAM_RX_row_data[CT_RULE_RX_MAX_ROWS + 1];
+ struct cfa_tcam_mgr_TCAM_row_data
+ cfa_tcam_mgr_VEB_TCAM_RX_row_data[VEB_RX_MAX_ROWS + 1];
};
-static struct cfa_tcam_mgr_TCAM_row_data
- cfa_tcam_mgr_L2_CTXT_TCAM_RX_row_data[TF_TCAM_MAX_SESSIONS][L2_CTXT_RX_MAX_ROWS];
-static struct cfa_tcam_mgr_TCAM_row_data
- cfa_tcam_mgr_PROF_TCAM_RX_row_data[TF_TCAM_MAX_SESSIONS][PROF_RX_MAX_ROWS];
-static struct cfa_tcam_mgr_TCAM_row_data
- cfa_tcam_mgr_WC_TCAM_RX_row_data[TF_TCAM_MAX_SESSIONS][WC_RX_MAX_ROWS];
-static struct cfa_tcam_mgr_TCAM_row_data
- cfa_tcam_mgr_SP_TCAM_RX_row_data[TF_TCAM_MAX_SESSIONS][SP_RX_MAX_ROWS];
-static struct cfa_tcam_mgr_TCAM_row_data
- cfa_tcam_mgr_CT_RULE_TCAM_RX_row_data[TF_TCAM_MAX_SESSIONS][CT_RULE_RX_MAX_ROWS];
-static struct cfa_tcam_mgr_TCAM_row_data
- cfa_tcam_mgr_VEB_TCAM_RX_row_data[TF_TCAM_MAX_SESSIONS][VEB_RX_MAX_ROWS];
-static struct cfa_tcam_mgr_TCAM_row_data
- cfa_tcam_mgr_WC_TCAM_RX_row_data[TF_TCAM_MAX_SESSIONS][WC_RX_MAX_ROWS];
-
-static struct cfa_tcam_mgr_TCAM_row_data
- cfa_tcam_mgr_L2_CTXT_TCAM_TX_row_data[TF_TCAM_MAX_SESSIONS][L2_CTXT_TX_MAX_ROWS];
-static struct cfa_tcam_mgr_TCAM_row_data
- cfa_tcam_mgr_PROF_TCAM_TX_row_data[TF_TCAM_MAX_SESSIONS][PROF_TX_MAX_ROWS];
-static struct cfa_tcam_mgr_TCAM_row_data
- cfa_tcam_mgr_WC_TCAM_TX_row_data[TF_TCAM_MAX_SESSIONS][WC_TX_MAX_ROWS];
-static struct cfa_tcam_mgr_TCAM_row_data
- cfa_tcam_mgr_SP_TCAM_TX_row_data[TF_TCAM_MAX_SESSIONS][SP_TX_MAX_ROWS];
-static struct cfa_tcam_mgr_TCAM_row_data
- cfa_tcam_mgr_CT_RULE_TCAM_TX_row_data[TF_TCAM_MAX_SESSIONS][CT_RULE_TX_MAX_ROWS];
-static struct cfa_tcam_mgr_TCAM_row_data
- cfa_tcam_mgr_VEB_TCAM_TX_row_data[TF_TCAM_MAX_SESSIONS][VEB_TX_MAX_ROWS];
-static struct cfa_tcam_mgr_TCAM_row_data
- cfa_tcam_mgr_WC_TCAM_TX_row_data[TF_TCAM_MAX_SESSIONS][WC_TX_MAX_ROWS];
-
-static struct cfa_tcam_mgr_TCAM_row_data *
-row_tables[TF_DIR_MAX][TF_TCAM_TBL_TYPE_MAX] = {
- {
- cfa_tcam_mgr_L2_CTXT_TCAM_RX_row_data[0],
- cfa_tcam_mgr_L2_CTXT_TCAM_RX_row_data[0],
- cfa_tcam_mgr_PROF_TCAM_RX_row_data[0],
- cfa_tcam_mgr_WC_TCAM_RX_row_data[0],
- cfa_tcam_mgr_SP_TCAM_RX_row_data[0],
- cfa_tcam_mgr_CT_RULE_TCAM_RX_row_data[0],
- cfa_tcam_mgr_VEB_TCAM_RX_row_data[0],
- cfa_tcam_mgr_WC_TCAM_RX_row_data[0],
- cfa_tcam_mgr_WC_TCAM_RX_row_data[0],
- },
- {
- cfa_tcam_mgr_L2_CTXT_TCAM_TX_row_data[0],
- cfa_tcam_mgr_L2_CTXT_TCAM_TX_row_data[0],
- cfa_tcam_mgr_PROF_TCAM_TX_row_data[0],
- cfa_tcam_mgr_WC_TCAM_TX_row_data[0],
- cfa_tcam_mgr_SP_TCAM_TX_row_data[0],
- cfa_tcam_mgr_CT_RULE_TCAM_TX_row_data[0],
- cfa_tcam_mgr_VEB_TCAM_TX_row_data[0],
- cfa_tcam_mgr_WC_TCAM_TX_row_data[0],
- cfa_tcam_mgr_WC_TCAM_TX_row_data[0],
- }
+
+struct cfa_tcam_mgr_tx_row_data {
+ struct cfa_tcam_mgr_TCAM_row_data
+ cfa_tcam_mgr_L2_CTXT_TCAM_TX_row_data[L2_CTXT_TX_MAX_ROWS + 1];
+ struct cfa_tcam_mgr_TCAM_row_data
+ cfa_tcam_mgr_PROF_TCAM_TX_row_data[PROF_TX_MAX_ROWS + 1];
+ struct cfa_tcam_mgr_TCAM_row_data
+ cfa_tcam_mgr_WC_TCAM_TX_row_data[WC_TX_MAX_ROWS + 1];
+ struct cfa_tcam_mgr_TCAM_row_data
+ cfa_tcam_mgr_SP_TCAM_TX_row_data[SP_TX_MAX_ROWS + 1];
+ struct cfa_tcam_mgr_TCAM_row_data
+ cfa_tcam_mgr_CT_RULE_TCAM_TX_row_data[CT_RULE_TX_MAX_ROWS + 1];
+ struct cfa_tcam_mgr_TCAM_row_data
+ cfa_tcam_mgr_VEB_TCAM_TX_row_data[VEB_TX_MAX_ROWS + 1];
};
-static int cfa_tcam_mgr_get_max_rows(enum tf_tcam_tbl_type type)
+#define TF_TCAM_L2_CTX_HI TF_TCAM_TBL_TYPE_L2_CTXT_TCAM_HIGH
+#define TF_TCAM_L2_CTX_LO TF_TCAM_TBL_TYPE_L2_CTXT_TCAM_LOW
+#define TF_TCAM_PROF TF_TCAM_TBL_TYPE_PROF_TCAM
+#define TF_TCAM_WC TF_TCAM_TBL_TYPE_WC_TCAM
+#define TF_TCAM_SP TF_TCAM_TBL_TYPE_SP_TCAM
+#define TF_TCAM_CT TF_TCAM_TBL_TYPE_CT_RULE_TCAM
+#define TF_TCAM_VEB TF_TCAM_TBL_TYPE_VEB_TCAM
+#define TF_TCAM_WC_HI TF_TCAM_TBL_TYPE_WC_TCAM_HIGH
+#define TF_TCAM_WC_LO TF_TCAM_TBL_TYPE_WC_TCAM_LOW
+
+static int cfa_tcam_mgr_row_data_alloc(struct cfa_tcam_mgr_data *tcam_mgr_data)
{
- if (type >= TF_TCAM_TBL_TYPE_MAX)
- assert(0);
- else
- return cfa_tcam_mgr_max_rows[type];
+ struct cfa_tcam_mgr_rx_row_data *rx_row_data;
+ struct cfa_tcam_mgr_tx_row_data *tx_row_data;
+ struct tfp_calloc_parms cparms;
+ int rc;
+
+ cparms.nitems = 1;
+ cparms.size = sizeof(struct cfa_tcam_mgr_rx_row_data);
+ cparms.alignment = 0;
+ rc = tfp_calloc(&cparms);
+ if (rc) {
+ /* Log error */
+ TFP_DRV_LOG(ERR,
+ "Failed to allocate rx_row_data, rc:%s\n",
+ strerror(-rc));
+ return -ENOMEM;
+ }
+
+ rx_row_data = (struct cfa_tcam_mgr_rx_row_data *)cparms.mem_va;
+
+ cparms.nitems = 1;
+ cparms.size = sizeof(struct cfa_tcam_mgr_tx_row_data);
+ cparms.alignment = 0;
+ rc = tfp_calloc(&cparms);
+ if (rc) {
+ /* Log error */
+ TFP_DRV_LOG(ERR,
+ "Failed to allocate tx_row_data, rc:%s\n",
+ strerror(-rc));
+ tfp_free(rx_row_data);
+ return -ENOMEM;
+ }
+
+ tx_row_data = (struct cfa_tcam_mgr_tx_row_data *)cparms.mem_va;
+
+ tcam_mgr_data->rx_row_data = rx_row_data;
+ tcam_mgr_data->tx_row_data = tx_row_data;
+
+ tcam_mgr_data->row_tables[TF_DIR_RX][TF_TCAM_L2_CTX_HI] =
+ &rx_row_data->cfa_tcam_mgr_L2_CTXT_TCAM_RX_row_data[0];
+ tcam_mgr_data->row_tables[TF_DIR_RX][TF_TCAM_L2_CTX_LO] =
+ &rx_row_data->cfa_tcam_mgr_L2_CTXT_TCAM_RX_row_data[0];
+ tcam_mgr_data->row_tables[TF_DIR_RX][TF_TCAM_PROF] =
+ &rx_row_data->cfa_tcam_mgr_PROF_TCAM_RX_row_data[0];
+ tcam_mgr_data->row_tables[TF_DIR_RX][TF_TCAM_WC] =
+ &rx_row_data->cfa_tcam_mgr_WC_TCAM_RX_row_data[0];
+ tcam_mgr_data->row_tables[TF_DIR_RX][TF_TCAM_SP] =
+ &rx_row_data->cfa_tcam_mgr_SP_TCAM_RX_row_data[0];
+ tcam_mgr_data->row_tables[TF_DIR_RX][TF_TCAM_CT] =
+ &rx_row_data->cfa_tcam_mgr_CT_RULE_TCAM_RX_row_data[0];
+ tcam_mgr_data->row_tables[TF_DIR_RX][TF_TCAM_VEB] =
+ &rx_row_data->cfa_tcam_mgr_VEB_TCAM_RX_row_data[0];
+ tcam_mgr_data->row_tables[TF_DIR_RX][TF_TCAM_WC_HI] =
+ &rx_row_data->cfa_tcam_mgr_WC_TCAM_RX_row_data[0];
+ tcam_mgr_data->row_tables[TF_DIR_RX][TF_TCAM_WC_LO] =
+ &rx_row_data->cfa_tcam_mgr_WC_TCAM_RX_row_data[0];
+
+ tcam_mgr_data->row_tables[TF_DIR_TX][TF_TCAM_L2_CTX_HI] =
+ &tx_row_data->cfa_tcam_mgr_L2_CTXT_TCAM_TX_row_data[0];
+ tcam_mgr_data->row_tables[TF_DIR_TX][TF_TCAM_L2_CTX_LO] =
+ &tx_row_data->cfa_tcam_mgr_L2_CTXT_TCAM_TX_row_data[0];
+ tcam_mgr_data->row_tables[TF_DIR_TX][TF_TCAM_PROF] =
+ &tx_row_data->cfa_tcam_mgr_PROF_TCAM_TX_row_data[0];
+ tcam_mgr_data->row_tables[TF_DIR_TX][TF_TCAM_WC] =
+ &tx_row_data->cfa_tcam_mgr_WC_TCAM_TX_row_data[0];
+ tcam_mgr_data->row_tables[TF_DIR_TX][TF_TCAM_SP] =
+ &tx_row_data->cfa_tcam_mgr_SP_TCAM_TX_row_data[0];
+ tcam_mgr_data->row_tables[TF_DIR_TX][TF_TCAM_CT] =
+ &tx_row_data->cfa_tcam_mgr_CT_RULE_TCAM_TX_row_data[0];
+ tcam_mgr_data->row_tables[TF_DIR_TX][TF_TCAM_VEB] =
+ &tx_row_data->cfa_tcam_mgr_VEB_TCAM_TX_row_data[0];
+ tcam_mgr_data->row_tables[TF_DIR_TX][TF_TCAM_WC_HI] =
+ &tx_row_data->cfa_tcam_mgr_WC_TCAM_TX_row_data[0];
+ tcam_mgr_data->row_tables[TF_DIR_TX][TF_TCAM_WC_LO] =
+ &tx_row_data->cfa_tcam_mgr_WC_TCAM_TX_row_data[0];
+
+ return 0;
}
-static int cfa_tcam_mgr_hwop_set(int sess_idx,
+static void cfa_tcam_mgr_row_data_free(struct cfa_tcam_mgr_data
+ *tcam_mgr_data)
+{
+ tfp_free(tcam_mgr_data->rx_row_data);
+ tfp_free(tcam_mgr_data->tx_row_data);
+}
+
+static int cfa_tcam_mgr_hwop_set(struct cfa_tcam_mgr_data *tcam_mgr_data,
struct cfa_tcam_mgr_set_parms *parms, int row,
int slice, int max_slices)
{
struct cfa_tcam_mgr_TCAM_row_data *this_table;
struct cfa_tcam_mgr_TCAM_row_data *this_row;
- this_table = row_tables[parms->dir]
+
+ this_table = tcam_mgr_data->row_tables[parms->dir]
[cfa_tcam_mgr_get_phys_table_type(parms->type)];
- this_table += (sess_idx *
- cfa_tcam_mgr_get_max_rows(cfa_tcam_mgr_get_phys_table_type(parms->type)));
this_row = &this_table[row * max_slices + slice];
this_row->key_size = parms->key_size;
memcpy(&this_row->key, parms->key, parms->key_size);
memcpy(&this_row->mask, parms->mask, parms->key_size);
this_row->result_size = parms->result_size;
- if (parms->result != ((void *)0))
+ if (parms->result)
memcpy(&this_row->result, parms->result, parms->result_size);
return 0;
};
-static int cfa_tcam_mgr_hwop_get(int sess_idx,
+static int cfa_tcam_mgr_hwop_get(struct cfa_tcam_mgr_data *tcam_mgr_data,
struct cfa_tcam_mgr_get_parms *parms, int row,
int slice, int max_slices)
{
struct cfa_tcam_mgr_TCAM_row_data *this_table;
struct cfa_tcam_mgr_TCAM_row_data *this_row;
- this_table = row_tables[parms->dir]
+
+ this_table = tcam_mgr_data->row_tables[parms->dir]
[cfa_tcam_mgr_get_phys_table_type(parms->type)];
- this_table += (sess_idx *
- cfa_tcam_mgr_get_max_rows(cfa_tcam_mgr_get_phys_table_type(parms->type)));
this_row = &this_table[row * max_slices + slice];
parms->key_size = this_row->key_size;
parms->result_size = this_row->result_size;
- if (parms->key != ((void *)0))
+ if (parms->key)
memcpy(parms->key, &this_row->key, parms->key_size);
- if (parms->mask != ((void *)0))
+ if (parms->mask)
memcpy(parms->mask, &this_row->mask, parms->key_size);
- if (parms->result != ((void *)0))
+ if (parms->result)
memcpy(parms->result, &this_row->result, parms->result_size);
return 0;
};
-static int cfa_tcam_mgr_hwop_free(int sess_idx,
+static int cfa_tcam_mgr_hwop_free(struct cfa_tcam_mgr_data *tcam_mgr_data,
struct cfa_tcam_mgr_free_parms *parms,
int row, int slice, int max_slices)
{
struct cfa_tcam_mgr_TCAM_row_data *this_table;
struct cfa_tcam_mgr_TCAM_row_data *this_row;
- this_table = row_tables[parms->dir]
+
+ this_table = tcam_mgr_data->row_tables[parms->dir]
[cfa_tcam_mgr_get_phys_table_type(parms->type)];
- this_table += (sess_idx *
- cfa_tcam_mgr_get_max_rows(cfa_tcam_mgr_get_phys_table_type(parms->type)));
this_row = &this_table[row * max_slices + slice];
memset(&this_row->key, 0, sizeof(this_row->key));
memset(&this_row->mask, 0, sizeof(this_row->mask));
@@ -1,5 +1,5 @@
/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2021-2023 Broadcom
+ * Copyright(c) 2021-2024 Broadcom
* All rights reserved.
*/
@@ -7,13 +7,12 @@
#define CFA_TCAM_MGR_P4_H
#include "cfa_tcam_mgr_device.h"
-#include "cfa_tcam_mgr_sbmp.h"
int
-cfa_tcam_mgr_init_p4(int sess_idx, struct cfa_tcam_mgr_entry_data **global_entry_data);
+cfa_tcam_mgr_init_p4(struct tf *tfp);
-int
-cfa_tcam_mgr_sess_table_get_p4(int sess_idx, struct sbmp **session_bmp);
+void
+cfa_tcam_mgr_uninit_p4(struct tf *tfp);
int
cfa_tcam_mgr_hwops_get_funcs_p4(struct cfa_tcam_mgr_hwops_funcs *hwop_funcs);
@@ -1,5 +1,5 @@
/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2021-2023 Broadcom
+ * Copyright(c) 2021-2024 Broadcom
* All rights reserved.
*/
@@ -12,6 +12,7 @@
#include "tfp.h"
#include "assert.h"
#include "tf_util.h"
+#include "tf_session.h"
/*
* Sizings of the TCAMs on P5
@@ -126,38 +127,40 @@
* Array sizes have 1 added to avoid zero length arrays.
*/
-static struct cfa_tcam_mgr_table_rows_1
- cfa_tcam_mgr_table_rows_L2_CTXT_TCAM_RX[TF_TCAM_MAX_SESSIONS][L2_CTXT_TCAM_RX_NUM_ROWS + 1];
-static struct cfa_tcam_mgr_table_rows_1
- cfa_tcam_mgr_table_rows_L2_CTXT_TCAM_TX[TF_TCAM_MAX_SESSIONS][L2_CTXT_TCAM_TX_NUM_ROWS + 1];
-static struct cfa_tcam_mgr_table_rows_1
- cfa_tcam_mgr_table_rows_PROF_TCAM_RX[TF_TCAM_MAX_SESSIONS][PROF_TCAM_RX_NUM_ROWS + 1];
-static struct cfa_tcam_mgr_table_rows_1
- cfa_tcam_mgr_table_rows_PROF_TCAM_TX[TF_TCAM_MAX_SESSIONS][PROF_TCAM_TX_NUM_ROWS + 1];
-static struct cfa_tcam_mgr_table_rows_4
- cfa_tcam_mgr_table_rows_WC_TCAM_RX[TF_TCAM_MAX_SESSIONS][WC_TCAM_RX_NUM_ROWS + 1];
-static struct cfa_tcam_mgr_table_rows_4
- cfa_tcam_mgr_table_rows_WC_TCAM_TX[TF_TCAM_MAX_SESSIONS][WC_TCAM_TX_NUM_ROWS + 1];
-static struct cfa_tcam_mgr_table_rows_1
- cfa_tcam_mgr_table_rows_SP_TCAM_RX[TF_TCAM_MAX_SESSIONS][SP_TCAM_RX_NUM_ROWS + 1];
-static struct cfa_tcam_mgr_table_rows_1
- cfa_tcam_mgr_table_rows_SP_TCAM_TX[TF_TCAM_MAX_SESSIONS][SP_TCAM_TX_NUM_ROWS + 1];
-static struct cfa_tcam_mgr_table_rows_1
- cfa_tcam_mgr_table_rows_CT_RULE_TCAM_RX[TF_TCAM_MAX_SESSIONS][CT_RULE_TCAM_RX_NUM_ROWS + 1];
-static struct cfa_tcam_mgr_table_rows_1
- cfa_tcam_mgr_table_rows_CT_RULE_TCAM_TX[TF_TCAM_MAX_SESSIONS][CT_RULE_TCAM_TX_NUM_ROWS + 1];
-static struct cfa_tcam_mgr_table_rows_1
- cfa_tcam_mgr_table_rows_VEB_TCAM_RX[TF_TCAM_MAX_SESSIONS][VEB_TCAM_RX_NUM_ROWS + 1];
-static struct cfa_tcam_mgr_table_rows_1
- cfa_tcam_mgr_table_rows_VEB_TCAM_TX[TF_TCAM_MAX_SESSIONS][VEB_TCAM_TX_NUM_ROWS + 1];
-static struct cfa_tcam_mgr_table_rows_4
- cfa_tcam_mgr_table_rows_WC_TCAM_RX_HIGH[TF_TCAM_MAX_SESSIONS][WC_TCAM_RX_NUM_ROWS + 1];
-static struct cfa_tcam_mgr_table_rows_4
- cfa_tcam_mgr_table_rows_WC_TCAM_RX_LOW[TF_TCAM_MAX_SESSIONS][WC_TCAM_RX_NUM_ROWS + 1];
-static struct cfa_tcam_mgr_table_rows_4
- cfa_tcam_mgr_table_rows_WC_TCAM_TX_HIGH[TF_TCAM_MAX_SESSIONS][WC_TCAM_TX_NUM_ROWS + 1];
-static struct cfa_tcam_mgr_table_rows_4
- cfa_tcam_mgr_table_rows_WC_TCAM_TX_LOW[TF_TCAM_MAX_SESSIONS][WC_TCAM_TX_NUM_ROWS + 1];
+struct cfa_tcam_mgr_table_rows_p58 {
+ struct cfa_tcam_mgr_table_rows_1
+ table_rows_L2_CTXT_TCAM_RX[L2_CTXT_TCAM_RX_NUM_ROWS + 1];
+ struct cfa_tcam_mgr_table_rows_1
+ table_rows_L2_CTXT_TCAM_TX[L2_CTXT_TCAM_TX_NUM_ROWS + 1];
+ struct cfa_tcam_mgr_table_rows_1
+ table_rows_PROF_TCAM_RX[PROF_TCAM_RX_NUM_ROWS + 1];
+ struct cfa_tcam_mgr_table_rows_1
+ table_rows_PROF_TCAM_TX[PROF_TCAM_TX_NUM_ROWS + 1];
+ struct cfa_tcam_mgr_table_rows_4
+ table_rows_WC_TCAM_RX[WC_TCAM_RX_NUM_ROWS + 1];
+ struct cfa_tcam_mgr_table_rows_4
+ table_rows_WC_TCAM_TX[WC_TCAM_TX_NUM_ROWS + 1];
+ struct cfa_tcam_mgr_table_rows_1
+ table_rows_SP_TCAM_RX[SP_TCAM_RX_NUM_ROWS + 1];
+ struct cfa_tcam_mgr_table_rows_1
+ table_rows_SP_TCAM_TX[SP_TCAM_TX_NUM_ROWS + 1];
+ struct cfa_tcam_mgr_table_rows_1
+ table_rows_CT_RULE_TCAM_RX[CT_RULE_TCAM_RX_NUM_ROWS + 1];
+ struct cfa_tcam_mgr_table_rows_1
+ table_rows_CT_RULE_TCAM_TX[CT_RULE_TCAM_TX_NUM_ROWS + 1];
+ struct cfa_tcam_mgr_table_rows_1
+ table_rows_VEB_TCAM_RX[VEB_TCAM_RX_NUM_ROWS + 1];
+ struct cfa_tcam_mgr_table_rows_1
+ table_rows_VEB_TCAM_TX[VEB_TCAM_TX_NUM_ROWS + 1];
+ struct cfa_tcam_mgr_table_rows_4
+ table_rows_WC_TCAM_RX_HIGH[WC_TCAM_RX_NUM_ROWS + 1];
+ struct cfa_tcam_mgr_table_rows_4
+ table_rows_WC_TCAM_RX_LOW[WC_TCAM_RX_NUM_ROWS + 1];
+ struct cfa_tcam_mgr_table_rows_4
+ table_rows_WC_TCAM_TX_HIGH[WC_TCAM_TX_NUM_ROWS + 1];
+ struct cfa_tcam_mgr_table_rows_4
+ table_rows_WC_TCAM_TX_LOW[WC_TCAM_TX_NUM_ROWS + 1];
+};
struct cfa_tcam_mgr_table_data
cfa_tcam_mgr_tables_p58[TF_DIR_MAX][CFA_TCAM_MGR_TBL_TYPE_MAX] = {
@@ -177,7 +180,7 @@ cfa_tcam_mgr_tables_p58[TF_DIR_MAX][CFA_TCAM_MGR_TBL_TYPE_MAX] = {
.row_width = L2_CTXT_TCAM_RX_ROW_WIDTH,
.num_rows = L2_CTXT_TCAM_RX_NUM_ROWS,
.start_row = 0,
- .end_row = (L2_CTXT_TCAM_RX_NUM_ROWS / 2) - 1,
+ .end_row = L2_CTXT_TCAM_RX_APP_HI_END,
.max_entries = (L2_CTXT_TCAM_RX_MAX_ENTRIES / 2),
.result_size = L2_CTXT_TCAM_RX_RESULT_SIZE,
.hcapi_type = CFA_RESOURCE_TYPE_P58_L2_CTXT_TCAM_HIGH,
@@ -196,7 +199,7 @@ cfa_tcam_mgr_tables_p58[TF_DIR_MAX][CFA_TCAM_MGR_TBL_TYPE_MAX] = {
.max_slices = L2_CTXT_TCAM_RX_MAX_SLICES,
.row_width = L2_CTXT_TCAM_RX_ROW_WIDTH,
.num_rows = L2_CTXT_TCAM_RX_NUM_ROWS,
- .start_row = (L2_CTXT_TCAM_RX_NUM_ROWS / 2),
+ .start_row = L2_CTXT_TCAM_RX_APP_LO_START,
.end_row = L2_CTXT_TCAM_RX_NUM_ROWS - 1,
.max_entries = (L2_CTXT_TCAM_RX_MAX_ENTRIES / 2),
.result_size = L2_CTXT_TCAM_RX_RESULT_SIZE,
@@ -275,7 +278,8 @@ cfa_tcam_mgr_tables_p58[TF_DIR_MAX][CFA_TCAM_MGR_TBL_TYPE_MAX] = {
.num_rows = CT_RULE_TCAM_RX_NUM_ROWS,
.start_row = 0,
#if CT_RULE_TCAM_RX_NUM_ROWS > 0
- .end_row = CT_RULE_TCAM_RX_NUM_ROWS - 1,
+ .end_row =
+ TCAM_SET_END_ROW(CT_RULE_TCAM_RX_NUM_ROWS),
#else
.end_row = CT_RULE_TCAM_RX_NUM_ROWS,
#endif
@@ -298,7 +302,7 @@ cfa_tcam_mgr_tables_p58[TF_DIR_MAX][CFA_TCAM_MGR_TBL_TYPE_MAX] = {
.num_rows = VEB_TCAM_RX_NUM_ROWS,
.start_row = 0,
#if VEB_TCAM_RX_NUM_ROWS > 0
- .end_row = VEB_TCAM_RX_NUM_ROWS - 1,
+ .end_row = TCAM_SET_END_ROW(VEB_TCAM_RX_NUM_ROWS),
#else
.end_row = VEB_TCAM_RX_NUM_ROWS,
#endif
@@ -363,7 +367,7 @@ cfa_tcam_mgr_tables_p58[TF_DIR_MAX][CFA_TCAM_MGR_TBL_TYPE_MAX] = {
.row_width = L2_CTXT_TCAM_TX_ROW_WIDTH,
.num_rows = L2_CTXT_TCAM_TX_NUM_ROWS,
.start_row = 0,
- .end_row = (L2_CTXT_TCAM_TX_NUM_ROWS / 2) - 1,
+ .end_row = L2_CTXT_TCAM_TX_APP_HI_END,
.max_entries = (L2_CTXT_TCAM_TX_MAX_ENTRIES / 2),
.result_size = L2_CTXT_TCAM_TX_RESULT_SIZE,
.hcapi_type = CFA_RESOURCE_TYPE_P58_L2_CTXT_TCAM_HIGH,
@@ -382,7 +386,7 @@ cfa_tcam_mgr_tables_p58[TF_DIR_MAX][CFA_TCAM_MGR_TBL_TYPE_MAX] = {
.max_slices = L2_CTXT_TCAM_TX_MAX_SLICES,
.row_width = L2_CTXT_TCAM_TX_ROW_WIDTH,
.num_rows = L2_CTXT_TCAM_TX_NUM_ROWS,
- .start_row = (L2_CTXT_TCAM_TX_NUM_ROWS / 2),
+ .start_row = L2_CTXT_TCAM_TX_APP_LO_START,
.end_row = L2_CTXT_TCAM_TX_NUM_ROWS - 1,
.max_entries = (L2_CTXT_TCAM_TX_MAX_ENTRIES / 2),
.result_size = L2_CTXT_TCAM_TX_RESULT_SIZE,
@@ -461,7 +465,8 @@ cfa_tcam_mgr_tables_p58[TF_DIR_MAX][CFA_TCAM_MGR_TBL_TYPE_MAX] = {
.num_rows = CT_RULE_TCAM_TX_NUM_ROWS,
.start_row = 0,
#if CT_RULE_TCAM_TX_NUM_ROWS > 0
- .end_row = CT_RULE_TCAM_TX_NUM_ROWS - 1,
+ .end_row =
+ TCAM_SET_END_ROW(CT_RULE_TCAM_TX_NUM_ROWS),
#else
.end_row = CT_RULE_TCAM_TX_NUM_ROWS,
#endif
@@ -531,222 +536,305 @@ cfa_tcam_mgr_tables_p58[TF_DIR_MAX][CFA_TCAM_MGR_TBL_TYPE_MAX] = {
},
};
-static struct cfa_tcam_mgr_entry_data entry_data_p58[TF_TCAM_MAX_SESSIONS][TF_TCAM_MAX_ENTRIES];
-
-static struct sbmp session_bmp_p58[TF_TCAM_MAX_SESSIONS][TF_TCAM_MAX_ENTRIES];
+static int cfa_tcam_mgr_row_data_alloc(struct cfa_tcam_mgr_data *tcam_mgr_data);
+static void cfa_tcam_mgr_row_data_free(struct cfa_tcam_mgr_data *tcam_mgr_data);
-int
-cfa_tcam_mgr_sess_table_get_p58(int sess_idx, struct sbmp **session_bmp)
+static void cfa_tcam_mgr_data_free(struct tf_session *tfs)
{
- *session_bmp = session_bmp_p58[sess_idx];
- return 0;
+ struct cfa_tcam_mgr_data *tcam_mgr_data = tfs->tcam_mgr_handle;
+
+ if (!tcam_mgr_data)
+ return;
+
+ tfp_free(tcam_mgr_data->table_rows);
+ tfp_free(tcam_mgr_data->entry_data);
+ tfp_free(tcam_mgr_data->session_bmp);
+ cfa_tcam_mgr_row_data_free(tcam_mgr_data);
+
+ tfp_free(tcam_mgr_data);
+ tfs->tcam_mgr_handle = NULL;
}
int
-cfa_tcam_mgr_init_p58(int sess_idx, struct cfa_tcam_mgr_entry_data **global_entry_data)
+cfa_tcam_mgr_init_p58(struct tf *tfp)
{
- int max_row_width = 0;
+ struct cfa_tcam_mgr_table_rows_p58 *table_rows;
+ struct cfa_tcam_mgr_data *tcam_mgr_data;
+ struct tfp_calloc_parms cparms;
int max_result_size = 0;
+ struct tf_session *tfs;
+ int max_row_width = 0;
int dir, type;
+ int rc;
+
+ rc = tf_session_get_session_internal(tfp, &tfs);
+ if (rc)
+ return rc;
+
+ cparms.nitems = 1;
+ cparms.size = sizeof(struct cfa_tcam_mgr_data);
+ cparms.alignment = 0;
+ rc = tfp_calloc(&cparms);
+ if (rc) {
+ /* Log error */
+ TFP_DRV_LOG(ERR,
+ "Failed to allocate block, rc:%s\n",
+ strerror(-rc));
+ return rc;
+ }
+ tcam_mgr_data = (struct cfa_tcam_mgr_data *)cparms.mem_va;
+ tfs->tcam_mgr_handle = tcam_mgr_data;
+
+ cparms.nitems = 1;
+ cparms.size = sizeof(struct cfa_tcam_mgr_table_rows_p58);
+ cparms.alignment = 0;
+ rc = tfp_calloc(&cparms);
+ if (rc) {
+ /* Log error */
+ TFP_DRV_LOG(ERR,
+ "Failed to allocate block, rc:%s\n",
+ strerror(-rc));
+ tfp_free(tfs->tcam_mgr_handle);
+ tfs->tcam_mgr_handle = NULL;
+ return rc;
+ }
+ table_rows = (struct cfa_tcam_mgr_table_rows_p58 *)cparms.mem_va;
+ tcam_mgr_data->table_rows = table_rows;
- *global_entry_data = entry_data_p58[sess_idx];
+ cparms.nitems = TF_TCAM_MAX_ENTRIES;
+ cparms.size = sizeof(struct cfa_tcam_mgr_entry_data);
+ cparms.alignment = 0;
+ rc = tfp_calloc(&cparms);
+ if (rc) {
+ /* Log error */
+ TFP_DRV_LOG(ERR,
+ "Failed to allocate block, rc:%s\n",
+ strerror(-rc));
+ goto fail;
+ }
+ tcam_mgr_data->entry_data =
+ (struct cfa_tcam_mgr_entry_data *)cparms.mem_va;
+
+ rc = cfa_tcam_mgr_row_data_alloc(tcam_mgr_data);
+ if (rc)
+ goto fail;
- memcpy(&cfa_tcam_mgr_tables[sess_idx],
+ memcpy(tcam_mgr_data->cfa_tcam_mgr_tables,
&cfa_tcam_mgr_tables_p58,
- sizeof(cfa_tcam_mgr_tables[sess_idx]));
+ sizeof(tcam_mgr_data->cfa_tcam_mgr_tables));
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_RX]
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_RX]
[CFA_TCAM_MGR_TBL_TYPE_L2_CTXT_TCAM_HIGH_AFM].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_L2_CTXT_TCAM_RX[sess_idx];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_RX]
+ &table_rows->table_rows_L2_CTXT_TCAM_RX[0];
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_RX]
[CFA_TCAM_MGR_TBL_TYPE_L2_CTXT_TCAM_HIGH_APPS].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_L2_CTXT_TCAM_RX[sess_idx];
+ &table_rows->table_rows_L2_CTXT_TCAM_RX[0];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_TX]
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_TX]
[CFA_TCAM_MGR_TBL_TYPE_L2_CTXT_TCAM_HIGH_AFM].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_L2_CTXT_TCAM_TX[sess_idx];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_TX]
+ &table_rows->table_rows_L2_CTXT_TCAM_TX[0];
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_TX]
[CFA_TCAM_MGR_TBL_TYPE_L2_CTXT_TCAM_HIGH_APPS].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_L2_CTXT_TCAM_TX[sess_idx];
+ &table_rows->table_rows_L2_CTXT_TCAM_TX[0];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_RX]
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_RX]
[CFA_TCAM_MGR_TBL_TYPE_L2_CTXT_TCAM_LOW_AFM].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_L2_CTXT_TCAM_RX[sess_idx];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_RX]
+ &table_rows->table_rows_L2_CTXT_TCAM_RX[0];
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_RX]
[CFA_TCAM_MGR_TBL_TYPE_L2_CTXT_TCAM_LOW_APPS].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_L2_CTXT_TCAM_RX[sess_idx];
+ &table_rows->table_rows_L2_CTXT_TCAM_RX[0];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_TX]
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_TX]
[CFA_TCAM_MGR_TBL_TYPE_L2_CTXT_TCAM_LOW_AFM].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_L2_CTXT_TCAM_TX[sess_idx];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_TX]
+ &table_rows->table_rows_L2_CTXT_TCAM_TX[0];
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_TX]
[CFA_TCAM_MGR_TBL_TYPE_L2_CTXT_TCAM_LOW_APPS].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_L2_CTXT_TCAM_TX[sess_idx];
+ &table_rows->table_rows_L2_CTXT_TCAM_TX[0];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_RX]
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_RX]
[CFA_TCAM_MGR_TBL_TYPE_PROF_TCAM_AFM].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_PROF_TCAM_RX[sess_idx];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_RX]
+ &table_rows->table_rows_PROF_TCAM_RX[0];
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_RX]
[CFA_TCAM_MGR_TBL_TYPE_PROF_TCAM_APPS].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_PROF_TCAM_RX[sess_idx];
+ &table_rows->table_rows_PROF_TCAM_RX[0];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_TX]
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_TX]
[CFA_TCAM_MGR_TBL_TYPE_PROF_TCAM_AFM].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_PROF_TCAM_TX[sess_idx];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_TX]
+ &table_rows->table_rows_PROF_TCAM_TX[0];
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_TX]
[CFA_TCAM_MGR_TBL_TYPE_PROF_TCAM_APPS].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_PROF_TCAM_TX[sess_idx];
+ &table_rows->table_rows_PROF_TCAM_TX[0];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_RX]
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_RX]
[CFA_TCAM_MGR_TBL_TYPE_WC_TCAM_AFM].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_WC_TCAM_RX[sess_idx];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_RX]
+ &table_rows->table_rows_WC_TCAM_RX[0];
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_RX]
[CFA_TCAM_MGR_TBL_TYPE_WC_TCAM_APPS].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_WC_TCAM_RX[sess_idx];
+ &table_rows->table_rows_WC_TCAM_RX[0];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_TX]
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_TX]
[CFA_TCAM_MGR_TBL_TYPE_WC_TCAM_AFM].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_WC_TCAM_TX[sess_idx];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_TX]
+ &table_rows->table_rows_WC_TCAM_TX[0];
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_TX]
[CFA_TCAM_MGR_TBL_TYPE_WC_TCAM_APPS].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_WC_TCAM_TX[sess_idx];
+ &table_rows->table_rows_WC_TCAM_TX[0];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_RX]
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_RX]
[CFA_TCAM_MGR_TBL_TYPE_SP_TCAM_AFM].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_SP_TCAM_RX[sess_idx];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_RX]
+ &table_rows->table_rows_SP_TCAM_RX[0];
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_RX]
[CFA_TCAM_MGR_TBL_TYPE_SP_TCAM_APPS].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_SP_TCAM_RX[sess_idx];
+ &table_rows->table_rows_SP_TCAM_RX[0];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_TX]
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_TX]
[CFA_TCAM_MGR_TBL_TYPE_SP_TCAM_AFM].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_SP_TCAM_TX[sess_idx];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_TX]
+ &table_rows->table_rows_SP_TCAM_TX[0];
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_TX]
[CFA_TCAM_MGR_TBL_TYPE_SP_TCAM_APPS].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_SP_TCAM_TX[sess_idx];
+ &table_rows->table_rows_SP_TCAM_TX[0];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_RX]
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_RX]
[CFA_TCAM_MGR_TBL_TYPE_CT_RULE_TCAM_AFM].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_CT_RULE_TCAM_RX[sess_idx];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_RX]
+ &table_rows->table_rows_CT_RULE_TCAM_RX[0];
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_RX]
[CFA_TCAM_MGR_TBL_TYPE_CT_RULE_TCAM_APPS].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_CT_RULE_TCAM_RX[sess_idx];
+ &table_rows->table_rows_CT_RULE_TCAM_RX[0];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_TX]
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_TX]
[CFA_TCAM_MGR_TBL_TYPE_CT_RULE_TCAM_AFM].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_CT_RULE_TCAM_TX[sess_idx];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_TX]
+ &table_rows->table_rows_CT_RULE_TCAM_TX[0];
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_TX]
[CFA_TCAM_MGR_TBL_TYPE_CT_RULE_TCAM_APPS].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_CT_RULE_TCAM_TX[sess_idx];
+ &table_rows->table_rows_CT_RULE_TCAM_TX[0];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_RX]
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_RX]
[CFA_TCAM_MGR_TBL_TYPE_VEB_TCAM_AFM].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_VEB_TCAM_RX[sess_idx];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_RX]
+ &table_rows->table_rows_VEB_TCAM_RX[0];
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_RX]
[CFA_TCAM_MGR_TBL_TYPE_VEB_TCAM_APPS].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_VEB_TCAM_RX[sess_idx];
+ &table_rows->table_rows_VEB_TCAM_RX[0];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_TX]
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_TX]
[CFA_TCAM_MGR_TBL_TYPE_VEB_TCAM_AFM].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_VEB_TCAM_TX[sess_idx];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_TX]
+ &table_rows->table_rows_VEB_TCAM_TX[0];
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_TX]
[CFA_TCAM_MGR_TBL_TYPE_VEB_TCAM_APPS].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_VEB_TCAM_TX[sess_idx];
+ &table_rows->table_rows_VEB_TCAM_TX[0];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_RX]
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_RX]
[CFA_TCAM_MGR_TBL_TYPE_WC_TCAM_HIGH_AFM].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_WC_TCAM_RX_HIGH[sess_idx];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_RX]
+ &table_rows->table_rows_WC_TCAM_RX_HIGH[0];
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_RX]
[CFA_TCAM_MGR_TBL_TYPE_WC_TCAM_HIGH_APPS].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_WC_TCAM_RX_HIGH[sess_idx];
+ &table_rows->table_rows_WC_TCAM_RX_HIGH[0];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_TX]
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_TX]
[CFA_TCAM_MGR_TBL_TYPE_WC_TCAM_HIGH_AFM].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_WC_TCAM_TX_HIGH[sess_idx];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_TX]
+ &table_rows->table_rows_WC_TCAM_TX_HIGH[0];
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_TX]
[CFA_TCAM_MGR_TBL_TYPE_WC_TCAM_HIGH_APPS].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_WC_TCAM_TX_HIGH[sess_idx];
+ &table_rows->table_rows_WC_TCAM_TX_HIGH[0];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_RX]
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_RX]
[CFA_TCAM_MGR_TBL_TYPE_WC_TCAM_LOW_AFM].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_WC_TCAM_RX_LOW[sess_idx];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_RX]
+ &table_rows->table_rows_WC_TCAM_RX_LOW[0];
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_RX]
[CFA_TCAM_MGR_TBL_TYPE_WC_TCAM_LOW_APPS].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_WC_TCAM_RX_LOW[sess_idx];
+ &table_rows->table_rows_WC_TCAM_RX_LOW[0];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_TX]
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_TX]
[CFA_TCAM_MGR_TBL_TYPE_WC_TCAM_LOW_AFM].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_WC_TCAM_TX_LOW[sess_idx];
- cfa_tcam_mgr_tables[sess_idx][TF_DIR_TX]
+ &table_rows->table_rows_WC_TCAM_TX_LOW[0];
+ tcam_mgr_data->cfa_tcam_mgr_tables[TF_DIR_TX]
[CFA_TCAM_MGR_TBL_TYPE_WC_TCAM_LOW_APPS].tcam_rows =
(struct cfa_tcam_mgr_table_rows_0 *)
- &cfa_tcam_mgr_table_rows_WC_TCAM_TX_LOW[sess_idx];
+ &table_rows->table_rows_WC_TCAM_TX_LOW[0];
+
for (dir = 0; dir < TF_DIR_MAX; dir++) {
for (type = 0; type < CFA_TCAM_MGR_TBL_TYPE_MAX; type++) {
- if (cfa_tcam_mgr_tables[sess_idx][dir][type].row_width >
+ if (tcam_mgr_data->cfa_tcam_mgr_tables[dir]
+ [type].row_width >
max_row_width)
max_row_width =
- cfa_tcam_mgr_tables[sess_idx][dir][type].row_width;
- if (cfa_tcam_mgr_tables[sess_idx][dir][type].result_size >
+ tcam_mgr_data->cfa_tcam_mgr_tables[dir]
+ [type].row_width;
+ if (tcam_mgr_data->cfa_tcam_mgr_tables[dir]
+ [type].result_size >
max_result_size)
max_result_size =
- cfa_tcam_mgr_tables[sess_idx][dir][type].result_size;
+ tcam_mgr_data->cfa_tcam_mgr_tables[dir]
+ [type].result_size;
}
}
if (max_row_width != MAX_ROW_WIDTH) {
- CFA_TCAM_MGR_LOG(ERR,
- "MAX_ROW_WIDTH (%d) does not match actual "
- "value (%d).\n",
- MAX_ROW_WIDTH,
- max_row_width);
- return -CFA_TCAM_MGR_ERR_CODE(INVAL);
+ TFP_DRV_LOG(ERR,
+ "MAX_ROW_WIDTH:%d does not match actual val:%d\n",
+ MAX_ROW_WIDTH, max_row_width);
+ rc = -EINVAL;
+ goto fail;
}
if (max_result_size != MAX_RESULT_SIZE) {
- CFA_TCAM_MGR_LOG(ERR,
- "MAX_RESULT_SIZE (%d) does not match actual "
- "value (%d).\n",
- MAX_RESULT_SIZE,
- max_result_size);
- return -CFA_TCAM_MGR_ERR_CODE(INVAL);
+ TFP_DRV_LOG(ERR,
+ "MAX_RESULT_SIZE:%d does not match actual val:%d\n",
+ MAX_RESULT_SIZE, max_result_size);
+ rc = -EINVAL;
+ goto fail;
}
+
return 0;
+
+fail:
+ cfa_tcam_mgr_data_free(tfs);
+ return rc;
+}
+
+void cfa_tcam_mgr_uninit_p58(struct tf *tfp)
+{
+ struct tf_session *tfs;
+ int rc;
+
+ rc = tf_session_get_session_internal(tfp, &tfs);
+ if (rc)
+ return;
+
+ cfa_tcam_mgr_data_free(tfs);
}
/* HW OP declarations begin here */
@@ -778,134 +866,182 @@ struct cfa_tcam_mgr_TCAM_row_data {
(CT_RULE_TCAM_TX_MAX_SLICES * CT_RULE_TCAM_TX_NUM_ROWS)
#define VEB_TX_MAX_ROWS (VEB_TCAM_TX_MAX_SLICES * VEB_TCAM_TX_NUM_ROWS)
-static int cfa_tcam_mgr_max_rows[TF_TCAM_TBL_TYPE_MAX] = {
- L2_CTXT_RX_MAX_ROWS,
- L2_CTXT_RX_MAX_ROWS,
- PROF_RX_MAX_ROWS,
- WC_RX_MAX_ROWS,
- SP_RX_MAX_ROWS,
- CT_RULE_RX_MAX_ROWS,
- VEB_RX_MAX_ROWS,
- WC_RX_MAX_ROWS,
- WC_RX_MAX_ROWS
+struct cfa_tcam_mgr_rx_row_data {
+ struct cfa_tcam_mgr_TCAM_row_data
+ cfa_tcam_mgr_L2_CTXT_TCAM_RX_row_data[L2_CTXT_RX_MAX_ROWS + 1];
+ struct cfa_tcam_mgr_TCAM_row_data
+ cfa_tcam_mgr_PROF_TCAM_RX_row_data[PROF_RX_MAX_ROWS + 1];
+ struct cfa_tcam_mgr_TCAM_row_data
+ cfa_tcam_mgr_WC_TCAM_RX_row_data[WC_TX_MAX_ROWS + 1];
+ struct cfa_tcam_mgr_TCAM_row_data
+ cfa_tcam_mgr_SP_TCAM_RX_row_data[SP_RX_MAX_ROWS + 1];
+ struct cfa_tcam_mgr_TCAM_row_data
+ cfa_tcam_mgr_CT_RULE_TCAM_RX_row_data[CT_RULE_RX_MAX_ROWS + 1];
+ struct cfa_tcam_mgr_TCAM_row_data
+ cfa_tcam_mgr_VEB_TCAM_RX_row_data[VEB_RX_MAX_ROWS + 1];
};
-static struct cfa_tcam_mgr_TCAM_row_data
- cfa_tcam_mgr_L2_CTXT_TCAM_RX_row_data[TF_TCAM_MAX_SESSIONS][L2_CTXT_RX_MAX_ROWS];
-static struct cfa_tcam_mgr_TCAM_row_data
- cfa_tcam_mgr_PROF_TCAM_RX_row_data[TF_TCAM_MAX_SESSIONS][PROF_RX_MAX_ROWS];
-static struct cfa_tcam_mgr_TCAM_row_data
- cfa_tcam_mgr_WC_TCAM_RX_row_data[TF_TCAM_MAX_SESSIONS][WC_RX_MAX_ROWS];
-static struct cfa_tcam_mgr_TCAM_row_data
- cfa_tcam_mgr_SP_TCAM_RX_row_data[TF_TCAM_MAX_SESSIONS][SP_RX_MAX_ROWS];
-static struct cfa_tcam_mgr_TCAM_row_data
- cfa_tcam_mgr_CT_RULE_TCAM_RX_row_data[TF_TCAM_MAX_SESSIONS][CT_RULE_RX_MAX_ROWS];
-static struct cfa_tcam_mgr_TCAM_row_data
- cfa_tcam_mgr_VEB_TCAM_RX_row_data[TF_TCAM_MAX_SESSIONS][VEB_RX_MAX_ROWS];
-static struct cfa_tcam_mgr_TCAM_row_data
- cfa_tcam_mgr_WC_TCAM_RX_row_data[TF_TCAM_MAX_SESSIONS][WC_RX_MAX_ROWS];
-
-static struct cfa_tcam_mgr_TCAM_row_data
- cfa_tcam_mgr_L2_CTXT_TCAM_TX_row_data[TF_TCAM_MAX_SESSIONS][L2_CTXT_TX_MAX_ROWS];
-static struct cfa_tcam_mgr_TCAM_row_data
- cfa_tcam_mgr_PROF_TCAM_TX_row_data[TF_TCAM_MAX_SESSIONS][PROF_TX_MAX_ROWS];
-static struct cfa_tcam_mgr_TCAM_row_data
- cfa_tcam_mgr_WC_TCAM_TX_row_data[TF_TCAM_MAX_SESSIONS][WC_TX_MAX_ROWS];
-static struct cfa_tcam_mgr_TCAM_row_data
- cfa_tcam_mgr_SP_TCAM_TX_row_data[TF_TCAM_MAX_SESSIONS][SP_TX_MAX_ROWS];
-static struct cfa_tcam_mgr_TCAM_row_data
- cfa_tcam_mgr_CT_RULE_TCAM_TX_row_data[TF_TCAM_MAX_SESSIONS][CT_RULE_TX_MAX_ROWS];
-static struct cfa_tcam_mgr_TCAM_row_data
- cfa_tcam_mgr_VEB_TCAM_TX_row_data[TF_TCAM_MAX_SESSIONS][VEB_TX_MAX_ROWS];
-static struct cfa_tcam_mgr_TCAM_row_data
- cfa_tcam_mgr_WC_TCAM_TX_row_data[TF_TCAM_MAX_SESSIONS][WC_TX_MAX_ROWS];
-
-static struct cfa_tcam_mgr_TCAM_row_data *
-row_tables[TF_DIR_MAX][TF_TCAM_TBL_TYPE_MAX] = {
- {
- cfa_tcam_mgr_L2_CTXT_TCAM_RX_row_data[0],
- cfa_tcam_mgr_L2_CTXT_TCAM_RX_row_data[0],
- cfa_tcam_mgr_PROF_TCAM_RX_row_data[0],
- cfa_tcam_mgr_WC_TCAM_RX_row_data[0],
- cfa_tcam_mgr_SP_TCAM_RX_row_data[0],
- cfa_tcam_mgr_CT_RULE_TCAM_RX_row_data[0],
- cfa_tcam_mgr_VEB_TCAM_RX_row_data[0],
- cfa_tcam_mgr_WC_TCAM_RX_row_data[0],
- cfa_tcam_mgr_WC_TCAM_RX_row_data[0],
- },
- {
- cfa_tcam_mgr_L2_CTXT_TCAM_TX_row_data[0],
- cfa_tcam_mgr_L2_CTXT_TCAM_TX_row_data[0],
- cfa_tcam_mgr_PROF_TCAM_TX_row_data[0],
- cfa_tcam_mgr_WC_TCAM_TX_row_data[0],
- cfa_tcam_mgr_SP_TCAM_TX_row_data[0],
- cfa_tcam_mgr_CT_RULE_TCAM_TX_row_data[0],
- cfa_tcam_mgr_VEB_TCAM_TX_row_data[0],
- cfa_tcam_mgr_WC_TCAM_TX_row_data[0],
- cfa_tcam_mgr_WC_TCAM_TX_row_data[0],
- }
+struct cfa_tcam_mgr_tx_row_data {
+ struct cfa_tcam_mgr_TCAM_row_data
+ cfa_tcam_mgr_L2_CTXT_TCAM_TX_row_data[L2_CTXT_TX_MAX_ROWS + 1];
+ struct cfa_tcam_mgr_TCAM_row_data
+ cfa_tcam_mgr_PROF_TCAM_TX_row_data[PROF_TX_MAX_ROWS + 1];
+ struct cfa_tcam_mgr_TCAM_row_data
+ cfa_tcam_mgr_WC_TCAM_TX_row_data[WC_TX_MAX_ROWS + 1];
+ struct cfa_tcam_mgr_TCAM_row_data
+ cfa_tcam_mgr_SP_TCAM_TX_row_data[SP_TX_MAX_ROWS + 1];
+ struct cfa_tcam_mgr_TCAM_row_data
+ cfa_tcam_mgr_CT_RULE_TCAM_TX_row_data[CT_RULE_TX_MAX_ROWS + 1];
+ struct cfa_tcam_mgr_TCAM_row_data
+ cfa_tcam_mgr_VEB_TCAM_TX_row_data[VEB_TX_MAX_ROWS + 1];
};
-static int cfa_tcam_mgr_get_max_rows(enum tf_tcam_tbl_type type)
+#define TF_TCAM_L2_CTX_HI TF_TCAM_TBL_TYPE_L2_CTXT_TCAM_HIGH
+#define TF_TCAM_L2_CTX_LO TF_TCAM_TBL_TYPE_L2_CTXT_TCAM_LOW
+#define TF_TCAM_PROF TF_TCAM_TBL_TYPE_PROF_TCAM
+#define TF_TCAM_WC TF_TCAM_TBL_TYPE_WC_TCAM
+#define TF_TCAM_SP TF_TCAM_TBL_TYPE_SP_TCAM
+#define TF_TCAM_CT TF_TCAM_TBL_TYPE_CT_RULE_TCAM
+#define TF_TCAM_VEB TF_TCAM_TBL_TYPE_VEB_TCAM
+#define TF_TCAM_WC_HI TF_TCAM_TBL_TYPE_WC_TCAM_HIGH
+#define TF_TCAM_WC_LO TF_TCAM_TBL_TYPE_WC_TCAM_LOW
+
+static int cfa_tcam_mgr_row_data_alloc(struct cfa_tcam_mgr_data *tcam_mgr_data)
+{
+ struct cfa_tcam_mgr_rx_row_data *rx_row_data;
+ struct cfa_tcam_mgr_tx_row_data *tx_row_data;
+ struct tfp_calloc_parms cparms;
+ int rc;
+
+ cparms.nitems = 1;
+ cparms.size = sizeof(struct cfa_tcam_mgr_rx_row_data);
+ cparms.alignment = 0;
+ rc = tfp_calloc(&cparms);
+ if (rc) {
+ /* Log error */
+ TFP_DRV_LOG(ERR,
+ "Failed to allocate rx_row_data, rc:%s\n",
+ strerror(-rc));
+ return -ENOMEM;
+ }
+
+ rx_row_data = (struct cfa_tcam_mgr_rx_row_data *)cparms.mem_va;
+
+ cparms.nitems = 1;
+ cparms.size = sizeof(struct cfa_tcam_mgr_tx_row_data);
+ cparms.alignment = 0;
+ rc = tfp_calloc(&cparms);
+ if (rc) {
+ /* Log error */
+ TFP_DRV_LOG(ERR,
+ "Failed to allocate tx_row_data, rc:%s\n",
+ strerror(-rc));
+ tfp_free(rx_row_data);
+ return -ENOMEM;
+ }
+
+ tx_row_data = (struct cfa_tcam_mgr_tx_row_data *)cparms.mem_va;
+
+ tcam_mgr_data->rx_row_data = rx_row_data;
+ tcam_mgr_data->tx_row_data = tx_row_data;
+
+ tcam_mgr_data->row_tables[TF_DIR_RX][TF_TCAM_L2_CTX_HI] =
+ &rx_row_data->cfa_tcam_mgr_L2_CTXT_TCAM_RX_row_data[0];
+ tcam_mgr_data->row_tables[TF_DIR_RX][TF_TCAM_L2_CTX_LO] =
+ &rx_row_data->cfa_tcam_mgr_L2_CTXT_TCAM_RX_row_data[0];
+ tcam_mgr_data->row_tables[TF_DIR_RX][TF_TCAM_PROF] =
+ &rx_row_data->cfa_tcam_mgr_PROF_TCAM_RX_row_data[0];
+ tcam_mgr_data->row_tables[TF_DIR_RX][TF_TCAM_WC] =
+ &rx_row_data->cfa_tcam_mgr_WC_TCAM_RX_row_data[0];
+ tcam_mgr_data->row_tables[TF_DIR_RX][TF_TCAM_SP] =
+ &rx_row_data->cfa_tcam_mgr_SP_TCAM_RX_row_data[0];
+ tcam_mgr_data->row_tables[TF_DIR_RX][TF_TCAM_CT] =
+ &rx_row_data->cfa_tcam_mgr_CT_RULE_TCAM_RX_row_data[0];
+ tcam_mgr_data->row_tables[TF_DIR_RX][TF_TCAM_VEB] =
+ &rx_row_data->cfa_tcam_mgr_VEB_TCAM_RX_row_data[0];
+ tcam_mgr_data->row_tables[TF_DIR_RX][TF_TCAM_WC_HI] =
+ &rx_row_data->cfa_tcam_mgr_WC_TCAM_RX_row_data[0];
+ tcam_mgr_data->row_tables[TF_DIR_RX][TF_TCAM_WC_LO] =
+ &rx_row_data->cfa_tcam_mgr_WC_TCAM_RX_row_data[0];
+
+ tcam_mgr_data->row_tables[TF_DIR_TX][TF_TCAM_L2_CTX_HI] =
+ &tx_row_data->cfa_tcam_mgr_L2_CTXT_TCAM_TX_row_data[0];
+ tcam_mgr_data->row_tables[TF_DIR_TX][TF_TCAM_L2_CTX_LO] =
+ &tx_row_data->cfa_tcam_mgr_L2_CTXT_TCAM_TX_row_data[0];
+ tcam_mgr_data->row_tables[TF_DIR_TX][TF_TCAM_PROF] =
+ &tx_row_data->cfa_tcam_mgr_PROF_TCAM_TX_row_data[0];
+ tcam_mgr_data->row_tables[TF_DIR_TX][TF_TCAM_WC] =
+ &tx_row_data->cfa_tcam_mgr_WC_TCAM_TX_row_data[0];
+ tcam_mgr_data->row_tables[TF_DIR_TX][TF_TCAM_SP] =
+ &tx_row_data->cfa_tcam_mgr_SP_TCAM_TX_row_data[0];
+ tcam_mgr_data->row_tables[TF_DIR_TX][TF_TCAM_CT] =
+ &tx_row_data->cfa_tcam_mgr_CT_RULE_TCAM_TX_row_data[0];
+ tcam_mgr_data->row_tables[TF_DIR_TX][TF_TCAM_VEB] =
+ &tx_row_data->cfa_tcam_mgr_VEB_TCAM_TX_row_data[0];
+ tcam_mgr_data->row_tables[TF_DIR_TX][TF_TCAM_WC_HI] =
+ &tx_row_data->cfa_tcam_mgr_WC_TCAM_TX_row_data[0];
+ tcam_mgr_data->row_tables[TF_DIR_TX][TF_TCAM_WC_LO] =
+ &tx_row_data->cfa_tcam_mgr_WC_TCAM_TX_row_data[0];
+
+ return 0;
+}
+
+static void cfa_tcam_mgr_row_data_free(struct cfa_tcam_mgr_data
+ *tcam_mgr_data)
{
- if (type >= TF_TCAM_TBL_TYPE_MAX)
- assert(0);
- else
- return cfa_tcam_mgr_max_rows[type];
+ tfp_free(tcam_mgr_data->rx_row_data);
+ tfp_free(tcam_mgr_data->tx_row_data);
}
-static int cfa_tcam_mgr_hwop_set(int sess_idx,
+static int cfa_tcam_mgr_hwop_set(struct cfa_tcam_mgr_data *tcam_mgr_data,
struct cfa_tcam_mgr_set_parms *parms, int row,
int slice, int max_slices)
{
struct cfa_tcam_mgr_TCAM_row_data *this_table;
struct cfa_tcam_mgr_TCAM_row_data *this_row;
- this_table = row_tables[parms->dir]
+
+ this_table = tcam_mgr_data->row_tables[parms->dir]
[cfa_tcam_mgr_get_phys_table_type(parms->type)];
- this_table += (sess_idx *
- cfa_tcam_mgr_get_max_rows(cfa_tcam_mgr_get_phys_table_type(parms->type)));
this_row = &this_table[row * max_slices + slice];
this_row->key_size = parms->key_size;
memcpy(&this_row->key, parms->key, parms->key_size);
memcpy(&this_row->mask, parms->mask, parms->key_size);
this_row->result_size = parms->result_size;
- if (parms->result != ((void *)0))
+ if (parms->result)
memcpy(&this_row->result, parms->result, parms->result_size);
return 0;
};
-static int cfa_tcam_mgr_hwop_get(int sess_idx,
+static int cfa_tcam_mgr_hwop_get(struct cfa_tcam_mgr_data *tcam_mgr_data,
struct cfa_tcam_mgr_get_parms *parms, int row,
int slice, int max_slices)
{
struct cfa_tcam_mgr_TCAM_row_data *this_table;
struct cfa_tcam_mgr_TCAM_row_data *this_row;
- this_table = row_tables[parms->dir]
+
+ this_table = tcam_mgr_data->row_tables[parms->dir]
[cfa_tcam_mgr_get_phys_table_type(parms->type)];
- this_table += (sess_idx *
- cfa_tcam_mgr_get_max_rows(cfa_tcam_mgr_get_phys_table_type(parms->type)));
this_row = &this_table[row * max_slices + slice];
parms->key_size = this_row->key_size;
parms->result_size = this_row->result_size;
- if (parms->key != ((void *)0))
+ if (parms->key)
memcpy(parms->key, &this_row->key, parms->key_size);
- if (parms->mask != ((void *)0))
+ if (parms->mask)
memcpy(parms->mask, &this_row->mask, parms->key_size);
- if (parms->result != ((void *)0))
+ if (parms->result)
memcpy(parms->result, &this_row->result, parms->result_size);
return 0;
};
-static int cfa_tcam_mgr_hwop_free(int sess_idx,
+static int cfa_tcam_mgr_hwop_free(struct cfa_tcam_mgr_data *tcam_mgr_data,
struct cfa_tcam_mgr_free_parms *parms,
int row, int slice, int max_slices)
{
struct cfa_tcam_mgr_TCAM_row_data *this_table;
struct cfa_tcam_mgr_TCAM_row_data *this_row;
- this_table = row_tables[parms->dir]
+
+ this_table = tcam_mgr_data->row_tables[parms->dir]
[cfa_tcam_mgr_get_phys_table_type(parms->type)];
- this_table += (sess_idx *
- cfa_tcam_mgr_get_max_rows(cfa_tcam_mgr_get_phys_table_type(parms->type)));
this_row = &this_table[row * max_slices + slice];
memset(&this_row->key, 0, sizeof(this_row->key));
memset(&this_row->mask, 0, sizeof(this_row->mask));
@@ -1,5 +1,5 @@
/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2021-2023 Broadcom
+ * Copyright(c) 2021-2024 Broadcom
* All rights reserved.
*/
@@ -7,14 +7,14 @@
#define CFA_TCAM_MGR_P58_H
#include "cfa_tcam_mgr_device.h"
-#include "cfa_tcam_mgr_sbmp.h"
int
-cfa_tcam_mgr_init_p58(int sess_idx, struct cfa_tcam_mgr_entry_data **global_entry_data);
+cfa_tcam_mgr_init_p58(struct tf *tfp);
-int
-cfa_tcam_mgr_sess_table_get_p58(int sess_idx, struct sbmp **session_bmp);
+void
+cfa_tcam_mgr_uninit_p58(struct tf *tfp);
int
cfa_tcam_mgr_hwops_get_funcs_p58(struct cfa_tcam_mgr_hwops_funcs *hwop_funcs);
+
#endif /* CFA_TCAM_MGR_P58_H */
deleted file mode 100644
@@ -1,57 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2019-2023 Broadcom
- * All rights reserved.
- */
-
-#ifndef CFA_TCAM_MGR_SESSION_H
-#define CFA_TCAM_MGR_SESSION_H
-
-#include <inttypes.h>
-#include "cfa_tcam_mgr.h"
-
-int
-cfa_tcam_mgr_session_init(int sess_idx, enum cfa_tcam_mgr_device_type type);
-
-int
-cfa_tcam_mgr_get_session_from_context(struct cfa_tcam_mgr_context *context,
- uint32_t *session_id);
-
-int
-cfa_tcam_mgr_session_find(unsigned int session_id);
-
-int
-cfa_tcam_mgr_session_empty(void);
-
-int
-cfa_tcam_mgr_session_add(unsigned int session_id);
-
-int
-cfa_tcam_mgr_session_free(unsigned int session_id,
- struct cfa_tcam_mgr_context *context);
-
-int
-cfa_tcam_mgr_session_cfg(unsigned int session_id,
- uint16_t tcam_cnt[][CFA_TCAM_MGR_TBL_TYPE_MAX]);
-
-int
-cfa_tcam_mgr_session_entry_alloc(unsigned int session_id,
- enum tf_dir dir,
- enum cfa_tcam_mgr_tbl_type type);
-int
-cfa_tcam_mgr_session_entry_free(unsigned int session_id,
- unsigned int entry_id,
- enum tf_dir dir,
- enum cfa_tcam_mgr_tbl_type type);
-
-void
-cfa_tcam_mgr_sessions_dump(void);
-void
-cfa_tcam_mgr_entry_sessions_dump(int sess_idx, uint16_t id);
-void
-cfa_tcam_mgr_session_entries_dump(int sess_idx);
-
-void
-cfa_tcam_mgr_mv_session_used_entries_cnt(int sess_idx, enum tf_dir dir,
- enum cfa_tcam_mgr_tbl_type dst_type,
- enum cfa_tcam_mgr_tbl_type src_type);
-#endif /* CFA_TCAM_MGR_SESSION_H */
@@ -1,6 +1,6 @@
# SPDX-License-Identifier: BSD-3-Clause
# Copyright(c) 2018 Intel Corporation
-# Copyright(c) 2023 Broadcom
+# Copyright(c) 2024 Broadcom
#Include the folder for headers
includes += include_directories('.')
@@ -12,7 +12,6 @@ sources += files(
'cfa_tcam_mgr_hwop_msg.c',
'cfa_tcam_mgr_p4.c',
'cfa_tcam_mgr_p58.c',
- 'cfa_tcam_mgr_session.c',
'dpool.c',
'll.c',
'rand.c',
@@ -1,5 +1,5 @@
/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2019-2023 Broadcom
+ * Copyright(c) 2019-2024 Broadcom
* All rights reserved.
*/
@@ -1104,7 +1104,7 @@ tf_alloc_tbl_entry(struct tf *tfp,
#ifdef TF_FLOW_SCALE_QUERY
/* Update resource usage buffer */
if (!rc && dev->ops->tf_dev_update_tbl_usage_buffer) {
- rc = dev->ops->tf_dev_update_tbl_usage_buffer(tfs->session_id.id,
+ rc = dev->ops->tf_dev_update_tbl_usage_buffer(tfp,
parms->dir,
parms->type,
TF_RESC_ALLOC);
@@ -1200,7 +1200,7 @@ tf_free_tbl_entry(struct tf *tfp,
#ifdef TF_FLOW_SCALE_QUERY
/* Update resource usage buffer */
if (!rc && dev->ops->tf_dev_update_tbl_usage_buffer) {
- rc = dev->ops->tf_dev_update_tbl_usage_buffer(tfs->session_id.id,
+ rc = dev->ops->tf_dev_update_tbl_usage_buffer(tfp,
parms->dir,
parms->type,
TF_RESC_FREE);
@@ -1,5 +1,5 @@
/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2019-2023 Broadcom
+ * Copyright(c) 2019-2024 Broadcom
* All rights reserved.
*/
@@ -1187,7 +1187,7 @@ struct tf_dev_ops {
* 0 - Success
* -EINVAL - Error
*/
- int (*tf_dev_update_tbl_usage_buffer)(uint32_t session_id,
+ int (*tf_dev_update_tbl_usage_buffer)(struct tf *tfp,
enum tf_dir dir,
enum tf_tbl_type tbl_type,
uint32_t resc_opt);
@@ -1,5 +1,5 @@
/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2019-2023 Broadcom
+ * Copyright(c) 2019-2024 Broadcom
* All rights reserved.
*/
@@ -865,13 +865,13 @@ static int tf_dev_p58_query_resc_usage(struct tf *tfp,
* -EINVAL - Error
*/
static int
-tf_dev_p58_update_tbl_usage_buffer(uint32_t session_id,
+tf_dev_p58_update_tbl_usage_buffer(struct tf *tfp,
enum tf_dir dir,
enum tf_tbl_type tbl_type,
enum tf_resc_opt resc_opt)
{
int rc;
- rc = tf_tbl_usage_update(session_id, dir, tbl_type, resc_opt);
+ rc = tf_tbl_usage_update(tfp, dir, tbl_type, resc_opt);
return rc;
}
#endif /* TF_FLOW_SCALE_QUERY */
@@ -1,5 +1,5 @@
/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2019-2023 Broadcom
+ * Copyright(c) 2019-2024 Broadcom
* All rights reserved.
*/
@@ -111,7 +111,7 @@ tf_em_hash_insert_int_entry(struct tf *tfp,
#ifdef TF_FLOW_SCALE_QUERY
/* Update usage state buffer for EM */
- tf_em_usage_update(tfs->session_id.id,
+ tf_em_usage_update(tfp,
parms->dir,
num_of_entries,
TF_RESC_ALLOC);
@@ -155,7 +155,7 @@ tf_em_hash_delete_int_entry(struct tf *tfp,
#ifdef TF_FLOW_SCALE_QUERY
/* Update usage state buffer for EM */
size = DP_FLAGS_SIZE(pool->entry[parms->index - pool->start_index].flags);
- tf_em_usage_update(tfs->session_id.id,
+ tf_em_usage_update(tfp,
parms->dir,
size,
TF_RESC_FREE);
@@ -1,5 +1,5 @@
/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2019-2023 Broadcom
+ * Copyright(c) 2019-2024 Broadcom
* All rights reserved.
*/
@@ -296,7 +296,7 @@ tf_em_int_bind(struct tf *tfp,
#ifdef TF_FLOW_SCALE_QUERY
/* Initialize the usage state buffer for EM */
- tf_em_usage_init(tfs->session_id.id,
+ tf_em_usage_init(tfp,
i,
iparms.info->entry.stride);
#endif /* TF_FLOW_SCALE_QUERY */
@@ -1,5 +1,5 @@
/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2019-2023 Broadcom
+ * Copyright(c) 2019-2024 Broadcom
* All rights reserved.
*/
@@ -16,7 +16,6 @@
#include "tf_session.h"
#include "tf_device.h"
#include "cfa_tcam_mgr_device.h"
-#include "cfa_tcam_mgr_session.h"
#ifdef TF_FLOW_SCALE_QUERY
@@ -35,41 +34,32 @@ struct tf_resc_usage_buffer_control {
static struct tf_resc_usage_buffer_control resc_usage_control;
/* Check if supporting resource usage */
-static bool tf_resc_usage_support(int session_id)
+static bool tf_resc_usage_support(struct tf *tfp)
{
+ struct tf_session *tfs;
bool support = true;
- int sess_idx;
+ int rc;
/* Not valid session id */
- if (!session_id)
+ rc = tf_session_get_session_internal(tfp, &tfs);
+ if (rc)
return false;
- /* Support Generic template with one session */
- sess_idx = cfa_tcam_mgr_session_find(session_id);
- if (sess_idx < 0 && !cfa_tcam_mgr_session_empty())
- support = false;
-
/* Support Thor */
- if (resc_usage_control.device_type != TF_DEVICE_TYPE_P5)
+ if (resc_usage_control.device_type != tfs->dev.type)
support = false;
#if (TF_FLOW_SCALE_QUERY_DEBUG == 1)
- TFP_DRV_LOG(INFO, "Resc usage update sess_id: %x, idx: %d, type: %d, allow: %s\n",
- session_id,
- sess_idx,
- resc_usage_control.device_type,
- support ? "True" : "False");
+ TFP_DRV_LOG(INFO, "Resc usage update on device type: %d, allow: %s\n",
+ resc_usage_control.device_type,
+ support ? "True" : "False");
#endif /* TF_FLOW_SCALE_QUERY_DEBUG == 1 */
return support;
}
/* Reset the resource usage buffer */
-void tf_resc_usage_reset(enum tf_device_type type, int session_id)
+void tf_resc_usage_reset(struct tf *tfp __rte_unused, enum tf_device_type type)
{
- /* Check if supported on this device */
- if (cfa_tcam_mgr_session_find(session_id) > 0)
- return;
-
/* Support Thor only*/
if (type != TF_DEVICE_TYPE_P5)
return;
@@ -96,24 +86,35 @@ tf_tcam_mgr_row_entry_used(struct cfa_tcam_mgr_table_rows_0 *row,
}
/* Initialize the resource usage buffer for WC-TCAM tables */
-void tf_tcam_usage_init(int session_id)
+void tf_tcam_usage_init(struct tf *tfp)
{
- enum tf_dir dir;
enum cfa_tcam_mgr_tbl_type type = CFA_TCAM_MGR_TBL_TYPE_WC_TCAM_APPS;
struct cfa_tcam_mgr_table_data *table_data = NULL;
struct tf_resc_wc_tcam_usage *usage_data = NULL;
- int sess_idx = cfa_tcam_mgr_session_find(session_id);
+ struct cfa_tcam_mgr_data *tcam_mgr_data;
+ struct tf_session *tfs;
+ enum tf_dir dir;
+ int rc;
/* Check if supported on this device */
- if (!tf_resc_usage_support(session_id))
+ rc = tf_session_get_session_internal(tfp, &tfs);
+ if (rc)
return;
+ tcam_mgr_data = tfs->tcam_mgr_handle;
+ if (!tcam_mgr_data) {
+ TFP_DRV_LOG(ERR,
+ "%s: No TCAM data created for session\n",
+ __func__);
+ return;
+ }
+
/* Iterate over all directions */
for (dir = 0; dir < TF_DIR_MAX; dir++) {
- table_data = &cfa_tcam_mgr_tables[sess_idx][dir][type];
+ table_data = &tcam_mgr_data->cfa_tcam_mgr_tables[dir][type];
usage_data = &tf_resc_usage[dir].wc_tcam_usage;
- /* cfa_tcam_mgr_table_dump(session_id, dir, type); */
+ /* cfa_tcam_mgr_table_dump(tfs->session_id.id, dir, type); */
memset(usage_data, 0, sizeof(*usage_data));
if (table_data->start_row != table_data->end_row)
usage_data->max_row_number = table_data->end_row -
@@ -122,33 +123,49 @@ void tf_tcam_usage_init(int session_id)
#if (TF_FLOW_SCALE_QUERY_DEBUG == 1)
/* dump usage data */
- CFA_TCAM_MGR_LOG(INFO, "WC-TCAM: 1-p 1-f 2-p 2-f 4-f free-rows\n");
- CFA_TCAM_MGR_LOG(INFO, "%s %-4d %-4d %-4d %-4d %-4d %-4d\n",
- (dir == TF_DIR_RX) ? "RX" : "TX",
- usage_data->slice_row_1_p_used,
- usage_data->slice_row_1_f_used,
- usage_data->slice_row_2_p_used,
- usage_data->slice_row_2_f_used,
- usage_data->slice_row_4_used,
- usage_data->unused_row_number);
+ TFP_DRV_LOG(INFO, "WC-TCAM: 1-p 1-f 2-p 2-f 4-f free-rows\n");
+ TFP_DRV_LOG(INFO, "%s %-4d %-4d %-4d %-4d %-4d %-4d\n",
+ (dir == TF_DIR_RX) ? "RX" : "TX",
+ usage_data->slice_row_1_p_used,
+ usage_data->slice_row_1_f_used,
+ usage_data->slice_row_2_p_used,
+ usage_data->slice_row_2_f_used,
+ usage_data->slice_row_4_used,
+ usage_data->unused_row_number);
#endif
}
}
/* Update wc-tcam table resoure usage */
-int tf_tcam_usage_update(int session_id,
+int tf_tcam_usage_update(struct tf *tfp,
enum tf_dir dir,
int tcam_tbl_type,
void *data,
enum tf_resc_opt resc_opt)
{
- struct tf_resc_wc_tcam_usage *usage_data;
- int used_entries;
struct cfa_tcam_mgr_table_rows_0 *key_row = (struct cfa_tcam_mgr_table_rows_0 *)data;
+ struct tf_resc_wc_tcam_usage *usage_data;
+ struct cfa_tcam_mgr_data *tcam_mgr_data;
int key_slices = key_row->entry_size;
+ struct tf_session *tfs;
+ int used_entries;
+ int rc;
+
+ /* Check if supported on this device */
+ rc = tf_session_get_session_internal(tfp, &tfs);
+ if (rc)
+ return rc;
+
+ tcam_mgr_data = tfs->tcam_mgr_handle;
+ if (!tcam_mgr_data) {
+ TFP_DRV_LOG(ERR,
+ "%s: No TCAM data created for session\n",
+ __func__);
+ return -CFA_TCAM_MGR_ERR_CODE(PERM);
+ }
/* Check if supported on this device */
- if (!tf_resc_usage_support(session_id))
+ if (!tf_resc_usage_support(tfp))
return -1;
/* Support WC-TCAM APPs only */
@@ -184,7 +201,8 @@ int tf_tcam_usage_update(int session_id,
}
break;
default:
- CFA_TCAM_MGR_LOG(ERR, "CFA invalid size of key slices: %d\n", key_slices);
+ TFP_DRV_LOG(ERR, "CFA invalid size of key slices: %d\n",
+ key_slices);
break;
}
} else { /* free one entry */
@@ -213,32 +231,33 @@ int tf_tcam_usage_update(int session_id,
}
break;
default:
- CFA_TCAM_MGR_LOG(ERR, "CFA invalid size of key slices: %d\n", key_slices);
+ TFP_DRV_LOG(ERR, "CFA invalid size of key slices: %d\n",
+ key_slices);
break;
}
}
#if (TF_FLOW_SCALE_QUERY_DEBUG == 1)
/* dump usage data*/
- CFA_TCAM_MGR_LOG(INFO, "WC-TCAM: 1-p 1-f 2-p 2-f 4-f free-rows\n");
- CFA_TCAM_MGR_LOG(INFO, " %-4d %-4d %-4d %-4d %-4d %-4d\n",
- usage_data->slice_row_1_p_used,
- usage_data->slice_row_1_f_used,
- usage_data->slice_row_2_p_used,
- usage_data->slice_row_2_f_used,
- usage_data->slice_row_4_used,
- usage_data->unused_row_number);
+ TFP_DRV_LOG(INFO, "WC-TCAM: 1-p 1-f 2-p 2-f 4-f free-rows\n");
+ TFP_DRV_LOG(INFO, " %-4d %-4d %-4d %-4d %-4d %-4d\n",
+ usage_data->slice_row_1_p_used,
+ usage_data->slice_row_1_f_used,
+ usage_data->slice_row_2_p_used,
+ usage_data->slice_row_2_f_used,
+ usage_data->slice_row_4_used,
+ usage_data->unused_row_number);
#endif
return 0;
}
/* Initialize the EM usage table */
-void tf_em_usage_init(uint32_t session_id, enum tf_dir dir, uint16_t max_entries)
+void tf_em_usage_init(struct tf *tfp, enum tf_dir dir, uint16_t max_entries)
{
struct tf_resc_em_usage *em;
/* Check if supported on this device */
- if (!tf_resc_usage_support(session_id))
+ if (!tf_resc_usage_support(tfp))
return;
em = &tf_resc_usage[dir].em_int_usage;
@@ -247,7 +266,7 @@ void tf_em_usage_init(uint32_t session_id, enum tf_dir dir, uint16_t max_entries
}
/* Update the EM usage table */
-int tf_em_usage_update(uint32_t session_id,
+int tf_em_usage_update(struct tf *tfp,
enum tf_dir dir,
uint16_t size,
enum tf_resc_opt resc_opt)
@@ -255,15 +274,15 @@ int tf_em_usage_update(uint32_t session_id,
struct tf_resc_em_usage *em;
#if (TF_FLOW_SCALE_QUERY_DEBUG == 1)
- CFA_TCAM_MGR_LOG(INFO, "%s: %s: EM record size: %d, %s\n",
- __func__,
- dir ? "TX" : "RX",
- size,
- resc_opt == TF_RESC_ALLOC ? "Alloc" : "Free");
+ TFP_DRV_LOG(INFO, "%s: %s: EM record size: %d, %s\n",
+ __func__,
+ dir ? "TX" : "RX",
+ size,
+ resc_opt == TF_RESC_ALLOC ? "Alloc" : "Free");
#endif /* TF_FLOW_SCALE_QUERY_DEBUG == 1 */
/* Check if supported on this device */
- if (!tf_resc_usage_support(session_id))
+ if (!tf_resc_usage_support(tfp))
return -1;
/* not valid size */
@@ -283,7 +302,7 @@ int tf_em_usage_update(uint32_t session_id,
}
/* Initialize the usage buffer for all kinds of sram tables */
-void tf_tbl_usage_init(uint32_t session_id,
+void tf_tbl_usage_init(struct tf *tfp,
enum tf_dir dir,
uint32_t tbl_type,
uint16_t max_entries)
@@ -291,17 +310,17 @@ void tf_tbl_usage_init(uint32_t session_id,
struct tf_rm_element_cfg *tbl_cfg = tf_tbl_p58[dir];
#if (TF_FLOW_SCALE_QUERY_DEBUG == 1)
- CFA_TCAM_MGR_LOG(INFO, "%s: %s: tbl_type: %d[%s], max entries: [%d]:[0x%x]\n",
- __func__,
- dir ? "TX" : "RX",
- tbl_type,
- tf_tbl_type_2_str(tbl_type),
- max_entries,
- max_entries);
+ TFP_DRV_LOG(INFO, "%s: %s: tbl_type: %d[%s], max entries: [%d]:[0x%x]\n",
+ __func__,
+ dir ? "TX" : "RX",
+ tbl_type,
+ tf_tbl_type_2_str(tbl_type),
+ max_entries,
+ max_entries);
#endif /* TF_FLOW_SCALE_QUERY_DEBUG == 1 */
/* Check if supported on this device */
- if (!tf_resc_usage_support(session_id))
+ if (!tf_resc_usage_support(tfp))
return;
/* Convert to entries */
@@ -372,7 +391,7 @@ void tf_tbl_usage_init(uint32_t session_id,
}
/* Update the usage buffer for sram tables: add or free one entry */
-int tf_tbl_usage_update(uint32_t session_id,
+int tf_tbl_usage_update(struct tf *tfp,
enum tf_dir dir,
uint32_t tbl_type,
enum tf_resc_opt resc_opt)
@@ -384,7 +403,7 @@ int tf_tbl_usage_update(uint32_t session_id,
int entries = 0;
/* Check if supported on this device */
- if (!tf_resc_usage_support(session_id))
+ if (!tf_resc_usage_support(tfp))
return -1;
/* Convert to entries */
@@ -393,11 +412,11 @@ int tf_tbl_usage_update(uint32_t session_id,
#if (TF_FLOW_SCALE_QUERY_DEBUG == 1)
TFP_DRV_LOG(INFO, "%s: %s: tbl_type: %d[%s] %s, Entries: %d\n", __func__,
- dir ? "TX" : "RX",
- tbl_type,
- tf_tbl_type_2_str(tbl_type),
- resc_opt ? "Alloc" : "Free",
- entries);
+ dir ? "TX" : "RX",
+ tbl_type,
+ tf_tbl_type_2_str(tbl_type),
+ resc_opt ? "Alloc" : "Free",
+ entries);
#endif /* TF_FLOW_SCALE_QUERY_DEBUG == 1 */
resc_usage_control.buffer_dirty[dir] = 1;
@@ -521,7 +540,7 @@ void tf_resc_usage_update_all(struct bnxt *bp)
}
/* Check if supported on this device */
- if (!tf_resc_usage_support(tfp->session->session_id.id))
+ if (!tf_resc_usage_support(tfp))
return;
/* update usage state with firmware for each direction */
@@ -557,11 +576,11 @@ void dump_tf_resc_usage(enum tf_dir dir, void *data, uint32_t size)
}
printf("EM-----------------------------------------------------------------------\n");
- printf(" %4d: %4d\n",
+ printf(" %4d: %4d\n",
state->em_int_usage.max_entries,
state->em_int_usage.used_entries);
printf("WC TCAM------------------------------------------------------------------\n");
- printf(" %4d(row): %4d %4d %4d %4d %4d %4d(free row)\n",
+ printf(" %4d(row): %4d %4d %4d %4d %4d %4d(free row)\n",
state->wc_tcam_usage.max_row_number,
state->wc_tcam_usage.slice_row_1_p_used,
state->wc_tcam_usage.slice_row_1_f_used,
@@ -570,31 +589,31 @@ void dump_tf_resc_usage(enum tf_dir dir, void *data, uint32_t size)
state->wc_tcam_usage.slice_row_4_used,
state->wc_tcam_usage.unused_row_number);
printf("COUNTER------------------------------------------------------------------\n");
- printf(" %4d: %4d\n",
+ printf(" %4d: %4d\n",
state->cnt_usage.max_entries,
state->cnt_usage.used_entries);
printf("METER------------------------------------------------------------------\n");
- printf(" %4d(Inst): %4d, %4d(Prof): %4d\n",
+ printf(" %4d(Inst): %4d, %4d(Prof): %4d\n",
state->meter_usage.max_meter_instance,
state->meter_usage.used_meter_instance,
state->meter_usage.max_meter_profile,
state->meter_usage.used_meter_profile);
printf("ACTION-------------------------------------------------------------------\n");
- printf(" %4d(MAX): %4d(compact) %4d(full) %4d(free)\n",
+ printf(" %4d(MAX): %4d(compact) %4d(full) %4d(free)\n",
state->act_usage.max_entries,
state->act_usage.num_compact_act_records,
state->act_usage.num_full_act_records,
state->act_usage.free_entries);
printf("SP SMAC------------------------------------------------------------------\n");
sp_smac = &state->sp_smac_usage;
- printf(" %4d(Max): %4d(8B) %4d(IPv4=16B) %4d(IPv6=32B) %4d(free)\n",
+ printf(" %4d(Max): %4d(8B) %4d(IPv4=16B) %4d(IPv6=32B) %4d(free)\n",
sp_smac->max_entries,
sp_smac->num_sp_smac_records,
sp_smac->num_sp_smac_ipv4_records,
sp_smac->num_sp_smac_ipv6_records,
sp_smac->free_entries);
printf("ACT MOD/ENCAP------------------------------------------------------------\n");
- printf(" %4d: %4d(8B) %4d(16B) %4d(32B) %4d(64B) %4d(128B) %4d(free)\n\n\n",
+ printf(" %4d: %4d(8B) %4d(16B) %4d(32B) %4d(64B) %4d(128B) %4d(free)\n\n\n",
state->mod_encap_usage.max_entries,
state->mod_encap_usage.data.num_8b_records,
state->mod_encap_usage.data.num_16b_records,
@@ -1,5 +1,5 @@
/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2019-2023 Broadcom
+ * Copyright(c) 2019-2024 Broadcom
* All rights reserved.
*/
@@ -97,29 +97,29 @@ typedef struct cfa_tf_resc_usage {
/* global data stored in firmware memory and TruFlow driver */
extern cfa_tf_resc_usage_t tf_resc_usage[TF_DIR_MAX];
-void tf_resc_usage_reset(enum tf_device_type type, int session_id);
+void tf_resc_usage_reset(struct tf *tfp, enum tf_device_type type);
-void tf_tcam_usage_init(int session_id);
+void tf_tcam_usage_init(struct tf *tfp);
-int tf_tcam_usage_update(int session_id,
+int tf_tcam_usage_update(struct tf *tfp,
enum tf_dir dir,
int tcam_tbl_type,
void *key_row,
enum tf_resc_opt resc_opt);
-void tf_em_usage_init(uint32_t session_id, enum tf_dir dir, uint16_t max_entries);
+void tf_em_usage_init(struct tf *tfp, enum tf_dir dir, uint16_t max_entries);
-int tf_em_usage_update(uint32_t session_id,
+int tf_em_usage_update(struct tf *tfp,
enum tf_dir dir,
uint16_t size,
enum tf_resc_opt resc_opt);
-void tf_tbl_usage_init(uint32_t session_id,
+void tf_tbl_usage_init(struct tf *tfp,
enum tf_dir dir,
uint32_t tbl_type,
uint16_t max_entries);
-int tf_tbl_usage_update(uint32_t session_id,
+int tf_tbl_usage_update(struct tf *tfp,
enum tf_dir dir,
uint32_t tbl_type,
enum tf_resc_opt resc_opt);
@@ -1,5 +1,5 @@
/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2019-2023 Broadcom
+ * Copyright(c) 2019-2024 Broadcom
* All rights reserved.
*/
@@ -428,7 +428,7 @@ tf_rm_update_parent_reservations(struct tf *tfp,
req_cnt[child] = 0;
#ifdef TF_FLOW_SCALE_QUERY
/* Initialize the usage buffer for SRAM tables */
- tf_tbl_usage_init(tfp->session->session_id.id,
+ tf_tbl_usage_init(tfp,
dir,
child,
alloc_cnt[child]);
@@ -698,7 +698,7 @@ tf_rm_create_db(struct tf *tfp,
tbl_type = TF_TBL_TYPE_METER_INST;
else
tbl_type = TF_TBL_TYPE_METER_PROF;
- tf_tbl_usage_init(tfp->session->session_id.id,
+ tf_tbl_usage_init(tfp,
parms->dir,
tbl_type,
req_cnt[i]);
@@ -1,5 +1,5 @@
/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2019-2023 Broadcom
+ * Copyright(c) 2019-2024 Broadcom
* All rights reserved.
*/
@@ -199,7 +199,7 @@ tf_session_create(struct tf *tfp,
#ifdef TF_FLOW_SCALE_QUERY
/* Reset the resource usage buffer before binding a device */
- tf_resc_usage_reset(parms->open_cfg->device_type, tfp->session->session_id.id);
+ tf_resc_usage_reset(tfp, parms->open_cfg->device_type);
#endif /* TF_FLOW_SCALE_QUERY */
rc = tf_dev_bind(tfp,
@@ -1,5 +1,5 @@
/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2019-2023 Broadcom
+ * Copyright(c) 2019-2024 Broadcom
* All rights reserved.
*/
@@ -179,6 +179,10 @@ struct tf_session {
*/
int tcam_mgr_control[TF_DIR_MAX][TF_TCAM_TBL_TYPE_MAX];
+ /**
+ * TCAM Manager handle pointing to session based tcam memory
+ */
+ void *tcam_mgr_handle;
};
/**
@@ -1,5 +1,5 @@
/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2019-2023 Broadcom
+ * Copyright(c) 2019-2024 Broadcom
* All rights reserved.
*/
@@ -27,7 +27,7 @@ tf_tcam_bind(struct tf *tfp,
int d, t;
struct tf_rm_alloc_info info;
struct tf_rm_free_db_parms fparms;
- struct tf_rm_create_db_parms db_cfg;
+ struct tf_rm_create_db_parms db_cfg = { 0 };
struct tf_tcam_resources local_tcam_cnt[TF_DIR_MAX];
struct tf_tcam_resources *tcam_cnt;
struct tf_rm_get_alloc_info_parms ainfo;
@@ -1,5 +1,5 @@
/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2021-2023 Broadcom
+ * Copyright(c) 2021-2024 Broadcom
* All rights reserved.
*/
@@ -8,6 +8,7 @@
#include "tfp.h"
#include "tf_tcam.h"
#include "cfa_tcam_mgr.h"
+#include "cfa_tcam_mgr_device.h"
#include "tf_tcam_mgr_msg.h"
/*
@@ -53,13 +54,11 @@ tf_tcam_mgr_qcaps_msg(struct tf *tfp,
uint32_t *rx_tcam_supported,
uint32_t *tx_tcam_supported)
{
- struct cfa_tcam_mgr_context context;
struct cfa_tcam_mgr_qcaps_parms mgr_parms;
int rc;
- context.tfp = tfp;
memset(&mgr_parms, 0, sizeof(mgr_parms));
- rc = cfa_tcam_mgr_qcaps(&context, &mgr_parms);
+ rc = cfa_tcam_mgr_qcaps(tfp, &mgr_parms);
if (rc >= 0) {
*rx_tcam_supported = mgr_parms.rx_tcam_supported;
*tx_tcam_supported = mgr_parms.tx_tcam_supported;
@@ -75,7 +74,10 @@ tf_tcam_mgr_bind_msg(struct tf *tfp,
__rte_unused
)
{
- /* Common Code */
+ struct tf_rm_resc_entry
+ mgr_resv_res[TF_DIR_MAX][CFA_TCAM_MGR_TBL_TYPE_MAX];
+ struct cfa_tcam_mgr_cfg_parms mgr_parms;
+ int dir, rc;
int type;
if (parms->num_elements != TF_TCAM_TBL_TYPE_MAX) {
@@ -91,14 +93,6 @@ tf_tcam_mgr_bind_msg(struct tf *tfp,
for (type = 0; type < TF_TCAM_TBL_TYPE_MAX; type++)
hcapi_type[type] = parms->cfg[type].hcapi_type;
- struct cfa_tcam_mgr_context context;
- struct cfa_tcam_mgr_cfg_parms mgr_parms;
- struct tf_rm_resc_entry
- mgr_resv_res[TF_DIR_MAX][CFA_TCAM_MGR_TBL_TYPE_MAX];
- int dir, rc;
-
- context.tfp = tfp;
-
memset(&mgr_parms, 0, sizeof(mgr_parms));
mgr_parms.num_elements = CFA_TCAM_MGR_TBL_TYPE_MAX;
@@ -116,7 +110,7 @@ tf_tcam_mgr_bind_msg(struct tf *tfp,
}
mgr_parms.resv_res = mgr_resv_res;
- rc = cfa_tcam_mgr_bind(&context, &mgr_parms);
+ rc = cfa_tcam_mgr_bind(tfp, &mgr_parms);
return rc;
}
@@ -125,11 +119,7 @@ int
tf_tcam_mgr_unbind_msg(struct tf *tfp,
struct tf_dev_info *dev __rte_unused)
{
- struct cfa_tcam_mgr_context context;
-
- context.tfp = tfp;
-
- return cfa_tcam_mgr_unbind(&context);
+ return cfa_tcam_mgr_unbind(tfp);
}
int
@@ -137,7 +127,6 @@ tf_tcam_mgr_alloc_msg(struct tf *tfp,
struct tf_dev_info *dev __rte_unused,
struct tf_tcam_alloc_parms *parms)
{
- struct cfa_tcam_mgr_context context;
struct cfa_tcam_mgr_alloc_parms mgr_parms;
int rc;
@@ -148,8 +137,6 @@ tf_tcam_mgr_alloc_msg(struct tf *tfp,
return -EINVAL;
}
- context.tfp = tfp;
-
mgr_parms.dir = parms->dir;
mgr_parms.type = tcam_types[parms->type];
mgr_parms.hcapi_type = hcapi_type[parms->type];
@@ -159,7 +146,7 @@ tf_tcam_mgr_alloc_msg(struct tf *tfp,
else
mgr_parms.priority = TF_TCAM_PRIORITY_MAX - parms->priority - 1;
- rc = cfa_tcam_mgr_alloc(&context, &mgr_parms);
+ rc = cfa_tcam_mgr_alloc(tfp, &mgr_parms);
if (rc)
return rc;
@@ -172,7 +159,6 @@ tf_tcam_mgr_free_msg(struct tf *tfp,
struct tf_dev_info *dev __rte_unused,
struct tf_tcam_free_parms *parms)
{
- struct cfa_tcam_mgr_context context;
struct cfa_tcam_mgr_free_parms mgr_parms;
if (parms->type >= TF_TCAM_TBL_TYPE_MAX) {
@@ -182,13 +168,12 @@ tf_tcam_mgr_free_msg(struct tf *tfp,
return -EINVAL;
}
- context.tfp = tfp;
mgr_parms.dir = parms->dir;
mgr_parms.type = tcam_types[parms->type];
mgr_parms.hcapi_type = hcapi_type[parms->type];
mgr_parms.id = parms->idx;
- return cfa_tcam_mgr_free(&context, &mgr_parms);
+ return cfa_tcam_mgr_free(tfp, &mgr_parms);
}
int
@@ -196,7 +181,6 @@ tf_tcam_mgr_set_msg(struct tf *tfp,
struct tf_dev_info *dev __rte_unused,
struct tf_tcam_set_parms *parms)
{
- struct cfa_tcam_mgr_context context;
struct cfa_tcam_mgr_set_parms mgr_parms;
if (parms->type >= TF_TCAM_TBL_TYPE_MAX) {
@@ -206,7 +190,6 @@ tf_tcam_mgr_set_msg(struct tf *tfp,
return -EINVAL;
}
- context.tfp = tfp;
mgr_parms.dir = parms->dir;
mgr_parms.type = tcam_types[parms->type];
mgr_parms.hcapi_type = hcapi_type[parms->type];
@@ -217,7 +200,7 @@ tf_tcam_mgr_set_msg(struct tf *tfp,
mgr_parms.result = parms->result;
mgr_parms.result_size = parms->result_size;
- return cfa_tcam_mgr_set(&context, &mgr_parms);
+ return cfa_tcam_mgr_set(tfp, &mgr_parms);
}
int
@@ -225,9 +208,8 @@ tf_tcam_mgr_get_msg(struct tf *tfp,
struct tf_dev_info *dev __rte_unused,
struct tf_tcam_get_parms *parms)
{
- int rc;
- struct cfa_tcam_mgr_context context;
struct cfa_tcam_mgr_get_parms mgr_parms;
+ int rc;
if (parms->type >= TF_TCAM_TBL_TYPE_MAX) {
TFP_DRV_LOG(ERR,
@@ -236,7 +218,6 @@ tf_tcam_mgr_get_msg(struct tf *tfp,
return -EINVAL;
}
- context.tfp = tfp;
mgr_parms.dir = parms->dir;
mgr_parms.type = tcam_types[parms->type];
mgr_parms.hcapi_type = hcapi_type[parms->type];
@@ -247,7 +228,7 @@ tf_tcam_mgr_get_msg(struct tf *tfp,
mgr_parms.result = parms->result;
mgr_parms.result_size = parms->result_size;
- rc = cfa_tcam_mgr_get(&context, &mgr_parms);
+ rc = cfa_tcam_mgr_get(tfp, &mgr_parms);
if (rc)
return rc;
@@ -261,26 +242,22 @@ int
tf_tcam_mgr_shared_clear_msg(struct tf *tfp,
struct tf_clear_tcam_shared_entries_parms *parms)
{
- struct cfa_tcam_mgr_context context;
struct cfa_tcam_mgr_shared_clear_parms mgr_parms;
- context.tfp = tfp;
mgr_parms.dir = parms->dir;
mgr_parms.type = tcam_types[parms->tcam_tbl_type];
- return cfa_tcam_mgr_shared_clear(&context, &mgr_parms);
+ return cfa_tcam_mgr_shared_clear(tfp, &mgr_parms);
}
int
tf_tcam_mgr_shared_move_msg(struct tf *tfp,
struct tf_move_tcam_shared_entries_parms *parms)
{
- struct cfa_tcam_mgr_context context;
struct cfa_tcam_mgr_shared_move_parms mgr_parms;
- context.tfp = tfp;
mgr_parms.dir = parms->dir;
mgr_parms.type = tcam_types[parms->tcam_tbl_type];
- return cfa_tcam_mgr_shared_move(&context, &mgr_parms);
+ return cfa_tcam_mgr_shared_move(tfp, &mgr_parms);
}