DPDK patches and discussions
 help / color / mirror / Atom feed
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 --]

  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).