Implement hash tables get operation by dtb channel.<br /> <br />Signed-off-by: Bingbin Chen <chen.bingbin@zte.com.cn> <br />---<br /> drivers/net/zxdh/zxdh_np.c | 482 ++++++++++++++++++++++++++++++++++++-<br /> drivers/net/zxdh/zxdh_np.h | 7 +<br /> 2 files changed, 488 insertions(+), 1 deletion(-)<br /> <br />diff --git a/drivers/net/zxdh/zxdh_np.c b/drivers/net/zxdh/zxdh_np.c<br />index 67edf581e2..fb61e0f99c 100644<br />--- a/drivers/net/zxdh/zxdh_np.c<br />+++ b/drivers/net/zxdh/zxdh_np.c<br />@@ -1371,6 +1371,40 @@ zxdh_comm_rb_insert(ZXDH_RB_CFG *p_rb_cfg,<br /> return ZXDH_OK;<br /> }<br /> <br />+static uint32_t<br />+zxdh_comm_rb_search(ZXDH_RB_CFG *p_rb_cfg,<br />+ void *p_key,<br />+ void *out_val)<br />+{<br />+ int32_t cmprtn = 0;<br />+ ZXDH_RB_TN *p_cur_tn = NULL;<br />+<br />+ p_cur_tn = p_rb_cfg->p_root;<br />+<br />+ while (p_cur_tn) {<br />+ cmprtn = p_rb_cfg->p_cmpfun(p_key, p_cur_tn->p_key, p_rb_cfg->key_size);<br />+<br />+ if (cmprtn > 0)<br />+ p_cur_tn = p_cur_tn->p_right;<br />+ else if (cmprtn < 0)<br />+ p_cur_tn = p_cur_tn->p_left;<br />+ else<br />+ break;<br />+ }<br />+<br />+ if (!p_cur_tn) {<br />+ PMD_DRV_LOG(DEBUG, "rb srh fail");<br />+ return ZXDH_RBT_RC_SRHFAIL;<br />+ }<br />+<br />+ if (p_rb_cfg->is_dynamic)<br />+ *(ZXDH_RB_TN **)out_val = p_cur_tn;<br />+ else<br />+ *(uint32_t *)out_val = zxdh_np_get_tn_lsv(p_cur_tn);<br />+<br />+ return ZXDH_OK;<br />+}<br />+<br /> static uint32_t<br /> zxdh_comm_rb_handle_del(__rte_unused ZXDH_RB_CFG *p_rb_cfg,<br /> ZXDH_RB_TN ***stack_tn,<br />@@ -4015,6 +4049,38 @@ zxdh_np_dtb_smmu0_dump_info_write(uint32_t dev_id,<br /> return rc;<br /> }<br /> <br />+static uint32_t<br />+zxdh_np_dtb_zcam_dump_info_write(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 />+ uint32_t *p_dump_info)<br />+{<br />+ uint32_t rc = ZXDH_OK;<br />+<br />+ ZXDH_DTB_ZCAM_DUMP_FORM_T dtb_zcam_dump_form_info = {<br />+ .valid = 1,<br />+ .up_type = ZXDH_DTB_DUMP_MODE_ZCAM,<br />+ .tb_width = tb_width,<br />+ .sram_addr = addr & 0x1FF,<br />+ .ram_reg_flag = (addr >> 16) & 0x1,<br />+ .z_reg_cell_id = (addr >> 9) & 0x3,<br />+ .zblock_id = (addr >> 11) & 0x7,<br />+ .zgroup_id = (addr >> 14) & 0x3,<br />+ .tb_depth = depth,<br />+ .tb_dst_addr_h = addr_high32,<br />+ .tb_dst_addr_l = addr_low32,<br />+ };<br />+<br />+ rc = zxdh_np_dtb_write_dump_cmd(dev_id, ZXDH_DTB_DUMP_ZCAM,<br />+ &dtb_zcam_dump_form_info, p_dump_info);<br />+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_write_dump_cmd");<br />+<br />+ return rc;<br />+}<br />+<br /> static uint32_t<br /> zxdh_np_dtb_se_smmu0_ind_write(uint32_t dev_id,<br /> uint32_t base_addr,<br />@@ -6160,6 +6226,399 @@ zxdh_np_dtb_eram_data_get(uint32_t dev_id, uint32_t queue_id, uint32_t sdt_no,<br /> return rc;<br /> }<br /> <br />+static uint32_t<br />+zxdh_np_dtb_se_zcam_dma_dump(uint32_t dev_id,<br />+ uint32_t queue_id,<br />+ uint32_t addr,<br />+ uint32_t tb_width,<br />+ uint32_t depth,<br />+ uint32_t *p_data,<br />+ uint32_t *element_id)<br />+{<br />+ uint32_t rc = ZXDH_OK;<br />+ uint32_t dump_dst_phy_haddr = 0;<br />+ uint32_t dump_dst_phy_laddr = 0;<br />+ uint32_t queue_item_index = 0;<br />+ uint32_t data_len = 0;<br />+ uint32_t desc_len = 0;<br />+ uint32_t tb_width_len = 0;<br />+ uint8_t form_buff[ZXDH_DTB_TABLE_CMD_SIZE_BIT / 8] = {0};<br />+<br />+ rc = zxdh_np_dtb_tab_up_free_item_get(dev_id, queue_id, &queue_item_index);<br />+ if (rc != ZXDH_OK) {<br />+ PMD_DRV_LOG(ERR, "zxdh_np_dtb_tab_up_free_item_get failed!");<br />+ return ZXDH_RC_DTB_QUEUE_ITEM_SW_EMPTY;<br />+ }<br />+<br />+ PMD_DRV_LOG(DEBUG, "table up item queue_element_id is: %u.",<br />+ queue_item_index);<br />+<br />+ *element_id = queue_item_index;<br />+<br />+ rc = zxdh_np_dtb_tab_up_item_addr_get(dev_id, queue_id, queue_item_index,<br />+ &dump_dst_phy_haddr, &dump_dst_phy_laddr);<br />+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_tab_up_item_addr_get");<br />+<br />+ rc = zxdh_np_dtb_zcam_dump_info_write(dev_id,<br />+ addr,<br />+ tb_width,<br />+ depth,<br />+ dump_dst_phy_haddr,<br />+ dump_dst_phy_laddr,<br />+ (uint32_t *)form_buff);<br />+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_zcam_dump_info_write");<br />+<br />+ tb_width_len = ZXDH_DTB_LEN_POS_SETP << tb_width;<br />+ data_len = depth * tb_width_len / 4;<br />+ desc_len = ZXDH_DTB_LEN_POS_SETP / 4;<br />+<br />+ rc = zxdh_np_dtb_write_dump_desc_info(dev_id, queue_id, queue_item_index,<br />+ (uint32_t *)form_buff, data_len, desc_len, p_data);<br />+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_write_dump_desc_info");<br />+<br />+ return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_hash_data_parse(uint32_t item_type,<br />+ uint32_t key_by_size,<br />+ ZXDH_HASH_ENTRY *p_entry,<br />+ uint8_t *p_item_data,<br />+ uint32_t *p_data_offset)<br />+{<br />+ uint32_t data_offset = 0;<br />+ uint8_t temp_key_valid = 0;<br />+ uint8_t temp_key_type = 0;<br />+ uint32_t temp_entry_size = 0;<br />+ uint8_t srh_key_type = 0;<br />+ uint32_t srh_entry_size = 0;<br />+ uint32_t rst_by_size = 0;<br />+ uint8_t srh_succ = 0;<br />+ uint32_t item_width = ZXDH_SE_ITEM_WIDTH_MAX;<br />+ uint8_t *p_srh_key = NULL;<br />+ uint8_t *p_temp_key = NULL;<br />+<br />+ if (item_type == ZXDH_ITEM_DDR_256)<br />+ item_width = item_width / 2;<br />+<br />+ p_temp_key = p_item_data;<br />+ p_srh_key = p_entry->p_key;<br />+ srh_key_type = ZXDH_GET_HASH_KEY_TYPE(p_srh_key);<br />+ srh_entry_size = ZXDH_GET_HASH_ENTRY_SIZE(srh_key_type);<br />+<br />+ while (data_offset < item_width) {<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 />+<br />+ if (temp_key_valid && srh_key_type == temp_key_type) {<br />+ if (memcmp(p_srh_key, p_temp_key, key_by_size) == 0) {<br />+ PMD_DRV_LOG(DEBUG, "Hash search hardware successfully.");<br />+ srh_succ = 1;<br />+ break;<br />+ }<br />+<br />+ data_offset += srh_entry_size;<br />+ } else if (temp_key_valid && (srh_key_type != temp_key_type)) {<br />+ temp_entry_size = ZXDH_GET_HASH_ENTRY_SIZE(temp_key_type);<br />+ data_offset += temp_entry_size;<br />+ } else {<br />+ data_offset += ZXDH_HASH_ENTRY_POS_STEP;<br />+ }<br />+<br />+ p_temp_key = p_item_data;<br />+ p_temp_key += data_offset;<br />+ }<br />+<br />+ if (!srh_succ) {<br />+ PMD_DRV_LOG(DEBUG, "Hash search hardware fail.");<br />+ return ZXDH_HASH_RC_MATCH_ITEM_FAIL;<br />+ }<br />+<br />+ rst_by_size = srh_entry_size - key_by_size;<br />+ memcpy(p_entry->p_rst, p_temp_key + key_by_size,<br />+ (rst_by_size > ZXDH_HASH_RST_MAX) ? ZXDH_HASH_RST_MAX : rst_by_size);<br />+ *p_data_offset = data_offset;<br />+<br />+ return ZXDH_OK;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_hash_zcam_get_hardware(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 />+ uint8_t *p_srh_succ)<br />+{<br />+ uint32_t rc = ZXDH_OK;<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 />+ 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 />+ 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 />+ 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 />+ 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 />+ 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, 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 />+ *p_srh_succ = srh_succ;<br />+<br />+ return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_hash_software_item_check(ZXDH_HASH_ENTRY *p_entry,<br />+ uint32_t key_by_size,<br />+ uint32_t rst_by_size,<br />+ ZXDH_SE_ITEM_CFG *p_item_info)<br />+{<br />+ uint8_t srh_succ = 0;<br />+ uint8_t temp_key_type = 0;<br />+ uint8_t srh_key_type = 0;<br />+ uint32_t dev_id = 0;<br />+ ZXDH_D_NODE *p_entry_dn = NULL;<br />+ ZXDH_HASH_RBKEY_INFO *p_rbkey = NULL;<br />+<br />+ srh_key_type = ZXDH_GET_HASH_KEY_TYPE(p_entry->p_key);<br />+ p_entry_dn = p_item_info->item_list.p_next;<br />+ while (p_entry_dn) {<br />+ p_rbkey = (ZXDH_HASH_RBKEY_INFO *)p_entry_dn->data;<br />+ ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_rbkey);<br />+<br />+ RTE_ASSERT(p_rbkey->p_item_info == p_item_info);<br />+<br />+ temp_key_type = ZXDH_GET_HASH_KEY_TYPE(p_rbkey->key);<br />+<br />+ if (ZXDH_GET_HASH_KEY_VALID(p_rbkey->key) && srh_key_type == temp_key_type) {<br />+ if (memcmp(p_entry->p_key, p_rbkey->key, key_by_size) == 0) {<br />+ srh_succ = 1;<br />+ break;<br />+ }<br />+ }<br />+<br />+ p_entry_dn = p_entry_dn->next;<br />+ }<br />+<br />+ if (p_rbkey == NULL)<br />+ return ZXDH_PAR_CHK_POINT_NULL;<br />+<br />+ if (!srh_succ) {<br />+ PMD_DRV_LOG(DEBUG, "hash search failed!");<br />+ return ZXDH_HASH_RC_MATCH_ITEM_FAIL;<br />+ }<br />+<br />+ memcpy(p_entry->p_rst, p_rbkey->rst,<br />+ (rst_by_size > ZXDH_HASH_RST_MAX) ? ZXDH_HASH_RST_MAX : rst_by_size);<br />+<br />+ return ZXDH_OK;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_hash_get_software(uint32_t dev_id,<br />+ HASH_ENTRY_CFG *p_hash_entry_cfg,<br />+ ZXDH_HASH_ENTRY *p_hash_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_RBKEY_INFO *p_rbkey = NULL;<br />+ ZXDH_RB_TN *p_rb_tn_rtn = NULL;<br />+ ZXDH_SE_ITEM_CFG *p_item = NULL;<br />+ ZXDH_HASH_CFG *p_hash_cfg = NULL;<br />+ ZXDH_SPINLOCK_T *p_hash_spinlock = 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 />+ zxdh_np_dev_hash_opr_spinlock_get(dev_id, p_hash_cfg->fun_id, &p_hash_spinlock);<br />+ rte_spinlock_lock(&p_hash_spinlock->spinlock);<br />+<br />+ rc = zxdh_comm_rb_search(&p_hash_cfg->hash_rb, (void *)&srh_rbkey, (void *)(&p_rb_tn_rtn));<br />+ if (rc == ZXDH_RBT_RC_SRHFAIL) {<br />+ PMD_DRV_LOG(DEBUG, "zxdh_comm_rb_search fail.");<br />+ rte_spinlock_unlock(&p_hash_spinlock->spinlock);<br />+ return ZXDH_OK;<br />+ }<br />+<br />+ p_rbkey = p_rb_tn_rtn->p_key;<br />+ p_item = p_rbkey->p_item_info;<br />+<br />+ rc = zxdh_np_dtb_hash_software_item_check(p_hash_entry,<br />+ p_hash_entry_cfg->key_by_size,<br />+ p_hash_entry_cfg->rst_by_size,<br />+ p_item);<br />+ if (rc == ZXDH_OK) {<br />+ PMD_DRV_LOG(DEBUG, "Hash search software succ.");<br />+ *p_srh_succ = 1;<br />+ p_hash_cfg->hash_stat.search_ok++;<br />+ }<br />+<br />+ rte_spinlock_unlock(&p_hash_spinlock->spinlock);<br />+ return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_hash_zcam_get(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 />+ uint32_t srh_mode,<br />+ uint8_t *p_srh_succ)<br />+{<br />+ uint32_t rc = ZXDH_OK;<br />+<br />+ if (srh_mode == ZXDH_HASH_SRH_MODE_HDW) {<br />+ rc = zxdh_np_dtb_hash_zcam_get_hardware(dev_id, queue_id,<br />+ p_hash_entry_cfg, p_hash_entry, p_srh_succ);<br />+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_hash_zcam_get_hardware");<br />+ } else {<br />+ rc = zxdh_np_dtb_hash_get_software(dev_id, p_hash_entry_cfg,<br />+ p_hash_entry, p_srh_succ);<br />+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_hash_get_software");<br />+ }<br />+<br />+ return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_hash_data_get(uint32_t dev_id,<br />+ uint32_t queue_id,<br />+ uint32_t sdt_no,<br />+ ZXDH_DTB_HASH_ENTRY_INFO_T *p_dtb_hash_entry,<br />+ uint32_t srh_mode)<br />+{<br />+ uint32_t rc = ZXDH_OK;<br />+ uint8_t srh_succ = 0;<br />+ uint8_t key_valid = 1;<br />+ ZXDH_HASH_CFG *p_hash_cfg = NULL;<br />+ HASH_ENTRY_CFG hash_entry_cfg = {0};<br />+ ZXDH_HASH_ENTRY hash_entry = {0};<br />+ uint8_t temp_key[ZXDH_HASH_KEY_MAX] = {0};<br />+ uint8_t temp_rst[ZXDH_HASH_RST_MAX] = {0};<br />+<br />+ PMD_DRV_LOG(DEBUG, "hash get sdt_no:%u", sdt_no);<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 />+ hash_entry.p_key = temp_key;<br />+ hash_entry.p_rst = temp_rst;<br />+ hash_entry.p_key[0] = ZXDH_GET_HASH_KEY_CTRL(key_valid,<br />+ hash_entry_cfg.key_type,<br />+ hash_entry_cfg.table_id);<br />+<br />+ memcpy(&hash_entry.p_key[1], p_dtb_hash_entry->p_actu_key,<br />+ hash_entry_cfg.actu_key_size);<br />+<br />+ if (!srh_succ) {<br />+ rc = zxdh_np_dtb_hash_zcam_get(dev_id, queue_id, &hash_entry_cfg,<br />+ &hash_entry, srh_mode, &srh_succ);<br />+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_hash_zcam_get");<br />+ }<br />+<br />+ if (!srh_succ) {<br />+ p_hash_cfg->hash_stat.search_fail++;<br />+ PMD_DRV_LOG(DEBUG, "Hash search key fail!");<br />+ return ZXDH_HASH_RC_SRH_FAIL;<br />+ }<br />+<br />+ memcpy(p_dtb_hash_entry->p_rst, hash_entry.p_rst,<br />+ 1 << (hash_entry_cfg.rsp_mode + 2));<br />+<br />+ return rc;<br />+}<br />+<br /> int<br /> zxdh_np_dtb_table_entry_get(uint32_t dev_id,<br /> uint32_t queue_id,<br />@@ -6170,10 +6629,12 @@ zxdh_np_dtb_table_entry_get(uint32_t dev_id,<br /> uint32_t tbl_type = 0;<br /> uint32_t rc;<br /> uint32_t sdt_no;<br />+ uint32_t sdt_partner = 0;<br />+ uint32_t valid = 0;<br />+ uint8_t key = 0;<br /> <br /> sdt_no = get_entry->sdt_no;<br /> PMD_DRV_LOG(DEBUG, "sdt_no:%u", sdt_no);<br />- PMD_DRV_LOG(DEBUG, "srh_mode:%u", srh_mode);<br /> <br /> zxdh_np_sdt_tbl_data_get(dev_id, sdt_no, &sdt_tbl);<br /> <br />@@ -6187,6 +6648,25 @@ zxdh_np_dtb_table_entry_get(uint32_t dev_id,<br /> (ZXDH_DTB_ERAM_ENTRY_INFO_T *)get_entry->p_entry_data);<br /> ZXDH_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_eram_data_get");<br /> break;<br />+ case ZXDH_SDT_TBLT_HASH:<br />+ do {<br />+ rc = zxdh_np_dtb_hash_data_get(dev_id,<br />+ queue_id,<br />+ sdt_no,<br />+ (ZXDH_DTB_HASH_ENTRY_INFO_T *)get_entry->p_entry_data,<br />+ srh_mode);<br />+ sdt_partner = zxdh_np_apt_get_sdt_partner(dev_id, sdt_no);<br />+ valid = zxdh_np_hash_sdt_partner_valid(sdt_no, sdt_partner, &key);<br />+ sdt_no = sdt_partner;<br />+ } while ((rc == ZXDH_HASH_RC_SRH_FAIL) && (valid == ZXDH_TRUE));<br />+<br />+ if (rc == ZXDH_HASH_RC_SRH_FAIL) {<br />+ PMD_DRV_LOG(DEBUG, "hash search failed");<br />+ return rc;<br />+ }<br />+<br />+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_hash_data_get");<br />+ break;<br /> default:<br /> PMD_DRV_LOG(ERR, "SDT table_type[ %u ] is invalid!", tbl_type);<br /> return 1;<br />diff --git a/drivers/net/zxdh/zxdh_np.h b/drivers/net/zxdh/zxdh_np.h<br />index 5ca8053d5e..3b66cf0b9f 100644<br />--- a/drivers/net/zxdh/zxdh_np.h<br />+++ b/drivers/net/zxdh/zxdh_np.h<br />@@ -1320,6 +1320,13 @@ typedef enum zxdh_dtb_tab_up_user_addr_type_e {<br /> ZXDH_DTB_TAB_UP_USER_ADDR_TYPE_MAX,<br /> } ZXDH_DTB_TAB_UP_USER_ADDR_TYPE_E;<br /> <br />+typedef enum zxdh_dtb_dump_zcam_width_e {<br />+ ZXDH_DTB_DUMP_ZCAM_128b = 0,<br />+ ZXDH_DTB_DUMP_ZCAM_256b = 1,<br />+ ZXDH_DTB_DUMP_ZCAM_512b = 2,<br />+ ZXDH_DTB_DUMP_ZCAM_RSV = 3,<br />+} ZXDH_DTB_DUMP_ZCAM_WIDTH_E;<br />+<br /> typedef struct zxdh_dtb_lpm_entry_t {<br /> uint32_t dtb_len0;<br /> uint8_t *p_data_buff0;<br />-- <br />2.27.0<br />