Implement hash table entries all delete operation<br />by dtb channel.<br /> <br />Signed-off-by: Bingbin Chen <chen.bingbin@zte.com.cn> <br />---<br /> drivers/net/zxdh/zxdh_ethdev.c |   57 ++<br /> drivers/net/zxdh/zxdh_np.c     | 1055 ++++++++++++++++++++++++++++++++<br /> drivers/net/zxdh/zxdh_np.h     |   10 +<br /> 3 files changed, 1122 insertions(+)<br /> <br />diff --git a/drivers/net/zxdh/zxdh_ethdev.c b/drivers/net/zxdh/zxdh_ethdev.c<br />index ea34b9229b..ea8b18e5e1 100644<br />--- a/drivers/net/zxdh/zxdh_ethdev.c<br />+++ b/drivers/net/zxdh/zxdh_ethdev.c<br />@@ -1119,6 +1119,30 @@ zxdh_np_dtb_data_res_free(struct zxdh_hw *hw)<br />         zxdh_shared_data->np_init_done = 0;<br /> }<br />  <br />+static int<br />+zxdh_tbl_entry_online_destroy(struct rte_eth_dev *dev)<br />+{<br />+    struct zxdh_hw *hw = dev->data->dev_private;<br />+    struct zxdh_dtb_shared_data *dtb_data = &hw->dev_sd->dtb_sd;<br />+    uint32_t sdt_no;<br />+    int ret = 0;<br />+    if (!dtb_data->init_done)<br />+        return ret;<br />+    if (hw->is_pf) {<br />+        sdt_no = ZXDH_SDT_L2_ENTRY_TABLE0 + hw->hash_search_index;<br />+        ret = zxdh_np_dtb_hash_online_delete(hw->dev_id, dtb_data->queueid, sdt_no);<br />+        if (ret)<br />+            PMD_DRV_LOG(ERR, "%s sdt_no %d failed. code:%d ",<br />+                dev->data->name, sdt_no, ret);<br />+        sdt_no = ZXDH_SDT_MC_TABLE0 + hw->hash_search_index;<br />+        ret = zxdh_np_dtb_hash_online_delete(hw->dev_id, dtb_data->queueid, sdt_no);<br />+        if (ret)<br />+            PMD_DRV_LOG(ERR, "%s sdt_no %d failed. code:%d",<br />+                dev->data->name, sdt_no, ret);<br />+    }<br />+    return ret;<br />+}<br />+<br /> static void<br /> zxdh_np_uninit(struct rte_eth_dev *dev)<br /> {<br />@@ -1130,6 +1154,8 @@ zxdh_np_uninit(struct rte_eth_dev *dev)<br />     if (!dtb_data->init_done && !dtb_data->dev_refcnt)<br />         return;<br />  <br />+    zxdh_tbl_entry_online_destroy(dev);<br />+<br />     if (--dtb_data->dev_refcnt == 0)<br />         zxdh_np_dtb_data_res_free(hw);<br /> }<br />@@ -1796,12 +1822,42 @@ zxdh_init_once(struct rte_eth_dev *eth_dev)<br />     return ret;<br /> }<br />  <br />+static int<br />+zxdh_tbl_entry_offline_destroy(struct zxdh_hw *hw)<br />+{<br />+    struct zxdh_dtb_shared_data *dtb_data = &hw->dev_sd->dtb_sd;<br />+    int ret = 0;<br />+    if (!dtb_data->init_done)<br />+        return ret;<br />+    if (hw->is_pf) {<br />+        uint32_t sdt_no;<br />+        sdt_no = ZXDH_SDT_L2_ENTRY_TABLE0 + hw->hash_search_index;<br />+        ret = zxdh_np_dtb_hash_offline_delete(hw->dev_id, dtb_data->queueid, sdt_no, 0);<br />+        if (ret)<br />+            PMD_DRV_LOG(ERR, "sdt_no %d delete failed. code:%d ", sdt_no, ret);<br />+        sdt_no = ZXDH_SDT_MC_TABLE0 + hw->hash_search_index;<br />+        ret = zxdh_np_dtb_hash_offline_delete(hw->dev_id, dtb_data->queueid, sdt_no, 0);<br />+        if (ret)<br />+            PMD_DRV_LOG(ERR, "sdt_no %d delete failed. code:%d ", sdt_no, ret);<br />+    }<br />+    return ret;<br />+}<br />+<br /> static int<br /> zxdh_np_init(struct rte_eth_dev *eth_dev)<br /> {<br />     struct zxdh_hw *hw = eth_dev->data->dev_private;<br />+    struct zxdh_dtb_shared_data *dtb_data = &hw->dev_sd->dtb_sd;<br />     int ret = 0;<br />  <br />+    if (hw->is_pf && dtb_data->init_done) {<br />+        dtb_data->dev_refcnt++;<br />+        zxdh_tbl_entry_offline_destroy(hw);<br />+        PMD_DRV_LOG(INFO, "no need to init dtb  dtb chanenl %d devref %d",<br />+            dtb_data->queueid, dtb_data->dev_refcnt);<br />+        return 0;<br />+    }<br />+<br />     if (hw->is_pf) {<br />         ret = zxdh_np_dtb_res_init(eth_dev);<br />         if (ret) {<br />@@ -1820,6 +1876,7 @@ zxdh_np_init(struct rte_eth_dev *eth_dev)<br />             PMD_DRV_LOG(ERR, "invalid hash idx %d", hw->hash_search_index);<br />             return -1;<br />         }<br />+        zxdh_tbl_entry_offline_destroy(hw);<br />     }<br />  <br />     if (zxdh_shared_data != NULL)<br />diff --git a/drivers/net/zxdh/zxdh_np.c b/drivers/net/zxdh/zxdh_np.c<br />index fb61e0f99c..1cfaee240a 100644<br />--- a/drivers/net/zxdh/zxdh_np.c<br />+++ b/drivers/net/zxdh/zxdh_np.c<br />@@ -519,6 +519,8 @@ zxdh_np_get_tn_color(ZXDH_RB_TN *p_tn)<br />  <br /> #define GET_HASH_TBL_ID_INFO(dev_id, fun_id, tbl_id) (&g_tbl_id_info[dev_id][fun_id][tbl_id])<br />  <br />+#define ZXDH_GET_HASH_TBL_ID(p_key)    ((p_key)[0] & 0x1F)<br />+<br /> static inline uint32_t<br /> zxdh_np_get_hash_entry_size(uint32_t key_type)<br /> {<br />@@ -1791,6 +1793,20 @@ zxdh_np_se_apt_rb_delete(ZXDH_RB_CFG *rb_cfg, void *p_data, __rte_unused uint32_<br />     return rc;<br /> }<br />  <br />+static uint32_t<br />+zxdh_np_se_apt_rb_search(ZXDH_RB_CFG *rb_cfg, void *p_data, uint32_t len)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+    ZXDH_RB_TN *p_rb_rtn     = NULL;<br />+<br />+    rc = zxdh_comm_rb_search(rb_cfg, p_data, &p_rb_rtn);<br />+    if (rc != ZXDH_OK)<br />+        return rc;<br />+<br />+    memcpy(p_data, p_rb_rtn->p_key, len);<br />+    return rc;<br />+}<br />+<br /> static uint32_t<br /> zxdh_np_dev_init(void)<br /> {<br />@@ -3803,6 +3819,219 @@ zxdh_np_dev_del(uint32_t dev_id)<br />     }<br /> }<br />  <br />+static uint32_t<br />+zxdh_np_hash_soft_all_entry_delete(ZXDH_SE_CFG *p_se_cfg, uint32_t hash_id)<br />+{<br />+    uint32_t rc = 0;<br />+    uint32_t dev_id = p_se_cfg->dev_id;<br />+    uint8_t table_id = 0;<br />+    uint32_t bulk_id = 0;<br />+<br />+    ZXDH_D_NODE *p_node = NULL;<br />+    ZXDH_RB_TN *p_rb_tn = NULL;<br />+    ZXDH_RB_TN *p_rb_tn_rtn = NULL;<br />+    ZXDH_HASH_RBKEY_INFO *p_rbkey = NULL;<br />+    ZXDH_HASH_RBKEY_INFO *p_rbkey_rtn = NULL;<br />+    ZXDH_SE_ITEM_CFG *p_item = NULL;<br />+    ZXDH_FUNC_ID_INFO *p_func_info = ZXDH_GET_FUN_INFO(p_se_cfg, hash_id);<br />+    ZXDH_HASH_CFG *p_hash_cfg = (ZXDH_HASH_CFG *)p_func_info->fun_ptr;<br />+    ZXDH_D_HEAD *p_head_hash_rb = &p_hash_cfg->hash_rb.tn_list;<br />+<br />+    while (p_head_hash_rb->used) {<br />+        p_node = p_head_hash_rb->p_next;<br />+        p_rb_tn = (ZXDH_RB_TN *)p_node->data;<br />+        p_rbkey = (ZXDH_HASH_RBKEY_INFO *)p_rb_tn->p_key;<br />+        table_id = ZXDH_GET_HASH_TBL_ID(p_rbkey->key);<br />+        bulk_id = ((table_id >> 2) & 0x7);<br />+<br />+        rc = zxdh_comm_rb_delete(&p_hash_cfg->hash_rb, p_rbkey, &p_rb_tn_rtn);<br />+        if (rc == ZXDH_RBT_RC_SRHFAIL) {<br />+            p_hash_cfg->hash_stat.delete_fail++;<br />+            PMD_DRV_LOG(DEBUG, "Error!there is not item in hash!");<br />+            return ZXDH_HASH_RC_DEL_SRHFAIL;<br />+        }<br />+<br />+        ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_rb_tn_rtn);<br />+        p_rbkey_rtn = (ZXDH_HASH_RBKEY_INFO *)(p_rb_tn_rtn->p_key);<br />+        p_item = p_rbkey_rtn->p_item_info;<br />+<br />+        rc = zxdh_comm_double_link_del(&p_rbkey_rtn->entry_dn, &p_item->item_list);<br />+        ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_comm_double_link_del");<br />+        p_item->wrt_mask &= ~(ZXDH_GET_HASH_ENTRY_MASK(p_rbkey_rtn->entry_size,<br />+            p_rbkey_rtn->entry_pos)) & 0xF;<br />+<br />+        if (p_item->item_list.used == 0) {<br />+            if (p_item->item_type == ZXDH_ITEM_DDR_256 ||<br />+                p_item->item_type == ZXDH_ITEM_DDR_512) {<br />+                p_hash_cfg->p_bulk_ddr_info[bulk_id]->p_item_array<br />+                    [p_item->item_index] = NULL;<br />+                rte_free(p_item);<br />+            } else {<br />+                p_item->valid = 0;<br />+            }<br />+        }<br />+<br />+        rte_free(p_rbkey_rtn);<br />+        rte_free(p_rb_tn_rtn);<br />+        p_hash_cfg->hash_stat.delete_ok++;<br />+    }<br />+<br />+    return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_hash_zcam_resource_deinit(ZXDH_HASH_CFG *p_hash_cfg)<br />+{<br />+    uint32_t rc = 0;<br />+    uint32_t dev_id = p_hash_cfg->p_se_info->dev_id;<br />+    uint32_t i = 0;<br />+<br />+    ZXDH_D_NODE *p_node = NULL;<br />+    ZXDH_D_HEAD *p_head = &p_hash_cfg->hash_shareram.zcell_free_list;<br />+    ZXDH_SE_ZBLK_CFG *p_zblk_cfg = NULL;<br />+    ZXDH_SE_ZCELL_CFG *p_zcell_cfg = NULL;<br />+<br />+    while (p_head->used) {<br />+        p_node = p_head->p_next;<br />+<br />+        rc = zxdh_comm_double_link_del(p_node, p_head);<br />+        ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_comm_double_link_del");<br />+        p_zcell_cfg = (ZXDH_SE_ZCELL_CFG *)p_node->data;<br />+        p_zcell_cfg->is_used = 0;<br />+        p_zcell_cfg->flag = 0;<br />+    }<br />+<br />+    p_head = &p_hash_cfg->hash_shareram.zblk_list;<br />+<br />+    while (p_head->used) {<br />+        p_node = p_head->p_next;<br />+<br />+        rc = zxdh_comm_double_link_del(p_node, p_head);<br />+        ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_comm_double_link_del");<br />+<br />+        p_zblk_cfg = ZXDH_SE_GET_ZBLK_CFG(p_hash_cfg->p_se_info,<br />+            ((ZXDH_SE_ZBLK_CFG *)p_node->data)->zblk_idx);<br />+        p_zblk_cfg->is_used = 0;<br />+        for (i = 0; i < ZXDH_SE_ZREG_NUM; i++)<br />+            p_zblk_cfg->zreg_info[i].flag = 0;<br />+    }<br />+<br />+    return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_se_fun_deinit(ZXDH_SE_CFG *p_se_cfg,<br />+                             uint8_t       id,<br />+                             uint32_t     fun_type)<br />+{<br />+    ZXDH_FUNC_ID_INFO  *p_fun_info = ZXDH_GET_FUN_INFO(p_se_cfg, id);<br />+<br />+    if (p_fun_info->is_used == 0) {<br />+        PMD_DRV_LOG(ERR, " Error[0x%x], fun_id [%u] is already deinit!",<br />+            ZXDH_SE_RC_FUN_INVALID, id);<br />+        return ZXDH_OK;<br />+    }<br />+<br />+    switch (fun_type) {<br />+    case (ZXDH_FUN_HASH):<br />+        if (p_fun_info->fun_ptr) {<br />+            rte_free(p_fun_info->fun_ptr);<br />+            p_fun_info->fun_ptr = NULL;<br />+        }<br />+        break;<br />+    default:<br />+        PMD_DRV_LOG(ERR, " Error, unrecgnized fun_type[ %u] ", fun_type);<br />+        RTE_ASSERT(0);<br />+        return ZXDH_SE_RC_BASE;<br />+    }<br />+<br />+    p_fun_info->fun_id = id;<br />+    p_fun_info->is_used = 0;<br />+<br />+    return ZXDH_OK;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_one_hash_soft_uninstall(uint32_t dev_id, uint32_t hash_id)<br />+{<br />+    uint32_t rc = 0;<br />+    uint32_t i = 0;<br />+<br />+    ZXDH_D_NODE *p_node = NULL;<br />+    ZXDH_SE_CFG *p_se_cfg = dpp_se_cfg[dev_id];<br />+    ZXDH_RB_TN *p_rb_tn = NULL;<br />+    ZXDH_RB_TN *p_rb_tn_rtn = NULL;<br />+    HASH_DDR_CFG *p_rbkey = NULL;<br />+    ZXDH_HASH_CFG *p_hash_cfg = NULL;<br />+    ZXDH_FUNC_ID_INFO *p_func_info = ZXDH_GET_FUN_INFO(p_se_cfg, hash_id);<br />+    ZXDH_D_HEAD *p_head_ddr_cfg_rb = NULL;<br />+    HASH_DDR_CFG *p_temp_rbkey = NULL;<br />+<br />+    if (p_func_info->is_used == 0) {<br />+        PMD_DRV_LOG(ERR, "Error[0x%x], fun_id [%u] is not init!",<br />+            ZXDH_SE_RC_FUN_INVALID, hash_id);<br />+        return ZXDH_OK;<br />+    }<br />+<br />+    rc = zxdh_np_hash_soft_all_entry_delete(p_se_cfg, hash_id);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_hash_soft_all_entry_delete");<br />+<br />+    p_hash_cfg = (ZXDH_HASH_CFG *)p_func_info->fun_ptr;<br />+    for (i = 0; i < ZXDH_HASH_BULK_NUM; i++) {<br />+        if (p_hash_cfg->hash_stat.p_bulk_zcam_mono[i] != NULL) {<br />+            rte_free((&p_hash_cfg->hash_stat)->p_bulk_zcam_mono[i]);<br />+            (&p_hash_cfg->hash_stat)->p_bulk_zcam_mono[i] = NULL;<br />+        }<br />+    }<br />+<br />+    p_head_ddr_cfg_rb = &p_hash_cfg->ddr_cfg_rb.tn_list;<br />+    while (p_head_ddr_cfg_rb->used) {<br />+        p_node = p_head_ddr_cfg_rb->p_next;<br />+<br />+        p_rb_tn = (ZXDH_RB_TN *)p_node->data;<br />+        p_rbkey = p_rb_tn->p_key;<br />+<br />+        rc = zxdh_comm_rb_delete(&p_hash_cfg->ddr_cfg_rb, p_rbkey, &p_rb_tn_rtn);<br />+<br />+        if (rc == ZXDH_RBT_RC_SRHFAIL)<br />+            PMD_DRV_LOG(ERR, "ddr_cfg_rb delete key is not exist, key: 0x");<br />+        else<br />+            ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_comm_rb_delete");<br />+<br />+        ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_rb_tn_rtn);<br />+        p_temp_rbkey = (HASH_DDR_CFG *)(p_rb_tn_rtn->p_key);<br />+        rte_free(p_temp_rbkey->p_item_array);<br />+        p_temp_rbkey->p_item_array = NULL;<br />+        rte_free(p_temp_rbkey);<br />+        rte_free(p_rb_tn_rtn);<br />+    }<br />+<br />+    rc = zxdh_np_hash_zcam_resource_deinit(p_hash_cfg);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_hash_zcam_resource_deinit");<br />+<br />+    rc = zxdh_np_se_fun_deinit(p_se_cfg, (hash_id & 0xff), ZXDH_FUN_HASH);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_se_fun_deinit");<br />+<br />+    memset(g_tbl_id_info[dev_id][hash_id], 0,<br />+        ZXDH_HASH_TBL_ID_NUM * sizeof(ZXDH_HASH_TBL_ID_INFO));<br />+<br />+    return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_hash_soft_uninstall(uint32_t dev_id)<br />+{<br />+    uint32_t  rc       = ZXDH_OK;<br />+    uint32_t hash_id  = 0;<br />+<br />+    for (hash_id = 0; hash_id < ZXDH_HASH_FUNC_ID_NUM; hash_id++) {<br />+        rc = zxdh_np_one_hash_soft_uninstall(dev_id, hash_id);<br />+        ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_one_hash_soft_uninstall");<br />+    }<br />+<br />+    return rc;<br />+}<br />+<br /> int<br /> zxdh_np_online_uninit(uint32_t dev_id,<br />             char *port_name,<br />@@ -3814,6 +4043,10 @@ zxdh_np_online_uninit(uint32_t dev_id,<br />     if (rc != 0)<br />         PMD_DRV_LOG(ERR, "dtb release port name %s queue id %u", port_name, queue_id);<br />  <br />+    rc = zxdh_np_hash_soft_uninstall(dev_id);<br />+    if (rc != ZXDH_OK)<br />+        PMD_DRV_LOG(ERR, "zxdh_np_hash_soft_uninstall error! ");<br />+<br />     zxdh_np_dtb_mgr_destroy(dev_id);<br />     zxdh_np_sdt_mgr_destroy(dev_id);<br />     zxdh_np_dev_del(dev_id);<br />@@ -4081,6 +4314,25 @@ zxdh_np_dtb_zcam_dump_info_write(uint32_t dev_id,<br />     return rc;<br /> }<br />  <br />+static void<br />+zxdh_np_dtb_zcam_dump_entry(uint32_t dev_id,<br />+                    uint32_t addr,<br />+                    uint32_t tb_width,<br />+                    uint32_t depth,<br />+                    uint32_t addr_high32,<br />+                    uint32_t addr_low32,<br />+                    ZXDH_DTB_ENTRY_T *p_entry)<br />+{<br />+    zxdh_np_dtb_zcam_dump_info_write(dev_id,<br />+                        addr,<br />+                        tb_width,<br />+                        depth,<br />+                        addr_high32,<br />+                        addr_low32,<br />+                        (uint32_t *)p_entry->cmd);<br />+    p_entry->data_in_cmd_flag = 1;<br />+}<br />+<br /> static uint32_t<br /> zxdh_np_dtb_se_smmu0_ind_write(uint32_t dev_id,<br />         uint32_t base_addr,<br />@@ -5904,6 +6156,29 @@ zxdh_np_dtb_tab_up_item_addr_get(uint32_t dev_id,<br />     return rc;<br /> }<br />  <br />+static void<br />+zxdh_np_dtb_tab_up_item_offset_addr_get(uint32_t dev_id,<br />+            uint32_t queue_id,<br />+            uint32_t item_index,<br />+            uint32_t addr_offset,<br />+            uint32_t *p_phy_haddr,<br />+            uint32_t *p_phy_laddr)<br />+{<br />+    uint64_t addr = 0;<br />+<br />+    if (ZXDH_DTB_TAB_UP_USER_PHY_ADDR_FLAG_GET(dev_id, queue_id, item_index) ==<br />+    ZXDH_DTB_TAB_UP_USER_ADDR_TYPE)<br />+        addr = ZXDH_DTB_TAB_UP_USER_PHY_ADDR_GET(dev_id, queue_id, item_index);<br />+    else<br />+        addr = ZXDH_DTB_TAB_UP_PHY_ADDR_GET(dev_id, queue_id, item_index) +<br />+            ZXDH_DTB_ITEM_ACK_SIZE;<br />+<br />+    addr = addr + addr_offset;<br />+<br />+    *p_phy_haddr = (addr >> 32) & 0xffffffff;<br />+    *p_phy_laddr = addr & 0xffffffff;<br />+}<br />+<br /> static uint32_t<br /> zxdh_np_dtb_dump_table_element_addr_get(uint32_t dev_id,<br />                         uint32_t queue_id,<br />@@ -6118,6 +6393,101 @@ zxdh_np_dtb_tab_up_free_item_get(uint32_t dev_id,<br />     return 0;<br /> }<br />  <br />+static uint32_t<br />+zxdh_np_dtb_tab_up_item_user_addr_set(uint32_t dev_id,<br />+                    uint32_t queue_id,<br />+                    uint32_t item_index,<br />+                    uint64_t phy_addr,<br />+                    uint64_t vir_addr)<br />+{<br />+    ZXDH_DTB_MGR_T *p_dtb_mgr = NULL;<br />+<br />+    p_dtb_mgr = zxdh_np_dtb_mgr_get(dev_id);<br />+    if (p_dtb_mgr == NULL) {<br />+        PMD_DRV_LOG(ERR, "DTB Manager is not exist!");<br />+        return ZXDH_RC_DTB_MGR_NOT_EXIST;<br />+    }<br />+<br />+    if (ZXDH_DTB_QUEUE_INIT_FLAG_GET(dev_id, queue_id) == 0) {<br />+        PMD_DRV_LOG(ERR, "dtb queue %u is not init.", queue_id);<br />+        return ZXDH_RC_DTB_QUEUE_IS_NOT_INIT;<br />+    }<br />+<br />+    p_dtb_mgr->queue_info[queue_id].tab_up.user_addr[item_index].phy_addr = phy_addr;<br />+    p_dtb_mgr->queue_info[queue_id].tab_up.user_addr[item_index].vir_addr = vir_addr;<br />+    p_dtb_mgr->queue_info[queue_id].tab_up.user_addr[item_index].user_flag =<br />+        ZXDH_DTB_TAB_UP_USER_ADDR_TYPE;<br />+<br />+    return ZXDH_OK;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_dump_sdt_addr_get(uint32_t dev_id,<br />+                            uint32_t queue_id,<br />+                            uint32_t sdt_no,<br />+                            uint64_t *phy_addr,<br />+                            uint64_t *vir_addr,<br />+                            uint32_t *size)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+<br />+    ZXDH_DTB_ADDR_INFO_T dtb_dump_addr_info = {0};<br />+    ZXDH_RB_CFG *p_dtb_dump_addr_rb = NULL;<br />+<br />+    dtb_dump_addr_info.sdt_no = sdt_no;<br />+    p_dtb_dump_addr_rb = zxdh_np_dtb_dump_addr_rb_get(dev_id, queue_id);<br />+    rc = zxdh_np_se_apt_rb_search(p_dtb_dump_addr_rb, &dtb_dump_addr_info,<br />+        sizeof(ZXDH_DTB_ADDR_INFO_T));<br />+    if (rc == ZXDH_OK) {<br />+        PMD_DRV_LOG(INFO, "search sdt_no %u success.", sdt_no);<br />+    } else {<br />+        PMD_DRV_LOG(ERR, "search sdt_no %u fail.", sdt_no);<br />+        return rc;<br />+    }<br />+<br />+    *phy_addr = dtb_dump_addr_info.phy_addr;<br />+    *vir_addr = dtb_dump_addr_info.vir_addr;<br />+    *size = dtb_dump_addr_info.size;<br />+<br />+    return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_dump_addr_set(uint32_t dev_id,<br />+                            uint32_t queue_id,<br />+                            uint32_t sdt_no,<br />+                            uint32_t *element_id)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+    uint32_t dump_element_id = 0;<br />+    uint64_t phy_addr = 0;<br />+    uint64_t vir_addr = 0;<br />+    uint32_t size     = 0;<br />+<br />+    rc = zxdh_np_dtb_dump_sdt_addr_get(dev_id,<br />+                                    queue_id,<br />+                                    sdt_no,<br />+                                    &phy_addr,<br />+                                    &vir_addr,<br />+                                    &size);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_dump_sdt_addr_get");<br />+    memset((uint8_t *)vir_addr, 0, size);<br />+<br />+    rc = zxdh_np_dtb_tab_up_free_item_get(dev_id, queue_id, &dump_element_id);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_tab_up_free_item_get");<br />+<br />+    rc = zxdh_np_dtb_tab_up_item_user_addr_set(dev_id,<br />+                                           queue_id,<br />+                                           dump_element_id,<br />+                                           phy_addr,<br />+                                           vir_addr);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_tab_up_item_addr_set");<br />+<br />+    *element_id = dump_element_id;<br />+<br />+    return rc;<br />+}<br />+<br /> static uint32_t<br /> zxdh_np_dtb_se_smmu0_dma_dump(uint32_t dev_id,<br />         uint32_t queue_id,<br />@@ -8585,6 +8955,691 @@ zxdh_np_se_res_get_and_init(uint32_t dev_id, uint32_t type)<br />     return rc;<br /> }<br />  <br />+static uint32_t<br />+zxdh_np_dtb_hash_zcam_del_one_hw(uint32_t dev_id,<br />+                                uint32_t queue_id,<br />+                                HASH_ENTRY_CFG  *p_hash_entry_cfg,<br />+                                ZXDH_HASH_ENTRY  *p_hash_entry,<br />+                                ZXDH_DTB_ENTRY_T *p_entry,<br />+                                uint8_t *p_srh_succ)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+    ZXDH_HASH_RBKEY_INFO srh_rbkey = {0};<br />+    ZXDH_HASH_CFG *p_hash_cfg = NULL;<br />+    ZXDH_SE_ZCELL_CFG *p_zcell = NULL;<br />+    ZXDH_SE_ZBLK_CFG *p_zblk = NULL;<br />+<br />+    uint32_t zblk_idx = 0;<br />+    uint32_t pre_zblk_idx = 0xFFFFFFFF;<br />+    uint16_t crc16_value = 0;<br />+    uint32_t zcell_id = 0;<br />+    uint32_t item_idx = 0;<br />+    uint32_t element_id = 0;<br />+    uint32_t byte_offset = 0;<br />+    uint32_t addr = 0;<br />+    uint32_t i    = 0;<br />+    uint8_t srh_succ     = 0;<br />+    uint8_t temp_key[ZXDH_HASH_KEY_MAX] = {0};<br />+    uint8_t  rd_buff[ZXDH_SE_ITEM_WIDTH_MAX]   = {0};<br />+<br />+    ZXDH_D_NODE *p_zblk_dn = NULL;<br />+    ZXDH_D_NODE *p_zcell_dn = NULL;<br />+    ZXDH_SE_CFG *p_se_cfg = NULL;<br />+<br />+    memcpy(srh_rbkey.key, p_hash_entry->p_key, p_hash_entry_cfg->key_by_size);<br />+<br />+    p_hash_cfg = p_hash_entry_cfg->p_hash_cfg;<br />+    ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_hash_cfg);<br />+<br />+    p_se_cfg = p_hash_entry_cfg->p_se_cfg;<br />+    ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_se_cfg);<br />+<br />+    zxdh_np_hash_set_crc_key(p_hash_entry_cfg, p_hash_entry, temp_key);<br />+<br />+    p_zcell_dn = p_hash_cfg->hash_shareram.zcell_free_list.p_next;<br />+<br />+    while (p_zcell_dn) {<br />+        p_zcell = (ZXDH_SE_ZCELL_CFG *)p_zcell_dn->data;<br />+        zblk_idx = GET_ZBLK_IDX(p_zcell->zcell_idx);<br />+        p_zblk = &p_se_cfg->zblk_info[zblk_idx];<br />+<br />+        if (zblk_idx != pre_zblk_idx) {<br />+            pre_zblk_idx = zblk_idx;<br />+            crc16_value = p_hash_cfg->p_hash16_fun(temp_key,<br />+                p_hash_entry_cfg->key_by_size, p_zblk->hash_arg);<br />+        }<br />+<br />+        zcell_id = GET_ZCELL_IDX(p_zcell->zcell_idx);<br />+        item_idx = GET_ZCELL_CRC_VAL(zcell_id, crc16_value);<br />+        addr = ZXDH_ZBLK_ITEM_ADDR_CALC(p_zcell->zcell_idx, item_idx);<br />+<br />+        rc =  zxdh_np_dtb_se_zcam_dma_dump(dev_id,<br />+                                       queue_id,<br />+                                       addr,<br />+                                       ZXDH_DTB_DUMP_ZCAM_512b,<br />+                                       1,<br />+                                       (uint32_t *)rd_buff,<br />+                                       &element_id);<br />+        ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_se_zcam_dma_dump");<br />+<br />+        zxdh_np_comm_swap(rd_buff, sizeof(rd_buff));<br />+<br />+        rc = zxdh_np_dtb_hash_data_parse(ZXDH_ITEM_RAM, p_hash_entry_cfg->key_by_size,<br />+            p_hash_entry, rd_buff, &byte_offset);<br />+        if (rc == ZXDH_OK) {<br />+            PMD_DRV_LOG(DEBUG, "Hash search hardware succ in zcell.");<br />+            srh_succ = 1;<br />+            p_hash_cfg->hash_stat.search_ok++;<br />+            break;<br />+        }<br />+<br />+        p_zcell_dn = p_zcell_dn->next;<br />+    }<br />+<br />+    if (srh_succ == 0) {<br />+        p_zblk_dn = p_hash_cfg->hash_shareram.zblk_list.p_next;<br />+        while (p_zblk_dn) {<br />+            p_zblk = (ZXDH_SE_ZBLK_CFG *)p_zblk_dn->data;<br />+            zblk_idx = p_zblk->zblk_idx;<br />+<br />+            for (i = 0; i < ZXDH_SE_ZREG_NUM; i++) {<br />+                item_idx = i;<br />+                addr = ZXDH_ZBLK_HASH_LIST_REG_ADDR_CALC(zblk_idx, item_idx);<br />+                rc =  zxdh_np_dtb_se_zcam_dma_dump(dev_id,<br />+                                       queue_id,<br />+                                       addr,<br />+                                       ZXDH_DTB_DUMP_ZCAM_512b,<br />+                                       1,<br />+                                       (uint32_t *)rd_buff,<br />+                                       &element_id);<br />+                ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_se_zcam_dma_dump");<br />+                zxdh_np_comm_swap(rd_buff, sizeof(rd_buff));<br />+<br />+                rc = zxdh_np_dtb_hash_data_parse(ZXDH_ITEM_RAM,<br />+                    p_hash_entry_cfg->key_by_size, p_hash_entry,<br />+                    rd_buff, &byte_offset);<br />+                if (rc == ZXDH_OK) {<br />+                    PMD_DRV_LOG(DEBUG, "Hash search hardware succ in zreg.");<br />+                    srh_succ = 1;<br />+                    p_hash_cfg->hash_stat.search_ok++;<br />+                    break;<br />+                }<br />+            }<br />+            p_zblk_dn = p_zblk_dn->next;<br />+        }<br />+    }<br />+<br />+    if (srh_succ) {<br />+        memset(rd_buff + byte_offset, 0,<br />+            ZXDH_GET_HASH_ENTRY_SIZE(p_hash_entry_cfg->key_type));<br />+        zxdh_np_comm_swap(rd_buff, sizeof(rd_buff));<br />+        rc = zxdh_np_dtb_se_alg_zcam_data_write(dev_id,<br />+                                       addr,<br />+                                       rd_buff,<br />+                                       p_entry);<br />+        ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_se_alg_zcam_data_write");<br />+        p_hash_cfg->hash_stat.delete_ok++;<br />+    }<br />+<br />+    *p_srh_succ = srh_succ;<br />+<br />+    return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_hash_zcam_del_hw(uint32_t dev_id,<br />+                        uint32_t queue_id,<br />+                        uint32_t sdt_no,<br />+                        uint32_t entry_num,<br />+                        ZXDH_DTB_HASH_ENTRY_INFO_T *p_arr_hash_entry,<br />+                        uint32_t *element_id)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+    uint32_t item_cnt = 0;<br />+    uint32_t key_valid = 1;<br />+    uint32_t dtb_len = 0;<br />+    uint8_t srh_succ = 0;<br />+    uint8_t key[ZXDH_HASH_KEY_MAX] = {0};<br />+    uint8_t rst[ZXDH_HASH_RST_MAX] = {0};<br />+    uint8_t entry_cmd[ZXDH_DTB_TABLE_CMD_SIZE_BIT / 8] = {0};<br />+<br />+    uint8_t entry_data[ZXDH_ETCAM_WIDTH_MAX / 8] = {0};<br />+    uint8_t *p_data_buff = NULL;<br />+<br />+    ZXDH_HASH_ENTRY  entry = {0};<br />+    ZXDH_DTB_ENTRY_T   dtb_one_entry = {0};<br />+    HASH_ENTRY_CFG  hash_entry_cfg = {0};<br />+<br />+    dtb_one_entry.cmd = entry_cmd;<br />+    dtb_one_entry.data = entry_data;<br />+    entry.p_key = key;<br />+    entry.p_rst = rst;<br />+<br />+    rc = zxdh_np_hash_get_hash_info_from_sdt(dev_id, sdt_no, &hash_entry_cfg);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_hash_get_hash_info_from_sdt");<br />+<br />+    p_data_buff = rte_zmalloc(NULL, ZXDH_DTB_TABLE_DATA_BUFF_SIZE, 0);<br />+    if (p_data_buff == NULL) {<br />+        PMD_DRV_LOG(ERR, "malloc memory failed");<br />+        return ZXDH_PAR_CHK_POINT_NULL;<br />+    }<br />+<br />+    for (item_cnt = 0; item_cnt < entry_num; ++item_cnt) {<br />+        srh_succ = 0;<br />+        memset(key, 0, sizeof(key));<br />+        memset(rst, 0, sizeof(rst));<br />+        memset(entry_cmd, 0, sizeof(entry_cmd));<br />+        memset(entry_data, 0, sizeof(entry_data));<br />+        entry.p_key[0] = (uint8_t)(((key_valid & 0x1) << 7)<br />+                            | ((hash_entry_cfg.key_type & 0x3) << 5)<br />+                            | (hash_entry_cfg.table_id & 0x1f));<br />+        memcpy(&entry.p_key[1], p_arr_hash_entry[item_cnt].p_actu_key,<br />+            hash_entry_cfg.actu_key_size);<br />+<br />+        rc = zxdh_np_dtb_hash_zcam_del_one_hw(dev_id,<br />+                                        queue_id,<br />+                                        &hash_entry_cfg,<br />+                                        &entry,<br />+                                        &dtb_one_entry,<br />+                                        &srh_succ);<br />+<br />+        if (srh_succ) {<br />+            zxdh_np_dtb_data_write(p_data_buff, 0, &dtb_one_entry);<br />+            dtb_len = dtb_one_entry.data_size / ZXDH_DTB_LEN_POS_SETP + 1;<br />+            zxdh_np_dtb_write_down_table_data(dev_id, queue_id,<br />+                dtb_len * ZXDH_DTB_LEN_POS_SETP, p_data_buff, element_id);<br />+            rc = zxdh_np_dtb_tab_down_success_status_check(dev_id,<br />+                        queue_id, *element_id);<br />+        }<br />+    }<br />+<br />+    rte_free(p_data_buff);<br />+<br />+    return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_sdt_hash_zcam_mono_space_dump(uint32_t dev_id,<br />+                            uint32_t queue_id,<br />+                            uint32_t sdt_no,<br />+                            HASH_ENTRY_CFG *p_hash_entry_cfg,<br />+                            uint8_t  *p_data,<br />+                            uint32_t *p_dump_len)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+<br />+    uint32_t i = 0;<br />+    uint32_t zblock_id = 0;<br />+    uint32_t zcell_id   = 0;<br />+    uint32_t start_addr  = 0;<br />+    uint32_t dtb_desc_len = 0;<br />+    uint32_t dump_pa_h   = 0;<br />+    uint32_t dump_pa_l   = 0;<br />+    uint32_t dma_addr_offset = 0;<br />+    uint32_t desc_addr_offset = 0;<br />+    uint32_t element_id  = 0;<br />+    uint8_t  *p_dump_desc_buf = NULL;<br />+<br />+    ZXDH_D_NODE *p_zblk_dn = NULL;<br />+    ZXDH_SE_ZBLK_CFG *p_zblk = NULL;<br />+    ZXDH_SE_ZREG_CFG *p_zreg = NULL;<br />+    ZXDH_SE_ZCELL_CFG *p_zcell = NULL;<br />+    ZXDH_HASH_CFG *p_hash_cfg = NULL;<br />+<br />+    ZXDH_DTB_ENTRY_T   dtb_dump_entry = {0};<br />+    uint8_t cmd_buff[ZXDH_DTB_TABLE_CMD_SIZE_BIT / 8] = {0};<br />+<br />+    rc = zxdh_np_dtb_dump_addr_set(dev_id, queue_id, sdt_no, &element_id);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_dump_addr_set");<br />+<br />+    p_dump_desc_buf = rte_zmalloc(NULL, ZXDH_DTB_TABLE_DUMP_INFO_BUFF_SIZE, 0);<br />+    if (p_dump_desc_buf == NULL) {<br />+        PMD_DRV_LOG(ERR, "malloc memory failed");<br />+        return ZXDH_PAR_CHK_POINT_NULL;<br />+    }<br />+    dtb_dump_entry.cmd = cmd_buff;<br />+<br />+    p_hash_cfg = p_hash_entry_cfg->p_hash_cfg;<br />+    p_zblk_dn = p_hash_cfg->hash_shareram.zblk_list.p_next;<br />+<br />+    while (p_zblk_dn) {<br />+        p_zblk = (ZXDH_SE_ZBLK_CFG *)p_zblk_dn->data;<br />+        zblock_id = p_zblk->zblk_idx;<br />+<br />+        for (i = 0; i < ZXDH_SE_ZCELL_NUM; i++) {<br />+            p_zcell = &p_zblk->zcell_info[i];<br />+<br />+            if ((p_zcell->flag & ZXDH_ZCELL_FLAG_IS_MONO) && <br />+            p_zcell->bulk_id == p_hash_entry_cfg->bulk_id) {<br />+                zcell_id = p_zcell->zcell_idx;<br />+<br />+                start_addr = ZXDH_ZBLK_ITEM_ADDR_CALC(zcell_id, 0);<br />+<br />+                zxdh_np_dtb_tab_up_item_offset_addr_get(dev_id,<br />+                        queue_id,<br />+                        element_id,<br />+                        dma_addr_offset,<br />+                        &dump_pa_h,<br />+                        &dump_pa_l);<br />+<br />+                zxdh_np_dtb_zcam_dump_entry(dev_id, start_addr,<br />+                ZXDH_DTB_DUMP_ZCAM_512b, ZXDH_SE_RAM_DEPTH,<br />+                dump_pa_h, dump_pa_l, &dtb_dump_entry);<br />+<br />+                zxdh_np_dtb_data_write(p_dump_desc_buf, desc_addr_offset,<br />+                    &dtb_dump_entry);<br />+<br />+                dtb_desc_len++;<br />+                dma_addr_offset += ZXDH_SE_RAM_DEPTH * 512 / 8;<br />+                desc_addr_offset += ZXDH_DTB_LEN_POS_SETP;<br />+<br />+                PMD_DRV_LOG(DEBUG, "the Zblock[%u]'s bulk_id:%u Mono Zcell_id :%u",<br />+                    zblock_id, p_hash_entry_cfg->bulk_id, zcell_id);<br />+            }<br />+        }<br />+<br />+        for (i = 0; i < ZXDH_SE_ZREG_NUM; i++) {<br />+            p_zreg = &p_zblk->zreg_info[i];<br />+<br />+            if ((p_zreg->flag & ZXDH_ZREG_FLAG_IS_MONO) && <br />+            p_zreg->bulk_id == p_hash_entry_cfg->bulk_id) {<br />+                start_addr = ZXDH_ZBLK_HASH_LIST_REG_ADDR_CALC(zblock_id, i);<br />+<br />+                zxdh_np_dtb_tab_up_item_offset_addr_get(dev_id,<br />+                        queue_id,<br />+                        element_id,<br />+                        dma_addr_offset,<br />+                        &dump_pa_h,<br />+                        &dump_pa_l);<br />+<br />+                zxdh_np_dtb_zcam_dump_entry(dev_id, start_addr,<br />+                ZXDH_DTB_DUMP_ZCAM_512b, 1, dump_pa_h, dump_pa_l, &dtb_dump_entry);<br />+<br />+                zxdh_np_dtb_data_write(p_dump_desc_buf, desc_addr_offset,<br />+                    &dtb_dump_entry);<br />+<br />+                dtb_desc_len++;<br />+                dma_addr_offset += 512 / 8;<br />+                desc_addr_offset += ZXDH_DTB_LEN_POS_SETP;<br />+<br />+                PMD_DRV_LOG(DEBUG, "the Zblock[%u]'s bulk_id:%u  Mono Zreg_id :%u",<br />+                    zblock_id, p_zreg->bulk_id, i);<br />+            }<br />+        }<br />+<br />+        p_zblk_dn = p_zblk_dn->next;<br />+    }<br />+<br />+    zxdh_np_dtb_write_dump_desc_info(dev_id,<br />+                    queue_id,<br />+                    element_id,<br />+                    (uint32_t *)p_dump_desc_buf,<br />+                    dma_addr_offset / 4,<br />+                    dtb_desc_len * 4,<br />+                    (uint32_t *)p_data);<br />+<br />+    zxdh_np_comm_swap(p_data, dma_addr_offset);<br />+    rte_free(p_dump_desc_buf);<br />+<br />+    *p_dump_len = dma_addr_offset;<br />+<br />+    return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_hash_table_zcam_dump(uint32_t dev_id,<br />+    uint32_t queue_id,<br />+    uint32_t sdt_no,<br />+    uint32_t zblock_num,<br />+    uint32_t zblock_array[ZXDH_SE_ZBLK_NUM],<br />+    uint8_t  *p_data,<br />+    uint32_t *p_dump_len)<br />+{<br />+    uint32_t  rc          = ZXDH_OK;<br />+    uint32_t zblk_idx     = 0;<br />+    uint32_t index        = 0;<br />+    uint32_t zblock_id   = 0;<br />+    uint32_t zcell_id   = 0;<br />+    uint32_t start_addr  = 0;<br />+    uint32_t dtb_desc_len = 0;<br />+    uint32_t dump_pa_h   = 0;<br />+    uint32_t dump_pa_l   = 0;<br />+    uint32_t dma_addr_offset = 0;<br />+    uint32_t desc_addr_offset = 0;<br />+    uint32_t element_id  = 0;<br />+    uint8_t  *p_dump_desc_buf = NULL;<br />+<br />+    ZXDH_DTB_ENTRY_T   dtb_dump_entry = {0};<br />+    uint8_t cmd_buff[ZXDH_DTB_TABLE_CMD_SIZE_BIT / 8] = {0};<br />+<br />+    rc = zxdh_np_dtb_dump_addr_set(dev_id, queue_id, sdt_no, &element_id);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_dump_addr_set");<br />+<br />+    p_dump_desc_buf = rte_zmalloc(NULL, ZXDH_DTB_TABLE_DUMP_INFO_BUFF_SIZE, 0);<br />+    if (p_dump_desc_buf == NULL) {<br />+        PMD_DRV_LOG(ERR, "malloc memory failed");<br />+        return ZXDH_PAR_CHK_POINT_NULL;<br />+    }<br />+<br />+    dtb_dump_entry.cmd = cmd_buff;<br />+    for (zblk_idx = 0; zblk_idx < zblock_num; zblk_idx++) {<br />+        zblock_id = zblock_array[zblk_idx];<br />+        for (index = 0; index < ZXDH_SE_ZCELL_NUM; index++) {<br />+            zcell_id = zblock_id * ZXDH_SE_ZCELL_NUM + index;<br />+            start_addr = ZXDH_ZBLK_ITEM_ADDR_CALC(zcell_id, 0);<br />+<br />+            zxdh_np_dtb_tab_up_item_offset_addr_get(dev_id,<br />+                    queue_id,<br />+                    element_id,<br />+                    dma_addr_offset,<br />+                    &dump_pa_h,<br />+                    &dump_pa_l);<br />+<br />+            zxdh_np_dtb_zcam_dump_entry(dev_id, start_addr,<br />+            ZXDH_DTB_DUMP_ZCAM_512b, ZXDH_SE_RAM_DEPTH,<br />+            dump_pa_h, dump_pa_l, &dtb_dump_entry);<br />+<br />+            zxdh_np_dtb_data_write(p_dump_desc_buf,<br />+                desc_addr_offset, &dtb_dump_entry);<br />+<br />+            dtb_desc_len++;<br />+            dma_addr_offset += ZXDH_SE_RAM_DEPTH * 512 / 8;<br />+            desc_addr_offset += ZXDH_DTB_LEN_POS_SETP;<br />+        }<br />+<br />+        zxdh_np_dtb_tab_up_item_offset_addr_get(dev_id,<br />+                queue_id,<br />+                element_id,<br />+                dma_addr_offset,<br />+                &dump_pa_h,<br />+                &dump_pa_l);<br />+<br />+        start_addr = ZXDH_ZBLK_HASH_LIST_REG_ADDR_CALC(zblock_id, 0);<br />+        zxdh_np_dtb_zcam_dump_entry(dev_id, start_addr, ZXDH_DTB_DUMP_ZCAM_512b,<br />+            ZXDH_SE_ZREG_NUM, dump_pa_h, dump_pa_l, &dtb_dump_entry);<br />+<br />+        zxdh_np_dtb_data_write(p_dump_desc_buf, desc_addr_offset, &dtb_dump_entry);<br />+<br />+        dtb_desc_len++;<br />+        dma_addr_offset += ZXDH_SE_ZREG_NUM * 512 / 8;<br />+        desc_addr_offset += ZXDH_DTB_LEN_POS_SETP;<br />+    }<br />+<br />+    zxdh_np_dtb_write_dump_desc_info(dev_id,<br />+                    queue_id,<br />+                    element_id,<br />+                    (uint32_t *)p_dump_desc_buf,<br />+                    dma_addr_offset / 4,<br />+                    dtb_desc_len * 4,<br />+                    (uint32_t *)p_data);<br />+<br />+    zxdh_np_comm_swap(p_data, dma_addr_offset);<br />+    rte_free(p_dump_desc_buf);<br />+<br />+    *p_dump_len = dma_addr_offset;<br />+<br />+    return rc;<br />+}<br />+<br />+static void<br />+zxdh_np_dtb_dump_hash_parse(HASH_ENTRY_CFG *p_hash_entry_cfg,<br />+                            uint32_t item_type,<br />+                            uint8_t *pdata,<br />+                            uint32_t dump_len,<br />+                            uint8_t *p_outdata,<br />+                            uint32_t *p_item_num)<br />+{<br />+    uint32_t item_num = 0;<br />+    uint32_t data_offset = 0;<br />+    uint32_t index = 0;<br />+    uint8_t temp_key_valid = 0;<br />+    uint8_t temp_key_type = 0;<br />+    uint8_t temp_tbl_id   = 0;<br />+    uint32_t srh_entry_size = 0;<br />+    uint32_t item_width = ZXDH_SE_ITEM_WIDTH_MAX;<br />+    uint8_t *p_temp_key = NULL;<br />+    uint8_t *p_hash_item = NULL;<br />+    ZXDH_DTB_HASH_ENTRY_INFO_T  *p_dtb_hash_entry = NULL;<br />+    ZXDH_DTB_HASH_ENTRY_INFO_T  *p_temp_entry = NULL;<br />+<br />+    if (item_type == ZXDH_ITEM_DDR_256)<br />+        item_width = item_width / 2;<br />+<br />+    p_dtb_hash_entry = (ZXDH_DTB_HASH_ENTRY_INFO_T *)p_outdata;<br />+    srh_entry_size = ZXDH_GET_HASH_ENTRY_SIZE(p_hash_entry_cfg->key_type);<br />+<br />+    for (index = 0; index < (dump_len / item_width); index++) {<br />+        data_offset = 0;<br />+        p_hash_item = pdata + index * item_width;<br />+        while (data_offset < item_width) {<br />+            p_temp_key = p_hash_item + data_offset;<br />+            temp_key_valid = ZXDH_GET_HASH_KEY_VALID(p_temp_key);<br />+            temp_key_type = ZXDH_GET_HASH_KEY_TYPE(p_temp_key);<br />+            temp_tbl_id = ZXDH_GET_HASH_TBL_ID(p_temp_key);<br />+            p_temp_entry = p_dtb_hash_entry + item_num;<br />+<br />+            if (temp_key_valid && temp_key_type == p_hash_entry_cfg->key_type && <br />+            temp_tbl_id == p_hash_entry_cfg->table_id) {<br />+                memcpy(p_temp_entry->p_actu_key, p_temp_key + 1,<br />+                    p_hash_entry_cfg->actu_key_size);<br />+                memcpy(p_temp_entry->p_rst,<br />+                    p_temp_key + p_hash_entry_cfg->key_by_size,<br />+                    p_hash_entry_cfg->rst_by_size);<br />+                item_num++;<br />+            }<br />+<br />+            data_offset += srh_entry_size;<br />+        }<br />+    }<br />+<br />+    *p_item_num = item_num;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_hash_table_dump(uint32_t dev_id,<br />+                        uint32_t queue_id,<br />+                        uint32_t sdt_no,<br />+                        ZXDH_DTB_DUMP_INDEX_T start_index,<br />+                        uint8_t *p_dump_data,<br />+                        uint32_t *p_entry_num,<br />+                        ZXDH_DTB_DUMP_INDEX_T *next_start_index,<br />+                        uint32_t *finish_flag)<br />+{<br />+    uint32_t  rc = ZXDH_OK;<br />+    uint8_t *p_data = NULL;<br />+    uint32_t data_len = 0;<br />+    uint32_t entry_num = 0;<br />+    ZXDH_HASH_CFG *p_hash_cfg = NULL;<br />+    HASH_ENTRY_CFG  hash_entry_cfg = {0};<br />+<br />+    rc = zxdh_np_hash_get_hash_info_from_sdt(dev_id, sdt_no, &hash_entry_cfg);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_hash_get_hash_info_from_sdt");<br />+<br />+    p_hash_cfg = hash_entry_cfg.p_hash_cfg;<br />+    ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_hash_cfg);<br />+<br />+    p_data = rte_zmalloc(NULL, ZXDH_DTB_DMUP_DATA_MAX, 0);<br />+    if (p_data == NULL) {<br />+        PMD_DRV_LOG(ERR, "malloc memory failed");<br />+        return ZXDH_PAR_CHK_POINT_NULL;<br />+    }<br />+<br />+    if (start_index.index_type == ZXDH_DTB_DUMP_ZCAM_TYPE) {<br />+        if (p_hash_cfg->bulk_ram_mono[hash_entry_cfg.bulk_id]) {<br />+            rc = zxdh_np_dtb_sdt_hash_zcam_mono_space_dump(dev_id,<br />+                    queue_id,<br />+                    sdt_no,<br />+                    &hash_entry_cfg,<br />+                    p_data,<br />+                    &data_len);<br />+        } else {<br />+            rc = zxdh_np_dtb_hash_table_zcam_dump(dev_id,<br />+                        queue_id,<br />+                        sdt_no,<br />+                        p_hash_cfg->hash_stat.zblock_num,<br />+                        p_hash_cfg->hash_stat.zblock_array,<br />+                        p_data,<br />+                        &data_len);<br />+        }<br />+<br />+        zxdh_np_dtb_dump_hash_parse(&hash_entry_cfg,<br />+                                     ZXDH_ITEM_RAM,<br />+                                     p_data,<br />+                                     data_len,<br />+                                     p_dump_data,<br />+                                     &entry_num);<br />+<br />+        if (p_hash_cfg->ddr_valid) {<br />+            next_start_index->index = 0;<br />+            next_start_index->index_type = ZXDH_DTB_DUMP_DDR_TYPE;<br />+        } else {<br />+            *finish_flag = 1;<br />+        }<br />+        *p_entry_num = entry_num;<br />+    }<br />+<br />+    rte_free(p_data);<br />+    return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_hash_offline_zcam_delete(uint32_t dev_id,<br />+                                uint32_t queue_id,<br />+                                uint32_t sdt_no)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+    uint32_t entry_num = 0;<br />+    uint32_t finish_flag = 0;<br />+    uint32_t index = 0;<br />+    uint32_t max_item_num = 1024 * 1024;<br />+    uint8_t *p_dump_data = NULL;<br />+    uint8_t *p_key = NULL;<br />+    uint8_t *p_rst = NULL;<br />+    uint32_t element_id = 0;<br />+<br />+    ZXDH_DTB_HASH_ENTRY_INFO_T *p_dtb_hash_entry = NULL;<br />+    ZXDH_DTB_HASH_ENTRY_INFO_T *p_temp_entry = NULL;<br />+    ZXDH_DTB_DUMP_INDEX_T start_index = {0};<br />+    ZXDH_DTB_DUMP_INDEX_T next_start_index = {0};<br />+<br />+    ZXDH_SDT_TBL_HASH_T sdt_hash = {0};<br />+    start_index.index = 0;<br />+    start_index.index_type = ZXDH_DTB_DUMP_ZCAM_TYPE;<br />+<br />+    PMD_DRV_LOG(DEBUG, "sdt_no:%u", sdt_no);<br />+    rc = zxdh_np_soft_sdt_tbl_get(dev_id, sdt_no, &sdt_hash);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_soft_sdt_tbl_get");<br />+<br />+    p_dump_data = rte_zmalloc(NULL, max_item_num * sizeof(ZXDH_DTB_HASH_ENTRY_INFO_T), 0);<br />+    if (p_dump_data == NULL) {<br />+        PMD_DRV_LOG(ERR, "malloc memory failed");<br />+        return ZXDH_PAR_CHK_POINT_NULL;<br />+    }<br />+    p_key = rte_zmalloc(NULL, max_item_num * ZXDH_HASH_KEY_MAX, 0);<br />+    if (p_key == NULL) {<br />+        PMD_DRV_LOG(ERR, "malloc memory failed");<br />+        rte_free(p_dump_data);<br />+        return ZXDH_PAR_CHK_POINT_NULL;<br />+    }<br />+    p_rst = rte_zmalloc(NULL, max_item_num * ZXDH_HASH_RST_MAX, 0);<br />+    if (p_key == NULL) {<br />+        PMD_DRV_LOG(ERR, "malloc memory failed");<br />+        rte_free(p_dump_data);<br />+        rte_free(p_key);<br />+        return ZXDH_PAR_CHK_POINT_NULL;<br />+    }<br />+<br />+    p_dtb_hash_entry = (ZXDH_DTB_HASH_ENTRY_INFO_T *)p_dump_data;<br />+    for (index = 0; index < max_item_num; index++) {<br />+        p_temp_entry = p_dtb_hash_entry + index;<br />+        p_temp_entry->p_actu_key = p_key + index * ZXDH_HASH_KEY_MAX;<br />+        p_temp_entry->p_rst = p_rst + index * ZXDH_HASH_RST_MAX;<br />+    }<br />+<br />+    rc = zxdh_np_dtb_hash_table_dump(dev_id, queue_id, sdt_no, start_index,<br />+        p_dump_data, &entry_num, &next_start_index, &finish_flag);<br />+<br />+    if (entry_num) {<br />+        rc = zxdh_np_dtb_hash_zcam_del_hw(dev_id, queue_id, sdt_no,<br />+            entry_num, p_dtb_hash_entry, &element_id);<br />+    }<br />+<br />+    rte_free(p_dtb_hash_entry);<br />+    rte_free(p_key);<br />+    rte_free(p_rst);<br />+<br />+    return rc;<br />+}<br />+<br />+uint32_t<br />+zxdh_np_dtb_hash_online_delete(uint32_t dev_id, uint32_t queue_id, uint32_t sdt_no)<br />+{<br />+    uint32_t rc = 0;<br />+    uint8_t key_valid = 0;<br />+    uint32_t table_id = 0;<br />+    uint32_t key_type = 0;<br />+<br />+    ZXDH_D_NODE *p_node = NULL;<br />+    ZXDH_RB_TN *p_rb_tn = NULL;<br />+    ZXDH_D_HEAD *p_head_hash_rb = NULL;<br />+    ZXDH_HASH_CFG *p_hash_cfg = NULL;<br />+    ZXDH_HASH_RBKEY_INFO *p_rbkey = NULL;<br />+    HASH_ENTRY_CFG  hash_entry_cfg = {0};<br />+    ZXDH_DTB_USER_ENTRY_T del_entry = {0};<br />+    ZXDH_DTB_HASH_ENTRY_INFO_T hash_entry = {0};<br />+<br />+    del_entry.sdt_no = sdt_no;<br />+    del_entry.p_entry_data = &hash_entry;<br />+<br />+    rc = zxdh_np_hash_get_hash_info_from_sdt(dev_id, sdt_no, &hash_entry_cfg);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_hash_get_hash_info_from_sdt");<br />+<br />+    p_hash_cfg = hash_entry_cfg.p_hash_cfg;<br />+    ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_hash_cfg);<br />+<br />+    p_head_hash_rb = &p_hash_cfg->hash_rb.tn_list;<br />+    p_node = p_head_hash_rb->p_next;<br />+    while (p_node) {<br />+        p_rb_tn = (ZXDH_RB_TN *)p_node->data;<br />+        ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_rb_tn);<br />+        p_rbkey = (ZXDH_HASH_RBKEY_INFO *)p_rb_tn->p_key;<br />+        hash_entry.p_actu_key = p_rbkey->key + 1;<br />+        hash_entry.p_rst = p_rbkey->key;<br />+<br />+        key_valid = ZXDH_GET_HASH_KEY_VALID(p_rbkey->key);<br />+        table_id = ZXDH_GET_HASH_TBL_ID(p_rbkey->key);<br />+        key_type = ZXDH_GET_HASH_KEY_TYPE(p_rbkey->key);<br />+        if (!key_valid ||<br />+        table_id != hash_entry_cfg.table_id ||<br />+        key_type != hash_entry_cfg.key_type) {<br />+            p_node = p_node->next;<br />+            continue;<br />+        }<br />+        p_node = p_node->next;<br />+<br />+        rc = zxdh_np_dtb_table_entry_delete(dev_id, queue_id, 1, &del_entry);<br />+        if (rc == ZXDH_HASH_RC_DEL_SRHFAIL)<br />+            continue;<br />+        ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_table_entry_delete");<br />+    }<br />+<br />+    return rc;<br />+}<br />+<br />+uint32_t<br />+zxdh_np_dtb_hash_offline_delete(uint32_t dev_id,<br />+                uint32_t queue_id,<br />+                uint32_t sdt_no,<br />+                __rte_unused uint32_t flush_mode)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+<br />+    rc = zxdh_np_dtb_hash_offline_zcam_delete(dev_id, queue_id, sdt_no);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_hash_offline_zcam_delete");<br />+<br />+    return rc;<br />+}<br />+<br /> static uint32_t<br /> zxdh_np_se_done_status_check(uint32_t dev_id, uint32_t reg_no, uint32_t pos)<br /> {<br />diff --git a/drivers/net/zxdh/zxdh_np.h b/drivers/net/zxdh/zxdh_np.h<br />index 3b66cf0b9f..aedc34b193 100644<br />--- a/drivers/net/zxdh/zxdh_np.h<br />+++ b/drivers/net/zxdh/zxdh_np.h<br />@@ -1879,6 +1879,11 @@ typedef struct __rte_aligned(2) zxdh_se_stat_cfg_t {<br />     uint32_t ppu_ddr_offset;<br /> } ZXDH_NP_SE_STAT_CFG_T;<br />  <br />+typedef struct zxdh_dtb_dump_index_t {<br />+    uint32_t index;<br />+    uint32_t index_type;<br />+} ZXDH_DTB_DUMP_INDEX_T;<br />+<br /> int zxdh_np_host_init(uint32_t dev_id, ZXDH_DEV_INIT_CTRL_T *p_dev_init_ctrl);<br /> int zxdh_np_online_uninit(uint32_t dev_id, char *port_name, uint32_t queue_id);<br /> int zxdh_np_dtb_table_entry_write(uint32_t dev_id, uint32_t queue_id,<br />@@ -1915,5 +1920,10 @@ uint32_t zxdh_np_stat_car_queue_cfg_set(uint32_t dev_id,<br />             uint32_t plcr_en,<br />             uint32_t profile_id);<br /> uint32_t zxdh_np_se_res_get_and_init(uint32_t dev_id, uint32_t type);<br />+uint32_t zxdh_np_dtb_hash_online_delete(uint32_t dev_id, uint32_t queue_id, uint32_t sdt_no);<br />+uint32_t zxdh_np_dtb_hash_offline_delete(uint32_t dev_id,<br />+                        uint32_t queue_id,<br />+                        uint32_t sdt_no,<br />+                        __rte_unused uint32_t flush_mode);<br />  <br /> #endif /* ZXDH_NP_H */<br />--  <br />2.27.0<br />