DPDK patches and discussions
 help / color / mirror / Atom feed
From: Bingbin Chen <chen.bingbin@zte.com.cn>
To: dev@dpdk.org
Cc: Bingbin Chen <chen.bingbin@zte.com.cn>
Subject: [PATCH v1 11/14] net/zxdh: get hash table entry result
Date: Mon, 10 Feb 2025 09:50:14 +0800	[thread overview]
Message-ID: <20250210015017.4105624-6-chen.bingbin@zte.com.cn> (raw)
In-Reply-To: <20250210015017.4105624-1-chen.bingbin@zte.com.cn>


[-- Attachment #1.1.1: Type: text/plain, Size: 17134 bytes --]

Implement hash tables get operation by dtb channel.

Signed-off-by: Bingbin Chen <chen.bingbin@zte.com.cn>
---
 drivers/net/zxdh/zxdh_np.c | 491 +++++++++++++++++++++++++++++++++++++
 drivers/net/zxdh/zxdh_np.h |   7 +
 2 files changed, 498 insertions(+)

diff --git a/drivers/net/zxdh/zxdh_np.c b/drivers/net/zxdh/zxdh_np.c
index ba84d2064e..09ff42b3be 100644
--- a/drivers/net/zxdh/zxdh_np.c
+++ b/drivers/net/zxdh/zxdh_np.c
@@ -1388,6 +1388,40 @@ zxdh_comm_rb_insert(ZXDH_RB_CFG *p_rb_cfg,
 	return ZXDH_OK;
 }
 
+static uint32_t
+zxdh_comm_rb_search(ZXDH_RB_CFG *p_rb_cfg,
+						 void	   *p_key,
+						 void	   *out_val)
+{
+	int32_t	cmprtn   = 0;
+	ZXDH_RB_TN *p_cur_tn = NULL;
+
+	p_cur_tn = p_rb_cfg->p_root;
+
+	while (p_cur_tn) {
+		cmprtn = p_rb_cfg->p_cmpfun(p_key, p_cur_tn->p_key, p_rb_cfg->key_size);
+
+		if (cmprtn > 0)
+			p_cur_tn = p_cur_tn->p_right;
+		else if (cmprtn < 0)
+			p_cur_tn = p_cur_tn->p_left;
+		else
+			break;
+	}
+
+	if (!p_cur_tn) {
+		PMD_DRV_LOG(DEBUG, "rb srh fail");
+		return ZXDH_RBT_RC_SRHFAIL;
+	}
+
+	if (p_rb_cfg->is_dynamic)
+		*(ZXDH_RB_TN **)out_val = p_cur_tn;
+	else
+		*(uint32_t *)out_val = ZXDH_GET_TN_LSV(p_cur_tn);
+
+	return ZXDH_OK;
+}
+
 static uint32_t
 zxdh_comm_rb_handle_del(__rte_unused ZXDH_RB_CFG *p_rb_cfg,
 							ZXDH_RB_TN ***stack_tn,
@@ -4054,6 +4088,38 @@ zxdh_np_dtb_smmu0_dump_info_write(uint32_t dev_id,
 	return rc;
 }
 
+static uint32_t
+zxdh_np_dtb_zcam_dump_info_write(uint32_t dev_id,
+							uint32_t addr,
+							uint32_t tb_width,
+							uint32_t depth,
+							uint32_t addr_high32,
+							uint32_t addr_low32,
+							uint32_t *p_dump_info)
+{
+	uint32_t rc = ZXDH_OK;
+
+	ZXDH_DTB_ZCAM_DUMP_FORM_T dtb_zcam_dump_form_info = {0};
+
+	dtb_zcam_dump_form_info.valid = 1;
+	dtb_zcam_dump_form_info.up_type = ZXDH_DTB_DUMP_MODE_ZCAM;
+	dtb_zcam_dump_form_info.tb_width = tb_width;
+	dtb_zcam_dump_form_info.sram_addr = addr & 0x1FF;
+	dtb_zcam_dump_form_info.ram_reg_flag = (addr >> 16) & 0x1;
+	dtb_zcam_dump_form_info.z_reg_cell_id = (addr >> 9) & 0x3;
+	dtb_zcam_dump_form_info.zblock_id = (addr >> 11) & 0x7;
+	dtb_zcam_dump_form_info.zgroup_id = (addr >> 14) & 0x3;
+	dtb_zcam_dump_form_info.tb_depth = depth;
+	dtb_zcam_dump_form_info.tb_dst_addr_h = addr_high32;
+	dtb_zcam_dump_form_info.tb_dst_addr_l = addr_low32;
+
+	rc = zxdh_np_dtb_write_dump_cmd(dev_id, ZXDH_DTB_DUMP_ZCAM,
+		&dtb_zcam_dump_form_info, p_dump_info);
+	ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_write_dump_cmd");
+
+	return rc;
+}
+
 static uint32_t
 zxdh_np_dtb_se_smmu0_ind_write(uint32_t dev_id,
 		uint32_t base_addr,
@@ -6162,6 +6228,407 @@ zxdh_np_dtb_eram_data_get(uint32_t dev_id, uint32_t queue_id, uint32_t sdt_no,
 	return rc;
 }
 
+static uint32_t
+zxdh_np_dtb_se_zcam_dma_dump(uint32_t dev_id,
+							uint32_t queue_id,
+							uint32_t addr,
+							uint32_t tb_width,
+							uint32_t depth,
+							uint32_t *p_data,
+							uint32_t *element_id)
+{
+	uint32_t rc = ZXDH_OK;
+	uint32_t dump_dst_phy_haddr = 0;
+	uint32_t dump_dst_phy_laddr = 0;
+	uint32_t queue_item_index = 0;
+	uint32_t data_len = 0;
+	uint32_t desc_len = 0;
+	uint32_t tb_width_len = 0;
+	uint8_t form_buff[ZXDH_DTB_TABLE_CMD_SIZE_BIT / 8] = {0};
+
+	rc = zxdh_np_dtb_tab_up_free_item_get(dev_id, queue_id, &queue_item_index);
+	if (rc != ZXDH_OK) {
+		PMD_DRV_LOG(ERR, "zxdh_np_dtb_tab_up_free_item_get failed!");
+		return ZXDH_RC_DTB_QUEUE_ITEM_SW_EMPTY;
+	}
+
+	PMD_DRV_LOG(DEBUG, "table up item queue_element_id is: %d.",
+		queue_item_index);
+
+	*element_id = queue_item_index;
+
+	rc = zxdh_np_dtb_tab_up_item_addr_get(dev_id, queue_id, queue_item_index,
+		&dump_dst_phy_haddr, &dump_dst_phy_laddr);
+	ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_tab_up_item_addr_get");
+
+	rc = zxdh_np_dtb_zcam_dump_info_write(dev_id,
+									  addr,
+									  tb_width,
+									  depth,
+									  dump_dst_phy_haddr,
+									  dump_dst_phy_laddr,
+									  (uint32_t *)form_buff);
+	ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_zcam_dump_info_write");
+
+	tb_width_len = ZXDH_DTB_LEN_POS_SETP << tb_width;
+	data_len = depth * tb_width_len / 4;
+	desc_len = ZXDH_DTB_LEN_POS_SETP / 4;
+
+	rc = zxdh_np_dtb_write_dump_desc_info(dev_id, queue_id, queue_item_index,
+		(uint32_t *)form_buff, data_len, desc_len, p_data);
+	ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_write_dump_desc_info");
+
+	return rc;
+}
+
+static uint32_t
+zxdh_np_dtb_hash_data_parse(uint32_t item_type,
+						uint32_t key_by_size,
+						ZXDH_HASH_ENTRY *p_entry,
+						uint8_t  *p_item_data,
+						uint32_t  *p_data_offset)
+{
+	uint32_t data_offset = 0;
+	uint8_t temp_key_valid = 0;
+	uint8_t temp_key_type = 0;
+	uint32_t temp_entry_size = 0;
+	uint8_t srh_key_type = 0;
+	uint32_t srh_entry_size = 0;
+	uint32_t rst_by_size = 0;
+	uint8_t srh_succ = 0;
+	uint32_t item_width = ZXDH_SE_ITEM_WIDTH_MAX;
+	uint8_t *p_srh_key = NULL;
+	uint8_t *p_temp_key = NULL;
+
+	if (item_type == ZXDH_ITEM_DDR_256)
+		item_width = item_width / 2;
+
+	p_temp_key = p_item_data;
+	p_srh_key = p_entry->p_key;
+	srh_key_type = ZXDH_GET_HASH_KEY_TYPE(p_srh_key);
+	srh_entry_size = ZXDH_GET_HASH_ENTRY_SIZE(srh_key_type);
+
+	while (data_offset < item_width) {
+		temp_key_valid = ZXDH_GET_HASH_KEY_VALID(p_temp_key);
+		temp_key_type = ZXDH_GET_HASH_KEY_TYPE(p_temp_key);
+
+		if (temp_key_valid && srh_key_type == temp_key_type) {
+			if (memcmp(p_srh_key, p_temp_key, key_by_size) == 0) {
+				PMD_DRV_LOG(DEBUG, "Hash search hardware successfully.");
+				srh_succ = 1;
+				break;
+			}
+
+			data_offset += srh_entry_size;
+		} else if (temp_key_valid && (srh_key_type != temp_key_type)) {
+			temp_entry_size = ZXDH_GET_HASH_ENTRY_SIZE(temp_key_type);
+			data_offset += temp_entry_size;
+		} else {
+			data_offset += ZXDH_HASH_ENTRY_POS_STEP;
+		}
+
+		p_temp_key = p_item_data;
+		p_temp_key += data_offset;
+	}
+
+	if (!srh_succ) {
+		PMD_DRV_LOG(DEBUG, "Hash search hardware fail.");
+		return ZXDH_HASH_RC_MATCH_ITEM_FAIL;
+	}
+
+	rst_by_size = srh_entry_size - key_by_size;
+	rte_memcpy(p_entry->p_rst, p_temp_key + key_by_size,
+		(rst_by_size > ZXDH_HASH_RST_MAX) ? ZXDH_HASH_RST_MAX : rst_by_size);
+	*p_data_offset = data_offset;
+
+	return ZXDH_OK;
+}
+
+static uint32_t
+zxdh_np_dtb_hash_zcam_get_hardware(uint32_t dev_id,
+						uint32_t queue_id,
+						HASH_ENTRY_CFG  *p_hash_entry_cfg,
+						ZXDH_HASH_ENTRY  *p_hash_entry,
+						uint8_t *p_srh_succ)
+{
+	uint32_t rc = ZXDH_OK;
+	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;
+
+	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);
+		p_zblk = &p_se_cfg->zblk_info[zblk_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;
+		}
+	}
+
+	*p_srh_succ = srh_succ;
+
+	return rc;
+}
+
+static uint32_t
+zxdh_np_dtb_hash_software_item_check(ZXDH_HASH_ENTRY *p_entry,
+						uint32_t key_by_size,
+						uint32_t rst_by_size,
+						ZXDH_SE_ITEM_CFG *p_item_info)
+{
+	uint8_t srh_succ = 0;
+	uint8_t temp_key_type = 0;
+	uint8_t srh_key_type = 0;
+	uint32_t dev_id = 0;
+	ZXDH_D_NODE *p_entry_dn = NULL;
+	ZXDH_HASH_RBKEY_INFO *p_rbkey = NULL;
+
+	srh_key_type = ZXDH_GET_HASH_KEY_TYPE(p_entry->p_key);
+	p_entry_dn = p_item_info->item_list.p_next;
+	while (p_entry_dn) {
+		p_rbkey = (ZXDH_HASH_RBKEY_INFO *)p_entry_dn->data;
+		ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_rbkey);
+
+		RTE_ASSERT(p_rbkey->p_item_info == p_item_info);
+
+		temp_key_type = ZXDH_GET_HASH_KEY_TYPE(p_rbkey->key);
+
+		if (ZXDH_GET_HASH_KEY_VALID(p_rbkey->key) && srh_key_type == temp_key_type) {
+			if (memcmp(p_entry->p_key, p_rbkey->key, key_by_size) == 0) {
+				srh_succ = 1;
+				break;
+			}
+		}
+
+		p_entry_dn = p_entry_dn->next;
+	}
+
+	if (p_rbkey == NULL)
+		return ZXDH_PAR_CHK_POINT_NULL;
+
+	if (!srh_succ) {
+		PMD_DRV_LOG(DEBUG, "%s fail!", __func__);
+		return ZXDH_HASH_RC_MATCH_ITEM_FAIL;
+	}
+
+	rte_memcpy(p_entry->p_rst, p_rbkey->rst,
+		(rst_by_size > ZXDH_HASH_RST_MAX) ? ZXDH_HASH_RST_MAX : rst_by_size);
+
+	return ZXDH_OK;
+}
+
+static uint32_t
+zxdh_np_dtb_hash_get_software(uint32_t dev_id,
+							HASH_ENTRY_CFG  *p_hash_entry_cfg,
+							ZXDH_HASH_ENTRY  *p_hash_entry,
+							uint8_t *p_srh_succ)
+{
+	uint32_t rc = ZXDH_OK;
+	ZXDH_HASH_RBKEY_INFO srh_rbkey = {0};
+	ZXDH_HASH_RBKEY_INFO *p_rbkey = NULL;
+	ZXDH_RB_TN *p_rb_tn_rtn = NULL;
+	ZXDH_SE_ITEM_CFG *p_item = NULL;
+	ZXDH_HASH_CFG *p_hash_cfg = NULL;
+	ZXDH_MUTEX_T *p_hash_mutex = 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);
+
+	zxdh_np_dev_hash_opr_mutex_get(dev_id, p_hash_cfg->fun_id, &p_hash_mutex);
+
+	rc = zxdh_np_comm_mutex_lock(p_hash_mutex);
+	ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_comm_mutex_lock");
+
+	rc = zxdh_comm_rb_search(&p_hash_cfg->hash_rb, (void *)&srh_rbkey, (void *)(&p_rb_tn_rtn));
+	if (rc == ZXDH_RBT_RC_SRHFAIL) {
+		PMD_DRV_LOG(DEBUG, "zxdh_comm_rb_search fail.");
+
+		rc = zxdh_np_comm_mutex_unlock(p_hash_mutex);
+		ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_comm_mutex_unlock");
+
+		return ZXDH_OK;
+	}
+
+	ZXDH_COMM_CHECK_DEV_POINT_UNLOCK(dev_id, p_rb_tn_rtn, p_hash_mutex);
+	p_rbkey = p_rb_tn_rtn->p_key;
+	ZXDH_COMM_CHECK_DEV_POINT_UNLOCK(dev_id, p_rbkey, p_hash_mutex);
+	p_item = p_rbkey->p_item_info;
+	ZXDH_COMM_CHECK_DEV_POINT_UNLOCK(dev_id, p_item, p_hash_mutex);
+
+	rc = zxdh_np_dtb_hash_software_item_check(p_hash_entry,
+			p_hash_entry_cfg->key_by_size,
+			p_hash_entry_cfg->rst_by_size,
+			p_item);
+	if (rc == ZXDH_OK) {
+		PMD_DRV_LOG(DEBUG, "Hash search software succ.");
+		*p_srh_succ = 1;
+		p_hash_cfg->hash_stat.search_ok++;
+	}
+
+	rc = zxdh_np_comm_mutex_unlock(p_hash_mutex);
+	ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_comm_mutex_unlock");
+
+	return rc;
+}
+
+static uint32_t
+zxdh_np_dtb_hash_zcam_get(uint32_t dev_id,
+						uint32_t queue_id,
+						HASH_ENTRY_CFG  *p_hash_entry_cfg,
+						ZXDH_HASH_ENTRY  *p_hash_entry,
+						uint32_t srh_mode,
+						uint8_t *p_srh_succ)
+{
+	uint32_t  rc = ZXDH_OK;
+
+	if (srh_mode == ZXDH_HASH_SRH_MODE_HDW) {
+		rc = zxdh_np_dtb_hash_zcam_get_hardware(dev_id, queue_id,
+			p_hash_entry_cfg, p_hash_entry, p_srh_succ);
+		ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_hash_zcam_get_hardware");
+	} else {
+		rc = zxdh_np_dtb_hash_get_software(dev_id, p_hash_entry_cfg,
+			p_hash_entry, p_srh_succ);
+		ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_hash_get_software");
+	}
+
+	return rc;
+}
+
+static uint32_t
+zxdh_np_dtb_hash_data_get(uint32_t dev_id,
+						uint32_t queue_id,
+						uint32_t sdt_no,
+						ZXDH_DTB_HASH_ENTRY_INFO_T *p_dtb_hash_entry,
+						uint32_t srh_mode)
+{
+	uint32_t rc = ZXDH_OK;
+	uint8_t srh_succ = 0;
+	uint8_t key_valid = 1;
+	ZXDH_HASH_CFG *p_hash_cfg = NULL;
+	HASH_ENTRY_CFG  hash_entry_cfg = {0};
+	ZXDH_HASH_ENTRY hash_entry = {0};
+	uint8_t aucKey[ZXDH_HASH_KEY_MAX] = {0};
+	uint8_t aucRst[ZXDH_HASH_RST_MAX] = {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);
+
+	hash_entry.p_key = aucKey;
+	hash_entry.p_rst = aucRst;
+	hash_entry.p_key[0] = ZXDH_GET_HASH_KEY_CTRL(key_valid,
+							hash_entry_cfg.key_type,
+							hash_entry_cfg.table_id);
+
+	rte_memcpy(&hash_entry.p_key[1], p_dtb_hash_entry->p_actu_key,
+		hash_entry_cfg.actu_key_size);
+
+	if (!srh_succ) {
+		rc  = zxdh_np_dtb_hash_zcam_get(dev_id, queue_id, &hash_entry_cfg,
+			&hash_entry, srh_mode, &srh_succ);
+		ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_hash_zcam_get");
+	}
+
+	if (!srh_succ) {
+		p_hash_cfg->hash_stat.search_fail++;
+		PMD_DRV_LOG(DEBUG, "Hash search key fail!");
+		return ZXDH_HASH_RC_SRH_FAIL;
+	}
+
+	rte_memcpy(p_dtb_hash_entry->p_rst, hash_entry.p_rst,
+		1 << (hash_entry_cfg.rsp_mode + 2));
+
+	return rc;
+}
+
 int
 zxdh_np_dtb_table_entry_get(uint32_t dev_id,
 		 uint32_t queue_id,
@@ -6172,6 +6639,9 @@ zxdh_np_dtb_table_entry_get(uint32_t dev_id,
 	uint32_t tbl_type = 0;
 	uint32_t rc;
 	uint32_t sdt_no;
+	uint32_t sdt_partner = 0;
+	uint32_t valid = 0;
+	uint8_t key = 0;
 
 	sdt_no = get_entry->sdt_no;
 	zxdh_np_sdt_tbl_data_get(srh_mode, sdt_no, &sdt_tbl);
@@ -6188,6 +6658,27 @@ zxdh_np_dtb_table_entry_get(uint32_t dev_id,
 		ZXDH_COMM_CHECK_RC_NO_ASSERT(rc, "dpp_dtb_eram_data_get");
 		break;
 	}
+	case ZXDH_SDT_TBLT_HASH:
+	{
+		do {
+			rc = zxdh_np_dtb_hash_data_get(dev_id,
+					queue_id,
+					sdt_no,
+					(ZXDH_DTB_HASH_ENTRY_INFO_T *)get_entry->p_entry_data,
+					srh_mode);
+			sdt_partner = zxdh_np_apt_get_sdt_partner(dev_id, sdt_no);
+			valid = zxdh_np_hash_sdt_partner_valid(sdt_no, sdt_partner, &key);
+			sdt_no = sdt_partner;
+		} while ((rc == ZXDH_HASH_RC_SRH_FAIL) && (valid == ZXDH_TRUE));
+
+		if (rc == ZXDH_HASH_RC_SRH_FAIL) {
+			PMD_DRV_LOG(DEBUG, " %s hash fail", __func__);
+			return rc;
+		}
+
+		ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_hash_data_get");
+		break;
+	}
 	default:
 	{
 		PMD_DRV_LOG(ERR, "SDT table_type[ %d ] is invalid!", tbl_type);
diff --git a/drivers/net/zxdh/zxdh_np.h b/drivers/net/zxdh/zxdh_np.h
index 2c94125817..0762db5fad 100644
--- a/drivers/net/zxdh/zxdh_np.h
+++ b/drivers/net/zxdh/zxdh_np.h
@@ -1279,6 +1279,13 @@ typedef enum zxdh_dtb_tab_up_user_addr_type_e {
 	ZXDH_DTB_TAB_UP_USER_ADDR_TYPE_MAX,
 } ZXDH_DTB_TAB_UP_USER_ADDR_TYPE_E;
 
+typedef enum zxdh_dtb_dump_zcam_width_e {
+	ZXDH_DTB_DUMP_ZCAM_128b = 0,
+	ZXDH_DTB_DUMP_ZCAM_256b = 1,
+	ZXDH_DTB_DUMP_ZCAM_512b = 2,
+	ZXDH_DTB_DUMP_ZCAM_RSV  = 3,
+} ZXDH_DTB_DUMP_ZCAM_WIDTH_E;
+
 typedef struct zxdh_dtb_lpm_entry_t {
 	uint32_t dtb_len0;
 	uint8_t *p_data_buff0;
-- 
2.27.0

[-- Attachment #1.1.2: Type: text/html , Size: 48142 bytes --]

  parent reply	other threads:[~2025-02-10  2:03 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-02-10  1:44 [PATCH v1 01/14] net/zxdh: add network processor registers ops Bingbin Chen
2025-02-10  1:46 ` [PATCH v1 02/14] net/zxdh: support compatibility check Bingbin Chen
2025-02-10 17:25   ` Stephen Hemminger
2025-02-10  1:47 ` [PATCH v1 03/14] net/zxdh: add agent channel Bingbin Chen
2025-02-10 17:28   ` Stephen Hemminger
2025-02-10 17:30   ` Stephen Hemminger
2025-02-10 17:31   ` Stephen Hemminger
2025-02-10 18:23   ` Stephen Hemminger
2025-02-10  1:47 ` [PATCH v1 04/14] net/zxdh: modify dtb queue ops Bingbin Chen
2025-02-10 17:31   ` Stephen Hemminger
2025-02-10  1:48 ` [PATCH v1 05/14] net/zxdh: add tables dump address ops Bingbin Chen
2025-02-10 17:33   ` Stephen Hemminger
2025-02-10  1:50 ` [PATCH v1 06/14] net/zxdh: add eram tables ops Bingbin Chen
2025-02-10  1:50   ` [PATCH v1 07/14] net/zxdh: get flow tables resources Bingbin Chen
2025-02-10 17:35     ` Stephen Hemminger
2025-02-10 17:35     ` Stephen Hemminger
2025-02-10  1:50   ` [PATCH v1 08/14] net/zxdh: support hash resources configuration Bingbin Chen
2025-02-10 17:36     ` Stephen Hemminger
2025-02-10  1:50   ` [PATCH v1 09/14] net/zxdh: implement tables initialization Bingbin Chen
2025-02-10 17:40     ` Stephen Hemminger
2025-02-10 17:43     ` Stephen Hemminger
2025-02-10  1:50   ` [PATCH v1 10/14] net/zxdh: support hash tables write and delete ops Bingbin Chen
2025-02-10 17:45     ` Stephen Hemminger
2025-02-10  1:50   ` Bingbin Chen [this message]
2025-02-10 17:46     ` [PATCH v1 11/14] net/zxdh: get hash table entry result Stephen Hemminger
2025-02-10  1:50   ` [PATCH v1 12/14] net/zxdh: delete all hash entries Bingbin Chen
2025-02-10 17:47     ` Stephen Hemminger
2025-02-10  1:50   ` [PATCH v1 13/14] net/zxdh: add acl tables ops Bingbin Chen
2025-02-10  1:50   ` [PATCH v1 14/14] net/zxdh: clean stat values Bingbin Chen
2025-02-10 17:50     ` Stephen Hemminger
2025-02-10 17:50     ` Stephen Hemminger
2025-02-10 18:19     ` Stephen Hemminger

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20250210015017.4105624-6-chen.bingbin@zte.com.cn \
    --to=chen.bingbin@zte.com.cn \
    --cc=dev@dpdk.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).