/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2019-2020 Broadcom
+ * Copyright(c) 2019-2021 Broadcom
* All rights reserved.
*/
return false;
}
+static int32_t
+bnxt_ulp_devid_get(struct bnxt *bp,
+ enum bnxt_ulp_device_id *ulp_dev_id)
+{
+ if (BNXT_CHIP_P5(bp))
+ return -EINVAL;
+ /* Assuming Whitney */
+ *ulp_dev_id = BNXT_ULP_DEVICE_ID_WH_PLUS;
+
+ if (BNXT_STINGRAY(bp))
+ *ulp_dev_id = BNXT_ULP_DEVICE_ID_STINGRAY;
+ else
+ /* Assuming Whitney */
+ *ulp_dev_id = BNXT_ULP_DEVICE_ID_WH_PLUS;
+ return 0;
+}
+
+static int32_t
+bnxt_ulp_tf_session_resources_get(struct bnxt *bp,
+ struct tf_session_resources *res)
+{
+ uint32_t dev_id;
+ int32_t rc;
+
+ rc = bnxt_ulp_cntxt_dev_id_get(bp->ulp_ctx, &dev_id);
+ if (rc) {
+ BNXT_TF_DBG(ERR, "Unable to get device id from ulp.\n");
+ return -EINVAL;
+ }
+
+ switch (dev_id) {
+ case BNXT_ULP_DEVICE_ID_WH_PLUS:
+ /** RX **/
+ /* Identifiers */
+ res->ident_cnt[TF_DIR_RX].cnt[TF_IDENT_TYPE_L2_CTXT_HIGH] = 422;
+ res->ident_cnt[TF_DIR_RX].cnt[TF_IDENT_TYPE_L2_CTXT_LOW] = 6;
+ res->ident_cnt[TF_DIR_RX].cnt[TF_IDENT_TYPE_WC_PROF] = 192;
+ res->ident_cnt[TF_DIR_RX].cnt[TF_IDENT_TYPE_PROF_FUNC] = 64;
+ res->ident_cnt[TF_DIR_RX].cnt[TF_IDENT_TYPE_EM_PROF] = 192;
+
+ /* Table Types */
+ res->tbl_cnt[TF_DIR_RX].cnt[TF_TBL_TYPE_FULL_ACT_RECORD] = 8192;
+ res->tbl_cnt[TF_DIR_RX].cnt[TF_TBL_TYPE_ACT_STATS_64] = 16384;
+ res->tbl_cnt[TF_DIR_RX].cnt[TF_TBL_TYPE_ACT_MODIFY_IPV4] = 1023;
+
+ /* ENCAP */
+ res->tbl_cnt[TF_DIR_RX].cnt[TF_TBL_TYPE_ACT_ENCAP_8B] = 511;
+ res->tbl_cnt[TF_DIR_RX].cnt[TF_TBL_TYPE_ACT_ENCAP_16B] = 63;
+
+ /* TCAMs */
+ res->tcam_cnt[TF_DIR_RX].cnt[TF_TCAM_TBL_TYPE_L2_CTXT_TCAM_HIGH] =
+ 422;
+ res->tcam_cnt[TF_DIR_RX].cnt[TF_TCAM_TBL_TYPE_L2_CTXT_TCAM_LOW] =
+ 6;
+ res->tcam_cnt[TF_DIR_RX].cnt[TF_TCAM_TBL_TYPE_PROF_TCAM] = 960;
+ res->tcam_cnt[TF_DIR_RX].cnt[TF_TCAM_TBL_TYPE_WC_TCAM] = 88;
+
+ /* EM */
+ res->em_cnt[TF_DIR_RX].cnt[TF_EM_TBL_TYPE_EM_RECORD] = 13168;
+
+ /* EEM */
+ res->em_cnt[TF_DIR_RX].cnt[TF_EM_TBL_TYPE_TBL_SCOPE] = 1;
+
+ /* SP */
+ res->tbl_cnt[TF_DIR_RX].cnt[TF_TBL_TYPE_ACT_SP_SMAC] = 255;
+
+ /** TX **/
+ /* Identifiers */
+ res->ident_cnt[TF_DIR_TX].cnt[TF_IDENT_TYPE_L2_CTXT_HIGH] = 292;
+ res->ident_cnt[TF_DIR_TX].cnt[TF_IDENT_TYPE_L2_CTXT_LOW] = 148;
+ res->ident_cnt[TF_DIR_TX].cnt[TF_IDENT_TYPE_WC_PROF] = 192;
+ res->ident_cnt[TF_DIR_TX].cnt[TF_IDENT_TYPE_PROF_FUNC] = 64;
+ res->ident_cnt[TF_DIR_TX].cnt[TF_IDENT_TYPE_EM_PROF] = 192;
+
+ /* Table Types */
+ res->tbl_cnt[TF_DIR_TX].cnt[TF_TBL_TYPE_FULL_ACT_RECORD] = 8192;
+ res->tbl_cnt[TF_DIR_TX].cnt[TF_TBL_TYPE_ACT_STATS_64] = 16384;
+ res->tbl_cnt[TF_DIR_TX].cnt[TF_TBL_TYPE_ACT_MODIFY_IPV4] = 1023;
+
+ /* ENCAP */
+ res->tbl_cnt[TF_DIR_TX].cnt[TF_TBL_TYPE_ACT_ENCAP_64B] = 511;
+ res->tbl_cnt[TF_DIR_TX].cnt[TF_TBL_TYPE_ACT_ENCAP_16B] = 223;
+ res->tbl_cnt[TF_DIR_TX].cnt[TF_TBL_TYPE_ACT_ENCAP_8B] = 255;
+
+ /* TCAMs */
+ res->tcam_cnt[TF_DIR_TX].cnt[TF_TCAM_TBL_TYPE_L2_CTXT_TCAM_HIGH] =
+ 292;
+ res->tcam_cnt[TF_DIR_TX].cnt[TF_TCAM_TBL_TYPE_L2_CTXT_TCAM_LOW] =
+ 144;
+ res->tcam_cnt[TF_DIR_TX].cnt[TF_TCAM_TBL_TYPE_PROF_TCAM] = 960;
+ res->tcam_cnt[TF_DIR_TX].cnt[TF_TCAM_TBL_TYPE_WC_TCAM] = 928;
+
+ /* EM */
+ res->em_cnt[TF_DIR_TX].cnt[TF_EM_TBL_TYPE_EM_RECORD] = 15232;
+
+ /* EEM */
+ res->em_cnt[TF_DIR_TX].cnt[TF_EM_TBL_TYPE_TBL_SCOPE] = 1;
+
+ /* SP */
+ res->tbl_cnt[TF_DIR_TX].cnt[TF_TBL_TYPE_ACT_SP_SMAC_IPV4] = 488;
+ res->tbl_cnt[TF_DIR_TX].cnt[TF_TBL_TYPE_ACT_SP_SMAC_IPV6] = 511;
+ break;
+ case BNXT_ULP_DEVICE_ID_STINGRAY:
+ /** RX **/
+ /* Identifiers */
+ res->ident_cnt[TF_DIR_RX].cnt[TF_IDENT_TYPE_L2_CTXT_HIGH] = 315;
+ res->ident_cnt[TF_DIR_RX].cnt[TF_IDENT_TYPE_L2_CTXT_LOW] = 6;
+ res->ident_cnt[TF_DIR_RX].cnt[TF_IDENT_TYPE_WC_PROF] = 192;
+ res->ident_cnt[TF_DIR_RX].cnt[TF_IDENT_TYPE_PROF_FUNC] = 64;
+ res->ident_cnt[TF_DIR_RX].cnt[TF_IDENT_TYPE_EM_PROF] = 192;
+
+ /* Table Types */
+ res->tbl_cnt[TF_DIR_RX].cnt[TF_TBL_TYPE_FULL_ACT_RECORD] = 8192;
+ res->tbl_cnt[TF_DIR_RX].cnt[TF_TBL_TYPE_ACT_STATS_64] = 16384;
+ res->tbl_cnt[TF_DIR_RX].cnt[TF_TBL_TYPE_ACT_MODIFY_IPV4] = 1023;
+
+ /* ENCAP */
+ res->tbl_cnt[TF_DIR_RX].cnt[TF_TBL_TYPE_ACT_ENCAP_8B] = 511;
+ res->tbl_cnt[TF_DIR_RX].cnt[TF_TBL_TYPE_ACT_ENCAP_16B] = 63;
+
+ /* TCAMs */
+ res->tcam_cnt[TF_DIR_RX].cnt[TF_TCAM_TBL_TYPE_L2_CTXT_TCAM_HIGH] =
+ 315;
+ res->tcam_cnt[TF_DIR_RX].cnt[TF_TCAM_TBL_TYPE_L2_CTXT_TCAM_LOW] =
+ 6;
+ res->tcam_cnt[TF_DIR_RX].cnt[TF_TCAM_TBL_TYPE_PROF_TCAM] = 960;
+ res->tcam_cnt[TF_DIR_RX].cnt[TF_TCAM_TBL_TYPE_WC_TCAM] = 112;
+
+ /* EM */
+ res->em_cnt[TF_DIR_RX].cnt[TF_EM_TBL_TYPE_EM_RECORD] = 13200;
+
+ /* EEM */
+ res->em_cnt[TF_DIR_RX].cnt[TF_EM_TBL_TYPE_TBL_SCOPE] = 1;
+
+ /* SP */
+ res->tbl_cnt[TF_DIR_RX].cnt[TF_TBL_TYPE_ACT_SP_SMAC] = 256;
+
+ /** TX **/
+ /* Identifiers */
+ res->ident_cnt[TF_DIR_TX].cnt[TF_IDENT_TYPE_L2_CTXT_HIGH] = 292;
+ res->ident_cnt[TF_DIR_TX].cnt[TF_IDENT_TYPE_L2_CTXT_LOW] = 127;
+ res->ident_cnt[TF_DIR_TX].cnt[TF_IDENT_TYPE_WC_PROF] = 192;
+ res->ident_cnt[TF_DIR_TX].cnt[TF_IDENT_TYPE_PROF_FUNC] = 64;
+ res->ident_cnt[TF_DIR_TX].cnt[TF_IDENT_TYPE_EM_PROF] = 192;
+
+ /* Table Types */
+ res->tbl_cnt[TF_DIR_TX].cnt[TF_TBL_TYPE_FULL_ACT_RECORD] = 8192;
+ res->tbl_cnt[TF_DIR_TX].cnt[TF_TBL_TYPE_ACT_STATS_64] = 16384;
+ res->tbl_cnt[TF_DIR_TX].cnt[TF_TBL_TYPE_ACT_MODIFY_IPV4] = 1023;
+
+ /* ENCAP */
+ res->tbl_cnt[TF_DIR_TX].cnt[TF_TBL_TYPE_ACT_ENCAP_64B] = 367;
+ res->tbl_cnt[TF_DIR_TX].cnt[TF_TBL_TYPE_ACT_ENCAP_16B] = 223;
+ res->tbl_cnt[TF_DIR_TX].cnt[TF_TBL_TYPE_ACT_ENCAP_8B] = 255;
+
+ /* TCAMs */
+ res->tcam_cnt[TF_DIR_TX].cnt[TF_TCAM_TBL_TYPE_L2_CTXT_TCAM_HIGH] =
+ 292;
+ res->tcam_cnt[TF_DIR_TX].cnt[TF_TCAM_TBL_TYPE_L2_CTXT_TCAM_LOW] =
+ 127;
+ res->tcam_cnt[TF_DIR_TX].cnt[TF_TCAM_TBL_TYPE_PROF_TCAM] = 960;
+ res->tcam_cnt[TF_DIR_TX].cnt[TF_TCAM_TBL_TYPE_WC_TCAM] = 928;
+
+ /* EM */
+ res->em_cnt[TF_DIR_TX].cnt[TF_EM_TBL_TYPE_EM_RECORD] = 15232;
+
+ /* EEM */
+ res->em_cnt[TF_DIR_TX].cnt[TF_EM_TBL_TYPE_TBL_SCOPE] = 1;
+
+ /* SP */
+ res->tbl_cnt[TF_DIR_TX].cnt[TF_TBL_TYPE_ACT_SP_SMAC_IPV4] = 488;
+ res->tbl_cnt[TF_DIR_TX].cnt[TF_TBL_TYPE_ACT_SP_SMAC_IPV6] = 512;
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
/*
* Initialize an ULP session.
* An ULP session will contain all the resources needed to support rte flow
int32_t rc = 0;
struct tf_open_session_parms params;
struct tf_session_resources *resources;
+ uint32_t ulp_dev_id;
memset(¶ms, 0, sizeof(params));
}
params.shadow_copy = true;
- params.device_type = TF_DEVICE_TYPE_WH;
+
+ rc = bnxt_ulp_cntxt_dev_id_get(bp->ulp_ctx, &ulp_dev_id);
+ if (rc) {
+ BNXT_TF_DBG(ERR, "Unable to get device id from ulp.\n");
+ return rc;
+ }
+
+ switch (ulp_dev_id) {
+ case BNXT_ULP_DEVICE_ID_WH_PLUS:
+ params.device_type = TF_DEVICE_TYPE_WH;
+ break;
+ case BNXT_ULP_DEVICE_ID_STINGRAY:
+ params.device_type = TF_DEVICE_TYPE_SR;
+ break;
+ default:
+ BNXT_TF_DBG(ERR, "Unable to determine device for "
+ "opening session.\n");
+ return rc;
+ }
+
resources = ¶ms.resources;
- /** RX **/
- /* Identifiers */
- resources->ident_cnt[TF_DIR_RX].cnt[TF_IDENT_TYPE_L2_CTXT_HIGH] = 422;
- resources->ident_cnt[TF_DIR_RX].cnt[TF_IDENT_TYPE_L2_CTXT_LOW] = 6;
- resources->ident_cnt[TF_DIR_RX].cnt[TF_IDENT_TYPE_WC_PROF] = 192;
- resources->ident_cnt[TF_DIR_RX].cnt[TF_IDENT_TYPE_PROF_FUNC] = 64;
- resources->ident_cnt[TF_DIR_RX].cnt[TF_IDENT_TYPE_EM_PROF] = 192;
-
- /* Table Types */
- resources->tbl_cnt[TF_DIR_RX].cnt[TF_TBL_TYPE_FULL_ACT_RECORD] = 8192;
- resources->tbl_cnt[TF_DIR_RX].cnt[TF_TBL_TYPE_ACT_STATS_64] = 8192;
- resources->tbl_cnt[TF_DIR_RX].cnt[TF_TBL_TYPE_ACT_MODIFY_IPV4] = 1023;
-
- /* ENCAP */
- resources->tbl_cnt[TF_DIR_RX].cnt[TF_TBL_TYPE_ACT_ENCAP_8B] = 511;
- resources->tbl_cnt[TF_DIR_RX].cnt[TF_TBL_TYPE_ACT_ENCAP_16B] = 63;
-
- /* TCAMs */
- resources->tcam_cnt[TF_DIR_RX].cnt[TF_TCAM_TBL_TYPE_L2_CTXT_TCAM_HIGH] =
- 422;
- resources->tcam_cnt[TF_DIR_RX].cnt[TF_TCAM_TBL_TYPE_L2_CTXT_TCAM_LOW] =
- 6;
- resources->tcam_cnt[TF_DIR_RX].cnt[TF_TCAM_TBL_TYPE_PROF_TCAM] = 960;
- resources->tcam_cnt[TF_DIR_RX].cnt[TF_TCAM_TBL_TYPE_WC_TCAM] = 88;
-
- /* EM */
- resources->em_cnt[TF_DIR_RX].cnt[TF_EM_TBL_TYPE_EM_RECORD] = 13168;
-
- /* EEM */
- resources->em_cnt[TF_DIR_RX].cnt[TF_EM_TBL_TYPE_TBL_SCOPE] = 1;
-
- /* SP */
- resources->tbl_cnt[TF_DIR_RX].cnt[TF_TBL_TYPE_ACT_SP_SMAC] = 255;
-
- /** TX **/
- /* Identifiers */
- resources->ident_cnt[TF_DIR_TX].cnt[TF_IDENT_TYPE_L2_CTXT_HIGH] = 292;
- resources->ident_cnt[TF_DIR_TX].cnt[TF_IDENT_TYPE_L2_CTXT_LOW] = 148;
- resources->ident_cnt[TF_DIR_TX].cnt[TF_IDENT_TYPE_WC_PROF] = 192;
- resources->ident_cnt[TF_DIR_TX].cnt[TF_IDENT_TYPE_PROF_FUNC] = 64;
- resources->ident_cnt[TF_DIR_TX].cnt[TF_IDENT_TYPE_EM_PROF] = 192;
-
- /* Table Types */
- resources->tbl_cnt[TF_DIR_TX].cnt[TF_TBL_TYPE_FULL_ACT_RECORD] = 8192;
- resources->tbl_cnt[TF_DIR_TX].cnt[TF_TBL_TYPE_ACT_STATS_64] = 8192;
- resources->tbl_cnt[TF_DIR_TX].cnt[TF_TBL_TYPE_ACT_MODIFY_IPV4] = 1023;
-
- /* ENCAP */
- resources->tbl_cnt[TF_DIR_TX].cnt[TF_TBL_TYPE_ACT_ENCAP_64B] = 511;
- resources->tbl_cnt[TF_DIR_TX].cnt[TF_TBL_TYPE_ACT_ENCAP_16B] = 223;
- resources->tbl_cnt[TF_DIR_TX].cnt[TF_TBL_TYPE_ACT_ENCAP_8B] = 255;
-
- /* TCAMs */
- resources->tcam_cnt[TF_DIR_TX].cnt[TF_TCAM_TBL_TYPE_L2_CTXT_TCAM_HIGH] =
- 292;
- resources->tcam_cnt[TF_DIR_TX].cnt[TF_TCAM_TBL_TYPE_L2_CTXT_TCAM_LOW] =
- 144;
- resources->tcam_cnt[TF_DIR_TX].cnt[TF_TCAM_TBL_TYPE_PROF_TCAM] = 960;
- resources->tcam_cnt[TF_DIR_TX].cnt[TF_TCAM_TBL_TYPE_WC_TCAM] = 928;
-
- /* EM */
- resources->em_cnt[TF_DIR_TX].cnt[TF_EM_TBL_TYPE_EM_RECORD] = 15232;
-
- /* EEM */
- resources->em_cnt[TF_DIR_TX].cnt[TF_EM_TBL_TYPE_TBL_SCOPE] = 1;
-
- /* SP */
- resources->tbl_cnt[TF_DIR_TX].cnt[TF_TBL_TYPE_ACT_SP_SMAC_IPV4] = 488;
+ rc = bnxt_ulp_tf_session_resources_get(bp, resources);
+ if (rc) {
+ BNXT_TF_DBG(ERR, "Unable to determine tf resources for "
+ "session open.\n");
+ return rc;
+ }
rc = tf_open_session(&bp->tfp, ¶ms);
if (rc) {
}
if (!session->session_opened) {
session->session_opened = 1;
- session->g_tfp = &bp->tfp;
+ session->g_tfp = rte_zmalloc("bnxt_ulp_session_tfp",
+ sizeof(struct tf), 0);
+ session->g_tfp->session = bp->tfp.session;
}
return rc;
}
if (session->session_opened)
tf_close_session(&bp->tfp);
session->session_opened = 0;
+ rte_free(session->g_tfp);
session->g_tfp = NULL;
}
params->rx_max_action_entry_sz_in_bits =
BNXT_ULP_DFLT_RX_MAX_ACTN_ENTRY;
params->rx_mem_size_in_mb = BNXT_ULP_DFLT_RX_MEM;
- params->rx_num_flows_in_k = dparms->flow_db_num_entries / 1024;
+ params->rx_num_flows_in_k =
+ dparms->ext_flow_db_num_entries / 1024;
params->rx_tbl_if_id = BNXT_ULP_RX_TBL_IF_ID;
params->tx_max_key_sz_in_bits = BNXT_ULP_DFLT_TX_MAX_KEY;
params->tx_max_action_entry_sz_in_bits =
BNXT_ULP_DFLT_TX_MAX_ACTN_ENTRY;
params->tx_mem_size_in_mb = BNXT_ULP_DFLT_TX_MEM;
- params->tx_num_flows_in_k = dparms->flow_db_num_entries / 1024;
+ params->tx_num_flows_in_k =
+ dparms->ext_flow_db_num_entries / 1024;
params->tx_tbl_if_id = BNXT_ULP_TX_TBL_IF_ID;
}
+ BNXT_TF_DBG(INFO, "Table Scope initialized with %uK flows.\n",
+ params->rx_num_flows_in_k);
}
/* Initialize Extended Exact Match host memory. */
ulp_eem_tbl_scope_init(struct bnxt *bp)
{
struct tf_alloc_tbl_scope_parms params = {0};
- uint32_t dev_id;
struct bnxt_ulp_device_params *dparms;
+ enum bnxt_ulp_flow_mem_type mtype;
+ uint32_t dev_id;
int rc;
/* Get the dev specific number of flows that needed to be supported. */
return -ENODEV;
}
- if (dparms->flow_mem_type != BNXT_ULP_FLOW_MEM_TYPE_EXT) {
+ if (bnxt_ulp_cntxt_mem_type_get(bp->ulp_ctx, &mtype))
+ return -EINVAL;
+
+ if (mtype != BNXT_ULP_FLOW_MEM_TYPE_EXT) {
BNXT_TF_DBG(INFO, "Table Scope alloc is not required\n");
return 0;
}
struct tf *tfp;
int32_t rc = 0;
struct bnxt_ulp_device_params *dparms;
+ enum bnxt_ulp_flow_mem_type mtype;
uint32_t dev_id;
if (!ulp_ctx || !ulp_ctx->cfg_data)
return -ENODEV;
}
- if (dparms->flow_mem_type != BNXT_ULP_FLOW_MEM_TYPE_EXT) {
+ if (bnxt_ulp_cntxt_mem_type_get(ulp_ctx, &mtype))
+ return -EINVAL;
+ if (mtype != BNXT_ULP_FLOW_MEM_TYPE_EXT) {
BNXT_TF_DBG(INFO, "Table Scope free is not required\n");
return 0;
}
{
struct bnxt_ulp_data *ulp_data;
int32_t rc = 0;
+ enum bnxt_ulp_device_id devid;
/* Allocate memory to hold ulp context data. */
ulp_data = rte_zmalloc("bnxt_ulp_data",
ulp_data->ref_cnt++;
ulp_data->ulp_flags |= BNXT_ULP_VF_REP_ENABLED;
- /* Open the ulp session. */
- rc = ulp_ctx_session_open(bp, session);
+ rc = bnxt_ulp_devid_get(bp, &devid);
if (rc) {
- session->session_opened = 1;
- (void)ulp_ctx_deinit(bp, session);
- return rc;
+ BNXT_TF_DBG(ERR, "Unable to determine device for ULP init.\n");
+ goto error_deinit;
+ }
+
+ rc = bnxt_ulp_cntxt_dev_id_set(bp->ulp_ctx, devid);
+ if (rc) {
+ BNXT_TF_DBG(ERR, "Unable to set device for ULP init.\n");
+ goto error_deinit;
}
+ /* Open the ulp session. */
+ rc = ulp_ctx_session_open(bp, session);
+ if (rc)
+ goto error_deinit;
+
bnxt_ulp_cntxt_tfp_set(bp->ulp_ctx, &bp->tfp);
return rc;
+
+error_deinit:
+ session->session_opened = 1;
+ (void)ulp_ctx_deinit(bp, session);
+ return rc;
}
/* The function to initialize ulp dparms with devargs */
struct bnxt_ulp_device_params *dparms;
uint32_t dev_id;
- if (!bp->max_num_kflows)
+ if (!bp->max_num_kflows) {
+ /* Defaults to Internal */
+ bnxt_ulp_cntxt_mem_type_set(ulp_ctx,
+ BNXT_ULP_FLOW_MEM_TYPE_INT);
return 0;
+ }
+
+ /* The max_num_kflows were set, so move to external */
+ if (bnxt_ulp_cntxt_mem_type_set(ulp_ctx, BNXT_ULP_FLOW_MEM_TYPE_EXT))
+ return -EINVAL;
if (bnxt_ulp_cntxt_dev_id_get(ulp_ctx, &dev_id)) {
BNXT_TF_DBG(DEBUG, "Failed to get device id\n");
}
/* num_flows = max_num_kflows * 1024 */
- dparms->flow_db_num_entries = bp->max_num_kflows * 1024;
+ dparms->ext_flow_db_num_entries = bp->max_num_kflows * 1024;
/* GFID = 2 * num_flows */
- dparms->mark_db_gfid_entries = dparms->flow_db_num_entries * 2;
+ dparms->mark_db_gfid_entries = dparms->ext_flow_db_num_entries * 2;
BNXT_TF_DBG(DEBUG, "Set the number of flows = %"PRIu64"\n",
- dparms->flow_db_num_entries);
+ dparms->ext_flow_db_num_entries);
return 0;
}
ulp_dparms_dev_port_intf_update(struct bnxt *bp,
struct bnxt_ulp_context *ulp_ctx)
{
- struct bnxt_ulp_device_params *dparms;
- uint32_t dev_id;
+ enum bnxt_ulp_flow_mem_type mtype;
- if (bnxt_ulp_cntxt_dev_id_get(ulp_ctx, &dev_id)) {
- BNXT_TF_DBG(DEBUG, "Failed to get device id\n");
- return -EINVAL;
- }
-
- dparms = bnxt_ulp_device_params_get(dev_id);
- if (!dparms) {
- BNXT_TF_DBG(DEBUG, "Failed to get device parms\n");
+ if (bnxt_ulp_cntxt_mem_type_get(ulp_ctx, &mtype))
return -EINVAL;
- }
-
/* Update the bp flag with gfid flag */
- if (dparms->flow_mem_type == BNXT_ULP_FLOW_MEM_TYPE_EXT)
+ if (mtype == BNXT_ULP_FLOW_MEM_TYPE_EXT)
bp->flags |= BNXT_FLAG_GFID_ENABLE;
return 0;
{
uint32_t global_cfg = 0;
int rc;
- struct tf_global_cfg_parms parms;
+ struct tf_global_cfg_parms parms = { 0 };
/* Initialize the params */
parms.dir = dir,
bnxt_ulp_destroy_vfr_default_rules(struct bnxt *bp, bool global)
{
struct bnxt_ulp_vfr_rule_info *info;
- uint8_t port_id;
+ uint16_t port_id;
struct rte_eth_dev *vfr_eth_dev;
- struct bnxt_vf_representor *vfr_bp;
+ struct bnxt_representor *vfr_bp;
if (!BNXT_TRUFLOW_EN(bp) || BNXT_ETH_DEV_IS_REPRESENTOR(bp->eth_dev))
return;
bnxt_ulp_destroy_vfr_default_rules(bp, true);
/* clean up regular flows */
- ulp_flow_db_flush_flows(bp->ulp_ctx, BNXT_ULP_REGULAR_FLOW_TABLE);
+ ulp_flow_db_flush_flows(bp->ulp_ctx, BNXT_ULP_FDB_TYPE_REGULAR);
/* cleanup the eem table scope */
ulp_eem_tbl_scope_deinit(bp, bp->ulp_ctx);
/* Disable NAT feature */
(void)bnxt_ulp_global_cfg_update(bp, TF_DIR_RX, TF_TUNNEL_ENCAP,
TF_TUNNEL_ENCAP_NAT,
- (BNXT_ULP_NAT_INNER_L2_HEADER_SMAC |
- BNXT_ULP_NAT_INNER_L2_HEADER_DMAC),
- 0);
+ BNXT_ULP_NAT_OUTER_MOST_FLAGS, 0);
(void)bnxt_ulp_global_cfg_update(bp, TF_DIR_TX, TF_TUNNEL_ENCAP,
TF_TUNNEL_ENCAP_NAT,
- (BNXT_ULP_NAT_INNER_L2_HEADER_SMAC |
- BNXT_ULP_NAT_INNER_L2_HEADER_DMAC),
- 0);
+ BNXT_ULP_NAT_OUTER_MOST_FLAGS, 0);
+
+ /* free the flow db lock */
+ pthread_mutex_destroy(&bp->ulp_ctx->cfg_data->flow_db_lock);
/* Delete the ulp context and tf session and free the ulp context */
ulp_ctx_deinit(bp, session);
goto jump_to_error;
}
+ rc = pthread_mutex_init(&bp->ulp_ctx->cfg_data->flow_db_lock, NULL);
+ if (rc) {
+ BNXT_TF_DBG(ERR, "Unable to initialize flow db lock\n");
+ goto jump_to_error;
+ }
+
/* Initialize ulp dparms with values devargs passed */
rc = ulp_dparms_init(bp, bp->ulp_ctx);
if (rc) {
*/
rc = bnxt_ulp_global_cfg_update(bp, TF_DIR_RX, TF_TUNNEL_ENCAP,
TF_TUNNEL_ENCAP_NAT,
- (BNXT_ULP_NAT_INNER_L2_HEADER_SMAC |
- BNXT_ULP_NAT_INNER_L2_HEADER_DMAC), 1);
+ BNXT_ULP_NAT_OUTER_MOST_FLAGS, 1);
if (rc) {
BNXT_TF_DBG(ERR, "Failed to set rx global configuration\n");
goto jump_to_error;
rc = bnxt_ulp_global_cfg_update(bp, TF_DIR_TX, TF_TUNNEL_ENCAP,
TF_TUNNEL_ENCAP_NAT,
- (BNXT_ULP_NAT_INNER_L2_HEADER_SMAC |
- BNXT_ULP_NAT_INNER_L2_HEADER_DMAC), 1);
+ BNXT_ULP_NAT_OUTER_MOST_FLAGS, 1);
if (rc) {
BNXT_TF_DBG(ERR, "Failed to set tx global configuration\n");
goto jump_to_error;
return 0;
}
+ BNXT_TF_DBG(ERR, "Failed to read dev_id from ulp ctxt\n");
+ return -EINVAL;
+}
+
+int32_t
+bnxt_ulp_cntxt_mem_type_set(struct bnxt_ulp_context *ulp_ctx,
+ enum bnxt_ulp_flow_mem_type mem_type)
+{
+ if (ulp_ctx && ulp_ctx->cfg_data) {
+ ulp_ctx->cfg_data->mem_type = mem_type;
+ return 0;
+ }
+ BNXT_TF_DBG(ERR, "Failed to write mem_type in ulp ctxt\n");
+ return -EINVAL;
+}
+
+int32_t
+bnxt_ulp_cntxt_mem_type_get(struct bnxt_ulp_context *ulp_ctx,
+ enum bnxt_ulp_flow_mem_type *mem_type)
+{
+ if (ulp_ctx && ulp_ctx->cfg_data) {
+ *mem_type = ulp_ctx->cfg_data->mem_type;
+ return 0;
+ }
+ BNXT_TF_DBG(ERR, "Failed to read mem_type in ulp ctxt\n");
return -EINVAL;
}
return ulp_ctx->cfg_data->flow_db;
}
+/* Function to get the tunnel cache table info from the ulp context. */
+struct bnxt_tun_cache_entry *
+bnxt_ulp_cntxt_ptr2_tun_tbl_get(struct bnxt_ulp_context *ulp_ctx)
+{
+ if (!ulp_ctx || !ulp_ctx->cfg_data)
+ return NULL;
+
+ return ulp_ctx->cfg_data->tun_tbl;
+}
+
/* Function to get the ulp context from eth device. */
struct bnxt_ulp_context *
bnxt_ulp_eth_dev_ptr2_cntxt_get(struct rte_eth_dev *dev)
struct bnxt *bp = (struct bnxt *)dev->data->dev_private;
if (BNXT_ETH_DEV_IS_REPRESENTOR(dev)) {
- struct bnxt_vf_representor *vfr = dev->data->dev_private;
+ struct bnxt_representor *vfr = dev->data->dev_private;
bp = vfr->parent_dev->data->dev_private;
}
return &ulp_ctx->cfg_data->vfr_rule_info[port_id];
}
+
+/* Function to acquire the flow database lock from the ulp context. */
+int32_t
+bnxt_ulp_cntxt_acquire_fdb_lock(struct bnxt_ulp_context *ulp_ctx)
+{
+ if (!ulp_ctx || !ulp_ctx->cfg_data)
+ return -1;
+
+ if (pthread_mutex_lock(&ulp_ctx->cfg_data->flow_db_lock)) {
+ BNXT_TF_DBG(ERR, "unable to acquire fdb lock\n");
+ return -1;
+ }
+ return 0;
+}
+
+/* Function to release the flow database lock from the ulp context. */
+void
+bnxt_ulp_cntxt_release_fdb_lock(struct bnxt_ulp_context *ulp_ctx)
+{
+ if (!ulp_ctx || !ulp_ctx->cfg_data)
+ return;
+
+ pthread_mutex_unlock(&ulp_ctx->cfg_data->flow_db_lock);
+}