* [PATCH v1 07/14] net/zxdh: get flow tables resources
2025-02-10 1:50 ` [PATCH v1 06/14] net/zxdh: add eram tables ops Bingbin Chen
@ 2025-02-10 1:50 ` 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
` (6 subsequent siblings)
7 siblings, 2 replies; 32+ messages in thread
From: Bingbin Chen @ 2025-02-10 1:50 UTC (permalink / raw)
To: dev; +Cc: Bingbin Chen
[-- Attachment #1.1.1: Type: text/plain, Size: 32952 bytes --]
Implement the flow tables resources get operation
by agent channel.
Signed-off-by: Bingbin Chen <chen.bingbin@zte.com.cn>
---
drivers/net/zxdh/zxdh_ethdev.c | 18 ++
drivers/net/zxdh/zxdh_ethdev.h | 1 +
drivers/net/zxdh/zxdh_np.c | 522 +++++++++++++++++++++++++++++++++
drivers/net/zxdh/zxdh_np.h | 338 +++++++++++++++++++--
4 files changed, 858 insertions(+), 21 deletions(-)
diff --git a/drivers/net/zxdh/zxdh_ethdev.c b/drivers/net/zxdh/zxdh_ethdev.c
index 858e3c3d47..18b661b1ab 100644
--- a/drivers/net/zxdh/zxdh_ethdev.c
+++ b/drivers/net/zxdh/zxdh_ethdev.c
@@ -1400,6 +1400,11 @@ zxdh_np_init(struct rte_eth_dev *eth_dev)
struct zxdh_hw *hw = eth_dev->data->dev_private;
int ret = 0;
+ if (zxdh_shared_data != NULL && zxdh_shared_data->np_init_done) {
+ g_dtb_data.dev_refcnt++;
+ return 0;
+ }
+
if (hw->is_pf) {
ret = zxdh_np_dtb_res_init(eth_dev);
if (ret) {
@@ -1407,6 +1412,19 @@ zxdh_np_init(struct rte_eth_dev *eth_dev)
return ret;
}
}
+
+ if (hw->is_pf) {
+ ret = zxdh_np_se_res_get_and_init(0, ZXDH_SE_STD_NIC_RES_TYPE);
+ if (ret) {
+ PMD_DRV_LOG(ERR, "dpp apt init failed, code:%d ", ret);
+ return -ret;
+ }
+ if (hw->hash_search_index >= ZXDH_HASHIDX_MAX) {
+ PMD_DRV_LOG(ERR, "invalid hash idx %d", hw->hash_search_index);
+ return -1;
+ }
+ }
+
if (zxdh_shared_data != NULL)
zxdh_shared_data->np_init_done = 1;
diff --git a/drivers/net/zxdh/zxdh_ethdev.h b/drivers/net/zxdh/zxdh_ethdev.h
index fd4699c34d..b2ff7d32f6 100644
--- a/drivers/net/zxdh/zxdh_ethdev.h
+++ b/drivers/net/zxdh/zxdh_ethdev.h
@@ -40,6 +40,7 @@
#define ZXDH_DTB_TABLE_CONF_SIZE (32 * (16 + 16 * 1024))
#define ZXDH_MAX_NAME_LEN 32
+#define ZXDH_HASHIDX_MAX 6
union zxdh_virport_num {
uint16_t vport;
diff --git a/drivers/net/zxdh/zxdh_np.c b/drivers/net/zxdh/zxdh_np.c
index 880658a63f..1e4b214a6e 100644
--- a/drivers/net/zxdh/zxdh_np.c
+++ b/drivers/net/zxdh/zxdh_np.c
@@ -334,6 +334,20 @@ do {\
} \
} while (0)
+#define ZXDH_COMM_CHECK_DEV_POINT_UNLOCK(dev_id, point, mutex)\
+do {\
+ if ((point) == NULL) {\
+ PMD_DRV_LOG(ERR, "ZXDH %s:%d[Error:POINT NULL] !"\
+ "FUNCTION : %s!", __FILE__, __LINE__, __func__);\
+ if (zxdh_np_comm_mutex_unlock(mutex) != 0) { \
+ PMD_DRV_LOG(ERR, "File: [%s], Function:[%s], Line:%u"\
+ "mutex unlock failed!-->Return ERROR", __FILE__,\
+ __func__, __LINE__);\
+ } \
+ RTE_ASSERT(0);\
+ } \
+} while (0)
+
#define ZXDH_COMM_CHECK_POINT_NO_ASSERT(point)\
do {\
if ((point) == NULL) {\
@@ -2486,6 +2500,39 @@ zxdh_np_agent_channel_dtb_queue_release(uint32_t dev_id,
return msg_result;
}
+static uint32_t
+zxdh_np_agent_channel_se_res_get(uint32_t dev_id,
+ uint32_t sub_type,
+ uint32_t opr,
+ uint32_t *p_rsp_buff,
+ uint32_t buff_size)
+{
+ uint32_t rc = ZXDH_OK;
+
+ uint32_t msg_result = 0;
+ ZXDH_AGENT_SE_RES_MSG_T msgcfg = {0};
+ ZXDH_AGENT_CHANNEL_MSG_T agent_msg = {0};
+
+ msgcfg.dev_id = 0;
+ msgcfg.type = ZXDH_RES_MSG;
+ msgcfg.sub_type = sub_type;
+ msgcfg.oper = opr;
+ agent_msg.msg = (void *)&msgcfg;
+ agent_msg.msg_len = sizeof(ZXDH_AGENT_SE_RES_MSG_T);
+
+ rc = zxdh_np_agent_channel_sync_send(dev_id, &agent_msg, p_rsp_buff, buff_size);
+ if (rc != ZXDH_OK) {
+ PMD_DRV_LOG(ERR, "%s send msg failed", __func__);
+ return ZXDH_ERR;
+ }
+
+ msg_result = p_rsp_buff[0];
+ PMD_DRV_LOG(DEBUG, "msg_result: 0x%x", msg_result);
+ zxdh_np_agent_msg_prt(msgcfg.type, msg_result);
+
+ return msg_result;
+}
+
static ZXDH_DTB_MGR_T *
zxdh_np_dtb_mgr_get(uint32_t dev_id)
{
@@ -5203,3 +5250,478 @@ zxdh_np_host_init(uint32_t dev_id,
return 0;
}
+
+static uint32_t
+zxdh_np_get_se_buff_size(uint32_t opr)
+{
+ uint32_t buff_size = 0;
+
+ switch (opr) {
+ case ZXDH_HASH_FUNC_BULK_REQ:
+ {
+ buff_size = sizeof(ZXDH_NP_SE_HASH_FUNC_BULK_T);
+ break;
+ }
+
+ case ZXDH_HASH_TBL_REQ:
+ {
+ buff_size = sizeof(ZXDH_NP_SE_HASH_TBL_T);
+ break;
+ }
+
+ case ZXDH_ERAM_TBL_REQ:
+ {
+ buff_size = sizeof(ZXDH_NP_SE_ERAM_TBL_T);
+ break;
+ }
+
+ case ZXDH_ACL_TBL_REQ:
+ {
+ buff_size = sizeof(ZXDH_NP_SE_ACL_TBL_T);
+ break;
+ }
+
+ case ZXDH_STAT_CFG_REQ:
+ {
+ buff_size = sizeof(ZXDH_NP_SE_STAT_CFG_T);
+ break;
+ }
+
+ default:
+ break;
+ }
+
+ return buff_size;
+}
+
+static void
+zxdh_np_hash_func_bulk_set(ZXDH_APT_HASH_RES_INIT_T *p_hash_res_init,
+ ZXDH_NP_SE_HASH_FUNC_BULK_T *p_func_bulk)
+{
+ uint32_t index = 0;
+ ZXDH_APT_HASH_FUNC_RES_T *p_func_res = NULL;
+ ZXDH_APT_HASH_BULK_RES_T *p_bulk_res = NULL;
+
+ p_hash_res_init->func_num = p_func_bulk->func_num;
+ p_hash_res_init->bulk_num = p_func_bulk->bulk_num;
+ for (index = 0; index < (p_hash_res_init->func_num); index++) {
+ p_func_res = p_hash_res_init->func_res + index;
+
+ p_func_res->func_id = p_func_bulk->fun[index].func_id;
+ p_func_res->ddr_dis = p_func_bulk->fun[index].ddr_dis;
+ p_func_res->zblk_num = p_func_bulk->fun[index].zblk_num;
+ p_func_res->zblk_bitmap = p_func_bulk->fun[index].zblk_bitmap;
+ }
+
+ for (index = 0; index < (p_hash_res_init->bulk_num); index++) {
+ p_bulk_res = p_hash_res_init->bulk_res + index;
+
+ p_bulk_res->func_id = p_func_bulk->bulk[index].func_id;
+ p_bulk_res->bulk_id = p_func_bulk->bulk[index].bulk_id;
+ p_bulk_res->zcell_num = p_func_bulk->bulk[index].zcell_num;
+ p_bulk_res->zreg_num = p_func_bulk->bulk[index].zreg_num;
+ p_bulk_res->ddr_baddr = p_func_bulk->bulk[index].ddr_baddr;
+ p_bulk_res->ddr_item_num = p_func_bulk->bulk[index].ddr_item_num;
+ p_bulk_res->ddr_width_mode = p_func_bulk->bulk[index].ddr_width_mode;
+ p_bulk_res->ddr_crc_sel = p_func_bulk->bulk[index].ddr_crc_sel;
+ p_bulk_res->ddr_ecc_en = p_func_bulk->bulk[index].ddr_ecc_en;
+ }
+}
+
+static void
+zxdh_np_hash_tbl_set(ZXDH_APT_HASH_RES_INIT_T *p_hash_res_init, ZXDH_NP_SE_HASH_TBL_T *p_hash_tbl)
+{
+ uint32_t index = 0;
+ ZXDH_APT_HASH_TABLE_T *p_tbl_res = NULL;
+
+ p_hash_res_init->tbl_num = p_hash_tbl->tbl_num;
+ for (index = 0; index < (p_hash_res_init->tbl_num); index++) {
+ p_tbl_res = p_hash_res_init->tbl_res + index;
+
+ p_tbl_res->sdt_no = p_hash_tbl->table[index].sdt_no;
+ p_tbl_res->sdt_partner = p_hash_tbl->table[index].sdt_partner;
+ p_tbl_res->tbl_flag = p_hash_tbl->table[index].tbl_flag;
+ p_tbl_res->hash_sdt.table_type =
+ p_hash_tbl->table[index].hash_sdt.table_type;
+ p_tbl_res->hash_sdt.hash_id = p_hash_tbl->table[index].hash_sdt.hash_id;
+ p_tbl_res->hash_sdt.hash_table_width =
+ p_hash_tbl->table[index].hash_sdt.hash_table_width;
+ p_tbl_res->hash_sdt.key_size = p_hash_tbl->table[index].hash_sdt.key_size;
+ p_tbl_res->hash_sdt.hash_table_id =
+ p_hash_tbl->table[index].hash_sdt.hash_table_id;
+ p_tbl_res->hash_sdt.learn_en = p_hash_tbl->table[index].hash_sdt.learn_en;
+ p_tbl_res->hash_sdt.keep_alive =
+ p_hash_tbl->table[index].hash_sdt.keep_alive;
+ p_tbl_res->hash_sdt.keep_alive_baddr =
+ p_hash_tbl->table[index].hash_sdt.keep_alive_baddr;
+ p_tbl_res->hash_sdt.rsp_mode =
+ p_hash_tbl->table[index].hash_sdt.rsp_mode;
+ p_tbl_res->hash_sdt.hash_clutch_en =
+ p_hash_tbl->table[index].hash_sdt.hash_clutch_en;
+ }
+}
+
+static void
+zxdh_np_eram_tbl_set(ZXDH_APT_ERAM_RES_INIT_T *p_eam_res_init, ZXDH_NP_SE_ERAM_TBL_T *p_eram_tbl)
+{
+ uint32_t index = 0;
+ ZXDH_APT_ERAM_TABLE_T *p_eram_res = NULL;
+
+ p_eam_res_init->tbl_num = p_eram_tbl->tbl_num;
+ for (index = 0; index < (p_eam_res_init->tbl_num); index++) {
+ p_eram_res = p_eam_res_init->eram_res + index;
+
+ p_eram_res->sdt_no = p_eram_tbl->eram[index].sdt_no;
+ p_eram_res->opr_mode = p_eram_tbl->eram[index].opr_mode;
+ p_eram_res->rd_mode = p_eram_tbl->eram[index].rd_mode;
+ p_eram_res->eram_sdt.table_type = p_eram_tbl->eram[index].eram_sdt.table_type;
+ p_eram_res->eram_sdt.eram_mode = p_eram_tbl->eram[index].eram_sdt.eram_mode;
+ p_eram_res->eram_sdt.eram_base_addr =
+ p_eram_tbl->eram[index].eram_sdt.eram_base_addr;
+ p_eram_res->eram_sdt.eram_table_depth =
+ p_eram_tbl->eram[index].eram_sdt.eram_table_depth;
+ p_eram_res->eram_sdt.eram_clutch_en =
+ p_eram_tbl->eram[index].eram_sdt.eram_clutch_en;
+ }
+}
+
+static void
+zxdh_np_acl_tbl_set(ZXDH_APT_ACL_RES_INIT_T *p_acl_res_init, ZXDH_NP_SE_ACL_TBL_T *p_acl_tbl)
+{
+ uint32_t index = 0;
+ ZXDH_APT_ACL_TABLE_T *p_acl_res = NULL;
+
+ p_acl_res_init->tbl_num = p_acl_tbl->tbl_num;
+ for (index = 0; index < (p_acl_tbl->tbl_num); index++) {
+ p_acl_res = p_acl_res_init->acl_res + index;
+
+ p_acl_res->sdt_no = p_acl_tbl->acl[index].sdt_no;
+ p_acl_res->sdt_partner = p_acl_tbl->acl[index].sdt_partner;
+ p_acl_res->acl_res.block_num = p_acl_tbl->acl[index].acl_res.block_num;
+ p_acl_res->acl_res.entry_num = p_acl_tbl->acl[index].acl_res.entry_num;
+ p_acl_res->acl_res.pri_mode = p_acl_tbl->acl[index].acl_res.pri_mode;
+ rte_memcpy(p_acl_res->acl_res.block_index,
+ p_acl_tbl->acl[index].acl_res.block_index,
+ sizeof(uint32_t) * ZXDH_ETCAM_BLOCK_NUM);
+ p_acl_res->acl_sdt.table_type = p_acl_tbl->acl[index].acl_sdt.table_type;
+ p_acl_res->acl_sdt.etcam_id = p_acl_tbl->acl[index].acl_sdt.etcam_id;
+ p_acl_res->acl_sdt.etcam_key_mode = p_acl_tbl->acl[index].acl_sdt.etcam_key_mode;
+ p_acl_res->acl_sdt.etcam_table_id = p_acl_tbl->acl[index].acl_sdt.etcam_table_id;
+ p_acl_res->acl_sdt.no_as_rsp_mode = p_acl_tbl->acl[index].acl_sdt.no_as_rsp_mode;
+ p_acl_res->acl_sdt.as_en = p_acl_tbl->acl[index].acl_sdt.as_en;
+ p_acl_res->acl_sdt.as_eram_baddr = p_acl_tbl->acl[index].acl_sdt.as_eram_baddr;
+ p_acl_res->acl_sdt.as_rsp_mode = p_acl_tbl->acl[index].acl_sdt.as_rsp_mode;
+ p_acl_res->acl_sdt.etcam_table_depth =
+ p_acl_tbl->acl[index].acl_sdt.etcam_table_depth;
+ p_acl_res->acl_sdt.etcam_clutch_en = p_acl_tbl->acl[index].acl_sdt.etcam_clutch_en;
+ }
+}
+
+static void
+zxdh_np_stat_cfg_set(ZXDH_APT_STAT_RES_INIT_T *p_stat_res_init, ZXDH_NP_SE_STAT_CFG_T *p_stat_cfg)
+{
+ p_stat_res_init->eram_baddr = p_stat_cfg->eram_baddr;
+ p_stat_res_init->eram_depth = p_stat_cfg->eram_depth;
+ p_stat_res_init->ddr_baddr = p_stat_cfg->ddr_baddr;
+ p_stat_res_init->ppu_ddr_offset = p_stat_cfg->ppu_ddr_offset;
+}
+
+static uint32_t
+zxdh_np_agent_hash_func_bulk_get(uint32_t dev_id, uint32_t type,
+ ZXDH_APT_HASH_RES_INIT_T *p_hash_res_init)
+{
+ uint32_t rc = ZXDH_OK;
+ uint32_t opr = ZXDH_HASH_FUNC_BULK_REQ;
+ uint32_t sub_type = ZXDH_RES_STD_NIC_MSG;
+ uint32_t buff_size = 0;
+ ZXDH_MUTEX_T *p_dtb_mutex = NULL;
+ uint32_t *p_rsp_buff = NULL;
+ ZXDH_NP_SE_HASH_FUNC_BULK_T *p_func_bulk = NULL;
+ ZXDH_DEV_MUTEX_TYPE_E mutex = 0;
+
+ mutex = ZXDH_DEV_MUTEX_T_DTB;
+ rc = zxdh_np_dev_opr_mutex_get(dev_id, (uint32_t)mutex, &p_dtb_mutex);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dev_opr_mutex_get");
+
+ rc = zxdh_np_comm_mutex_lock(p_dtb_mutex);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_comm_mutex_lock");
+
+ buff_size = zxdh_np_get_se_buff_size(opr) + sizeof(uint32_t);
+ p_rsp_buff = (uint32_t *)rte_zmalloc(NULL, buff_size, 0);
+ ZXDH_COMM_CHECK_DEV_POINT_UNLOCK(dev_id, p_rsp_buff, p_dtb_mutex);
+
+ sub_type = (type == ZXDH_SE_STD_NIC_RES_TYPE) ? ZXDH_RES_STD_NIC_MSG : ZXDH_RES_OFFLOAD_MSG;
+
+ rc = zxdh_np_agent_channel_se_res_get(dev_id, sub_type, opr, p_rsp_buff, buff_size);
+ if (rc != ZXDH_OK) {
+ rte_free(p_rsp_buff);
+ PMD_DRV_LOG(ERR, "hash func&bulk res get fail rc=0x%x.", rc);
+ rc = zxdh_np_comm_mutex_unlock(p_dtb_mutex);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_comm_mutex_unlock");
+ return ZXDH_ERR;
+ }
+
+ rc = zxdh_np_comm_mutex_unlock(p_dtb_mutex);
+ ZXDH_COMM_CHECK_RC_MEMORY_FREE(rc, "zxdh_np_comm_mutex_unlock", p_rsp_buff);
+
+ p_func_bulk = (ZXDH_NP_SE_HASH_FUNC_BULK_T *)(p_rsp_buff + 1);
+ zxdh_np_hash_func_bulk_set(p_hash_res_init, p_func_bulk);
+ rte_free(p_rsp_buff);
+
+ return rc;
+}
+
+static uint32_t
+zxdh_np_agent_hash_tbl_get(uint32_t dev_id,
+ uint32_t type,
+ ZXDH_APT_HASH_RES_INIT_T *p_hash_res_init)
+{
+ uint32_t rc = ZXDH_OK;
+ uint32_t opr = ZXDH_HASH_TBL_REQ;
+ uint32_t sub_type = ZXDH_RES_STD_NIC_MSG;
+ uint32_t buff_size = 0;
+ ZXDH_MUTEX_T *p_dtb_mutex = NULL;
+ uint32_t *p_rsp_buff = NULL;
+ ZXDH_NP_SE_HASH_TBL_T *p_hash_tbl = NULL;
+ ZXDH_DEV_MUTEX_TYPE_E mutex = 0;
+
+ mutex = ZXDH_DEV_MUTEX_T_DTB;
+ rc = zxdh_np_dev_opr_mutex_get(dev_id, (uint32_t)mutex, &p_dtb_mutex);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dev_opr_mutex_get");
+
+ rc = zxdh_np_comm_mutex_lock(p_dtb_mutex);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_comm_mutex_lock");
+
+ buff_size = zxdh_np_get_se_buff_size(opr) + sizeof(uint32_t);
+ p_rsp_buff = (uint32_t *)rte_zmalloc(NULL, buff_size, 0);
+ ZXDH_COMM_CHECK_DEV_POINT_UNLOCK(dev_id, p_rsp_buff, p_dtb_mutex);
+
+ sub_type = (type == ZXDH_SE_STD_NIC_RES_TYPE) ?
+ ZXDH_RES_STD_NIC_MSG : ZXDH_RES_OFFLOAD_MSG;
+
+ rc = zxdh_np_agent_channel_se_res_get(dev_id, sub_type, opr, p_rsp_buff, buff_size);
+ if (rc != ZXDH_OK) {
+ rte_free(p_rsp_buff);
+ PMD_DRV_LOG(ERR, "hash table res get fail rc=0x%x.", rc);
+ rc = zxdh_np_comm_mutex_unlock(p_dtb_mutex);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_comm_mutex_unlock");
+ return ZXDH_ERR;
+ }
+
+ rc = zxdh_np_comm_mutex_unlock(p_dtb_mutex);
+ ZXDH_COMM_CHECK_RC_MEMORY_FREE(rc, "zxdh_np_comm_mutex_unlock", p_rsp_buff);
+
+ p_hash_tbl = (ZXDH_NP_SE_HASH_TBL_T *)(p_rsp_buff + 1);
+ zxdh_np_hash_tbl_set(p_hash_res_init, p_hash_tbl);
+ rte_free(p_rsp_buff);
+
+ return rc;
+}
+
+static uint32_t
+zxdh_np_agent_eram_tbl_get(uint32_t dev_id, uint32_t type, ZXDH_APT_ERAM_RES_INIT_T *p_eam_res_init)
+{
+ uint32_t rc = ZXDH_OK;
+ uint32_t opr = ZXDH_ERAM_TBL_REQ;
+ uint32_t sub_type = ZXDH_RES_STD_NIC_MSG;
+ uint32_t buff_size = 0;
+ ZXDH_MUTEX_T *p_dtb_mutex = NULL;
+ uint32_t *p_rsp_buff = NULL;
+ ZXDH_NP_SE_ERAM_TBL_T *p_eram_tbl = NULL;
+ ZXDH_DEV_MUTEX_TYPE_E mutex = 0;
+
+ mutex = ZXDH_DEV_MUTEX_T_DTB;
+ rc = zxdh_np_dev_opr_mutex_get(dev_id, (uint32_t)mutex, &p_dtb_mutex);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dev_opr_mutex_get");
+
+ rc = zxdh_np_comm_mutex_lock(p_dtb_mutex);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_comm_mutex_lock");
+
+ buff_size = zxdh_np_get_se_buff_size(opr) + sizeof(uint32_t);
+ p_rsp_buff = (uint32_t *)rte_zmalloc(NULL, buff_size, 0);
+ ZXDH_COMM_CHECK_DEV_POINT_UNLOCK(dev_id, p_rsp_buff, p_dtb_mutex);
+
+ sub_type = (type == ZXDH_SE_STD_NIC_RES_TYPE) ?
+ ZXDH_RES_STD_NIC_MSG : ZXDH_RES_OFFLOAD_MSG;
+
+ rc = zxdh_np_agent_channel_se_res_get(dev_id, sub_type, opr, p_rsp_buff, buff_size);
+ if (rc != ZXDH_OK) {
+ rte_free(p_rsp_buff);
+ PMD_DRV_LOG(ERR, "eram table res get fail rc=0x%x.", rc);
+ rc = zxdh_np_comm_mutex_unlock(p_dtb_mutex);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_comm_mutex_unlock");
+ return ZXDH_ERR;
+ }
+
+ rc = zxdh_np_comm_mutex_unlock(p_dtb_mutex);
+ ZXDH_COMM_CHECK_RC_MEMORY_FREE(rc, "zxdh_np_comm_mutex_unlock", p_rsp_buff);
+
+ p_eram_tbl = (ZXDH_NP_SE_ERAM_TBL_T *)(p_rsp_buff + 1);
+ zxdh_np_eram_tbl_set(p_eam_res_init, p_eram_tbl);
+ rte_free(p_rsp_buff);
+
+ return rc;
+}
+
+static uint32_t
+zxdh_np_agent_acl_tbl_get(uint32_t dev_id, uint32_t type, ZXDH_APT_ACL_RES_INIT_T *p_acl_res_init)
+{
+ uint32_t rc = ZXDH_OK;
+ uint32_t opr = ZXDH_ACL_TBL_REQ;
+ uint32_t sub_type = ZXDH_RES_STD_NIC_MSG;
+ uint32_t buff_size = 0;
+ ZXDH_MUTEX_T *p_dtb_mutex = NULL;
+ uint32_t *p_rsp_buff = NULL;
+ ZXDH_NP_SE_ACL_TBL_T *p_acl_tbl = NULL;
+ ZXDH_DEV_MUTEX_TYPE_E mutex = 0;
+
+ mutex = ZXDH_DEV_MUTEX_T_DTB;
+ rc = zxdh_np_dev_opr_mutex_get(dev_id, (uint32_t)mutex, &p_dtb_mutex);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dev_opr_mutex_get");
+
+ rc = zxdh_np_comm_mutex_lock(p_dtb_mutex);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_comm_mutex_lock");
+
+ buff_size = zxdh_np_get_se_buff_size(opr) + sizeof(uint32_t);
+ p_rsp_buff = (uint32_t *)rte_zmalloc(NULL, buff_size, 0);
+ ZXDH_COMM_CHECK_DEV_POINT_UNLOCK(dev_id, p_rsp_buff, p_dtb_mutex);
+
+ sub_type = (type == ZXDH_SE_STD_NIC_RES_TYPE) ?
+ ZXDH_RES_STD_NIC_MSG : ZXDH_RES_OFFLOAD_MSG;
+
+ rc = zxdh_np_agent_channel_se_res_get(dev_id, sub_type, opr, p_rsp_buff, buff_size);
+ if (rc != ZXDH_OK) {
+ rte_free(p_rsp_buff);
+ PMD_DRV_LOG(ERR, "acl table res get fail rc=0x%x.", rc);
+ rc = zxdh_np_comm_mutex_unlock(p_dtb_mutex);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_comm_mutex_unlock");
+ return ZXDH_ERR;
+ }
+
+ rc = zxdh_np_comm_mutex_unlock(p_dtb_mutex);
+ ZXDH_COMM_CHECK_RC_MEMORY_FREE(rc, "zxdh_np_comm_mutex_unlock", p_rsp_buff);
+
+ p_acl_tbl = (ZXDH_NP_SE_ACL_TBL_T *)(p_rsp_buff + 1);
+ zxdh_np_acl_tbl_set(p_acl_res_init, p_acl_tbl);
+ rte_free(p_rsp_buff);
+
+ return rc;
+}
+
+static uint32_t
+zxdh_np_agent_stat_cfg_get(uint32_t dev_id,
+ uint32_t type,
+ ZXDH_APT_STAT_RES_INIT_T *p_stat_cfg_init)
+{
+ uint32_t rc = ZXDH_OK;
+ uint32_t opr = ZXDH_STAT_CFG_REQ;
+ uint32_t sub_type = ZXDH_RES_STD_NIC_MSG;
+ uint32_t buff_size = 0;
+ ZXDH_MUTEX_T *p_dtb_mutex = NULL;
+ uint32_t *p_rsp_buff = NULL;
+ ZXDH_NP_SE_STAT_CFG_T *p_stat_cfg = NULL;
+ ZXDH_DEV_MUTEX_TYPE_E mutex = 0;
+
+ mutex = ZXDH_DEV_MUTEX_T_DTB;
+ rc = zxdh_np_dev_opr_mutex_get(dev_id, (uint32_t)mutex, &p_dtb_mutex);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dev_opr_mutex_get");
+
+ rc = zxdh_np_comm_mutex_lock(p_dtb_mutex);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_comm_mutex_lock");
+
+ buff_size = zxdh_np_get_se_buff_size(opr) + sizeof(uint32_t);
+ p_rsp_buff = (uint32_t *)rte_zmalloc(NULL, buff_size, 0);
+ ZXDH_COMM_CHECK_DEV_POINT_UNLOCK(dev_id, p_rsp_buff, p_dtb_mutex);
+
+ sub_type = (type == ZXDH_SE_STD_NIC_RES_TYPE) ? ZXDH_RES_STD_NIC_MSG : ZXDH_RES_OFFLOAD_MSG;
+
+ rc = zxdh_np_agent_channel_se_res_get(dev_id, sub_type, opr, p_rsp_buff, buff_size);
+ if (rc != ZXDH_OK) {
+ rte_free(p_rsp_buff);
+ PMD_DRV_LOG(ERR, "ddr table res get fail rc = 0x%x.", rc);
+ rc = zxdh_np_comm_mutex_unlock(p_dtb_mutex);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_comm_mutex_unlock");
+ return ZXDH_ERR;
+ }
+
+ rc = zxdh_np_comm_mutex_unlock(p_dtb_mutex);
+ ZXDH_COMM_CHECK_RC_MEMORY_FREE(rc, "zxdh_np_comm_mutex_unlock", p_rsp_buff);
+
+ p_stat_cfg = (ZXDH_NP_SE_STAT_CFG_T *)(p_rsp_buff + 1);
+ zxdh_np_stat_cfg_set(p_stat_cfg_init, p_stat_cfg);
+ rte_free(p_rsp_buff);
+
+ return rc;
+}
+
+static void *
+zxdh_np_dev_get_se_res_ptr(uint32_t dev_id, uint32_t type)
+{
+ ZXDH_DEV_MGR_T *p_dev_mgr = NULL;
+ ZXDH_DEV_CFG_T *p_dev_info = NULL;
+
+ p_dev_mgr = &g_dev_mgr;
+ p_dev_info = p_dev_mgr->p_dev_array[dev_id];
+
+ if (type == ZXDH_SE_STD_NIC_RES_TYPE)
+ return (void *)&p_dev_info->dev_apt_se_tbl_res.std_nic_res;
+ else
+ return (void *)&p_dev_info->dev_apt_se_tbl_res.offload_res;
+}
+
+static uint32_t
+zxdh_np_agent_se_res_get(uint32_t dev_id, uint32_t type)
+{
+ uint32_t rc = ZXDH_OK;
+ ZXDH_APT_SE_RES_T *p_se_res = NULL;
+ ZXDH_APT_HASH_RES_INIT_T hash_res = {0};
+ ZXDH_APT_ERAM_RES_INIT_T eram_res = {0};
+ ZXDH_APT_ACL_RES_INIT_T acl_res = {0};
+
+ p_se_res = (ZXDH_APT_SE_RES_T *)zxdh_np_dev_get_se_res_ptr(dev_id, type);
+ ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_se_res);
+
+ if (p_se_res->valid) {
+ PMD_DRV_LOG(INFO, "dev_id [0x%x] res_type [%u] status ready", dev_id, type);
+ return ZXDH_OK;
+ }
+
+ hash_res.func_res = p_se_res->hash_func;
+ hash_res.bulk_res = p_se_res->hash_bulk;
+ hash_res.tbl_res = p_se_res->hash_tbl;
+ rc = zxdh_np_agent_hash_func_bulk_get(dev_id, type, &hash_res);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_agent_hash_func_bulk_get");
+
+ rc = zxdh_np_agent_hash_tbl_get(dev_id, type, &hash_res);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_agent_hash_tbl_get");
+ p_se_res->hash_func_num = hash_res.func_num;
+ p_se_res->hash_bulk_num = hash_res.bulk_num;
+ p_se_res->hash_tbl_num = hash_res.tbl_num;
+
+ eram_res.eram_res = p_se_res->eram_tbl;
+ rc = zxdh_np_agent_eram_tbl_get(dev_id, type, &eram_res);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_agent_eram_tbl_get");
+ p_se_res->eram_num = eram_res.tbl_num;
+
+ acl_res.acl_res = p_se_res->acl_tbl;
+ rc = zxdh_np_agent_acl_tbl_get(dev_id, type, &acl_res);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_agent_acl_tbl_get");
+ p_se_res->acl_num = acl_res.tbl_num;
+
+ rc = zxdh_np_agent_stat_cfg_get(dev_id, type, &p_se_res->stat_cfg);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_agent_stat_cfg_get");
+
+ p_se_res->valid = 1;
+ return rc;
+}
+
+uint32_t
+zxdh_np_se_res_get_and_init(uint32_t dev_id, uint32_t type)
+{
+ uint32_t rc = ZXDH_OK;
+
+ rc = zxdh_np_agent_se_res_get(dev_id, type);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_agent_se_res_get");
+
+ return rc;
+}
diff --git a/drivers/net/zxdh/zxdh_np.h b/drivers/net/zxdh/zxdh_np.h
index 4a972bed46..39e31b12f7 100644
--- a/drivers/net/zxdh/zxdh_np.h
+++ b/drivers/net/zxdh/zxdh_np.h
@@ -129,6 +129,13 @@
#define ZXDH_LISTSTACK_INVALID_INDEX (0)
#define ZXDH_LISTSTACK_MAX_ELEMENT (0x0ffffffe)
+#define ZXDH_HASH_FUNC_MAX_NUM (4)
+#define ZXDH_HASH_BULK_MAX_NUM (32)
+#define ZXDH_HASH_TABLE_MAX_NUM (38)
+#define ZXDH_ERAM_MAX_NUM (60)
+#define ZXDH_ETCAM_MAX_NUM (8)
+#define ZXDH_ETCAM_BLOCK_NUM (8)
+
/**errco code */
#define ZXDH_RC_BASE (0x1000U)
#define ZXDH_PARAMETER_CHK_BASE (ZXDH_RC_BASE | 0x200)
@@ -434,6 +441,174 @@ typedef struct dpp_sdt_soft_table_t {
ZXDH_SDT_ITEM_T sdt_array[ZXDH_DEV_SDT_ID_MAX];
} ZXDH_SDT_SOFT_TABLE_T;
+typedef enum zxdh_hash_srh_mode {
+ ZXDH_HASH_SRH_MODE_SOFT = 1,
+ ZXDH_HASH_SRH_MODE_HDW = 2,
+} ZXDH_HASH_SRH_MODE;
+
+typedef struct zxdh_hash_entry {
+ uint8_t *p_key;
+ uint8_t *p_rst;
+} ZXDH_HASH_ENTRY;
+
+typedef struct zxdh_acl_entry_ex_t {
+ uint32_t idx_val;
+ ZXDH_D_HEAD idx_list;
+ uint32_t pri;
+ uint8_t *key_data;
+ uint8_t *key_mask;
+ uint8_t *p_as_rslt;
+} ZXDH_ACL_ENTRY_EX_T;
+
+typedef uint32_t (*ZXDH_APT_ACL_ENTRY_SET_FUNC)(void *p_data, ZXDH_ACL_ENTRY_EX_T *acl_entry);
+typedef uint32_t (*ZXDH_APT_ACL_ENTRY_GET_FUNC)(void *p_data, ZXDH_ACL_ENTRY_EX_T *acl_entry);
+typedef uint32_t (*ZXDH_APT_ERAM_SET_FUNC)(void *p_data, uint32_t buf[4]);
+typedef uint32_t (*ZXDH_APT_ERAM_GET_FUNC)(void *p_data, uint32_t buf[4]);
+typedef uint32_t (*ZXDH_APT_HASH_ENTRY_SET_FUNC)(void *p_data, ZXDH_HASH_ENTRY *p_entry);
+typedef uint32_t (*ZXDH_APT_HASH_ENTRY_GET_FUNC)(void *p_data, ZXDH_HASH_ENTRY *p_entry);
+typedef int32_t (*ZXDH_KEY_CMP_FUNC)(void *p_new_key, void *p_old_key, uint32_t key_len);
+
+typedef struct zxdh_sdt_tbl_eram_t {
+ uint32_t table_type;
+ uint32_t eram_mode;
+ uint32_t eram_base_addr;
+ uint32_t eram_table_depth;
+ uint32_t eram_clutch_en;
+} ZXDH_SDT_TBL_ERAM_T;
+
+typedef struct zxdh_sdt_tbl_etcam_t {
+ uint32_t table_type;
+ uint32_t etcam_id;
+ uint32_t etcam_key_mode;
+ uint32_t etcam_table_id;
+ uint32_t no_as_rsp_mode;
+ uint32_t as_en;
+ uint32_t as_eram_baddr;
+ uint32_t as_rsp_mode;
+ uint32_t etcam_table_depth;
+ uint32_t etcam_clutch_en;
+} ZXDH_SDT_TBL_ETCAM_T;
+
+typedef struct zxdh_sdt_tbl_hash_t {
+ uint32_t table_type;
+ uint32_t hash_id;
+ uint32_t hash_table_width;
+ uint32_t key_size;
+ uint32_t hash_table_id;
+ uint32_t learn_en;
+ uint32_t keep_alive;
+ uint32_t keep_alive_baddr;
+ uint32_t rsp_mode;
+ uint32_t hash_clutch_en;
+} ZXDH_SDT_TBL_HASH_T;
+
+typedef enum zxdh_hash_ddr_width_mode_e {
+ ZXDH_DDR_WIDTH_INVALID = 0,
+ ZXDH_DDR_WIDTH_256b,
+ ZXDH_DDR_WIDTH_512b,
+} ZXDH_HASH_DDR_WIDTH_MODE;
+
+typedef struct zxdh_apt_acl_res_t {
+ uint32_t pri_mode;
+ uint32_t entry_num;
+ uint32_t block_num;
+ uint32_t block_index[ZXDH_ETCAM_BLOCK_NUM];
+} ZXDH_APT_ACL_RES_T;
+
+typedef struct zxdh_apt_hash_bulk_res_t {
+ uint32_t func_id;
+ uint32_t bulk_id;
+ uint32_t zcell_num;
+ uint32_t zreg_num;
+ uint32_t ddr_baddr;
+ uint32_t ddr_item_num;
+ ZXDH_HASH_DDR_WIDTH_MODE ddr_width_mode;
+ uint32_t ddr_crc_sel;
+ uint32_t ddr_ecc_en;
+} ZXDH_APT_HASH_BULK_RES_T;
+
+typedef struct zxdh_apt_hash_func_res_t {
+ uint32_t func_id;
+ uint32_t zblk_num;
+ uint32_t zblk_bitmap;
+ uint32_t ddr_dis;
+} ZXDH_APT_HASH_FUNC_RES_T;
+
+typedef struct zxdh_apt_eram_table_t {
+ uint32_t sdt_no;
+ ZXDH_SDT_TBL_ERAM_T eram_sdt;
+ uint32_t opr_mode;
+ uint32_t rd_mode;
+ ZXDH_APT_ERAM_SET_FUNC eram_set_func;
+ ZXDH_APT_ERAM_GET_FUNC eram_get_func;
+} ZXDH_APT_ERAM_TABLE_T;
+
+typedef struct zxdh_apt_acl_table_t {
+ uint32_t sdt_no;
+ uint32_t sdt_partner;
+ ZXDH_SDT_TBL_ETCAM_T acl_sdt;
+ ZXDH_APT_ACL_RES_T acl_res;
+ ZXDH_APT_ACL_ENTRY_SET_FUNC acl_set_func;
+ ZXDH_APT_ACL_ENTRY_GET_FUNC acl_get_func;
+} ZXDH_APT_ACL_TABLE_T;
+
+typedef struct zxdh_apt_hash_table_t {
+ uint32_t sdt_no;
+ uint32_t sdt_partner;
+ ZXDH_SDT_TBL_HASH_T hash_sdt;
+ uint32_t tbl_flag;
+ ZXDH_APT_HASH_ENTRY_SET_FUNC hash_set_func;
+ ZXDH_APT_HASH_ENTRY_GET_FUNC hash_get_func;
+} ZXDH_APT_HASH_TABLE_T;
+
+typedef struct zxdh_apt_eram_res_init_t {
+ uint32_t tbl_num;
+ ZXDH_APT_ERAM_TABLE_T *eram_res;
+} ZXDH_APT_ERAM_RES_INIT_T;
+
+typedef struct zxdh_apt_hash_res_init_t {
+ uint32_t func_num;
+ uint32_t bulk_num;
+ uint32_t tbl_num;
+ ZXDH_APT_HASH_FUNC_RES_T *func_res;
+ ZXDH_APT_HASH_BULK_RES_T *bulk_res;
+ ZXDH_APT_HASH_TABLE_T *tbl_res;
+} ZXDH_APT_HASH_RES_INIT_T;
+
+typedef struct zxdh_apt_acl_res_init_t {
+ uint32_t tbl_num;
+ ZXDH_APT_ACL_TABLE_T *acl_res;
+} ZXDH_APT_ACL_RES_INIT_T;
+
+typedef struct zxdh_apt_stat_res_init_t {
+ uint32_t eram_baddr;
+ uint32_t eram_depth;
+ uint32_t ddr_baddr;
+ uint32_t ppu_ddr_offset;
+} ZXDH_APT_STAT_RES_INIT_T;
+
+typedef struct zxdh_apt_se_res_t {
+ uint32_t valid;
+ uint32_t hash_func_num;
+ uint32_t hash_bulk_num;
+ uint32_t hash_tbl_num;
+ uint32_t eram_num;
+ uint32_t acl_num;
+ uint32_t lpm_num;
+ uint32_t ddr_num;
+ ZXDH_APT_HASH_FUNC_RES_T hash_func[ZXDH_HASH_FUNC_MAX_NUM];
+ ZXDH_APT_HASH_BULK_RES_T hash_bulk[ZXDH_HASH_BULK_MAX_NUM];
+ ZXDH_APT_HASH_TABLE_T hash_tbl[ZXDH_HASH_TABLE_MAX_NUM];
+ ZXDH_APT_ERAM_TABLE_T eram_tbl[ZXDH_ERAM_MAX_NUM];
+ ZXDH_APT_ACL_TABLE_T acl_tbl[ZXDH_ETCAM_MAX_NUM];
+ ZXDH_APT_STAT_RES_INIT_T stat_cfg;
+} ZXDH_APT_SE_RES_T;
+
+typedef struct zxdh_dev_apt_se_tbl_res_t {
+ ZXDH_APT_SE_RES_T std_nic_res;
+ ZXDH_APT_SE_RES_T offload_res;
+} ZXDH_DEV_APT_SE_TBL_RES_T;
+
typedef struct zxdh_mutex_t {
pthread_mutex_t mutex;
} ZXDH_MUTEX_T;
@@ -474,6 +649,7 @@ typedef struct dpp_dev_cfg_t {
ZXDH_DEV_READ_FUNC p_pcie_read_fun;
ZXDH_MUTEX_T dtb_mutex;
ZXDH_MUTEX_T dtb_queue_mutex[ZXDH_DTB_QUEUE_NUM_MAX];
+ ZXDH_DEV_APT_SE_TBL_RES_T dev_apt_se_tbl_res;
} ZXDH_DEV_CFG_T;
typedef struct zxdh_dev_mngr_t {
@@ -742,14 +918,6 @@ typedef struct zxdh_etcam_dump_info_t {
uint32_t tb_width;
} ZXDH_ETCAM_DUMP_INFO_T;
-typedef struct zxdh_sdt_tbl_eram_t {
- uint32_t table_type;
- uint32_t eram_mode;
- uint32_t eram_base_addr;
- uint32_t eram_table_depth;
- uint32_t eram_clutch_en;
-} ZXDH_SDT_TBL_ERAM_T;
-
typedef union zxdh_endian_u {
unsigned int a;
unsigned char b;
@@ -801,19 +969,6 @@ typedef struct zxdh_sdt_tbl_data_t {
uint32_t data_low32;
} ZXDH_SDT_TBL_DATA_T;
-typedef struct zxdh_sdt_tbl_etcam_t {
- uint32_t table_type;
- uint32_t etcam_id;
- uint32_t etcam_key_mode;
- uint32_t etcam_table_id;
- uint32_t no_as_rsp_mode;
- uint32_t as_en;
- uint32_t as_eram_baddr;
- uint32_t as_rsp_mode;
- uint32_t etcam_table_depth;
- uint32_t etcam_clutch_en;
-} ZXDH_SDT_TBL_ETCAM_T;
-
typedef struct zxdh_sdt_tbl_porttbl_t {
uint32_t table_type;
uint32_t porttbl_clutch_en;
@@ -874,6 +1029,29 @@ typedef enum zxdh_msg_dtb_oper_e {
ZXDH_QUEUE_RELEASE = 1,
} ZXDH_MSG_DTB_OPER_E;
+typedef enum zxdh_se_res_oper_e {
+ ZXDH_HASH_FUNC_BULK_REQ = 0,
+ ZXDH_HASH_TBL_REQ = 1,
+ ZXDH_ERAM_TBL_REQ = 2,
+ ZXDH_ACL_TBL_REQ = 3,
+ ZXDH_LPM_TBL_REQ = 4,
+ ZXDH_DDR_TBL_REQ = 5,
+ ZXDH_STAT_CFG_REQ = 6,
+ ZXDH_RES_REQ_MAX
+} ZXDH_MSG_SE_RES_OPER_E;
+
+typedef enum zxdh_agent_msg_res_e {
+ ZXDH_RES_STD_NIC_MSG = 0,
+ ZXDH_RES_OFFLOAD_MSG,
+ ZXDH_RES_MAX_MSG
+} MSG_RES_TYPE_E;
+
+typedef enum zxdh_se_res_type_e {
+ ZXDH_SE_STD_NIC_RES_TYPE = 0,
+ ZXDH_SE_NON_STD_NIC_RES_TYPE = 1,
+ ZXDH_SE_RES_TYPE_BUTT
+} ZXDH_SE_RES_TYPE_E;
+
typedef struct __rte_aligned(2) zxdh_version_compatible_reg_t {
uint8_t version_compatible_item;
uint8_t major;
@@ -916,6 +1094,123 @@ typedef struct __rte_aligned(2) zxdh_agent_channel_dtb_msg_t {
uint32_t queue_id;
} ZXDH_AGENT_CHANNEL_DTB_MSG_T;
+typedef struct __rte_aligned(2) zxdh_agent_se_res_msg_t {
+ uint8_t dev_id;
+ uint8_t type;
+ uint8_t sub_type;
+ uint8_t oper;
+} ZXDH_AGENT_SE_RES_MSG_T;
+
+typedef struct __rte_aligned(2) sdt_tbl_eram_t {
+ uint32_t table_type;
+ uint32_t eram_mode;
+ uint32_t eram_base_addr;
+ uint32_t eram_table_depth;
+ uint32_t eram_clutch_en;
+} ZXDH_NP_SDTTBL_ERAM_T;
+
+typedef struct __rte_aligned(2) sdt_tbl_hash_t {
+ uint32_t table_type;
+ uint32_t hash_id;
+ uint32_t hash_table_width;
+ uint32_t key_size;
+ uint32_t hash_table_id;
+ uint32_t learn_en;
+ uint32_t keep_alive;
+ uint32_t keep_alive_baddr;
+ uint32_t rsp_mode;
+ uint32_t hash_clutch_en;
+} ZXDH_NP_SDTTBL_HASH_T;
+
+typedef struct __rte_aligned(2) sdt_tbl_etcam_t {
+ uint32_t table_type;
+ uint32_t etcam_id;
+ uint32_t etcam_key_mode;
+ uint32_t etcam_table_id;
+ uint32_t no_as_rsp_mode;
+ uint32_t as_en;
+ uint32_t as_eram_baddr;
+ uint32_t as_rsp_mode;
+ uint32_t etcam_table_depth;
+ uint32_t etcam_clutch_en;
+} ZXDH_NP_SDTTBL_ETCAM_T;
+
+typedef struct __rte_aligned(2) hash_table_t {
+ uint32_t sdt_no;
+ uint32_t sdt_partner;
+ ZXDH_NP_SDTTBL_HASH_T hash_sdt;
+ uint32_t tbl_flag;
+} ZXDH_NP_HASH_TABLE_T;
+
+typedef struct __rte_aligned(2) zxdh_np_eram_table_t {
+ uint32_t sdt_no;
+ ZXDH_NP_SDTTBL_ERAM_T eram_sdt;
+ uint32_t opr_mode;
+ uint32_t rd_mode;
+} ZXDH_NP_ERAM_TABLE_T;
+
+typedef struct __rte_aligned(2) zxdh_np_acl_res_t {
+ uint32_t pri_mode;
+ uint32_t entry_num;
+ uint32_t block_num;
+ uint32_t block_index[ZXDH_ETCAM_BLOCK_NUM];
+} ZXDH_NP_ACL_RES_T;
+
+typedef struct __rte_aligned(2) zxdh_np_acl_table_t {
+ uint32_t sdt_no;
+ uint32_t sdt_partner;
+ ZXDH_NP_SDTTBL_ETCAM_T acl_sdt;
+ ZXDH_NP_ACL_RES_T acl_res;
+} ZXDH_NP_ACL_TABLE_T;
+
+typedef struct __rte_aligned(2) hash_func_res_t {
+ uint32_t func_id;
+ uint32_t zblk_num;
+ uint32_t zblk_bitmap;
+ uint32_t ddr_dis;
+} ZXDH_NP_HASH_FUNC_RES_T;
+
+typedef struct __rte_aligned(2) hash_bulk_res_t {
+ uint32_t func_id;
+ uint32_t bulk_id;
+ uint32_t zcell_num;
+ uint32_t zreg_num;
+ uint32_t ddr_baddr;
+ uint32_t ddr_item_num;
+ uint32_t ddr_width_mode;
+ uint32_t ddr_crc_sel;
+ uint32_t ddr_ecc_en;
+} ZXDH_NP_HASH_BULK_RES_T;
+
+typedef struct __rte_aligned(2) zxdh_se_hash_func_bulk_t {
+ uint32_t func_num;
+ uint32_t bulk_num;
+ ZXDH_NP_HASH_FUNC_RES_T fun[ZXDH_HASH_FUNC_MAX_NUM];
+ ZXDH_NP_HASH_BULK_RES_T bulk[ZXDH_HASH_BULK_MAX_NUM];
+} ZXDH_NP_SE_HASH_FUNC_BULK_T;
+
+typedef struct __rte_aligned(2) zxdh_se_hash_tbl_t {
+ uint32_t tbl_num;
+ ZXDH_NP_HASH_TABLE_T table[ZXDH_HASH_TABLE_MAX_NUM];
+} ZXDH_NP_SE_HASH_TBL_T;
+
+typedef struct __rte_aligned(2) zxdh_se_eram_tbl_t {
+ uint32_t tbl_num;
+ ZXDH_NP_ERAM_TABLE_T eram[ZXDH_ERAM_MAX_NUM];
+} ZXDH_NP_SE_ERAM_TBL_T;
+
+typedef struct __rte_aligned(2) zxdh_se_acl_tbl_t {
+ uint32_t tbl_num;
+ ZXDH_NP_ACL_TABLE_T acl[ZXDH_ETCAM_MAX_NUM];
+} ZXDH_NP_SE_ACL_TBL_T;
+
+typedef struct __rte_aligned(2) zxdh_se_stat_cfg_t {
+ uint32_t eram_baddr;
+ uint32_t eram_depth;
+ uint32_t ddr_baddr;
+ uint32_t ppu_ddr_offset;
+} ZXDH_NP_SE_STAT_CFG_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,
@@ -929,5 +1224,6 @@ int zxdh_np_dtb_stats_get(uint32_t dev_id,
ZXDH_STAT_CNT_MODE_E rd_mode,
uint32_t index,
uint32_t *p_data);
+uint32_t zxdh_np_se_res_get_and_init(uint32_t dev_id, uint32_t type);
#endif /* ZXDH_NP_H */
--
2.27.0
[-- Attachment #1.1.2: Type: text/html , Size: 68112 bytes --]
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [PATCH v1 07/14] net/zxdh: get flow tables resources
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
1 sibling, 0 replies; 32+ messages in thread
From: Stephen Hemminger @ 2025-02-10 17:35 UTC (permalink / raw)
To: Bingbin Chen; +Cc: dev
On Mon, 10 Feb 2025 09:50:10 +0800
Bingbin Chen <chen.bingbin@zte.com.cn> wrote:
> +static uint32_t
> +zxdh_np_agent_channel_se_res_get(uint32_t dev_id,
> + uint32_t sub_type,
> + uint32_t opr,
> + uint32_t *p_rsp_buff,
> + uint32_t buff_size)
> +{
> + uint32_t rc = ZXDH_OK;
> +
> + uint32_t msg_result = 0;
> + ZXDH_AGENT_SE_RES_MSG_T msgcfg = {0};
> + ZXDH_AGENT_CHANNEL_MSG_T agent_msg = {0};
> +
> + msgcfg.dev_id = 0;
> + msgcfg.type = ZXDH_RES_MSG;
> + msgcfg.sub_type = sub_type;
> + msgcfg.oper = opr;
> + agent_msg.msg = (void *)&msgcfg;
> + agent_msg.msg_len = sizeof(ZXDH_AGENT_SE_RES_MSG_T);
All this would be more readable as one initializer
ZXDH_AGENT_SE_RES_MSG_T msgcfg = {
.dev_id = 0,
.type = ZXDH_RES_MSG,
.sub_type = sub_type,
.oper = opr,
};
etc.
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [PATCH v1 07/14] net/zxdh: get flow tables resources
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
1 sibling, 0 replies; 32+ messages in thread
From: Stephen Hemminger @ 2025-02-10 17:35 UTC (permalink / raw)
To: Bingbin Chen; +Cc: dev
On Mon, 10 Feb 2025 09:50:10 +0800
Bingbin Chen <chen.bingbin@zte.com.cn> wrote:
> +static uint32_t
> +zxdh_np_get_se_buff_size(uint32_t opr)
> +{
> + uint32_t buff_size = 0;
> +
> + switch (opr) {
> + case ZXDH_HASH_FUNC_BULK_REQ:
> + {
> + buff_size = sizeof(ZXDH_NP_SE_HASH_FUNC_BULK_T);
> + break;
> + }
C does not require each case to have { }
^ permalink raw reply [flat|nested] 32+ messages in thread
* [PATCH v1 08/14] net/zxdh: support hash resources configuration
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 1:50 ` 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
` (5 subsequent siblings)
7 siblings, 1 reply; 32+ messages in thread
From: Bingbin Chen @ 2025-02-10 1:50 UTC (permalink / raw)
To: dev; +Cc: Bingbin Chen
[-- Attachment #1.1.1: Type: text/plain, Size: 35030 bytes --]
Implement the hash functions and tables configuration.
Signed-off-by: Bingbin Chen <chen.bingbin@zte.com.cn>
---
drivers/net/zxdh/zxdh_np.c | 798 +++++++++++++++++++++++++++++++++++++
drivers/net/zxdh/zxdh_np.h | 260 ++++++++++++
2 files changed, 1058 insertions(+)
diff --git a/drivers/net/zxdh/zxdh_np.c b/drivers/net/zxdh/zxdh_np.c
index 1e4b214a6e..bcae32e94e 100644
--- a/drivers/net/zxdh/zxdh_np.c
+++ b/drivers/net/zxdh/zxdh_np.c
@@ -36,6 +36,23 @@ static const char * const g_dpp_dtb_name[] = {
"DOWN TAB",
"UP TAB",
};
+ZXDH_SE_CFG *g_apt_se_cfg[ZXDH_DEV_CHANNEL_MAX];
+ZXDH_SE_CFG *dpp_se_cfg[ZXDH_DEV_CHANNEL_MAX];
+static uint16_t g_lpm_crc[ZXDH_SE_ZBLK_NUM] = {
+ 0x1021, 0x8005, 0x3D65, 0xab47, 0x3453, 0x0357, 0x0589, 0xa02b,
+ 0x1021, 0x8005, 0x3D65, 0xab47, 0x3453, 0x0357, 0x0589, 0xa02b,
+ 0x1021, 0x8005, 0x3D65, 0xab47, 0x3453, 0x0357, 0x0589, 0xa02b,
+ 0x1021, 0x8005, 0x3D65, 0xab47, 0x3453, 0x0357, 0x0589, 0xa02b
+};
+uint32_t g_hash_zblk_idx[ZXDH_DEV_CHANNEL_MAX]
+ [ZXDH_HASH_FUNC_ID_NUM]
+ [ZXDH_HASH_TBL_ID_NUM] = {0};
+static uint32_t g_ddr_hash_arg[ZXDH_HASH_DDR_CRC_NUM] = {
+ 0x04C11DB7,
+ 0xF4ACFB13,
+ 0x20044009,
+ 0x00210801
+};
ZXDH_FIELD_T g_smmu0_smmu0_cpu_ind_cmd_reg[] = {
{"cpu_ind_rw", ZXDH_FIELD_FLAG_RW, 31, 1, 0x0, 0x0},
@@ -519,6 +536,20 @@ zxdh_np_get_tn_color(ZXDH_RB_TN *p_tn)
#define ZXDH_GET_TN_COLOR(p_tn) \
zxdh_np_get_tn_color(p_tn)
+#define ZXDH_SE_GET_ZBLK_CFG(p_se, zblk_idx) \
+ (&(((ZXDH_SE_CFG *)(p_se))->zblk_info[zblk_idx]))
+
+#define GET_ZBLK_IDX(zcell_idx) \
+ (((zcell_idx) & 0x7F) >> 2)
+
+#define GET_ZCELL_IDX(zcell_idx) \
+ ((zcell_idx) & 0x3)
+
+#define ZXDH_GET_FUN_INFO(p_se, fun_id) \
+ (&(((ZXDH_SE_CFG *)(p_se))->fun_info[fun_id]))
+
+#define GET_DDR_HASH_ARG(ddr_crc_sel) (g_ddr_hash_arg[ddr_crc_sel])
+
static uint32_t
zxdh_np_comm_mutex_create(ZXDH_MUTEX_T *p_mutex)
{
@@ -840,6 +871,33 @@ zxdh_comm_double_link_insert_pre(ZXDH_D_NODE *p_newnode,
return ZXDH_OK;
}
+static uint32_t
+zxdh_comm_double_link_insert_last(ZXDH_D_NODE *p_newnode, ZXDH_D_HEAD *p_head)
+{
+ ZXDH_D_NODE *p_dnode = NULL;
+
+ RTE_ASSERT(!(!p_head->p_next && p_head->p_prev));
+ RTE_ASSERT(!(p_head->p_next && !p_head->p_prev));
+
+ p_dnode = p_head->p_prev;
+
+ if (!p_dnode) {
+ p_head->p_next = p_newnode;
+ p_head->p_prev = p_newnode;
+ p_newnode->next = NULL;
+ p_newnode->prev = NULL;
+ } else {
+ p_newnode->prev = p_dnode;
+ p_newnode->next = NULL;
+ p_head->p_prev = p_newnode;
+ p_dnode->next = p_newnode;
+ }
+
+ p_head->used++;
+
+ return ZXDH_OK;
+}
+
static uint32_t
zxdh_comm_double_link_del(ZXDH_D_NODE *delnode, ZXDH_D_HEAD *p_head)
{
@@ -865,6 +923,46 @@ zxdh_comm_double_link_del(ZXDH_D_NODE *delnode, ZXDH_D_HEAD *p_head)
return ZXDH_OK;
}
+static int32_t
+zxdh_comm_double_link_default_cmp_fuc(ZXDH_D_NODE *p_data1,
+ ZXDH_D_NODE *p_data2, __rte_unused void *p_data)
+{
+ uint32_t data1 = *(uint32_t *)p_data1->data;
+ uint32_t data2 = *(uint32_t *)p_data2->data;
+
+ if (data1 > data2)
+ return 1;
+ else if (data1 == data2)
+ return 0;
+ else
+ return -1;
+}
+
+static uint32_t
+zxdh_comm_double_link_insert_sort(ZXDH_D_NODE *p_newnode,
+ ZXDH_D_HEAD *p_head, ZXDH_CMP_FUNC cmp_fuc, void *cmp_data)
+{
+ ZXDH_D_NODE *pre_node = NULL;
+
+ if (cmp_fuc == NULL)
+ cmp_fuc = zxdh_comm_double_link_default_cmp_fuc;
+
+ if (p_head->used == 0)
+ return zxdh_comm_double_link_insert_1st(p_newnode, p_head);
+
+ pre_node = p_head->p_next;
+
+ while (pre_node != NULL) {
+ if (cmp_fuc(p_newnode, pre_node, cmp_data) <= 0)
+ return zxdh_comm_double_link_insert_pre(p_newnode,
+ pre_node, p_head);
+ else
+ pre_node = pre_node->next;
+ }
+
+ return zxdh_comm_double_link_insert_last(p_newnode, p_head);
+}
+
static int32_t
zxdh_comm_rb_def_cmp(void *p_new, void *p_old, uint32_t key_size)
{
@@ -5715,6 +5813,703 @@ zxdh_np_agent_se_res_get(uint32_t dev_id, uint32_t type)
return rc;
}
+static uint32_t
+zxdh_np_se_init_ex(uint32_t dev_id, ZXDH_SE_CFG *p_se_cfg)
+{
+ uint32_t i = 0;
+ uint32_t j = 0;
+
+ ZXDH_SE_ZBLK_CFG *p_zblk_cfg = NULL;
+ ZXDH_SE_ZCELL_CFG *p_zcell_cfg = NULL;
+
+ if (dpp_se_cfg[dev_id] != NULL) {
+ PMD_DRV_LOG(DEBUG, "SE global config is already initialized.");
+ return ZXDH_OK;
+ }
+
+ memset(p_se_cfg, 0, sizeof(ZXDH_SE_CFG));
+
+ p_se_cfg->dev_id = dev_id;
+ dpp_se_cfg[p_se_cfg->dev_id] = p_se_cfg;
+
+ p_se_cfg->p_as_rslt_wrt_fun = NULL;
+ p_se_cfg->p_client = ZXDH_COMM_VAL_TO_PTR(dev_id);
+
+ for (i = 0; i < ZXDH_SE_ZBLK_NUM; i++) {
+ p_zblk_cfg = ZXDH_SE_GET_ZBLK_CFG(p_se_cfg, i);
+
+ p_zblk_cfg->zblk_idx = i;
+ p_zblk_cfg->is_used = 0;
+ p_zblk_cfg->hash_arg = g_lpm_crc[i];
+ p_zblk_cfg->zcell_bm = 0;
+ ZXDH_INIT_D_NODE(&p_zblk_cfg->zblk_dn, p_zblk_cfg);
+
+ for (j = 0; j < ZXDH_SE_ZCELL_NUM; j++) {
+ p_zcell_cfg = &p_zblk_cfg->zcell_info[j];
+
+ p_zcell_cfg->zcell_idx = (i << 2) + j;
+ p_zcell_cfg->item_used = 0;
+ p_zcell_cfg->mask_len = 0;
+
+ ZXDH_INIT_D_NODE(&p_zcell_cfg->zcell_dn, p_zcell_cfg);
+
+ p_zcell_cfg->zcell_avl.p_key = p_zcell_cfg;
+ }
+ }
+
+ return ZXDH_OK;
+}
+
+static uint32_t
+zxdh_np_apt_hash_global_res_init(uint32_t dev_id)
+{
+ if (g_apt_se_cfg[dev_id] == NULL) {
+ g_apt_se_cfg[dev_id] = (ZXDH_SE_CFG *)rte_zmalloc(NULL, sizeof(ZXDH_SE_CFG), 0);
+ if (g_apt_se_cfg[dev_id] == NULL) {
+ PMD_DRV_LOG(ERR, "%s point null!", __func__);
+ return ZXDH_PAR_CHK_POINT_NULL;
+ }
+
+ zxdh_np_se_init_ex(dev_id, g_apt_se_cfg[dev_id]);
+
+ g_apt_se_cfg[dev_id]->p_client = ZXDH_COMM_VAL_TO_PTR(dev_id);
+ }
+
+ return ZXDH_OK;
+}
+
+static void
+se_apt_get_zblock_index(uint32_t zblock_bitmap, uint32_t *zblk_idx)
+{
+ uint32_t index0 = 0;
+ uint32_t index1 = 0;
+
+ for (index0 = 0; index0 < 32; index0++) {
+ if ((zblock_bitmap >> index0) & 0x1) {
+ *(zblk_idx + index1) = index0;
+ index1++;
+ }
+ }
+}
+
+static uint32_t
+zxdh_np_crc32_calc(uint8_t *p_input_key, uint32_t dw_byte_num, uint32_t dw_crc_poly)
+{
+ uint32_t dw_result = 0;
+ uint32_t dw_data_type = 0;
+
+ uint32_t i = 0;
+ uint32_t j = 0;
+
+ while (i < dw_byte_num) {
+ dw_data_type = (uint32_t)((dw_result & 0xff000000) ^ (p_input_key[i] << 24));
+ for (j = 0; j < 8; j++) {
+ if (dw_data_type & 0x80000000) {
+ dw_data_type <<= 1;
+ dw_data_type ^= dw_crc_poly;
+ } else {
+ dw_data_type <<= 1;
+ }
+ }
+ dw_result <<= 8;
+ dw_result ^= dw_data_type;
+
+ i++;
+ }
+
+ return dw_result;
+}
+
+static uint16_t
+zxdh_np_crc16_calc(uint8_t *p_input_key, uint32_t dw_byte_num, uint16_t dw_crc_poly)
+{
+ uint16_t dw_result = 0;
+ uint16_t dw_data_type = 0;
+
+ uint32_t i = 0;
+ uint32_t j = 0;
+
+ while (i < dw_byte_num) {
+ dw_data_type = (uint16_t)(((dw_result & 0xff00) ^ (p_input_key[i] << 8)) & 0xFFFF);
+ for (j = 0; j < 8; j++) {
+ if (dw_data_type & 0x8000) {
+ dw_data_type <<= 1;
+ dw_data_type ^= dw_crc_poly;
+ } else {
+ dw_data_type <<= 1;
+ }
+ }
+ dw_result <<= 8;
+ dw_result ^= dw_data_type;
+
+ i++;
+ }
+
+ return dw_result;
+}
+
+static uint32_t
+zxdh_np_se_fun_init(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) {
+ PMD_DRV_LOG(ERR, "Error[0x%x], fun_id [%d] is already used!",
+ ZXDH_SE_RC_FUN_INVALID, id);
+ return ZXDH_SE_RC_FUN_INVALID;
+ }
+
+ p_fun_info->fun_id = id;
+ p_fun_info->is_used = 1;
+
+ switch (fun_type) {
+ case (ZXDH_FUN_HASH):
+ {
+ p_fun_info->fun_type = ZXDH_FUN_HASH;
+ p_fun_info->fun_ptr = rte_zmalloc(NULL, sizeof(ZXDH_HASH_CFG), 0);
+ if (p_fun_info->fun_ptr == NULL) {
+ PMD_DRV_LOG(ERR, "%s point null!", __func__);
+ return ZXDH_PAR_CHK_POINT_NULL;
+ }
+ ((ZXDH_HASH_CFG *)(p_fun_info->fun_ptr))->p_se_info = p_se_cfg;
+ }
+ break;
+
+ default:
+ {
+ PMD_DRV_LOG(ERR, "Error, unrecgnized fun_type[ %d]", fun_type);
+ RTE_ASSERT(0);
+ return ZXDH_SE_RC_BASE;
+ }
+ break;
+ }
+
+ return ZXDH_OK;
+}
+
+static int32_t
+zxdh_np_hash_list_cmp(ZXDH_D_NODE *data1, ZXDH_D_NODE *data2, void *data)
+{
+ uint32_t flag = 0;
+ uint32_t data_new = 0;
+ uint32_t data_pre = 0;
+
+ flag = *(uint32_t *)data;
+
+ if (flag == ZXDH_HASH_CMP_ZCELL) {
+ data_new = ((ZXDH_SE_ZCELL_CFG *)data1->data)->zcell_idx;
+ data_pre = ((ZXDH_SE_ZCELL_CFG *)data2->data)->zcell_idx;
+ } else if (flag == ZXDH_HASH_CMP_ZBLK) {
+ data_new = ((ZXDH_SE_ZBLK_CFG *)data1->data)->zblk_idx;
+ data_pre = ((ZXDH_SE_ZBLK_CFG *)data2->data)->zblk_idx;
+ }
+
+ if (data_new > data_pre)
+ return 1;
+ else if (data_new == data_pre)
+ return 0;
+ else
+ return -1;
+}
+
+static int32_t
+zxdh_np_hash_rb_key_cmp(void *p_new, void *p_old, __rte_unused uint32_t key_size)
+{
+ ZXDH_HASH_RBKEY_INFO *p_rbkey_new = NULL;
+ ZXDH_HASH_RBKEY_INFO *p_rbkey_old = NULL;
+
+ p_rbkey_new = (ZXDH_HASH_RBKEY_INFO *)(p_new);
+ p_rbkey_old = (ZXDH_HASH_RBKEY_INFO *)(p_old);
+
+ return memcmp(p_rbkey_new->key, p_rbkey_old->key, ZXDH_HASH_KEY_MAX);
+}
+
+static int32_t
+zxdh_np_hash_ddr_cfg_rb_key_cmp(void *p_new, void *p_old, __rte_unused uint32_t key_size)
+{
+ HASH_DDR_CFG *p_rbkey_new = NULL;
+ HASH_DDR_CFG *p_rbkey_old = NULL;
+
+ p_rbkey_new = (HASH_DDR_CFG *)(p_new);
+ p_rbkey_old = (HASH_DDR_CFG *)(p_old);
+
+ return memcmp(&p_rbkey_new->ddr_baddr, &p_rbkey_old->ddr_baddr, sizeof(uint32_t));
+}
+
+static uint32_t
+zxdh_np_hash_zcam_resource_init(ZXDH_HASH_CFG *p_hash_cfg,
+ uint32_t zblk_num, uint32_t *zblk_idx_array)
+{
+ uint32_t rc = ZXDH_OK;
+
+ uint32_t i = 0;
+ uint32_t j = 0;
+ uint32_t cmp_type = 0;
+ uint32_t zblk_idx = 0;
+ uint32_t zcell_idx = 0;
+ uint32_t dev_id = 0;
+
+ ZXDH_D_HEAD *p_zblk_list = NULL;
+ ZXDH_D_HEAD *p_zcell_free = 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_zblk_list = &p_hash_cfg->hash_shareram.zblk_list;
+ rc = zxdh_comm_double_link_init(ZXDH_SE_ZBLK_NUM, p_zblk_list);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_comm_double_link_init");
+
+ p_zcell_free = &p_hash_cfg->hash_shareram.zcell_free_list;
+ rc = zxdh_comm_double_link_init(ZXDH_SE_ZBLK_NUM * ZXDH_SE_ZCELL_NUM, p_zcell_free);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_comm_double_link_init");
+
+ for (i = 0; i < zblk_num; i++) {
+ zblk_idx = zblk_idx_array[i];
+
+ p_zblk_cfg = ZXDH_SE_GET_ZBLK_CFG(p_hash_cfg->p_se_info, zblk_idx);
+
+ if (p_zblk_cfg->is_used) {
+ PMD_DRV_LOG(ERR, "ErrorCode:[0x%x],"
+ "ZBlock[%d] is already used by other function!",
+ ZXDH_HASH_RC_INVALID_ZBLCK, zblk_idx);
+ RTE_ASSERT(0);
+ return ZXDH_HASH_RC_INVALID_ZBLCK;
+ }
+
+ for (j = 0; j < ZXDH_SE_ZCELL_NUM; j++) {
+ zcell_idx = p_zblk_cfg->zcell_info[j].zcell_idx;
+ p_zcell_cfg = &(((ZXDH_SE_CFG *)(p_hash_cfg->p_se_info))->
+ zblk_info[GET_ZBLK_IDX(zcell_idx)].zcell_info[GET_ZCELL_IDX(zcell_idx)]);
+
+ if (p_zcell_cfg->is_used) {
+ PMD_DRV_LOG(ERR, "ErrorCode:[0x%x], ZBlk[%d],"
+ "ZCell[%d] is already used by other function!",
+ ZXDH_HASH_RC_INVALID_ZCELL, zblk_idx, zcell_idx);
+ RTE_ASSERT(0);
+ return ZXDH_HASH_RC_INVALID_ZCELL;
+ }
+
+ p_zcell_cfg->is_used = 1;
+
+ cmp_type = ZXDH_HASH_CMP_ZCELL;
+ rc = zxdh_comm_double_link_insert_sort(&p_zcell_cfg->zcell_dn,
+ p_zcell_free, zxdh_np_hash_list_cmp, &cmp_type);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_comm_double_link_insert_sort");
+ }
+
+ p_zblk_cfg->is_used = 1;
+ cmp_type = ZXDH_HASH_CMP_ZBLK;
+ rc = zxdh_comm_double_link_insert_sort(&p_zblk_cfg->zblk_dn,
+ p_zblk_list, zxdh_np_hash_list_cmp, &cmp_type);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_comm_double_link_insert_last");
+ }
+
+ return rc;
+}
+
+static uint32_t
+zxdh_np_hash_init(ZXDH_SE_CFG *p_se_cfg,
+ uint32_t fun_id,
+ uint32_t zblk_num,
+ uint32_t *zblk_idx,
+ uint32_t ddr_dis)
+{
+ uint32_t rc = ZXDH_OK;
+
+ uint32_t i = 0;
+ uint32_t dev_id = 0;
+
+ ZXDH_FUNC_ID_INFO *p_func_info = NULL;
+ ZXDH_HASH_CFG *p_hash_cfg = NULL;
+
+ dev_id = p_se_cfg->dev_id;
+
+ rc = zxdh_np_se_fun_init(p_se_cfg, (fun_id & 0xff), ZXDH_FUN_HASH);
+ if (rc == ZXDH_SE_RC_FUN_INVALID)
+ return ZXDH_OK;
+
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_se_fun_init");
+
+ p_func_info = ZXDH_GET_FUN_INFO(p_se_cfg, fun_id);
+ p_hash_cfg = (ZXDH_HASH_CFG *)p_func_info->fun_ptr;
+ p_hash_cfg->fun_id = fun_id;
+ p_hash_cfg->p_hash32_fun = zxdh_np_crc32_calc;
+ p_hash_cfg->p_hash16_fun = zxdh_np_crc16_calc;
+ p_hash_cfg->p_se_info = p_se_cfg;
+
+ if (ddr_dis == 1)
+ p_hash_cfg->ddr_valid = 0;
+ else
+ p_hash_cfg->ddr_valid = 1;
+
+ p_hash_cfg->hash_stat.zblock_num = zblk_num;
+ rc = zxdh_np_hash_zcam_resource_init(p_hash_cfg, zblk_num, zblk_idx);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_hash_zcam_resource_init");
+
+ for (i = 0; i < zblk_num; i++)
+ p_hash_cfg->hash_stat.zblock_array[i] = zblk_idx[i];
+
+ rc = (uint32_t)zxdh_comm_rb_init(&p_hash_cfg->hash_rb,
+ 0,
+ sizeof(ZXDH_HASH_RBKEY_INFO),
+ zxdh_np_hash_rb_key_cmp);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_comm_rb_init");
+
+ rc = (uint32_t)zxdh_comm_rb_init(&p_hash_cfg->ddr_cfg_rb,
+ 0,
+ sizeof(HASH_DDR_CFG),
+ zxdh_np_hash_ddr_cfg_rb_key_cmp);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_comm_rb_init");
+
+ for (i = 0; i < zblk_num; i++)
+ g_hash_zblk_idx[dev_id][fun_id][i] = zblk_idx[i];
+
+ return rc;
+}
+
+static uint32_t
+zxdh_np_apt_hash_func_res_init(uint32_t dev_id, uint32_t func_num,
+ ZXDH_APT_HASH_FUNC_RES_T *p_hash_func_res)
+{
+ uint32_t rc = ZXDH_OK;
+ uint32_t index = 0;
+ uint32_t zblk_idx[32] = {0};
+ ZXDH_APT_HASH_FUNC_RES_T *p_hash_func_res_temp = NULL;
+ ZXDH_SE_CFG *p_se_cfg = NULL;
+
+ p_se_cfg = g_apt_se_cfg[dev_id];
+
+ for (index = 0; index < func_num; index++) {
+ memset(zblk_idx, 0, sizeof(zblk_idx));
+ p_hash_func_res_temp = p_hash_func_res + index;
+ ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_hash_func_res_temp);
+
+ se_apt_get_zblock_index(p_hash_func_res_temp->zblk_bitmap, zblk_idx);
+
+ rc = zxdh_np_hash_init(p_se_cfg,
+ p_hash_func_res_temp->func_id,
+ p_hash_func_res_temp->zblk_num,
+ zblk_idx,
+ p_hash_func_res_temp->ddr_dis);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_hash_init");
+ }
+
+ return rc;
+}
+
+static uint32_t
+zxdh_np_hash_bulk_init(ZXDH_SE_CFG *p_se_cfg,
+ uint32_t fun_id,
+ uint32_t bulk_id,
+ ZXDH_HASH_DDR_RESC_CFG_T *p_ddr_resc_cfg,
+ uint32_t zcell_num,
+ uint32_t zreg_num)
+{
+ uint32_t rc = ZXDH_OK;
+
+ uint32_t i = 0;
+ uint32_t j = 0;
+ uint32_t zblk_idx = 0;
+ uint32_t dev_id = 0;
+ uint32_t ddr_item_num = 0;
+
+ ZXDH_D_NODE *p_zblk_dn = NULL;
+ ZXDH_D_NODE *p_zcell_dn = NULL;
+ ZXDH_RB_TN *p_rb_tn_new = NULL;
+ ZXDH_RB_TN *p_rb_tn_rtn = NULL;
+ ZXDH_SE_ZBLK_CFG *p_zblk_cfg = NULL;
+ ZXDH_SE_ZREG_CFG *p_zreg_cfg = NULL;
+ HASH_DDR_CFG *p_ddr_cfg = NULL;
+ HASH_DDR_CFG *p_rbkey_new = NULL;
+ HASH_DDR_CFG *p_rbkey_rtn = NULL;
+ ZXDH_SE_ZCELL_CFG *p_zcell_cfg = NULL;
+ ZXDH_HASH_CFG *p_hash_cfg = NULL;
+ ZXDH_FUNC_ID_INFO *p_func_info = NULL;
+ ZXDH_SE_ITEM_CFG **p_item_array = NULL;
+ ZXDH_HASH_BULK_ZCAM_STAT *p_bulk_zcam_mono = NULL;
+
+ dev_id = p_se_cfg->dev_id;
+
+ p_func_info = ZXDH_GET_FUN_INFO(p_se_cfg, fun_id);
+ p_hash_cfg = (ZXDH_HASH_CFG *)p_func_info->fun_ptr;
+ if (p_hash_cfg == NULL) {
+ PMD_DRV_LOG(ERR, "p_hash_cfg point null!");
+ return ZXDH_PAR_CHK_POINT_NULL;
+ }
+
+ if (p_hash_cfg->hash_stat.p_bulk_zcam_mono[bulk_id] != NULL) {
+ PMD_DRV_LOG(ERR, "fun_id[%u] bulk_id[%u] is already init,"
+ "do not init again!", fun_id, bulk_id);
+ return ZXDH_OK;
+ }
+
+ PMD_DRV_LOG(DEBUG, "p_hash_cfg->ddr_valid = %d!", p_hash_cfg->ddr_valid);
+ if (p_hash_cfg->ddr_valid == 1) {
+ ddr_item_num = p_ddr_resc_cfg->ddr_item_num;
+ if (ZXDH_DDR_WIDTH_512b == p_ddr_resc_cfg->ddr_width_mode)
+ ddr_item_num = p_ddr_resc_cfg->ddr_item_num >> 1;
+
+ p_rbkey_new = (HASH_DDR_CFG *)rte_zmalloc(NULL, sizeof(HASH_DDR_CFG), 0);
+ if (p_rbkey_new == NULL) {
+ PMD_DRV_LOG(ERR, "%s point null!", __func__);
+ return ZXDH_PAR_CHK_POINT_NULL;
+ }
+
+ p_rbkey_new->ddr_baddr = p_ddr_resc_cfg->ddr_baddr;
+
+ p_rb_tn_new = (ZXDH_RB_TN *)rte_zmalloc(NULL, sizeof(ZXDH_RB_TN), 0);
+ if (p_rb_tn_new == NULL) {
+ rte_free(p_rbkey_new);
+ PMD_DRV_LOG(ERR, "ICM %s:%d[Error:POINT NULL] !"
+ "FUNCTION : %s!", __FILE__, __LINE__, __func__);
+ return ZXDH_PAR_CHK_POINT_NULL;
+ }
+ ZXDH_INIT_RBT_TN(p_rb_tn_new, p_rbkey_new);
+
+ rc = zxdh_comm_rb_insert(&p_hash_cfg->ddr_cfg_rb,
+ (void *)p_rb_tn_new, (void *)(&p_rb_tn_rtn));
+ if (rc == ZXDH_RBT_RC_FULL) {
+ PMD_DRV_LOG(ERR, "The red black tree is full!");
+ rte_free(p_rbkey_new);
+ rte_free(p_rb_tn_new);
+ RTE_ASSERT(0);
+ return ZXDH_HASH_RC_RB_TREE_FULL;
+ } else if (rc == ZXDH_RBT_RC_UPDATE) {
+ PMD_DRV_LOG(DEBUG, "some bulk_id share one bulk!");
+
+ ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_rb_tn_rtn);
+ p_rbkey_rtn = (HASH_DDR_CFG *)(p_rb_tn_rtn->p_key);
+
+ p_ddr_cfg = p_hash_cfg->p_bulk_ddr_info[p_rbkey_rtn->bulk_id];
+
+ if (p_ddr_cfg->hash_ddr_arg !=
+ GET_DDR_HASH_ARG(p_ddr_resc_cfg->ddr_crc_sel) ||
+ p_ddr_cfg->width_mode != p_ddr_resc_cfg->ddr_width_mode ||
+ p_ddr_cfg->ddr_ecc_en != p_ddr_resc_cfg->ddr_ecc_en ||
+ p_ddr_cfg->item_num != ddr_item_num) {
+ PMD_DRV_LOG(ERR, "The base address is same but other ddr attribute is different");
+ rte_free(p_rbkey_new);
+ rte_free(p_rb_tn_new);
+ RTE_ASSERT(0);
+ return ZXDH_HASH_RC_INVALID_PARA;
+ }
+
+ p_hash_cfg->p_bulk_ddr_info[bulk_id] =
+ p_hash_cfg->p_bulk_ddr_info[p_rbkey_rtn->bulk_id];
+
+ rte_free(p_rbkey_new);
+ rte_free(p_rb_tn_new);
+ } else {
+ p_item_array = (ZXDH_SE_ITEM_CFG **)rte_zmalloc(NULL, ddr_item_num *
+ sizeof(ZXDH_SE_ITEM_CFG *), 0);
+ if (NULL == (p_item_array)) {
+ rte_free(p_rbkey_new);
+ rte_free(p_rb_tn_new);
+ PMD_DRV_LOG(ERR, "ICM %s:%d[Error:POINT NULL] !"
+ "FUNCTION : %s!", __FILE__, __LINE__, __func__);
+ return ZXDH_PAR_CHK_POINT_NULL;
+ }
+
+ p_rbkey_new->p_item_array = p_item_array;
+ p_rbkey_new->bulk_id = bulk_id;
+ p_rbkey_new->hw_baddr = 0;
+ p_rbkey_new->width_mode = p_ddr_resc_cfg->ddr_width_mode;
+ p_rbkey_new->item_num = ddr_item_num;
+ p_rbkey_new->ddr_ecc_en = p_ddr_resc_cfg->ddr_ecc_en;
+ p_rbkey_new->hash_ddr_arg = GET_DDR_HASH_ARG(p_ddr_resc_cfg->ddr_crc_sel);
+ p_rbkey_new->bulk_use = 1;
+ p_rbkey_new->zcell_num = zcell_num;
+ p_rbkey_new->zreg_num = zreg_num;
+ p_hash_cfg->p_bulk_ddr_info[bulk_id] = p_rbkey_new;
+
+ PMD_DRV_LOG(DEBUG, "one new ddr_bulk init!");
+ }
+ }
+
+ p_bulk_zcam_mono = (ZXDH_HASH_BULK_ZCAM_STAT *)rte_zmalloc(NULL,
+ sizeof(ZXDH_HASH_BULK_ZCAM_STAT), 0);
+ if (NULL == (p_bulk_zcam_mono)) {
+ rte_free(p_rbkey_new);
+ rte_free(p_rb_tn_new);
+ rte_free(p_item_array);
+ PMD_DRV_LOG(ERR, "ICM %s:%d[Error:POINT NULL] ! FUNCTION"
+ ": %s!", __FILE__, __LINE__, __func__);
+ return ZXDH_PAR_CHK_POINT_NULL;
+ }
+ (&p_hash_cfg->hash_stat)->p_bulk_zcam_mono[bulk_id] = p_bulk_zcam_mono;
+
+ for (i = 0; i < ZXDH_SE_ZBLK_NUM * ZXDH_SE_ZCELL_NUM; i++)
+ p_bulk_zcam_mono->zcell_mono_idx[i] = 0xffffffff;
+
+ for (i = 0; i < ZXDH_SE_ZBLK_NUM; i++) {
+ for (j = 0; j < ZXDH_SE_ZREG_NUM; j++) {
+ p_bulk_zcam_mono->zreg_mono_id[i][j].zblk_id = 0xffffffff;
+ p_bulk_zcam_mono->zreg_mono_id[i][j].zreg_id = 0xffffffff;
+ }
+ }
+
+ if (zcell_num > 0) {
+ p_hash_cfg->bulk_ram_mono[bulk_id] = 1;
+
+ p_zcell_dn = p_hash_cfg->hash_shareram.zcell_free_list.p_next;
+
+ i = 0;
+
+ while (p_zcell_dn) {
+ p_zcell_cfg = (ZXDH_SE_ZCELL_CFG *)p_zcell_dn->data;
+
+ if (p_zcell_cfg->is_used) {
+ if (!(p_zcell_cfg->flag & ZXDH_ZCELL_FLAG_IS_MONO)) {
+ p_zcell_cfg->flag |= ZXDH_ZCELL_FLAG_IS_MONO;
+ p_zcell_cfg->bulk_id = bulk_id;
+
+ p_bulk_zcam_mono->zcell_mono_idx[p_zcell_cfg->zcell_idx] =
+ p_zcell_cfg->zcell_idx;
+
+ if (++i >= zcell_num)
+ break;
+ }
+ } else {
+ PMD_DRV_LOG(ERR, "zcell[ %d ] is not init before"
+ " used!", p_zcell_cfg->zcell_idx);
+ RTE_ASSERT(0);
+ return ZXDH_HASH_RC_INVALID_PARA;
+ }
+
+ p_zcell_dn = p_zcell_dn->next;
+ }
+
+ if (i < zcell_num)
+ PMD_DRV_LOG(ERR, "Input param 'zcell_num' is [ %d ],"
+ "actually bulk[ %d ]monopolize zcells is [ %d ]!",
+ zcell_num, bulk_id, i);
+ }
+
+ if (zreg_num > 0) {
+ p_hash_cfg->bulk_ram_mono[bulk_id] = 1;
+
+ p_zblk_dn = p_hash_cfg->hash_shareram.zblk_list.p_next;
+ j = 0;
+
+ while (p_zblk_dn) {
+ p_zblk_cfg = (ZXDH_SE_ZBLK_CFG *)p_zblk_dn->data;
+ zblk_idx = p_zblk_cfg->zblk_idx;
+
+ if (p_zblk_cfg->is_used) {
+ for (i = 0; i < ZXDH_SE_ZREG_NUM; i++) {
+ p_zreg_cfg = &p_zblk_cfg->zreg_info[i];
+
+ if (!(p_zreg_cfg->flag & ZXDH_ZREG_FLAG_IS_MONO)) {
+ p_zreg_cfg->flag = ZXDH_ZREG_FLAG_IS_MONO;
+ p_zreg_cfg->bulk_id = bulk_id;
+
+ p_bulk_zcam_mono->zreg_mono_id[zblk_idx][i].zblk_id =
+ zblk_idx;
+ p_bulk_zcam_mono->zreg_mono_id[zblk_idx][i].zreg_id = i;
+
+ if (++j >= zreg_num)
+ break;
+ }
+ }
+
+ if (j >= zreg_num)
+ break;
+ } else {
+ PMD_DRV_LOG(ERR, "zblk [ %d ] is not init"
+ " before used!", p_zblk_cfg->zblk_idx);
+ RTE_ASSERT(0);
+ return ZXDH_HASH_RC_INVALID_PARA;
+ }
+
+ p_zblk_dn = p_zblk_dn->next;
+ }
+
+ if (j < zreg_num)
+ PMD_DRV_LOG(ERR, "Input param 'zreg_num' is [ %d ],"
+ "actually bulk[ %d ]monopolize zregs is [ %d ]!",
+ zreg_num, bulk_id, j);
+ }
+
+ return ZXDH_OK;
+}
+
+static uint32_t
+zxdh_np_apt_hash_bulk_res_init(uint32_t dev_id, uint32_t bulk_num,
+ ZXDH_APT_HASH_BULK_RES_T *p_bulk_res)
+{
+ uint32_t rc = ZXDH_OK;
+ uint32_t index = 0;
+ ZXDH_APT_HASH_BULK_RES_T *p_hash_bulk_res_temp = NULL;
+ ZXDH_HASH_DDR_RESC_CFG_T ddr_resc_cfg = {0};
+ ZXDH_SE_CFG *p_se_cfg = NULL;
+
+ p_se_cfg = g_apt_se_cfg[dev_id];
+
+ for (index = 0; index < bulk_num; index++) {
+ memset(&ddr_resc_cfg, 0, sizeof(ZXDH_HASH_DDR_RESC_CFG_T));
+ p_hash_bulk_res_temp = p_bulk_res + index;
+ ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_hash_bulk_res_temp);
+
+ ddr_resc_cfg.ddr_baddr = p_hash_bulk_res_temp->ddr_baddr;
+ ddr_resc_cfg.ddr_item_num = p_hash_bulk_res_temp->ddr_item_num;
+ ddr_resc_cfg.ddr_width_mode = p_hash_bulk_res_temp->ddr_width_mode;
+ ddr_resc_cfg.ddr_crc_sel = p_hash_bulk_res_temp->ddr_crc_sel;
+ ddr_resc_cfg.ddr_ecc_en = p_hash_bulk_res_temp->ddr_ecc_en;
+
+ rc = zxdh_np_hash_bulk_init(p_se_cfg,
+ p_hash_bulk_res_temp->func_id,
+ p_hash_bulk_res_temp->bulk_id,
+ &ddr_resc_cfg,
+ p_hash_bulk_res_temp->zcell_num,
+ p_hash_bulk_res_temp->zreg_num);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_hash_bulk_init");
+ }
+
+ return rc;
+}
+
+static uint32_t
+zxdh_np_se_res_init(uint32_t dev_id, uint32_t type)
+{
+ uint32_t rc = ZXDH_OK;
+ ZXDH_APT_SE_RES_T *p_se_res = NULL;
+ ZXDH_APT_HASH_RES_INIT_T hash_res_init = {0};
+
+ p_se_res = (ZXDH_APT_SE_RES_T *)zxdh_np_dev_get_se_res_ptr(dev_id, type);
+ if (!p_se_res->valid) {
+ PMD_DRV_LOG(ERR, "%s dev_id[0x%x],se_type[0x%x] invlaid!",
+ __func__, dev_id, type);
+ return ZXDH_ERR;
+ }
+
+ hash_res_init.func_num = p_se_res->hash_func_num;
+ hash_res_init.bulk_num = p_se_res->hash_bulk_num;
+ hash_res_init.func_res = p_se_res->hash_func;
+ hash_res_init.bulk_res = p_se_res->hash_bulk;
+
+ rc = zxdh_np_apt_hash_global_res_init(dev_id);
+ ZXDH_COMM_CHECK_RC(rc, "zxdh_np_apt_hash_global_res_init");
+
+ if (hash_res_init.func_num) {
+ rc = zxdh_np_apt_hash_func_res_init(dev_id, hash_res_init.func_num,
+ hash_res_init.func_res);
+ ZXDH_COMM_CHECK_RC(rc, "zxdh_np_apt_hash_func_res_init");
+ }
+
+ if (hash_res_init.bulk_num) {
+ rc = zxdh_np_apt_hash_bulk_res_init(dev_id, hash_res_init.bulk_num,
+ hash_res_init.bulk_res);
+ ZXDH_COMM_CHECK_RC(rc, "zxdh_np_apt_hash_bulk_res_init");
+ }
+
+ return rc;
+}
+
uint32_t
zxdh_np_se_res_get_and_init(uint32_t dev_id, uint32_t type)
{
@@ -5723,5 +6518,8 @@ zxdh_np_se_res_get_and_init(uint32_t dev_id, uint32_t type)
rc = zxdh_np_agent_se_res_get(dev_id, type);
ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_agent_se_res_get");
+ rc = zxdh_np_se_res_init(dev_id, type);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_se_res_init");
+
return rc;
}
diff --git a/drivers/net/zxdh/zxdh_np.h b/drivers/net/zxdh/zxdh_np.h
index 39e31b12f7..31d4af2c05 100644
--- a/drivers/net/zxdh/zxdh_np.h
+++ b/drivers/net/zxdh/zxdh_np.h
@@ -136,6 +136,43 @@
#define ZXDH_ETCAM_MAX_NUM (8)
#define ZXDH_ETCAM_BLOCK_NUM (8)
+#define ZXDH_SE_RAM_DEPTH (512)
+#define ZXDH_SE_ZCELL_NUM (4)
+#define ZXDH_SE_ZREG_NUM (4)
+#define ZXDH_SE_ALG_BANK_NUM (29)
+#define ZXDH_SE_ZBLK_NUM (32)
+#define ZXDH_MAX_FUN_NUM (8)
+#define ZXDH_HASH_KEY_MAX (49)
+#define ZXDH_HASH_RST_MAX (32)
+#define ZXDH_HASH_TBL_ID_NUM (32)
+#define ZXDH_HASH_BULK_NUM (8)
+#define ZXDH_HASH_CMP_ZCELL (1)
+#define ZXDH_HASH_CMP_ZBLK (2)
+#define ZXDH_HASH_FUNC_ID_NUM (4)
+#define ZXDH_ZCELL_FLAG_IS_MONO (1)
+#define ZXDH_ZREG_FLAG_IS_MONO (1)
+#define ZXDH_HASH_DDR_CRC_NUM (4)
+#define ZXDH_HASH_TBL_FLAG_AGE (1 << 0)
+#define ZXDH_HASH_TBL_FLAG_LEARN (1 << 1)
+#define ZXDH_HASH_TBL_FLAG_MC_WRT (1 << 2)
+#define ZXDH_HASH_ACTU_KEY_STEP (1)
+#define ZXDH_HASH_KEY_CTR_SIZE (1)
+#define ZXDH_ZCELL_IDX_BT_WIDTH (2)
+#define ZXDH_ZBLK_IDX_BT_WIDTH (3)
+#define ZXDH_ZGRP_IDX_BT_WIDTH (2)
+#define ZXDH_HASH_ENTRY_POS_STEP (16)
+#define ZXDH_HASH_TBL_ID_NUM (32)
+#define ZXDH_SE_ITEM_WIDTH_MAX (64)
+#define ZXDH_SE_ENTRY_WIDTH_MAX (64)
+#define ZXDH_REG_SRAM_FLAG_BT_START (16)
+#define ZXDH_ZBLK_NUM_PER_ZGRP (8)
+#define ZXDH_ZBLK_IDX_BT_START (11)
+#define ZXDH_ZBLK_WRT_MASK_BT_START (17)
+#define ZXDH_ZCELL_ADDR_BT_WIDTH (9)
+
+#define ZXDH_COMM_PTR_TO_VAL(p) ((uint64_t)(p))
+#define ZXDH_COMM_VAL_TO_PTR(v) ((void *)((uint64_t)(v)))
+
/**errco code */
#define ZXDH_RC_BASE (0x1000U)
#define ZXDH_PARAMETER_CHK_BASE (ZXDH_RC_BASE | 0x200)
@@ -249,6 +286,11 @@
#define ZXDH_HASH_RC_INVALID_ITEM_TYPE (ZXDH_SE_RC_HASH_BASE | 0x11)
#define ZXDH_HASH_RC_REPEAT_INIT (ZXDH_SE_RC_HASH_BASE | 0x12)
+#define ZXDH_SE_RC_CFG_BASE (ZXDH_SE_RC_BASE | 0x1000)
+#define ZXDH_SE_RC_ZBLK_FULL (ZXDH_SE_RC_CFG_BASE | 0x1)
+#define ZXDH_SE_RC_FUN_INVALID (ZXDH_SE_RC_CFG_BASE | 0x2)
+#define ZXDH_SE_RC_PARA_INVALID (ZXDH_SE_RC_CFG_BASE | 0x3)
+
typedef enum zxdh_module_base_addr_e {
ZXDH_MODULE_SE_SMMU0_BASE_ADDR = 0x00000000,
ZXDH_MODULE_DTB_ENQ_BASE_ADDR = 0x00000000,
@@ -377,6 +419,13 @@ typedef struct zxdh_rb_tn {
} ZXDH_RB_TN;
typedef int32_t (*ZXDH_RB_CMPFUN)(void *p_new, void *p_old, uint32_t keysize);
+typedef int32_t (*ZXDH_CMP_FUNC)(ZXDH_D_NODE *data1, ZXDH_D_NODE *data2, void*);
+typedef uint32_t (*ZXDH_WRITE32_FUN)(uint32_t dev_id, uint32_t addr, uint32_t write_data);
+typedef uint32_t (*ZXDH_READ32_FUN) (uint32_t dev_id, uint32_t addr, uint32_t *read_data);
+typedef uint32_t (*ZXDH_LPM_AS_RSLT_WRT_FUNCTION)(uint32_t dev_id,
+ uint32_t as_type, uint32_t tbl_id, uint32_t index, uint8_t *p_data);
+typedef uint16_t (*ZXDH_HASH_FUNCTION)(uint8_t *pkey, uint32_t width, uint16_t arg);
+typedef uint32_t (*ZXDH_HASH_FUNCTION32)(uint8_t *pkey, uint32_t width, uint32_t arg);
typedef struct _rb_cfg {
uint32_t key_size;
@@ -390,6 +439,217 @@ typedef struct _rb_cfg {
uint32_t is_init;
} ZXDH_RB_CFG;
+typedef enum zxdh_se_fun_type_e {
+ ZXDH_FUN_HASH = 1,
+ ZXDH_FUN_LPM,
+ ZXDH_FUN_ACL,
+ ZXDH_FUN_MAX
+} ZXDH_SE_FUN_TYPE;
+
+typedef struct zxdh_avl_node_t {
+ void *p_key;
+ uint32_t result;
+ int32_t avl_height;
+ struct zxdh_avl_node_t *p_avl_left;
+ struct zxdh_avl_node_t *p_avl_right;
+ ZXDH_D_NODE avl_node_list;
+} ZXDH_AVL_NODE;
+
+typedef struct zxdh_se_item_cfg_t {
+ ZXDH_D_HEAD item_list;
+ uint32_t item_index;
+ uint32_t hw_addr;
+ uint32_t bulk_id;
+ uint32_t item_type;
+ uint8_t wrt_mask;
+ uint8_t valid;
+ uint8_t pad[2];
+} ZXDH_SE_ITEM_CFG;
+
+typedef struct zxdh_se_zcell_cfg_t {
+ uint8_t flag;
+ uint32_t bulk_id;
+ uint32_t zcell_idx;
+ uint16_t mask_len;
+ uint8_t is_used;
+ uint8_t is_share;
+ uint32_t item_used;
+ ZXDH_SE_ITEM_CFG item_info[ZXDH_SE_RAM_DEPTH];
+ ZXDH_D_NODE zcell_dn;
+ ZXDH_AVL_NODE zcell_avl;
+} ZXDH_SE_ZCELL_CFG;
+
+typedef struct zxdh_se_zreg_cfg_t {
+ uint8_t flag;
+ uint8_t pad[3];
+ uint32_t bulk_id;
+ ZXDH_SE_ITEM_CFG item_info;
+} ZXDH_SE_ZREG_CFG;
+
+typedef struct zxdh_se_zblk_cfg_t {
+ uint32_t zblk_idx;
+ uint16_t is_used;
+ uint16_t zcell_bm;
+ uint16_t hash_arg;
+ uint16_t pad;
+ ZXDH_SE_ZCELL_CFG zcell_info[ZXDH_SE_ZCELL_NUM];
+ ZXDH_SE_ZREG_CFG zreg_info[ZXDH_SE_ZREG_NUM];
+ ZXDH_D_NODE zblk_dn;
+} ZXDH_SE_ZBLK_CFG;
+
+typedef struct zxdh_func_id_info_t {
+ void *fun_ptr;
+ uint8_t fun_type;
+ uint8_t fun_id;
+ uint8_t is_used;
+ uint8_t pad;
+} ZXDH_FUNC_ID_INFO;
+
+typedef struct zxdh_ddr_mem_t {
+ uint32_t total_num;
+ uint32_t base_addr;
+ uint32_t base_addr_offset;
+ uint32_t ecc_en;
+ uint32_t bank_num;
+ uint32_t bank_info[ZXDH_SE_ALG_BANK_NUM];
+ uint32_t share_type;
+ uint32_t item_used;
+ ZXDH_LISTSTACK_MANAGER *p_ddr_mng;
+} ZXDH_DDR_MEM;
+
+typedef struct zxdh_share_ram_t {
+ uint32_t zblk_array[ZXDH_SE_ZBLK_NUM];
+ ZXDH_D_HEAD zblk_list;
+ ZXDH_D_HEAD zcell_free_list;
+ uint32_t def_route_num;
+ ZXDH_RB_CFG def_rb;
+ struct def_route_info *p_dr_info;
+ ZXDH_DDR_MEM ddr4_info;
+ ZXDH_DDR_MEM ddr6_info;
+} ZXDH_SHARE_RAM;
+
+typedef struct zxdh_se_cfg_t {
+ ZXDH_SE_ZBLK_CFG zblk_info[ZXDH_SE_ZBLK_NUM];
+ ZXDH_FUNC_ID_INFO fun_info[ZXDH_MAX_FUN_NUM];
+ ZXDH_SHARE_RAM route_shareram;
+ uint32_t reg_base;
+ ZXDH_WRITE32_FUN p_write32_fun;
+ ZXDH_READ32_FUN p_read32_fun;
+ uint32_t lpm_flags;
+ void *p_client;
+ uint32_t dev_id;
+ ZXDH_LPM_AS_RSLT_WRT_FUNCTION p_as_rslt_wrt_fun;
+} ZXDH_SE_CFG;
+
+typedef struct hash_ddr_cfg_t {
+ uint32_t bulk_use;
+ uint32_t ddr_baddr;
+ uint32_t ddr_ecc_en;
+ uint32_t item_num;
+ uint32_t bulk_id;
+ uint32_t hash_ddr_arg;
+ uint32_t width_mode;
+ uint32_t hw_baddr;
+ uint32_t zcell_num;
+ uint32_t zreg_num;
+ ZXDH_SE_ITEM_CFG **p_item_array;
+} HASH_DDR_CFG;
+
+typedef struct zxdh_hash_tbl_info_t {
+ uint32_t fun_id;
+ uint32_t actu_key_size;
+ uint32_t key_type;
+ uint8_t is_init;
+ uint8_t mono_zcell;
+ uint8_t zcell_num;
+ uint8_t mono_zreg;
+ uint8_t zreg_num;
+ uint8_t is_age;
+ uint8_t is_lrn;
+ uint8_t is_mc_wrt;
+} ZXDH_HASH_TBL_ID_INFO;
+
+typedef struct zxdh_hash_rbkey_info_t {
+ uint8_t key[ZXDH_HASH_KEY_MAX];
+ uint8_t rst[ZXDH_HASH_RST_MAX];
+ ZXDH_D_NODE entry_dn;
+ ZXDH_SE_ITEM_CFG *p_item_info;
+ uint32_t entry_size;
+ uint32_t entry_pos;
+} ZXDH_HASH_RBKEY_INFO;
+
+typedef struct zxdh_hash_table_stat_t {
+ float ddr;
+ float zcell;
+ float zreg;
+ float sum;
+} ZXDH_HASH_TABLE_STAT;
+
+typedef struct zxdh_hash_zreg_mono_stat_t {
+ uint32_t zblk_id;
+ uint32_t zreg_id;
+} ZXDH_HASH_ZREG_MONO_STAT;
+
+typedef struct zxdh_hash_bulk_zcam_stat_t {
+ uint32_t zcell_mono_idx[ZXDH_SE_ZBLK_NUM * ZXDH_SE_ZCELL_NUM];
+ ZXDH_HASH_ZREG_MONO_STAT zreg_mono_id[ZXDH_SE_ZBLK_NUM][ZXDH_SE_ZREG_NUM];
+} ZXDH_HASH_BULK_ZCAM_STAT;
+
+typedef struct zxdh_hash_stat_t {
+ uint32_t insert_ok;
+ uint32_t insert_fail;
+ uint32_t insert_same;
+ uint32_t insert_ddr;
+ uint32_t insert_zcell;
+ uint32_t insert_zreg;
+ uint32_t delete_ok;
+ uint32_t delete_fail;
+ uint32_t search_ok;
+ uint32_t search_fail;
+ uint32_t zblock_num;
+ uint32_t zblock_array[ZXDH_SE_ZBLK_NUM];
+ ZXDH_HASH_TABLE_STAT insert_table[ZXDH_HASH_TBL_ID_NUM];
+ ZXDH_HASH_BULK_ZCAM_STAT *p_bulk_zcam_mono[ZXDH_HASH_BULK_NUM];
+} ZXDH_HASH_STAT;
+
+typedef struct zxdh_hash_cfg_t {
+ uint32_t fun_id;
+ uint8_t ddr_valid;
+ uint8_t pad[3];
+ ZXDH_HASH_FUNCTION32 p_hash32_fun;
+ ZXDH_HASH_FUNCTION p_hash16_fun;
+ HASH_DDR_CFG *p_bulk_ddr_info[ZXDH_HASH_BULK_NUM];
+ uint8_t bulk_ram_mono[ZXDH_HASH_BULK_NUM];
+ ZXDH_SHARE_RAM hash_shareram;
+ ZXDH_SE_CFG *p_se_info;
+ ZXDH_RB_CFG hash_rb;
+ ZXDH_RB_CFG ddr_cfg_rb;
+ ZXDH_HASH_STAT hash_stat;
+} ZXDH_HASH_CFG;
+
+typedef struct hash_entry_cfg_t {
+ uint32_t fun_id;
+ uint8_t bulk_id;
+ uint8_t table_id;
+ uint8_t key_type;
+ uint8_t rsp_mode;
+ uint32_t actu_key_size;
+ uint32_t key_by_size;
+ uint32_t rst_by_size;
+ ZXDH_SE_CFG *p_se_cfg;
+ ZXDH_HASH_CFG *p_hash_cfg;
+ ZXDH_HASH_RBKEY_INFO *p_rbkey_new;
+ ZXDH_RB_TN *p_rb_tn_new;
+} HASH_ENTRY_CFG;
+
+typedef struct zxdh_hash_ddr_resc_cfg_t {
+ uint32_t ddr_width_mode;
+ uint32_t ddr_crc_sel;
+ uint32_t ddr_item_num;
+ uint32_t ddr_baddr;
+ uint32_t ddr_ecc_en;
+} ZXDH_HASH_DDR_RESC_CFG_T;
+
typedef struct zxdh_dtb_tab_up_user_addr_t {
uint32_t user_flag;
uint64_t phy_addr;
--
2.27.0
[-- Attachment #1.1.2: Type: text/html , Size: 90949 bytes --]
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [PATCH v1 08/14] net/zxdh: support hash resources configuration
2025-02-10 1:50 ` [PATCH v1 08/14] net/zxdh: support hash resources configuration Bingbin Chen
@ 2025-02-10 17:36 ` Stephen Hemminger
0 siblings, 0 replies; 32+ messages in thread
From: Stephen Hemminger @ 2025-02-10 17:36 UTC (permalink / raw)
To: Bingbin Chen; +Cc: dev
On Mon, 10 Feb 2025 09:50:11 +0800
Bingbin Chen <chen.bingbin@zte.com.cn> wrote:
> +static uint16_t g_lpm_crc[ZXDH_SE_ZBLK_NUM] = {
> + 0x1021, 0x8005, 0x3D65, 0xab47, 0x3453, 0x0357, 0x0589, 0xa02b,
> + 0x1021, 0x8005, 0x3D65, 0xab47, 0x3453, 0x0357, 0x0589, 0xa02b,
> + 0x1021, 0x8005, 0x3D65, 0xab47, 0x3453, 0x0357, 0x0589, 0xa02b,
> + 0x1021, 0x8005, 0x3D65, 0xab47, 0x3453, 0x0357, 0x0589, 0xa02b
> +};
> +uint32_t g_hash_zblk_idx[ZXDH_DEV_CHANNEL_MAX]
> + [ZXDH_HASH_FUNC_ID_NUM]
> + [ZXDH_HASH_TBL_ID_NUM] = {0};
> +static uint32_t g_ddr_hash_arg[ZXDH_HASH_DDR_CRC_NUM] = {
> + 0x04C11DB7,
> + 0xF4ACFB13,
> + 0x20044009,
> + 0x00210801
> +};
CRC tables should be const?
^ permalink raw reply [flat|nested] 32+ messages in thread
* [PATCH v1 09/14] net/zxdh: implement tables initialization
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 1:50 ` [PATCH v1 08/14] net/zxdh: support hash resources configuration Bingbin Chen
@ 2025-02-10 1:50 ` 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
` (4 subsequent siblings)
7 siblings, 2 replies; 32+ messages in thread
From: Bingbin Chen @ 2025-02-10 1:50 UTC (permalink / raw)
To: dev; +Cc: Bingbin Chen
[-- Attachment #1.1.1: Type: text/plain, Size: 36273 bytes --]
Implement hash/eram/acl/stat tables initialization.
Signed-off-by: Bingbin Chen <chen.bingbin@zte.com.cn>
---
drivers/net/zxdh/zxdh_np.c | 713 ++++++++++++++++++++++++++++++++++++-
drivers/net/zxdh/zxdh_np.h | 187 ++++++++++
2 files changed, 895 insertions(+), 5 deletions(-)
diff --git a/drivers/net/zxdh/zxdh_np.c b/drivers/net/zxdh/zxdh_np.c
index bcae32e94e..3de6330271 100644
--- a/drivers/net/zxdh/zxdh_np.c
+++ b/drivers/net/zxdh/zxdh_np.c
@@ -23,7 +23,10 @@ ZXDH_PPU_CLS_BITMAP_T g_ppu_cls_bit_map[ZXDH_DEV_CHANNEL_MAX];
ZXDH_DTB_MGR_T *p_dpp_dtb_mgr[ZXDH_DEV_CHANNEL_MAX];
ZXDH_RISCV_DTB_MGR *p_riscv_dtb_queue_mgr[ZXDH_DEV_CHANNEL_MAX];
ZXDH_SDT_TBL_DATA_T g_sdt_info[ZXDH_DEV_CHANNEL_MAX][ZXDH_DEV_SDT_ID_MAX];
-ZXDH_PPU_STAT_CFG_T g_ppu_stat_cfg;
+ZXDH_PPU_STAT_CFG_T g_ppu_stat_cfg[ZXDH_DEV_CHANNEL_MAX];
+SE_APT_CALLBACK_T g_apt_se_callback[ZXDH_DEV_CHANNEL_MAX][ZXDH_DEV_SDT_ID_MAX];
+ZXDH_ACL_CFG_EX_T g_apt_acl_cfg[ZXDH_DEV_CHANNEL_MAX] = {0};
+ZXDH_ACL_CFG_EX_T *g_p_acl_ex_cfg[ZXDH_DEV_CHANNEL_MAX] = {NULL};
static uint64_t g_np_fw_compat_addr[ZXDH_DEV_CHANNEL_MAX];
static ZXDH_VERSION_COMPATIBLE_REG_T g_np_sdk_version = {
ZXDH_NPSDK_COMPAT_ITEM_ID, 1, 0, 0, 0, {0} };
@@ -54,6 +57,10 @@ static uint32_t g_ddr_hash_arg[ZXDH_HASH_DDR_CRC_NUM] = {
0x00210801
};
+ZXDH_HASH_TBL_ID_INFO g_tbl_id_info[ZXDH_DEV_CHANNEL_MAX]
+ [ZXDH_HASH_FUNC_ID_NUM]
+ [ZXDH_HASH_TBL_ID_NUM];
+
ZXDH_FIELD_T g_smmu0_smmu0_cpu_ind_cmd_reg[] = {
{"cpu_ind_rw", ZXDH_FIELD_FLAG_RW, 31, 1, 0x0, 0x0},
{"cpu_ind_rd_mode", ZXDH_FIELD_FLAG_RW, 30, 1, 0x0, 0x0},
@@ -550,6 +557,49 @@ zxdh_np_get_tn_color(ZXDH_RB_TN *p_tn)
#define GET_DDR_HASH_ARG(ddr_crc_sel) (g_ddr_hash_arg[ddr_crc_sel])
+#define ZXDH_SDT_GET_LOW_DATA(source_value, low_width) \
+ ((source_value) & ((1 << (low_width)) - 1))
+
+#define ZXDH_ACL_AS_RSLT_SIZE_GET_EX(mode) (2U << (mode))
+
+#define ZXDH_GET_ACTU_KEY_BY_SIZE(actu_key_size) \
+ ((actu_key_size) * ZXDH_HASH_ACTU_KEY_STEP)
+
+#define ZXDH_GET_KEY_SIZE(actu_key_size) \
+ (ZXDH_GET_ACTU_KEY_BY_SIZE(actu_key_size) + ZXDH_HASH_KEY_CTR_SIZE)
+
+#define ZXDH_ACL_ENTRY_MAX_GET(key_mode, block_num) \
+ ((block_num) * ZXDH_ETCAM_RAM_DEPTH * (1U << (key_mode)))
+
+#define ZXDH_ETCAM_ENTRY_SIZE_GET(entry_mode) \
+ ((ZXDH_ETCAM_RAM_WIDTH << (3 - (entry_mode))) / 8)
+
+#define ZXDH_ACL_KEYSIZE_GET(key_mode) (2 * ZXDH_ETCAM_ENTRY_SIZE_GET(key_mode))
+
+#define GET_HASH_TBL_ID_INFO(dev_id, fun_id, tbl_id) (&g_tbl_id_info[dev_id][fun_id][tbl_id])
+
+static inline uint32_t
+zxdh_np_get_hash_entry_size(uint32_t key_type)
+{
+ return ((key_type == ZXDH_HASH_KEY_128b) ? 16U : ((key_type == ZXDH_HASH_KEY_256b) ? 32U :
+ ((key_type == ZXDH_HASH_KEY_512b) ? 64U : 0)));
+}
+
+#define ZXDH_GET_HASH_ENTRY_SIZE(key_type) \
+ zxdh_np_get_hash_entry_size(key_type)
+
+static inline void
+zxdh_np_comm_uint32_write_bits(uint32_t *_dst_, uint32_t _src_,
+ uint32_t _start_pos_, uint32_t _len_)
+{
+ (*_dst_) =
+ ((*_dst_) & ~(ZXDH_COMM_GET_BIT_MASK(uint32_t, (_len_)) << (_start_pos_))) |
+ (((_src_) & ZXDH_COMM_GET_BIT_MASK(uint32_t, (_len_))) << (_start_pos_));
+}
+
+#define ZXDH_COMM_UINT32_WRITE_BITS(_dst_, _src_, _start_pos_, _len_)\
+ zxdh_np_comm_uint32_write_bits(&(_dst_), _src_, _start_pos_, _len_)
+
static uint32_t
zxdh_np_comm_mutex_create(ZXDH_MUTEX_T *p_mutex)
{
@@ -2225,6 +2275,244 @@ zxdh_np_sdt_init(uint32_t dev_num, uint32_t *dev_id_array)
return rc;
}
+static uint32_t
+zxdh_np_sdt_mgr_sdt_item_add(uint32_t dev_id, uint32_t sdt_no,
+ uint32_t sdt_hig32, uint32_t sdt_low32)
+{
+ ZXDH_SDT_SOFT_TABLE_T *p_sdt_soft_tbl = NULL;
+ ZXDH_SDT_ITEM_T *p_sdt_item = NULL;
+
+ p_sdt_soft_tbl = ZXDH_SDT_SOFT_TBL_GET(dev_id);
+
+ if (p_sdt_soft_tbl == NULL) {
+ PMD_DRV_LOG(ERR, "Error: %s soft sdt table not Init!", __func__);
+ RTE_ASSERT(0);
+ return ZXDH_RC_TABLE_SDT_MGR_INVALID;
+ }
+
+ if (dev_id != p_sdt_soft_tbl->device_id) {
+ PMD_DRV_LOG(ERR,
+ "Error: %s soft sdt table Item Invalid!", __func__);
+ RTE_ASSERT(0);
+ return ZXDH_RC_TABLE_PARA_INVALID;
+ }
+
+ p_sdt_item = &p_sdt_soft_tbl->sdt_array[sdt_no];
+ p_sdt_item->valid = ZXDH_SDT_VALID;
+ p_sdt_item->table_cfg[0] = sdt_hig32;
+ p_sdt_item->table_cfg[1] = sdt_low32;
+
+ PMD_DRV_LOG(DEBUG, "%s 0x%08x 0x%08x", __func__,
+ p_sdt_item->table_cfg[0], p_sdt_item->table_cfg[1]);
+
+ return ZXDH_OK;
+}
+
+static uint32_t
+zxdh_np_sdt_mgr_sdt_item_del(uint32_t dev_id, uint32_t sdt_no)
+{
+ ZXDH_SDT_SOFT_TABLE_T *p_sdt_soft_tbl = NULL;
+ ZXDH_SDT_ITEM_T *p_sdt_item = NULL;
+
+ p_sdt_soft_tbl = ZXDH_SDT_SOFT_TBL_GET(dev_id);
+
+ if (p_sdt_soft_tbl != NULL) {
+ if (dev_id != p_sdt_soft_tbl->device_id) {
+ PMD_DRV_LOG(ERR,
+ "Error: %s Soft Table Item Invalid !", __func__);
+ RTE_ASSERT(0);
+ return ZXDH_RC_TABLE_PARA_INVALID;
+ }
+
+ p_sdt_item = &p_sdt_soft_tbl->sdt_array[sdt_no];
+ p_sdt_item->valid = ZXDH_SDT_INVALID;
+ p_sdt_item->table_cfg[0] = 0;
+ p_sdt_item->table_cfg[1] = 0;
+ }
+ PMD_DRV_LOG(DEBUG, "%s sdt_no: 0x%08x", __func__, sdt_no);
+ return ZXDH_OK;
+}
+
+static void
+zxdh_np_soft_sdt_tbl_set(uint32_t dev_id,
+ uint32_t sdt_no,
+ uint32_t table_type,
+ ZXDH_SDT_TBL_DATA_T *p_sdt_info)
+{
+ g_table_type[dev_id][sdt_no] = table_type;
+ g_sdt_info[dev_id][sdt_no].data_high32 = p_sdt_info->data_high32;
+ g_sdt_info[dev_id][sdt_no].data_low32 = p_sdt_info->data_low32;
+}
+
+static uint32_t
+zxdh_np_sdt_tbl_write(uint32_t dev_id,
+ uint32_t sdt_no,
+ uint32_t table_type,
+ void *p_sdt_info,
+ uint32_t opr_type)
+{
+ uint32_t rtn = 0;
+
+ ZXDH_SDT_TBL_DATA_T sdt_tbl = {0};
+ ZXDH_SDT_TBL_ERAM_T *p_sdt_eram = NULL;
+ ZXDH_SDT_TBL_HASH_T *p_sdt_hash = NULL;
+ ZXDH_SDT_TBL_ETCAM_T *p_sdt_etcam = NULL;
+ ZXDH_SDT_TBL_PORT_TBL_T *p_sdt_porttbl = NULL;
+
+ if (opr_type) {
+ zxdh_np_soft_sdt_tbl_set(dev_id, sdt_no, 0, &sdt_tbl);
+
+ rtn = zxdh_np_sdt_mgr_sdt_item_del(dev_id, sdt_no);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rtn, "zxdh_np_sdt_mgr_sdt_item_del");
+ } else {
+ switch (table_type) {
+ case ZXDH_SDT_TBLT_ERAM:
+ {
+ p_sdt_eram = (ZXDH_SDT_TBL_ERAM_T *)p_sdt_info;
+ ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32,
+ p_sdt_eram->eram_mode,
+ ZXDH_SDT_H_ERAM_MODE_BT_POS,
+ ZXDH_SDT_H_ERAM_MODE_BT_LEN);
+ ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32,
+ p_sdt_eram->eram_base_addr,
+ ZXDH_SDT_H_ERAM_BASE_ADDR_BT_POS,
+ ZXDH_SDT_H_ERAM_BASE_ADDR_BT_LEN);
+ ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_low32,
+ p_sdt_eram->eram_table_depth,
+ ZXDH_SDT_L_ERAM_TABLE_DEPTH_BT_POS,
+ ZXDH_SDT_L_ERAM_TABLE_DEPTH_BT_LEN);
+ ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_low32,
+ p_sdt_eram->eram_clutch_en,
+ ZXDH_SDT_L_CLUTCH_EN_BT_POS,
+ ZXDH_SDT_L_CLUTCH_EN_BT_LEN);
+ break;
+ }
+
+ case ZXDH_SDT_TBLT_HASH:
+ {
+ p_sdt_hash = (ZXDH_SDT_TBL_HASH_T *)p_sdt_info;
+ ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32,
+ p_sdt_hash->hash_id,
+ ZXDH_SDT_H_HASH_ID_BT_POS,
+ ZXDH_SDT_H_HASH_ID_BT_LEN);
+ ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32,
+ p_sdt_hash->hash_table_width,
+ ZXDH_SDT_H_HASH_TABLE_WIDTH_BT_POS,
+ ZXDH_SDT_H_HASH_TABLE_WIDTH_BT_LEN);
+ ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32,
+ p_sdt_hash->key_size,
+ ZXDH_SDT_H_HASH_KEY_SIZE_BT_POS,
+ ZXDH_SDT_H_HASH_KEY_SIZE_BT_LEN);
+ ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32,
+ p_sdt_hash->hash_table_id,
+ ZXDH_SDT_H_HASH_TABLE_ID_BT_POS,
+ ZXDH_SDT_H_HASH_TABLE_ID_BT_LEN);
+ ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32,
+ p_sdt_hash->learn_en,
+ ZXDH_SDT_H_LEARN_EN_BT_POS,
+ ZXDH_SDT_H_LEARN_EN_BT_LEN);
+ ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32,
+ p_sdt_hash->keep_alive,
+ ZXDH_SDT_H_KEEP_ALIVE_BT_POS,
+ ZXDH_SDT_H_KEEP_ALIVE_BT_LEN);
+ ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32,
+ ((p_sdt_hash->keep_alive_baddr) >>
+ ZXDH_SDT_L_KEEP_ALIVE_BADDR_BT_LEN),
+ ZXDH_SDT_H_KEEP_ALIVE_BADDR_BT_POS,
+ ZXDH_SDT_H_KEEP_ALIVE_BADDR_BT_LEN);
+ ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_low32,
+ ZXDH_SDT_GET_LOW_DATA((p_sdt_hash->keep_alive_baddr),
+ ZXDH_SDT_L_KEEP_ALIVE_BADDR_BT_LEN),
+ ZXDH_SDT_L_KEEP_ALIVE_BADDR_BT_POS,
+ ZXDH_SDT_L_KEEP_ALIVE_BADDR_BT_LEN);
+ ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_low32,
+ p_sdt_hash->rsp_mode,
+ ZXDH_SDT_L_RSP_MODE_BT_POS,
+ ZXDH_SDT_L_RSP_MODE_BT_LEN);
+ ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_low32,
+ p_sdt_hash->hash_clutch_en,
+ ZXDH_SDT_L_CLUTCH_EN_BT_POS,
+ ZXDH_SDT_L_CLUTCH_EN_BT_LEN);
+ break;
+ }
+
+ case ZXDH_SDT_TBLT_ETCAM:
+ {
+ p_sdt_etcam = (ZXDH_SDT_TBL_ETCAM_T *)p_sdt_info;
+ ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32,
+ p_sdt_etcam->etcam_id,
+ ZXDH_SDT_H_ETCAM_ID_BT_POS,
+ ZXDH_SDT_H_ETCAM_ID_BT_LEN);
+ ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32,
+ p_sdt_etcam->etcam_key_mode,
+ ZXDH_SDT_H_ETCAM_KEY_MODE_BT_POS,
+ ZXDH_SDT_H_ETCAM_KEY_MODE_BT_LEN);
+ ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32,
+ p_sdt_etcam->etcam_table_id,
+ ZXDH_SDT_H_ETCAM_TABLE_ID_BT_POS,
+ ZXDH_SDT_H_ETCAM_TABLE_ID_BT_LEN);
+ ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32,
+ p_sdt_etcam->no_as_rsp_mode,
+ ZXDH_SDT_H_ETCAM_NOAS_RSP_MODE_BT_POS,
+ ZXDH_SDT_H_ETCAM_NOAS_RSP_MODE_BT_LEN);
+ ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32,
+ p_sdt_etcam->as_en,
+ ZXDH_SDT_H_ETCAM_AS_EN_BT_POS,
+ ZXDH_SDT_H_ETCAM_AS_EN_BT_LEN);
+
+ ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32,
+ ((p_sdt_etcam->as_eram_baddr) >>
+ ZXDH_SDT_L_ETCAM_AS_ERAM_BADDR_BT_LEN),
+ ZXDH_SDT_H_ETCAM_AS_ERAM_BADDR_BT_POS,
+ ZXDH_SDT_H_ETCAM_AS_ERAM_BADDR_BT_LEN);
+ ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_low32,
+ ZXDH_SDT_GET_LOW_DATA((p_sdt_etcam->as_eram_baddr),
+ ZXDH_SDT_L_ETCAM_AS_ERAM_BADDR_BT_LEN),
+ ZXDH_SDT_L_ETCAM_AS_ERAM_BADDR_BT_POS,
+ ZXDH_SDT_L_ETCAM_AS_ERAM_BADDR_BT_LEN);
+
+ ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_low32, p_sdt_etcam->as_rsp_mode,
+ ZXDH_SDT_L_ETCAM_AS_RSP_MODE_BT_POS,
+ ZXDH_SDT_L_ETCAM_AS_RSP_MODE_BT_LEN);
+ ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_low32,
+ p_sdt_etcam->etcam_table_depth, ZXDH_SDT_L_ETCAM_TABLE_DEPTH_BT_POS,
+ ZXDH_SDT_L_ETCAM_TABLE_DEPTH_BT_LEN);
+ ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_low32,
+ p_sdt_etcam->etcam_clutch_en, ZXDH_SDT_L_CLUTCH_EN_BT_POS,
+ ZXDH_SDT_L_CLUTCH_EN_BT_LEN);
+ break;
+ }
+
+ case ZXDH_SDT_TBLT_PORTTBL:
+ {
+ p_sdt_porttbl = (ZXDH_SDT_TBL_PORT_TBL_T *)p_sdt_info;
+ ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_low32,
+ p_sdt_porttbl->porttbl_clutch_en, ZXDH_SDT_L_CLUTCH_EN_BT_POS,
+ ZXDH_SDT_L_CLUTCH_EN_BT_LEN);
+ break;
+ }
+
+ default:
+ {
+ PMD_DRV_LOG(ERR, "SDT table_type[ %d ] is invalid!",
+ table_type);
+ return ZXDH_ERR;
+ }
+ }
+
+ ZXDH_COMM_UINT32_WRITE_BITS(sdt_tbl.data_high32, table_type,
+ ZXDH_SDT_H_TBL_TYPE_BT_POS, ZXDH_SDT_H_TBL_TYPE_BT_LEN);
+
+ zxdh_np_soft_sdt_tbl_set(dev_id, sdt_no, table_type, &sdt_tbl);
+
+ rtn = zxdh_np_sdt_mgr_sdt_item_add(dev_id, sdt_no, sdt_tbl.data_high32,
+ sdt_tbl.data_low32);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rtn, "zxdh_np_sdt_mgr_sdt_item_add");
+ }
+
+ return ZXDH_OK;
+}
+
static void
zxdh_np_ppu_parse_cls_bitmap(uint32_t dev_id,
uint32_t bitmap)
@@ -4490,10 +4778,10 @@ zxdh_np_stat_cfg_soft_get(uint32_t dev_id,
{
ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_stat_cfg);
- p_stat_cfg->ddr_base_addr = g_ppu_stat_cfg.ddr_base_addr;
- p_stat_cfg->eram_baddr = g_ppu_stat_cfg.eram_baddr;
- p_stat_cfg->eram_depth = g_ppu_stat_cfg.eram_depth;
- p_stat_cfg->ppu_addr_offset = g_ppu_stat_cfg.ppu_addr_offset;
+ p_stat_cfg->ddr_base_addr = g_ppu_stat_cfg[dev_id].ddr_base_addr;
+ p_stat_cfg->eram_baddr = g_ppu_stat_cfg[dev_id].eram_baddr;
+ p_stat_cfg->eram_depth = g_ppu_stat_cfg[dev_id].eram_depth;
+ p_stat_cfg->ppu_addr_offset = g_ppu_stat_cfg[dev_id].ppu_addr_offset;
}
static uint32_t
@@ -6473,12 +6761,401 @@ zxdh_np_apt_hash_bulk_res_init(uint32_t dev_id, uint32_t bulk_num,
return rc;
}
+static uint32_t
+zxdh_np_apt_set_callback(uint32_t dev_id, uint32_t sdt_no, uint32_t table_type, void *p_data)
+{
+ SE_APT_CALLBACK_T *apt_func = NULL;
+
+ apt_func = &g_apt_se_callback[dev_id][sdt_no];
+
+ apt_func->sdt_no = sdt_no;
+ apt_func->table_type = table_type;
+ switch (table_type) {
+ case ZXDH_SDT_TBLT_ERAM:
+ {
+ apt_func->se_func_info.eram_func.opr_mode =
+ ((ZXDH_APT_ERAM_TABLE_T *)p_data)->opr_mode;
+ apt_func->se_func_info.eram_func.rd_mode =
+ ((ZXDH_APT_ERAM_TABLE_T *)p_data)->rd_mode;
+ apt_func->se_func_info.eram_func.eram_set_func =
+ ((ZXDH_APT_ERAM_TABLE_T *)p_data)->eram_set_func;
+ apt_func->se_func_info.eram_func.eram_get_func =
+ ((ZXDH_APT_ERAM_TABLE_T *)p_data)->eram_get_func;
+ break;
+ }
+
+ case ZXDH_SDT_TBLT_HASH:
+ {
+ apt_func->se_func_info.hash_func.sdt_partner =
+ ((ZXDH_APT_HASH_TABLE_T *)p_data)->sdt_partner;
+ apt_func->se_func_info.hash_func.hash_set_func =
+ ((ZXDH_APT_HASH_TABLE_T *)p_data)->hash_set_func;
+ apt_func->se_func_info.hash_func.hash_get_func =
+ ((ZXDH_APT_HASH_TABLE_T *)p_data)->hash_get_func;
+ break;
+ }
+
+ case ZXDH_SDT_TBLT_ETCAM:
+ {
+ apt_func->se_func_info.acl_func.sdt_partner =
+ ((ZXDH_APT_ACL_TABLE_T *)p_data)->sdt_partner;
+ apt_func->se_func_info.acl_func.acl_set_func =
+ ((ZXDH_APT_ACL_TABLE_T *)p_data)->acl_set_func;
+ apt_func->se_func_info.acl_func.acl_get_func =
+ ((ZXDH_APT_ACL_TABLE_T *)p_data)->acl_get_func;
+ break;
+ }
+
+ default:
+ {
+ PMD_DRV_LOG(ERR, "zxdh_np_apt_se_set_callback table_type[ %d ]"
+ "is invalid!", table_type);
+ return ZXDH_ERR;
+ }
+ }
+
+ return ZXDH_OK;
+}
+
+static uint32_t
+zxdh_np_hash_tbl_id_info_init(ZXDH_SE_CFG *p_se_cfg,
+ uint32_t fun_id,
+ uint32_t tbl_id,
+ uint32_t tbl_flag,
+ uint32_t key_type,
+ uint32_t actu_key_size)
+{
+ uint32_t key_by_size = 0;
+ uint32_t entry_size = 0;
+
+ uint32_t dev_id = 0;
+
+ ZXDH_HASH_TBL_ID_INFO *p_tbl_id_info = NULL;
+
+ dev_id = p_se_cfg->dev_id;
+ key_by_size = ZXDH_GET_KEY_SIZE(actu_key_size);
+ entry_size = ZXDH_GET_HASH_ENTRY_SIZE(key_type);
+
+ if (key_by_size > entry_size) {
+ PMD_DRV_LOG(ERR, "ErrorCode[%x]: actu_key_size[%d] not match to key_type[%d].",
+ ZXDH_HASH_RC_INVALID_PARA,
+ key_by_size,
+ entry_size);
+ RTE_ASSERT(0);
+ return ZXDH_HASH_RC_INVALID_PARA;
+ }
+
+ p_tbl_id_info = GET_HASH_TBL_ID_INFO(dev_id, fun_id, tbl_id);
+
+ if (p_tbl_id_info->is_init) {
+ PMD_DRV_LOG(ERR, "fun_id[%d], table_id[%d] is already init,"
+ "do not init again!", fun_id, tbl_id);
+ return ZXDH_OK;
+ }
+
+ p_tbl_id_info->fun_id = fun_id;
+ p_tbl_id_info->actu_key_size = actu_key_size;
+ p_tbl_id_info->key_type = key_type;
+ p_tbl_id_info->is_init = 1;
+
+ if (tbl_flag & ZXDH_HASH_TBL_FLAG_AGE)
+ p_tbl_id_info->is_age = 1;
+
+ if (tbl_flag & ZXDH_HASH_TBL_FLAG_LEARN)
+ p_tbl_id_info->is_lrn = 1;
+
+ if (tbl_flag & ZXDH_HASH_TBL_FLAG_MC_WRT)
+ p_tbl_id_info->is_mc_wrt = 1;
+
+ return ZXDH_OK;
+}
+
+static uint32_t
+zxdh_np_apt_hash_tbl_res_init(uint32_t dev_id, uint32_t tbl_num,
+ ZXDH_APT_HASH_TABLE_T *p_hash_tbl)
+{
+ uint32_t rc = ZXDH_OK;
+ uint32_t index = 0;
+ ZXDH_APT_HASH_TABLE_T *p_hash_tbl_temp = NULL;
+ ZXDH_SE_CFG *p_se_cfg = NULL;
+
+ p_se_cfg = g_apt_se_cfg[dev_id];
+
+ for (index = 0; index < tbl_num; index++) {
+ p_hash_tbl_temp = p_hash_tbl + index;
+ ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_hash_tbl_temp);
+ rc = zxdh_np_sdt_tbl_write(dev_id,
+ p_hash_tbl_temp->sdt_no,
+ p_hash_tbl_temp->hash_sdt.table_type,
+ &p_hash_tbl_temp->hash_sdt,
+ ZXDH_SDT_OPER_ADD);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_sdt_tbl_write");
+
+ rc = zxdh_np_hash_tbl_id_info_init(p_se_cfg,
+ p_hash_tbl_temp->hash_sdt.hash_id,
+ p_hash_tbl_temp->hash_sdt.hash_table_id,
+ p_hash_tbl_temp->tbl_flag,
+ p_hash_tbl_temp->hash_sdt.hash_table_width,
+ p_hash_tbl_temp->hash_sdt.key_size);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_hash_tbl_id_info_init_ex");
+
+ rc = zxdh_np_apt_set_callback(dev_id,
+ p_hash_tbl_temp->sdt_no,
+ p_hash_tbl_temp->hash_sdt.table_type,
+ (void *)p_hash_tbl_temp);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_apt_set_callback");
+ }
+
+ return rc;
+}
+
+static uint32_t
+zxdh_np_apt_eram_res_init(uint32_t dev_id, uint32_t tbl_num, ZXDH_APT_ERAM_TABLE_T *p_eram_tbl)
+{
+ uint32_t rc = ZXDH_OK;
+ uint32_t index = 0;
+ ZXDH_APT_ERAM_TABLE_T *p_temp_eram_tbl = NULL;
+
+ for (index = 0; index < tbl_num; index++) {
+ p_temp_eram_tbl = p_eram_tbl + index;
+ rc = zxdh_np_sdt_tbl_write(dev_id,
+ p_temp_eram_tbl->sdt_no,
+ p_temp_eram_tbl->eram_sdt.table_type,
+ &p_temp_eram_tbl->eram_sdt,
+ ZXDH_SDT_OPER_ADD);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_sdt_tbl_write");
+
+ rc = zxdh_np_apt_set_callback(dev_id,
+ p_temp_eram_tbl->sdt_no,
+ p_temp_eram_tbl->eram_sdt.table_type,
+ (void *)p_temp_eram_tbl);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_apt_set_callback");
+ }
+
+ return rc;
+}
+
+static uint32_t
+zxdh_np_acl_entrynum_to_blocknum(uint32_t entry_num, uint32_t key_mode)
+{
+ uint32_t value = 0;
+
+ value = entry_num % (ZXDH_ETCAM_RAM_DEPTH * ((uint32_t)1 << key_mode));
+
+ if (value == 0)
+ return (entry_num / (ZXDH_ETCAM_RAM_DEPTH * ((uint32_t)1 << key_mode)));
+ else
+ return (entry_num / (ZXDH_ETCAM_RAM_DEPTH * ((uint32_t)1 << key_mode)) + 1);
+}
+
+static int32_t
+zxdh_np_acl_key_cmp(void *p_new_key, void *p_old_key, uint32_t key_len)
+{
+ return memcmp(&(((ZXDH_ACL_KEY_INFO_T *)p_new_key)->pri),
+ &(((ZXDH_ACL_KEY_INFO_T *)p_old_key)->pri), key_len - sizeof(uint32_t));
+}
+
+static uint32_t
+zxdh_np_acl_cfg_init_ex(ZXDH_ACL_CFG_EX_T *p_acl_cfg,
+ void *p_client,
+ uint32_t flags,
+ ZXDH_ACL_AS_RSLT_WRT_FUNCTION p_as_wrt_fun)
+{
+ uint32_t rc = 0;
+
+ memset(p_acl_cfg, 0, sizeof(ZXDH_ACL_CFG_EX_T));
+
+ p_acl_cfg->p_client = p_client;
+ p_acl_cfg->dev_id = (uint32_t)(ZXDH_COMM_PTR_TO_VAL(p_acl_cfg->p_client) & 0xFFFFFFFF);
+ p_acl_cfg->flags = flags;
+
+ g_p_acl_ex_cfg[p_acl_cfg->dev_id] = p_acl_cfg;
+
+ if (flags & ZXDH_ACL_FLAG_ETCAM0_EN) {
+ p_acl_cfg->acl_etcamids.is_valid = 1;
+
+ p_acl_cfg->acl_etcamids.as_eram_base = 0;
+
+ rc = zxdh_comm_double_link_init(ZXDH_ACL_TBL_ID_NUM,
+ &p_acl_cfg->acl_etcamids.tbl_list);
+ ZXDH_COMM_CHECK_RC(rc, "zxdh_comm_double_link_init");
+ }
+
+ if (p_as_wrt_fun == NULL) {
+ p_acl_cfg->p_as_rslt_write_fun = NULL;
+ p_acl_cfg->p_as_rslt_read_fun = NULL;
+
+ } else {
+ p_acl_cfg->p_as_rslt_write_fun = p_as_wrt_fun;
+ }
+
+ PMD_DRV_LOG(INFO, "%s dev_id %d done.", __func__, p_acl_cfg->dev_id);
+
+ return rc;
+}
+
+static uint32_t
+zxdh_np_acl_tbl_init_ex(ZXDH_ACL_CFG_EX_T *p_acl_cfg,
+ uint32_t table_id,
+ uint32_t as_enable,
+ uint32_t entry_num,
+ ZXDH_ACL_PRI_MODE_E pri_mode,
+ uint32_t key_mode,
+ ZXDH_ACL_AS_MODE_E as_mode,
+ uint32_t as_baddr,
+ uint32_t block_num,
+ uint32_t *p_block_idx)
+{
+ uint32_t rc = 0;
+ uint32_t i = 0;
+
+ g_p_acl_ex_cfg[p_acl_cfg->dev_id] = p_acl_cfg;
+
+ if (p_acl_cfg->acl_tbls[table_id].is_used) {
+ PMD_DRV_LOG(ERR, "table_id[ %d ] is already used!", table_id);
+ RTE_ASSERT(0);
+ return ZXDH_ACL_RC_INVALID_TBLID;
+ }
+
+ if (!p_acl_cfg->acl_etcamids.is_valid) {
+ PMD_DRV_LOG(ERR, "etcam is not init!");
+ RTE_ASSERT(0);
+ return ZXDH_ACL_RC_ETCAMID_NOT_INIT;
+ }
+
+ if (zxdh_np_acl_entrynum_to_blocknum(entry_num, key_mode) > block_num) {
+ PMD_DRV_LOG(ERR, "key_mode[ %d ], the etcam block_num[ %d ] is not enough for entry_num[ 0x%x ].",
+ key_mode, block_num, entry_num);
+ RTE_ASSERT(0);
+ return ZXDH_ACL_RC_INVALID_BLOCKNUM;
+ } else if (zxdh_np_acl_entrynum_to_blocknum(entry_num, key_mode) < block_num) {
+ PMD_DRV_LOG(DEBUG, "key_mode[ %d ], the etcam block_num[ %d ] is more than entry_num[ 0x%x ], better to reduce block_num in order to match with entry_num.",
+ key_mode, block_num, entry_num);
+ } else {
+ PMD_DRV_LOG(DEBUG, "key_mode[ %d ], the etcam block_num[ %d ] is match with entry_num[ 0x%x ].",
+ key_mode, block_num, entry_num);
+ }
+
+ p_acl_cfg->acl_tbls[table_id].as_enable = as_enable;
+
+ if (as_enable) {
+ p_acl_cfg->acl_tbls[table_id].as_idx_base = as_baddr;
+ p_acl_cfg->acl_tbls[table_id].as_rslt_buff =
+ rte_zmalloc(NULL, entry_num * ZXDH_ACL_AS_RSLT_SIZE_GET_EX(as_mode), 0);
+ if (p_acl_cfg->acl_tbls[table_id].as_rslt_buff == NULL) {
+ PMD_DRV_LOG(ERR, "%s point null!", __func__);
+ return ZXDH_PAR_CHK_POINT_NULL;
+ }
+ }
+
+ rc = (uint32_t)zxdh_comm_rb_init(&p_acl_cfg->acl_tbls[table_id].acl_rb, 0,
+ (sizeof(ZXDH_ACL_KEY_INFO_T) & 0xFFFFFFFFU) + ZXDH_ACL_KEYSIZE_GET(key_mode),
+ zxdh_np_acl_key_cmp);
+ ZXDH_COMM_CHECK_RC(rc, "zxdh_comm_rb_init");
+
+ p_acl_cfg->acl_tbls[table_id].table_id = table_id;
+ p_acl_cfg->acl_tbls[table_id].pri_mode = pri_mode;
+ p_acl_cfg->acl_tbls[table_id].key_mode = key_mode;
+ p_acl_cfg->acl_tbls[table_id].entry_num = entry_num;
+ p_acl_cfg->acl_tbls[table_id].as_mode = as_mode;
+ p_acl_cfg->acl_tbls[table_id].is_used = 1;
+
+ ZXDH_INIT_D_NODE(&p_acl_cfg->acl_tbls[table_id].entry_dn, &p_acl_cfg->acl_tbls[table_id]);
+ rc = (uint32_t)zxdh_comm_double_link_insert_last(&(p_acl_cfg->acl_tbls
+ [table_id].entry_dn), &p_acl_cfg->acl_etcamids.tbl_list);
+ ZXDH_COMM_CHECK_RC(rc, "zxdh_comm_double_link_insert_last");
+
+ p_acl_cfg->acl_tbls[table_id].block_num = block_num;
+ p_acl_cfg->acl_tbls[table_id].block_array =
+ rte_zmalloc(NULL, block_num * sizeof(uint32_t), 0);
+ if (p_acl_cfg->acl_tbls[table_id].block_array == NULL) {
+ PMD_DRV_LOG(ERR, "%s point null!", __func__);
+ return ZXDH_PAR_CHK_POINT_NULL;
+ }
+
+ for (i = 0; i < block_num; i++) {
+ if (p_acl_cfg->acl_blocks[p_block_idx[i]].is_used) {
+ PMD_DRV_LOG(ERR, "the block[ %d ] is already used by table[ %d ]!",
+ p_block_idx[i], p_acl_cfg->acl_blocks[p_block_idx[i]].tbl_id);
+ RTE_ASSERT(0);
+ return ZXDH_ACL_RC_INVALID_BLOCKID;
+ }
+
+ p_acl_cfg->acl_tbls[table_id].block_array[i] = p_block_idx[i];
+ p_acl_cfg->acl_blocks[p_block_idx[i]].is_used = 1;
+ p_acl_cfg->acl_blocks[p_block_idx[i]].tbl_id = table_id;
+ p_acl_cfg->acl_blocks[p_block_idx[i]].idx_base =
+ ((ZXDH_ACL_ENTRY_MAX_GET(key_mode, i)) >> ZXDH_BLOCK_IDXBASE_BIT_OFF) &
+ ZXDH_BLOCK_IDXBASE_BIT_MASK;
+ }
+
+ return ZXDH_OK;
+}
+
+static uint32_t
+zxdh_np_apt_acl_res_init(uint32_t dev_id, uint32_t tbl_num, ZXDH_APT_ACL_TABLE_T *p_acl_tbl_res)
+{
+ uint32_t rc = ZXDH_OK;
+ uint8_t index = 0;
+ ZXDH_APT_ACL_TABLE_T *p_temp_acl_tbl = NULL;
+
+ rc = zxdh_np_acl_cfg_init_ex(&g_apt_acl_cfg[dev_id],
+ (void *)ZXDH_COMM_VAL_TO_PTR(dev_id),
+ ZXDH_ACL_FLAG_ETCAM0_EN,
+ NULL);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_acl_cfg_init_ex");
+
+ for (index = 0; index < tbl_num; index++) {
+ p_temp_acl_tbl = p_acl_tbl_res + index;
+ rc = zxdh_np_sdt_tbl_write(dev_id,
+ p_temp_acl_tbl->sdt_no,
+ p_temp_acl_tbl->acl_sdt.table_type,
+ &p_temp_acl_tbl->acl_sdt,
+ ZXDH_SDT_OPER_ADD);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_sdt_tbl_write");
+
+ rc = zxdh_np_acl_tbl_init_ex(&g_apt_acl_cfg[dev_id],
+ p_temp_acl_tbl->acl_sdt.etcam_table_id,
+ p_temp_acl_tbl->acl_sdt.as_en,
+ p_temp_acl_tbl->acl_res.entry_num,
+ p_temp_acl_tbl->acl_res.pri_mode,
+ p_temp_acl_tbl->acl_sdt.etcam_key_mode,
+ p_temp_acl_tbl->acl_sdt.as_rsp_mode,
+ p_temp_acl_tbl->acl_sdt.as_eram_baddr,
+ p_temp_acl_tbl->acl_res.block_num,
+ p_temp_acl_tbl->acl_res.block_index);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_acl_tbl_init_ex");
+
+ rc = zxdh_np_apt_set_callback(dev_id,
+ p_temp_acl_tbl->sdt_no,
+ p_temp_acl_tbl->acl_sdt.table_type,
+ (void *)p_temp_acl_tbl);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_apt_set_callback");
+ }
+
+ return rc;
+}
+
+static void
+zxdh_np_apt_stat_res_init(uint32_t dev_id, uint32_t type, ZXDH_APT_STAT_RES_INIT_T *stat_res_init)
+{
+ g_ppu_stat_cfg[dev_id].eram_baddr = stat_res_init->eram_baddr;
+ g_ppu_stat_cfg[dev_id].eram_depth = stat_res_init->eram_depth;
+
+ if (type == ZXDH_SE_NON_STD_NIC_RES_TYPE) {
+ g_ppu_stat_cfg[dev_id].ddr_base_addr = stat_res_init->ddr_baddr;
+ g_ppu_stat_cfg[dev_id].ppu_addr_offset = stat_res_init->ppu_ddr_offset;
+ }
+}
+
static uint32_t
zxdh_np_se_res_init(uint32_t dev_id, uint32_t type)
{
uint32_t rc = ZXDH_OK;
ZXDH_APT_SE_RES_T *p_se_res = NULL;
ZXDH_APT_HASH_RES_INIT_T hash_res_init = {0};
+ ZXDH_APT_ERAM_RES_INIT_T eram_res_init = {0};
+ ZXDH_APT_ACL_RES_INIT_T acl_res_init = {0};
p_se_res = (ZXDH_APT_SE_RES_T *)zxdh_np_dev_get_se_res_ptr(dev_id, type);
if (!p_se_res->valid) {
@@ -6489,8 +7166,14 @@ zxdh_np_se_res_init(uint32_t dev_id, uint32_t type)
hash_res_init.func_num = p_se_res->hash_func_num;
hash_res_init.bulk_num = p_se_res->hash_bulk_num;
+ hash_res_init.tbl_num = p_se_res->hash_tbl_num;
hash_res_init.func_res = p_se_res->hash_func;
hash_res_init.bulk_res = p_se_res->hash_bulk;
+ hash_res_init.tbl_res = p_se_res->hash_tbl;
+ eram_res_init.tbl_num = p_se_res->eram_num;
+ eram_res_init.eram_res = p_se_res->eram_tbl;
+ acl_res_init.tbl_num = p_se_res->acl_num;
+ acl_res_init.acl_res = p_se_res->acl_tbl;
rc = zxdh_np_apt_hash_global_res_init(dev_id);
ZXDH_COMM_CHECK_RC(rc, "zxdh_np_apt_hash_global_res_init");
@@ -6507,6 +7190,26 @@ zxdh_np_se_res_init(uint32_t dev_id, uint32_t type)
ZXDH_COMM_CHECK_RC(rc, "zxdh_np_apt_hash_bulk_res_init");
}
+ if (hash_res_init.tbl_num) {
+ rc = zxdh_np_apt_hash_tbl_res_init(dev_id, hash_res_init.tbl_num,
+ hash_res_init.tbl_res);
+ ZXDH_COMM_CHECK_RC(rc, "zxdh_np_apt_hash_tbl_res_init");
+ }
+
+ if (eram_res_init.tbl_num) {
+ rc = zxdh_np_apt_eram_res_init(dev_id, eram_res_init.tbl_num,
+ eram_res_init.eram_res);
+ ZXDH_COMM_CHECK_RC(rc, "zxdh_np_apt_eram_res_init");
+ }
+
+ if (acl_res_init.tbl_num) {
+ rc = zxdh_np_apt_acl_res_init(dev_id, acl_res_init.tbl_num,
+ acl_res_init.acl_res);
+ ZXDH_COMM_CHECK_RC(rc, "zxdh_np_apt_acl_res_init");
+ }
+
+ zxdh_np_apt_stat_res_init(dev_id, type, &p_se_res->stat_cfg);
+
return rc;
}
diff --git a/drivers/net/zxdh/zxdh_np.h b/drivers/net/zxdh/zxdh_np.h
index 31d4af2c05..b1b9dc9a1b 100644
--- a/drivers/net/zxdh/zxdh_np.h
+++ b/drivers/net/zxdh/zxdh_np.h
@@ -101,6 +101,10 @@
#define ZXDH_ETCAM_WR_MASK_MAX (((uint32_t)1 << ZXDH_ETCAM_RAM_NUM) - 1)
#define ZXDH_ETCAM_WIDTH_MIN (ZXDH_ETCAM_RAM_WIDTH)
#define ZXDH_ETCAM_WIDTH_MAX (ZXDH_ETCAM_RAM_NUM * ZXDH_ETCAM_RAM_WIDTH)
+#define ZXDH_ETCAM_RAM_DEPTH (512)
+#define ZXDH_ACL_FLAG_ETCAM0_EN (1 << 0)
+#define ZXDH_BLOCK_IDXBASE_BIT_OFF (9)
+#define ZXDH_BLOCK_IDXBASE_BIT_MASK (0x7f)
#define ZXDH_DTB_TABLE_DATA_BUFF_SIZE (16384)
#define ZXDH_DTB_TABLE_CMD_SIZE_BIT (128)
@@ -173,6 +177,57 @@
#define ZXDH_COMM_PTR_TO_VAL(p) ((uint64_t)(p))
#define ZXDH_COMM_VAL_TO_PTR(v) ((void *)((uint64_t)(v)))
+#define ZXDH_SDT_CFG_LEN (2)
+#define ZXDH_SDT_VALID (1)
+#define ZXDH_SDT_INVALID (0)
+#define ZXDH_SDT_OPER_ADD (0)
+#define ZXDH_SDT_H_TBL_TYPE_BT_POS (29)
+#define ZXDH_SDT_H_TBL_TYPE_BT_LEN (3)
+#define ZXDH_SDT_H_ERAM_MODE_BT_POS (26)
+#define ZXDH_SDT_H_ERAM_MODE_BT_LEN (3)
+#define ZXDH_SDT_H_ERAM_BASE_ADDR_BT_POS (7)
+#define ZXDH_SDT_H_ERAM_BASE_ADDR_BT_LEN (19)
+#define ZXDH_SDT_L_ERAM_TABLE_DEPTH_BT_POS (1)
+#define ZXDH_SDT_L_ERAM_TABLE_DEPTH_BT_LEN (22)
+#define ZXDH_SDT_H_HASH_ID_BT_POS (27)
+#define ZXDH_SDT_H_HASH_ID_BT_LEN (2)
+#define ZXDH_SDT_H_HASH_TABLE_WIDTH_BT_POS (25)
+#define ZXDH_SDT_H_HASH_TABLE_WIDTH_BT_LEN (2)
+#define ZXDH_SDT_H_HASH_KEY_SIZE_BT_POS (19)
+#define ZXDH_SDT_H_HASH_KEY_SIZE_BT_LEN (6)
+#define ZXDH_SDT_H_HASH_TABLE_ID_BT_POS (14)
+#define ZXDH_SDT_H_HASH_TABLE_ID_BT_LEN (5)
+#define ZXDH_SDT_H_LEARN_EN_BT_POS (13)
+#define ZXDH_SDT_H_LEARN_EN_BT_LEN (1)
+#define ZXDH_SDT_H_KEEP_ALIVE_BT_POS (12)
+#define ZXDH_SDT_H_KEEP_ALIVE_BT_LEN (1)
+#define ZXDH_SDT_H_KEEP_ALIVE_BADDR_BT_POS (0)
+#define ZXDH_SDT_H_KEEP_ALIVE_BADDR_BT_LEN (12)
+#define ZXDH_SDT_L_KEEP_ALIVE_BADDR_BT_POS (25)
+#define ZXDH_SDT_L_KEEP_ALIVE_BADDR_BT_LEN (7)
+#define ZXDH_SDT_L_RSP_MODE_BT_POS (23)
+#define ZXDH_SDT_L_RSP_MODE_BT_LEN (2)
+#define ZXDH_SDT_H_ETCAM_ID_BT_POS (27)
+#define ZXDH_SDT_H_ETCAM_ID_BT_LEN (1)
+#define ZXDH_SDT_H_ETCAM_KEY_MODE_BT_POS (25)
+#define ZXDH_SDT_H_ETCAM_KEY_MODE_BT_LEN (2)
+#define ZXDH_SDT_H_ETCAM_TABLE_ID_BT_POS (21)
+#define ZXDH_SDT_H_ETCAM_TABLE_ID_BT_LEN (4)
+#define ZXDH_SDT_H_ETCAM_NOAS_RSP_MODE_BT_POS (19)
+#define ZXDH_SDT_H_ETCAM_NOAS_RSP_MODE_BT_LEN (2)
+#define ZXDH_SDT_H_ETCAM_AS_EN_BT_POS (18)
+#define ZXDH_SDT_H_ETCAM_AS_EN_BT_LEN (1)
+#define ZXDH_SDT_H_ETCAM_AS_ERAM_BADDR_BT_POS (0)
+#define ZXDH_SDT_H_ETCAM_AS_ERAM_BADDR_BT_LEN (18)
+#define ZXDH_SDT_L_ETCAM_AS_ERAM_BADDR_BT_POS (31)
+#define ZXDH_SDT_L_ETCAM_AS_ERAM_BADDR_BT_LEN (1)
+#define ZXDH_SDT_L_ETCAM_AS_RSP_MODE_BT_POS (28)
+#define ZXDH_SDT_L_ETCAM_AS_RSP_MODE_BT_LEN (3)
+#define ZXDH_SDT_L_ETCAM_TABLE_DEPTH_BT_POS (1)
+#define ZXDH_SDT_L_ETCAM_TABLE_DEPTH_BT_LEN (20)
+#define ZXDH_SDT_L_CLUTCH_EN_BT_POS (0)
+#define ZXDH_SDT_L_CLUTCH_EN_BT_LEN (1)
+
/**errco code */
#define ZXDH_RC_BASE (0x1000U)
#define ZXDH_PARAMETER_CHK_BASE (ZXDH_RC_BASE | 0x200)
@@ -291,6 +346,28 @@
#define ZXDH_SE_RC_FUN_INVALID (ZXDH_SE_RC_CFG_BASE | 0x2)
#define ZXDH_SE_RC_PARA_INVALID (ZXDH_SE_RC_CFG_BASE | 0x3)
+#define ZXDH_RC_TABLE_BASE (0x800)
+#define ZXDH_RC_TABLE_PARA_INVALID (ZXDH_RC_TABLE_BASE | 0x0)
+#define ZXDH_RC_TABLE_RANGE_INVALID (ZXDH_RC_TABLE_BASE | 0x1)
+#define ZXDH_RC_TABLE_CALL_FUNC_FAIL (ZXDH_RC_TABLE_BASE | 0x2)
+#define ZXDH_RC_TABLE_SDT_MSG_INVALID (ZXDH_RC_TABLE_BASE | 0x3)
+#define ZXDH_RC_TABLE_SDT_MGR_INVALID (ZXDH_RC_TABLE_BASE | 0x4)
+#define ZXDH_RC_TABLE_IF_VALUE_FAIL (ZXDH_RC_TABLE_BASE | 0x5)
+
+#define ZXDH_ACL_RC_BASE (0x60000)
+#define ZXDH_ACL_RC_INVALID_TBLID (ZXDH_ACL_RC_BASE | 0x0)
+#define ZXDH_ACL_RC_INVALID_BLOCKNUM (ZXDH_ACL_RC_BASE | 0x1)
+#define ZXDH_ACL_RC_INVALID_BLOCKID (ZXDH_ACL_RC_BASE | 0x2)
+#define ZXDH_ACL_RC_TBL_NOT_INIT (ZXDH_ACL_RC_BASE | 0x3)
+#define ZXDH_ACL_RC_ETCAMID_NOT_INIT (ZXDH_ACL_RC_BASE | 0x4)
+#define ZXDH_ACL_RC_AS_ERAM_NOT_ENOUGH (ZXDH_ACL_RC_BASE | 0x5)
+#define ZXDH_ACL_RC_RB_TREE_FULL (ZXDH_ACL_RC_BASE | 0x6)
+#define ZXDH_ACL_RC_TABLE_FULL (ZXDH_ACL_RC_BASE | 0x7)
+#define ZXDH_ACL_RC_INVALID_PARA (ZXDH_ACL_RC_BASE | 0x8)
+#define ZXDH_ACL_RC_DEL_SRHFAIL (ZXDH_ACL_RC_BASE | 0x9)
+#define ZXDH_ACL_RC_TABLE_UPDATE (ZXDH_ACL_RC_BASE | 0xa)
+#define ZXDH_ACL_RC_SRH_FAIL (ZXDH_ACL_RC_BASE | 0xb)
+
typedef enum zxdh_module_base_addr_e {
ZXDH_MODULE_SE_SMMU0_BASE_ADDR = 0x00000000,
ZXDH_MODULE_DTB_ENQ_BASE_ADDR = 0x00000000,
@@ -446,6 +523,21 @@ typedef enum zxdh_se_fun_type_e {
ZXDH_FUN_MAX
} ZXDH_SE_FUN_TYPE;
+typedef enum zxdh_acl_as_mode_e {
+ ZXDH_ACL_AS_MODE_16b = 0,
+ ZXDH_ACL_AS_MODE_32b = 1,
+ ZXDH_ACL_AS_MODE_64b = 2,
+ ZXDH_ACL_AS_MODE_128b = 3,
+ ZXDH_ACL_AS_MODE_INVALID,
+} ZXDH_ACL_AS_MODE_E;
+
+typedef enum zxdh_hash_key_type_e {
+ ZXDH_HASH_KEY_INVALID = 0,
+ ZXDH_HASH_KEY_128b,
+ ZXDH_HASH_KEY_256b,
+ ZXDH_HASH_KEY_512b,
+} ZXDH_HASH_KEY_TYPE;
+
typedef struct zxdh_avl_node_t {
void *p_key;
uint32_t result;
@@ -869,6 +961,101 @@ typedef struct zxdh_dev_apt_se_tbl_res_t {
ZXDH_APT_SE_RES_T offload_res;
} ZXDH_DEV_APT_SE_TBL_RES_T;
+typedef struct se_apt_eram_func_t {
+ uint32_t opr_mode;
+ uint32_t rd_mode;
+ ZXDH_APT_ERAM_SET_FUNC eram_set_func;
+ ZXDH_APT_ERAM_GET_FUNC eram_get_func;
+} ZXDH_SE_APT_ERAM_FUNC_T;
+
+typedef struct se_apt_acl_func_t {
+ uint32_t sdt_partner;
+ ZXDH_APT_ACL_ENTRY_SET_FUNC acl_set_func;
+ ZXDH_APT_ACL_ENTRY_GET_FUNC acl_get_func;
+} ZXDH_SE_APT_ACL_FUNC_T;
+
+typedef struct se_apt_hash_func_t {
+ uint32_t sdt_partner;
+ ZXDH_APT_HASH_ENTRY_SET_FUNC hash_set_func;
+ ZXDH_APT_HASH_ENTRY_GET_FUNC hash_get_func;
+} ZXDH_SE_APT_HASH_FUNC_T;
+
+typedef struct se_apt_callback_t {
+ uint32_t sdt_no;
+ uint32_t table_type;
+ union {
+ ZXDH_SE_APT_ERAM_FUNC_T eram_func;
+ ZXDH_SE_APT_ACL_FUNC_T acl_func;
+ ZXDH_SE_APT_HASH_FUNC_T hash_func;
+ } se_func_info;
+} SE_APT_CALLBACK_T;
+
+typedef struct zxdh_acl_block_info_t {
+ uint32_t is_used;
+ uint32_t tbl_id;
+ uint32_t idx_base;
+} ZXDH_ACL_BLOCK_INFO_T;
+
+typedef struct zxdh_acl_etcamid_cfg_t {
+ uint32_t is_valid;
+ uint32_t as_enable;
+ uint32_t as_idx_offset;
+ uint32_t as_eram_base;
+ ZXDH_D_HEAD tbl_list;
+} ZXDH_ACL_ETCAMID_CFG_T;
+
+typedef struct zxdh_acl_key_info_t {
+ uint32_t handle;
+ uint32_t pri;
+ uint8_t key[0];
+} ZXDH_ACL_KEY_INFO_T;
+
+typedef uint32_t (*ZXDH_ACL_TBL_AS_DDR_WR_FUN)(uint32_t dev_id, uint32_t tbl_type,
+ uint32_t tbl_id, uint32_t dir_tbl_share_type, uint32_t dir_tbl_base_addr,
+ uint32_t ecc_en, uint32_t index, uint32_t as_mode, uint8_t *p_data);
+typedef uint32_t (*ZXDH_ACL_TBL_AS_DDR_RD_FUN)(uint32_t dev_id, uint32_t base_addr,
+ uint32_t index, uint32_t as_mode, uint8_t *p_data);
+typedef uint32_t (*ZXDH_ACL_AS_RSLT_WRT_FUNCTION)(uint32_t dev_id,
+ uint32_t base_addr, uint32_t index, uint32_t as_mode, uint8_t *p_data);
+
+typedef struct zxdh_acl_tbl_cfg_t {
+ uint32_t tbl_type;
+ uint32_t table_id;
+ uint8_t is_as_ddr;
+ uint8_t ddr_bankcp_info;
+ uint32_t dir_tbl_share_type;
+ uint8_t ddr_ecc_en;
+ uint32_t pri_mode;
+ uint32_t key_mode;
+ uint32_t entry_num;
+ uint32_t block_num;
+ uint32_t *block_array;
+ uint32_t is_used;
+ uint32_t as_mode;
+ uint32_t as_idx_base;
+ uint32_t as_enable;
+ uint32_t as_eram_base;
+ uint32_t ddr_baddr;
+ uint32_t idx_offset;
+ ZXDH_ACL_TBL_AS_DDR_WR_FUN p_as_ddr_wr_fun;
+ ZXDH_ACL_TBL_AS_DDR_RD_FUN p_as_ddr_rd_fun;
+ ZXDH_D_NODE entry_dn;
+ ZXDH_RB_CFG acl_rb;
+ ZXDH_ACL_KEY_INFO_T **acl_key_buff;
+ uint8_t *as_rslt_buff;
+} ZXDH_ACL_TBL_CFG_T;
+
+typedef struct zxdh_acl_cfg_ex_t {
+ void *p_client;
+ uint32_t dev_id;
+ uint32_t flags;
+ ZXDH_ACL_AS_RSLT_WRT_FUNCTION p_as_rslt_write_fun;
+ ZXDH_ACL_AS_RSLT_WRT_FUNCTION p_as_rslt_read_fun;
+ ZXDH_ACL_BLOCK_INFO_T acl_blocks[ZXDH_ACL_BLOCK_NUM];
+ ZXDH_ACL_ETCAMID_CFG_T acl_etcamids;
+ ZXDH_ACL_TBL_CFG_T acl_tbls[ZXDH_ACL_TBL_ID_NUM];
+} ZXDH_ACL_CFG_EX_T;
+
typedef struct zxdh_mutex_t {
pthread_mutex_t mutex;
} ZXDH_MUTEX_T;
--
2.27.0
[-- Attachment #1.1.2: Type: text/html , Size: 88681 bytes --]
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [PATCH v1 09/14] net/zxdh: implement tables initialization
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
1 sibling, 0 replies; 32+ messages in thread
From: Stephen Hemminger @ 2025-02-10 17:40 UTC (permalink / raw)
To: Bingbin Chen; +Cc: dev
On Mon, 10 Feb 2025 09:50:12 +0800
Bingbin Chen <chen.bingbin@zte.com.cn> wrote:
> +static inline void
> +zxdh_np_comm_uint32_write_bits(uint32_t *_dst_, uint32_t _src_,
> + uint32_t _start_pos_, uint32_t _len_)
> +{
> + (*_dst_) =
> + ((*_dst_) & ~(ZXDH_COMM_GET_BIT_MASK(uint32_t, (_len_)) << (_start_pos_))) |
> + (((_src_) & ZXDH_COMM_GET_BIT_MASK(uint32_t, (_len_))) << (_start_pos_));
> +}
> +
Would be more readable if mask computed once.
Don't need _ on function args
static inline void
zxdh_np_comm_uint32_write_bits(uint32_t *dst, uint32_t src,
uint32_t start_pos, uint32_t len)
{
uint32_t mask = ZXDH_COMM_GET_BIT_MASK(uint32_t, len) << start_pos;
*dst = (*dst & mask) | (src & mask);
}
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [PATCH v1 09/14] net/zxdh: implement tables initialization
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
1 sibling, 0 replies; 32+ messages in thread
From: Stephen Hemminger @ 2025-02-10 17:43 UTC (permalink / raw)
To: Bingbin Chen; +Cc: dev
On Mon, 10 Feb 2025 09:50:12 +0800
Bingbin Chen <chen.bingbin@zte.com.cn> wrote:
> +static uint32_t
> +zxdh_np_sdt_mgr_sdt_item_add(uint32_t dev_id, uint32_t sdt_no,
> + uint32_t sdt_hig32, uint32_t sdt_low32)
> +{
> + ZXDH_SDT_SOFT_TABLE_T *p_sdt_soft_tbl = NULL;
> + ZXDH_SDT_ITEM_T *p_sdt_item = NULL;
> +
> + p_sdt_soft_tbl = ZXDH_SDT_SOFT_TBL_GET(dev_id);
> +
> + if (p_sdt_soft_tbl == NULL) {
> + PMD_DRV_LOG(ERR, "Error: %s soft sdt table not Init!", __func__);
> + RTE_ASSERT(0);
> + return ZXDH_RC_TABLE_SDT_MGR_INVALID;
> + }
> +
> + if (dev_id != p_sdt_soft_tbl->device_id) {
> + PMD_DRV_LOG(ERR,
> + "Error: %s soft sdt table Item Invalid!", __func__);
> + RTE_ASSERT(0);
> + return ZXDH_RC_TABLE_PARA_INVALID;
> + }
> +
> + p_sdt_item = &p_sdt_soft_tbl->sdt_array[sdt_no];
> + p_sdt_item->valid = ZXDH_SDT_VALID;
> + p_sdt_item->table_cfg[0] = sdt_hig32;
> + p_sdt_item->table_cfg[1] = sdt_low32;
> +
> + PMD_DRV_LOG(DEBUG, "%s 0x%08x 0x%08x", __func__,
> + p_sdt_item->table_cfg[0], p_sdt_item->table_cfg[1]);
Duplication here.
define PMD_DRV_LOG(level, ...) \
RTE_LOG_LINE_PREFIX(level, ZXDH_DRIVER, "%s(): ", __func__, __VA_ARGS__)
^ permalink raw reply [flat|nested] 32+ messages in thread
* [PATCH v1 10/14] net/zxdh: support hash tables write and delete ops
2025-02-10 1:50 ` [PATCH v1 06/14] net/zxdh: add eram tables ops Bingbin Chen
` (2 preceding siblings ...)
2025-02-10 1:50 ` [PATCH v1 09/14] net/zxdh: implement tables initialization Bingbin Chen
@ 2025-02-10 1:50 ` Bingbin Chen
2025-02-10 17:45 ` Stephen Hemminger
2025-02-10 1:50 ` [PATCH v1 11/14] net/zxdh: get hash table entry result Bingbin Chen
` (3 subsequent siblings)
7 siblings, 1 reply; 32+ messages in thread
From: Bingbin Chen @ 2025-02-10 1:50 UTC (permalink / raw)
To: dev; +Cc: Bingbin Chen
[-- Attachment #1.1.1: Type: text/plain, Size: 35571 bytes --]
Implement hash tables write write and delete
operations by dtb channel.
Signed-off-by: Bingbin Chen <chen.bingbin@zte.com.cn>
---
drivers/net/zxdh/zxdh_np.c | 956 +++++++++++++++++++++++++++++++++++++
drivers/net/zxdh/zxdh_np.h | 12 +
2 files changed, 968 insertions(+)
diff --git a/drivers/net/zxdh/zxdh_np.c b/drivers/net/zxdh/zxdh_np.c
index 3de6330271..ba84d2064e 100644
--- a/drivers/net/zxdh/zxdh_np.c
+++ b/drivers/net/zxdh/zxdh_np.c
@@ -600,6 +600,71 @@ zxdh_np_comm_uint32_write_bits(uint32_t *_dst_, uint32_t _src_,
#define ZXDH_COMM_UINT32_WRITE_BITS(_dst_, _src_, _start_pos_, _len_)\
zxdh_np_comm_uint32_write_bits(&(_dst_), _src_, _start_pos_, _len_)
+static inline uint32_t
+ZXDH_ZBLK_ADDR_CONV(uint32_t zblk_idx)
+{
+ return ((zblk_idx) / ZXDH_ZBLK_NUM_PER_ZGRP) * (1 << ZXDH_ZBLK_IDX_BT_WIDTH) + (zblk_idx)
+ % ZXDH_ZBLK_NUM_PER_ZGRP;
+}
+
+static inline uint32_t
+ZXDH_ZCELL_ADDR_CONV(uint32_t zcell_idx)
+{
+ uint32_t blk_grp_idx = (zcell_idx >> ZXDH_ZCELL_IDX_BT_WIDTH) &
+ ((1 << (ZXDH_ZBLK_IDX_BT_WIDTH + ZXDH_ZGRP_IDX_BT_WIDTH)) - 1);
+
+ uint32_t cell_idx = zcell_idx & ((1 << ZXDH_ZCELL_IDX_BT_WIDTH) - 1);
+
+ return (ZXDH_ZBLK_ADDR_CONV(blk_grp_idx) << ZXDH_ZCELL_IDX_BT_WIDTH) | cell_idx;
+}
+
+#define ZXDH_ZBLK_REG_ADDR_CALC(zblk_idx, offset) \
+ ((0xF << ZXDH_ZBLK_WRT_MASK_BT_START) | (0x1 << ZXDH_REG_SRAM_FLAG_BT_START) \
+ | ((ZXDH_ZBLK_ADDR_CONV(zblk_idx) & 0x1F) << ZXDH_ZBLK_IDX_BT_START) | ((offset) & 0x1FF))
+
+#define ZXDH_ZBLK_HASH_LIST_REG_ADDR_CALC(zblk_idx, reg_idx) \
+ (ZXDH_ZBLK_REG_ADDR_CALC((zblk_idx), (0xD + (reg_idx))))
+
+#define ZXDH_ZCELL_BASE_ADDR_CALC(zcell_idx) \
+ ((0xF << ZXDH_ZBLK_WRT_MASK_BT_START) | (((ZXDH_ZCELL_ADDR_CONV(zcell_idx)) & \
+ ((1 << (ZXDH_ZCELL_IDX_BT_WIDTH + ZXDH_ZBLK_IDX_BT_WIDTH + ZXDH_ZGRP_IDX_BT_WIDTH)) - 1)) \
+ << ZXDH_ZCELL_ADDR_BT_WIDTH))
+#define ZXDH_ZBLK_ITEM_ADDR_CALC(zcell_idx, item_idx) \
+ ((ZXDH_ZCELL_BASE_ADDR_CALC(zcell_idx)) | ((item_idx) & (ZXDH_SE_RAM_DEPTH - 1)))
+
+static inline uint32_t
+zxdh_np_get_rst_size(uint32_t key_type, uint32_t actu_key_size)
+{
+ return ((ZXDH_GET_HASH_ENTRY_SIZE(key_type) != 0) ?
+ (ZXDH_GET_HASH_ENTRY_SIZE(key_type) - ZXDH_GET_ACTU_KEY_BY_SIZE(actu_key_size) -
+ ZXDH_HASH_KEY_CTR_SIZE) : 0xFF);
+}
+
+#define ZXDH_GET_RST_SIZE(key_type, actu_key_size) \
+ zxdh_np_get_rst_size(key_type, actu_key_size)
+
+#define ZXDH_GET_HASH_KEY_TYPE(p_key) (((p_key)[0] >> 5) & 0x3)
+
+#define ZXDH_GET_HASH_KEY_VALID(p_key) (((p_key)[0] >> 7) & 0x1)
+
+#define ZXDH_GET_HASH_KEY_CTRL(valid, type, tbl_id) \
+ ((((valid) & 0x1) << 7) | (((type) & 0x3) << 5) | ((tbl_id) & 0x1f))
+
+static inline uint32_t
+zxdh_np_get_hash_entry_mask(uint32_t entry_size, uint32_t entry_pos)
+{
+ return (((1U << (entry_size / 16U)) - 1U) << (4U - entry_size / 16U - entry_pos)) & 0xF;
+}
+
+#define ZXDH_GET_HASH_ENTRY_MASK(entry_size, entry_pos) \
+ zxdh_np_get_hash_entry_mask(entry_size, entry_pos)
+
+#define GET_HASH_DDR_HW_ADDR(base_addr, item_idx) \
+ ((base_addr) + (item_idx))
+
+#define GET_ZCELL_CRC_VAL(zcell_id, crc16_val) \
+ (((crc16_val) >> (zcell_id)) & (ZXDH_SE_RAM_DEPTH - 1))
+
static uint32_t
zxdh_np_comm_mutex_create(ZXDH_MUTEX_T *p_mutex)
{
@@ -1828,6 +1893,17 @@ zxdh_np_dev_dtb_opr_mutex_get(uint32_t dev_id, uint32_t type,
return ZXDH_OK;
}
+static void
+zxdh_np_dev_hash_opr_mutex_get(uint32_t dev_id, uint32_t fun_id, ZXDH_MUTEX_T **p_mutex_out)
+{
+ ZXDH_DEV_MGR_T *p_dev_mgr = NULL;
+ ZXDH_DEV_CFG_T *p_dev_info = NULL;
+
+ p_dev_mgr = &g_dev_mgr;
+ p_dev_info = p_dev_mgr->p_dev_array[dev_id];
+ *p_mutex_out = &p_dev_info->hash_mutex[fun_id];
+}
+
static uint32_t
zxdh_np_dev_read_channel(uint32_t dev_id, uint32_t addr, uint32_t size, uint32_t *p_data)
{
@@ -2203,6 +2279,11 @@ zxdh_np_dev_add(uint32_t dev_id, ZXDH_DEV_TYPE_E dev_type,
ZXDH_COMM_CHECK_DEV_RC(dev_id, rtn, "zxdh_np_comm_mutex_create");
}
+ for (i = 0; i < ZXDH_HASH_FUNC_ID_NUM; i++) {
+ rtn = zxdh_np_comm_mutex_create(&p_dev_info->hash_mutex[i]);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rtn, "zxdh_np_comm_mutex_create");
+ }
+
return rtn;
}
@@ -3717,6 +3798,9 @@ zxdh_np_dev_del(uint32_t dev_id)
for (i = 0; i < ZXDH_DTB_QUEUE_NUM_MAX; i++)
zxdh_np_comm_mutex_destroy(&p_dev_info->dtb_queue_mutex[i]);
+ for (i = 0; i < ZXDH_HASH_FUNC_ID_NUM; i++)
+ zxdh_np_comm_mutex_destroy(&p_dev_info->hash_mutex[i]);
+
rte_free(p_dev_info);
p_dev_mgr->p_dev_array[dev_id] = NULL;
p_dev_mgr->device_num--;
@@ -3878,6 +3962,72 @@ zxdh_np_dtb_smmu0_write_entry_data(uint32_t dev_id,
return rc;
}
+static uint32_t
+zxdh_np_dtb_zcam_write_entry_data(uint32_t dev_id,
+ uint32_t reg_sram_flag,
+ uint32_t zgroup_id,
+ uint32_t zblock_id,
+ uint32_t zcell_id,
+ uint32_t sram_addr,
+ uint32_t mask,
+ uint8_t *p_data,
+ ZXDH_DTB_ENTRY_T *p_entry)
+{
+ uint32_t rc = ZXDH_OK;
+
+ ZXDH_DTB_ZCAM_TABLE_FORM_T dtb_zcam_form_info = {0};
+
+ dtb_zcam_form_info.valid = 1;
+ dtb_zcam_form_info.type_mode = ZXDH_DTB_TABLE_MODE_ZCAM;
+ dtb_zcam_form_info.ram_reg_flag = reg_sram_flag;
+ dtb_zcam_form_info.zgroup_id = zgroup_id;
+ dtb_zcam_form_info.zblock_id = zblock_id;
+ dtb_zcam_form_info.zcell_id = zcell_id;
+ dtb_zcam_form_info.mask = mask;
+ dtb_zcam_form_info.sram_addr = sram_addr & 0x1FF;
+
+ p_entry->data_in_cmd_flag = 0;
+ p_entry->data_size = ZXDH_DTB_LEN_POS_SETP * (ZXDH_DTB_ZCAM_LEN_SIZE - 1);
+
+ rc = zxdh_np_dtb_write_table_cmd(dev_id, ZXDH_DTB_TABLE_ZCAM,
+ &dtb_zcam_form_info, p_entry->cmd);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_write_table_cmd");
+
+ rte_memcpy(p_entry->data, p_data,
+ ZXDH_DTB_LEN_POS_SETP * (ZXDH_DTB_ZCAM_LEN_SIZE - 1));
+
+ return rc;
+}
+
+static uint32_t
+zxdh_np_dtb_se_alg_zcam_data_write(uint32_t dev_id,
+ uint32_t addr,
+ uint8_t *p_data,
+ ZXDH_DTB_ENTRY_T *p_entry)
+{
+ uint32_t rc = ZXDH_OK;
+ uint32_t reg_sram_flag = 0;
+ uint32_t zgroup_id = 0;
+ uint32_t zblock_id = 0;
+ uint32_t zcell_id = 0;
+ uint32_t mask = 0;
+ uint32_t sram_addr = 0;
+
+ mask = (addr >> 17) & 0xF;
+ reg_sram_flag = (addr >> 16) & 0x1;
+ zgroup_id = (addr >> 14) & 0x3;
+ zblock_id = (addr >> 11) & 0x7;
+ zcell_id = (addr >> 9) & 0x3;
+ sram_addr = addr & 0x1FF;
+
+ rc = zxdh_np_dtb_zcam_write_entry_data(dev_id, reg_sram_flag, zgroup_id, zblock_id,
+ zcell_id, sram_addr, mask, p_data, p_entry);
+
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_zcam_write_entry_data");
+
+ return rc;
+}
+
static uint32_t
zxdh_np_dtb_smmu0_dump_info_write(uint32_t dev_id,
uint32_t base_addr,
@@ -4580,6 +4730,797 @@ zxdh_np_dtb_tab_down_success_status_check(uint32_t dev_id,
return rc;
}
+static uint32_t
+zxdh_np_hash_get_hash_info_from_sdt(uint32_t dev_id,
+ uint32_t sdt_no, HASH_ENTRY_CFG *p_hash_entry_cfg)
+{
+ uint32_t rc = ZXDH_OK;
+ ZXDH_FUNC_ID_INFO *p_func_info = NULL;
+ ZXDH_SE_CFG *p_se_cfg = NULL;
+ ZXDH_SDT_TBL_HASH_T sdt_hash_info = {0};
+
+ rc = zxdh_np_soft_sdt_tbl_get(dev_id, sdt_no, &sdt_hash_info);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_soft_sdt_tbl_read");
+
+ p_hash_entry_cfg->fun_id = sdt_hash_info.hash_id;
+ p_hash_entry_cfg->table_id = sdt_hash_info.hash_table_id;
+ p_hash_entry_cfg->bulk_id = ((p_hash_entry_cfg->table_id >> 2) & 0x7);
+ p_hash_entry_cfg->key_type = sdt_hash_info.hash_table_width;
+ p_hash_entry_cfg->rsp_mode = sdt_hash_info.rsp_mode;
+ p_hash_entry_cfg->actu_key_size = sdt_hash_info.key_size;
+ p_hash_entry_cfg->key_by_size = ZXDH_GET_KEY_SIZE(p_hash_entry_cfg->actu_key_size);
+ p_hash_entry_cfg->rst_by_size = ZXDH_GET_RST_SIZE(p_hash_entry_cfg->key_type,
+ p_hash_entry_cfg->actu_key_size);
+
+ p_se_cfg = dpp_se_cfg[dev_id];
+ p_hash_entry_cfg->p_se_cfg = p_se_cfg;
+
+ p_func_info = ZXDH_GET_FUN_INFO(p_se_cfg, p_hash_entry_cfg->fun_id);
+
+ p_hash_entry_cfg->p_hash_cfg = (ZXDH_HASH_CFG *)p_func_info->fun_ptr;
+ ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_hash_entry_cfg->p_hash_cfg);
+
+ return ZXDH_OK;
+}
+
+static void
+zxdh_np_hash_set_crc_key(HASH_ENTRY_CFG *p_hash_entry_cfg,
+ ZXDH_HASH_ENTRY *p_entry, uint8_t *p_temp_key)
+{
+ uint32_t key_by_size = 0;
+ uint8_t temp_tbl_id = 0;
+
+ key_by_size = p_hash_entry_cfg->key_by_size;
+ rte_memcpy(p_temp_key, p_entry->p_key, key_by_size);
+
+ temp_tbl_id = (*p_temp_key) & 0x1F;
+ memmove(p_temp_key, p_temp_key + 1, key_by_size - ZXDH_HASH_KEY_CTR_SIZE);
+ p_temp_key[key_by_size - ZXDH_HASH_KEY_CTR_SIZE] = temp_tbl_id;
+}
+
+static uint8_t
+zxdh_np_hash_sdt_partner_valid(uint32_t sdt_no, uint32_t sdt_partner, uint8_t *p_key)
+{
+ uint32_t rc = ZXDH_OK;
+ uint32_t dev_id = 0;
+ uint32_t key_valid = 1;
+
+ ZXDH_SDT_TBL_HASH_T sdt_hash1 = {0};
+ ZXDH_SDT_TBL_HASH_T sdt_hash2 = {0};
+
+ if (sdt_no == sdt_partner ||
+ sdt_partner <= ZXDH_DEV_SDT_ID_MAX ||
+ p_key == NULL) {
+ return ZXDH_FALSE;
+ }
+
+ rc = zxdh_np_soft_sdt_tbl_get(dev_id, sdt_no, &sdt_hash1);
+ rc |= zxdh_np_soft_sdt_tbl_get(dev_id, sdt_partner, &sdt_hash2);
+ if (rc != ZXDH_OK)
+ return ZXDH_FALSE;
+
+ if (sdt_hash1.table_type != (ZXDH_SDT_TBLT_HASH) ||
+ sdt_hash2.table_type != ZXDH_SDT_TBLT_HASH ||
+ sdt_hash1.hash_table_width != sdt_hash2.hash_table_width ||
+ sdt_hash1.key_size != sdt_hash2.key_size ||
+ sdt_hash1.rsp_mode != sdt_hash2.rsp_mode) {
+ return ZXDH_FALSE;
+ }
+
+ *p_key = ZXDH_GET_HASH_KEY_CTRL(key_valid,
+ sdt_hash2.hash_table_width,
+ sdt_hash2.hash_table_id);
+
+ return ZXDH_TRUE;
+}
+
+static uint32_t
+zxdh_np_hash_red_black_node_alloc(ZXDH_RB_TN **p_rb_tn_new,
+ ZXDH_HASH_RBKEY_INFO **p_rbkey_new)
+{
+ ZXDH_RB_TN *p_rb_tn_new_temp = NULL;
+ ZXDH_HASH_RBKEY_INFO *p_rbkey_new_temp = NULL;
+
+ p_rbkey_new_temp = (ZXDH_HASH_RBKEY_INFO *)rte_zmalloc(NULL,
+ sizeof(ZXDH_HASH_RBKEY_INFO), 0);
+ if (p_rbkey_new_temp == NULL) {
+ PMD_DRV_LOG(ERR, "%s point null!", __func__);
+ return ZXDH_PAR_CHK_POINT_NULL;
+ }
+
+ p_rb_tn_new_temp = (ZXDH_RB_TN *)rte_zmalloc(NULL, sizeof(ZXDH_RB_TN), 0);
+ if (p_rb_tn_new_temp == NULL) {
+ rte_free(p_rbkey_new_temp);
+ PMD_DRV_LOG(ERR, "ICM %s:%d[Error:POINT NULL] !"
+ "FUNCTION : %s!", __FILE__, __LINE__, __func__);
+ return ZXDH_PAR_CHK_POINT_NULL;
+ }
+
+ ZXDH_INIT_RBT_TN(p_rb_tn_new_temp, p_rbkey_new_temp);
+
+ *p_rb_tn_new = p_rb_tn_new_temp;
+ *p_rbkey_new = p_rbkey_new_temp;
+
+ return ZXDH_OK;
+}
+
+static uint32_t
+zxdh_np_hash_rb_insert(uint32_t dev_id, HASH_ENTRY_CFG *p_hash_entry_cfg,
+ ZXDH_HASH_ENTRY *p_entry)
+{
+ uint32_t rc = ZXDH_OK;
+ ZXDH_HASH_RBKEY_INFO *p_rbkey_rtn = NULL;
+ ZXDH_HASH_CFG *p_hash_cfg = NULL;
+ ZXDH_HASH_RBKEY_INFO *p_rbkey_new = NULL;
+ ZXDH_RB_TN *p_rb_tn_new = NULL;
+ ZXDH_RB_TN *p_rb_tn_rtn = NULL;
+ uint32_t rst_actual_size = 0;
+
+ p_rbkey_new = p_hash_entry_cfg->p_rbkey_new;
+ p_rb_tn_new = p_hash_entry_cfg->p_rb_tn_new;
+ p_hash_cfg = p_hash_entry_cfg->p_hash_cfg;
+ rst_actual_size = ((p_hash_entry_cfg->rst_by_size) > ZXDH_HASH_RST_MAX) ?
+ ZXDH_HASH_RST_MAX : p_hash_entry_cfg->rst_by_size;
+ rc = zxdh_comm_rb_insert(&p_hash_cfg->hash_rb, (void *)p_rb_tn_new, (void *)(&p_rb_tn_rtn));
+ if (rc == ZXDH_RBT_RC_FULL) {
+ PMD_DRV_LOG(ERR, "The red black tree is full!");
+ rte_free(p_rbkey_new);
+ rte_free(p_rb_tn_new);
+ RTE_ASSERT(0);
+ return ZXDH_HASH_RC_RB_TREE_FULL;
+ } else if (rc == ZXDH_RBT_RC_UPDATE) {
+ p_hash_cfg->hash_stat.insert_same++;
+ PMD_DRV_LOG(DEBUG, "Hash update exist entry!");
+
+ ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_rb_tn_rtn);
+ p_rbkey_rtn = (ZXDH_HASH_RBKEY_INFO *)(p_rb_tn_rtn->p_key);
+
+ rte_memcpy(p_rbkey_rtn->rst, p_entry->p_rst, rst_actual_size);
+
+ rte_free(p_rbkey_new);
+ rte_free(p_rb_tn_new);
+ p_hash_entry_cfg->p_rbkey_new = p_rbkey_rtn;
+ p_hash_entry_cfg->p_rb_tn_new = p_rb_tn_rtn;
+
+ return ZXDH_HASH_RC_ADD_UPDATE;
+ }
+ PMD_DRV_LOG(DEBUG, "Hash insert new entry!");
+
+ rte_memcpy(p_rbkey_new->rst, p_entry->p_rst, rst_actual_size);
+ p_rbkey_new->entry_size = ZXDH_GET_HASH_ENTRY_SIZE(p_hash_entry_cfg->key_type);
+ ZXDH_INIT_D_NODE(&p_rbkey_new->entry_dn, p_rbkey_new);
+
+ return rc;
+}
+
+static uint32_t
+zxdh_np_hash_get_item_free_pos(uint32_t item_entry_max,
+ uint32_t wrt_mask, uint32_t entry_size)
+{
+ uint32_t i = 0;
+ uint32_t pos = 0xFFFFFFFF;
+ uint32_t mask = 0;
+
+ for (i = 0; i < item_entry_max; i += entry_size / ZXDH_HASH_ENTRY_POS_STEP) {
+ mask = ZXDH_GET_HASH_ENTRY_MASK(entry_size, i);
+
+ if (0 == (mask & wrt_mask)) {
+ pos = i;
+ break;
+ }
+ }
+
+ return pos;
+}
+
+static uint32_t
+zxdh_np_hash_insrt_to_item(ZXDH_HASH_CFG *p_hash_cfg,
+ ZXDH_HASH_RBKEY_INFO *p_rbkey,
+ ZXDH_SE_ITEM_CFG *p_item,
+ uint32_t item_idx,
+ uint32_t item_type,
+ __rte_unused uint32_t insrt_key_type)
+{
+ uint32_t rc = ZXDH_OK;
+
+ uint32_t free_pos = 0;
+ uint32_t dev_id = 0;
+ uint32_t item_entry_max = 4;
+
+ dev_id = p_hash_cfg->p_se_info->dev_id;
+
+ if (item_type == ZXDH_ITEM_DDR_256)
+ item_entry_max = 2;
+
+ if (!p_item->valid) {
+ rc = zxdh_comm_double_link_init(item_entry_max, &p_item->item_list);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_comm_double_link_init");
+
+ p_rbkey->entry_pos = 0;
+ p_item->wrt_mask = ZXDH_GET_HASH_ENTRY_MASK(p_rbkey->entry_size,
+ p_rbkey->entry_pos);
+ p_item->item_index = item_idx;
+ p_item->item_type = item_type;
+ p_item->valid = 1;
+ } else {
+ free_pos = zxdh_np_hash_get_item_free_pos(item_entry_max,
+ p_item->wrt_mask, p_rbkey->entry_size);
+
+ if (free_pos == 0xFFFFFFFF)
+ return ZXDH_HASH_RC_ITEM_FULL;
+ p_rbkey->entry_pos = free_pos;
+ p_item->wrt_mask |=
+ ZXDH_GET_HASH_ENTRY_MASK(p_rbkey->entry_size, p_rbkey->entry_pos);
+ }
+
+ PMD_DRV_LOG(DEBUG, "Entry in item pos is: [%d],"
+ "entry size is: [%d].", free_pos, p_rbkey->entry_size);
+
+ rc = zxdh_comm_double_link_insert_last(&p_rbkey->entry_dn, &p_item->item_list);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_comm_double_link_insert_last");
+
+ p_rbkey->p_item_info = p_item;
+
+ return rc;
+}
+
+static uint32_t
+zxdh_np_hash_insert_ddr(uint32_t dev_id, HASH_ENTRY_CFG *p_hash_entry_cfg,
+ uint8_t *p_temp_key, uint8_t *p_end_flag)
+{
+ ZXDH_HASH_CFG *p_hash_cfg = NULL;
+ uint8_t bulk_id = 0;
+ uint8_t key_type = 0;
+ uint8_t table_id = 0;
+ uint32_t key_by_size = 0;
+ uint32_t crc_value = 0;
+ uint32_t item_idx = 0xFFFFFFFF;
+ uint32_t item_type = 0;
+ HASH_DDR_CFG *p_ddr_cfg = NULL;
+ ZXDH_SE_ITEM_CFG *p_item = NULL;
+ uint32_t rc = ZXDH_OK;
+
+ p_hash_cfg = p_hash_entry_cfg->p_hash_cfg;
+ bulk_id = p_hash_entry_cfg->bulk_id;
+ p_ddr_cfg = p_hash_cfg->p_bulk_ddr_info[bulk_id];
+ table_id = p_hash_entry_cfg->table_id;
+
+ key_type = p_hash_entry_cfg->key_type;
+ if (ZXDH_HASH_KEY_512b == key_type && ZXDH_DDR_WIDTH_256b == p_ddr_cfg->width_mode) {
+ PMD_DRV_LOG(ERR, "ErrorCode[0x%x]: Hash DDR width mode"
+ " is not match to the key type.", ZXDH_HASH_RC_DDR_WIDTH_MODE_ERR);
+ return ZXDH_HASH_RC_DDR_WIDTH_MODE_ERR;
+ }
+
+ key_by_size = p_hash_entry_cfg->key_by_size;
+ crc_value = p_hash_cfg->p_hash32_fun(p_temp_key, key_by_size, p_ddr_cfg->hash_ddr_arg);
+ PMD_DRV_LOG(DEBUG, "hash ddr arg is: 0x%x.crc_value is 0x%x",
+ p_ddr_cfg->hash_ddr_arg, crc_value);
+
+ item_idx = crc_value % p_ddr_cfg->item_num;
+ item_type = ZXDH_ITEM_DDR_256;
+ if (ZXDH_DDR_WIDTH_512b == p_ddr_cfg->width_mode) {
+ item_idx = crc_value % p_ddr_cfg->item_num;
+ item_type = ZXDH_ITEM_DDR_512;
+ }
+
+ PMD_DRV_LOG(DEBUG, "Hash insert in ITEM_DDR_%s,"
+ "item_idx is: 0x%x.",
+ ((item_type == ZXDH_ITEM_DDR_256) ? "256" : "512"), item_idx);
+
+ p_item = p_ddr_cfg->p_item_array[item_idx];
+ if (p_item == NULL) {
+ p_item = (ZXDH_SE_ITEM_CFG *)rte_zmalloc(NULL, sizeof(ZXDH_SE_ITEM_CFG), 0);
+ if (p_item == NULL) {
+ PMD_DRV_LOG(ERR, "%s point null!", __func__);
+ return ZXDH_PAR_CHK_POINT_NULL;
+ }
+ p_ddr_cfg->p_item_array[item_idx] = p_item;
+ }
+
+ rc = zxdh_np_hash_insrt_to_item(p_hash_cfg,
+ p_hash_entry_cfg->p_rbkey_new,
+ p_item,
+ item_idx,
+ item_type,
+ key_type);
+
+ if (rc != ZXDH_HASH_RC_ITEM_FULL) {
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_hash_insrt_to_item");
+ *p_end_flag = 1;
+
+ p_hash_cfg->hash_stat.insert_ddr++;
+ p_hash_cfg->hash_stat.insert_table[table_id].ddr++;
+
+ p_item->hw_addr = GET_HASH_DDR_HW_ADDR(p_ddr_cfg->hw_baddr, item_idx);
+ p_item->bulk_id = p_hash_entry_cfg->bulk_id;
+ }
+
+ return rc;
+}
+
+static uint32_t
+zxdh_np_hash_insert_zcell(uint32_t dev_id, HASH_ENTRY_CFG *p_hash_entry_cfg,
+ uint8_t *p_temp_key, uint8_t *p_end_flag)
+{
+ uint8_t bulk_id = 0;
+ ZXDH_D_NODE *p_zcell_dn = NULL;
+ ZXDH_SE_ZCELL_CFG *p_zcell = NULL;
+ uint32_t zblk_idx = 0;
+ uint32_t zcell_id = 0;
+ uint32_t pre_zblk_idx = 0xFFFFFFFF;
+ ZXDH_SE_ITEM_CFG *p_item = NULL;
+ uint32_t item_idx = 0xFFFFFFFF;
+ uint32_t item_type = 0;
+ uint32_t rc = ZXDH_OK;
+ uint32_t crc_value = 0;
+ uint8_t table_id = 0;
+ ZXDH_SE_CFG *p_se_cfg = NULL;
+ ZXDH_HASH_CFG *p_hash_cfg = NULL;
+ ZXDH_SE_ZBLK_CFG *p_zblk = NULL;
+
+ PMD_DRV_LOG(DEBUG, "insert zcell start");
+ p_se_cfg = p_hash_entry_cfg->p_se_cfg;
+ ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_se_cfg);
+ bulk_id = p_hash_entry_cfg->bulk_id;
+ table_id = p_hash_entry_cfg->table_id;
+ p_hash_cfg = p_hash_entry_cfg->p_hash_cfg;
+ ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_hash_cfg);
+ 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;
+ ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_zcell);
+
+ if (((p_zcell->flag & ZXDH_ZCELL_FLAG_IS_MONO) && p_zcell->bulk_id != bulk_id) ||
+ ((!(p_zcell->flag & ZXDH_ZCELL_FLAG_IS_MONO)) &&
+ p_hash_cfg->bulk_ram_mono[bulk_id])) {
+ p_zcell_dn = p_zcell_dn->next;
+ continue;
+ }
+
+ 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;
+ crc_value = p_hash_cfg->p_hash16_fun(p_temp_key,
+ p_hash_entry_cfg->key_by_size, p_zblk->hash_arg);
+ }
+
+ PMD_DRV_LOG(DEBUG, "zblk_idx is [0x%x],"
+ "p_zblk->hash_arg is [0x%x], crc_value is [0x%x]",
+ zblk_idx, p_zblk->hash_arg, crc_value);
+
+ zcell_id = GET_ZCELL_IDX(p_zcell->zcell_idx);
+ item_idx = GET_ZCELL_CRC_VAL(zcell_id, crc_value);
+ p_item = &p_zcell->item_info[item_idx];
+ item_type = ZXDH_ITEM_RAM;
+
+ PMD_DRV_LOG(DEBUG, "zcell_id is [0x%x],"
+ "item_idx is [0x%x]", zcell_id, item_idx);
+
+ rc = zxdh_np_hash_insrt_to_item(p_hash_cfg,
+ p_hash_entry_cfg->p_rbkey_new,
+ p_item,
+ item_idx,
+ item_type,
+ p_hash_entry_cfg->key_type);
+
+ if (rc == ZXDH_HASH_RC_ITEM_FULL) {
+ PMD_DRV_LOG(DEBUG, "The item is full, check next.");
+ } else {
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_hash_insrt_to_item");
+ *p_end_flag = 1;
+
+ p_hash_cfg->hash_stat.insert_zcell++;
+ p_hash_cfg->hash_stat.insert_table[table_id].zcell++;
+
+ p_item->hw_addr = ZXDH_ZBLK_ITEM_ADDR_CALC(p_zcell->zcell_idx, item_idx);
+ break;
+ }
+
+ p_zcell_dn = p_zcell_dn->next;
+ }
+
+ return rc;
+}
+
+static uint32_t
+zxdh_np_hash_insert_zreg(uint32_t dev_id, HASH_ENTRY_CFG *p_hash_entry_cfg,
+ __rte_unused uint8_t *p_temp_key, uint8_t *p_end_flag)
+{
+ ZXDH_HASH_CFG *p_hash_cfg = NULL;
+ ZXDH_D_NODE *p_zblk_dn = NULL;
+ ZXDH_SE_ZBLK_CFG *p_zblk = NULL;
+ ZXDH_SE_ZREG_CFG *p_zreg = NULL;
+ ZXDH_SE_ITEM_CFG *p_item = NULL;
+ uint8_t reg_index = 0;
+ uint32_t zblk_idx = 0;
+ uint32_t rc = ZXDH_OK;
+ uint8_t bulk_id = 0;
+ uint32_t item_idx = 0xFFFFFFFF;
+ uint32_t item_type = 0;
+ uint32_t table_id = 0;
+ ZXDH_HASH_RBKEY_INFO *p_rbkey_new = NULL;
+
+ PMD_DRV_LOG(DEBUG, "insert zreg start");
+ bulk_id = p_hash_entry_cfg->bulk_id;
+ table_id = p_hash_entry_cfg->table_id;
+ p_rbkey_new = p_hash_entry_cfg->p_rbkey_new;
+ ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_rbkey_new);
+
+ 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;
+ zblk_idx = p_zblk->zblk_idx;
+
+ for (reg_index = 0; reg_index < ZXDH_SE_ZREG_NUM; reg_index++) {
+ p_zreg = &p_zblk->zreg_info[reg_index];
+
+ if (((p_zreg->flag & ZXDH_ZREG_FLAG_IS_MONO) &&
+ p_zreg->bulk_id != bulk_id) ||
+ ((!(p_zreg->flag & ZXDH_ZREG_FLAG_IS_MONO)) &&
+ p_hash_cfg->bulk_ram_mono[bulk_id])) {
+ continue;
+ }
+
+ p_item = &p_zblk->zreg_info[reg_index].item_info;
+ item_type = ZXDH_ITEM_REG;
+ item_idx = reg_index;
+ rc = zxdh_np_hash_insrt_to_item(p_hash_cfg,
+ p_hash_entry_cfg->p_rbkey_new,
+ p_item,
+ item_idx,
+ item_type,
+ p_hash_entry_cfg->key_type);
+
+ if (rc == ZXDH_HASH_RC_ITEM_FULL) {
+ PMD_DRV_LOG(DEBUG, "The item is full, check next.");
+ } else {
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_hash_insrt_to_item");
+ *p_end_flag = 1;
+
+ p_hash_cfg->hash_stat.insert_zreg++;
+ p_hash_cfg->hash_stat.insert_table[table_id].zreg++;
+
+ p_item->hw_addr = ZXDH_ZBLK_HASH_LIST_REG_ADDR_CALC(zblk_idx,
+ reg_index);
+ break;
+ }
+ }
+
+ if (*p_end_flag)
+ break;
+
+ p_zblk_dn = p_zblk_dn->next;
+ }
+
+ return rc;
+}
+
+static uint32_t
+zxdh_np_dtb_hash_form_write(ZXDH_HASH_CFG *p_hash_cfg,
+ ZXDH_HASH_RBKEY_INFO *p_rbkey_new,
+ uint32_t actu_key_size,
+ ZXDH_DTB_ENTRY_T *p_entry,
+ __rte_unused uint32_t opr_mode)
+{
+ uint32_t key_type = 0;
+ uint32_t key_by_size = 0;
+ uint32_t rst_by_size = 0;
+ uint32_t byte_offset = 0;
+ uint32_t dev_id = 0;
+ uint32_t addr;
+
+ ZXDH_D_NODE *p_entry_dn = NULL;
+ ZXDH_SE_ITEM_CFG *p_item_info = NULL;
+ ZXDH_HASH_RBKEY_INFO *p_rbkey = NULL;
+ uint8_t entry_data[ZXDH_SE_ENTRY_WIDTH_MAX] = {0};
+
+ dev_id = p_hash_cfg->p_se_info->dev_id;
+
+ p_item_info = p_rbkey_new->p_item_info;
+ if (p_item_info == NULL) {
+ PMD_DRV_LOG(ERR, "p_item_info point null!");
+ return ZXDH_PAR_CHK_POINT_NULL;
+ }
+
+ PMD_DRV_LOG(DEBUG, "zcam p_item_info->hw_addr is 0x%x",
+ p_item_info->hw_addr);
+ addr = p_item_info->hw_addr;
+
+ p_entry_dn = p_item_info->item_list.p_next;
+
+ while (p_entry_dn) {
+ p_rbkey = (ZXDH_HASH_RBKEY_INFO *)(p_entry_dn->data);
+ key_type = ZXDH_GET_HASH_KEY_TYPE(p_rbkey->key);
+ key_by_size = ZXDH_GET_KEY_SIZE(actu_key_size);
+ rst_by_size = ZXDH_GET_RST_SIZE(key_type, actu_key_size);
+
+ byte_offset = p_rbkey->entry_pos * ZXDH_HASH_ENTRY_POS_STEP;
+ memcpy(entry_data + byte_offset, p_rbkey->key, key_by_size);
+
+ byte_offset += key_by_size;
+ memcpy(entry_data + byte_offset, p_rbkey->rst,
+ ((rst_by_size > ZXDH_HASH_RST_MAX) ? ZXDH_HASH_RST_MAX : rst_by_size));
+
+ p_entry_dn = p_entry_dn->next;
+ }
+
+ zxdh_np_comm_swap(entry_data, ZXDH_SE_ENTRY_WIDTH_MAX);
+
+ zxdh_np_dtb_se_alg_zcam_data_write(dev_id,
+ addr,
+ entry_data,
+ p_entry);
+
+ return ZXDH_OK;
+}
+
+static uint32_t
+zxdh_np_dtb_hash_delete(uint32_t dev_id,
+ uint32_t sdt_no,
+ ZXDH_HASH_ENTRY *p_hash_entry,
+ ZXDH_DTB_ENTRY_T *p_dtb_one_entry)
+{
+ uint32_t rc = ZXDH_OK;
+ ZXDH_HASH_CFG *p_hash_cfg = NULL;
+ ZXDH_SE_ITEM_CFG *p_item = NULL;
+ ZXDH_RB_TN *p_rb_tn_rtn = NULL;
+ ZXDH_HASH_RBKEY_INFO *p_rbkey_rtn = NULL;
+ ZXDH_MUTEX_T *p_hash_mutex = NULL;
+ HASH_ENTRY_CFG hash_entry_cfg = {0};
+ ZXDH_HASH_RBKEY_INFO temp_rbkey = {0};
+ HASH_DDR_CFG *bulk_ddr_info = NULL;
+
+ 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);
+
+ 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");
+
+ memcpy(temp_rbkey.key, p_hash_entry->p_key, hash_entry_cfg.key_by_size);
+ rc = zxdh_comm_rb_delete(&p_hash_cfg->hash_rb, &temp_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!");
+
+ rc = zxdh_np_comm_mutex_unlock(p_hash_mutex);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_comm_mutex_unlock");
+
+ return ZXDH_HASH_RC_DEL_SRHFAIL;
+ }
+
+ ZXDH_COMM_CHECK_DEV_POINT_UNLOCK(dev_id, p_rb_tn_rtn, p_hash_mutex);
+ p_rbkey_rtn = (ZXDH_HASH_RBKEY_INFO *)(p_rb_tn_rtn->p_key);
+ memset(p_rbkey_rtn->rst, 0, sizeof(p_rbkey_rtn->rst));
+ hash_entry_cfg.p_rbkey_new = p_rbkey_rtn;
+ hash_entry_cfg.p_rb_tn_new = p_rb_tn_rtn;
+
+ p_item = p_rbkey_rtn->p_item_info;
+ ZXDH_COMM_CHECK_DEV_POINT_UNLOCK(dev_id, p_item, p_hash_mutex);
+ rc = zxdh_comm_double_link_del(&p_rbkey_rtn->entry_dn, &p_item->item_list);
+ ZXDH_COMM_CHECK_DEV_RC_UNLOCK(dev_id, rc, "zxdh_comm_double_link_del", p_hash_mutex);
+ p_item->wrt_mask &= ~(ZXDH_GET_HASH_ENTRY_MASK(p_rbkey_rtn->entry_size,
+ p_rbkey_rtn->entry_pos)) & 0xF;
+
+ rc = zxdh_np_dtb_hash_form_write(hash_entry_cfg.p_hash_cfg,
+ hash_entry_cfg.p_rbkey_new,
+ hash_entry_cfg.actu_key_size,
+ p_dtb_one_entry,
+ ZXDH_DTB_ITEM_DELETE);
+ ZXDH_COMM_CHECK_DEV_RC_UNLOCK(dev_id, rc, "zxdh_np_dtb_hash_form_write", p_hash_mutex);
+
+ if (p_item->item_list.used == 0) {
+ if (p_item->item_type == ZXDH_ITEM_DDR_256 ||
+ p_item->item_type == ZXDH_ITEM_DDR_512) {
+ bulk_ddr_info = p_hash_cfg->p_bulk_ddr_info[hash_entry_cfg.bulk_id];
+ if (p_item->item_index > bulk_ddr_info->item_num) {
+ rc = zxdh_np_comm_mutex_unlock(p_hash_mutex);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_comm_mutex_unlock");
+ return ZXDH_PAR_CHK_INVALID_INDEX;
+ }
+ bulk_ddr_info->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++;
+
+ 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_insert(uint32_t dev_id,
+ uint32_t sdt_no,
+ ZXDH_HASH_ENTRY *p_hash_entry,
+ ZXDH_DTB_ENTRY_T *p_dtb_one_entry)
+{
+ uint32_t rc = ZXDH_OK;
+ uint32_t rtn = ZXDH_OK;
+ uint8_t end_flag = 0;
+ uint8_t temp_key[ZXDH_HASH_KEY_MAX] = {0};
+ ZXDH_HASH_CFG *p_hash_cfg = NULL;
+ ZXDH_RB_TN *p_rb_tn_rtn = NULL;
+ ZXDH_RB_TN *p_rb_tn_new = NULL;
+ ZXDH_HASH_RBKEY_INFO *p_rbkey_new = NULL;
+ ZXDH_MUTEX_T *p_hash_mutex = 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);
+
+ 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_np_hash_red_black_node_alloc(&p_rb_tn_new, &p_rbkey_new);
+ ZXDH_COMM_CHECK_DEV_RC_UNLOCK(dev_id, rc,
+ "zxdh_np_hash_red_black_node_alloc", p_hash_mutex);
+ memcpy(p_rbkey_new->key, p_hash_entry->p_key,
+ hash_entry_cfg.key_by_size);
+ hash_entry_cfg.p_rbkey_new = p_rbkey_new;
+ hash_entry_cfg.p_rb_tn_new = p_rb_tn_new;
+
+ rc = zxdh_np_hash_rb_insert(dev_id, &hash_entry_cfg, p_hash_entry);
+ if (rc != ZXDH_OK) {
+ if (rc == ZXDH_HASH_RC_ADD_UPDATE) {
+ rc = zxdh_np_dtb_hash_form_write(p_hash_cfg,
+ hash_entry_cfg.p_rbkey_new,
+ hash_entry_cfg.actu_key_size,
+ p_dtb_one_entry,
+ ZXDH_DTB_ITEM_ADD_OR_UPDATE);
+ ZXDH_COMM_CHECK_DEV_RC_UNLOCK(dev_id, rc,
+ "zxdh_np_dtb_hash_form_write", p_hash_mutex);
+ }
+
+ rtn = zxdh_np_comm_mutex_unlock(p_hash_mutex);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rtn, "zxdh_np_comm_mutex_unlock");
+
+ return rc;
+ }
+
+ zxdh_np_hash_set_crc_key(&hash_entry_cfg, p_hash_entry, temp_key);
+
+ if (p_hash_cfg->ddr_valid) {
+ rc = zxdh_np_hash_insert_ddr(dev_id, &hash_entry_cfg, temp_key, &end_flag);
+ ZXDH_COMM_CHECK_DEV_RC_UNLOCK(dev_id, rc, "hash_insert_ddr", p_hash_mutex);
+ }
+
+ if (!end_flag) {
+ rc = zxdh_np_hash_insert_zcell(dev_id, &hash_entry_cfg, temp_key, &end_flag);
+ ZXDH_COMM_CHECK_DEV_RC_UNLOCK(dev_id, rc, "hash_insert_zcell", p_hash_mutex);
+ }
+
+ if (!end_flag) {
+ rc = zxdh_np_hash_insert_zreg(dev_id, &hash_entry_cfg, temp_key, &end_flag);
+ ZXDH_COMM_CHECK_DEV_RC_UNLOCK(dev_id, rc, "hash_insert_zreg", p_hash_mutex);
+ }
+
+ if (!end_flag) {
+ p_hash_cfg->hash_stat.insert_fail++;
+ memcpy(temp_key, p_hash_entry->p_key, hash_entry_cfg.key_by_size);
+ rc = zxdh_comm_rb_delete(&p_hash_cfg->hash_rb, p_rbkey_new, &p_rb_tn_rtn);
+ ZXDH_COMM_CHECK_DEV_RC_UNLOCK(dev_id, rc, "zxdh_comm_rb_delete", p_hash_mutex);
+ RTE_ASSERT(p_rb_tn_new == p_rb_tn_rtn);
+ rte_free(p_rbkey_new);
+ rte_free(p_rb_tn_rtn);
+ PMD_DRV_LOG(ERR, "ZXDH_HASH_RC_TBL_FULL.sdt_no=%u", sdt_no);
+ rc = zxdh_np_comm_mutex_unlock(p_hash_mutex);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_comm_mutex_unlock");
+
+ return ZXDH_RC_DTB_DOWN_HASH_CONFLICT;
+ }
+
+ rc = zxdh_np_dtb_hash_form_write(p_hash_cfg,
+ hash_entry_cfg.p_rbkey_new,
+ hash_entry_cfg.actu_key_size,
+ p_dtb_one_entry,
+ ZXDH_DTB_ITEM_ADD_OR_UPDATE);
+ ZXDH_COMM_CHECK_DEV_RC_UNLOCK(dev_id, rc,
+ "zxdh_np_dtb_hash_form_write", p_hash_mutex);
+
+ p_hash_cfg->hash_stat.insert_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_apt_get_sdt_partner(uint32_t dev_id, uint32_t sdt_no)
+{
+ SE_APT_CALLBACK_T *p_apt_callback = NULL;
+
+ p_apt_callback = &g_apt_se_callback[dev_id][sdt_no];
+
+ if (p_apt_callback->table_type == ZXDH_SDT_TBLT_HASH)
+ return p_apt_callback->se_func_info.hash_func.sdt_partner;
+
+ if (p_apt_callback->table_type == ZXDH_SDT_TBLT_ETCAM)
+ return p_apt_callback->se_func_info.acl_func.sdt_partner;
+
+ return UINT32_MAX;
+}
+
+static uint32_t
+zxdh_np_dtb_hash_one_entry(uint32_t dev_id,
+ uint32_t sdt_no,
+ uint32_t del_en,
+ void *p_data,
+ uint32_t *p_dtb_len,
+ ZXDH_DTB_ENTRY_T *p_dtb_one_entry)
+{
+ uint32_t rc = ZXDH_OK;
+ uint8_t aucKey[ZXDH_HASH_KEY_MAX] = {0};
+ uint8_t aucRst[ZXDH_HASH_RST_MAX] = {0};
+ uint8_t key_valid = 1;
+ uint8_t key = 0;
+ uint32_t sdt_partner = 0;
+ uint8_t valid = 0;
+
+ ZXDH_SDT_TBL_HASH_T sdt_hash = {0};
+ ZXDH_DTB_HASH_ENTRY_INFO_T *p_entry = NULL;
+ ZXDH_HASH_ENTRY entry = {0};
+
+ rc = zxdh_np_soft_sdt_tbl_get(dev_id, sdt_no, &sdt_hash);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_soft_sdt_tbl_get");
+
+ entry.p_key = aucKey;
+ entry.p_rst = aucRst;
+ entry.p_key[0] = ZXDH_GET_HASH_KEY_CTRL(key_valid,
+ sdt_hash.hash_table_width,
+ sdt_hash.hash_table_id);
+ p_entry = (ZXDH_DTB_HASH_ENTRY_INFO_T *)p_data;
+ memcpy(&entry.p_key[1], p_entry->p_actu_key,
+ ZXDH_GET_ACTU_KEY_BY_SIZE(sdt_hash.key_size));
+ memcpy(entry.p_rst, p_entry->p_rst, 4 * (0x1 << sdt_hash.rsp_mode));
+
+ if (del_en) {
+ do {
+ rc = zxdh_np_dtb_hash_delete(dev_id, sdt_no, &entry, p_dtb_one_entry);
+ sdt_partner = zxdh_np_apt_get_sdt_partner(dev_id, sdt_no);
+ valid = zxdh_np_hash_sdt_partner_valid(sdt_no, sdt_partner, &key);
+ entry.p_key[0] = key;
+ sdt_no = sdt_partner;
+ } while ((rc == ZXDH_HASH_RC_DEL_SRHFAIL) && (valid == ZXDH_TRUE));
+
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_hash_delete");
+ } else {
+ do {
+ rc = zxdh_np_dtb_hash_insert(dev_id, sdt_no, &entry, p_dtb_one_entry);
+ sdt_partner = zxdh_np_apt_get_sdt_partner(dev_id, sdt_no);
+ valid = zxdh_np_hash_sdt_partner_valid(sdt_no, sdt_partner, &key);
+ entry.p_key[0] = key;
+ sdt_no = sdt_partner;
+ } while ((rc == ZXDH_RC_DTB_DOWN_HASH_CONFLICT) && (valid == ZXDH_TRUE));
+
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_hash_insert");
+ }
+
+ *p_dtb_len = p_dtb_one_entry->data_size / ZXDH_DTB_LEN_POS_SETP + 1;
+
+ return rc;
+}
int
zxdh_np_dtb_table_entry_write(uint32_t dev_id,
@@ -4621,6 +5562,12 @@ zxdh_np_dtb_table_entry_write(uint32_t dev_id,
pentry->p_entry_data, &one_dtb_len, &dtb_one_entry);
break;
}
+ case ZXDH_SDT_TBLT_HASH:
+ {
+ rc = zxdh_np_dtb_hash_one_entry(dev_id, sdt_no, ZXDH_DTB_ITEM_ADD_OR_UPDATE,
+ pentry->p_entry_data, &one_dtb_len, &dtb_one_entry);
+ break;
+ }
default:
{
PMD_DRV_LOG(ERR, "SDT table_type[ %d ] is invalid!", tbl_type);
@@ -4703,6 +5650,15 @@ zxdh_np_dtb_table_entry_delete(uint32_t dev_id,
pentry->p_entry_data, &one_dtb_len, &dtb_one_entry);
break;
}
+ case ZXDH_SDT_TBLT_HASH:
+ {
+ rc = zxdh_np_dtb_hash_one_entry(dev_id, sdt_no,
+ ZXDH_DTB_ITEM_DELETE, pentry->p_entry_data,
+ &one_dtb_len, &dtb_one_entry);
+ if (rc == ZXDH_HASH_RC_DEL_SRHFAIL)
+ continue;
+ 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 b1b9dc9a1b..2c94125817 100644
--- a/drivers/net/zxdh/zxdh_np.h
+++ b/drivers/net/zxdh/zxdh_np.h
@@ -10,6 +10,8 @@
#define ZXDH_OK (0)
#define ZXDH_ERR (1)
+#define ZXDH_TRUE (1)
+#define ZXDH_FALSE (0)
#define ZXDH_DISABLE (0)
#define ZXDH_ENABLE (1)
#define ZXDH_PORT_NAME_MAX (32)
@@ -92,6 +94,7 @@
#define ZXDH_DTB_LEN_POS_SETP (16)
#define ZXDH_DTB_ITEM_ADD_OR_UPDATE (0)
#define ZXDH_DTB_ITEM_DELETE (1)
+#define ZXDH_DTB_ZCAM_LEN_SIZE (5)
#define ZXDH_ETCAM_LEN_SIZE (6)
#define ZXDH_ETCAM_BLOCK_NUM (8)
@@ -538,6 +541,14 @@ typedef enum zxdh_hash_key_type_e {
ZXDH_HASH_KEY_512b,
} ZXDH_HASH_KEY_TYPE;
+typedef enum zxdh_se_item_type_e {
+ ZXDH_ITEM_INVALID = 0,
+ ZXDH_ITEM_RAM,
+ ZXDH_ITEM_DDR_256,
+ ZXDH_ITEM_DDR_512,
+ ZXDH_ITEM_REG,
+} ZXDH_SE_ITEM_TYPE;
+
typedef struct zxdh_avl_node_t {
void *p_key;
uint32_t result;
@@ -1096,6 +1107,7 @@ typedef struct dpp_dev_cfg_t {
ZXDH_DEV_READ_FUNC p_pcie_read_fun;
ZXDH_MUTEX_T dtb_mutex;
ZXDH_MUTEX_T dtb_queue_mutex[ZXDH_DTB_QUEUE_NUM_MAX];
+ ZXDH_MUTEX_T hash_mutex[ZXDH_HASH_FUNC_ID_NUM];
ZXDH_DEV_APT_SE_TBL_RES_T dev_apt_se_tbl_res;
} ZXDH_DEV_CFG_T;
--
2.27.0
[-- Attachment #1.1.2: Type: text/html , Size: 90526 bytes --]
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [PATCH v1 10/14] net/zxdh: support hash tables write and delete ops
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
0 siblings, 0 replies; 32+ messages in thread
From: Stephen Hemminger @ 2025-02-10 17:45 UTC (permalink / raw)
To: Bingbin Chen; +Cc: dev
On Mon, 10 Feb 2025 09:50:13 +0800
Bingbin Chen <chen.bingbin@zte.com.cn> wrote:
> +static inline uint32_t
> +ZXDH_ZBLK_ADDR_CONV(uint32_t zblk_idx)
Do not name functions with all upper case, that is reserved for macros.
> +{
> + return ((zblk_idx) / ZXDH_ZBLK_NUM_PER_ZGRP) * (1 << ZXDH_ZBLK_IDX_BT_WIDTH) + (zblk_idx)
> + % ZXDH_ZBLK_NUM_PER_ZGRP;
Indent the previous line since it is contunation of expression
> +}
> +
> +static inline uint32_t
> +ZXDH_ZCELL_ADDR_CONV(uint32_t zcell_idx)
> +{
> + uint32_t blk_grp_idx = (zcell_idx >> ZXDH_ZCELL_IDX_BT_WIDTH) &
> + ((1 << (ZXDH_ZBLK_IDX_BT_WIDTH + ZXDH_ZGRP_IDX_BT_WIDTH)) - 1);
> +
> + uint32_t cell_idx = zcell_idx & ((1 << ZXDH_ZCELL_IDX_BT_WIDTH) - 1);
> +
> + return (ZXDH_ZBLK_ADDR_CONV(blk_grp_idx) << ZXDH_ZCELL_IDX_BT_WIDTH) | cell_idx;
> +}
^ permalink raw reply [flat|nested] 32+ messages in thread
* [PATCH v1 11/14] net/zxdh: get hash table entry result
2025-02-10 1:50 ` [PATCH v1 06/14] net/zxdh: add eram tables ops Bingbin Chen
` (3 preceding siblings ...)
2025-02-10 1:50 ` [PATCH v1 10/14] net/zxdh: support hash tables write and delete ops Bingbin Chen
@ 2025-02-10 1:50 ` Bingbin Chen
2025-02-10 17:46 ` Stephen Hemminger
2025-02-10 1:50 ` [PATCH v1 12/14] net/zxdh: delete all hash entries Bingbin Chen
` (2 subsequent siblings)
7 siblings, 1 reply; 32+ messages in thread
From: Bingbin Chen @ 2025-02-10 1:50 UTC (permalink / raw)
To: dev; +Cc: Bingbin Chen
[-- 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 --]
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [PATCH v1 11/14] net/zxdh: get hash table entry result
2025-02-10 1:50 ` [PATCH v1 11/14] net/zxdh: get hash table entry result Bingbin Chen
@ 2025-02-10 17:46 ` Stephen Hemminger
0 siblings, 0 replies; 32+ messages in thread
From: Stephen Hemminger @ 2025-02-10 17:46 UTC (permalink / raw)
To: Bingbin Chen; +Cc: dev
On Mon, 10 Feb 2025 09:50:14 +0800
Bingbin Chen <chen.bingbin@zte.com.cn> wrote:
> +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;
> +
Looks like structure initializer here.
^ permalink raw reply [flat|nested] 32+ messages in thread
* [PATCH v1 12/14] net/zxdh: delete all hash entries
2025-02-10 1:50 ` [PATCH v1 06/14] net/zxdh: add eram tables ops Bingbin Chen
` (4 preceding siblings ...)
2025-02-10 1:50 ` [PATCH v1 11/14] net/zxdh: get hash table entry result Bingbin Chen
@ 2025-02-10 1:50 ` 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
7 siblings, 1 reply; 32+ messages in thread
From: Bingbin Chen @ 2025-02-10 1:50 UTC (permalink / raw)
To: dev; +Cc: Bingbin Chen
[-- Attachment #1.1.1: Type: text/plain, Size: 39462 bytes --]
Implement hash table entries all delete operation
by dtb channel.
Signed-off-by: Bingbin Chen <chen.bingbin@zte.com.cn>
---
drivers/net/zxdh/zxdh_ethdev.c | 45 ++
drivers/net/zxdh/zxdh_np.c | 1092 ++++++++++++++++++++++++++++++++
drivers/net/zxdh/zxdh_np.h | 19 +
3 files changed, 1156 insertions(+)
diff --git a/drivers/net/zxdh/zxdh_ethdev.c b/drivers/net/zxdh/zxdh_ethdev.c
index 18b661b1ab..b99e79ca4a 100644
--- a/drivers/net/zxdh/zxdh_ethdev.c
+++ b/drivers/net/zxdh/zxdh_ethdev.c
@@ -966,6 +966,29 @@ zxdh_np_dtb_data_res_free(struct zxdh_hw *hw)
zxdh_shared_data->np_init_done = 0;
}
+static int
+zxdh_tbl_entry_online_destroy(struct rte_eth_dev *dev)
+{
+ struct zxdh_hw *hw = dev->data->dev_private;
+ uint32_t sdt_no;
+ int ret = 0;
+ if (!g_dtb_data.init_done)
+ return ret;
+ if (hw->is_pf) {
+ sdt_no = ZXDH_SDT_L2_ENTRY_TABLE0 + hw->hash_search_index;
+ ret = zxdh_np_dtb_hash_online_delete(0, g_dtb_data.queueid, sdt_no);
+ if (ret)
+ PMD_DRV_LOG(ERR, "%s sdt_no %d failed. code:%d ",
+ dev->data->name, sdt_no, ret);
+ sdt_no = ZXDH_SDT_MC_TABLE0 + hw->hash_search_index;
+ ret = zxdh_np_dtb_hash_online_delete(0, g_dtb_data.queueid, sdt_no);
+ if (ret)
+ PMD_DRV_LOG(ERR, "%s sdt_no %d failed. code:%d",
+ dev->data->name, sdt_no, ret);
+ }
+ return ret;
+}
+
static void
zxdh_np_uninit(struct rte_eth_dev *dev)
{
@@ -974,6 +997,8 @@ zxdh_np_uninit(struct rte_eth_dev *dev)
if (!g_dtb_data.init_done && !g_dtb_data.dev_refcnt)
return;
+ zxdh_tbl_entry_online_destroy(dev);
+
if (--g_dtb_data.dev_refcnt == 0)
zxdh_np_dtb_data_res_free(hw);
}
@@ -1394,6 +1419,25 @@ zxdh_init_once(void)
return ret;
}
+static int zxdh_tbl_entry_offline_destroy(struct zxdh_hw *hw)
+{
+ int ret = 0;
+ if (!g_dtb_data.init_done)
+ return ret;
+ if (hw->is_pf) {
+ uint32_t sdt_no;
+ sdt_no = ZXDH_SDT_L2_ENTRY_TABLE0 + hw->hash_search_index;
+ ret = zxdh_np_dtb_hash_offline_delete(0, g_dtb_data.queueid, sdt_no, 0);
+ if (ret)
+ PMD_DRV_LOG(ERR, "sdt_no %d delete failed. code:%d ", sdt_no, ret);
+ sdt_no = ZXDH_SDT_MC_TABLE0 + hw->hash_search_index;
+ ret = zxdh_np_dtb_hash_offline_delete(0, g_dtb_data.queueid, sdt_no, 0);
+ if (ret)
+ PMD_DRV_LOG(ERR, "sdt_no %d delete failed. code:%d ", sdt_no, ret);
+ }
+ return ret;
+}
+
static int
zxdh_np_init(struct rte_eth_dev *eth_dev)
{
@@ -1423,6 +1467,7 @@ zxdh_np_init(struct rte_eth_dev *eth_dev)
PMD_DRV_LOG(ERR, "invalid hash idx %d", hw->hash_search_index);
return -1;
}
+ zxdh_tbl_entry_offline_destroy(hw);
}
if (zxdh_shared_data != NULL)
diff --git a/drivers/net/zxdh/zxdh_np.c b/drivers/net/zxdh/zxdh_np.c
index 09ff42b3be..230a1d44be 100644
--- a/drivers/net/zxdh/zxdh_np.c
+++ b/drivers/net/zxdh/zxdh_np.c
@@ -417,6 +417,17 @@ do {\
} \
} while (0)
+#define ZXDH_COMM_CHECK_POINT_MEMORY_FREE2PTR(point, ptr0, ptr1)\
+do {\
+ if ((point) == NULL) {\
+ PMD_DRV_LOG(ERR, " ZXDH %s:%d[Error:POINT NULL] ! FUNCTION"\
+ ": %s!", __FILE__, __LINE__, __func__);\
+ rte_free(ptr0);\
+ rte_free(ptr1);\
+ RTE_ASSERT(0);\
+ } \
+} while (0)
+
#define ZXDH_COMM_CHECK_RC_MEMORY_FREE(rc, becall, ptr)\
do {\
if ((rc) != 0) {\
@@ -578,6 +589,8 @@ zxdh_np_get_tn_color(ZXDH_RB_TN *p_tn)
#define GET_HASH_TBL_ID_INFO(dev_id, fun_id, tbl_id) (&g_tbl_id_info[dev_id][fun_id][tbl_id])
+#define ZXDH_GET_HASH_TBL_ID(p_key) ((p_key)[0] & 0x1F)
+
static inline uint32_t
zxdh_np_get_hash_entry_size(uint32_t key_type)
{
@@ -1809,6 +1822,20 @@ zxdh_np_se_apt_rb_delete(ZXDH_RB_CFG *rb_cfg, void *p_data, __rte_unused uint32_
return rc;
}
+static uint32_t
+zxdh_np_se_apt_rb_search(ZXDH_RB_CFG *rb_cfg, void *p_data, uint32_t len)
+{
+ uint32_t rc = ZXDH_OK;
+ ZXDH_RB_TN *p_rb_rtn = NULL;
+
+ rc = zxdh_comm_rb_search(rb_cfg, p_data, &p_rb_rtn);
+ if (rc != ZXDH_OK)
+ return rc;
+
+ rte_memcpy(p_data, p_rb_rtn->p_key, len);
+ return rc;
+}
+
static uint32_t
zxdh_np_dev_init(void)
{
@@ -3841,6 +3868,240 @@ zxdh_np_dev_del(uint32_t dev_id)
}
}
+static uint32_t
+zxdh_np_hash_soft_all_entry_delete(ZXDH_SE_CFG *p_se_cfg, uint32_t hash_id)
+{
+ uint32_t rc = 0;
+ uint32_t dev_id = 0;
+ uint8_t table_id = 0;
+ uint32_t bulk_id = 0;
+
+ ZXDH_D_NODE *p_node = NULL;
+ ZXDH_RB_TN *p_rb_tn = NULL;
+ ZXDH_RB_TN *p_rb_tn_rtn = NULL;
+ ZXDH_D_HEAD *p_head_hash_rb = NULL;
+ ZXDH_HASH_CFG *p_hash_cfg = NULL;
+ ZXDH_FUNC_ID_INFO *p_func_info = NULL;
+ ZXDH_HASH_RBKEY_INFO *p_rbkey = NULL;
+ ZXDH_HASH_RBKEY_INFO *p_rbkey_rtn = NULL;
+ ZXDH_SE_ITEM_CFG *p_item = NULL;
+
+ dev_id = p_se_cfg->dev_id;
+
+ p_func_info = ZXDH_GET_FUN_INFO(p_se_cfg, hash_id);
+
+ p_hash_cfg = (ZXDH_HASH_CFG *)p_func_info->fun_ptr;
+ p_head_hash_rb = &p_hash_cfg->hash_rb.tn_list;
+
+ while (p_head_hash_rb->used) {
+ p_node = p_head_hash_rb->p_next;
+ p_rb_tn = (ZXDH_RB_TN *)p_node->data;
+ p_rbkey = (ZXDH_HASH_RBKEY_INFO *)p_rb_tn->p_key;
+ table_id = ZXDH_GET_HASH_TBL_ID(p_rbkey->key);
+ bulk_id = ((table_id >> 2) & 0x7);
+
+ rc = zxdh_comm_rb_delete(&p_hash_cfg->hash_rb, p_rbkey, &p_rb_tn_rtn);
+ if (rc == ZXDH_RBT_RC_SRHFAIL) {
+ p_hash_cfg->hash_stat.delete_fail++;
+ PMD_DRV_LOG(DEBUG, "Error!there is not item in hash!");
+ return ZXDH_HASH_RC_DEL_SRHFAIL;
+ }
+
+ ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_rb_tn_rtn);
+ p_rbkey_rtn = (ZXDH_HASH_RBKEY_INFO *)(p_rb_tn_rtn->p_key);
+ p_item = p_rbkey_rtn->p_item_info;
+
+ rc = zxdh_comm_double_link_del(&p_rbkey_rtn->entry_dn, &p_item->item_list);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_comm_double_link_del");
+ p_item->wrt_mask &= ~(ZXDH_GET_HASH_ENTRY_MASK(p_rbkey_rtn->entry_size,
+ p_rbkey_rtn->entry_pos)) & 0xF;
+
+ if (p_item->item_list.used == 0) {
+ if (p_item->item_type == ZXDH_ITEM_DDR_256 ||
+ p_item->item_type == ZXDH_ITEM_DDR_512) {
+ p_hash_cfg->p_bulk_ddr_info[bulk_id]->p_item_array
+ [p_item->item_index] = NULL;
+ rte_free(p_item);
+ } else {
+ p_item->valid = 0;
+ }
+ }
+
+ rte_free(p_rbkey_rtn);
+ rte_free(p_rb_tn_rtn);
+ p_hash_cfg->hash_stat.delete_ok++;
+ }
+
+ return rc;
+}
+
+static uint32_t
+zxdh_np_hash_zcam_resource_deinit(ZXDH_HASH_CFG *p_hash_cfg)
+{
+ uint32_t rc = 0;
+ uint32_t dev_id = 0;
+ uint32_t i = 0;
+
+ ZXDH_D_NODE *p_node = NULL;
+ ZXDH_D_HEAD *p_head = NULL;
+ ZXDH_SE_ZBLK_CFG *p_zblk_cfg = NULL;
+ ZXDH_SE_ZCELL_CFG *p_zcell_cfg = NULL;
+
+ dev_id = p_hash_cfg->p_se_info->dev_id;
+
+ p_head = &p_hash_cfg->hash_shareram.zcell_free_list;
+
+ while (p_head->used) {
+ p_node = p_head->p_next;
+
+ rc = zxdh_comm_double_link_del(p_node, p_head);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_comm_double_link_del");
+ p_zcell_cfg = (ZXDH_SE_ZCELL_CFG *)p_node->data;
+ p_zcell_cfg->is_used = 0;
+ p_zcell_cfg->flag = 0;
+ }
+
+ p_head = &p_hash_cfg->hash_shareram.zblk_list;
+
+ while (p_head->used) {
+ p_node = p_head->p_next;
+
+ rc = zxdh_comm_double_link_del(p_node, p_head);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_comm_double_link_del");
+
+ p_zblk_cfg = ZXDH_SE_GET_ZBLK_CFG(p_hash_cfg->p_se_info,
+ ((ZXDH_SE_ZBLK_CFG *)p_node->data)->zblk_idx);
+ p_zblk_cfg->is_used = 0;
+ for (i = 0; i < ZXDH_SE_ZREG_NUM; i++)
+ p_zblk_cfg->zreg_info[i].flag = 0;
+ }
+
+ return rc;
+}
+
+static uint32_t
+zxdh_np_se_fun_deinit(ZXDH_SE_CFG *p_se_cfg,
+ uint8_t id,
+ uint32_t fun_type)
+{
+ ZXDH_FUNC_ID_INFO *p_fun_info = NULL;
+
+ p_fun_info = ZXDH_GET_FUN_INFO(p_se_cfg, id);
+
+ if (p_fun_info->is_used == 0) {
+ PMD_DRV_LOG(ERR, " Error[0x%x], fun_id [%d] is already deinit!",
+ ZXDH_SE_RC_FUN_INVALID, id);
+ return ZXDH_OK;
+ }
+
+ switch (fun_type) {
+ case (ZXDH_FUN_HASH):
+ {
+ if (p_fun_info->fun_ptr) {
+ rte_free(p_fun_info->fun_ptr);
+ p_fun_info->fun_ptr = NULL;
+ }
+ }
+ break;
+
+ default:
+ {
+ PMD_DRV_LOG(ERR, " Error, unrecgnized fun_type[ %d] ", fun_type);
+ RTE_ASSERT(0);
+ return ZXDH_SE_RC_BASE;
+ }
+ break;
+ }
+
+ p_fun_info->fun_id = id;
+ p_fun_info->is_used = 0;
+
+ return ZXDH_OK;
+}
+
+static uint32_t
+zxdh_np_one_hash_soft_uninstall(uint32_t dev_id, uint32_t hash_id)
+{
+ uint32_t rc = 0;
+ uint32_t i = 0;
+
+ ZXDH_D_NODE *p_node = NULL;
+ ZXDH_SE_CFG *p_se_cfg = NULL;
+ ZXDH_RB_TN *p_rb_tn = NULL;
+ ZXDH_RB_TN *p_rb_tn_rtn = NULL;
+ HASH_DDR_CFG *p_rbkey = NULL;
+ ZXDH_HASH_CFG *p_hash_cfg = NULL;
+ ZXDH_FUNC_ID_INFO *p_func_info = NULL;
+ ZXDH_D_HEAD *p_head_ddr_cfg_rb = NULL;
+ HASH_DDR_CFG *p_temp_rbkey = NULL;
+
+ p_se_cfg = dpp_se_cfg[dev_id];
+ p_func_info = ZXDH_GET_FUN_INFO(p_se_cfg, hash_id);
+ if (p_func_info->is_used == 0) {
+ PMD_DRV_LOG(INFO, "Error[0x%x], fun_id [%d] is not init!",
+ ZXDH_SE_RC_FUN_INVALID, hash_id);
+ return ZXDH_OK;
+ }
+
+ rc = zxdh_np_hash_soft_all_entry_delete(p_se_cfg, hash_id);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_hash_soft_all_entry_delete");
+
+ p_hash_cfg = (ZXDH_HASH_CFG *)p_func_info->fun_ptr;
+ for (i = 0; i < ZXDH_HASH_BULK_NUM; i++) {
+ if (p_hash_cfg->hash_stat.p_bulk_zcam_mono[i] != NULL) {
+ rte_free((&p_hash_cfg->hash_stat)->p_bulk_zcam_mono[i]);
+ (&p_hash_cfg->hash_stat)->p_bulk_zcam_mono[i] = NULL;
+ }
+ }
+
+ p_head_ddr_cfg_rb = &p_hash_cfg->ddr_cfg_rb.tn_list;
+ while (p_head_ddr_cfg_rb->used) {
+ p_node = p_head_ddr_cfg_rb->p_next;
+
+ p_rb_tn = (ZXDH_RB_TN *)p_node->data;
+ p_rbkey = p_rb_tn->p_key;
+
+ rc = zxdh_comm_rb_delete(&p_hash_cfg->ddr_cfg_rb, p_rbkey, &p_rb_tn_rtn);
+
+ if (rc == ZXDH_RBT_RC_SRHFAIL)
+ PMD_DRV_LOG(ERR, "ddr_cfg_rb delete key is not exist, key: 0x");
+ else
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_comm_rb_delete");
+
+ ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_rb_tn_rtn);
+ p_temp_rbkey = (HASH_DDR_CFG *)(p_rb_tn_rtn->p_key);
+ rte_free(p_temp_rbkey->p_item_array);
+ p_temp_rbkey->p_item_array = NULL;
+ rte_free(p_temp_rbkey);
+ rte_free(p_rb_tn_rtn);
+ }
+
+ rc = zxdh_np_hash_zcam_resource_deinit(p_hash_cfg);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_hash_zcam_resource_deinit");
+
+ rc = zxdh_np_se_fun_deinit(p_se_cfg, (hash_id & 0xff), ZXDH_FUN_HASH);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_se_fun_deinit");
+
+ memset(g_tbl_id_info[dev_id][hash_id], 0,
+ ZXDH_HASH_TBL_ID_NUM * sizeof(ZXDH_HASH_TBL_ID_INFO));
+
+ return rc;
+}
+
+static uint32_t
+zxdh_np_hash_soft_uninstall(uint32_t dev_id)
+{
+ uint32_t rc = ZXDH_OK;
+ uint32_t hash_id = 0;
+
+ for (hash_id = 0; hash_id < ZXDH_HASH_FUNC_ID_NUM; hash_id++) {
+ rc = zxdh_np_one_hash_soft_uninstall(dev_id, hash_id);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_one_hash_soft_uninstall");
+ }
+
+ return rc;
+}
+
int
zxdh_np_online_uninit(uint32_t dev_id,
char *port_name,
@@ -3853,6 +4114,10 @@ zxdh_np_online_uninit(uint32_t dev_id,
PMD_DRV_LOG(ERR, "%s:dtb release error,"
"port name %s queue id %d", __func__, port_name, queue_id);
+ rc = zxdh_np_hash_soft_uninstall(dev_id);
+ if (rc != ZXDH_OK)
+ PMD_DRV_LOG(ERR, "zxdh_np_hash_soft_uninstall error! ");
+
zxdh_np_dtb_mgr_destroy(dev_id);
zxdh_np_sdt_mgr_destroy(dev_id);
zxdh_np_dev_del(dev_id);
@@ -4120,6 +4385,25 @@ zxdh_np_dtb_zcam_dump_info_write(uint32_t dev_id,
return rc;
}
+static void
+zxdh_np_dtb_zcam_dump_entry(uint32_t dev_id,
+ uint32_t addr,
+ uint32_t tb_width,
+ uint32_t depth,
+ uint32_t addr_high32,
+ uint32_t addr_low32,
+ ZXDH_DTB_ENTRY_T *p_entry)
+{
+ zxdh_np_dtb_zcam_dump_info_write(dev_id,
+ addr,
+ tb_width,
+ depth,
+ addr_high32,
+ addr_low32,
+ (uint32_t *)p_entry->cmd);
+ p_entry->data_in_cmd_flag = 1;
+}
+
static uint32_t
zxdh_np_dtb_se_smmu0_ind_write(uint32_t dev_id,
uint32_t base_addr,
@@ -5915,6 +6199,29 @@ zxdh_np_dtb_tab_up_item_addr_get(uint32_t dev_id,
return rc;
}
+static void
+zxdh_np_dtb_tab_up_item_offset_addr_get(uint32_t dev_id,
+ uint32_t queue_id,
+ uint32_t item_index,
+ uint32_t addr_offset,
+ uint32_t *p_phy_haddr,
+ uint32_t *p_phy_laddr)
+{
+ uint64_t addr = 0;
+
+ if (ZXDH_DTB_TAB_UP_USER_PHY_ADDR_FLAG_GET(dev_id, queue_id, item_index) ==
+ ZXDH_DTB_TAB_UP_USER_ADDR_TYPE)
+ addr = ZXDH_DTB_TAB_UP_USER_PHY_ADDR_GET(dev_id, queue_id, item_index);
+ else
+ addr = ZXDH_DTB_TAB_UP_PHY_ADDR_GET(dev_id, queue_id, item_index) +
+ ZXDH_DTB_ITEM_ACK_SIZE;
+
+ addr = addr + addr_offset;
+
+ *p_phy_haddr = (addr >> 32) & 0xffffffff;
+ *p_phy_laddr = addr & 0xffffffff;
+}
+
static uint32_t
zxdh_np_dtb_dump_table_elemet_addr_get(uint32_t dev_id,
uint32_t queue_id,
@@ -6129,6 +6436,101 @@ zxdh_np_dtb_tab_up_free_item_get(uint32_t dev_id,
return 0;
}
+static uint32_t
+zxdh_np_dtb_tab_up_item_user_addr_set(uint32_t dev_id,
+ uint32_t queue_id,
+ uint32_t item_index,
+ uint64_t phy_addr,
+ uint64_t vir_addr)
+{
+ ZXDH_DTB_MGR_T *p_dtb_mgr = NULL;
+
+ p_dtb_mgr = zxdh_np_dtb_mgr_get(dev_id);
+ if (p_dtb_mgr == NULL) {
+ PMD_DRV_LOG(ERR, "DTB Manager is not exist!");
+ return ZXDH_RC_DTB_MGR_NOT_EXIST;
+ }
+
+ if (ZXDH_DTB_QUEUE_INIT_FLAG_GET(dev_id, queue_id) == 0) {
+ PMD_DRV_LOG(ERR, "dtb queue %d is not init.", queue_id);
+ return ZXDH_RC_DTB_QUEUE_IS_NOT_INIT;
+ }
+
+ p_dtb_mgr->queue_info[queue_id].tab_up.user_addr[item_index].phy_addr = phy_addr;
+ p_dtb_mgr->queue_info[queue_id].tab_up.user_addr[item_index].vir_addr = vir_addr;
+ p_dtb_mgr->queue_info[queue_id].tab_up.user_addr[item_index].user_flag =
+ ZXDH_DTB_TAB_UP_USER_ADDR_TYPE;
+
+ return ZXDH_OK;
+}
+
+static uint32_t
+zxdh_np_dtb_dump_sdt_addr_get(uint32_t dev_id,
+ uint32_t queue_id,
+ uint32_t sdt_no,
+ uint64_t *phy_addr,
+ uint64_t *vir_addr,
+ uint32_t *size)
+{
+ uint32_t rc = ZXDH_OK;
+
+ ZXDH_DTB_ADDR_INFO_T dtb_dump_addr_info = {0};
+ ZXDH_RB_CFG *p_dtb_dump_addr_rb = NULL;
+
+ dtb_dump_addr_info.sdt_no = sdt_no;
+ p_dtb_dump_addr_rb = zxdh_np_dtb_dump_addr_rb_get(dev_id, queue_id);
+ rc = zxdh_np_se_apt_rb_search(p_dtb_dump_addr_rb, &dtb_dump_addr_info,
+ sizeof(ZXDH_DTB_ADDR_INFO_T));
+ if (rc == ZXDH_OK) {
+ PMD_DRV_LOG(INFO, "search sdt_no %d success.", sdt_no);
+ } else {
+ PMD_DRV_LOG(ERR, "search sdt_no %d fail.", sdt_no);
+ return rc;
+ }
+
+ *phy_addr = dtb_dump_addr_info.phy_addr;
+ *vir_addr = dtb_dump_addr_info.vir_addr;
+ *size = dtb_dump_addr_info.size;
+
+ return rc;
+}
+
+static uint32_t
+zxdh_np_dtb_dump_addr_set(uint32_t dev_id,
+ uint32_t queue_id,
+ uint32_t sdt_no,
+ uint32_t *element_id)
+{
+ uint32_t rc = ZXDH_OK;
+ uint32_t dump_element_id = 0;
+ uint64_t phy_addr = 0;
+ uint64_t vir_addr = 0;
+ uint32_t size = 0;
+
+ rc = zxdh_np_dtb_dump_sdt_addr_get(dev_id,
+ queue_id,
+ sdt_no,
+ &phy_addr,
+ &vir_addr,
+ &size);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_dump_sdt_addr_get");
+ memset((uint8_t *)vir_addr, 0, size);
+
+ rc = zxdh_np_dtb_tab_up_free_item_get(dev_id, queue_id, &dump_element_id);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_tab_up_free_item_get");
+
+ rc = zxdh_np_dtb_tab_up_item_user_addr_set(dev_id,
+ queue_id,
+ dump_element_id,
+ phy_addr,
+ vir_addr);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_tab_up_item_addr_set");
+
+ *element_id = dump_element_id;
+
+ return rc;
+}
+
static uint32_t
zxdh_np_dtb_se_smmu0_dma_dump(uint32_t dev_id,
uint32_t queue_id,
@@ -8673,3 +9075,693 @@ zxdh_np_se_res_get_and_init(uint32_t dev_id, uint32_t type)
return rc;
}
+
+static uint32_t
+zxdh_np_dtb_hash_zcam_del_one_hw(uint32_t dev_id,
+ uint32_t queue_id,
+ HASH_ENTRY_CFG *p_hash_entry_cfg,
+ ZXDH_HASH_ENTRY *p_hash_entry,
+ ZXDH_DTB_ENTRY_T *p_entry,
+ uint8_t *p_srh_succ)
+{
+ uint32_t rc = ZXDH_OK;
+ ZXDH_HASH_RBKEY_INFO srh_rbkey = {0};
+ ZXDH_HASH_CFG *p_hash_cfg = NULL;
+ ZXDH_SE_ZCELL_CFG *p_zcell = NULL;
+ ZXDH_SE_ZBLK_CFG *p_zblk = NULL;
+
+ uint32_t zblk_idx = 0;
+ uint32_t pre_zblk_idx = 0xFFFFFFFF;
+ uint16_t crc16_value = 0;
+ uint32_t zcell_id = 0;
+ uint32_t item_idx = 0;
+ uint32_t element_id = 0;
+ uint32_t byte_offset = 0;
+ uint32_t addr = 0;
+ uint32_t i = 0;
+ uint8_t srh_succ = 0;
+ uint8_t temp_key[ZXDH_HASH_KEY_MAX] = {0};
+ uint8_t rd_buff[ZXDH_SE_ITEM_WIDTH_MAX] = {0};
+
+ ZXDH_D_NODE *p_zblk_dn = NULL;
+ ZXDH_D_NODE *p_zcell_dn = NULL;
+ ZXDH_SE_CFG *p_se_cfg = NULL;
+
+ rte_memcpy(srh_rbkey.key, p_hash_entry->p_key, p_hash_entry_cfg->key_by_size);
+
+ p_hash_cfg = p_hash_entry_cfg->p_hash_cfg;
+ ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_hash_cfg);
+
+ p_se_cfg = p_hash_entry_cfg->p_se_cfg;
+ ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_se_cfg);
+
+ zxdh_np_hash_set_crc_key(p_hash_entry_cfg, p_hash_entry, temp_key);
+
+ p_zcell_dn = p_hash_cfg->hash_shareram.zcell_free_list.p_next;
+ while (p_zcell_dn) {
+ p_zcell = (ZXDH_SE_ZCELL_CFG *)p_zcell_dn->data;
+ zblk_idx = GET_ZBLK_IDX(p_zcell->zcell_idx);
+
+ if (zblk_idx != pre_zblk_idx) {
+ pre_zblk_idx = zblk_idx;
+ crc16_value = p_hash_cfg->p_hash16_fun(temp_key,
+ p_hash_entry_cfg->key_by_size, p_zblk->hash_arg);
+ }
+
+ zcell_id = GET_ZCELL_IDX(p_zcell->zcell_idx);
+ item_idx = GET_ZCELL_CRC_VAL(zcell_id, crc16_value);
+ addr = ZXDH_ZBLK_ITEM_ADDR_CALC(p_zcell->zcell_idx, item_idx);
+ rc = zxdh_np_dtb_se_zcam_dma_dump(dev_id,
+ queue_id,
+ addr,
+ ZXDH_DTB_DUMP_ZCAM_512b,
+ 1,
+ (uint32_t *)rd_buff,
+ &element_id);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_se_zcam_dma_dump");
+ zxdh_np_comm_swap(rd_buff, sizeof(rd_buff));
+
+ rc = zxdh_np_dtb_hash_data_parse(ZXDH_ITEM_RAM, p_hash_entry_cfg->key_by_size,
+ p_hash_entry, rd_buff, &byte_offset);
+ if (rc == ZXDH_OK) {
+ PMD_DRV_LOG(DEBUG, "Hash search hardware succ in zcell.");
+ srh_succ = 1;
+ p_hash_cfg->hash_stat.search_ok++;
+ break;
+ }
+
+ p_zcell_dn = p_zcell_dn->next;
+ }
+
+ if (srh_succ == 0) {
+ p_zblk_dn = p_hash_cfg->hash_shareram.zblk_list.p_next;
+ while (p_zblk_dn) {
+ p_zblk = (ZXDH_SE_ZBLK_CFG *)p_zblk_dn->data;
+ zblk_idx = p_zblk->zblk_idx;
+
+ for (i = 0; i < ZXDH_SE_ZREG_NUM; i++) {
+ item_idx = i;
+ addr = ZXDH_ZBLK_HASH_LIST_REG_ADDR_CALC(zblk_idx, item_idx);
+ rc = zxdh_np_dtb_se_zcam_dma_dump(dev_id,
+ queue_id,
+ addr,
+ ZXDH_DTB_DUMP_ZCAM_512b,
+ 1,
+ (uint32_t *)rd_buff,
+ &element_id);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_se_zcam_dma_dump");
+ zxdh_np_comm_swap(rd_buff, sizeof(rd_buff));
+
+ rc = zxdh_np_dtb_hash_data_parse(ZXDH_ITEM_RAM,
+ p_hash_entry_cfg->key_by_size, p_hash_entry,
+ rd_buff, &byte_offset);
+ if (rc == ZXDH_OK) {
+ PMD_DRV_LOG(DEBUG, "Hash search hardware succ in zreg.");
+ srh_succ = 1;
+ p_hash_cfg->hash_stat.search_ok++;
+ break;
+ }
+ }
+ p_zblk_dn = p_zblk_dn->next;
+ }
+ }
+
+ if (srh_succ) {
+ memset(rd_buff + byte_offset, 0,
+ ZXDH_GET_HASH_ENTRY_SIZE(p_hash_entry_cfg->key_type));
+ zxdh_np_comm_swap(rd_buff, sizeof(rd_buff));
+ rc = zxdh_np_dtb_se_alg_zcam_data_write(dev_id,
+ addr,
+ rd_buff,
+ p_entry);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_se_alg_zcam_data_write");
+ p_hash_cfg->hash_stat.delete_ok++;
+ }
+
+ *p_srh_succ = srh_succ;
+
+ return rc;
+}
+
+static uint32_t
+zxdh_np_dtb_hash_zcam_del_hw(uint32_t dev_id,
+ uint32_t queue_id,
+ uint32_t sdt_no,
+ uint32_t entry_num,
+ ZXDH_DTB_HASH_ENTRY_INFO_T *p_arr_hash_entry,
+ uint32_t *element_id)
+{
+ uint32_t rc = ZXDH_OK;
+ uint32_t item_cnt = 0;
+ uint32_t key_valid = 1;
+ uint32_t dtb_len = 0;
+ uint8_t srh_succ = 0;
+ uint8_t key[ZXDH_HASH_KEY_MAX] = {0};
+ uint8_t rst[ZXDH_HASH_RST_MAX] = {0};
+ uint8_t entry_cmd[ZXDH_DTB_TABLE_CMD_SIZE_BIT / 8] = {0};
+
+ uint8_t entry_data[ZXDH_ETCAM_WIDTH_MAX / 8] = {0};
+ uint8_t *p_data_buff = NULL;
+
+ ZXDH_HASH_ENTRY entry = {0};
+ ZXDH_DTB_ENTRY_T dtb_one_entry = {0};
+ HASH_ENTRY_CFG hash_entry_cfg = {0};
+
+ dtb_one_entry.cmd = entry_cmd;
+ dtb_one_entry.data = entry_data;
+ entry.p_key = key;
+ entry.p_rst = rst;
+
+ rc = zxdh_np_hash_get_hash_info_from_sdt(dev_id, sdt_no, &hash_entry_cfg);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_hash_get_hash_info_from_sdt");
+
+ p_data_buff = (uint8_t *)rte_zmalloc(NULL, ZXDH_DTB_TABLE_DATA_BUFF_SIZE, 0);
+ if (p_data_buff == NULL) {
+ PMD_DRV_LOG(ERR, "%s point null!", __func__);
+ return ZXDH_PAR_CHK_POINT_NULL;
+ }
+
+ for (item_cnt = 0; item_cnt < entry_num; ++item_cnt) {
+ srh_succ = 0;
+ memset(key, 0, sizeof(key));
+ memset(rst, 0, sizeof(rst));
+ memset(entry_cmd, 0, sizeof(entry_cmd));
+ memset(entry_data, 0, sizeof(entry_data));
+ entry.p_key[0] = (uint8_t)(((key_valid & 0x1) << 7)
+ | ((hash_entry_cfg.key_type & 0x3) << 5)
+ | (hash_entry_cfg.table_id & 0x1f));
+ memcpy(&entry.p_key[1], p_arr_hash_entry[item_cnt].p_actu_key,
+ hash_entry_cfg.actu_key_size);
+
+ rc = zxdh_np_dtb_hash_zcam_del_one_hw(dev_id,
+ queue_id,
+ &hash_entry_cfg,
+ &entry,
+ &dtb_one_entry,
+ &srh_succ);
+ ZXDH_COMM_CHECK_RC_MEMORY_FREE(rc,
+ "zxdh_np_dtb_hash_zcam_del_one_hw", p_data_buff);
+
+ if (srh_succ) {
+ rc = zxdh_np_dtb_data_write(p_data_buff, 0, &dtb_one_entry);
+ ZXDH_COMM_CHECK_RC_MEMORY_FREE(rc,
+ "zxdh_np_dtb_data_write", p_data_buff);
+ dtb_len = dtb_one_entry.data_size / ZXDH_DTB_LEN_POS_SETP + 1;
+
+ rc = zxdh_np_dtb_write_down_table_data(dev_id, queue_id,
+ dtb_len * ZXDH_DTB_LEN_POS_SETP, p_data_buff, element_id);
+ ZXDH_COMM_CHECK_RC_MEMORY_FREE(rc,
+ "zxdh_np_dtb_write_down_table_data", p_data_buff);
+
+ rc = zxdh_np_dtb_tab_down_success_status_check(dev_id,
+ queue_id, *element_id);
+ ZXDH_COMM_CHECK_RC_MEMORY_FREE(rc,
+ "zxdh_np_dtb_tab_down_success_status_check", p_data_buff);
+ }
+ }
+
+ rte_free(p_data_buff);
+
+ return rc;
+}
+
+static uint32_t
+zxdh_np_dtb_sdt_hash_zcam_mono_space_dump(uint32_t dev_id,
+ uint32_t queue_id,
+ uint32_t sdt_no,
+ HASH_ENTRY_CFG *p_hash_entry_cfg,
+ uint8_t *p_data,
+ uint32_t *p_dump_len)
+{
+ uint32_t rc = ZXDH_OK;
+
+ uint32_t i = 0;
+ uint32_t zblock_id = 0;
+ uint32_t zcell_id = 0;
+ uint32_t start_addr = 0;
+ uint32_t dtb_desc_len = 0;
+ uint32_t dump_pa_h = 0;
+ uint32_t dump_pa_l = 0;
+ uint32_t dma_addr_offset = 0;
+ uint32_t desc_addr_offset = 0;
+ uint32_t element_id = 0;
+ uint8_t *p_dump_desc_buf = NULL;
+
+ ZXDH_D_NODE *p_zblk_dn = NULL;
+ ZXDH_SE_ZBLK_CFG *p_zblk = NULL;
+ ZXDH_SE_ZREG_CFG *p_zreg = NULL;
+ ZXDH_SE_ZCELL_CFG *p_zcell = NULL;
+ ZXDH_HASH_CFG *p_hash_cfg = NULL;
+
+ ZXDH_DTB_ENTRY_T dtb_dump_entry = {0};
+ uint8_t cmd_buff[ZXDH_DTB_TABLE_CMD_SIZE_BIT / 8] = {0};
+
+ rc = zxdh_np_dtb_dump_addr_set(dev_id, queue_id, sdt_no, &element_id);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_dump_addr_set");
+
+ p_dump_desc_buf = (uint8_t *)rte_zmalloc(NULL, ZXDH_DTB_TABLE_DUMP_INFO_BUFF_SIZE, 0);
+ if (p_dump_desc_buf == NULL) {
+ PMD_DRV_LOG(ERR, "%s point null!", __func__);
+ return ZXDH_PAR_CHK_POINT_NULL;
+ }
+ dtb_dump_entry.cmd = cmd_buff;
+
+ p_hash_cfg = p_hash_entry_cfg->p_hash_cfg;
+ p_zblk_dn = p_hash_cfg->hash_shareram.zblk_list.p_next;
+
+ while (p_zblk_dn) {
+ p_zblk = (ZXDH_SE_ZBLK_CFG *)p_zblk_dn->data;
+ zblock_id = p_zblk->zblk_idx;
+
+ for (i = 0; i < ZXDH_SE_ZCELL_NUM; i++) {
+ p_zcell = &p_zblk->zcell_info[i];
+
+ if ((p_zcell->flag & ZXDH_ZCELL_FLAG_IS_MONO) &&
+ p_zcell->bulk_id == p_hash_entry_cfg->bulk_id) {
+ zcell_id = p_zcell->zcell_idx;
+
+ start_addr = ZXDH_ZBLK_ITEM_ADDR_CALC(zcell_id, 0);
+
+ zxdh_np_dtb_tab_up_item_offset_addr_get(dev_id,
+ queue_id,
+ element_id,
+ dma_addr_offset,
+ &dump_pa_h,
+ &dump_pa_l);
+
+ zxdh_np_dtb_zcam_dump_entry(dev_id, start_addr,
+ ZXDH_DTB_DUMP_ZCAM_512b, ZXDH_SE_RAM_DEPTH,
+ dump_pa_h, dump_pa_l, &dtb_dump_entry);
+
+ zxdh_np_dtb_data_write(p_dump_desc_buf, desc_addr_offset,
+ &dtb_dump_entry);
+
+ dtb_desc_len++;
+ dma_addr_offset += ZXDH_SE_RAM_DEPTH * 512 / 8;
+ desc_addr_offset += ZXDH_DTB_LEN_POS_SETP;
+
+ PMD_DRV_LOG(DEBUG, "the Zblock[%d]'s bulk_id:%d Mono Zcell_id :%d",
+ zblock_id, p_hash_entry_cfg->bulk_id, zcell_id);
+ }
+ }
+
+ for (i = 0; i < ZXDH_SE_ZREG_NUM; i++) {
+ p_zreg = &p_zblk->zreg_info[i];
+
+ if ((p_zreg->flag & ZXDH_ZREG_FLAG_IS_MONO) &&
+ p_zreg->bulk_id == p_hash_entry_cfg->bulk_id) {
+ start_addr = ZXDH_ZBLK_HASH_LIST_REG_ADDR_CALC(zblock_id, i);
+
+ zxdh_np_dtb_tab_up_item_offset_addr_get(dev_id,
+ queue_id,
+ element_id,
+ dma_addr_offset,
+ &dump_pa_h,
+ &dump_pa_l);
+
+ zxdh_np_dtb_zcam_dump_entry(dev_id, start_addr,
+ ZXDH_DTB_DUMP_ZCAM_512b, 1, dump_pa_h, dump_pa_l, &dtb_dump_entry);
+
+ zxdh_np_dtb_data_write(p_dump_desc_buf, desc_addr_offset,
+ &dtb_dump_entry);
+
+ dtb_desc_len++;
+ dma_addr_offset += 512 / 8;
+ desc_addr_offset += ZXDH_DTB_LEN_POS_SETP;
+
+ PMD_DRV_LOG(DEBUG, "the Zblock[%d]'s bulk_id:%d"
+ " Mono Zreg_id :%d", zblock_id, p_zreg->bulk_id, i);
+ }
+ }
+
+ p_zblk_dn = p_zblk_dn->next;
+ }
+
+ rc = zxdh_np_dtb_write_dump_desc_info(dev_id,
+ queue_id,
+ element_id,
+ (uint32_t *)p_dump_desc_buf,
+ dma_addr_offset / 4,
+ dtb_desc_len * 4,
+ (uint32_t *)p_data);
+ ZXDH_COMM_CHECK_RC_MEMORY_FREE(rc, "zxdh_np_dtb_write_dump_desc_info",
+ p_dump_desc_buf);
+
+ zxdh_np_comm_swap(p_data, dma_addr_offset);
+ rte_free(p_dump_desc_buf);
+
+ *p_dump_len = dma_addr_offset;
+
+ return rc;
+}
+
+static uint32_t
+zxdh_np_dtb_hash_table_zcam_dump(uint32_t dev_id,
+ uint32_t queue_id,
+ uint32_t sdt_no,
+ uint32_t zblock_num,
+ uint32_t zblock_array[ZXDH_SE_ZBLK_NUM],
+ uint8_t *p_data,
+ uint32_t *p_dump_len)
+{
+ uint32_t rc = ZXDH_OK;
+ uint32_t zblk_idx = 0;
+ uint32_t index = 0;
+ uint32_t zblock_id = 0;
+ uint32_t zcell_id = 0;
+ uint32_t start_addr = 0;
+ uint32_t dtb_desc_len = 0;
+ uint32_t dump_pa_h = 0;
+ uint32_t dump_pa_l = 0;
+ uint32_t dma_addr_offset = 0;
+ uint32_t desc_addr_offset = 0;
+ uint32_t element_id = 0;
+ uint8_t *p_dump_desc_buf = NULL;
+
+ ZXDH_DTB_ENTRY_T dtb_dump_entry = {0};
+ uint8_t cmd_buff[ZXDH_DTB_TABLE_CMD_SIZE_BIT / 8] = {0};
+
+ rc = zxdh_np_dtb_dump_addr_set(dev_id, queue_id, sdt_no, &element_id);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_dump_addr_set");
+
+ p_dump_desc_buf = (uint8_t *)rte_zmalloc(NULL, ZXDH_DTB_TABLE_DUMP_INFO_BUFF_SIZE, 0);
+ if (p_dump_desc_buf == NULL) {
+ PMD_DRV_LOG(ERR, "%s point null!", __func__);
+ return ZXDH_PAR_CHK_POINT_NULL;
+ }
+
+ dtb_dump_entry.cmd = cmd_buff;
+ for (zblk_idx = 0; zblk_idx < zblock_num; zblk_idx++) {
+ zblock_id = zblock_array[zblk_idx];
+ for (index = 0; index < ZXDH_SE_ZCELL_NUM; index++) {
+ zcell_id = zblock_id * ZXDH_SE_ZCELL_NUM + index;
+ start_addr = ZXDH_ZBLK_ITEM_ADDR_CALC(zcell_id, 0);
+
+ zxdh_np_dtb_tab_up_item_offset_addr_get(dev_id,
+ queue_id,
+ element_id,
+ dma_addr_offset,
+ &dump_pa_h,
+ &dump_pa_l);
+
+ zxdh_np_dtb_zcam_dump_entry(dev_id, start_addr,
+ ZXDH_DTB_DUMP_ZCAM_512b, ZXDH_SE_RAM_DEPTH,
+ dump_pa_h, dump_pa_l, &dtb_dump_entry);
+
+ zxdh_np_dtb_data_write(p_dump_desc_buf,
+ desc_addr_offset, &dtb_dump_entry);
+
+ dtb_desc_len++;
+ dma_addr_offset += ZXDH_SE_RAM_DEPTH * 512 / 8;
+ desc_addr_offset += ZXDH_DTB_LEN_POS_SETP;
+ }
+
+ zxdh_np_dtb_tab_up_item_offset_addr_get(dev_id,
+ queue_id,
+ element_id,
+ dma_addr_offset,
+ &dump_pa_h,
+ &dump_pa_l);
+
+ start_addr = ZXDH_ZBLK_HASH_LIST_REG_ADDR_CALC(zblock_id, 0);
+ zxdh_np_dtb_zcam_dump_entry(dev_id, start_addr, ZXDH_DTB_DUMP_ZCAM_512b,
+ ZXDH_SE_ZREG_NUM, dump_pa_h, dump_pa_l, &dtb_dump_entry);
+
+ zxdh_np_dtb_data_write(p_dump_desc_buf, desc_addr_offset, &dtb_dump_entry);
+
+ dtb_desc_len++;
+ dma_addr_offset += ZXDH_SE_ZREG_NUM * 512 / 8;
+ desc_addr_offset += ZXDH_DTB_LEN_POS_SETP;
+ }
+
+ rc = zxdh_np_dtb_write_dump_desc_info(dev_id,
+ queue_id,
+ element_id,
+ (uint32_t *)p_dump_desc_buf,
+ dma_addr_offset / 4,
+ dtb_desc_len * 4,
+ (uint32_t *)p_data);
+ ZXDH_COMM_CHECK_RC_MEMORY_FREE(rc, "zxdh_np_dtb_write_dump_desc_info",
+ p_dump_desc_buf);
+
+ zxdh_np_comm_swap(p_data, dma_addr_offset);
+ rte_free(p_dump_desc_buf);
+
+ *p_dump_len = dma_addr_offset;
+
+ return rc;
+}
+
+static void
+zxdh_np_dtb_dump_hash_parse(HASH_ENTRY_CFG *p_hash_entry_cfg,
+ uint32_t item_type,
+ uint8_t *pdata,
+ uint32_t dump_len,
+ uint8_t *p_outdata,
+ uint32_t *p_item_num)
+{
+ uint32_t item_num = 0;
+ uint32_t data_offset = 0;
+ uint32_t index = 0;
+ uint8_t temp_key_valid = 0;
+ uint8_t temp_key_type = 0;
+ uint8_t temp_tbl_id = 0;
+ uint32_t srh_entry_size = 0;
+ uint32_t item_width = ZXDH_SE_ITEM_WIDTH_MAX;
+ uint8_t *p_temp_key = NULL;
+ uint8_t *p_hash_item = NULL;
+ ZXDH_DTB_HASH_ENTRY_INFO_T *p_dtb_hash_entry = NULL;
+ ZXDH_DTB_HASH_ENTRY_INFO_T *p_temp_entry = NULL;
+
+ if (item_type == ZXDH_ITEM_DDR_256)
+ item_width = item_width / 2;
+
+ p_dtb_hash_entry = (ZXDH_DTB_HASH_ENTRY_INFO_T *)p_outdata;
+ srh_entry_size = ZXDH_GET_HASH_ENTRY_SIZE(p_hash_entry_cfg->key_type);
+
+ for (index = 0; index < (dump_len / item_width); index++) {
+ data_offset = 0;
+ p_hash_item = pdata + index * item_width;
+ while (data_offset < item_width) {
+ p_temp_key = p_hash_item + data_offset;
+ temp_key_valid = ZXDH_GET_HASH_KEY_VALID(p_temp_key);
+ temp_key_type = ZXDH_GET_HASH_KEY_TYPE(p_temp_key);
+ temp_tbl_id = ZXDH_GET_HASH_TBL_ID(p_temp_key);
+ p_temp_entry = p_dtb_hash_entry + item_num;
+
+ if (temp_key_valid && temp_key_type == p_hash_entry_cfg->key_type &&
+ temp_tbl_id == p_hash_entry_cfg->table_id) {
+ rte_memcpy(p_temp_entry->p_actu_key, p_temp_key + 1,
+ p_hash_entry_cfg->actu_key_size);
+ rte_memcpy(p_temp_entry->p_rst,
+ p_temp_key + p_hash_entry_cfg->key_by_size,
+ p_hash_entry_cfg->rst_by_size);
+ item_num++;
+ }
+
+ data_offset += srh_entry_size;
+ }
+ }
+
+ *p_item_num = item_num;
+}
+
+static uint32_t
+zxdh_np_dtb_hash_table_dump(uint32_t dev_id,
+ uint32_t queue_id,
+ uint32_t sdt_no,
+ ZXDH_DTB_DUMP_INDEX_T start_index,
+ uint8_t *p_dump_data,
+ uint32_t *p_entry_num,
+ ZXDH_DTB_DUMP_INDEX_T *next_start_index,
+ uint32_t *finish_flag)
+{
+ uint32_t rc = ZXDH_OK;
+ uint8_t *p_data = NULL;
+ uint32_t data_len = 0;
+ uint32_t entry_num = 0;
+ ZXDH_HASH_CFG *p_hash_cfg = NULL;
+ HASH_ENTRY_CFG hash_entry_cfg = {0};
+
+ rc = zxdh_np_hash_get_hash_info_from_sdt(dev_id, sdt_no, &hash_entry_cfg);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_hash_get_hash_info_from_sdt");
+
+ p_hash_cfg = hash_entry_cfg.p_hash_cfg;
+ ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_hash_cfg);
+
+ p_data = (uint8_t *)rte_zmalloc(NULL, ZXDH_DTB_DMUP_DATA_MAX, 0);
+ if (p_data == NULL) {
+ PMD_DRV_LOG(ERR, "%s point null!", __func__);
+ return ZXDH_PAR_CHK_POINT_NULL;
+ }
+
+ if (start_index.index_type == ZXDH_DTB_DUMP_ZCAM_TYPE) {
+ if (p_hash_cfg->bulk_ram_mono[hash_entry_cfg.bulk_id]) {
+ rc = zxdh_np_dtb_sdt_hash_zcam_mono_space_dump(dev_id,
+ queue_id,
+ sdt_no,
+ &hash_entry_cfg,
+ p_data,
+ &data_len);
+ ZXDH_COMM_CHECK_RC_MEMORY_FREE(rc,
+ "zxdh_np_dtb_sdt_hash_zcam_mono_space_dump", p_data);
+ } else {
+ rc = zxdh_np_dtb_hash_table_zcam_dump(dev_id,
+ queue_id,
+ sdt_no,
+ p_hash_cfg->hash_stat.zblock_num,
+ p_hash_cfg->hash_stat.zblock_array,
+ p_data,
+ &data_len);
+ ZXDH_COMM_CHECK_RC_MEMORY_FREE(rc, "zxdh_np_dtb_hash_table_zcam_dump",
+ p_data);
+ }
+
+ zxdh_np_dtb_dump_hash_parse(&hash_entry_cfg,
+ ZXDH_ITEM_RAM,
+ p_data,
+ data_len,
+ p_dump_data,
+ &entry_num);
+
+ if (p_hash_cfg->ddr_valid) {
+ next_start_index->index = 0;
+ next_start_index->index_type = ZXDH_DTB_DUMP_DDR_TYPE;
+ } else {
+ *finish_flag = 1;
+ }
+ *p_entry_num = entry_num;
+ }
+
+ rte_free(p_data);
+ return rc;
+}
+
+static uint32_t
+zxdh_np_dtb_hash_offline_zcam_delete(uint32_t dev_id,
+ uint32_t queue_id,
+ uint32_t sdt_no)
+{
+ uint32_t rc = ZXDH_OK;
+ uint32_t entry_num = 0;
+ uint32_t finish_flag = 0;
+ uint32_t index = 0;
+ uint32_t max_item_num = 1024 * 1024;
+ uint8_t *p_dump_data = NULL;
+ uint8_t *p_key = NULL;
+ uint8_t *p_rst = NULL;
+ uint32_t element_id = 0;
+
+ ZXDH_DTB_HASH_ENTRY_INFO_T *p_dtb_hash_entry = NULL;
+ ZXDH_DTB_HASH_ENTRY_INFO_T *p_temp_entry = NULL;
+ ZXDH_DTB_DUMP_INDEX_T start_index = {0};
+ ZXDH_DTB_DUMP_INDEX_T next_start_index = {0};
+
+ ZXDH_SDT_TBL_HASH_T sdt_hash = {0};
+ start_index.index = 0;
+ start_index.index_type = ZXDH_DTB_DUMP_ZCAM_TYPE;
+
+ rc = zxdh_np_soft_sdt_tbl_get(0, sdt_no, &sdt_hash);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_soft_sdt_tbl_get");
+
+ p_dump_data = (uint8_t *)rte_zmalloc(NULL, max_item_num *
+ sizeof(ZXDH_DTB_HASH_ENTRY_INFO_T), 0);
+ if (p_dump_data == NULL) {
+ PMD_DRV_LOG(ERR, "%s point null!", __func__);
+ return ZXDH_PAR_CHK_POINT_NULL;
+ }
+ p_key = (uint8_t *)rte_zmalloc(NULL, max_item_num * ZXDH_HASH_KEY_MAX, 0);
+ ZXDH_COMM_CHECK_POINT_MEMORY_FREE(p_key, p_dump_data);
+ p_rst = (uint8_t *)rte_zmalloc(NULL, max_item_num * ZXDH_HASH_RST_MAX, 0);
+ ZXDH_COMM_CHECK_POINT_MEMORY_FREE2PTR(p_rst, p_dump_data, p_key);
+
+ p_dtb_hash_entry = (ZXDH_DTB_HASH_ENTRY_INFO_T *)p_dump_data;
+ for (index = 0; index < max_item_num; index++) {
+ p_temp_entry = p_dtb_hash_entry + index;
+ p_temp_entry->p_actu_key = p_key + index * ZXDH_HASH_KEY_MAX;
+ p_temp_entry->p_rst = p_rst + index * ZXDH_HASH_RST_MAX;
+ }
+
+ rc = zxdh_np_dtb_hash_table_dump(0, queue_id, sdt_no, start_index,
+ p_dump_data, &entry_num, &next_start_index, &finish_flag);
+
+ if (entry_num) {
+ rc = zxdh_np_dtb_hash_zcam_del_hw(0, queue_id, sdt_no,
+ entry_num, p_dtb_hash_entry, &element_id);
+ }
+
+ rte_free(p_dtb_hash_entry);
+ rte_free(p_key);
+ rte_free(p_rst);
+
+ return rc;
+}
+
+uint32_t
+zxdh_np_dtb_hash_online_delete(uint32_t dev_id, uint32_t queue_id, uint32_t sdt_no)
+{
+ uint32_t rc = 0;
+ uint8_t key_valid = 0;
+ uint32_t table_id = 0;
+ uint32_t key_type = 0;
+
+ ZXDH_D_NODE *p_node = NULL;
+ ZXDH_RB_TN *p_rb_tn = NULL;
+ ZXDH_D_HEAD *p_head_hash_rb = NULL;
+ ZXDH_HASH_CFG *p_hash_cfg = NULL;
+ ZXDH_HASH_RBKEY_INFO *p_rbkey = NULL;
+ HASH_ENTRY_CFG hash_entry_cfg = {0};
+ ZXDH_DTB_USER_ENTRY_T del_entry = {0};
+ ZXDH_DTB_HASH_ENTRY_INFO_T hash_entry = {0};
+
+ del_entry.sdt_no = sdt_no;
+ del_entry.p_entry_data = &hash_entry;
+
+ rc = zxdh_np_hash_get_hash_info_from_sdt(dev_id, sdt_no, &hash_entry_cfg);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_hash_get_hash_info_from_sdt");
+
+ p_hash_cfg = hash_entry_cfg.p_hash_cfg;
+ ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_hash_cfg);
+
+ p_head_hash_rb = &p_hash_cfg->hash_rb.tn_list;
+ p_node = p_head_hash_rb->p_next;
+ while (p_node) {
+ p_rb_tn = (ZXDH_RB_TN *)p_node->data;
+ ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_rb_tn);
+ p_rbkey = (ZXDH_HASH_RBKEY_INFO *)p_rb_tn->p_key;
+ hash_entry.p_actu_key = p_rbkey->key + 1;
+ hash_entry.p_rst = p_rbkey->key;
+
+ key_valid = ZXDH_GET_HASH_KEY_VALID(p_rbkey->key);
+ table_id = ZXDH_GET_HASH_TBL_ID(p_rbkey->key);
+ key_type = ZXDH_GET_HASH_KEY_TYPE(p_rbkey->key);
+ if (!key_valid ||
+ table_id != hash_entry_cfg.table_id ||
+ key_type != hash_entry_cfg.key_type) {
+ p_node = p_node->next;
+ continue;
+ }
+ p_node = p_node->next;
+
+ rc = zxdh_np_dtb_table_entry_delete(dev_id, queue_id, 1, &del_entry);
+ if (rc == ZXDH_HASH_RC_DEL_SRHFAIL)
+ continue;
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_table_entry_delete");
+ }
+
+ return rc;
+}
+
+uint32_t
+zxdh_np_dtb_hash_offline_delete(uint32_t dev_id,
+ uint32_t queue_id,
+ uint32_t sdt_no,
+ __rte_unused uint32_t flush_mode)
+{
+ uint32_t rc = ZXDH_OK;
+
+ rc = zxdh_np_dtb_hash_offline_zcam_delete(dev_id, queue_id, sdt_no);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_hash_offline_zcam_delete");
+
+ return rc;
+}
diff --git a/drivers/net/zxdh/zxdh_np.h b/drivers/net/zxdh/zxdh_np.h
index 0762db5fad..2ba9554684 100644
--- a/drivers/net/zxdh/zxdh_np.h
+++ b/drivers/net/zxdh/zxdh_np.h
@@ -95,6 +95,11 @@
#define ZXDH_DTB_ITEM_ADD_OR_UPDATE (0)
#define ZXDH_DTB_ITEM_DELETE (1)
#define ZXDH_DTB_ZCAM_LEN_SIZE (5)
+#define ZXDH_DTB_DUMP_ZCAM_TYPE (0)
+#define ZXDH_DTB_DUMP_DDR_TYPE (1)
+#define ZXDH_DTB_DMUP_DATA_MAX (64 * 1024 * 1024)
+#define ZXDH_DTB_TABLE_DUMP_INFO_BUFF_SIZE (1024 * 4)
+#define ZXDH_DTB_ETCAM_LEN_SIZE (6)
#define ZXDH_ETCAM_LEN_SIZE (6)
#define ZXDH_ETCAM_BLOCK_NUM (8)
@@ -231,6 +236,10 @@
#define ZXDH_SDT_L_CLUTCH_EN_BT_POS (0)
#define ZXDH_SDT_L_CLUTCH_EN_BT_LEN (1)
+/* hash */
+#define ZXDH_SDT_L2_ENTRY_TABLE0 (64)
+#define ZXDH_SDT_MC_TABLE0 (76)
+
/**errco code */
#define ZXDH_RC_BASE (0x1000U)
#define ZXDH_PARAMETER_CHK_BASE (ZXDH_RC_BASE | 0x200)
@@ -1677,6 +1686,11 @@ typedef struct __rte_aligned(2) zxdh_se_stat_cfg_t {
uint32_t ppu_ddr_offset;
} ZXDH_NP_SE_STAT_CFG_T;
+typedef struct zxdh_dtb_dump_index_t {
+ uint32_t index;
+ uint32_t index_type;
+} ZXDH_DTB_DUMP_INDEX_T;
+
int zxdh_np_host_init(uint32_t dev_id, ZXDH_DEV_INIT_CTRL_T *p_dev_init_ctrl);
int zxdh_np_online_uninit(uint32_t dev_id, char *port_name, uint32_t queue_id);
int zxdh_np_dtb_table_entry_write(uint32_t dev_id, uint32_t queue_id,
@@ -1691,5 +1705,10 @@ int zxdh_np_dtb_stats_get(uint32_t dev_id,
uint32_t index,
uint32_t *p_data);
uint32_t zxdh_np_se_res_get_and_init(uint32_t dev_id, uint32_t type);
+uint32_t zxdh_np_dtb_hash_online_delete(uint32_t dev_id, uint32_t queue_id, uint32_t sdt_no);
+uint32_t zxdh_np_dtb_hash_offline_delete(uint32_t dev_id,
+ uint32_t queue_id,
+ uint32_t sdt_no,
+ __rte_unused uint32_t flush_mode);
#endif /* ZXDH_NP_H */
--
2.27.0
[-- Attachment #1.1.2: Type: text/html , Size: 112084 bytes --]
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [PATCH v1 12/14] net/zxdh: delete all hash entries
2025-02-10 1:50 ` [PATCH v1 12/14] net/zxdh: delete all hash entries Bingbin Chen
@ 2025-02-10 17:47 ` Stephen Hemminger
0 siblings, 0 replies; 32+ messages in thread
From: Stephen Hemminger @ 2025-02-10 17:47 UTC (permalink / raw)
To: Bingbin Chen; +Cc: dev
On Mon, 10 Feb 2025 09:50:15 +0800
Bingbin Chen <chen.bingbin@zte.com.cn> wrote:
> +#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);\
Again, PMD_DRV_LOG already puts function name in, and making louder
by SCREAMING UPPER CASE won't fix the problem
^ permalink raw reply [flat|nested] 32+ messages in thread
* [PATCH v1 13/14] net/zxdh: add acl tables ops
2025-02-10 1:50 ` [PATCH v1 06/14] net/zxdh: add eram tables ops Bingbin Chen
` (5 preceding siblings ...)
2025-02-10 1:50 ` [PATCH v1 12/14] net/zxdh: delete all hash entries Bingbin Chen
@ 2025-02-10 1:50 ` Bingbin Chen
2025-02-10 1:50 ` [PATCH v1 14/14] net/zxdh: clean stat values Bingbin Chen
7 siblings, 0 replies; 32+ messages in thread
From: Bingbin Chen @ 2025-02-10 1:50 UTC (permalink / raw)
To: dev; +Cc: Bingbin Chen
[-- Attachment #1.1.1: Type: text/plain, Size: 31917 bytes --]
Implement acl table entry write/read/delete
operations by dtb channel.
Signed-off-by: Bingbin Chen <chen.bingbin@zte.com.cn>
---
drivers/net/zxdh/zxdh_np.c | 915 ++++++++++++++++++++++++++++++++++++-
drivers/net/zxdh/zxdh_np.h | 31 ++
2 files changed, 945 insertions(+), 1 deletion(-)
diff --git a/drivers/net/zxdh/zxdh_np.c b/drivers/net/zxdh/zxdh_np.c
index 230a1d44be..9de3e2f406 100644
--- a/drivers/net/zxdh/zxdh_np.c
+++ b/drivers/net/zxdh/zxdh_np.c
@@ -678,6 +678,11 @@ zxdh_np_get_hash_entry_mask(uint32_t entry_size, uint32_t entry_pos)
#define GET_ZCELL_CRC_VAL(zcell_id, crc16_val) \
(((crc16_val) >> (zcell_id)) & (ZXDH_SE_RAM_DEPTH - 1))
+#define ZXDH_COMM_DM_TO_X(d, m) ((d) & ~(m))
+#define ZXDH_COMM_DM_TO_Y(d, m) (~(d) & ~(m))
+#define ZXDH_COMM_XY_TO_MASK(x, y) (~(x) & ~(y))
+#define ZXDH_COMM_XY_TO_DATA(x, y) (x)
+
static uint32_t
zxdh_np_comm_mutex_create(ZXDH_MUTEX_T *p_mutex)
{
@@ -4102,6 +4107,65 @@ zxdh_np_hash_soft_uninstall(uint32_t dev_id)
return rc;
}
+static uint32_t
+zxdh_np_acl_cfg_get(uint32_t dev_id, ZXDH_ACL_CFG_EX_T **p_acl_cfg)
+{
+ if (g_p_acl_ex_cfg[dev_id] == NULL) {
+ PMD_DRV_LOG(ERR, "%s fail, etcam_is not init!", __func__);
+ RTE_ASSERT(0);
+ return ZXDH_ACL_RC_ETCAMID_NOT_INIT;
+ }
+
+ *p_acl_cfg = g_p_acl_ex_cfg[dev_id];
+
+ return ZXDH_OK;
+}
+
+static uint32_t
+zxdh_np_acl_res_destroy(uint32_t dev_id)
+{
+ uint32_t table_id = 0;
+ uint32_t as_enable = 0;
+ ZXDH_ACL_CFG_EX_T *p_acl_cfg = NULL;
+ ZXDH_ACL_TBL_CFG_T *p_tbl_cfg = NULL;
+
+ zxdh_np_acl_cfg_get(dev_id, &p_acl_cfg);
+
+ if (!p_acl_cfg->acl_etcamids.is_valid) {
+ PMD_DRV_LOG(DEBUG, "etcam is not init!");
+ return ZXDH_OK;
+ }
+
+ for (table_id = ZXDH_ACL_TBL_ID_MIN; table_id <= ZXDH_ACL_TBL_ID_MAX; table_id++) {
+ p_tbl_cfg = p_acl_cfg->acl_tbls + table_id;
+ if (!p_tbl_cfg->is_used) {
+ PMD_DRV_LOG(DEBUG, "table_id[ %d ] is not used!", table_id);
+ continue;
+ }
+
+ zxdh_comm_rb_destroy(&p_tbl_cfg->acl_rb);
+
+ as_enable = p_tbl_cfg->as_enable;
+ if (as_enable) {
+ if (p_tbl_cfg->as_rslt_buff) {
+ rte_free(p_tbl_cfg->as_rslt_buff);
+ p_tbl_cfg->as_rslt_buff = NULL;
+ }
+ }
+
+ if (p_tbl_cfg->block_array) {
+ rte_free(p_tbl_cfg->block_array);
+ p_tbl_cfg->block_array = NULL;
+ }
+
+ p_tbl_cfg->is_used = 0;
+ }
+
+ p_acl_cfg->acl_etcamids.is_valid = 0;
+
+ return ZXDH_OK;
+}
+
int
zxdh_np_online_uninit(uint32_t dev_id,
char *port_name,
@@ -4118,6 +4182,7 @@ zxdh_np_online_uninit(uint32_t dev_id,
if (rc != ZXDH_OK)
PMD_DRV_LOG(ERR, "zxdh_np_hash_soft_uninstall error! ");
+ zxdh_np_acl_res_destroy(dev_id);
zxdh_np_dtb_mgr_destroy(dev_id);
zxdh_np_sdt_mgr_destroy(dev_id);
zxdh_np_dev_del(dev_id);
@@ -4327,6 +4392,70 @@ zxdh_np_dtb_se_alg_zcam_data_write(uint32_t dev_id,
return rc;
}
+static uint32_t
+zxdh_np_dtb_etcam_write_entry_data(uint32_t dev_id,
+ uint32_t block_idx,
+ uint32_t row_or_col_msk,
+ uint32_t vben,
+ uint32_t reg_tcam_flag,
+ uint32_t flush,
+ uint32_t rd_wr,
+ uint32_t wr_mode,
+ uint32_t data_or_mask,
+ uint32_t ram_addr,
+ uint32_t vbit,
+ uint8_t *p_data,
+ ZXDH_DTB_ENTRY_T *p_entry)
+{
+ uint32_t rc = ZXDH_OK;
+ uint32_t i = 0;
+ uint32_t offset = 0;
+ uint8_t *p_temp = NULL;
+
+ uint8_t buff[ZXDH_ETCAM_WIDTH_MAX / 8] = {0};
+
+ ZXDH_DTB_ETCAM_TABLE_FORM_T dtb_etcam_form_info = {0};
+
+ dtb_etcam_form_info.valid = 1;
+ dtb_etcam_form_info.type_mode = ZXDH_DTB_TABLE_MODE_ETCAM;
+ dtb_etcam_form_info.block_sel = block_idx;
+ dtb_etcam_form_info.init_en = 0;
+ dtb_etcam_form_info.row_or_col_msk = row_or_col_msk;
+ dtb_etcam_form_info.vben = vben;
+ dtb_etcam_form_info.reg_tcam_flag = reg_tcam_flag;
+ dtb_etcam_form_info.uload = flush;
+ dtb_etcam_form_info.rd_wr = rd_wr;
+ dtb_etcam_form_info.wr_mode = wr_mode;
+ dtb_etcam_form_info.data_or_mask = data_or_mask;
+ dtb_etcam_form_info.addr = ram_addr;
+ dtb_etcam_form_info.vbit = vbit;
+
+ p_entry->data_in_cmd_flag = 0;
+ p_entry->data_size = ZXDH_DTB_LEN_POS_SETP * (ZXDH_DTB_ETCAM_LEN_SIZE - 1);
+
+ rc = zxdh_np_dtb_write_table_cmd(dev_id, ZXDH_DTB_TABLE_ETCAM,
+ &dtb_etcam_form_info, p_entry->cmd);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_write_table_cmd");
+
+ p_temp = p_data;
+
+ for (i = 0; i < ZXDH_ETCAM_RAM_NUM; i++) {
+ offset = i * ((uint32_t)ZXDH_ETCAM_WIDTH_MIN / 8);
+
+ if ((wr_mode >> (ZXDH_ETCAM_RAM_NUM - 1 - i)) & 0x1) {
+ rte_memcpy(buff + offset, p_temp, ZXDH_ETCAM_WIDTH_MIN / 8);
+ p_temp += ZXDH_ETCAM_WIDTH_MIN / 8;
+ }
+ }
+
+ zxdh_np_comm_swap((uint8_t *)buff, ZXDH_DTB_LEN_POS_SETP * (ZXDH_DTB_ETCAM_LEN_SIZE - 1));
+
+ rte_memcpy(p_entry->data, buff,
+ ZXDH_DTB_LEN_POS_SETP * (ZXDH_DTB_ETCAM_LEN_SIZE - 1));
+
+ return rc;
+}
+
static uint32_t
zxdh_np_dtb_smmu0_dump_info_write(uint32_t dev_id,
uint32_t base_addr,
@@ -4385,6 +4514,35 @@ zxdh_np_dtb_zcam_dump_info_write(uint32_t dev_id,
return rc;
}
+static uint32_t
+zxdh_np_dtb_etcam_dump_info_write(uint32_t dev_id,
+ ZXDH_ETCAM_DUMP_INFO_T *p_etcam_dump_info,
+ uint32_t addr_high32,
+ uint32_t addr_low32,
+ uint32_t *p_dump_info)
+{
+ uint32_t rc = ZXDH_OK;
+
+ ZXDH_DTB_ETCAM_DUMP_FORM_T dtb_etcam_dump_form_info = {0};
+
+ dtb_etcam_dump_form_info.valid = 1;
+ dtb_etcam_dump_form_info.up_type = ZXDH_DTB_DUMP_MODE_ETCAM;
+ dtb_etcam_dump_form_info.block_sel = p_etcam_dump_info->block_sel;
+ dtb_etcam_dump_form_info.addr = p_etcam_dump_info->addr;
+ dtb_etcam_dump_form_info.rd_mode = p_etcam_dump_info->rd_mode;
+ dtb_etcam_dump_form_info.data_or_mask = p_etcam_dump_info->data_or_mask;
+ dtb_etcam_dump_form_info.tb_depth = p_etcam_dump_info->tb_depth;
+ dtb_etcam_dump_form_info.tb_width = p_etcam_dump_info->tb_width;
+ dtb_etcam_dump_form_info.tb_dst_addr_h = addr_high32;
+ dtb_etcam_dump_form_info.tb_dst_addr_l = addr_low32;
+
+ rc = zxdh_np_dtb_write_dump_cmd(dev_id, ZXDH_DTB_DUMP_ETCAM,
+ &dtb_etcam_dump_form_info, p_dump_info);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_write_dump_cmd");
+
+ return rc;
+}
+
static void
zxdh_np_dtb_zcam_dump_entry(uint32_t dev_id,
uint32_t addr,
@@ -4404,6 +4562,38 @@ zxdh_np_dtb_zcam_dump_entry(uint32_t dev_id,
p_entry->data_in_cmd_flag = 1;
}
+static void
+zxdh_np_dtb_smmu0_dump_entry(uint32_t dev_id,
+ uint32_t base_addr,
+ uint32_t depth,
+ uint32_t addr_high32,
+ uint32_t addr_low32,
+ ZXDH_DTB_ENTRY_T *p_entry)
+{
+ zxdh_np_dtb_smmu0_dump_info_write(dev_id,
+ base_addr,
+ depth,
+ addr_high32,
+ addr_low32,
+ (uint32_t *)p_entry->cmd);
+ p_entry->data_in_cmd_flag = 1;
+}
+
+static void
+zxdh_np_dtb_etcam_dump_entry(uint32_t dev_id,
+ ZXDH_ETCAM_DUMP_INFO_T *p_etcam_dump_info,
+ uint32_t addr_high32,
+ uint32_t addr_low32,
+ ZXDH_DTB_ENTRY_T *p_entry)
+{
+ zxdh_np_dtb_etcam_dump_info_write(dev_id,
+ p_etcam_dump_info,
+ 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,
@@ -4412,7 +4602,7 @@ zxdh_np_dtb_se_smmu0_ind_write(uint32_t dev_id,
uint32_t *p_data,
ZXDH_DTB_ENTRY_T *p_entry)
{
- uint32_t temp_idx;
+ uint32_t temp_idx = 0;
uint32_t dtb_ind_addr;
uint32_t rc;
@@ -5872,6 +6062,327 @@ zxdh_np_dtb_hash_one_entry(uint32_t dev_id,
return rc;
}
+static void
+zxdh_np_acl_hdw_addr_get(ZXDH_ACL_TBL_CFG_T *p_tbl_cfg, uint32_t handle,
+ uint32_t *p_block_idx, uint32_t *p_addr, uint32_t *p_wr_mask)
+{
+ uint32_t block_entry_num = 0;
+ uint32_t entry_pos = 0;
+
+ block_entry_num = ZXDH_ACL_ENTRY_MAX_GET(p_tbl_cfg->key_mode, 1);
+ *p_block_idx = p_tbl_cfg->block_array[handle / block_entry_num];
+ *p_addr = (handle % block_entry_num) / (1U << p_tbl_cfg->key_mode);
+ entry_pos = (handle % block_entry_num) % (1U << p_tbl_cfg->key_mode);
+ *p_wr_mask = (((1U << (8U >> (p_tbl_cfg->key_mode))) - 1) <<
+ ((8U >> (p_tbl_cfg->key_mode)) * (entry_pos))) & 0xFF;
+}
+
+static void
+zxdh_np_etcam_dm_to_xy(ZXDH_ETCAM_ENTRY_T *p_dm,
+ ZXDH_ETCAM_ENTRY_T *p_xy,
+ uint32_t len)
+{
+ uint32_t i = 0;
+
+ RTE_ASSERT(p_dm->p_data && p_dm->p_mask && p_xy->p_data && p_xy->p_mask);
+
+ for (i = 0; i < len; i++) {
+ p_xy->p_data[i] = ZXDH_COMM_DM_TO_X(p_dm->p_data[i], p_dm->p_mask[i]);
+ p_xy->p_mask[i] = ZXDH_COMM_DM_TO_Y(p_dm->p_data[i], p_dm->p_mask[i]);
+ }
+}
+
+static uint32_t
+zxdh_np_eram_opr_mode_get(uint32_t as_mode)
+{
+ uint32_t opr_mode = 0;
+
+ switch (as_mode) {
+ case ZXDH_ERAM128_TBL_128b:
+ {
+ opr_mode = ZXDH_ERAM128_OPR_128b;
+ break;
+ }
+ case ZXDH_ERAM128_TBL_64b:
+ {
+ opr_mode = ZXDH_ERAM128_OPR_64b;
+ break;
+ }
+ case ZXDH_ERAM128_TBL_1b:
+ {
+ opr_mode = ZXDH_ERAM128_OPR_1b;
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+
+ return opr_mode;
+}
+
+static uint32_t
+zxdh_np_dtb_etcam_entry_add(uint32_t dev_id,
+ uint32_t addr,
+ uint32_t block_idx,
+ uint32_t wr_mask,
+ uint32_t opr_type,
+ ZXDH_ETCAM_ENTRY_T *p_entry,
+ ZXDH_DTB_ENTRY_T *p_entry_data,
+ ZXDH_DTB_ENTRY_T *p_entry_mask)
+{
+ uint32_t rc = ZXDH_OK;
+ uint8_t temp_data[ZXDH_ETCAM_WIDTH_MAX / 8] = {0};
+ uint8_t temp_mask[ZXDH_ETCAM_WIDTH_MAX / 8] = {0};
+ ZXDH_ETCAM_ENTRY_T entry_xy = {0};
+
+ RTE_ASSERT(p_entry->p_data && p_entry->p_mask);
+
+ entry_xy.p_data = temp_data;
+ entry_xy.p_mask = temp_mask;
+
+ if (opr_type == ZXDH_ETCAM_OPR_DM) {
+ zxdh_np_etcam_dm_to_xy(p_entry, &entry_xy,
+ ZXDH_ETCAM_ENTRY_SIZE_GET(p_entry->mode));
+ } else {
+ rte_memcpy(entry_xy.p_data, p_entry->p_data,
+ ZXDH_ETCAM_ENTRY_SIZE_GET(p_entry->mode));
+ rte_memcpy(entry_xy.p_mask, p_entry->p_mask,
+ ZXDH_ETCAM_ENTRY_SIZE_GET(p_entry->mode));
+ }
+
+ rc = zxdh_np_dtb_etcam_write_entry_data(dev_id, block_idx, 0, 1, 0, 0, 0,
+ wr_mask, ZXDH_ETCAM_DTYPE_DATA, addr, 0, entry_xy.p_data, p_entry_data);
+
+ rc = zxdh_np_dtb_etcam_write_entry_data(dev_id, block_idx, 0, 1, 0, 0, 0,
+ wr_mask, ZXDH_ETCAM_DTYPE_MASK, addr, 0xFF, entry_xy.p_mask, p_entry_mask);
+
+ return rc;
+}
+
+static uint32_t
+zxdh_np_dtb_acl_delete(uint32_t dev_id,
+ uint32_t sdt_no,
+ ZXDH_ACL_ENTRY_EX_T *p_acl_entry,
+ ZXDH_DTB_ENTRY_T *p_dtb_data_entry,
+ ZXDH_DTB_ENTRY_T *p_dtb_mask_entry,
+ ZXDH_DTB_ENTRY_T *p_dtb_as_entry)
+{
+ uint32_t rc = ZXDH_OK;
+ uint32_t as_eram_baddr = 0;
+ uint32_t as_enable = 0;
+ uint32_t etcam_table_id = 0;
+ uint32_t etcam_as_mode = 0;
+ uint32_t opr_mode = 0;
+ uint32_t block_idx = 0;
+ uint32_t ram_addr = 0;
+ uint32_t etcam_wr_mask = 0;
+ uint8_t temp_data[ZXDH_ETCAM_WIDTH_MAX / 8];
+ uint8_t temp_mask[ZXDH_ETCAM_WIDTH_MAX / 8];
+ uint8_t temp_buf[16] = {0};
+
+ ZXDH_SDT_TBL_ETCAM_T sdt_acl = {0};
+ ZXDH_ACL_CFG_EX_T *p_acl_cfg = NULL;
+ ZXDH_ACL_TBL_CFG_T *p_tbl_cfg = NULL;
+ ZXDH_ETCAM_ENTRY_T etcam_entry = {0};
+
+ rc = zxdh_np_soft_sdt_tbl_get(dev_id, sdt_no, &sdt_acl);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_soft_sdt_tbl_get");
+
+ etcam_as_mode = sdt_acl.as_rsp_mode;
+ etcam_table_id = sdt_acl.etcam_table_id;
+ as_enable = sdt_acl.as_en;
+ as_eram_baddr = sdt_acl.as_eram_baddr;
+
+ zxdh_np_acl_cfg_get(dev_id, &p_acl_cfg);
+
+ p_tbl_cfg = p_acl_cfg->acl_tbls + etcam_table_id;
+ if (!p_tbl_cfg->is_used) {
+ PMD_DRV_LOG(ERR, "table[ %d ] is not init!", etcam_table_id);
+ RTE_ASSERT(0);
+ return ZXDH_ACL_RC_TBL_NOT_INIT;
+ }
+
+ zxdh_np_acl_hdw_addr_get(p_tbl_cfg, p_acl_entry->pri,
+ &block_idx, &ram_addr, &etcam_wr_mask);
+
+ memset(temp_data, 0xff, ZXDH_ETCAM_WIDTH_MAX / 8);
+ memset(temp_mask, 0, ZXDH_ETCAM_WIDTH_MAX / 8);
+ etcam_entry.mode = p_tbl_cfg->key_mode;
+ etcam_entry.p_data = temp_data;
+ etcam_entry.p_mask = temp_mask;
+ rc = zxdh_np_dtb_etcam_entry_add(dev_id,
+ ram_addr,
+ block_idx,
+ etcam_wr_mask,
+ ZXDH_ETCAM_OPR_DM,
+ &etcam_entry,
+ p_dtb_data_entry,
+ p_dtb_mask_entry);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_etcam_entry_add");
+
+ if (as_enable) {
+ memset(temp_buf, 0, sizeof(temp_buf));
+ opr_mode = zxdh_np_eram_opr_mode_get(etcam_as_mode);
+ rc = zxdh_np_dtb_se_smmu0_ind_write(dev_id,
+ as_eram_baddr,
+ p_acl_entry->pri,
+ opr_mode,
+ (uint32_t *)temp_buf,
+ p_dtb_as_entry);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_se_smmu0_ind_write");
+ }
+
+ return rc;
+}
+
+static uint32_t
+zxdh_np_dtb_acl_insert(uint32_t dev_id,
+ uint32_t sdt_no,
+ ZXDH_ACL_ENTRY_EX_T *p_acl_entry,
+ ZXDH_DTB_ENTRY_T *p_dtb_data_entry,
+ ZXDH_DTB_ENTRY_T *p_dtb_mask_entry,
+ ZXDH_DTB_ENTRY_T *p_dtb_as_entry)
+{
+ uint32_t rc = ZXDH_OK;
+ uint32_t as_eram_baddr = 0;
+ uint32_t as_enable = 0;
+ uint32_t etcam_table_id = 0;
+ uint32_t etcam_as_mode = 0;
+ uint32_t opr_mode = 0;
+ uint32_t block_idx = 0;
+ uint32_t ram_addr = 0;
+ uint32_t etcam_wr_mask = 0;
+
+ ZXDH_SDT_TBL_ETCAM_T sdt_acl = {0};
+ ZXDH_ACL_CFG_EX_T *p_acl_cfg = NULL;
+ ZXDH_ACL_TBL_CFG_T *p_tbl_cfg = NULL;
+ ZXDH_ETCAM_ENTRY_T etcam_entry = {0};
+
+ rc = zxdh_np_soft_sdt_tbl_get(dev_id, sdt_no, &sdt_acl);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_soft_sdt_tbl_get");
+
+ etcam_as_mode = sdt_acl.as_rsp_mode;
+ etcam_table_id = sdt_acl.etcam_table_id;
+ as_enable = sdt_acl.as_en;
+ as_eram_baddr = sdt_acl.as_eram_baddr;
+
+ zxdh_np_acl_cfg_get(dev_id, &p_acl_cfg);
+
+ p_tbl_cfg = p_acl_cfg->acl_tbls + etcam_table_id;
+ if (!p_tbl_cfg->is_used) {
+ PMD_DRV_LOG(ERR, "table[ %d ] is not init!", etcam_table_id);
+ RTE_ASSERT(0);
+ return ZXDH_ACL_RC_TBL_NOT_INIT;
+ }
+
+ zxdh_np_acl_hdw_addr_get(p_tbl_cfg, p_acl_entry->pri,
+ &block_idx, &ram_addr, &etcam_wr_mask);
+
+ etcam_entry.mode = p_tbl_cfg->key_mode;
+ etcam_entry.p_data = p_acl_entry->key_data;
+ etcam_entry.p_mask = p_acl_entry->key_mask;
+
+ rc = zxdh_np_dtb_etcam_entry_add(dev_id,
+ ram_addr,
+ block_idx,
+ etcam_wr_mask,
+ ZXDH_ETCAM_OPR_DM,
+ &etcam_entry,
+ p_dtb_data_entry,
+ p_dtb_mask_entry);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_etcam_entry_add");
+
+ if (as_enable) {
+ opr_mode = zxdh_np_eram_opr_mode_get(etcam_as_mode);
+ rc = zxdh_np_dtb_se_smmu0_ind_write(dev_id,
+ as_eram_baddr,
+ p_acl_entry->pri,
+ opr_mode,
+ (uint32_t *)p_acl_entry->p_as_rslt,
+ p_dtb_as_entry);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_se_smmu0_ind_write");
+ }
+
+ return rc;
+}
+
+static uint32_t
+zxdh_np_dtb_acl_one_entry(uint32_t dev_id,
+ uint32_t sdt_no,
+ uint32_t del_en,
+ void *p_data,
+ uint32_t *p_dtb_len,
+ uint8_t *p_data_buff)
+{
+ uint32_t rc = ZXDH_OK;
+ uint32_t addr_offset = 0;
+ ZXDH_ACL_ENTRY_EX_T acl_entry = {0};
+ ZXDH_DTB_ACL_ENTRY_INFO_T *p_entry = NULL;
+
+ uint8_t data_buff[ZXDH_ETCAM_WIDTH_MAX / 8] = {0};
+ uint8_t mask_buff[ZXDH_ETCAM_WIDTH_MAX / 8] = {0};
+ uint8_t data_cmd_buff[ZXDH_DTB_TABLE_CMD_SIZE_BIT / 8] = {0};
+ uint8_t mask_cmd_buff[ZXDH_DTB_TABLE_CMD_SIZE_BIT / 8] = {0};
+ uint8_t as_cmd_buff[ZXDH_DTB_TABLE_CMD_SIZE_BIT / 8] = {0};
+ uint32_t as_data_buff[4] = {0};
+
+ ZXDH_DTB_ENTRY_T dtb_data_entry = {0};
+ ZXDH_DTB_ENTRY_T dtb_mask_entry = {0};
+ ZXDH_DTB_ENTRY_T dtb_as_entry = {0};
+
+ dtb_data_entry.cmd = data_cmd_buff;
+ dtb_data_entry.data = data_buff;
+ dtb_mask_entry.cmd = mask_cmd_buff;
+ dtb_mask_entry.data = mask_buff;
+ dtb_as_entry.cmd = as_cmd_buff;
+ dtb_as_entry.data = (uint8_t *)as_data_buff;
+
+ p_entry = (ZXDH_DTB_ACL_ENTRY_INFO_T *)p_data;
+ acl_entry.pri = p_entry->handle;
+ acl_entry.key_data = p_entry->key_data;
+ acl_entry.key_mask = p_entry->key_mask;
+ acl_entry.p_as_rslt = p_entry->p_as_rslt;
+ if (del_en) {
+ rc = zxdh_np_dtb_acl_delete(dev_id,
+ sdt_no,
+ &acl_entry,
+ &dtb_data_entry,
+ &dtb_mask_entry,
+ &dtb_as_entry);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_acl_delete");
+ } else {
+ rc = zxdh_np_dtb_acl_insert(dev_id,
+ sdt_no,
+ &acl_entry,
+ &dtb_data_entry,
+ &dtb_mask_entry,
+ &dtb_as_entry);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_acl_insert");
+ }
+
+ addr_offset = (*p_dtb_len) * ZXDH_DTB_LEN_POS_SETP;
+ *p_dtb_len += ZXDH_DTB_ETCAM_LEN_SIZE;
+
+ rc = zxdh_np_dtb_data_write(p_data_buff, addr_offset, &dtb_data_entry);
+
+ addr_offset = (*p_dtb_len) * ZXDH_DTB_LEN_POS_SETP;
+ *p_dtb_len += ZXDH_DTB_ETCAM_LEN_SIZE;
+
+ rc = zxdh_np_dtb_data_write(p_data_buff, addr_offset, &dtb_mask_entry);
+
+ addr_offset = (*p_dtb_len) * ZXDH_DTB_LEN_POS_SETP;
+ if (dtb_as_entry.data_in_cmd_flag)
+ *p_dtb_len += 1;
+ else
+ *p_dtb_len += 2;
+
+ rc = zxdh_np_dtb_data_write(p_data_buff, addr_offset, &dtb_as_entry);
+
+ return ZXDH_OK;
+}
+
int
zxdh_np_dtb_table_entry_write(uint32_t dev_id,
uint32_t queue_id,
@@ -5918,6 +6429,12 @@ zxdh_np_dtb_table_entry_write(uint32_t dev_id,
pentry->p_entry_data, &one_dtb_len, &dtb_one_entry);
break;
}
+ case ZXDH_SDT_TBLT_ETCAM:
+ {
+ rc = zxdh_np_dtb_acl_one_entry(dev_id, sdt_no, ZXDH_DTB_ITEM_ADD_OR_UPDATE,
+ pentry->p_entry_data, &dtb_len, p_data_buff);
+ continue;
+ }
default:
{
PMD_DRV_LOG(ERR, "SDT table_type[ %d ] is invalid!", tbl_type);
@@ -7031,6 +7548,393 @@ zxdh_np_dtb_hash_data_get(uint32_t dev_id,
return rc;
}
+static void
+dtb_etcam_dump_data_len(uint32_t etcam_key_mode,
+ uint32_t *p_etcam_dump_len,
+ uint32_t *p_etcam_dump_inerval)
+{
+ uint32_t dump_data_len = 0;
+ uint8_t etcam_dump_inerval = 0;
+
+ if (ZXDH_ETCAM_KEY_640b == etcam_key_mode) {
+ dump_data_len = 5 * ZXDH_DTB_LEN_POS_SETP;
+ etcam_dump_inerval = 0;
+ } else if (ZXDH_ETCAM_KEY_320b == etcam_key_mode) {
+ dump_data_len = 3 * ZXDH_DTB_LEN_POS_SETP;
+ etcam_dump_inerval = 8;
+ } else if (ZXDH_ETCAM_KEY_160b == etcam_key_mode) {
+ dump_data_len = 2 * ZXDH_DTB_LEN_POS_SETP;
+ etcam_dump_inerval = 12;
+ } else if (ZXDH_ETCAM_KEY_80b == etcam_key_mode) {
+ dump_data_len = 1 * ZXDH_DTB_LEN_POS_SETP;
+ etcam_dump_inerval = 6;
+ }
+
+ *p_etcam_dump_len = dump_data_len;
+ *p_etcam_dump_inerval = etcam_dump_inerval;
+}
+
+static void
+zxdh_np_dtb_get_etcam_xy_from_dump_data(uint8_t *p_data,
+ uint8_t *p_mask,
+ uint32_t etcam_dump_len,
+ uint32_t etcam_dump_inerval,
+ ZXDH_ETCAM_ENTRY_T *p_entry_xy)
+{
+ uint8_t *p_entry_data = NULL;
+ uint8_t *p_entry_mask = NULL;
+
+ zxdh_np_comm_swap(p_data, etcam_dump_len);
+ zxdh_np_comm_swap(p_mask, etcam_dump_len);
+
+ p_entry_data = p_data + etcam_dump_inerval;
+ p_entry_mask = p_mask + etcam_dump_inerval;
+
+ rte_memcpy(p_entry_xy->p_data, p_entry_data,
+ ZXDH_ETCAM_ENTRY_SIZE_GET(p_entry_xy->mode));
+ rte_memcpy(p_entry_xy->p_mask, p_entry_mask,
+ ZXDH_ETCAM_ENTRY_SIZE_GET(p_entry_xy->mode));
+}
+
+
+static void
+zxdh_np_etcam_xy_to_dm(ZXDH_ETCAM_ENTRY_T *p_dm,
+ ZXDH_ETCAM_ENTRY_T *p_xy,
+ uint32_t len)
+{
+ uint32_t i = 0;
+
+ RTE_ASSERT(p_dm->p_data && p_dm->p_mask && p_xy->p_data && p_xy->p_mask);
+
+ for (i = 0; i < len; i++) {
+ p_dm->p_data[i] = ZXDH_COMM_XY_TO_DATA(p_xy->p_data[i], p_xy->p_mask[i]);
+ p_dm->p_mask[i] = ZXDH_COMM_XY_TO_MASK(p_xy->p_data[i], p_xy->p_mask[i]);
+ }
+}
+
+static uint32_t
+zxdh_np_dtb_etcam_entry_get(uint32_t dev_id,
+ uint32_t queue_id,
+ uint32_t block_idx,
+ uint32_t addr,
+ uint32_t rd_mode,
+ uint32_t opr_type,
+ uint32_t as_en,
+ uint32_t as_eram_baddr,
+ uint32_t as_eram_index,
+ uint32_t as_rsp_mode,
+ ZXDH_ETCAM_ENTRY_T *p_entry,
+ uint8_t *p_as_rslt)
+{
+ uint32_t rc = ZXDH_OK;
+
+ uint32_t etcam_key_mode = 0;
+
+ uint8_t temp_data[ZXDH_ETCAM_WIDTH_MAX / 8] = {0};
+ uint8_t temp_mask[ZXDH_ETCAM_WIDTH_MAX / 8] = {0};
+ ZXDH_ETCAM_ENTRY_T entry_xy = {0};
+
+ uint32_t etcam_data_dst_phy_haddr = 0;
+ uint32_t etcam_data_dst_phy_laddr = 0;
+ uint32_t etcam_mask_dst_phy_haddr = 0;
+ uint32_t etcam_mask_dst_phy_laddr = 0;
+ uint32_t as_rst_dst_phy_haddr = 0;
+ uint32_t as_rst_dst_phy_laddr = 0;
+
+ uint32_t dump_element_id = 0;
+ uint32_t etcam_dump_one_data_len = 0;
+ uint32_t etcam_dump_inerval = 0;
+ uint32_t dtb_desc_addr_offset = 0;
+ uint32_t dump_data_len = 0;
+ uint32_t dtb_desc_len = 0;
+
+ uint32_t eram_dump_base_addr = 0;
+ uint32_t row_index = 0;
+ uint32_t col_index = 0;
+
+ uint8_t *p_data = NULL;
+ uint8_t *p_mask = NULL;
+ uint8_t *p_rst = NULL;
+ uint8_t *temp_dump_out_data = NULL;
+ uint8_t *dump_info_buff = NULL;
+ ZXDH_ETCAM_DUMP_INFO_T etcam_dump_info = {0};
+ ZXDH_DTB_ENTRY_T dtb_dump_entry = {0};
+ uint8_t cmd_buff[ZXDH_DTB_TABLE_CMD_SIZE_BIT / 8] = {0};
+
+ dtb_dump_entry.cmd = cmd_buff;
+
+ entry_xy.p_data = temp_data;
+ entry_xy.p_mask = temp_mask;
+
+ etcam_key_mode = p_entry->mode;
+
+ etcam_dump_info.block_sel = block_idx;
+ etcam_dump_info.addr = addr;
+ etcam_dump_info.tb_width = 3 - etcam_key_mode;
+ etcam_dump_info.rd_mode = rd_mode;
+ etcam_dump_info.tb_depth = 1;
+
+ rc = zxdh_np_dtb_tab_up_free_item_get(dev_id, queue_id, &dump_element_id);
+ 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;
+ }
+
+ dtb_etcam_dump_data_len(etcam_key_mode, &etcam_dump_one_data_len, &etcam_dump_inerval);
+
+ etcam_dump_info.data_or_mask = ZXDH_ETCAM_DTYPE_DATA;
+ zxdh_np_dtb_tab_up_item_offset_addr_get(dev_id,
+ queue_id,
+ dump_element_id,
+ dump_data_len,
+ &etcam_data_dst_phy_haddr,
+ &etcam_data_dst_phy_laddr);
+
+ zxdh_np_dtb_etcam_dump_entry(dev_id,
+ &etcam_dump_info,
+ etcam_data_dst_phy_haddr,
+ etcam_data_dst_phy_laddr,
+ &dtb_dump_entry);
+
+ dump_info_buff = (uint8_t *)rte_zmalloc(NULL, ZXDH_DTB_TABLE_DUMP_INFO_BUFF_SIZE, 0);
+ if (dump_info_buff == NULL) {
+ PMD_DRV_LOG(ERR, "%s point null!", __func__);
+ return ZXDH_PAR_CHK_POINT_NULL;
+ }
+
+ zxdh_np_dtb_data_write(dump_info_buff, dtb_desc_addr_offset, &dtb_dump_entry);
+ memset(cmd_buff, 0, ZXDH_DTB_TABLE_CMD_SIZE_BIT / 8);
+ dtb_desc_len += 1;
+ dtb_desc_addr_offset += ZXDH_DTB_LEN_POS_SETP;
+ dump_data_len += etcam_dump_one_data_len;
+
+ etcam_dump_info.data_or_mask = ZXDH_ETCAM_DTYPE_MASK;
+ zxdh_np_dtb_tab_up_item_offset_addr_get(dev_id,
+ queue_id,
+ dump_element_id,
+ dump_data_len,
+ &etcam_mask_dst_phy_haddr,
+ &etcam_mask_dst_phy_laddr);
+
+ zxdh_np_dtb_etcam_dump_entry(dev_id,
+ &etcam_dump_info,
+ etcam_mask_dst_phy_haddr,
+ etcam_mask_dst_phy_laddr,
+ &dtb_dump_entry);
+ zxdh_np_dtb_data_write(dump_info_buff, dtb_desc_addr_offset, &dtb_dump_entry);
+ memset(cmd_buff, 0, ZXDH_DTB_TABLE_CMD_SIZE_BIT / 8);
+ dtb_desc_len += 1;
+ dtb_desc_addr_offset += ZXDH_DTB_LEN_POS_SETP;
+ dump_data_len += etcam_dump_one_data_len;
+
+ if (as_en) {
+ zxdh_np_eram_index_cal(as_rsp_mode, as_eram_index, &row_index, &col_index);
+
+ eram_dump_base_addr = as_eram_baddr + row_index;
+ zxdh_np_dtb_tab_up_item_offset_addr_get(dev_id,
+ queue_id,
+ dump_element_id,
+ dump_data_len,
+ &as_rst_dst_phy_haddr,
+ &as_rst_dst_phy_laddr);
+
+ zxdh_np_dtb_smmu0_dump_entry(dev_id,
+ eram_dump_base_addr,
+ 1,
+ as_rst_dst_phy_haddr,
+ as_rst_dst_phy_laddr,
+ &dtb_dump_entry);
+ zxdh_np_dtb_data_write(dump_info_buff, dtb_desc_addr_offset, &dtb_dump_entry);
+ memset(cmd_buff, 0, ZXDH_DTB_TABLE_CMD_SIZE_BIT / 8);
+ dtb_desc_len += 1;
+ dtb_desc_addr_offset += ZXDH_DTB_LEN_POS_SETP;
+ dump_data_len += ZXDH_DTB_LEN_POS_SETP;
+ }
+
+ temp_dump_out_data = (uint8_t *)rte_zmalloc(NULL, dump_data_len, 0);
+ if (temp_dump_out_data == NULL) {
+ PMD_DRV_LOG(ERR, "%s point null!", __func__);
+ rte_free(dump_info_buff);
+ return ZXDH_PAR_CHK_POINT_NULL;
+ }
+ p_data = temp_dump_out_data;
+
+ rc = zxdh_np_dtb_write_dump_desc_info(dev_id,
+ queue_id,
+ dump_element_id,
+ (uint32_t *)dump_info_buff,
+ dump_data_len / 4,
+ dtb_desc_len * 4,
+ (uint32_t *)temp_dump_out_data);
+
+ p_data = temp_dump_out_data;
+ p_mask = p_data + etcam_dump_one_data_len;
+
+ zxdh_np_dtb_get_etcam_xy_from_dump_data(p_data,
+ p_mask,
+ etcam_dump_one_data_len,
+ etcam_dump_inerval,
+ &entry_xy);
+
+ if (opr_type == ZXDH_ETCAM_OPR_DM) {
+ zxdh_np_etcam_xy_to_dm(p_entry, &entry_xy,
+ ZXDH_ETCAM_ENTRY_SIZE_GET(p_entry->mode));
+ } else {
+ rte_memcpy(p_entry->p_data, entry_xy.p_data,
+ ZXDH_ETCAM_ENTRY_SIZE_GET(p_entry->mode));
+ rte_memcpy(p_entry->p_mask, entry_xy.p_mask,
+ ZXDH_ETCAM_ENTRY_SIZE_GET(p_entry->mode));
+ }
+
+ if (as_en) {
+ p_rst = p_mask + etcam_dump_one_data_len;
+ rte_memcpy(p_as_rslt, p_rst, (128 / 8));
+ }
+
+ rte_free(dump_info_buff);
+ rte_free(temp_dump_out_data);
+
+ return rc;
+}
+
+static uint32_t
+zxdh_np_etcam_entry_cmp(ZXDH_ETCAM_ENTRY_T *p_entry_dm, ZXDH_ETCAM_ENTRY_T *p_entry_xy)
+{
+ uint32_t data_mask_len = 0;
+ uint8_t temp_data[ZXDH_ETCAM_WIDTH_MAX / 8] = {0};
+ uint8_t temp_mask[ZXDH_ETCAM_WIDTH_MAX / 8] = {0};
+ ZXDH_ETCAM_ENTRY_T entry_xy_temp = {0};
+
+ entry_xy_temp.mode = p_entry_dm->mode;
+ entry_xy_temp.p_data = temp_data;
+ entry_xy_temp.p_mask = temp_mask;
+
+ data_mask_len = ZXDH_ETCAM_ENTRY_SIZE_GET(entry_xy_temp.mode);
+
+ zxdh_np_etcam_dm_to_xy(p_entry_dm, &entry_xy_temp, data_mask_len);
+
+ if ((memcmp(entry_xy_temp.p_data, p_entry_xy->p_data, data_mask_len) != 0) ||
+ (memcmp(entry_xy_temp.p_mask, p_entry_xy->p_mask, data_mask_len) != 0)) {
+ return ZXDH_ERR;
+ }
+
+ return ZXDH_OK;
+}
+
+static uint32_t
+zxdh_np_dtb_acl_data_get(uint32_t dev_id,
+ uint32_t queue_id,
+ uint32_t sdt_no,
+ ZXDH_DTB_ACL_ENTRY_INFO_T *p_dump_acl_entry)
+{
+ uint32_t rc = ZXDH_OK;
+ uint32_t block_idx = 0;
+ uint32_t ram_addr = 0;
+ uint32_t etcam_wr_mode = 0;
+ uint32_t etcam_key_mode = 0;
+ uint32_t etcam_table_id = 0;
+ uint32_t as_enable = 0;
+ uint32_t as_eram_baddr = 0;
+ uint32_t etcam_as_mode = 0;
+ uint32_t row_index = 0;
+ uint32_t col_index = 0;
+
+ ZXDH_ETCAM_ENTRY_T etcam_entry_dm = {0};
+ ZXDH_ETCAM_ENTRY_T etcam_entry_xy = {0};
+ uint32_t as_eram_data[4] = {0};
+ uint8_t temp_data[ZXDH_ETCAM_WIDTH_MAX / 8] = {0};
+ uint8_t temp_mask[ZXDH_ETCAM_WIDTH_MAX / 8] = {0};
+
+ ZXDH_ACL_CFG_EX_T *p_acl_cfg = NULL;
+ ZXDH_ACL_TBL_CFG_T *p_tbl_cfg = NULL;
+
+ ZXDH_SDT_TBL_ETCAM_T sdt_etcam_info = {0};
+
+ rc = zxdh_np_soft_sdt_tbl_get(dev_id, sdt_no, &sdt_etcam_info);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_soft_sdt_tbl_get");
+ etcam_key_mode = sdt_etcam_info.etcam_key_mode;
+ etcam_as_mode = sdt_etcam_info.as_rsp_mode;
+ etcam_table_id = sdt_etcam_info.etcam_table_id;
+ as_enable = sdt_etcam_info.as_en;
+ as_eram_baddr = sdt_etcam_info.as_eram_baddr;
+
+ etcam_entry_xy.mode = etcam_key_mode;
+ etcam_entry_xy.p_data = temp_data;
+ etcam_entry_xy.p_mask = temp_mask;
+ etcam_entry_dm.mode = etcam_key_mode;
+ etcam_entry_dm.p_data = p_dump_acl_entry->key_data;
+ etcam_entry_dm.p_mask = p_dump_acl_entry->key_mask;
+
+ zxdh_np_acl_cfg_get(dev_id, &p_acl_cfg);
+
+ p_tbl_cfg = p_acl_cfg->acl_tbls + etcam_table_id;
+
+ if (!p_tbl_cfg->is_used) {
+ PMD_DRV_LOG(ERR, "table[ %d ] is not init!", etcam_table_id);
+ RTE_ASSERT(0);
+ return ZXDH_ACL_RC_TBL_NOT_INIT;
+ }
+
+ zxdh_np_acl_hdw_addr_get(p_tbl_cfg, p_dump_acl_entry->handle,
+ &block_idx, &ram_addr, &etcam_wr_mode);
+
+ rc = zxdh_np_dtb_etcam_entry_get(dev_id,
+ queue_id,
+ block_idx,
+ ram_addr,
+ etcam_wr_mode,
+ ZXDH_ETCAM_OPR_XY,
+ as_enable,
+ as_eram_baddr,
+ p_dump_acl_entry->handle,
+ etcam_as_mode,
+ &etcam_entry_xy,
+ (uint8_t *)as_eram_data);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_etcam_entry_get");
+
+ if (zxdh_np_etcam_entry_cmp(&etcam_entry_dm, &etcam_entry_xy) == 0) {
+ PMD_DRV_LOG(DEBUG, "Acl table[ %d ] search in hardware success: handle[ 0x%x ],"
+ "block[ %d ], ram_addr[ %d ], rd_mode[ %x ].",
+ p_tbl_cfg->table_id, p_dump_acl_entry->handle, block_idx,
+ ram_addr, etcam_wr_mode);
+ } else {
+ PMD_DRV_LOG(DEBUG, "Acl table[ %d ] search in hardware fail: handle[ 0x%x ],"
+ "block[ %d ], ram_addr[ %d ], rd_mode[ %x ].",
+ p_tbl_cfg->table_id, p_dump_acl_entry->handle, block_idx,
+ ram_addr, etcam_wr_mode);
+
+ return ZXDH_ERR;
+ }
+
+ if (as_enable) {
+ zxdh_np_eram_index_cal(etcam_as_mode, p_dump_acl_entry->handle,
+ &row_index, &col_index);
+ switch (etcam_as_mode) {
+ case ZXDH_ERAM128_TBL_128b:
+ {
+ rte_memcpy(p_dump_acl_entry->p_as_rslt, as_eram_data, (128 / 8));
+ break;
+ }
+
+ case ZXDH_ERAM128_TBL_64b:
+ {
+ rte_memcpy(p_dump_acl_entry->p_as_rslt, as_eram_data +
+ ((1 - col_index) << 1), (64 / 8));
+ break;
+ }
+
+ case ZXDH_ERAM128_TBL_1b:
+ {
+ ZXDH_COMM_UINT32_GET_BITS(*(uint32_t *)p_dump_acl_entry->p_as_rslt,
+ *(as_eram_data + (3 - col_index / 32)), (col_index % 32), 1);
+ break;
+ }
+ }
+ }
+
+ return rc;
+}
+
int
zxdh_np_dtb_table_entry_get(uint32_t dev_id,
uint32_t queue_id,
@@ -7081,6 +7985,15 @@ zxdh_np_dtb_table_entry_get(uint32_t dev_id,
ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_hash_data_get");
break;
}
+ case ZXDH_SDT_TBLT_ETCAM:
+ {
+ rc = zxdh_np_dtb_acl_data_get(dev_id,
+ queue_id,
+ sdt_no,
+ (ZXDH_DTB_ACL_ENTRY_INFO_T *)get_entry->p_entry_data);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_acl_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 2ba9554684..08a9b3c3a6 100644
--- a/drivers/net/zxdh/zxdh_np.h
+++ b/drivers/net/zxdh/zxdh_np.h
@@ -1295,6 +1295,24 @@ typedef enum zxdh_dtb_dump_zcam_width_e {
ZXDH_DTB_DUMP_ZCAM_RSV = 3,
} ZXDH_DTB_DUMP_ZCAM_WIDTH_E;
+typedef enum zxdh_etcam_opr_type_e {
+ ZXDH_ETCAM_OPR_DM = 0,
+ ZXDH_ETCAM_OPR_XY = 1,
+} ZXDH_ETCAM_OPR_TYPE_E;
+
+typedef enum zxdh_etcam_data_type_e {
+ ZXDH_ETCAM_DTYPE_MASK = 0,
+ ZXDH_ETCAM_DTYPE_DATA = 1,
+} ZXDH_ETCAM_DATA_TYPE_E;
+
+typedef enum zxdh_etcam_entry_mode_e {
+ ZXDH_ETCAM_KEY_640b = 0,
+ ZXDH_ETCAM_KEY_320b = 1,
+ ZXDH_ETCAM_KEY_160b = 2,
+ ZXDH_ETCAM_KEY_80b = 3,
+ ZXDH_ETCAM_KEY_INVALID,
+} ZXDH_ETCAM_ENTRY_MODE_E;
+
typedef struct zxdh_dtb_lpm_entry_t {
uint32_t dtb_len0;
uint8_t *p_data_buff0;
@@ -1309,6 +1327,19 @@ typedef struct zxdh_dtb_entry_t {
uint32_t data_size;
} ZXDH_DTB_ENTRY_T;
+typedef struct zxdh_etcam_entry_t {
+ uint32_t mode;
+ uint8_t *p_data;
+ uint8_t *p_mask;
+} ZXDH_ETCAM_ENTRY_T;
+
+typedef struct zxdh_dtb_acl_entry_info_t {
+ uint32_t handle;
+ uint8_t *key_data;
+ uint8_t *key_mask;
+ uint8_t *p_as_rslt;
+} ZXDH_DTB_ACL_ENTRY_INFO_T;
+
typedef struct zxdh_dtb_eram_table_form_t {
uint32_t valid;
uint32_t type_mode;
--
2.27.0
[-- Attachment #1.1.2: Type: text/html , Size: 91335 bytes --]
^ permalink raw reply [flat|nested] 32+ messages in thread
* [PATCH v1 14/14] net/zxdh: clean stat values
2025-02-10 1:50 ` [PATCH v1 06/14] net/zxdh: add eram tables ops Bingbin Chen
` (6 preceding siblings ...)
2025-02-10 1:50 ` [PATCH v1 13/14] net/zxdh: add acl tables ops Bingbin Chen
@ 2025-02-10 1:50 ` Bingbin Chen
2025-02-10 17:50 ` Stephen Hemminger
` (2 more replies)
7 siblings, 3 replies; 32+ messages in thread
From: Bingbin Chen @ 2025-02-10 1:50 UTC (permalink / raw)
To: dev; +Cc: Bingbin Chen
[-- Attachment #1.1.1: Type: text/plain, Size: 12934 bytes --]
Implement stat values clean operation by agent channel.
Signed-off-by: Bingbin Chen <chen.bingbin@zte.com.cn>
---
drivers/net/zxdh/zxdh_ethdev_ops.c | 4 +
drivers/net/zxdh/zxdh_np.c | 344 +++++++++++++++++++++++++++++
drivers/net/zxdh/zxdh_np.h | 23 +-
3 files changed, 370 insertions(+), 1 deletion(-)
diff --git a/drivers/net/zxdh/zxdh_ethdev_ops.c b/drivers/net/zxdh/zxdh_ethdev_ops.c
index 1a21ded58e..284bf27d10 100644
--- a/drivers/net/zxdh/zxdh_ethdev_ops.c
+++ b/drivers/net/zxdh/zxdh_ethdev_ops.c
@@ -1500,11 +1500,15 @@ static int zxdh_hw_stats_reset(struct rte_eth_dev *dev, enum zxdh_agent_msg_type
int zxdh_dev_stats_reset(struct rte_eth_dev *dev)
{
struct zxdh_hw *hw = dev->data->dev_private;
+ uint64_t stats_data;
zxdh_hw_stats_reset(dev, ZXDH_VQM_DEV_STATS_RESET);
if (hw->is_pf)
zxdh_hw_stats_reset(dev, ZXDH_MAC_STATS_RESET);
+ zxdh_np_stat_ppu_cnt_get_ex(0, ZXDH_STAT_64_MODE, 0,
+ ZXDH_STAT_RD_CLR_MODE_CLR, (uint32_t *)&stats_data);
+
return 0;
}
diff --git a/drivers/net/zxdh/zxdh_np.c b/drivers/net/zxdh/zxdh_np.c
index 9de3e2f406..e4d360c8f5 100644
--- a/drivers/net/zxdh/zxdh_np.c
+++ b/drivers/net/zxdh/zxdh_np.c
@@ -3420,6 +3420,37 @@ zxdh_np_reg_read(uint32_t dev_id, uint32_t reg_no,
return rc;
}
+static uint32_t
+zxdh_np_reg_read32(uint32_t dev_id, uint32_t reg_no,
+ uint32_t m_offset, uint32_t n_offset, uint32_t *p_data)
+{
+ uint32_t rc = 0;
+ uint32_t addr = 0;
+ uint32_t reg_type = 0;
+ uint32_t reg_module = 0;
+ ZXDH_REG_T *p_reg_info = NULL;
+ uint32_t p_buff[ZXDH_REG_DATA_MAX] = {0};
+ uint32_t reg_real_no = 0;
+
+ p_reg_info = &g_dpp_reg_info[reg_no];
+ reg_module = p_reg_info->module_no;
+ reg_type = p_reg_info->flags;
+ reg_real_no = p_reg_info->reg_no;
+
+ addr = zxdh_np_reg_get_reg_addr(reg_no, m_offset, n_offset);
+
+ if (reg_module == DTB4K) {
+ rc = p_reg_info->p_read_fun(dev_id, addr, p_data);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "p_reg_info->p_read_fun");
+ } else {
+ rc = zxdh_np_agent_channel_reg_read(dev_id, reg_type, reg_real_no, 4, addr, p_buff);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_agent_channel_reg_read");
+ *p_data = p_buff[0];
+ }
+
+ return rc;
+}
+
static uint32_t
zxdh_np_dtb_queue_vm_info_get(uint32_t dev_id,
uint32_t queue_id,
@@ -10678,3 +10709,316 @@ zxdh_np_dtb_hash_offline_delete(uint32_t dev_id,
return rc;
}
+
+static uint32_t
+zxdh_np_se_done_status_check(uint32_t dev_id, uint32_t reg_no, uint32_t pos)
+{
+ uint32_t rc = ZXDH_OK;
+
+ uint32_t data = 0;
+ uint32_t rd_cnt = 0;
+ uint32_t done_flag = 0;
+
+ while (!done_flag) {
+ rc = zxdh_np_reg_read32(dev_id, reg_no, 0, 0, &data);
+ if (rc != ZXDH_OK) {
+ PMD_DRV_LOG(ERR, " [ErrorCode:0x%x] !-- zxdh_np_reg_read32 Fail!", rc);
+ return rc;
+ }
+
+ done_flag = (data >> pos) & 0x1;
+
+ if (done_flag)
+ break;
+
+ if (rd_cnt > ZXDH_RD_CNT_MAX * ZXDH_RD_CNT_MAX)
+ return ZXDH_ERR;
+
+ rd_cnt++;
+ }
+
+ return rc;
+}
+
+static uint32_t
+zxdh_np_se_smmu0_ind_read(uint32_t dev_id,
+ uint32_t base_addr,
+ uint32_t index,
+ uint32_t rd_mode,
+ uint32_t rd_clr_mode,
+ uint32_t *p_data)
+{
+ uint32_t rc = ZXDH_OK;
+ uint32_t i = 0;
+ uint32_t row_index = 0;
+ uint32_t col_index = 0;
+ uint32_t temp_data[4] = {0};
+ uint32_t *p_temp_data = NULL;
+ ZXDH_SMMU0_SMMU0_CPU_IND_CMD_T cpu_ind_cmd = {0};
+ ZXDH_MUTEX_T *p_ind_mutex = NULL;
+
+ rc = zxdh_np_dev_opr_mutex_get(dev_id, ZXDH_DEV_MUTEX_T_SMMU0, &p_ind_mutex);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dev_opr_mutex_get");
+
+ rc = zxdh_np_comm_mutex_lock(p_ind_mutex);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_comm_mutex_lock");
+
+ rc = zxdh_np_se_done_status_check(dev_id, ZXDH_SMMU0_SMMU0_WR_ARB_CPU_RDYR, 0);
+ ZXDH_COMM_CHECK_DEV_RC_UNLOCK(dev_id, rc, "zxdh_np_se_done_status_check", p_ind_mutex);
+
+ if (rd_clr_mode == ZXDH_RD_MODE_HOLD) {
+ cpu_ind_cmd.cpu_ind_rw = ZXDH_SE_OPR_RD;
+ cpu_ind_cmd.cpu_ind_rd_mode = ZXDH_RD_MODE_HOLD;
+ cpu_ind_cmd.cpu_req_mode = ZXDH_ERAM128_OPR_128b;
+
+ switch (rd_mode) {
+ case ZXDH_ERAM128_OPR_128b:
+ {
+ if ((0xFFFFFFFF - (base_addr)) < (index)) {
+ rc = zxdh_np_comm_mutex_unlock(p_ind_mutex);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_comm_mutex_unlock");
+ PMD_DRV_LOG(ERR, "%s : index 0x%x is invalid!", __func__, index);
+ return ZXDH_PAR_CHK_INVALID_INDEX;
+ }
+ if (base_addr + index > ZXDH_SE_SMMU0_ERAM_ADDR_NUM_TOTAL - 1) {
+ PMD_DRV_LOG(ERR, "%s : index out of range !", __func__);
+ rc = zxdh_np_comm_mutex_unlock(p_ind_mutex);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_comm_mutex_unlock");
+ return ZXDH_ERR;
+ }
+
+ row_index = (index << 7) & ZXDH_ERAM128_BADDR_MASK;
+ break;
+ }
+
+ case ZXDH_ERAM128_OPR_64b:
+ {
+ if ((base_addr + (index >> 1)) > ZXDH_SE_SMMU0_ERAM_ADDR_NUM_TOTAL - 1) {
+ PMD_DRV_LOG(ERR, "%s : index out of range !", __func__);
+ rc = zxdh_np_comm_mutex_unlock(p_ind_mutex);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_comm_mutex_unlock");
+ return ZXDH_ERR;
+ }
+
+ row_index = (index << 6) & ZXDH_ERAM128_BADDR_MASK;
+ col_index = index & 0x1;
+ break;
+ }
+
+ case ZXDH_ERAM128_OPR_32b:
+ {
+ if ((base_addr + (index >> 2)) > ZXDH_SE_SMMU0_ERAM_ADDR_NUM_TOTAL - 1) {
+ PMD_DRV_LOG(ERR, "%s : index out of range !", __func__);
+ rc = zxdh_np_comm_mutex_unlock(p_ind_mutex);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_comm_mutex_unlock");
+ return ZXDH_ERR;
+ }
+
+ row_index = (index << 5) & ZXDH_ERAM128_BADDR_MASK;
+ col_index = index & 0x3;
+ break;
+ }
+
+ case ZXDH_ERAM128_OPR_1b:
+ {
+ if ((base_addr + (index >> 7)) > ZXDH_SE_SMMU0_ERAM_ADDR_NUM_TOTAL - 1) {
+ PMD_DRV_LOG(ERR, "%s : index out of range !", __func__);
+ rc = zxdh_np_comm_mutex_unlock(p_ind_mutex);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_comm_mutex_unlock");
+ return ZXDH_ERR;
+ }
+
+ row_index = index & ZXDH_ERAM128_BADDR_MASK;
+ col_index = index & 0x7F;
+ break;
+ }
+ }
+
+ cpu_ind_cmd.cpu_ind_addr = ((base_addr << 7) & ZXDH_ERAM128_BADDR_MASK) + row_index;
+ } else {
+ cpu_ind_cmd.cpu_ind_rw = ZXDH_SE_OPR_RD;
+ cpu_ind_cmd.cpu_ind_rd_mode = ZXDH_RD_MODE_CLEAR;
+
+ switch (rd_mode) {
+ case ZXDH_ERAM128_OPR_128b:
+ {
+ if ((0xFFFFFFFF - (base_addr)) < (index)) {
+ PMD_DRV_LOG(ERR, "%s : index 0x%x is invalid!", __func__, index);
+ rc = zxdh_np_comm_mutex_unlock(p_ind_mutex);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_comm_mutex_unlock");
+ return ZXDH_PAR_CHK_INVALID_INDEX;
+ }
+
+ if (base_addr + index > ZXDH_SE_SMMU0_ERAM_ADDR_NUM_TOTAL - 1) {
+ PMD_DRV_LOG(ERR, "%s : index out of range !", __func__);
+ rc = zxdh_np_comm_mutex_unlock(p_ind_mutex);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_comm_mutex_unlock");
+ return ZXDH_ERR;
+ }
+
+ row_index = (index << 7);
+ cpu_ind_cmd.cpu_req_mode = ZXDH_ERAM128_OPR_128b;
+ break;
+ }
+
+ case ZXDH_ERAM128_OPR_64b:
+ {
+ if ((base_addr + (index >> 1)) > ZXDH_SE_SMMU0_ERAM_ADDR_NUM_TOTAL - 1) {
+ PMD_DRV_LOG(ERR, "%s : index out of range !", __func__);
+ rc = zxdh_np_comm_mutex_unlock(p_ind_mutex);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_comm_mutex_unlock");
+ return ZXDH_ERR;
+ }
+
+ row_index = (index << 6);
+ cpu_ind_cmd.cpu_req_mode = 2;
+ break;
+ }
+
+ case ZXDH_ERAM128_OPR_32b:
+ {
+ if ((base_addr + (index >> 2)) > ZXDH_SE_SMMU0_ERAM_ADDR_NUM_TOTAL - 1) {
+ PMD_DRV_LOG(ERR, "%s : index out of range !", __func__);
+ rc = zxdh_np_comm_mutex_unlock(p_ind_mutex);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_comm_mutex_unlock");
+ return ZXDH_ERR;
+ }
+
+ row_index = (index << 5);
+ cpu_ind_cmd.cpu_req_mode = 1;
+ break;
+ }
+
+ case ZXDH_ERAM128_OPR_1b:
+ {
+ PMD_DRV_LOG(ERR, "rd_clr_mode[%d] or rd_mode[%d] error! ",
+ rd_clr_mode, rd_mode);
+ rc = zxdh_np_comm_mutex_unlock(p_ind_mutex);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_comm_mutex_unlock");
+ RTE_ASSERT(0);
+ return ZXDH_ERR;
+ }
+ }
+
+ cpu_ind_cmd.cpu_ind_addr = ((base_addr << 7) & ZXDH_ERAM128_BADDR_MASK) + row_index;
+ }
+
+ rc = zxdh_np_reg_write(dev_id,
+ ZXDH_SMMU0_SMMU0_CPU_IND_CMDR,
+ 0,
+ 0,
+ &cpu_ind_cmd);
+ ZXDH_COMM_CHECK_DEV_RC_UNLOCK(dev_id, rc, "zxdh_np_reg_write", p_ind_mutex);
+
+ rc = zxdh_np_se_done_status_check(dev_id, ZXDH_SMMU0_SMMU0_CPU_IND_RD_DONER, 0);
+ ZXDH_COMM_CHECK_DEV_RC_UNLOCK(dev_id, rc,
+ "zxdh_np_se_done_status_check", p_ind_mutex);
+
+ p_temp_data = temp_data;
+ for (i = 0; i < 4; i++) {
+ rc = zxdh_np_reg_read(dev_id,
+ ZXDH_SMMU0_SMMU0_CPU_IND_RDAT0R + i,
+ 0,
+ 0,
+ p_temp_data + 3 - i);
+ ZXDH_COMM_CHECK_DEV_RC_UNLOCK(dev_id, rc, "zxdh_np_reg_read", p_ind_mutex);
+ }
+
+ if (rd_clr_mode == ZXDH_RD_MODE_HOLD) {
+ switch (rd_mode) {
+ case ZXDH_ERAM128_OPR_128b:
+ {
+ rte_memcpy(p_data, p_temp_data, (128 / 8));
+ break;
+ }
+
+ case ZXDH_ERAM128_OPR_64b:
+ {
+ rte_memcpy(p_data, p_temp_data + ((1 - col_index) << 1), (64 / 8));
+ break;
+ }
+
+ case ZXDH_ERAM128_OPR_32b:
+ {
+ rte_memcpy(p_data, p_temp_data + ((3 - col_index)), (32 / 8));
+ break;
+ }
+
+ case ZXDH_ERAM128_OPR_1b:
+ {
+ ZXDH_COMM_UINT32_GET_BITS(p_data[0],
+ *(p_temp_data + (3 - col_index / 32)), (col_index % 32), 1);
+ break;
+ }
+ }
+ } else {
+ switch (rd_mode) {
+ case ZXDH_ERAM128_OPR_128b:
+ {
+ rte_memcpy(p_data, p_temp_data, (128 / 8));
+ break;
+ }
+
+ case ZXDH_ERAM128_OPR_64b:
+ {
+ rte_memcpy(p_data, p_temp_data, (64 / 8));
+ break;
+ }
+
+ case ZXDH_ERAM128_OPR_32b:
+ {
+ rte_memcpy(p_data, p_temp_data, (64 / 8));
+ break;
+ }
+ }
+ }
+
+ rc = zxdh_np_comm_mutex_unlock(p_ind_mutex);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_comm_mutex_unlock");
+
+ return rc;
+}
+
+uint32_t
+zxdh_np_stat_ppu_cnt_get_ex(uint32_t dev_id,
+ ZXDH_STAT_CNT_MODE_E rd_mode,
+ uint32_t index,
+ uint32_t clr_mode,
+ uint32_t *p_data)
+{
+ uint32_t rc = ZXDH_OK;
+ uint32_t ppu_eram_baddr = 0;
+ uint32_t ppu_eram_depth = 0;
+ uint32_t eram_rd_mode = 0;
+ uint32_t eram_clr_mode = 0;
+ ZXDH_PPU_STAT_CFG_T stat_cfg = {0};
+
+ zxdh_np_stat_cfg_soft_get(dev_id, &stat_cfg);
+
+ ppu_eram_depth = stat_cfg.eram_depth;
+ ppu_eram_baddr = stat_cfg.eram_baddr;
+
+ if ((index >> (ZXDH_STAT_128_MODE - rd_mode)) < ppu_eram_depth) {
+ if (rd_mode == ZXDH_STAT_128_MODE)
+ eram_rd_mode = ZXDH_ERAM128_OPR_128b;
+ else
+ eram_rd_mode = ZXDH_ERAM128_OPR_64b;
+
+ if (clr_mode == ZXDH_STAT_RD_CLR_MODE_UNCLR)
+ eram_clr_mode = ZXDH_RD_MODE_HOLD;
+ else
+ eram_clr_mode = ZXDH_RD_MODE_CLEAR;
+
+ rc = zxdh_np_se_smmu0_ind_read(dev_id,
+ ppu_eram_baddr,
+ index,
+ eram_rd_mode,
+ eram_clr_mode,
+ p_data);
+ ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_se_smmu0_ind_read");
+ } else {
+ PMD_DRV_LOG(ERR, "DPDK DONT HAVE DDR STAT.");
+ }
+
+ return rc;
+}
diff --git a/drivers/net/zxdh/zxdh_np.h b/drivers/net/zxdh/zxdh_np.h
index 08a9b3c3a6..bcb4699c6f 100644
--- a/drivers/net/zxdh/zxdh_np.h
+++ b/drivers/net/zxdh/zxdh_np.h
@@ -1188,6 +1188,12 @@ typedef struct zxdh_dtb4k_dtb_enq_cfg_epid_v_func_num_0_127_t {
uint32_t cfg_vfunc_active;
} ZXDH_DTB4K_DTB_ENQ_CFG_EPID_V_FUNC_NUM_0_127_T;
+typedef struct zxdh_smmu0_smmu0_cpu_ind_cmd_t {
+ uint32_t cpu_ind_rw;
+ uint32_t cpu_ind_rd_mode;
+ uint32_t cpu_req_mode;
+ uint32_t cpu_ind_addr;
+} ZXDH_SMMU0_SMMU0_CPU_IND_CMD_T;
typedef uint32_t (*ZXDH_REG_WRITE)(uint32_t dev_id, uint32_t addr, uint32_t *p_data);
typedef uint32_t (*ZXDH_REG_READ)(uint32_t dev_id, uint32_t addr, uint32_t *p_data);
@@ -1498,6 +1504,17 @@ typedef enum zxdh_stat_cnt_mode_e {
ZXDH_STAT_MAX_MODE,
} ZXDH_STAT_CNT_MODE_E;
+typedef enum zxdh_stat_rd_clr_mode_e {
+ ZXDH_STAT_RD_CLR_MODE_UNCLR = 0,
+ ZXDH_STAT_RD_CLR_MODE_CLR = 1,
+ ZXDH_STAT_RD_CLR_MODE_MAX,
+} STAT_RD_CLR_MODE_E;
+
+typedef enum zxdh_eram128_rd_clr_mode_e {
+ ZXDH_RD_MODE_HOLD = 0,
+ ZXDH_RD_MODE_CLEAR = 1,
+} ZXDH_ERAM128_RD_CLR_MODE_E;
+
typedef enum zxdh_np_agent_msg_type_e {
ZXDH_REG_MSG = 0,
ZXDH_DTB_MSG,
@@ -1741,5 +1758,9 @@ 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 zxdh_np_stat_ppu_cnt_get_ex(uint32_t dev_id,
+ ZXDH_STAT_CNT_MODE_E rd_mode,
+ uint32_t index,
+ uint32_t clr_mode,
+ uint32_t *p_data);
#endif /* ZXDH_NP_H */
--
2.27.0
[-- Attachment #1.1.2: Type: text/html , Size: 37723 bytes --]
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [PATCH v1 14/14] net/zxdh: clean stat values
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
2 siblings, 0 replies; 32+ messages in thread
From: Stephen Hemminger @ 2025-02-10 17:50 UTC (permalink / raw)
To: Bingbin Chen; +Cc: dev
On Mon, 10 Feb 2025 09:50:17 +0800
Bingbin Chen <chen.bingbin@zte.com.cn> wrote:
> +
> + case ZXDH_ERAM128_OPR_64b:
> + {
> + if ((base_addr + (index >> 1)) > ZXDH_SE_SMMU0_ERAM_ADDR_NUM_TOTAL - 1) {
> + PMD_DRV_LOG(ERR, "%s : index out of range !", __func__);
> + rc = zxdh_np_comm_mutex_unlock(p_ind_mutex);
> + ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_comm_mutex_unlock");
> + return ZXDH_ERR;
> + }
> +
> + row_index = (index << 6) & ZXDH_ERAM128_BADDR_MASK;
> + col_index = index & 0x1;
> + break;
> + }
More repeats of __func__ with PMD_DRV_LOG and extra { }
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [PATCH v1 14/14] net/zxdh: clean stat values
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
2 siblings, 0 replies; 32+ messages in thread
From: Stephen Hemminger @ 2025-02-10 17:50 UTC (permalink / raw)
To: Bingbin Chen; +Cc: dev
On Mon, 10 Feb 2025 09:50:17 +0800
Bingbin Chen <chen.bingbin@zte.com.cn> wrote:
> + p_temp_data = temp_data;
> + for (i = 0; i < 4; i++) {
> + rc = zxdh_np_reg_read(dev_id,
> + ZXDH_SMMU0_SMMU0_CPU_IND_RDAT0R + i,
> + 0,
> + 0,
> + p_temp_data + 3 - i);
> + ZXDH_COMM_CHECK_DEV_RC_UNLOCK(dev_id, rc, "zxdh_np_reg_read", p_ind_mutex);
> + }
Looks like lots of extra indentation here
(could be mailer just getting confused).
^ permalink raw reply [flat|nested] 32+ messages in thread
* Re: [PATCH v1 14/14] net/zxdh: clean stat values
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
2 siblings, 0 replies; 32+ messages in thread
From: Stephen Hemminger @ 2025-02-10 18:19 UTC (permalink / raw)
To: Bingbin Chen; +Cc: dev
On Mon, 10 Feb 2025 09:50:17 +0800
Bingbin Chen <chen.bingbin@zte.com.cn> wrote:
> +static uint32_t
> +zxdh_np_se_smmu0_ind_read(uint32_t dev_id,
> + uint32_t base_addr,
> + uint32_t index,
> + uint32_t rd_mode,
> + uint32_t rd_clr_mode,
> + uint32_t *p_data)
> +{
> + uint32_t rc = ZXDH_OK;
> + uint32_t i = 0;
> + uint32_t row_index = 0;
> + uint32_t col_index = 0;
> + uint32_t temp_data[4] = {0};
> + uint32_t *p_temp_data = NULL;
> + ZXDH_SMMU0_SMMU0_CPU_IND_CMD_T cpu_ind_cmd = {0};
> + ZXDH_MUTEX_T *p_ind_mutex = NULL;
> +
> + rc = zxdh_np_dev_opr_mutex_get(dev_id, ZXDH_DEV_MUTEX_T_SMMU0, &p_ind_mutex);
> + ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dev_opr_mutex_get");
> +
> + rc = zxdh_np_comm_mutex_lock(p_ind_mutex);
> + ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_comm_mutex_lock");
> +
> + rc = zxdh_np_se_done_status_check(dev_id, ZXDH_SMMU0_SMMU0_WR_ARB_CPU_RDYR, 0);
> + ZXDH_COMM_CHECK_DEV_RC_UNLOCK(dev_id, rc, "zxdh_np_se_done_status_check", p_ind_mutex);
> +
> + if (rd_clr_mode == ZXDH_RD_MODE_HOLD) {
> + cpu_ind_cmd.cpu_ind_rw = ZXDH_SE_OPR_RD;
> + cpu_ind_cmd.cpu_ind_rd_mode = ZXDH_RD_MODE_HOLD;
> + cpu_ind_cmd.cpu_req_mode = ZXDH_ERAM128_OPR_128b;
> +
> + switch (rd_mode) {
> + case ZXDH_ERAM128_OPR_128b:
> + {
> + if ((0xFFFFFFFF - (base_addr)) < (index)) {
> + rc = zxdh_np_comm_mutex_unlock(p_ind_mutex);
> + ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_comm_mutex_unlock");
> + PMD_DRV_LOG(ERR, "%s : index 0x%x is invalid!", __func__, index);
> + return ZXDH_PAR_CHK_INVALID_INDEX;
> + }
> + if (base_addr + index > ZXDH_SE_SMMU0_ERAM_ADDR_NUM_TOTAL - 1) {
> + PMD_DRV_LOG(ERR, "%s : index out of range !", __func__);
> + rc = zxdh_np_comm_mutex_unlock(p_ind_mutex);
> + ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_comm_mutex_unlock");
> + return ZXDH_ERR;
> + }
The error paths here are a bit of a mess.
Do you really have to check return value of mutex_unlock if already have an error?
^ permalink raw reply [flat|nested] 32+ messages in thread