X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fbnxt%2Ftf_core%2Ftf_tbl.c;h=ced59130b2ddea013c8fa7e7eaed6fc2d75d7c3a;hb=aebe3cb74c9046a122e948ef9631988423175cea;hp=2b4a7c5613551c24baa1e0a0536ad81427cb0326;hpb=aa2be5093363b57a6ad102bad9732b08c8c1f5ab;p=dpdk.git diff --git a/drivers/net/bnxt/tf_core/tf_tbl.c b/drivers/net/bnxt/tf_core/tf_tbl.c index 2b4a7c5613..ced59130b2 100644 --- a/drivers/net/bnxt/tf_core/tf_tbl.c +++ b/drivers/net/bnxt/tf_core/tf_tbl.c @@ -1,5 +1,5 @@ /* SPDX-License-Identifier: BSD-3-Clause - * Copyright(c) 2019-2020 Broadcom + * Copyright(c) 2019-2021 Broadcom * All rights reserved. */ @@ -13,66 +13,85 @@ #include "tf_util.h" #include "tf_msg.h" #include "tfp.h" +#include "tf_session.h" +#include "tf_device.h" +#define TF_TBL_RM_TO_PTR(new_idx, idx, base, shift) { \ + *(new_idx) = (((idx) + (base)) << (shift)); \ +} -struct tf; +#define TF_TBL_PTR_TO_RM(new_idx, idx, base, shift) { \ + *(new_idx) = (((idx) >> (shift)) - (base)); \ +} -/** - * Table DBs. - */ -static void *tbl_db[TF_DIR_MAX]; +struct tf; /** * Table Shadow DBs */ -/* static void *shadow_tbl_db[TF_DIR_MAX]; */ - -/** - * Init flag, set on bind and cleared on unbind - */ -static uint8_t init; +static void *shadow_tbl_db[TF_DIR_MAX]; /** * Shadow init flag, set on bind and cleared on unbind */ -/* static uint8_t shadow_init; */ +static uint8_t shadow_init; int tf_tbl_bind(struct tf *tfp, struct tf_tbl_cfg_parms *parms) { - int rc; - int i; + int rc, d, i; + int db_rc[TF_DIR_MAX] = { 0 }; struct tf_rm_create_db_parms db_cfg = { 0 }; + struct tbl_rm_db *tbl_db; + struct tfp_calloc_parms cparms; + struct tf_session *tfs; TF_CHECK_PARMS2(tfp, parms); - if (init) { - TFP_DRV_LOG(ERR, - "Table DB already initialized\n"); - return -EINVAL; + /* Retrieve the session information */ + rc = tf_session_get_session_internal(tfp, &tfs); + if (rc) + return rc; + + memset(&db_cfg, 0, sizeof(db_cfg)); + cparms.nitems = 1; + cparms.size = sizeof(struct tbl_rm_db); + cparms.alignment = 0; + if (tfp_calloc(&cparms) != 0) { + TFP_DRV_LOG(ERR, "tbl_rm_db alloc error %s\n", + strerror(ENOMEM)); + return -ENOMEM; } + tbl_db = cparms.mem_va; + for (i = 0; i < TF_DIR_MAX; i++) + tbl_db->tbl_db[i] = NULL; + tf_session_set_db(tfp, TF_MODULE_TYPE_TABLE, tbl_db); + db_cfg.num_elements = parms->num_elements; - db_cfg.type = TF_DEVICE_MODULE_TYPE_TABLE; + db_cfg.module = TF_MODULE_TYPE_TABLE; db_cfg.num_elements = parms->num_elements; db_cfg.cfg = parms->cfg; - for (i = 0; i < TF_DIR_MAX; i++) { - db_cfg.dir = i; - db_cfg.alloc_cnt = parms->resources->tbl_cnt[i].cnt; - db_cfg.rm_db = &tbl_db[i]; - rc = tf_rm_create_db(tfp, &db_cfg); - if (rc) { - TFP_DRV_LOG(ERR, - "%s: Table DB creation failed\n", - tf_dir_2_str(i)); - - return rc; - } + for (d = 0; d < TF_DIR_MAX; d++) { + db_cfg.dir = d; + db_cfg.alloc_cnt = parms->resources->tbl_cnt[d].cnt; + db_cfg.rm_db = (void *)&tbl_db->tbl_db[d]; + if (tf_session_is_shared_session(tfs) && + (!tf_session_is_shared_session_creator(tfs))) + db_rc[d] = tf_rm_create_db_no_reservation(tfp, &db_cfg); + else + db_rc[d] = tf_rm_create_db(tfp, &db_cfg); } - init = 1; + /* No db created */ + if (db_rc[TF_DIR_RX] && db_rc[TF_DIR_TX]) { + TFP_DRV_LOG(ERR, + "%s: No Table DB created\n", + tf_dir_2_str(d)); + return db_rc[TF_DIR_RX]; + } TFP_DRV_LOG(INFO, "Table Type - initialized\n"); @@ -86,27 +105,28 @@ tf_tbl_unbind(struct tf *tfp) int rc; int i; struct tf_rm_free_db_parms fparms = { 0 }; - + struct tbl_rm_db *tbl_db; + void *tbl_db_ptr = NULL; TF_CHECK_PARMS1(tfp); - /* Bail if nothing has been initialized */ - if (!init) { - TFP_DRV_LOG(INFO, - "No Table DBs created\n"); + rc = tf_session_get_db(tfp, TF_MODULE_TYPE_TABLE, &tbl_db_ptr); + if (rc) return 0; - } + tbl_db = (struct tbl_rm_db *)tbl_db_ptr; for (i = 0; i < TF_DIR_MAX; i++) { + if (tbl_db->tbl_db[i] == NULL) + continue; fparms.dir = i; - fparms.rm_db = tbl_db[i]; + fparms.rm_db = tbl_db->tbl_db[i]; rc = tf_rm_free_db(tfp, &fparms); if (rc) return rc; - tbl_db[i] = NULL; + tbl_db->tbl_db[i] = NULL; } - init = 0; + shadow_init = 0; return 0; } @@ -118,19 +138,52 @@ tf_tbl_alloc(struct tf *tfp __rte_unused, int rc; uint32_t idx; struct tf_rm_allocate_parms aparms = { 0 }; + struct tf_session *tfs; + struct tf_dev_info *dev; + uint16_t base = 0, shift = 0; + struct tbl_rm_db *tbl_db; + void *tbl_db_ptr = NULL; TF_CHECK_PARMS2(tfp, parms); - if (!init) { + /* Retrieve the session information */ + 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; + + rc = tf_session_get_db(tfp, TF_MODULE_TYPE_TABLE, &tbl_db_ptr); + if (rc) { TFP_DRV_LOG(ERR, - "%s: No Table DBs created\n", - tf_dir_2_str(parms->dir)); - return -EINVAL; + "Failed to get em_ext_db from session, rc:%s\n", + strerror(-rc)); + return rc; + } + tbl_db = (struct tbl_rm_db *)tbl_db_ptr; + + /* Only get table info if required for the device */ + if (dev->ops->tf_dev_get_tbl_info) { + rc = dev->ops->tf_dev_get_tbl_info(tfp, + tbl_db->tbl_db[parms->dir], + parms->type, + &base, + &shift); + if (rc) { + TFP_DRV_LOG(ERR, + "%s: Failed to get table info:%d\n", + tf_dir_2_str(parms->dir), + parms->type); + return rc; + } } /* Allocate requested element */ - aparms.rm_db = tbl_db[parms->dir]; - aparms.db_index = parms->type; + aparms.rm_db = tbl_db->tbl_db[parms->dir]; + aparms.subtype = parms->type; aparms.index = &idx; rc = tf_rm_allocate(&aparms); if (rc) { @@ -141,6 +194,7 @@ tf_tbl_alloc(struct tf *tfp __rte_unused, return rc; } + TF_TBL_RM_TO_PTR(&idx, idx, base, shift); *parms->idx = idx; return 0; @@ -154,20 +208,55 @@ tf_tbl_free(struct tf *tfp __rte_unused, struct tf_rm_is_allocated_parms aparms = { 0 }; struct tf_rm_free_parms fparms = { 0 }; int allocated = 0; + struct tf_session *tfs; + struct tf_dev_info *dev; + uint16_t base = 0, shift = 0; + struct tbl_rm_db *tbl_db; + void *tbl_db_ptr = NULL; TF_CHECK_PARMS2(tfp, parms); - if (!init) { + /* Retrieve the session information */ + 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; + + rc = tf_session_get_db(tfp, TF_MODULE_TYPE_TABLE, &tbl_db_ptr); + if (rc) { TFP_DRV_LOG(ERR, - "%s: No Table DBs created\n", - tf_dir_2_str(parms->dir)); - return -EINVAL; + "Failed to get em_ext_db from session, rc:%s\n", + strerror(-rc)); + return rc; + } + tbl_db = (struct tbl_rm_db *)tbl_db_ptr; + + /* Only get table info if required for the device */ + if (dev->ops->tf_dev_get_tbl_info) { + rc = dev->ops->tf_dev_get_tbl_info(tfp, + tbl_db->tbl_db[parms->dir], + parms->type, + &base, + &shift); + if (rc) { + TFP_DRV_LOG(ERR, + "%s: Failed to get table info:%d\n", + tf_dir_2_str(parms->dir), + parms->type); + return rc; + } } /* Check if element is in use */ - aparms.rm_db = tbl_db[parms->dir]; - aparms.db_index = parms->type; - aparms.index = parms->idx; + aparms.rm_db = tbl_db->tbl_db[parms->dir]; + aparms.subtype = parms->type; + + TF_TBL_PTR_TO_RM(&aparms.index, parms->idx, base, shift); + aparms.allocated = &allocated; rc = tf_rm_is_allocated(&aparms); if (rc) @@ -182,10 +271,49 @@ tf_tbl_free(struct tf *tfp __rte_unused, return -EINVAL; } + /* If this is counter table, clear the entry on free */ + if (parms->type == TF_TBL_TYPE_ACT_STATS_64) { + uint8_t data[8] = { 0 }; + uint16_t hcapi_type = 0; + struct tf_rm_get_hcapi_parms hparms = { 0 }; + + /* Get the hcapi type */ + hparms.rm_db = tbl_db->tbl_db[parms->dir]; + hparms.subtype = parms->type; + hparms.hcapi_type = &hcapi_type; + rc = tf_rm_get_hcapi_type(&hparms); + if (rc) { + TFP_DRV_LOG(ERR, + "%s, Failed type lookup, type:%d, rc:%s\n", + tf_dir_2_str(parms->dir), + parms->type, + strerror(-rc)); + return rc; + } + /* Clear the counter + */ + rc = tf_msg_set_tbl_entry(tfp, + parms->dir, + hcapi_type, + sizeof(data), + data, + parms->idx); + if (rc) { + TFP_DRV_LOG(ERR, + "%s, Set failed, type:%d, rc:%s\n", + tf_dir_2_str(parms->dir), + parms->type, + strerror(-rc)); + return rc; + } + } + /* Free requested element */ - fparms.rm_db = tbl_db[parms->dir]; - fparms.db_index = parms->type; - fparms.index = parms->idx; + fparms.rm_db = tbl_db->tbl_db[parms->dir]; + fparms.subtype = parms->type; + + TF_TBL_PTR_TO_RM(&fparms.index, parms->idx, base, shift); + rc = tf_rm_free(&fparms); if (rc) { TFP_DRV_LOG(ERR, @@ -200,10 +328,19 @@ tf_tbl_free(struct tf *tfp __rte_unused, } int -tf_tbl_alloc_search(struct tf *tfp __rte_unused, - struct tf_tbl_alloc_search_parms *parms __rte_unused) +tf_tbl_alloc_search(struct tf *tfp, + struct tf_tbl_alloc_search_parms *parms) { - return 0; + int rc = 0; + TF_CHECK_PARMS2(tfp, parms); + + if (!shadow_init || !shadow_tbl_db[parms->dir]) { + TFP_DRV_LOG(ERR, "%s: Shadow TBL not initialized.\n", + tf_dir_2_str(parms->dir)); + return -EINVAL; + } + + return rc; } int @@ -215,20 +352,54 @@ tf_tbl_set(struct tf *tfp, uint16_t hcapi_type; struct tf_rm_is_allocated_parms aparms = { 0 }; struct tf_rm_get_hcapi_parms hparms = { 0 }; + struct tf_session *tfs; + struct tf_dev_info *dev; + uint16_t base = 0, shift = 0; + struct tbl_rm_db *tbl_db; + void *tbl_db_ptr = NULL; TF_CHECK_PARMS3(tfp, parms, parms->data); - if (!init) { + /* Retrieve the session information */ + 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; + + rc = tf_session_get_db(tfp, TF_MODULE_TYPE_TABLE, &tbl_db_ptr); + if (rc) { TFP_DRV_LOG(ERR, - "%s: No Table DBs created\n", - tf_dir_2_str(parms->dir)); - return -EINVAL; + "Failed to get em_ext_db from session, rc:%s\n", + strerror(-rc)); + return rc; + } + tbl_db = (struct tbl_rm_db *)tbl_db_ptr; + + /* Only get table info if required for the device */ + if (dev->ops->tf_dev_get_tbl_info) { + rc = dev->ops->tf_dev_get_tbl_info(tfp, + tbl_db->tbl_db[parms->dir], + parms->type, + &base, + &shift); + if (rc) { + TFP_DRV_LOG(ERR, + "%s: Failed to get table info:%d\n", + tf_dir_2_str(parms->dir), + parms->type); + return rc; + } } /* Verify that the entry has been previously allocated */ - aparms.rm_db = tbl_db[parms->dir]; - aparms.db_index = parms->type; - aparms.index = parms->idx; + aparms.rm_db = tbl_db->tbl_db[parms->dir]; + aparms.subtype = parms->type; + TF_TBL_PTR_TO_RM(&aparms.index, parms->idx, base, shift); + aparms.allocated = &allocated; rc = tf_rm_is_allocated(&aparms); if (rc) @@ -244,8 +415,8 @@ tf_tbl_set(struct tf *tfp, } /* Set the entry */ - hparms.rm_db = tbl_db[parms->dir]; - hparms.db_index = parms->type; + hparms.rm_db = tbl_db->tbl_db[parms->dir]; + hparms.subtype = parms->type; hparms.hcapi_type = &hcapi_type; rc = tf_rm_get_hcapi_type(&hparms); if (rc) { @@ -284,20 +455,54 @@ tf_tbl_get(struct tf *tfp, int allocated = 0; struct tf_rm_is_allocated_parms aparms = { 0 }; struct tf_rm_get_hcapi_parms hparms = { 0 }; + struct tf_session *tfs; + struct tf_dev_info *dev; + uint16_t base = 0, shift = 0; + struct tbl_rm_db *tbl_db; + void *tbl_db_ptr = NULL; TF_CHECK_PARMS3(tfp, parms, parms->data); - if (!init) { + /* Retrieve the session information */ + 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; + + rc = tf_session_get_db(tfp, TF_MODULE_TYPE_TABLE, &tbl_db_ptr); + if (rc) { TFP_DRV_LOG(ERR, - "%s: No Table DBs created\n", - tf_dir_2_str(parms->dir)); - return -EINVAL; + "Failed to get em_ext_db from session, rc:%s\n", + strerror(-rc)); + return rc; + } + tbl_db = (struct tbl_rm_db *)tbl_db_ptr; + + /* Only get table info if required for the device */ + if (dev->ops->tf_dev_get_tbl_info) { + rc = dev->ops->tf_dev_get_tbl_info(tfp, + tbl_db->tbl_db[parms->dir], + parms->type, + &base, + &shift); + if (rc) { + TFP_DRV_LOG(ERR, + "%s: Failed to get table info:%d\n", + tf_dir_2_str(parms->dir), + parms->type); + return rc; + } } /* Verify that the entry has been previously allocated */ - aparms.rm_db = tbl_db[parms->dir]; - aparms.db_index = parms->type; - aparms.index = parms->idx; + aparms.rm_db = tbl_db->tbl_db[parms->dir]; + aparms.subtype = parms->type; + TF_TBL_PTR_TO_RM(&aparms.index, parms->idx, base, shift); + aparms.allocated = &allocated; rc = tf_rm_is_allocated(&aparms); if (rc) @@ -313,8 +518,8 @@ tf_tbl_get(struct tf *tfp, } /* Set the entry */ - hparms.rm_db = tbl_db[parms->dir]; - hparms.db_index = parms->type; + hparms.rm_db = tbl_db->tbl_db[parms->dir]; + hparms.subtype = parms->type; hparms.hcapi_type = &hcapi_type; rc = tf_rm_get_hcapi_type(&hparms); if (rc) { @@ -350,46 +555,75 @@ tf_tbl_bulk_get(struct tf *tfp, struct tf_tbl_get_bulk_parms *parms) { int rc; - int i; uint16_t hcapi_type; - uint32_t idx; - int allocated = 0; - struct tf_rm_is_allocated_parms aparms = { 0 }; struct tf_rm_get_hcapi_parms hparms = { 0 }; + struct tf_rm_check_indexes_in_range_parms cparms = { 0 }; + struct tf_session *tfs; + struct tf_dev_info *dev; + uint16_t base = 0, shift = 0; + struct tbl_rm_db *tbl_db; + void *tbl_db_ptr = NULL; TF_CHECK_PARMS2(tfp, parms); - if (!init) { - TFP_DRV_LOG(ERR, - "%s: No Table DBs created\n", - tf_dir_2_str(parms->dir)); + /* Retrieve the session information */ + rc = tf_session_get_session_internal(tfp, &tfs); + if (rc) + return rc; - return -EINVAL; - } - /* Verify that the entries has been previously allocated */ - aparms.rm_db = tbl_db[parms->dir]; - aparms.db_index = parms->type; - aparms.allocated = &allocated; - idx = parms->starting_idx; - for (i = 0; i < parms->num_entries; i++) { - aparms.index = idx; - rc = tf_rm_is_allocated(&aparms); - if (rc) - return rc; + /* Retrieve the device information */ + rc = tf_session_get_device(tfs, &dev); + if (rc) + return rc; - if (allocated != TF_RM_ALLOCATED_ENTRY_IN_USE) { + rc = tf_session_get_db(tfp, TF_MODULE_TYPE_TABLE, &tbl_db_ptr); + if (rc) { + TFP_DRV_LOG(ERR, + "Failed to get em_ext_db from session, rc:%s\n", + strerror(-rc)); + return rc; + } + tbl_db = (struct tbl_rm_db *)tbl_db_ptr; + + /* Only get table info if required for the device */ + if (dev->ops->tf_dev_get_tbl_info) { + rc = dev->ops->tf_dev_get_tbl_info(tfp, + tbl_db->tbl_db[parms->dir], + parms->type, + &base, + &shift); + if (rc) { TFP_DRV_LOG(ERR, - "%s, Invalid or not allocated index, type:%d, idx:%d\n", + "%s: Failed to get table info:%d\n", tf_dir_2_str(parms->dir), - parms->type, - idx); - return -EINVAL; + parms->type); + return rc; } - idx++; } - hparms.rm_db = tbl_db[parms->dir]; - hparms.db_index = parms->type; + /* Verify that the entries are in the range of reserved resources. */ + cparms.rm_db = tbl_db->tbl_db[parms->dir]; + cparms.subtype = parms->type; + + TF_TBL_PTR_TO_RM(&cparms.starting_index, parms->starting_idx, + base, shift); + + cparms.num_entries = parms->num_entries; + + rc = tf_rm_check_indexes_in_range(&cparms); + if (rc) { + TFP_DRV_LOG(ERR, + "%s, Invalid or %d index starting from %d" + " not in range, type:%d", + tf_dir_2_str(parms->dir), + parms->starting_idx, + parms->num_entries, + parms->type); + return rc; + } + + hparms.rm_db = tbl_db->tbl_db[parms->dir]; + hparms.subtype = parms->type; hparms.hcapi_type = &hcapi_type; rc = tf_rm_get_hcapi_type(&hparms); if (rc) { @@ -419,3 +653,79 @@ tf_tbl_bulk_get(struct tf *tfp, return rc; } + +int +tf_tbl_get_resc_info(struct tf *tfp, + struct tf_tbl_resource_info *tbl) +{ + int rc; + int d, i; + struct tf_resource_info *dinfo; + struct tf_rm_get_alloc_info_parms ainfo; + void *tbl_db_ptr = NULL; + struct tbl_rm_db *tbl_db; + uint16_t base = 0, shift = 0; + struct tf_dev_info *dev; + struct tf_session *tfs; + + TF_CHECK_PARMS2(tfp, tbl); + + /* Retrieve the session information */ + 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; + + rc = tf_session_get_db(tfp, TF_MODULE_TYPE_TABLE, &tbl_db_ptr); + if (rc == -ENOMEM) + return 0; /* db doesn't exist */ + else if (rc) + return rc; /* error getting db */ + + tbl_db = (struct tbl_rm_db *)tbl_db_ptr; + + /* check if reserved resource for WC is multiple of num_slices */ + for (d = 0; d < TF_DIR_MAX; d++) { + ainfo.rm_db = tbl_db->tbl_db[d]; + dinfo = tbl[d].info; + + if (!ainfo.rm_db) + continue; + + ainfo.info = (struct tf_rm_alloc_info *)dinfo; + ainfo.subtype = 0; + rc = tf_rm_get_all_info(&ainfo, TF_TBL_TYPE_MAX); + if (rc) + return rc; + + if (dev->ops->tf_dev_get_tbl_info) { + /* Adjust all */ + for (i = 0; i < TF_TBL_TYPE_MAX; i++) { + /* Only get table info if required for the device */ + rc = dev->ops->tf_dev_get_tbl_info(tfp, + tbl_db->tbl_db[d], + i, + &base, + &shift); + if (rc) { + TFP_DRV_LOG(ERR, + "%s: Failed to get table info:%d\n", + tf_dir_2_str(d), + i); + return rc; + } + if (dinfo[i].stride) + TF_TBL_RM_TO_PTR(&dinfo[i].start, + dinfo[i].start, + base, + shift); + } + } + } + + return 0; +}