Implement hash table entries all delete operation by dtb channel. Signed-off-by: Bingbin Chen --- 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