From: Bingbin Chen <chen.bingbin@zte.com.cn>
To: dev@dpdk.org
Cc: Bingbin Chen <chen.bingbin@zte.com.cn>
Subject: [PATCH v1 12/14] net/zxdh: delete all hash entries
Date: Mon, 10 Feb 2025 09:50:15 +0800 [thread overview]
Message-ID: <20250210015017.4105624-7-chen.bingbin@zte.com.cn> (raw)
In-Reply-To: <20250210015017.4105624-1-chen.bingbin@zte.com.cn>
[-- Attachment #1.1.1: Type: text/plain, Size: 39462 bytes --]
Implement hash table entries all delete operation
by dtb channel.
Signed-off-by: Bingbin Chen <chen.bingbin@zte.com.cn>
---
drivers/net/zxdh/zxdh_ethdev.c | 45 ++
drivers/net/zxdh/zxdh_np.c | 1092 ++++++++++++++++++++++++++++++++
drivers/net/zxdh/zxdh_np.h | 19 +
3 files changed, 1156 insertions(+)
diff --git a/drivers/net/zxdh/zxdh_ethdev.c b/drivers/net/zxdh/zxdh_ethdev.c
index 18b661b1ab..b99e79ca4a 100644
--- a/drivers/net/zxdh/zxdh_ethdev.c
+++ b/drivers/net/zxdh/zxdh_ethdev.c
@@ -966,6 +966,29 @@ zxdh_np_dtb_data_res_free(struct zxdh_hw *hw)
zxdh_shared_data->np_init_done = 0;
}
+static int
+zxdh_tbl_entry_online_destroy(struct rte_eth_dev *dev)
+{
+ struct zxdh_hw *hw = dev->data->dev_private;
+ uint32_t sdt_no;
+ int ret = 0;
+ if (!g_dtb_data.init_done)
+ return ret;
+ if (hw->is_pf) {
+ sdt_no = ZXDH_SDT_L2_ENTRY_TABLE0 + hw->hash_search_index;
+ ret = zxdh_np_dtb_hash_online_delete(0, g_dtb_data.queueid, sdt_no);
+ if (ret)
+ PMD_DRV_LOG(ERR, "%s sdt_no %d failed. code:%d ",
+ dev->data->name, sdt_no, ret);
+ sdt_no = ZXDH_SDT_MC_TABLE0 + hw->hash_search_index;
+ ret = zxdh_np_dtb_hash_online_delete(0, g_dtb_data.queueid, sdt_no);
+ if (ret)
+ PMD_DRV_LOG(ERR, "%s sdt_no %d failed. code:%d",
+ dev->data->name, sdt_no, ret);
+ }
+ return ret;
+}
+
static void
zxdh_np_uninit(struct rte_eth_dev *dev)
{
@@ -974,6 +997,8 @@ zxdh_np_uninit(struct rte_eth_dev *dev)
if (!g_dtb_data.init_done && !g_dtb_data.dev_refcnt)
return;
+ zxdh_tbl_entry_online_destroy(dev);
+
if (--g_dtb_data.dev_refcnt == 0)
zxdh_np_dtb_data_res_free(hw);
}
@@ -1394,6 +1419,25 @@ zxdh_init_once(void)
return ret;
}
+static int zxdh_tbl_entry_offline_destroy(struct zxdh_hw *hw)
+{
+ int ret = 0;
+ if (!g_dtb_data.init_done)
+ return ret;
+ if (hw->is_pf) {
+ uint32_t sdt_no;
+ sdt_no = ZXDH_SDT_L2_ENTRY_TABLE0 + hw->hash_search_index;
+ ret = zxdh_np_dtb_hash_offline_delete(0, g_dtb_data.queueid, sdt_no, 0);
+ if (ret)
+ PMD_DRV_LOG(ERR, "sdt_no %d delete failed. code:%d ", sdt_no, ret);
+ sdt_no = ZXDH_SDT_MC_TABLE0 + hw->hash_search_index;
+ ret = zxdh_np_dtb_hash_offline_delete(0, g_dtb_data.queueid, sdt_no, 0);
+ if (ret)
+ PMD_DRV_LOG(ERR, "sdt_no %d delete failed. code:%d ", sdt_no, ret);
+ }
+ return ret;
+}
+
static int
zxdh_np_init(struct rte_eth_dev *eth_dev)
{
@@ -1423,6 +1467,7 @@ zxdh_np_init(struct rte_eth_dev *eth_dev)
PMD_DRV_LOG(ERR, "invalid hash idx %d", hw->hash_search_index);
return -1;
}
+ zxdh_tbl_entry_offline_destroy(hw);
}
if (zxdh_shared_data != NULL)
diff --git a/drivers/net/zxdh/zxdh_np.c b/drivers/net/zxdh/zxdh_np.c
index 09ff42b3be..230a1d44be 100644
--- a/drivers/net/zxdh/zxdh_np.c
+++ b/drivers/net/zxdh/zxdh_np.c
@@ -417,6 +417,17 @@ do {\
} \
} while (0)
+#define ZXDH_COMM_CHECK_POINT_MEMORY_FREE2PTR(point, ptr0, ptr1)\
+do {\
+ if ((point) == NULL) {\
+ PMD_DRV_LOG(ERR, " ZXDH %s:%d[Error:POINT NULL] ! FUNCTION"\
+ ": %s!", __FILE__, __LINE__, __func__);\
+ rte_free(ptr0);\
+ rte_free(ptr1);\
+ RTE_ASSERT(0);\
+ } \
+} while (0)
+
#define ZXDH_COMM_CHECK_RC_MEMORY_FREE(rc, becall, ptr)\
do {\
if ((rc) != 0) {\
@@ -578,6 +589,8 @@ zxdh_np_get_tn_color(ZXDH_RB_TN *p_tn)
#define GET_HASH_TBL_ID_INFO(dev_id, fun_id, tbl_id) (&g_tbl_id_info[dev_id][fun_id][tbl_id])
+#define ZXDH_GET_HASH_TBL_ID(p_key) ((p_key)[0] & 0x1F)
+
static inline uint32_t
zxdh_np_get_hash_entry_size(uint32_t key_type)
{
@@ -1809,6 +1822,20 @@ zxdh_np_se_apt_rb_delete(ZXDH_RB_CFG *rb_cfg, void *p_data, __rte_unused uint32_
return rc;
}
+static uint32_t
+zxdh_np_se_apt_rb_search(ZXDH_RB_CFG *rb_cfg, void *p_data, uint32_t len)
+{
+ uint32_t rc = ZXDH_OK;
+ ZXDH_RB_TN *p_rb_rtn = NULL;
+
+ rc = zxdh_comm_rb_search(rb_cfg, p_data, &p_rb_rtn);
+ if (rc != ZXDH_OK)
+ return rc;
+
+ rte_memcpy(p_data, p_rb_rtn->p_key, len);
+ return rc;
+}
+
static uint32_t
zxdh_np_dev_init(void)
{
@@ -3841,6 +3868,240 @@ zxdh_np_dev_del(uint32_t dev_id)
}
}
+static uint32_t
+zxdh_np_hash_soft_all_entry_delete(ZXDH_SE_CFG *p_se_cfg, uint32_t hash_id)
+{
+ uint32_t rc = 0;
+ uint32_t dev_id = 0;
+ uint8_t table_id = 0;
+ uint32_t bulk_id = 0;
+
+ ZXDH_D_NODE *p_node = NULL;
+ ZXDH_RB_TN *p_rb_tn = NULL;
+ ZXDH_RB_TN *p_rb_tn_rtn = NULL;
+ ZXDH_D_HEAD *p_head_hash_rb = NULL;
+ ZXDH_HASH_CFG *p_hash_cfg = NULL;
+ ZXDH_FUNC_ID_INFO *p_func_info = NULL;
+ ZXDH_HASH_RBKEY_INFO *p_rbkey = NULL;
+ ZXDH_HASH_RBKEY_INFO *p_rbkey_rtn = NULL;
+ ZXDH_SE_ITEM_CFG *p_item = NULL;
+
+ dev_id = p_se_cfg->dev_id;
+
+ p_func_info = ZXDH_GET_FUN_INFO(p_se_cfg, hash_id);
+
+ p_hash_cfg = (ZXDH_HASH_CFG *)p_func_info->fun_ptr;
+ p_head_hash_rb = &p_hash_cfg->hash_rb.tn_list;
+
+ while (p_head_hash_rb->used) {
+ p_node = p_head_hash_rb->p_next;
+ p_rb_tn = (ZXDH_RB_TN *)p_node->data;
+ p_rbkey = (ZXDH_HASH_RBKEY_INFO *)p_rb_tn->p_key;
+ table_id = ZXDH_GET_HASH_TBL_ID(p_rbkey->key);
+ bulk_id = ((table_id >> 2) & 0x7);
+
+ rc = zxdh_comm_rb_delete(&p_hash_cfg->hash_rb, p_rbkey, &p_rb_tn_rtn);
+ if (rc == ZXDH_RBT_RC_SRHFAIL) {
+ p_hash_cfg->hash_stat.delete_fail++;
+ PMD_DRV_LOG(DEBUG, "Error!there is not item in hash!");
+ return ZXDH_HASH_RC_DEL_SRHFAIL;
+ }
+
+ ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_rb_tn_rtn);
+ p_rbkey_rtn = (ZXDH_HASH_RBKEY_INFO *)(p_rb_tn_rtn->p_key);
+ p_item = p_rbkey_rtn->p_item_info;
+
+ rc = zxdh_comm_double_link_del(&p_rbkey_rtn->entry_dn, &p_item->item_list);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_comm_double_link_del");
+ p_item->wrt_mask &= ~(ZXDH_GET_HASH_ENTRY_MASK(p_rbkey_rtn->entry_size,
+ p_rbkey_rtn->entry_pos)) & 0xF;
+
+ if (p_item->item_list.used == 0) {
+ if (p_item->item_type == ZXDH_ITEM_DDR_256 ||
+ p_item->item_type == ZXDH_ITEM_DDR_512) {
+ p_hash_cfg->p_bulk_ddr_info[bulk_id]->p_item_array
+ [p_item->item_index] = NULL;
+ rte_free(p_item);
+ } else {
+ p_item->valid = 0;
+ }
+ }
+
+ rte_free(p_rbkey_rtn);
+ rte_free(p_rb_tn_rtn);
+ p_hash_cfg->hash_stat.delete_ok++;
+ }
+
+ return rc;
+}
+
+static uint32_t
+zxdh_np_hash_zcam_resource_deinit(ZXDH_HASH_CFG *p_hash_cfg)
+{
+ uint32_t rc = 0;
+ uint32_t dev_id = 0;
+ uint32_t i = 0;
+
+ ZXDH_D_NODE *p_node = NULL;
+ ZXDH_D_HEAD *p_head = NULL;
+ ZXDH_SE_ZBLK_CFG *p_zblk_cfg = NULL;
+ ZXDH_SE_ZCELL_CFG *p_zcell_cfg = NULL;
+
+ dev_id = p_hash_cfg->p_se_info->dev_id;
+
+ p_head = &p_hash_cfg->hash_shareram.zcell_free_list;
+
+ while (p_head->used) {
+ p_node = p_head->p_next;
+
+ rc = zxdh_comm_double_link_del(p_node, p_head);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_comm_double_link_del");
+ p_zcell_cfg = (ZXDH_SE_ZCELL_CFG *)p_node->data;
+ p_zcell_cfg->is_used = 0;
+ p_zcell_cfg->flag = 0;
+ }
+
+ p_head = &p_hash_cfg->hash_shareram.zblk_list;
+
+ while (p_head->used) {
+ p_node = p_head->p_next;
+
+ rc = zxdh_comm_double_link_del(p_node, p_head);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_comm_double_link_del");
+
+ p_zblk_cfg = ZXDH_SE_GET_ZBLK_CFG(p_hash_cfg->p_se_info,
+ ((ZXDH_SE_ZBLK_CFG *)p_node->data)->zblk_idx);
+ p_zblk_cfg->is_used = 0;
+ for (i = 0; i < ZXDH_SE_ZREG_NUM; i++)
+ p_zblk_cfg->zreg_info[i].flag = 0;
+ }
+
+ return rc;
+}
+
+static uint32_t
+zxdh_np_se_fun_deinit(ZXDH_SE_CFG *p_se_cfg,
+ uint8_t id,
+ uint32_t fun_type)
+{
+ ZXDH_FUNC_ID_INFO *p_fun_info = NULL;
+
+ p_fun_info = ZXDH_GET_FUN_INFO(p_se_cfg, id);
+
+ if (p_fun_info->is_used == 0) {
+ PMD_DRV_LOG(ERR, " Error[0x%x], fun_id [%d] is already deinit!",
+ ZXDH_SE_RC_FUN_INVALID, id);
+ return ZXDH_OK;
+ }
+
+ switch (fun_type) {
+ case (ZXDH_FUN_HASH):
+ {
+ if (p_fun_info->fun_ptr) {
+ rte_free(p_fun_info->fun_ptr);
+ p_fun_info->fun_ptr = NULL;
+ }
+ }
+ break;
+
+ default:
+ {
+ PMD_DRV_LOG(ERR, " Error, unrecgnized fun_type[ %d] ", fun_type);
+ RTE_ASSERT(0);
+ return ZXDH_SE_RC_BASE;
+ }
+ break;
+ }
+
+ p_fun_info->fun_id = id;
+ p_fun_info->is_used = 0;
+
+ return ZXDH_OK;
+}
+
+static uint32_t
+zxdh_np_one_hash_soft_uninstall(uint32_t dev_id, uint32_t hash_id)
+{
+ uint32_t rc = 0;
+ uint32_t i = 0;
+
+ ZXDH_D_NODE *p_node = NULL;
+ ZXDH_SE_CFG *p_se_cfg = NULL;
+ ZXDH_RB_TN *p_rb_tn = NULL;
+ ZXDH_RB_TN *p_rb_tn_rtn = NULL;
+ HASH_DDR_CFG *p_rbkey = NULL;
+ ZXDH_HASH_CFG *p_hash_cfg = NULL;
+ ZXDH_FUNC_ID_INFO *p_func_info = NULL;
+ ZXDH_D_HEAD *p_head_ddr_cfg_rb = NULL;
+ HASH_DDR_CFG *p_temp_rbkey = NULL;
+
+ p_se_cfg = dpp_se_cfg[dev_id];
+ p_func_info = ZXDH_GET_FUN_INFO(p_se_cfg, hash_id);
+ if (p_func_info->is_used == 0) {
+ PMD_DRV_LOG(INFO, "Error[0x%x], fun_id [%d] is not init!",
+ ZXDH_SE_RC_FUN_INVALID, hash_id);
+ return ZXDH_OK;
+ }
+
+ rc = zxdh_np_hash_soft_all_entry_delete(p_se_cfg, hash_id);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_hash_soft_all_entry_delete");
+
+ p_hash_cfg = (ZXDH_HASH_CFG *)p_func_info->fun_ptr;
+ for (i = 0; i < ZXDH_HASH_BULK_NUM; i++) {
+ if (p_hash_cfg->hash_stat.p_bulk_zcam_mono[i] != NULL) {
+ rte_free((&p_hash_cfg->hash_stat)->p_bulk_zcam_mono[i]);
+ (&p_hash_cfg->hash_stat)->p_bulk_zcam_mono[i] = NULL;
+ }
+ }
+
+ p_head_ddr_cfg_rb = &p_hash_cfg->ddr_cfg_rb.tn_list;
+ while (p_head_ddr_cfg_rb->used) {
+ p_node = p_head_ddr_cfg_rb->p_next;
+
+ p_rb_tn = (ZXDH_RB_TN *)p_node->data;
+ p_rbkey = p_rb_tn->p_key;
+
+ rc = zxdh_comm_rb_delete(&p_hash_cfg->ddr_cfg_rb, p_rbkey, &p_rb_tn_rtn);
+
+ if (rc == ZXDH_RBT_RC_SRHFAIL)
+ PMD_DRV_LOG(ERR, "ddr_cfg_rb delete key is not exist, key: 0x");
+ else
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_comm_rb_delete");
+
+ ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_rb_tn_rtn);
+ p_temp_rbkey = (HASH_DDR_CFG *)(p_rb_tn_rtn->p_key);
+ rte_free(p_temp_rbkey->p_item_array);
+ p_temp_rbkey->p_item_array = NULL;
+ rte_free(p_temp_rbkey);
+ rte_free(p_rb_tn_rtn);
+ }
+
+ rc = zxdh_np_hash_zcam_resource_deinit(p_hash_cfg);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_hash_zcam_resource_deinit");
+
+ rc = zxdh_np_se_fun_deinit(p_se_cfg, (hash_id & 0xff), ZXDH_FUN_HASH);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_se_fun_deinit");
+
+ memset(g_tbl_id_info[dev_id][hash_id], 0,
+ ZXDH_HASH_TBL_ID_NUM * sizeof(ZXDH_HASH_TBL_ID_INFO));
+
+ return rc;
+}
+
+static uint32_t
+zxdh_np_hash_soft_uninstall(uint32_t dev_id)
+{
+ uint32_t rc = ZXDH_OK;
+ uint32_t hash_id = 0;
+
+ for (hash_id = 0; hash_id < ZXDH_HASH_FUNC_ID_NUM; hash_id++) {
+ rc = zxdh_np_one_hash_soft_uninstall(dev_id, hash_id);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_one_hash_soft_uninstall");
+ }
+
+ return rc;
+}
+
int
zxdh_np_online_uninit(uint32_t dev_id,
char *port_name,
@@ -3853,6 +4114,10 @@ zxdh_np_online_uninit(uint32_t dev_id,
PMD_DRV_LOG(ERR, "%s:dtb release error,"
"port name %s queue id %d", __func__, port_name, queue_id);
+ rc = zxdh_np_hash_soft_uninstall(dev_id);
+ if (rc != ZXDH_OK)
+ PMD_DRV_LOG(ERR, "zxdh_np_hash_soft_uninstall error! ");
+
zxdh_np_dtb_mgr_destroy(dev_id);
zxdh_np_sdt_mgr_destroy(dev_id);
zxdh_np_dev_del(dev_id);
@@ -4120,6 +4385,25 @@ zxdh_np_dtb_zcam_dump_info_write(uint32_t dev_id,
return rc;
}
+static void
+zxdh_np_dtb_zcam_dump_entry(uint32_t dev_id,
+ uint32_t addr,
+ uint32_t tb_width,
+ uint32_t depth,
+ uint32_t addr_high32,
+ uint32_t addr_low32,
+ ZXDH_DTB_ENTRY_T *p_entry)
+{
+ zxdh_np_dtb_zcam_dump_info_write(dev_id,
+ addr,
+ tb_width,
+ depth,
+ addr_high32,
+ addr_low32,
+ (uint32_t *)p_entry->cmd);
+ p_entry->data_in_cmd_flag = 1;
+}
+
static uint32_t
zxdh_np_dtb_se_smmu0_ind_write(uint32_t dev_id,
uint32_t base_addr,
@@ -5915,6 +6199,29 @@ zxdh_np_dtb_tab_up_item_addr_get(uint32_t dev_id,
return rc;
}
+static void
+zxdh_np_dtb_tab_up_item_offset_addr_get(uint32_t dev_id,
+ uint32_t queue_id,
+ uint32_t item_index,
+ uint32_t addr_offset,
+ uint32_t *p_phy_haddr,
+ uint32_t *p_phy_laddr)
+{
+ uint64_t addr = 0;
+
+ if (ZXDH_DTB_TAB_UP_USER_PHY_ADDR_FLAG_GET(dev_id, queue_id, item_index) ==
+ ZXDH_DTB_TAB_UP_USER_ADDR_TYPE)
+ addr = ZXDH_DTB_TAB_UP_USER_PHY_ADDR_GET(dev_id, queue_id, item_index);
+ else
+ addr = ZXDH_DTB_TAB_UP_PHY_ADDR_GET(dev_id, queue_id, item_index) +
+ ZXDH_DTB_ITEM_ACK_SIZE;
+
+ addr = addr + addr_offset;
+
+ *p_phy_haddr = (addr >> 32) & 0xffffffff;
+ *p_phy_laddr = addr & 0xffffffff;
+}
+
static uint32_t
zxdh_np_dtb_dump_table_elemet_addr_get(uint32_t dev_id,
uint32_t queue_id,
@@ -6129,6 +6436,101 @@ zxdh_np_dtb_tab_up_free_item_get(uint32_t dev_id,
return 0;
}
+static uint32_t
+zxdh_np_dtb_tab_up_item_user_addr_set(uint32_t dev_id,
+ uint32_t queue_id,
+ uint32_t item_index,
+ uint64_t phy_addr,
+ uint64_t vir_addr)
+{
+ ZXDH_DTB_MGR_T *p_dtb_mgr = NULL;
+
+ p_dtb_mgr = zxdh_np_dtb_mgr_get(dev_id);
+ if (p_dtb_mgr == NULL) {
+ PMD_DRV_LOG(ERR, "DTB Manager is not exist!");
+ return ZXDH_RC_DTB_MGR_NOT_EXIST;
+ }
+
+ if (ZXDH_DTB_QUEUE_INIT_FLAG_GET(dev_id, queue_id) == 0) {
+ PMD_DRV_LOG(ERR, "dtb queue %d is not init.", queue_id);
+ return ZXDH_RC_DTB_QUEUE_IS_NOT_INIT;
+ }
+
+ p_dtb_mgr->queue_info[queue_id].tab_up.user_addr[item_index].phy_addr = phy_addr;
+ p_dtb_mgr->queue_info[queue_id].tab_up.user_addr[item_index].vir_addr = vir_addr;
+ p_dtb_mgr->queue_info[queue_id].tab_up.user_addr[item_index].user_flag =
+ ZXDH_DTB_TAB_UP_USER_ADDR_TYPE;
+
+ return ZXDH_OK;
+}
+
+static uint32_t
+zxdh_np_dtb_dump_sdt_addr_get(uint32_t dev_id,
+ uint32_t queue_id,
+ uint32_t sdt_no,
+ uint64_t *phy_addr,
+ uint64_t *vir_addr,
+ uint32_t *size)
+{
+ uint32_t rc = ZXDH_OK;
+
+ ZXDH_DTB_ADDR_INFO_T dtb_dump_addr_info = {0};
+ ZXDH_RB_CFG *p_dtb_dump_addr_rb = NULL;
+
+ dtb_dump_addr_info.sdt_no = sdt_no;
+ p_dtb_dump_addr_rb = zxdh_np_dtb_dump_addr_rb_get(dev_id, queue_id);
+ rc = zxdh_np_se_apt_rb_search(p_dtb_dump_addr_rb, &dtb_dump_addr_info,
+ sizeof(ZXDH_DTB_ADDR_INFO_T));
+ if (rc == ZXDH_OK) {
+ PMD_DRV_LOG(INFO, "search sdt_no %d success.", sdt_no);
+ } else {
+ PMD_DRV_LOG(ERR, "search sdt_no %d fail.", sdt_no);
+ return rc;
+ }
+
+ *phy_addr = dtb_dump_addr_info.phy_addr;
+ *vir_addr = dtb_dump_addr_info.vir_addr;
+ *size = dtb_dump_addr_info.size;
+
+ return rc;
+}
+
+static uint32_t
+zxdh_np_dtb_dump_addr_set(uint32_t dev_id,
+ uint32_t queue_id,
+ uint32_t sdt_no,
+ uint32_t *element_id)
+{
+ uint32_t rc = ZXDH_OK;
+ uint32_t dump_element_id = 0;
+ uint64_t phy_addr = 0;
+ uint64_t vir_addr = 0;
+ uint32_t size = 0;
+
+ rc = zxdh_np_dtb_dump_sdt_addr_get(dev_id,
+ queue_id,
+ sdt_no,
+ &phy_addr,
+ &vir_addr,
+ &size);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_dump_sdt_addr_get");
+ memset((uint8_t *)vir_addr, 0, size);
+
+ rc = zxdh_np_dtb_tab_up_free_item_get(dev_id, queue_id, &dump_element_id);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_tab_up_free_item_get");
+
+ rc = zxdh_np_dtb_tab_up_item_user_addr_set(dev_id,
+ queue_id,
+ dump_element_id,
+ phy_addr,
+ vir_addr);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_tab_up_item_addr_set");
+
+ *element_id = dump_element_id;
+
+ return rc;
+}
+
static uint32_t
zxdh_np_dtb_se_smmu0_dma_dump(uint32_t dev_id,
uint32_t queue_id,
@@ -8673,3 +9075,693 @@ zxdh_np_se_res_get_and_init(uint32_t dev_id, uint32_t type)
return rc;
}
+
+static uint32_t
+zxdh_np_dtb_hash_zcam_del_one_hw(uint32_t dev_id,
+ uint32_t queue_id,
+ HASH_ENTRY_CFG *p_hash_entry_cfg,
+ ZXDH_HASH_ENTRY *p_hash_entry,
+ ZXDH_DTB_ENTRY_T *p_entry,
+ uint8_t *p_srh_succ)
+{
+ uint32_t rc = ZXDH_OK;
+ ZXDH_HASH_RBKEY_INFO srh_rbkey = {0};
+ ZXDH_HASH_CFG *p_hash_cfg = NULL;
+ ZXDH_SE_ZCELL_CFG *p_zcell = NULL;
+ ZXDH_SE_ZBLK_CFG *p_zblk = NULL;
+
+ uint32_t zblk_idx = 0;
+ uint32_t pre_zblk_idx = 0xFFFFFFFF;
+ uint16_t crc16_value = 0;
+ uint32_t zcell_id = 0;
+ uint32_t item_idx = 0;
+ uint32_t element_id = 0;
+ uint32_t byte_offset = 0;
+ uint32_t addr = 0;
+ uint32_t i = 0;
+ uint8_t srh_succ = 0;
+ uint8_t temp_key[ZXDH_HASH_KEY_MAX] = {0};
+ uint8_t rd_buff[ZXDH_SE_ITEM_WIDTH_MAX] = {0};
+
+ ZXDH_D_NODE *p_zblk_dn = NULL;
+ ZXDH_D_NODE *p_zcell_dn = NULL;
+ ZXDH_SE_CFG *p_se_cfg = NULL;
+
+ rte_memcpy(srh_rbkey.key, p_hash_entry->p_key, p_hash_entry_cfg->key_by_size);
+
+ p_hash_cfg = p_hash_entry_cfg->p_hash_cfg;
+ ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_hash_cfg);
+
+ p_se_cfg = p_hash_entry_cfg->p_se_cfg;
+ ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_se_cfg);
+
+ zxdh_np_hash_set_crc_key(p_hash_entry_cfg, p_hash_entry, temp_key);
+
+ p_zcell_dn = p_hash_cfg->hash_shareram.zcell_free_list.p_next;
+ while (p_zcell_dn) {
+ p_zcell = (ZXDH_SE_ZCELL_CFG *)p_zcell_dn->data;
+ zblk_idx = GET_ZBLK_IDX(p_zcell->zcell_idx);
+
+ if (zblk_idx != pre_zblk_idx) {
+ pre_zblk_idx = zblk_idx;
+ crc16_value = p_hash_cfg->p_hash16_fun(temp_key,
+ p_hash_entry_cfg->key_by_size, p_zblk->hash_arg);
+ }
+
+ zcell_id = GET_ZCELL_IDX(p_zcell->zcell_idx);
+ item_idx = GET_ZCELL_CRC_VAL(zcell_id, crc16_value);
+ addr = ZXDH_ZBLK_ITEM_ADDR_CALC(p_zcell->zcell_idx, item_idx);
+ rc = zxdh_np_dtb_se_zcam_dma_dump(dev_id,
+ queue_id,
+ addr,
+ ZXDH_DTB_DUMP_ZCAM_512b,
+ 1,
+ (uint32_t *)rd_buff,
+ &element_id);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_se_zcam_dma_dump");
+ zxdh_np_comm_swap(rd_buff, sizeof(rd_buff));
+
+ rc = zxdh_np_dtb_hash_data_parse(ZXDH_ITEM_RAM, p_hash_entry_cfg->key_by_size,
+ p_hash_entry, rd_buff, &byte_offset);
+ if (rc == ZXDH_OK) {
+ PMD_DRV_LOG(DEBUG, "Hash search hardware succ in zcell.");
+ srh_succ = 1;
+ p_hash_cfg->hash_stat.search_ok++;
+ break;
+ }
+
+ p_zcell_dn = p_zcell_dn->next;
+ }
+
+ if (srh_succ == 0) {
+ p_zblk_dn = p_hash_cfg->hash_shareram.zblk_list.p_next;
+ while (p_zblk_dn) {
+ p_zblk = (ZXDH_SE_ZBLK_CFG *)p_zblk_dn->data;
+ zblk_idx = p_zblk->zblk_idx;
+
+ for (i = 0; i < ZXDH_SE_ZREG_NUM; i++) {
+ item_idx = i;
+ addr = ZXDH_ZBLK_HASH_LIST_REG_ADDR_CALC(zblk_idx, item_idx);
+ rc = zxdh_np_dtb_se_zcam_dma_dump(dev_id,
+ queue_id,
+ addr,
+ ZXDH_DTB_DUMP_ZCAM_512b,
+ 1,
+ (uint32_t *)rd_buff,
+ &element_id);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_se_zcam_dma_dump");
+ zxdh_np_comm_swap(rd_buff, sizeof(rd_buff));
+
+ rc = zxdh_np_dtb_hash_data_parse(ZXDH_ITEM_RAM,
+ p_hash_entry_cfg->key_by_size, p_hash_entry,
+ rd_buff, &byte_offset);
+ if (rc == ZXDH_OK) {
+ PMD_DRV_LOG(DEBUG, "Hash search hardware succ in zreg.");
+ srh_succ = 1;
+ p_hash_cfg->hash_stat.search_ok++;
+ break;
+ }
+ }
+ p_zblk_dn = p_zblk_dn->next;
+ }
+ }
+
+ if (srh_succ) {
+ memset(rd_buff + byte_offset, 0,
+ ZXDH_GET_HASH_ENTRY_SIZE(p_hash_entry_cfg->key_type));
+ zxdh_np_comm_swap(rd_buff, sizeof(rd_buff));
+ rc = zxdh_np_dtb_se_alg_zcam_data_write(dev_id,
+ addr,
+ rd_buff,
+ p_entry);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_se_alg_zcam_data_write");
+ p_hash_cfg->hash_stat.delete_ok++;
+ }
+
+ *p_srh_succ = srh_succ;
+
+ return rc;
+}
+
+static uint32_t
+zxdh_np_dtb_hash_zcam_del_hw(uint32_t dev_id,
+ uint32_t queue_id,
+ uint32_t sdt_no,
+ uint32_t entry_num,
+ ZXDH_DTB_HASH_ENTRY_INFO_T *p_arr_hash_entry,
+ uint32_t *element_id)
+{
+ uint32_t rc = ZXDH_OK;
+ uint32_t item_cnt = 0;
+ uint32_t key_valid = 1;
+ uint32_t dtb_len = 0;
+ uint8_t srh_succ = 0;
+ uint8_t key[ZXDH_HASH_KEY_MAX] = {0};
+ uint8_t rst[ZXDH_HASH_RST_MAX] = {0};
+ uint8_t entry_cmd[ZXDH_DTB_TABLE_CMD_SIZE_BIT / 8] = {0};
+
+ uint8_t entry_data[ZXDH_ETCAM_WIDTH_MAX / 8] = {0};
+ uint8_t *p_data_buff = NULL;
+
+ ZXDH_HASH_ENTRY entry = {0};
+ ZXDH_DTB_ENTRY_T dtb_one_entry = {0};
+ HASH_ENTRY_CFG hash_entry_cfg = {0};
+
+ dtb_one_entry.cmd = entry_cmd;
+ dtb_one_entry.data = entry_data;
+ entry.p_key = key;
+ entry.p_rst = rst;
+
+ rc = zxdh_np_hash_get_hash_info_from_sdt(dev_id, sdt_no, &hash_entry_cfg);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_hash_get_hash_info_from_sdt");
+
+ p_data_buff = (uint8_t *)rte_zmalloc(NULL, ZXDH_DTB_TABLE_DATA_BUFF_SIZE, 0);
+ if (p_data_buff == NULL) {
+ PMD_DRV_LOG(ERR, "%s point null!", __func__);
+ return ZXDH_PAR_CHK_POINT_NULL;
+ }
+
+ for (item_cnt = 0; item_cnt < entry_num; ++item_cnt) {
+ srh_succ = 0;
+ memset(key, 0, sizeof(key));
+ memset(rst, 0, sizeof(rst));
+ memset(entry_cmd, 0, sizeof(entry_cmd));
+ memset(entry_data, 0, sizeof(entry_data));
+ entry.p_key[0] = (uint8_t)(((key_valid & 0x1) << 7)
+ | ((hash_entry_cfg.key_type & 0x3) << 5)
+ | (hash_entry_cfg.table_id & 0x1f));
+ memcpy(&entry.p_key[1], p_arr_hash_entry[item_cnt].p_actu_key,
+ hash_entry_cfg.actu_key_size);
+
+ rc = zxdh_np_dtb_hash_zcam_del_one_hw(dev_id,
+ queue_id,
+ &hash_entry_cfg,
+ &entry,
+ &dtb_one_entry,
+ &srh_succ);
+ ZXDH_COMM_CHECK_RC_MEMORY_FREE(rc,
+ "zxdh_np_dtb_hash_zcam_del_one_hw", p_data_buff);
+
+ if (srh_succ) {
+ rc = zxdh_np_dtb_data_write(p_data_buff, 0, &dtb_one_entry);
+ ZXDH_COMM_CHECK_RC_MEMORY_FREE(rc,
+ "zxdh_np_dtb_data_write", p_data_buff);
+ dtb_len = dtb_one_entry.data_size / ZXDH_DTB_LEN_POS_SETP + 1;
+
+ rc = zxdh_np_dtb_write_down_table_data(dev_id, queue_id,
+ dtb_len * ZXDH_DTB_LEN_POS_SETP, p_data_buff, element_id);
+ ZXDH_COMM_CHECK_RC_MEMORY_FREE(rc,
+ "zxdh_np_dtb_write_down_table_data", p_data_buff);
+
+ rc = zxdh_np_dtb_tab_down_success_status_check(dev_id,
+ queue_id, *element_id);
+ ZXDH_COMM_CHECK_RC_MEMORY_FREE(rc,
+ "zxdh_np_dtb_tab_down_success_status_check", p_data_buff);
+ }
+ }
+
+ rte_free(p_data_buff);
+
+ return rc;
+}
+
+static uint32_t
+zxdh_np_dtb_sdt_hash_zcam_mono_space_dump(uint32_t dev_id,
+ uint32_t queue_id,
+ uint32_t sdt_no,
+ HASH_ENTRY_CFG *p_hash_entry_cfg,
+ uint8_t *p_data,
+ uint32_t *p_dump_len)
+{
+ uint32_t rc = ZXDH_OK;
+
+ uint32_t i = 0;
+ uint32_t zblock_id = 0;
+ uint32_t zcell_id = 0;
+ uint32_t start_addr = 0;
+ uint32_t dtb_desc_len = 0;
+ uint32_t dump_pa_h = 0;
+ uint32_t dump_pa_l = 0;
+ uint32_t dma_addr_offset = 0;
+ uint32_t desc_addr_offset = 0;
+ uint32_t element_id = 0;
+ uint8_t *p_dump_desc_buf = NULL;
+
+ ZXDH_D_NODE *p_zblk_dn = NULL;
+ ZXDH_SE_ZBLK_CFG *p_zblk = NULL;
+ ZXDH_SE_ZREG_CFG *p_zreg = NULL;
+ ZXDH_SE_ZCELL_CFG *p_zcell = NULL;
+ ZXDH_HASH_CFG *p_hash_cfg = NULL;
+
+ ZXDH_DTB_ENTRY_T dtb_dump_entry = {0};
+ uint8_t cmd_buff[ZXDH_DTB_TABLE_CMD_SIZE_BIT / 8] = {0};
+
+ rc = zxdh_np_dtb_dump_addr_set(dev_id, queue_id, sdt_no, &element_id);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_dump_addr_set");
+
+ p_dump_desc_buf = (uint8_t *)rte_zmalloc(NULL, ZXDH_DTB_TABLE_DUMP_INFO_BUFF_SIZE, 0);
+ if (p_dump_desc_buf == NULL) {
+ PMD_DRV_LOG(ERR, "%s point null!", __func__);
+ return ZXDH_PAR_CHK_POINT_NULL;
+ }
+ dtb_dump_entry.cmd = cmd_buff;
+
+ p_hash_cfg = p_hash_entry_cfg->p_hash_cfg;
+ p_zblk_dn = p_hash_cfg->hash_shareram.zblk_list.p_next;
+
+ while (p_zblk_dn) {
+ p_zblk = (ZXDH_SE_ZBLK_CFG *)p_zblk_dn->data;
+ zblock_id = p_zblk->zblk_idx;
+
+ for (i = 0; i < ZXDH_SE_ZCELL_NUM; i++) {
+ p_zcell = &p_zblk->zcell_info[i];
+
+ if ((p_zcell->flag & ZXDH_ZCELL_FLAG_IS_MONO) &&
+ p_zcell->bulk_id == p_hash_entry_cfg->bulk_id) {
+ zcell_id = p_zcell->zcell_idx;
+
+ start_addr = ZXDH_ZBLK_ITEM_ADDR_CALC(zcell_id, 0);
+
+ zxdh_np_dtb_tab_up_item_offset_addr_get(dev_id,
+ queue_id,
+ element_id,
+ dma_addr_offset,
+ &dump_pa_h,
+ &dump_pa_l);
+
+ zxdh_np_dtb_zcam_dump_entry(dev_id, start_addr,
+ ZXDH_DTB_DUMP_ZCAM_512b, ZXDH_SE_RAM_DEPTH,
+ dump_pa_h, dump_pa_l, &dtb_dump_entry);
+
+ zxdh_np_dtb_data_write(p_dump_desc_buf, desc_addr_offset,
+ &dtb_dump_entry);
+
+ dtb_desc_len++;
+ dma_addr_offset += ZXDH_SE_RAM_DEPTH * 512 / 8;
+ desc_addr_offset += ZXDH_DTB_LEN_POS_SETP;
+
+ PMD_DRV_LOG(DEBUG, "the Zblock[%d]'s bulk_id:%d Mono Zcell_id :%d",
+ zblock_id, p_hash_entry_cfg->bulk_id, zcell_id);
+ }
+ }
+
+ for (i = 0; i < ZXDH_SE_ZREG_NUM; i++) {
+ p_zreg = &p_zblk->zreg_info[i];
+
+ if ((p_zreg->flag & ZXDH_ZREG_FLAG_IS_MONO) &&
+ p_zreg->bulk_id == p_hash_entry_cfg->bulk_id) {
+ start_addr = ZXDH_ZBLK_HASH_LIST_REG_ADDR_CALC(zblock_id, i);
+
+ zxdh_np_dtb_tab_up_item_offset_addr_get(dev_id,
+ queue_id,
+ element_id,
+ dma_addr_offset,
+ &dump_pa_h,
+ &dump_pa_l);
+
+ zxdh_np_dtb_zcam_dump_entry(dev_id, start_addr,
+ ZXDH_DTB_DUMP_ZCAM_512b, 1, dump_pa_h, dump_pa_l, &dtb_dump_entry);
+
+ zxdh_np_dtb_data_write(p_dump_desc_buf, desc_addr_offset,
+ &dtb_dump_entry);
+
+ dtb_desc_len++;
+ dma_addr_offset += 512 / 8;
+ desc_addr_offset += ZXDH_DTB_LEN_POS_SETP;
+
+ PMD_DRV_LOG(DEBUG, "the Zblock[%d]'s bulk_id:%d"
+ " Mono Zreg_id :%d", zblock_id, p_zreg->bulk_id, i);
+ }
+ }
+
+ p_zblk_dn = p_zblk_dn->next;
+ }
+
+ rc = zxdh_np_dtb_write_dump_desc_info(dev_id,
+ queue_id,
+ element_id,
+ (uint32_t *)p_dump_desc_buf,
+ dma_addr_offset / 4,
+ dtb_desc_len * 4,
+ (uint32_t *)p_data);
+ ZXDH_COMM_CHECK_RC_MEMORY_FREE(rc, "zxdh_np_dtb_write_dump_desc_info",
+ p_dump_desc_buf);
+
+ zxdh_np_comm_swap(p_data, dma_addr_offset);
+ rte_free(p_dump_desc_buf);
+
+ *p_dump_len = dma_addr_offset;
+
+ return rc;
+}
+
+static uint32_t
+zxdh_np_dtb_hash_table_zcam_dump(uint32_t dev_id,
+ uint32_t queue_id,
+ uint32_t sdt_no,
+ uint32_t zblock_num,
+ uint32_t zblock_array[ZXDH_SE_ZBLK_NUM],
+ uint8_t *p_data,
+ uint32_t *p_dump_len)
+{
+ uint32_t rc = ZXDH_OK;
+ uint32_t zblk_idx = 0;
+ uint32_t index = 0;
+ uint32_t zblock_id = 0;
+ uint32_t zcell_id = 0;
+ uint32_t start_addr = 0;
+ uint32_t dtb_desc_len = 0;
+ uint32_t dump_pa_h = 0;
+ uint32_t dump_pa_l = 0;
+ uint32_t dma_addr_offset = 0;
+ uint32_t desc_addr_offset = 0;
+ uint32_t element_id = 0;
+ uint8_t *p_dump_desc_buf = NULL;
+
+ ZXDH_DTB_ENTRY_T dtb_dump_entry = {0};
+ uint8_t cmd_buff[ZXDH_DTB_TABLE_CMD_SIZE_BIT / 8] = {0};
+
+ rc = zxdh_np_dtb_dump_addr_set(dev_id, queue_id, sdt_no, &element_id);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_dump_addr_set");
+
+ p_dump_desc_buf = (uint8_t *)rte_zmalloc(NULL, ZXDH_DTB_TABLE_DUMP_INFO_BUFF_SIZE, 0);
+ if (p_dump_desc_buf == NULL) {
+ PMD_DRV_LOG(ERR, "%s point null!", __func__);
+ return ZXDH_PAR_CHK_POINT_NULL;
+ }
+
+ dtb_dump_entry.cmd = cmd_buff;
+ for (zblk_idx = 0; zblk_idx < zblock_num; zblk_idx++) {
+ zblock_id = zblock_array[zblk_idx];
+ for (index = 0; index < ZXDH_SE_ZCELL_NUM; index++) {
+ zcell_id = zblock_id * ZXDH_SE_ZCELL_NUM + index;
+ start_addr = ZXDH_ZBLK_ITEM_ADDR_CALC(zcell_id, 0);
+
+ zxdh_np_dtb_tab_up_item_offset_addr_get(dev_id,
+ queue_id,
+ element_id,
+ dma_addr_offset,
+ &dump_pa_h,
+ &dump_pa_l);
+
+ zxdh_np_dtb_zcam_dump_entry(dev_id, start_addr,
+ ZXDH_DTB_DUMP_ZCAM_512b, ZXDH_SE_RAM_DEPTH,
+ dump_pa_h, dump_pa_l, &dtb_dump_entry);
+
+ zxdh_np_dtb_data_write(p_dump_desc_buf,
+ desc_addr_offset, &dtb_dump_entry);
+
+ dtb_desc_len++;
+ dma_addr_offset += ZXDH_SE_RAM_DEPTH * 512 / 8;
+ desc_addr_offset += ZXDH_DTB_LEN_POS_SETP;
+ }
+
+ zxdh_np_dtb_tab_up_item_offset_addr_get(dev_id,
+ queue_id,
+ element_id,
+ dma_addr_offset,
+ &dump_pa_h,
+ &dump_pa_l);
+
+ start_addr = ZXDH_ZBLK_HASH_LIST_REG_ADDR_CALC(zblock_id, 0);
+ zxdh_np_dtb_zcam_dump_entry(dev_id, start_addr, ZXDH_DTB_DUMP_ZCAM_512b,
+ ZXDH_SE_ZREG_NUM, dump_pa_h, dump_pa_l, &dtb_dump_entry);
+
+ zxdh_np_dtb_data_write(p_dump_desc_buf, desc_addr_offset, &dtb_dump_entry);
+
+ dtb_desc_len++;
+ dma_addr_offset += ZXDH_SE_ZREG_NUM * 512 / 8;
+ desc_addr_offset += ZXDH_DTB_LEN_POS_SETP;
+ }
+
+ rc = zxdh_np_dtb_write_dump_desc_info(dev_id,
+ queue_id,
+ element_id,
+ (uint32_t *)p_dump_desc_buf,
+ dma_addr_offset / 4,
+ dtb_desc_len * 4,
+ (uint32_t *)p_data);
+ ZXDH_COMM_CHECK_RC_MEMORY_FREE(rc, "zxdh_np_dtb_write_dump_desc_info",
+ p_dump_desc_buf);
+
+ zxdh_np_comm_swap(p_data, dma_addr_offset);
+ rte_free(p_dump_desc_buf);
+
+ *p_dump_len = dma_addr_offset;
+
+ return rc;
+}
+
+static void
+zxdh_np_dtb_dump_hash_parse(HASH_ENTRY_CFG *p_hash_entry_cfg,
+ uint32_t item_type,
+ uint8_t *pdata,
+ uint32_t dump_len,
+ uint8_t *p_outdata,
+ uint32_t *p_item_num)
+{
+ uint32_t item_num = 0;
+ uint32_t data_offset = 0;
+ uint32_t index = 0;
+ uint8_t temp_key_valid = 0;
+ uint8_t temp_key_type = 0;
+ uint8_t temp_tbl_id = 0;
+ uint32_t srh_entry_size = 0;
+ uint32_t item_width = ZXDH_SE_ITEM_WIDTH_MAX;
+ uint8_t *p_temp_key = NULL;
+ uint8_t *p_hash_item = NULL;
+ ZXDH_DTB_HASH_ENTRY_INFO_T *p_dtb_hash_entry = NULL;
+ ZXDH_DTB_HASH_ENTRY_INFO_T *p_temp_entry = NULL;
+
+ if (item_type == ZXDH_ITEM_DDR_256)
+ item_width = item_width / 2;
+
+ p_dtb_hash_entry = (ZXDH_DTB_HASH_ENTRY_INFO_T *)p_outdata;
+ srh_entry_size = ZXDH_GET_HASH_ENTRY_SIZE(p_hash_entry_cfg->key_type);
+
+ for (index = 0; index < (dump_len / item_width); index++) {
+ data_offset = 0;
+ p_hash_item = pdata + index * item_width;
+ while (data_offset < item_width) {
+ p_temp_key = p_hash_item + data_offset;
+ temp_key_valid = ZXDH_GET_HASH_KEY_VALID(p_temp_key);
+ temp_key_type = ZXDH_GET_HASH_KEY_TYPE(p_temp_key);
+ temp_tbl_id = ZXDH_GET_HASH_TBL_ID(p_temp_key);
+ p_temp_entry = p_dtb_hash_entry + item_num;
+
+ if (temp_key_valid && temp_key_type == p_hash_entry_cfg->key_type &&
+ temp_tbl_id == p_hash_entry_cfg->table_id) {
+ rte_memcpy(p_temp_entry->p_actu_key, p_temp_key + 1,
+ p_hash_entry_cfg->actu_key_size);
+ rte_memcpy(p_temp_entry->p_rst,
+ p_temp_key + p_hash_entry_cfg->key_by_size,
+ p_hash_entry_cfg->rst_by_size);
+ item_num++;
+ }
+
+ data_offset += srh_entry_size;
+ }
+ }
+
+ *p_item_num = item_num;
+}
+
+static uint32_t
+zxdh_np_dtb_hash_table_dump(uint32_t dev_id,
+ uint32_t queue_id,
+ uint32_t sdt_no,
+ ZXDH_DTB_DUMP_INDEX_T start_index,
+ uint8_t *p_dump_data,
+ uint32_t *p_entry_num,
+ ZXDH_DTB_DUMP_INDEX_T *next_start_index,
+ uint32_t *finish_flag)
+{
+ uint32_t rc = ZXDH_OK;
+ uint8_t *p_data = NULL;
+ uint32_t data_len = 0;
+ uint32_t entry_num = 0;
+ ZXDH_HASH_CFG *p_hash_cfg = NULL;
+ HASH_ENTRY_CFG hash_entry_cfg = {0};
+
+ rc = zxdh_np_hash_get_hash_info_from_sdt(dev_id, sdt_no, &hash_entry_cfg);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_hash_get_hash_info_from_sdt");
+
+ p_hash_cfg = hash_entry_cfg.p_hash_cfg;
+ ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_hash_cfg);
+
+ p_data = (uint8_t *)rte_zmalloc(NULL, ZXDH_DTB_DMUP_DATA_MAX, 0);
+ if (p_data == NULL) {
+ PMD_DRV_LOG(ERR, "%s point null!", __func__);
+ return ZXDH_PAR_CHK_POINT_NULL;
+ }
+
+ if (start_index.index_type == ZXDH_DTB_DUMP_ZCAM_TYPE) {
+ if (p_hash_cfg->bulk_ram_mono[hash_entry_cfg.bulk_id]) {
+ rc = zxdh_np_dtb_sdt_hash_zcam_mono_space_dump(dev_id,
+ queue_id,
+ sdt_no,
+ &hash_entry_cfg,
+ p_data,
+ &data_len);
+ ZXDH_COMM_CHECK_RC_MEMORY_FREE(rc,
+ "zxdh_np_dtb_sdt_hash_zcam_mono_space_dump", p_data);
+ } else {
+ rc = zxdh_np_dtb_hash_table_zcam_dump(dev_id,
+ queue_id,
+ sdt_no,
+ p_hash_cfg->hash_stat.zblock_num,
+ p_hash_cfg->hash_stat.zblock_array,
+ p_data,
+ &data_len);
+ ZXDH_COMM_CHECK_RC_MEMORY_FREE(rc, "zxdh_np_dtb_hash_table_zcam_dump",
+ p_data);
+ }
+
+ zxdh_np_dtb_dump_hash_parse(&hash_entry_cfg,
+ ZXDH_ITEM_RAM,
+ p_data,
+ data_len,
+ p_dump_data,
+ &entry_num);
+
+ if (p_hash_cfg->ddr_valid) {
+ next_start_index->index = 0;
+ next_start_index->index_type = ZXDH_DTB_DUMP_DDR_TYPE;
+ } else {
+ *finish_flag = 1;
+ }
+ *p_entry_num = entry_num;
+ }
+
+ rte_free(p_data);
+ return rc;
+}
+
+static uint32_t
+zxdh_np_dtb_hash_offline_zcam_delete(uint32_t dev_id,
+ uint32_t queue_id,
+ uint32_t sdt_no)
+{
+ uint32_t rc = ZXDH_OK;
+ uint32_t entry_num = 0;
+ uint32_t finish_flag = 0;
+ uint32_t index = 0;
+ uint32_t max_item_num = 1024 * 1024;
+ uint8_t *p_dump_data = NULL;
+ uint8_t *p_key = NULL;
+ uint8_t *p_rst = NULL;
+ uint32_t element_id = 0;
+
+ ZXDH_DTB_HASH_ENTRY_INFO_T *p_dtb_hash_entry = NULL;
+ ZXDH_DTB_HASH_ENTRY_INFO_T *p_temp_entry = NULL;
+ ZXDH_DTB_DUMP_INDEX_T start_index = {0};
+ ZXDH_DTB_DUMP_INDEX_T next_start_index = {0};
+
+ ZXDH_SDT_TBL_HASH_T sdt_hash = {0};
+ start_index.index = 0;
+ start_index.index_type = ZXDH_DTB_DUMP_ZCAM_TYPE;
+
+ rc = zxdh_np_soft_sdt_tbl_get(0, sdt_no, &sdt_hash);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_soft_sdt_tbl_get");
+
+ p_dump_data = (uint8_t *)rte_zmalloc(NULL, max_item_num *
+ sizeof(ZXDH_DTB_HASH_ENTRY_INFO_T), 0);
+ if (p_dump_data == NULL) {
+ PMD_DRV_LOG(ERR, "%s point null!", __func__);
+ return ZXDH_PAR_CHK_POINT_NULL;
+ }
+ p_key = (uint8_t *)rte_zmalloc(NULL, max_item_num * ZXDH_HASH_KEY_MAX, 0);
+ ZXDH_COMM_CHECK_POINT_MEMORY_FREE(p_key, p_dump_data);
+ p_rst = (uint8_t *)rte_zmalloc(NULL, max_item_num * ZXDH_HASH_RST_MAX, 0);
+ ZXDH_COMM_CHECK_POINT_MEMORY_FREE2PTR(p_rst, p_dump_data, p_key);
+
+ p_dtb_hash_entry = (ZXDH_DTB_HASH_ENTRY_INFO_T *)p_dump_data;
+ for (index = 0; index < max_item_num; index++) {
+ p_temp_entry = p_dtb_hash_entry + index;
+ p_temp_entry->p_actu_key = p_key + index * ZXDH_HASH_KEY_MAX;
+ p_temp_entry->p_rst = p_rst + index * ZXDH_HASH_RST_MAX;
+ }
+
+ rc = zxdh_np_dtb_hash_table_dump(0, queue_id, sdt_no, start_index,
+ p_dump_data, &entry_num, &next_start_index, &finish_flag);
+
+ if (entry_num) {
+ rc = zxdh_np_dtb_hash_zcam_del_hw(0, queue_id, sdt_no,
+ entry_num, p_dtb_hash_entry, &element_id);
+ }
+
+ rte_free(p_dtb_hash_entry);
+ rte_free(p_key);
+ rte_free(p_rst);
+
+ return rc;
+}
+
+uint32_t
+zxdh_np_dtb_hash_online_delete(uint32_t dev_id, uint32_t queue_id, uint32_t sdt_no)
+{
+ uint32_t rc = 0;
+ uint8_t key_valid = 0;
+ uint32_t table_id = 0;
+ uint32_t key_type = 0;
+
+ ZXDH_D_NODE *p_node = NULL;
+ ZXDH_RB_TN *p_rb_tn = NULL;
+ ZXDH_D_HEAD *p_head_hash_rb = NULL;
+ ZXDH_HASH_CFG *p_hash_cfg = NULL;
+ ZXDH_HASH_RBKEY_INFO *p_rbkey = NULL;
+ HASH_ENTRY_CFG hash_entry_cfg = {0};
+ ZXDH_DTB_USER_ENTRY_T del_entry = {0};
+ ZXDH_DTB_HASH_ENTRY_INFO_T hash_entry = {0};
+
+ del_entry.sdt_no = sdt_no;
+ del_entry.p_entry_data = &hash_entry;
+
+ rc = zxdh_np_hash_get_hash_info_from_sdt(dev_id, sdt_no, &hash_entry_cfg);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_hash_get_hash_info_from_sdt");
+
+ p_hash_cfg = hash_entry_cfg.p_hash_cfg;
+ ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_hash_cfg);
+
+ p_head_hash_rb = &p_hash_cfg->hash_rb.tn_list;
+ p_node = p_head_hash_rb->p_next;
+ while (p_node) {
+ p_rb_tn = (ZXDH_RB_TN *)p_node->data;
+ ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_rb_tn);
+ p_rbkey = (ZXDH_HASH_RBKEY_INFO *)p_rb_tn->p_key;
+ hash_entry.p_actu_key = p_rbkey->key + 1;
+ hash_entry.p_rst = p_rbkey->key;
+
+ key_valid = ZXDH_GET_HASH_KEY_VALID(p_rbkey->key);
+ table_id = ZXDH_GET_HASH_TBL_ID(p_rbkey->key);
+ key_type = ZXDH_GET_HASH_KEY_TYPE(p_rbkey->key);
+ if (!key_valid ||
+ table_id != hash_entry_cfg.table_id ||
+ key_type != hash_entry_cfg.key_type) {
+ p_node = p_node->next;
+ continue;
+ }
+ p_node = p_node->next;
+
+ rc = zxdh_np_dtb_table_entry_delete(dev_id, queue_id, 1, &del_entry);
+ if (rc == ZXDH_HASH_RC_DEL_SRHFAIL)
+ continue;
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_table_entry_delete");
+ }
+
+ return rc;
+}
+
+uint32_t
+zxdh_np_dtb_hash_offline_delete(uint32_t dev_id,
+ uint32_t queue_id,
+ uint32_t sdt_no,
+ __rte_unused uint32_t flush_mode)
+{
+ uint32_t rc = ZXDH_OK;
+
+ rc = zxdh_np_dtb_hash_offline_zcam_delete(dev_id, queue_id, sdt_no);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_hash_offline_zcam_delete");
+
+ return rc;
+}
diff --git a/drivers/net/zxdh/zxdh_np.h b/drivers/net/zxdh/zxdh_np.h
index 0762db5fad..2ba9554684 100644
--- a/drivers/net/zxdh/zxdh_np.h
+++ b/drivers/net/zxdh/zxdh_np.h
@@ -95,6 +95,11 @@
#define ZXDH_DTB_ITEM_ADD_OR_UPDATE (0)
#define ZXDH_DTB_ITEM_DELETE (1)
#define ZXDH_DTB_ZCAM_LEN_SIZE (5)
+#define ZXDH_DTB_DUMP_ZCAM_TYPE (0)
+#define ZXDH_DTB_DUMP_DDR_TYPE (1)
+#define ZXDH_DTB_DMUP_DATA_MAX (64 * 1024 * 1024)
+#define ZXDH_DTB_TABLE_DUMP_INFO_BUFF_SIZE (1024 * 4)
+#define ZXDH_DTB_ETCAM_LEN_SIZE (6)
#define ZXDH_ETCAM_LEN_SIZE (6)
#define ZXDH_ETCAM_BLOCK_NUM (8)
@@ -231,6 +236,10 @@
#define ZXDH_SDT_L_CLUTCH_EN_BT_POS (0)
#define ZXDH_SDT_L_CLUTCH_EN_BT_LEN (1)
+/* hash */
+#define ZXDH_SDT_L2_ENTRY_TABLE0 (64)
+#define ZXDH_SDT_MC_TABLE0 (76)
+
/**errco code */
#define ZXDH_RC_BASE (0x1000U)
#define ZXDH_PARAMETER_CHK_BASE (ZXDH_RC_BASE | 0x200)
@@ -1677,6 +1686,11 @@ typedef struct __rte_aligned(2) zxdh_se_stat_cfg_t {
uint32_t ppu_ddr_offset;
} ZXDH_NP_SE_STAT_CFG_T;
+typedef struct zxdh_dtb_dump_index_t {
+ uint32_t index;
+ uint32_t index_type;
+} ZXDH_DTB_DUMP_INDEX_T;
+
int zxdh_np_host_init(uint32_t dev_id, ZXDH_DEV_INIT_CTRL_T *p_dev_init_ctrl);
int zxdh_np_online_uninit(uint32_t dev_id, char *port_name, uint32_t queue_id);
int zxdh_np_dtb_table_entry_write(uint32_t dev_id, uint32_t queue_id,
@@ -1691,5 +1705,10 @@ int zxdh_np_dtb_stats_get(uint32_t dev_id,
uint32_t index,
uint32_t *p_data);
uint32_t zxdh_np_se_res_get_and_init(uint32_t dev_id, uint32_t type);
+uint32_t zxdh_np_dtb_hash_online_delete(uint32_t dev_id, uint32_t queue_id, uint32_t sdt_no);
+uint32_t zxdh_np_dtb_hash_offline_delete(uint32_t dev_id,
+ uint32_t queue_id,
+ uint32_t sdt_no,
+ __rte_unused uint32_t flush_mode);
#endif /* ZXDH_NP_H */
--
2.27.0
[-- Attachment #1.1.2: Type: text/html , Size: 112084 bytes --]
next prev parent reply other threads:[~2025-02-10 2:03 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-02-10 1:44 [PATCH v1 01/14] net/zxdh: add network processor registers ops Bingbin Chen
2025-02-10 1:46 ` [PATCH v1 02/14] net/zxdh: support compatibility check Bingbin Chen
2025-02-10 17:25 ` Stephen Hemminger
2025-02-10 1:47 ` [PATCH v1 03/14] net/zxdh: add agent channel Bingbin Chen
2025-02-10 17:28 ` Stephen Hemminger
2025-02-10 17:30 ` Stephen Hemminger
2025-02-10 17:31 ` Stephen Hemminger
2025-02-10 18:23 ` Stephen Hemminger
2025-02-10 1:47 ` [PATCH v1 04/14] net/zxdh: modify dtb queue ops Bingbin Chen
2025-02-10 17:31 ` Stephen Hemminger
2025-02-10 1:48 ` [PATCH v1 05/14] net/zxdh: add tables dump address ops Bingbin Chen
2025-02-10 17:33 ` Stephen Hemminger
2025-02-10 1:50 ` [PATCH v1 06/14] net/zxdh: add eram tables ops Bingbin Chen
2025-02-10 1:50 ` [PATCH v1 07/14] net/zxdh: get flow tables resources Bingbin Chen
2025-02-10 17:35 ` Stephen Hemminger
2025-02-10 17:35 ` Stephen Hemminger
2025-02-10 1:50 ` [PATCH v1 08/14] net/zxdh: support hash resources configuration Bingbin Chen
2025-02-10 17:36 ` Stephen Hemminger
2025-02-10 1:50 ` [PATCH v1 09/14] net/zxdh: implement tables initialization Bingbin Chen
2025-02-10 17:40 ` Stephen Hemminger
2025-02-10 17:43 ` Stephen Hemminger
2025-02-10 1:50 ` [PATCH v1 10/14] net/zxdh: support hash tables write and delete ops Bingbin Chen
2025-02-10 17:45 ` Stephen Hemminger
2025-02-10 1:50 ` [PATCH v1 11/14] net/zxdh: get hash table entry result Bingbin Chen
2025-02-10 17:46 ` Stephen Hemminger
2025-02-10 1:50 ` Bingbin Chen [this message]
2025-02-10 17:47 ` [PATCH v1 12/14] net/zxdh: delete all hash entries Stephen Hemminger
2025-02-10 1:50 ` [PATCH v1 13/14] net/zxdh: add acl tables ops Bingbin Chen
2025-02-10 1:50 ` [PATCH v1 14/14] net/zxdh: clean stat values Bingbin Chen
2025-02-10 17:50 ` Stephen Hemminger
2025-02-10 17:50 ` Stephen Hemminger
2025-02-10 18:19 ` Stephen Hemminger
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250210015017.4105624-7-chen.bingbin@zte.com.cn \
--to=chen.bingbin@zte.com.cn \
--cc=dev@dpdk.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).