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