Implement the hash functions and tables configuration.<br /> <br />Signed-off-by: Bingbin Chen <chen.bingbin@zte.com.cn> <br />---<br /> drivers/net/zxdh/zxdh_np.c | 783 +++++++++++++++++++++++++++++++++++++<br /> drivers/net/zxdh/zxdh_np.h | 260 ++++++++++++<br /> 2 files changed, 1043 insertions(+)<br /> <br />diff --git a/drivers/net/zxdh/zxdh_np.c b/drivers/net/zxdh/zxdh_np.c<br />index e11004183d..5455dff296 100644<br />--- a/drivers/net/zxdh/zxdh_np.c<br />+++ b/drivers/net/zxdh/zxdh_np.c<br />@@ -31,6 +31,23 @@ static const char * const g_dpp_dtb_name[] = {<br />     "DOWN TAB",<br />     "UP TAB",<br /> };<br />+static ZXDH_SE_CFG *g_apt_se_cfg[ZXDH_DEV_CHANNEL_MAX];<br />+static ZXDH_SE_CFG *dpp_se_cfg[ZXDH_DEV_CHANNEL_MAX];<br />+static const uint16_t g_lpm_crc[ZXDH_SE_ZBLK_NUM] = {<br />+    0x1021, 0x8005, 0x3D65, 0xab47, 0x3453, 0x0357, 0x0589, 0xa02b,<br />+    0x1021, 0x8005, 0x3D65, 0xab47, 0x3453, 0x0357, 0x0589, 0xa02b,<br />+    0x1021, 0x8005, 0x3D65, 0xab47, 0x3453, 0x0357, 0x0589, 0xa02b,<br />+    0x1021, 0x8005, 0x3D65, 0xab47, 0x3453, 0x0357, 0x0589, 0xa02b<br />+};<br />+static uint32_t g_hash_zblk_idx[ZXDH_DEV_CHANNEL_MAX]<br />+                [ZXDH_HASH_FUNC_ID_NUM]<br />+                [ZXDH_HASH_TBL_ID_NUM] = {0};<br />+static const uint32_t g_ddr_hash_arg[ZXDH_HASH_DDR_CRC_NUM] = {<br />+    0x04C11DB7,<br />+    0xF4ACFB13,<br />+    0x20044009,<br />+    0x00210801<br />+};<br />  <br /> static ZXDH_FIELD_T g_smmu0_smmu0_cpu_ind_cmd_reg[] = {<br />     {"cpu_ind_rw", ZXDH_FIELD_FLAG_RW, 31, 1, 0x0, 0x0},<br />@@ -451,6 +468,20 @@ zxdh_np_get_tn_color(ZXDH_RB_TN *p_tn)<br />     return ((p_tn == NULL) ? ZXDH_RBT_BLACK : (p_tn)->color_lsv & 0x3);<br /> }<br />  <br />+#define ZXDH_SE_GET_ZBLK_CFG(p_se, zblk_idx) \<br />+    (&(((ZXDH_SE_CFG *)(p_se))->zblk_info[zblk_idx]))<br />+<br />+#define GET_ZBLK_IDX(zcell_idx) \<br />+    (((zcell_idx) & 0x7F) >> 2)<br />+<br />+#define GET_ZCELL_IDX(zcell_idx) \<br />+    ((zcell_idx) & 0x3)<br />+<br />+#define ZXDH_GET_FUN_INFO(p_se, fun_id) \<br />+    (&(((ZXDH_SE_CFG *)(p_se))->fun_info[fun_id]))<br />+<br />+#define GET_DDR_HASH_ARG(ddr_crc_sel) (g_ddr_hash_arg[ddr_crc_sel])<br />+<br /> static ZXDH_FIELD_T g_stat_car0_cara_queue_ram0_159_0_reg[] = {<br />     {"cara_drop", ZXDH_FIELD_FLAG_RW, 147, 1, 0x0, 0x0},<br />     {"cara_plcr_en", ZXDH_FIELD_FLAG_RW, 146, 1, 0x0, 0x0},<br />@@ -751,6 +782,33 @@ zxdh_comm_double_link_insert_pre(ZXDH_D_NODE *p_newnode,<br />     return ZXDH_OK;<br /> }<br />  <br />+static uint32_t<br />+zxdh_comm_double_link_insert_last(ZXDH_D_NODE *p_newnode, ZXDH_D_HEAD *p_head)<br />+{<br />+    ZXDH_D_NODE *p_dnode = NULL;<br />+<br />+    RTE_ASSERT(!(!p_head->p_next && p_head->p_prev));<br />+    RTE_ASSERT(!(p_head->p_next && !p_head->p_prev));<br />+<br />+    p_dnode = p_head->p_prev;<br />+<br />+    if (!p_dnode) {<br />+        p_head->p_next  = p_newnode;<br />+        p_head->p_prev  = p_newnode;<br />+        p_newnode->next = NULL;<br />+        p_newnode->prev = NULL;<br />+    } else {<br />+        p_newnode->prev = p_dnode;<br />+        p_newnode->next = NULL;<br />+        p_head->p_prev  = p_newnode;<br />+        p_dnode->next   = p_newnode;<br />+    }<br />+<br />+    p_head->used++;<br />+<br />+    return ZXDH_OK;<br />+}<br />+<br /> static uint32_t<br /> zxdh_comm_double_link_del(ZXDH_D_NODE *delnode, ZXDH_D_HEAD *p_head)<br /> {<br />@@ -776,6 +834,46 @@ zxdh_comm_double_link_del(ZXDH_D_NODE *delnode, ZXDH_D_HEAD *p_head)<br />     return ZXDH_OK;<br /> }<br />  <br />+static int32_t<br />+zxdh_comm_double_link_default_cmp_fuc(ZXDH_D_NODE *p_data1,<br />+    ZXDH_D_NODE *p_data2, __rte_unused void *p_data)<br />+{<br />+    uint32_t data1 = *(uint32_t *)p_data1->data;<br />+    uint32_t data2 = *(uint32_t *)p_data2->data;<br />+<br />+    if (data1 > data2)<br />+        return 1;<br />+    else if (data1 == data2)<br />+        return 0;<br />+    else<br />+        return -1;<br />+}<br />+<br />+static uint32_t<br />+zxdh_comm_double_link_insert_sort(ZXDH_D_NODE *p_newnode,<br />+            ZXDH_D_HEAD *p_head, ZXDH_CMP_FUNC cmp_fuc, void *cmp_data)<br />+{<br />+    ZXDH_D_NODE *pre_node = NULL;<br />+<br />+    if (cmp_fuc == NULL)<br />+        cmp_fuc = zxdh_comm_double_link_default_cmp_fuc;<br />+<br />+    if (p_head->used == 0)<br />+        return zxdh_comm_double_link_insert_1st(p_newnode, p_head);<br />+<br />+    pre_node = p_head->p_next;<br />+<br />+    while (pre_node != NULL) {<br />+        if (cmp_fuc(p_newnode, pre_node, cmp_data) <= 0)<br />+            return zxdh_comm_double_link_insert_pre(p_newnode,<br />+                pre_node, p_head);<br />+        else<br />+            pre_node = pre_node->next;<br />+    }<br />+<br />+    return zxdh_comm_double_link_insert_last(p_newnode, p_head);<br />+}<br />+<br /> static int32_t<br /> zxdh_comm_rb_def_cmp(void *p_new, void *p_old, uint32_t key_size)<br /> {<br />@@ -5544,6 +5642,688 @@ zxdh_np_agent_se_res_get(uint32_t dev_id, uint32_t type)<br />     p_se_res->valid = 1;<br />     return rc;<br /> }<br />+<br />+static uint32_t<br />+zxdh_np_se_init_ex(uint32_t dev_id, ZXDH_SE_CFG *p_se_cfg)<br />+{<br />+    uint32_t i = 0;<br />+    uint32_t j = 0;<br />+<br />+    ZXDH_SE_ZBLK_CFG *p_zblk_cfg = NULL;<br />+    ZXDH_SE_ZCELL_CFG *p_zcell_cfg = NULL;<br />+<br />+    if (dpp_se_cfg[dev_id] != NULL) {<br />+        PMD_DRV_LOG(DEBUG, "SE global config is already initialized.");<br />+        return ZXDH_OK;<br />+    }<br />+<br />+    memset(p_se_cfg, 0, sizeof(ZXDH_SE_CFG));<br />+<br />+    p_se_cfg->dev_id = dev_id;<br />+    dpp_se_cfg[p_se_cfg->dev_id] = p_se_cfg;<br />+<br />+    p_se_cfg->p_as_rslt_wrt_fun = NULL;<br />+    p_se_cfg->p_client = ZXDH_COMM_VAL_TO_PTR(dev_id);<br />+<br />+    for (i = 0; i < ZXDH_SE_ZBLK_NUM; i++) {<br />+        p_zblk_cfg = ZXDH_SE_GET_ZBLK_CFG(p_se_cfg, i);<br />+<br />+        p_zblk_cfg->zblk_idx = i;<br />+        p_zblk_cfg->is_used  = 0;<br />+        p_zblk_cfg->hash_arg = g_lpm_crc[i];<br />+        p_zblk_cfg->zcell_bm = 0;<br />+        zxdh_np_init_d_node(&p_zblk_cfg->zblk_dn, p_zblk_cfg);<br />+<br />+        for (j = 0; j < ZXDH_SE_ZCELL_NUM; j++) {<br />+            p_zcell_cfg = &p_zblk_cfg->zcell_info[j];<br />+<br />+            p_zcell_cfg->zcell_idx = (i << 2) + j;<br />+            p_zcell_cfg->item_used = 0;<br />+            p_zcell_cfg->mask_len  = 0;<br />+<br />+            zxdh_np_init_d_node(&p_zcell_cfg->zcell_dn, p_zcell_cfg);<br />+<br />+            p_zcell_cfg->zcell_avl.p_key = p_zcell_cfg;<br />+        }<br />+    }<br />+<br />+    return ZXDH_OK;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_apt_hash_global_res_init(uint32_t dev_id)<br />+{<br />+    if (g_apt_se_cfg[dev_id] == NULL) {<br />+        g_apt_se_cfg[dev_id] = (ZXDH_SE_CFG *)rte_zmalloc(NULL, sizeof(ZXDH_SE_CFG), 0);<br />+        if (g_apt_se_cfg[dev_id] == NULL) {<br />+            PMD_DRV_LOG(ERR, "malloc memory failed");<br />+            return ZXDH_PAR_CHK_POINT_NULL;<br />+        }<br />+<br />+        zxdh_np_se_init_ex(dev_id, g_apt_se_cfg[dev_id]);<br />+<br />+        g_apt_se_cfg[dev_id]->p_client = ZXDH_COMM_VAL_TO_PTR(dev_id);<br />+    }<br />+<br />+    return ZXDH_OK;<br />+}<br />+<br />+static void<br />+se_apt_get_zblock_index(uint32_t zblock_bitmap, uint32_t *zblk_idx)<br />+{<br />+    uint32_t index0 = 0;<br />+    uint32_t index1 = 0;<br />+<br />+    for (index0 = 0; index0 < 32; index0++) {<br />+        if ((zblock_bitmap >> index0) & 0x1) {<br />+            *(zblk_idx + index1) = index0;<br />+            index1++;<br />+        }<br />+    }<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_crc32_calc(uint8_t *p_input_key, uint32_t dw_byte_num, uint32_t dw_crc_poly)<br />+{<br />+    uint32_t dw_result = 0;<br />+    uint32_t dw_data_type = 0;<br />+<br />+    uint32_t i = 0;<br />+    uint32_t j = 0;<br />+<br />+    while (i < dw_byte_num) {<br />+        dw_data_type = (uint32_t)((dw_result & 0xff000000) ^ (p_input_key[i] << 24));<br />+        for (j = 0; j < 8; j++) {<br />+            if (dw_data_type & 0x80000000) {<br />+                dw_data_type <<= 1;<br />+                dw_data_type ^= dw_crc_poly;<br />+            } else {<br />+                dw_data_type <<= 1;<br />+            }<br />+        }<br />+        dw_result <<= 8;<br />+        dw_result ^= dw_data_type;<br />+<br />+        i++;<br />+    }<br />+<br />+    return dw_result;<br />+}<br />+<br />+static uint16_t<br />+zxdh_np_crc16_calc(uint8_t *p_input_key, uint32_t dw_byte_num, uint16_t dw_crc_poly)<br />+{<br />+    uint16_t dw_result = 0;<br />+    uint16_t dw_data_type = 0;<br />+<br />+    uint32_t i = 0;<br />+    uint32_t j = 0;<br />+<br />+    while (i < dw_byte_num) {<br />+        dw_data_type = (uint16_t)(((dw_result & 0xff00) ^ (p_input_key[i] << 8)) & 0xFFFF);<br />+        for (j = 0; j < 8; j++) {<br />+            if (dw_data_type & 0x8000) {<br />+                dw_data_type <<= 1;<br />+                dw_data_type ^= dw_crc_poly;<br />+            } else {<br />+                dw_data_type <<= 1;<br />+            }<br />+        }<br />+        dw_result <<= 8;<br />+        dw_result ^= dw_data_type;<br />+<br />+        i++;<br />+    }<br />+<br />+    return dw_result;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_se_fun_init(ZXDH_SE_CFG *p_se_cfg,<br />+                           uint8_t       id,<br />+                           uint32_t     fun_type)<br />+{<br />+    ZXDH_FUNC_ID_INFO  *p_fun_info = NULL;<br />+<br />+    p_fun_info = ZXDH_GET_FUN_INFO(p_se_cfg, id);<br />+<br />+    if (p_fun_info->is_used) {<br />+        PMD_DRV_LOG(ERR, "Error[0x%x], fun_id [%d] is already used!",<br />+            ZXDH_SE_RC_FUN_INVALID, id);<br />+        return ZXDH_SE_RC_FUN_INVALID;<br />+    }<br />+<br />+    p_fun_info->fun_id = id;<br />+    p_fun_info->is_used = 1;<br />+<br />+    switch (fun_type) {<br />+    case (ZXDH_FUN_HASH):<br />+        p_fun_info->fun_type = ZXDH_FUN_HASH;<br />+        p_fun_info->fun_ptr = rte_zmalloc(NULL, sizeof(ZXDH_HASH_CFG), 0);<br />+        if (p_fun_info->fun_ptr == NULL) {<br />+            PMD_DRV_LOG(ERR, "malloc memory failed");<br />+            return ZXDH_PAR_CHK_POINT_NULL;<br />+        }<br />+        ((ZXDH_HASH_CFG *)(p_fun_info->fun_ptr))->p_se_info = p_se_cfg;<br />+        break;<br />+    default:<br />+        PMD_DRV_LOG(ERR, "Error, unrecgnized fun_type[ %d]", fun_type);<br />+        RTE_ASSERT(0);<br />+        return ZXDH_SE_RC_BASE;<br />+    }<br />+<br />+    return ZXDH_OK;<br />+}<br />+<br />+static int32_t<br />+zxdh_np_hash_list_cmp(ZXDH_D_NODE *data1, ZXDH_D_NODE *data2, void *data)<br />+{<br />+    uint32_t flag = 0;<br />+    uint32_t data_new = 0;<br />+    uint32_t data_pre = 0;<br />+<br />+    flag = *(uint32_t *)data;<br />+<br />+    if (flag == ZXDH_HASH_CMP_ZCELL) {<br />+        data_new = ((ZXDH_SE_ZCELL_CFG *)data1->data)->zcell_idx;<br />+        data_pre = ((ZXDH_SE_ZCELL_CFG *)data2->data)->zcell_idx;<br />+    } else if (flag == ZXDH_HASH_CMP_ZBLK) {<br />+        data_new = ((ZXDH_SE_ZBLK_CFG *)data1->data)->zblk_idx;<br />+        data_pre = ((ZXDH_SE_ZBLK_CFG *)data2->data)->zblk_idx;<br />+    }<br />+<br />+    if (data_new > data_pre)<br />+        return 1;<br />+    else if (data_new == data_pre)<br />+        return 0;<br />+    else<br />+        return -1;<br />+}<br />+<br />+static int32_t<br />+zxdh_np_hash_rb_key_cmp(void *p_new, void *p_old, __rte_unused uint32_t key_size)<br />+{<br />+    ZXDH_HASH_RBKEY_INFO *p_rbkey_new = NULL;<br />+    ZXDH_HASH_RBKEY_INFO *p_rbkey_old = NULL;<br />+<br />+    p_rbkey_new = (ZXDH_HASH_RBKEY_INFO *)(p_new);<br />+    p_rbkey_old = (ZXDH_HASH_RBKEY_INFO *)(p_old);<br />+<br />+    return memcmp(p_rbkey_new->key, p_rbkey_old->key, ZXDH_HASH_KEY_MAX);<br />+}<br />+<br />+static int32_t<br />+zxdh_np_hash_ddr_cfg_rb_key_cmp(void *p_new, void *p_old, __rte_unused uint32_t key_size)<br />+{<br />+    HASH_DDR_CFG *p_rbkey_new = NULL;<br />+    HASH_DDR_CFG *p_rbkey_old = NULL;<br />+<br />+    p_rbkey_new = (HASH_DDR_CFG *)(p_new);<br />+    p_rbkey_old = (HASH_DDR_CFG *)(p_old);<br />+<br />+    return memcmp(&p_rbkey_new->ddr_baddr, &p_rbkey_old->ddr_baddr, sizeof(uint32_t));<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_hash_zcam_resource_init(ZXDH_HASH_CFG *p_hash_cfg,<br />+        uint32_t zblk_num, uint32_t *zblk_idx_array)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+<br />+    uint32_t i = 0;<br />+    uint32_t j = 0;<br />+    uint32_t cmp_type = 0;<br />+    uint32_t zblk_idx = 0;<br />+    uint32_t zcell_idx = 0;<br />+    uint32_t dev_id = 0;<br />+<br />+    ZXDH_D_HEAD *p_zblk_list = NULL;<br />+    ZXDH_D_HEAD *p_zcell_free = NULL;<br />+    ZXDH_SE_ZBLK_CFG *p_zblk_cfg = NULL;<br />+    ZXDH_SE_ZCELL_CFG *p_zcell_cfg = NULL;<br />+<br />+    dev_id = p_hash_cfg->p_se_info->dev_id;<br />+<br />+    p_zblk_list = &p_hash_cfg->hash_shareram.zblk_list;<br />+    rc = zxdh_comm_double_link_init(ZXDH_SE_ZBLK_NUM, p_zblk_list);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_comm_double_link_init");<br />+<br />+    p_zcell_free = &p_hash_cfg->hash_shareram.zcell_free_list;<br />+    rc = zxdh_comm_double_link_init(ZXDH_SE_ZBLK_NUM * ZXDH_SE_ZCELL_NUM, p_zcell_free);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_comm_double_link_init");<br />+<br />+    for (i = 0; i < zblk_num; i++) {<br />+        zblk_idx = zblk_idx_array[i];<br />+<br />+        p_zblk_cfg = ZXDH_SE_GET_ZBLK_CFG(p_hash_cfg->p_se_info, zblk_idx);<br />+<br />+        if (p_zblk_cfg->is_used) {<br />+            PMD_DRV_LOG(ERR, "ErrorCode:[0x%x]," <br />+                "ZBlock[%d] is already used by other function!",<br />+                ZXDH_HASH_RC_INVALID_ZBLCK, zblk_idx);<br />+            RTE_ASSERT(0);<br />+            return ZXDH_HASH_RC_INVALID_ZBLCK;<br />+        }<br />+<br />+        for (j = 0; j < ZXDH_SE_ZCELL_NUM; j++) {<br />+            zcell_idx = p_zblk_cfg->zcell_info[j].zcell_idx;<br />+            p_zcell_cfg = &(((ZXDH_SE_CFG *)(p_hash_cfg->p_se_info))-> <br />+            zblk_info[GET_ZBLK_IDX(zcell_idx)].zcell_info[GET_ZCELL_IDX(zcell_idx)]);<br />+<br />+            if (p_zcell_cfg->is_used) {<br />+                PMD_DRV_LOG(ERR, "ErrorCode:[0x%x], ZBlk[%d]," <br />+                    "ZCell[%d] is already used by other function!",<br />+                    ZXDH_HASH_RC_INVALID_ZCELL, zblk_idx, zcell_idx);<br />+                RTE_ASSERT(0);<br />+                return ZXDH_HASH_RC_INVALID_ZCELL;<br />+            }<br />+<br />+            p_zcell_cfg->is_used = 1;<br />+<br />+            cmp_type = ZXDH_HASH_CMP_ZCELL;<br />+            rc = zxdh_comm_double_link_insert_sort(&p_zcell_cfg->zcell_dn,<br />+                p_zcell_free, zxdh_np_hash_list_cmp, &cmp_type);<br />+            ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_comm_double_link_insert_sort");<br />+        }<br />+<br />+        p_zblk_cfg->is_used = 1;<br />+        cmp_type = ZXDH_HASH_CMP_ZBLK;<br />+        rc = zxdh_comm_double_link_insert_sort(&p_zblk_cfg->zblk_dn,<br />+            p_zblk_list, zxdh_np_hash_list_cmp, &cmp_type);<br />+        ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_comm_double_link_insert_last");<br />+    }<br />+<br />+    return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_hash_init(ZXDH_SE_CFG *p_se_cfg,<br />+                uint32_t fun_id,<br />+                uint32_t zblk_num,<br />+                uint32_t *zblk_idx,<br />+                uint32_t ddr_dis)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+    uint32_t i = 0;<br />+    uint32_t dev_id = p_se_cfg->dev_id;<br />+    ZXDH_FUNC_ID_INFO *p_func_info = NULL;<br />+    ZXDH_HASH_CFG *p_hash_cfg = NULL;<br />+<br />+    rc = zxdh_np_se_fun_init(p_se_cfg, (fun_id & 0xff), ZXDH_FUN_HASH);<br />+    if (rc == ZXDH_SE_RC_FUN_INVALID)<br />+        return ZXDH_OK;<br />+<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_se_fun_init");<br />+<br />+    p_func_info = ZXDH_GET_FUN_INFO(p_se_cfg, fun_id);<br />+    p_hash_cfg = (ZXDH_HASH_CFG *)p_func_info->fun_ptr;<br />+    p_hash_cfg->fun_id = fun_id;<br />+    p_hash_cfg->p_hash32_fun = zxdh_np_crc32_calc;<br />+    p_hash_cfg->p_hash16_fun = zxdh_np_crc16_calc;<br />+    p_hash_cfg->p_se_info = p_se_cfg;<br />+<br />+    if (ddr_dis == 1)<br />+        p_hash_cfg->ddr_valid = 0;<br />+    else<br />+        p_hash_cfg->ddr_valid = 1;<br />+<br />+    p_hash_cfg->hash_stat.zblock_num = zblk_num;<br />+    rc = zxdh_np_hash_zcam_resource_init(p_hash_cfg, zblk_num, zblk_idx);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_hash_zcam_resource_init");<br />+<br />+    for (i = 0; i < zblk_num; i++)<br />+        p_hash_cfg->hash_stat.zblock_array[i] = zblk_idx[i];<br />+<br />+    rc = (uint32_t)zxdh_comm_rb_init(&p_hash_cfg->hash_rb,<br />+                                 0,<br />+                                 sizeof(ZXDH_HASH_RBKEY_INFO),<br />+                                 zxdh_np_hash_rb_key_cmp);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_comm_rb_init");<br />+<br />+    rc = (uint32_t)zxdh_comm_rb_init(&p_hash_cfg->ddr_cfg_rb,<br />+                                 0,<br />+                                 sizeof(HASH_DDR_CFG),<br />+                                 zxdh_np_hash_ddr_cfg_rb_key_cmp);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_comm_rb_init");<br />+<br />+    for (i = 0; i < zblk_num; i++)<br />+        g_hash_zblk_idx[dev_id][fun_id][i] = zblk_idx[i];<br />+<br />+    return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_apt_hash_func_res_init(uint32_t dev_id, uint32_t func_num,<br />+        ZXDH_APT_HASH_FUNC_RES_T *p_hash_func_res)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+    uint32_t index = 0;<br />+    uint32_t zblk_idx[32] = {0};<br />+    ZXDH_APT_HASH_FUNC_RES_T *p_hash_func_res_temp = NULL;<br />+    ZXDH_SE_CFG *p_se_cfg = NULL;<br />+<br />+    p_se_cfg = g_apt_se_cfg[dev_id];<br />+<br />+    for (index = 0; index < func_num; index++) {<br />+        memset(zblk_idx, 0, sizeof(zblk_idx));<br />+        p_hash_func_res_temp = p_hash_func_res + index;<br />+        ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_hash_func_res_temp);<br />+<br />+        se_apt_get_zblock_index(p_hash_func_res_temp->zblk_bitmap, zblk_idx);<br />+<br />+        rc = zxdh_np_hash_init(p_se_cfg,<br />+                            p_hash_func_res_temp->func_id,<br />+                            p_hash_func_res_temp->zblk_num,<br />+                            zblk_idx,<br />+                            p_hash_func_res_temp->ddr_dis);<br />+        ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_hash_init");<br />+    }<br />+<br />+    return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_hash_bulk_init(ZXDH_SE_CFG *p_se_cfg,<br />+                        uint32_t fun_id,<br />+                        uint32_t bulk_id,<br />+                        ZXDH_HASH_DDR_RESC_CFG_T *p_ddr_resc_cfg,<br />+                        uint32_t zcell_num,<br />+                        uint32_t zreg_num)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+<br />+    uint32_t i = 0;<br />+    uint32_t j = 0;<br />+    uint32_t zblk_idx = 0;<br />+    uint32_t dev_id = p_se_cfg->dev_id;<br />+    uint32_t ddr_item_num = 0;<br />+<br />+    ZXDH_D_NODE *p_zblk_dn = NULL;<br />+    ZXDH_D_NODE *p_zcell_dn = NULL;<br />+    ZXDH_RB_TN *p_rb_tn_new = NULL;<br />+    ZXDH_RB_TN *p_rb_tn_rtn = NULL;<br />+    ZXDH_SE_ZBLK_CFG *p_zblk_cfg = NULL;<br />+    ZXDH_SE_ZREG_CFG *p_zreg_cfg = NULL;<br />+    HASH_DDR_CFG *p_ddr_cfg = NULL;<br />+    HASH_DDR_CFG *p_rbkey_new = NULL;<br />+    HASH_DDR_CFG *p_rbkey_rtn = NULL;<br />+    ZXDH_SE_ZCELL_CFG *p_zcell_cfg = NULL;<br />+    ZXDH_HASH_CFG *p_hash_cfg = NULL;<br />+    ZXDH_FUNC_ID_INFO *p_func_info = NULL;<br />+    ZXDH_SE_ITEM_CFG **p_item_array = NULL;<br />+    ZXDH_HASH_BULK_ZCAM_STAT *p_bulk_zcam_mono = NULL;<br />+<br />+    p_func_info = ZXDH_GET_FUN_INFO(p_se_cfg, fun_id);<br />+    p_hash_cfg = (ZXDH_HASH_CFG *)p_func_info->fun_ptr;<br />+    if (p_hash_cfg == NULL) {<br />+        PMD_DRV_LOG(ERR, "p_hash_cfg point null!");<br />+        return ZXDH_PAR_CHK_POINT_NULL;<br />+    }<br />+<br />+    if (p_hash_cfg->hash_stat.p_bulk_zcam_mono[bulk_id] != NULL) {<br />+        PMD_DRV_LOG(ERR, "fun_id[%u] bulk_id[%u] is already init," <br />+            "do not init again!", fun_id, bulk_id);<br />+        return ZXDH_OK;<br />+    }<br />+<br />+    PMD_DRV_LOG(DEBUG, "p_hash_cfg->ddr_valid = %d!", p_hash_cfg->ddr_valid);<br />+    if (p_hash_cfg->ddr_valid == 1) {<br />+        ddr_item_num = p_ddr_resc_cfg->ddr_item_num;<br />+        if (ZXDH_DDR_WIDTH_512b == p_ddr_resc_cfg->ddr_width_mode)<br />+            ddr_item_num = p_ddr_resc_cfg->ddr_item_num >> 1;<br />+<br />+        p_rbkey_new = (HASH_DDR_CFG *)rte_zmalloc(NULL, sizeof(HASH_DDR_CFG), 0);<br />+        if (p_rbkey_new == NULL) {<br />+            PMD_DRV_LOG(ERR, "malloc memory failed");<br />+            return ZXDH_PAR_CHK_POINT_NULL;<br />+        }<br />+<br />+        p_rbkey_new->ddr_baddr = p_ddr_resc_cfg->ddr_baddr;<br />+<br />+        p_rb_tn_new = (ZXDH_RB_TN *)rte_zmalloc(NULL, sizeof(ZXDH_RB_TN), 0);<br />+        if (p_rb_tn_new == NULL) {<br />+            rte_free(p_rbkey_new);<br />+            PMD_DRV_LOG(ERR, "malloc memory failed");<br />+            return ZXDH_PAR_CHK_POINT_NULL;<br />+        }<br />+        zxdh_np_init_rbt_tn(p_rb_tn_new, p_rbkey_new);<br />+<br />+        rc = zxdh_comm_rb_insert(&p_hash_cfg->ddr_cfg_rb,<br />+            (void *)p_rb_tn_new, (void *)(&p_rb_tn_rtn));<br />+        if (rc == ZXDH_RBT_RC_FULL) {<br />+            PMD_DRV_LOG(ERR, "The red black tree is full!");<br />+            rte_free(p_rbkey_new);<br />+            rte_free(p_rb_tn_new);<br />+            RTE_ASSERT(0);<br />+            return ZXDH_HASH_RC_RB_TREE_FULL;<br />+        } else if (rc == ZXDH_RBT_RC_UPDATE) {<br />+            PMD_DRV_LOG(DEBUG, "some bulk_id share one bulk!");<br />+<br />+            ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_rb_tn_rtn);<br />+            p_rbkey_rtn = (HASH_DDR_CFG *)(p_rb_tn_rtn->p_key);<br />+<br />+            p_ddr_cfg = p_hash_cfg->p_bulk_ddr_info[p_rbkey_rtn->bulk_id];<br />+<br />+            if (p_ddr_cfg->hash_ddr_arg !=<br />+            GET_DDR_HASH_ARG(p_ddr_resc_cfg->ddr_crc_sel) ||<br />+                p_ddr_cfg->width_mode   != p_ddr_resc_cfg->ddr_width_mode ||<br />+                p_ddr_cfg->ddr_ecc_en   != p_ddr_resc_cfg->ddr_ecc_en     ||<br />+                p_ddr_cfg->item_num     != ddr_item_num) {<br />+                PMD_DRV_LOG(ERR, "The base address is same but other ddr attribute is different");<br />+                rte_free(p_rbkey_new);<br />+                rte_free(p_rb_tn_new);<br />+                RTE_ASSERT(0);<br />+                return ZXDH_HASH_RC_INVALID_PARA;<br />+            }<br />+<br />+            p_hash_cfg->p_bulk_ddr_info[bulk_id] =<br />+                p_hash_cfg->p_bulk_ddr_info[p_rbkey_rtn->bulk_id];<br />+<br />+            rte_free(p_rbkey_new);<br />+            rte_free(p_rb_tn_new);<br />+        } else {<br />+            p_item_array = (ZXDH_SE_ITEM_CFG **)rte_zmalloc(NULL, ddr_item_num *<br />+                sizeof(ZXDH_SE_ITEM_CFG *), 0);<br />+            if (NULL == (p_item_array)) {<br />+                rte_free(p_rbkey_new);<br />+                rte_free(p_rb_tn_new);<br />+                PMD_DRV_LOG(ERR, "malloc memory failed");<br />+                return ZXDH_PAR_CHK_POINT_NULL;<br />+            }<br />+<br />+            p_rbkey_new->p_item_array = p_item_array;<br />+            p_rbkey_new->bulk_id = bulk_id;<br />+            p_rbkey_new->hw_baddr = 0;<br />+            p_rbkey_new->width_mode = p_ddr_resc_cfg->ddr_width_mode;<br />+            p_rbkey_new->item_num = ddr_item_num;<br />+            p_rbkey_new->ddr_ecc_en = p_ddr_resc_cfg->ddr_ecc_en;<br />+            p_rbkey_new->hash_ddr_arg = GET_DDR_HASH_ARG(p_ddr_resc_cfg->ddr_crc_sel);<br />+            p_rbkey_new->bulk_use = 1;<br />+            p_rbkey_new->zcell_num = zcell_num;<br />+            p_rbkey_new->zreg_num = zreg_num;<br />+            p_hash_cfg->p_bulk_ddr_info[bulk_id] = p_rbkey_new;<br />+<br />+            PMD_DRV_LOG(DEBUG, "one new ddr_bulk init!");<br />+        }<br />+    }<br />+<br />+    p_bulk_zcam_mono = (ZXDH_HASH_BULK_ZCAM_STAT *)rte_zmalloc(NULL,<br />+        sizeof(ZXDH_HASH_BULK_ZCAM_STAT), 0);<br />+    if (NULL == (p_bulk_zcam_mono)) {<br />+        rte_free(p_rbkey_new);<br />+        rte_free(p_rb_tn_new);<br />+        rte_free(p_item_array);<br />+        PMD_DRV_LOG(ERR, "malloc memory failed");<br />+        return ZXDH_PAR_CHK_POINT_NULL;<br />+    }<br />+    (&p_hash_cfg->hash_stat)->p_bulk_zcam_mono[bulk_id] = p_bulk_zcam_mono;<br />+<br />+    for (i = 0; i < ZXDH_SE_ZBLK_NUM * ZXDH_SE_ZCELL_NUM; i++)<br />+        p_bulk_zcam_mono->zcell_mono_idx[i] = 0xffffffff;<br />+<br />+    for (i = 0; i < ZXDH_SE_ZBLK_NUM; i++) {<br />+        for (j = 0; j < ZXDH_SE_ZREG_NUM; j++) {<br />+            p_bulk_zcam_mono->zreg_mono_id[i][j].zblk_id = 0xffffffff;<br />+            p_bulk_zcam_mono->zreg_mono_id[i][j].zreg_id = 0xffffffff;<br />+        }<br />+    }<br />+<br />+    if (zcell_num > 0) {<br />+        p_hash_cfg->bulk_ram_mono[bulk_id] = 1;<br />+<br />+        p_zcell_dn = p_hash_cfg->hash_shareram.zcell_free_list.p_next;<br />+<br />+        i = 0;<br />+<br />+        while (p_zcell_dn) {<br />+            p_zcell_cfg = (ZXDH_SE_ZCELL_CFG *)p_zcell_dn->data;<br />+<br />+            if (p_zcell_cfg->is_used) {<br />+                if (!(p_zcell_cfg->flag & ZXDH_ZCELL_FLAG_IS_MONO)) {<br />+                    p_zcell_cfg->flag     |= ZXDH_ZCELL_FLAG_IS_MONO;<br />+                    p_zcell_cfg->bulk_id = bulk_id;<br />+<br />+                    p_bulk_zcam_mono->zcell_mono_idx[p_zcell_cfg->zcell_idx] =<br />+                        p_zcell_cfg->zcell_idx;<br />+<br />+                    if (++i >= zcell_num)<br />+                        break;<br />+                }<br />+            } else {<br />+                PMD_DRV_LOG(ERR, "zcell[ %d ] is not init before" <br />+                    " used!", p_zcell_cfg->zcell_idx);<br />+                RTE_ASSERT(0);<br />+                return ZXDH_HASH_RC_INVALID_PARA;<br />+            }<br />+<br />+            p_zcell_dn = p_zcell_dn->next;<br />+        }<br />+<br />+        if (i < zcell_num)<br />+            PMD_DRV_LOG(ERR, "Input param 'zcell_num' is [ %d ]," <br />+                "actually bulk[ %d ]monopolize zcells is [ %d ]!",<br />+                zcell_num, bulk_id, i);<br />+    }<br />+<br />+    if (zreg_num > 0) {<br />+        p_hash_cfg->bulk_ram_mono[bulk_id] = 1;<br />+<br />+        p_zblk_dn = p_hash_cfg->hash_shareram.zblk_list.p_next;<br />+        j = 0;<br />+<br />+        while (p_zblk_dn) {<br />+            p_zblk_cfg = (ZXDH_SE_ZBLK_CFG *)p_zblk_dn->data;<br />+            zblk_idx = p_zblk_cfg->zblk_idx;<br />+<br />+            if (p_zblk_cfg->is_used) {<br />+                for (i = 0; i < ZXDH_SE_ZREG_NUM; i++) {<br />+                    p_zreg_cfg = &p_zblk_cfg->zreg_info[i];<br />+<br />+                    if (!(p_zreg_cfg->flag & ZXDH_ZREG_FLAG_IS_MONO)) {<br />+                        p_zreg_cfg->flag = ZXDH_ZREG_FLAG_IS_MONO;<br />+                        p_zreg_cfg->bulk_id = bulk_id;<br />+<br />+                    p_bulk_zcam_mono->zreg_mono_id[zblk_idx][i].zblk_id =<br />+                        zblk_idx;<br />+                    p_bulk_zcam_mono->zreg_mono_id[zblk_idx][i].zreg_id = i;<br />+<br />+                    if (++j >= zreg_num)<br />+                        break;<br />+                    }<br />+                }<br />+<br />+                if (j >= zreg_num)<br />+                    break;<br />+            } else {<br />+                PMD_DRV_LOG(ERR, "zblk [ %d ] is not init" <br />+                    " before used!", p_zblk_cfg->zblk_idx);<br />+                RTE_ASSERT(0);<br />+                return ZXDH_HASH_RC_INVALID_PARA;<br />+            }<br />+<br />+            p_zblk_dn = p_zblk_dn->next;<br />+        }<br />+<br />+        if (j < zreg_num)<br />+            PMD_DRV_LOG(ERR, "Input param 'zreg_num' is [ %d ]," <br />+                "actually bulk[ %d ]monopolize zregs is [ %d ]!",<br />+                zreg_num, bulk_id, j);<br />+    }<br />+<br />+    return ZXDH_OK;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_apt_hash_bulk_res_init(uint32_t dev_id, uint32_t bulk_num,<br />+                           ZXDH_APT_HASH_BULK_RES_T *p_bulk_res)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+    uint32_t index = 0;<br />+    ZXDH_APT_HASH_BULK_RES_T *p_hash_bulk_res_temp = NULL;<br />+    ZXDH_HASH_DDR_RESC_CFG_T ddr_resc_cfg = {0};<br />+    ZXDH_SE_CFG *p_se_cfg = NULL;<br />+<br />+    p_se_cfg = g_apt_se_cfg[dev_id];<br />+<br />+    for (index = 0; index < bulk_num; index++) {<br />+        memset(&ddr_resc_cfg, 0, sizeof(ZXDH_HASH_DDR_RESC_CFG_T));<br />+        p_hash_bulk_res_temp = p_bulk_res + index;<br />+        ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_hash_bulk_res_temp);<br />+<br />+        ddr_resc_cfg.ddr_baddr = p_hash_bulk_res_temp->ddr_baddr;<br />+        ddr_resc_cfg.ddr_item_num = p_hash_bulk_res_temp->ddr_item_num;<br />+        ddr_resc_cfg.ddr_width_mode = p_hash_bulk_res_temp->ddr_width_mode;<br />+        ddr_resc_cfg.ddr_crc_sel = p_hash_bulk_res_temp->ddr_crc_sel;<br />+        ddr_resc_cfg.ddr_ecc_en = p_hash_bulk_res_temp->ddr_ecc_en;<br />+<br />+        rc = zxdh_np_hash_bulk_init(p_se_cfg,<br />+                            p_hash_bulk_res_temp->func_id,<br />+                            p_hash_bulk_res_temp->bulk_id,<br />+                            &ddr_resc_cfg,<br />+                            p_hash_bulk_res_temp->zcell_num,<br />+                            p_hash_bulk_res_temp->zreg_num);<br />+        ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_hash_bulk_init");<br />+    }<br />+<br />+    return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_se_res_init(uint32_t dev_id, uint32_t type)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+    ZXDH_APT_SE_RES_T *p_se_res = NULL;<br />+    ZXDH_APT_HASH_RES_INIT_T hash_res_init = {0};<br />+<br />+    p_se_res = (ZXDH_APT_SE_RES_T *)zxdh_np_dev_get_se_res_ptr(dev_id, type);<br />+    if (!p_se_res->valid) {<br />+        PMD_DRV_LOG(ERR, "dev_id[0x%x],se_type[0x%x] invalid!", dev_id, type);<br />+        return ZXDH_ERR;<br />+    }<br />+<br />+    hash_res_init.func_num = p_se_res->hash_func_num;<br />+    hash_res_init.bulk_num = p_se_res->hash_bulk_num;<br />+    hash_res_init.func_res = p_se_res->hash_func;<br />+    hash_res_init.bulk_res = p_se_res->hash_bulk;<br />+<br />+    rc = zxdh_np_apt_hash_global_res_init(dev_id);<br />+    ZXDH_COMM_CHECK_RC(rc, "zxdh_np_apt_hash_global_res_init");<br />+<br />+    if (hash_res_init.func_num) {<br />+        rc = zxdh_np_apt_hash_func_res_init(dev_id, hash_res_init.func_num,<br />+            hash_res_init.func_res);<br />+        ZXDH_COMM_CHECK_RC(rc, "zxdh_np_apt_hash_func_res_init");<br />+    }<br />+<br />+    if (hash_res_init.bulk_num) {<br />+        rc = zxdh_np_apt_hash_bulk_res_init(dev_id, hash_res_init.bulk_num,<br />+            hash_res_init.bulk_res);<br />+        ZXDH_COMM_CHECK_RC(rc, "zxdh_np_apt_hash_bulk_res_init");<br />+    }<br />+<br />+    return rc;<br />+}<br />+<br /> uint32_t<br /> zxdh_np_se_res_get_and_init(uint32_t dev_id, uint32_t type)<br /> {<br />@@ -5552,6 +6332,9 @@ zxdh_np_se_res_get_and_init(uint32_t dev_id, uint32_t type)<br />     rc = zxdh_np_agent_se_res_get(dev_id, type);<br />     ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_agent_se_res_get");<br />  <br />+    rc = zxdh_np_se_res_init(dev_id, type);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_se_res_init");<br />+<br />     return rc;<br /> }<br />  <br />diff --git a/drivers/net/zxdh/zxdh_np.h b/drivers/net/zxdh/zxdh_np.h<br />index 23acce3a70..009a50c42f 100644<br />--- a/drivers/net/zxdh/zxdh_np.h<br />+++ b/drivers/net/zxdh/zxdh_np.h<br />@@ -136,6 +136,43 @@<br /> #define ZXDH_ERAM_MAX_NUM                       (60)<br /> #define ZXDH_ETCAM_MAX_NUM                      (8)<br />  <br />+#define ZXDH_SE_RAM_DEPTH                       (512)<br />+#define ZXDH_SE_ZCELL_NUM                       (4)<br />+#define ZXDH_SE_ZREG_NUM                        (4)<br />+#define ZXDH_SE_ALG_BANK_NUM                    (29)<br />+#define ZXDH_SE_ZBLK_NUM                        (32)<br />+#define ZXDH_MAX_FUN_NUM                        (8)<br />+#define ZXDH_HASH_KEY_MAX                       (49)<br />+#define ZXDH_HASH_RST_MAX                       (32)<br />+#define ZXDH_HASH_TBL_ID_NUM                    (32)<br />+#define ZXDH_HASH_BULK_NUM                      (8)<br />+#define ZXDH_HASH_CMP_ZCELL                     (1)<br />+#define ZXDH_HASH_CMP_ZBLK                      (2)<br />+#define ZXDH_HASH_FUNC_ID_NUM                   (4)<br />+#define ZXDH_ZCELL_FLAG_IS_MONO                 (1)<br />+#define ZXDH_ZREG_FLAG_IS_MONO                  (1)<br />+#define ZXDH_HASH_DDR_CRC_NUM                   (4)<br />+#define ZXDH_HASH_TBL_FLAG_AGE                  (1 << 0)<br />+#define ZXDH_HASH_TBL_FLAG_LEARN                (1 << 1)<br />+#define ZXDH_HASH_TBL_FLAG_MC_WRT               (1 << 2)<br />+#define ZXDH_HASH_ACTU_KEY_STEP                 (1)<br />+#define ZXDH_HASH_KEY_CTR_SIZE                  (1)<br />+#define ZXDH_ZCELL_IDX_BT_WIDTH                 (2)<br />+#define ZXDH_ZBLK_IDX_BT_WIDTH                  (3)<br />+#define ZXDH_ZGRP_IDX_BT_WIDTH                  (2)<br />+#define ZXDH_HASH_ENTRY_POS_STEP                (16)<br />+#define ZXDH_HASH_TBL_ID_NUM                    (32)<br />+#define ZXDH_SE_ITEM_WIDTH_MAX                  (64)<br />+#define ZXDH_SE_ENTRY_WIDTH_MAX                 (64)<br />+#define ZXDH_REG_SRAM_FLAG_BT_START             (16)<br />+#define ZXDH_ZBLK_NUM_PER_ZGRP                  (8)<br />+#define ZXDH_ZBLK_IDX_BT_START                  (11)<br />+#define ZXDH_ZBLK_WRT_MASK_BT_START             (17)<br />+#define ZXDH_ZCELL_ADDR_BT_WIDTH                (9)<br />+<br />+#define ZXDH_COMM_PTR_TO_VAL(p)                 ((uint64_t)(p))<br />+#define ZXDH_COMM_VAL_TO_PTR(v)                 ((void *)((uint64_t)(v)))<br />+<br /> /**errco code */<br /> #define ZXDH_RC_BASE                            (0x1000U)<br /> #define ZXDH_PARAMETER_CHK_BASE                 (ZXDH_RC_BASE            | 0x200)<br />@@ -253,6 +290,11 @@<br /> #define ZXDH_HASH_RC_INVALID_ITEM_TYPE          (ZXDH_SE_RC_HASH_BASE | 0x11)<br /> #define ZXDH_HASH_RC_REPEAT_INIT                (ZXDH_SE_RC_HASH_BASE | 0x12)<br />  <br />+#define ZXDH_SE_RC_CFG_BASE                     (ZXDH_SE_RC_BASE | 0x1000)<br />+#define ZXDH_SE_RC_ZBLK_FULL                    (ZXDH_SE_RC_CFG_BASE | 0x1)<br />+#define ZXDH_SE_RC_FUN_INVALID                  (ZXDH_SE_RC_CFG_BASE | 0x2)<br />+#define ZXDH_SE_RC_PARA_INVALID                 (ZXDH_SE_RC_CFG_BASE | 0x3)<br />+<br /> #define ZXDH_SCHE_RSP_LEN                       (2)<br /> #define ZXDH_G_PROFILE_ID_LEN                   (8)<br />  <br />@@ -412,6 +454,13 @@ typedef struct zxdh_rb_tn {<br /> } ZXDH_RB_TN;<br />  <br /> typedef int32_t  (*ZXDH_RB_CMPFUN)(void *p_new, void *p_old, uint32_t keysize);<br />+typedef int32_t (*ZXDH_CMP_FUNC)(ZXDH_D_NODE *data1, ZXDH_D_NODE *data2, void*);<br />+typedef uint32_t (*ZXDH_WRITE32_FUN)(uint32_t dev_id, uint32_t addr, uint32_t write_data);<br />+typedef uint32_t (*ZXDH_READ32_FUN) (uint32_t dev_id, uint32_t addr, uint32_t *read_data);<br />+typedef uint32_t (*ZXDH_LPM_AS_RSLT_WRT_FUNCTION)(uint32_t dev_id,<br />+        uint32_t as_type, uint32_t tbl_id, uint32_t index, uint8_t *p_data);<br />+typedef uint16_t (*ZXDH_HASH_FUNCTION)(uint8_t *pkey, uint32_t width, uint16_t arg);<br />+typedef uint32_t (*ZXDH_HASH_FUNCTION32)(uint8_t *pkey, uint32_t width, uint32_t arg);<br />  <br /> typedef struct _rb_cfg {<br />     uint32_t                key_size;<br />@@ -425,6 +474,217 @@ typedef struct _rb_cfg {<br />     uint32_t                is_init;<br /> } ZXDH_RB_CFG;<br />  <br />+typedef enum zxdh_se_fun_type_e {<br />+    ZXDH_FUN_HASH = 1,<br />+    ZXDH_FUN_LPM,<br />+    ZXDH_FUN_ACL,<br />+    ZXDH_FUN_MAX<br />+} ZXDH_SE_FUN_TYPE;<br />+<br />+typedef struct zxdh_avl_node_t {<br />+    void                    *p_key;<br />+    uint32_t                result;<br />+    int32_t                 avl_height;<br />+    struct zxdh_avl_node_t  *p_avl_left;<br />+    struct zxdh_avl_node_t  *p_avl_right;<br />+    ZXDH_D_NODE             avl_node_list;<br />+} ZXDH_AVL_NODE;<br />+<br />+typedef struct zxdh_se_item_cfg_t {<br />+    ZXDH_D_HEAD  item_list;<br />+    uint32_t  item_index;<br />+    uint32_t  hw_addr;<br />+    uint32_t  bulk_id;<br />+    uint32_t  item_type;<br />+    uint8_t    wrt_mask;<br />+    uint8_t    valid;<br />+    uint8_t    pad[2];<br />+} ZXDH_SE_ITEM_CFG;<br />+<br />+typedef struct zxdh_se_zcell_cfg_t {<br />+    uint8_t            flag;<br />+    uint32_t           bulk_id;<br />+    uint32_t           zcell_idx;<br />+    uint16_t           mask_len;<br />+    uint8_t            is_used;<br />+    uint8_t            is_share;<br />+    uint32_t           item_used;<br />+    ZXDH_SE_ITEM_CFG   item_info[ZXDH_SE_RAM_DEPTH];<br />+    ZXDH_D_NODE        zcell_dn;<br />+    ZXDH_AVL_NODE      zcell_avl;<br />+} ZXDH_SE_ZCELL_CFG;<br />+<br />+typedef struct zxdh_se_zreg_cfg_t {<br />+    uint8_t            flag;<br />+    uint8_t            pad[3];<br />+    uint32_t           bulk_id;<br />+    ZXDH_SE_ITEM_CFG   item_info;<br />+} ZXDH_SE_ZREG_CFG;<br />+<br />+typedef struct zxdh_se_zblk_cfg_t {<br />+    uint32_t          zblk_idx;<br />+    uint16_t          is_used;<br />+    uint16_t          zcell_bm;<br />+    uint16_t          hash_arg;<br />+    uint16_t          pad;<br />+    ZXDH_SE_ZCELL_CFG    zcell_info[ZXDH_SE_ZCELL_NUM];<br />+    ZXDH_SE_ZREG_CFG     zreg_info[ZXDH_SE_ZREG_NUM];<br />+    ZXDH_D_NODE          zblk_dn;<br />+} ZXDH_SE_ZBLK_CFG;<br />+<br />+typedef struct zxdh_func_id_info_t {<br />+    void *fun_ptr;<br />+    uint8_t  fun_type;<br />+    uint8_t  fun_id;<br />+    uint8_t  is_used;<br />+    uint8_t  pad;<br />+} ZXDH_FUNC_ID_INFO;<br />+<br />+typedef struct zxdh_ddr_mem_t {<br />+    uint32_t     total_num;<br />+    uint32_t     base_addr;<br />+    uint32_t     base_addr_offset;<br />+    uint32_t     ecc_en;<br />+    uint32_t     bank_num;<br />+    uint32_t     bank_info[ZXDH_SE_ALG_BANK_NUM];<br />+    uint32_t     share_type;<br />+    uint32_t     item_used;<br />+    ZXDH_LISTSTACK_MANAGER *p_ddr_mng;<br />+} ZXDH_DDR_MEM;<br />+<br />+typedef struct zxdh_share_ram_t {<br />+    uint32_t       zblk_array[ZXDH_SE_ZBLK_NUM];<br />+    ZXDH_D_HEAD    zblk_list;<br />+    ZXDH_D_HEAD    zcell_free_list;<br />+    uint32_t       def_route_num;<br />+    ZXDH_RB_CFG    def_rb;<br />+    struct def_route_info  *p_dr_info;<br />+    ZXDH_DDR_MEM   ddr4_info;<br />+    ZXDH_DDR_MEM   ddr6_info;<br />+} ZXDH_SHARE_RAM;<br />+<br />+typedef struct zxdh_se_cfg_t {<br />+    ZXDH_SE_ZBLK_CFG   zblk_info[ZXDH_SE_ZBLK_NUM];<br />+    ZXDH_FUNC_ID_INFO  fun_info[ZXDH_MAX_FUN_NUM];<br />+    ZXDH_SHARE_RAM     route_shareram;<br />+    uint32_t           reg_base;<br />+    ZXDH_WRITE32_FUN   p_write32_fun;<br />+    ZXDH_READ32_FUN    p_read32_fun;<br />+    uint32_t           lpm_flags;<br />+    void               *p_client;<br />+    uint32_t           dev_id;<br />+    ZXDH_LPM_AS_RSLT_WRT_FUNCTION p_as_rslt_wrt_fun;<br />+} ZXDH_SE_CFG;<br />+<br />+typedef struct hash_ddr_cfg_t {<br />+    uint32_t bulk_use;<br />+    uint32_t ddr_baddr;<br />+    uint32_t ddr_ecc_en;<br />+    uint32_t item_num;<br />+    uint32_t bulk_id;<br />+    uint32_t hash_ddr_arg;<br />+    uint32_t width_mode;<br />+    uint32_t hw_baddr;<br />+    uint32_t zcell_num;<br />+    uint32_t zreg_num;<br />+    ZXDH_SE_ITEM_CFG  **p_item_array;<br />+} HASH_DDR_CFG;<br />+<br />+typedef struct zxdh_hash_tbl_info_t {<br />+    uint32_t fun_id;<br />+    uint32_t actu_key_size;<br />+    uint32_t key_type;<br />+    uint8_t is_init;<br />+    uint8_t mono_zcell;<br />+    uint8_t zcell_num;<br />+    uint8_t mono_zreg;<br />+    uint8_t zreg_num;<br />+    uint8_t is_age;<br />+    uint8_t is_lrn;<br />+    uint8_t is_mc_wrt;<br />+} ZXDH_HASH_TBL_ID_INFO;<br />+<br />+typedef struct zxdh_hash_rbkey_info_t {<br />+    uint8_t          key[ZXDH_HASH_KEY_MAX];<br />+    uint8_t          rst[ZXDH_HASH_RST_MAX];<br />+    ZXDH_D_NODE      entry_dn;<br />+    ZXDH_SE_ITEM_CFG *p_item_info;<br />+    uint32_t         entry_size;<br />+    uint32_t         entry_pos;<br />+} ZXDH_HASH_RBKEY_INFO;<br />+<br />+typedef struct zxdh_hash_table_stat_t {<br />+    float ddr;<br />+    float zcell;<br />+    float zreg;<br />+    float sum;<br />+} ZXDH_HASH_TABLE_STAT;<br />+<br />+typedef struct zxdh_hash_zreg_mono_stat_t {<br />+    uint32_t zblk_id;<br />+    uint32_t zreg_id;<br />+} ZXDH_HASH_ZREG_MONO_STAT;<br />+<br />+typedef struct zxdh_hash_bulk_zcam_stat_t {<br />+    uint32_t zcell_mono_idx[ZXDH_SE_ZBLK_NUM * ZXDH_SE_ZCELL_NUM];<br />+    ZXDH_HASH_ZREG_MONO_STAT zreg_mono_id[ZXDH_SE_ZBLK_NUM][ZXDH_SE_ZREG_NUM];<br />+} ZXDH_HASH_BULK_ZCAM_STAT;<br />+<br />+typedef struct zxdh_hash_stat_t {<br />+    uint32_t insert_ok;<br />+    uint32_t insert_fail;<br />+    uint32_t insert_same;<br />+    uint32_t insert_ddr;<br />+    uint32_t insert_zcell;<br />+    uint32_t insert_zreg;<br />+    uint32_t delete_ok;<br />+    uint32_t delete_fail;<br />+    uint32_t search_ok;<br />+    uint32_t search_fail;<br />+    uint32_t zblock_num;<br />+    uint32_t zblock_array[ZXDH_SE_ZBLK_NUM];<br />+    ZXDH_HASH_TABLE_STAT insert_table[ZXDH_HASH_TBL_ID_NUM];<br />+    ZXDH_HASH_BULK_ZCAM_STAT *p_bulk_zcam_mono[ZXDH_HASH_BULK_NUM];<br />+} ZXDH_HASH_STAT;<br />+<br />+typedef struct zxdh_hash_cfg_t {<br />+    uint32_t              fun_id;<br />+    uint8_t               ddr_valid;<br />+    uint8_t               pad[3];<br />+    ZXDH_HASH_FUNCTION32  p_hash32_fun;<br />+    ZXDH_HASH_FUNCTION    p_hash16_fun;<br />+    HASH_DDR_CFG          *p_bulk_ddr_info[ZXDH_HASH_BULK_NUM];<br />+    uint8_t               bulk_ram_mono[ZXDH_HASH_BULK_NUM];<br />+    ZXDH_SHARE_RAM        hash_shareram;<br />+    ZXDH_SE_CFG           *p_se_info;<br />+    ZXDH_RB_CFG           hash_rb;<br />+    ZXDH_RB_CFG           ddr_cfg_rb;<br />+    ZXDH_HASH_STAT        hash_stat;<br />+} ZXDH_HASH_CFG;<br />+<br />+typedef struct hash_entry_cfg_t {<br />+    uint32_t fun_id;<br />+    uint8_t bulk_id;<br />+    uint8_t table_id;<br />+    uint8_t key_type;<br />+    uint8_t rsp_mode;<br />+    uint32_t actu_key_size;<br />+    uint32_t key_by_size;<br />+    uint32_t rst_by_size;<br />+    ZXDH_SE_CFG *p_se_cfg;<br />+    ZXDH_HASH_CFG *p_hash_cfg;<br />+    ZXDH_HASH_RBKEY_INFO *p_rbkey_new;<br />+    ZXDH_RB_TN *p_rb_tn_new;<br />+} HASH_ENTRY_CFG;<br />+<br />+typedef struct zxdh_hash_ddr_resc_cfg_t {<br />+    uint32_t ddr_width_mode;<br />+    uint32_t ddr_crc_sel;<br />+    uint32_t ddr_item_num;<br />+    uint32_t ddr_baddr;<br />+    uint32_t ddr_ecc_en;<br />+} ZXDH_HASH_DDR_RESC_CFG_T;<br />+<br /> typedef struct zxdh_dtb_tab_up_user_addr_t {<br />     uint32_t user_flag;<br />     uint64_t phy_addr;<br />--  <br />2.27.0<br />