Implement hash tables write and delete<br />operations by dtb channel.<br /> <br />Signed-off-by: Bingbin Chen <chen.bingbin@zte.com.cn> <br />---<br /> drivers/net/zxdh/zxdh_np.c | 930 +++++++++++++++++++++++++++++++++++++<br /> drivers/net/zxdh/zxdh_np.h |  17 +<br /> 2 files changed, 947 insertions(+)<br /> <br />diff --git a/drivers/net/zxdh/zxdh_np.c b/drivers/net/zxdh/zxdh_np.c<br />index 689ec08344..67edf581e2 100644<br />--- a/drivers/net/zxdh/zxdh_np.c<br />+++ b/drivers/net/zxdh/zxdh_np.c<br />@@ -540,6 +540,76 @@ zxdh_np_comm_uint32_write_bits(uint32_t *dst, uint32_t src,<br /> #define ZXDH_COMM_UINT32_WRITE_BITS(dst, src, start_pos, len)\<br />     zxdh_np_comm_uint32_write_bits(&(dst), src, start_pos, len)<br />  <br />+static inline uint32_t<br />+zxdh_np_zblk_addr_conv(uint32_t zblk_idx)<br />+{<br />+    uint32_t group_size = 1 << ZXDH_ZBLK_IDX_BT_WIDTH;<br />+    uint32_t group_number = zblk_idx / ZXDH_ZBLK_NUM_PER_ZGRP;<br />+    uint32_t offset_in_group = zblk_idx % ZXDH_ZBLK_NUM_PER_ZGRP;<br />+<br />+    return group_number * group_size + offset_in_group;<br />+}<br />+<br />+static inline uint32_t<br />+zxdh_np_zcell_addr_conv(uint32_t zcell_idx)<br />+{<br />+    uint32_t blk_grp_idx = (zcell_idx >> ZXDH_ZCELL_IDX_BT_WIDTH) & <br />+            ((1 << (ZXDH_ZBLK_IDX_BT_WIDTH + ZXDH_ZGRP_IDX_BT_WIDTH)) - 1);<br />+<br />+    uint32_t cell_idx = zcell_idx & ((1 << ZXDH_ZCELL_IDX_BT_WIDTH) - 1);<br />+<br />+    return (zxdh_np_zblk_addr_conv(blk_grp_idx) << ZXDH_ZCELL_IDX_BT_WIDTH) | cell_idx;<br />+}<br />+<br />+#define ZXDH_ZBLK_REG_ADDR_CALC(zblk_idx, offset) \<br />+    ((0xF << ZXDH_ZBLK_WRT_MASK_BT_START) | \<br />+    (0x1 << ZXDH_REG_SRAM_FLAG_BT_START) | \<br />+    ((zxdh_np_zblk_addr_conv(zblk_idx) & 0x1F) << ZXDH_ZBLK_IDX_BT_START) | \<br />+    ((offset) & 0x1FF))<br />+<br />+#define ZXDH_ZBLK_HASH_LIST_REG_ADDR_CALC(zblk_idx, reg_idx) \<br />+    (ZXDH_ZBLK_REG_ADDR_CALC((zblk_idx), (0xD + (reg_idx))))<br />+<br />+#define ZXDH_ZCELL_BASE_ADDR_CALC(zcell_idx) \<br />+    ((0xF << ZXDH_ZBLK_WRT_MASK_BT_START) | (((zxdh_np_zcell_addr_conv(zcell_idx)) & \<br />+    ((1 << (ZXDH_ZCELL_IDX_BT_WIDTH + ZXDH_ZBLK_IDX_BT_WIDTH + ZXDH_ZGRP_IDX_BT_WIDTH)) - 1)) \<br />+    << ZXDH_ZCELL_ADDR_BT_WIDTH))<br />+#define ZXDH_ZBLK_ITEM_ADDR_CALC(zcell_idx, item_idx) \<br />+    ((ZXDH_ZCELL_BASE_ADDR_CALC(zcell_idx)) | ((item_idx) & (ZXDH_SE_RAM_DEPTH - 1)))<br />+<br />+static inline uint32_t<br />+zxdh_np_get_rst_size(uint32_t key_type, uint32_t actu_key_size)<br />+{<br />+    return ((ZXDH_GET_HASH_ENTRY_SIZE(key_type) != 0) ?<br />+        (ZXDH_GET_HASH_ENTRY_SIZE(key_type) - ZXDH_GET_ACTU_KEY_BY_SIZE(actu_key_size) -<br />+        ZXDH_HASH_KEY_CTR_SIZE) : 0xFF);<br />+}<br />+<br />+#define ZXDH_GET_RST_SIZE(key_type, actu_key_size) \<br />+    zxdh_np_get_rst_size(key_type, actu_key_size)<br />+<br />+#define ZXDH_GET_HASH_KEY_TYPE(p_key)  (((p_key)[0] >> 5) & 0x3)<br />+<br />+#define ZXDH_GET_HASH_KEY_VALID(p_key) (((p_key)[0] >> 7) & 0x1)<br />+<br />+#define ZXDH_GET_HASH_KEY_CTRL(valid, type, tbl_id) \<br />+    ((((valid) & 0x1) << 7) | (((type) & 0x3) << 5) | ((tbl_id) & 0x1f))<br />+<br />+static inline uint32_t<br />+zxdh_np_get_hash_entry_mask(uint32_t entry_size, uint32_t entry_pos)<br />+{<br />+    return (((1U << (entry_size / 16U)) - 1U) << (4U - entry_size / 16U - entry_pos)) & 0xF;<br />+}<br />+<br />+#define ZXDH_GET_HASH_ENTRY_MASK(entry_size, entry_pos) \<br />+    zxdh_np_get_hash_entry_mask(entry_size, entry_pos)<br />+<br />+#define GET_HASH_DDR_HW_ADDR(base_addr, item_idx) \<br />+    ((base_addr) + (item_idx))<br />+<br />+#define GET_ZCELL_CRC_VAL(zcell_id, crc16_val) \<br />+    (((crc16_val) >> (zcell_id)) & (ZXDH_SE_RAM_DEPTH - 1))<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 />@@ -1784,6 +1854,16 @@ zxdh_np_dev_dtb_opr_spinlock_get(uint32_t dev_id, uint32_t type,<br />     return ZXDH_OK;<br /> }<br />  <br />+static void<br />+zxdh_np_dev_hash_opr_spinlock_get(uint32_t dev_id,<br />+    uint32_t fun_id, ZXDH_SPINLOCK_T **p_spinlock_out)<br />+{<br />+    ZXDH_DEV_MGR_T *p_dev_mgr = &g_dev_mgr;<br />+    ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[dev_id];<br />+<br />+    *p_spinlock_out = &p_dev_info->hash_spinlock[fun_id];<br />+}<br />+<br /> static uint32_t<br /> zxdh_np_dev_read_channel(uint32_t dev_id, uint32_t addr, uint32_t size, uint32_t *p_data)<br /> {<br />@@ -2218,6 +2298,9 @@ zxdh_np_dev_add(uint32_t  dev_id, ZXDH_DEV_TYPE_E dev_type,<br />     for (i = 0; i < ZXDH_DTB_QUEUE_NUM_MAX; i++)<br />         rte_spinlock_init(&p_dev_info->dtb_queue_spinlock[i].spinlock);<br />  <br />+    for (i = 0; i < ZXDH_HASH_FUNC_ID_NUM; i++)<br />+        rte_spinlock_init(&p_dev_info->hash_spinlock[i].spinlock);<br />+<br />     return ZXDH_OK;<br /> }<br />  <br />@@ -3840,6 +3923,65 @@ zxdh_np_dtb_smmu0_write_entry_data(uint32_t dev_id,<br />     return rc;<br /> }<br />  <br />+static uint32_t<br />+zxdh_np_dtb_zcam_write_entry_data(uint32_t dev_id,<br />+                                uint32_t reg_sram_flag,<br />+                                uint32_t zgroup_id,<br />+                                uint32_t zblock_id,<br />+                                uint32_t zcell_id,<br />+                                uint32_t sram_addr,<br />+                                uint32_t mask,<br />+                                uint8_t *p_data,<br />+                                ZXDH_DTB_ENTRY_T *p_entry)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+<br />+    ZXDH_DTB_ZCAM_TABLE_FORM_T dtb_zcam_form_info = {<br />+        .valid = 1,<br />+        .type_mode = ZXDH_DTB_TABLE_MODE_ZCAM,<br />+        .ram_reg_flag = reg_sram_flag,<br />+        .zgroup_id = zgroup_id,<br />+        .zblock_id = zblock_id,<br />+        .zcell_id = zcell_id,<br />+        .mask = mask,<br />+        .sram_addr = sram_addr & 0x1FF,<br />+    };<br />+<br />+    p_entry->data_in_cmd_flag = 0;<br />+    p_entry->data_size = ZXDH_DTB_LEN_POS_SETP * (ZXDH_DTB_ZCAM_LEN_SIZE - 1);<br />+<br />+    rc = zxdh_np_dtb_write_table_cmd(dev_id, ZXDH_DTB_TABLE_ZCAM,<br />+        &dtb_zcam_form_info, p_entry->cmd);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_write_table_cmd");<br />+<br />+    memcpy(p_entry->data, p_data,<br />+        ZXDH_DTB_LEN_POS_SETP * (ZXDH_DTB_ZCAM_LEN_SIZE - 1));<br />+<br />+    return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_se_alg_zcam_data_write(uint32_t dev_id,<br />+                                    uint32_t addr,<br />+                                    uint8_t *p_data,<br />+                                    ZXDH_DTB_ENTRY_T *p_entry)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+    uint32_t reg_sram_flag = (addr >> 16) & 0x1;<br />+    uint32_t zgroup_id = (addr >> 14) & 0x3;<br />+    uint32_t zblock_id = (addr >> 11) & 0x7;<br />+    uint32_t zcell_id = (addr >> 9) & 0x3;<br />+    uint32_t mask = (addr >> 17) & 0xF;<br />+    uint32_t sram_addr = addr & 0x1FF;<br />+<br />+    rc = zxdh_np_dtb_zcam_write_entry_data(dev_id, reg_sram_flag, zgroup_id, zblock_id,<br />+            zcell_id, sram_addr, mask, p_data, p_entry);<br />+<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_zcam_write_entry_data");<br />+<br />+    return rc;<br />+}<br />+<br /> static uint32_t<br /> zxdh_np_dtb_smmu0_dump_info_write(uint32_t dev_id,<br />                             uint32_t base_addr,<br />@@ -4601,6 +4743,783 @@ zxdh_np_dtb_tab_down_success_status_check(uint32_t dev_id,<br />     return rc;<br /> }<br />  <br />+static uint32_t<br />+zxdh_np_hash_get_hash_info_from_sdt(uint32_t dev_id,<br />+        uint32_t sdt_no, HASH_ENTRY_CFG *p_hash_entry_cfg)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+    ZXDH_FUNC_ID_INFO *p_func_info = NULL;<br />+    ZXDH_SE_CFG *p_se_cfg = NULL;<br />+    ZXDH_SDT_TBL_HASH_T sdt_hash_info = {0};<br />+<br />+    PMD_DRV_LOG(DEBUG, "sdt_no:%u", sdt_no);<br />+    rc = zxdh_np_soft_sdt_tbl_get(dev_id, sdt_no, &sdt_hash_info);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_soft_sdt_tbl_read");<br />+<br />+    p_hash_entry_cfg->fun_id   = sdt_hash_info.hash_id;<br />+    p_hash_entry_cfg->table_id = sdt_hash_info.hash_table_id;<br />+    p_hash_entry_cfg->bulk_id = ((p_hash_entry_cfg->table_id >> 2) & 0x7);<br />+    p_hash_entry_cfg->key_type = sdt_hash_info.hash_table_width;<br />+    p_hash_entry_cfg->rsp_mode = sdt_hash_info.rsp_mode;<br />+    p_hash_entry_cfg->actu_key_size = sdt_hash_info.key_size;<br />+    p_hash_entry_cfg->key_by_size = ZXDH_GET_KEY_SIZE(p_hash_entry_cfg->actu_key_size);<br />+    p_hash_entry_cfg->rst_by_size = ZXDH_GET_RST_SIZE(p_hash_entry_cfg->key_type,<br />+        p_hash_entry_cfg->actu_key_size);<br />+<br />+    p_se_cfg = dpp_se_cfg[dev_id];<br />+    p_hash_entry_cfg->p_se_cfg = p_se_cfg;<br />+<br />+    p_func_info = ZXDH_GET_FUN_INFO(p_se_cfg, p_hash_entry_cfg->fun_id);<br />+<br />+    p_hash_entry_cfg->p_hash_cfg = (ZXDH_HASH_CFG *)p_func_info->fun_ptr;<br />+    ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_hash_entry_cfg->p_hash_cfg);<br />+<br />+    return ZXDH_OK;<br />+}<br />+<br />+static void<br />+zxdh_np_hash_set_crc_key(HASH_ENTRY_CFG *p_hash_entry_cfg,<br />+                     ZXDH_HASH_ENTRY *p_entry, uint8_t *p_temp_key)<br />+{<br />+    uint32_t key_by_size = 0;<br />+    uint8_t temp_tbl_id  = 0;<br />+<br />+    key_by_size = p_hash_entry_cfg->key_by_size;<br />+    memcpy(p_temp_key, p_entry->p_key, key_by_size);<br />+<br />+    temp_tbl_id = (*p_temp_key) & 0x1F;<br />+    memmove(p_temp_key, p_temp_key + 1, key_by_size - ZXDH_HASH_KEY_CTR_SIZE);<br />+    p_temp_key[key_by_size - ZXDH_HASH_KEY_CTR_SIZE] = temp_tbl_id;<br />+}<br />+<br />+static uint8_t<br />+zxdh_np_hash_sdt_partner_valid(uint32_t sdt_no, uint32_t sdt_partner, uint8_t *p_key)<br />+{<br />+    uint32_t  rc        = ZXDH_OK;<br />+    uint32_t dev_id    = 0;<br />+    uint32_t key_valid = 1;<br />+<br />+    ZXDH_SDT_TBL_HASH_T sdt_hash1 = {0};<br />+    ZXDH_SDT_TBL_HASH_T sdt_hash2 = {0};<br />+<br />+    if (sdt_no == sdt_partner ||<br />+    sdt_partner <= ZXDH_DEV_SDT_ID_MAX ||<br />+    p_key == NULL) {<br />+        return ZXDH_FALSE;<br />+    }<br />+<br />+    PMD_DRV_LOG(DEBUG, "sdt_no:%u", sdt_no);<br />+    PMD_DRV_LOG(DEBUG, "sdt_partner:%u", sdt_partner);<br />+    rc = zxdh_np_soft_sdt_tbl_get(dev_id, sdt_no, &sdt_hash1);<br />+    rc |= zxdh_np_soft_sdt_tbl_get(dev_id, sdt_partner, &sdt_hash2);<br />+    if (rc != ZXDH_OK)<br />+        return ZXDH_FALSE;<br />+<br />+    if (sdt_hash1.table_type != (ZXDH_SDT_TBLT_HASH) ||<br />+    sdt_hash2.table_type != ZXDH_SDT_TBLT_HASH ||<br />+    sdt_hash1.hash_table_width != sdt_hash2.hash_table_width ||<br />+    sdt_hash1.key_size != sdt_hash2.key_size ||<br />+    sdt_hash1.rsp_mode != sdt_hash2.rsp_mode) {<br />+        return ZXDH_FALSE;<br />+    }<br />+<br />+    *p_key = ZXDH_GET_HASH_KEY_CTRL(key_valid,<br />+                                    sdt_hash2.hash_table_width,<br />+                                    sdt_hash2.hash_table_id);<br />+<br />+    return ZXDH_TRUE;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_hash_red_black_node_alloc(ZXDH_RB_TN **p_rb_tn_new,<br />+                    ZXDH_HASH_RBKEY_INFO **p_rbkey_new)<br />+{<br />+    ZXDH_RB_TN *p_rb_tn_new_temp = NULL;<br />+    ZXDH_HASH_RBKEY_INFO *p_rbkey_new_temp = NULL;<br />+<br />+    p_rbkey_new_temp = rte_zmalloc(NULL, sizeof(ZXDH_HASH_RBKEY_INFO), 0);<br />+    if (p_rbkey_new_temp == NULL) {<br />+        PMD_DRV_LOG(ERR, "malloc memory failed");<br />+        return ZXDH_PAR_CHK_POINT_NULL;<br />+    }<br />+<br />+    p_rb_tn_new_temp = rte_zmalloc(NULL, sizeof(ZXDH_RB_TN), 0);<br />+    if (p_rb_tn_new_temp == NULL) {<br />+        rte_free(p_rbkey_new_temp);<br />+        PMD_DRV_LOG(ERR, "malloc memory failed");<br />+        return ZXDH_PAR_CHK_POINT_NULL;<br />+    }<br />+<br />+    zxdh_np_init_rbt_tn(p_rb_tn_new_temp, p_rbkey_new_temp);<br />+<br />+    *p_rb_tn_new = p_rb_tn_new_temp;<br />+    *p_rbkey_new = p_rbkey_new_temp;<br />+<br />+    return ZXDH_OK;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_hash_rb_insert(uint32_t dev_id, HASH_ENTRY_CFG *p_hash_entry_cfg,<br />+                    ZXDH_HASH_ENTRY *p_entry)<br />+{<br />+    uint32_t         rc              = ZXDH_OK;<br />+    ZXDH_HASH_RBKEY_INFO *p_rbkey_rtn    = NULL;<br />+    ZXDH_RB_TN            *p_rb_tn_rtn    = NULL;<br />+    ZXDH_HASH_RBKEY_INFO *p_rbkey_new    = p_hash_entry_cfg->p_rbkey_new;<br />+    ZXDH_RB_TN             *p_rb_tn_new    = p_hash_entry_cfg->p_rb_tn_new;<br />+    ZXDH_HASH_CFG         *p_hash_cfg    = p_hash_entry_cfg->p_hash_cfg;<br />+    uint32_t rst_actual_size = ((p_hash_entry_cfg->rst_by_size) > ZXDH_HASH_RST_MAX) ?<br />+            ZXDH_HASH_RST_MAX : p_hash_entry_cfg->rst_by_size;<br />+<br />+    rc = zxdh_comm_rb_insert(&p_hash_cfg->hash_rb, (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 />+        p_hash_cfg->hash_stat.insert_same++;<br />+        PMD_DRV_LOG(DEBUG, "Hash update exist entry!");<br />+<br />+        ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_rb_tn_rtn);<br />+        p_rbkey_rtn = (ZXDH_HASH_RBKEY_INFO *)(p_rb_tn_rtn->p_key);<br />+<br />+        memcpy(p_rbkey_rtn->rst, p_entry->p_rst, rst_actual_size);<br />+<br />+        rte_free(p_rbkey_new);<br />+        rte_free(p_rb_tn_new);<br />+        p_hash_entry_cfg->p_rbkey_new = p_rbkey_rtn;<br />+        p_hash_entry_cfg->p_rb_tn_new = p_rb_tn_rtn;<br />+<br />+        return ZXDH_HASH_RC_ADD_UPDATE;<br />+    }<br />+    PMD_DRV_LOG(DEBUG, "Hash insert new entry!");<br />+<br />+    memcpy(p_rbkey_new->rst, p_entry->p_rst, rst_actual_size);<br />+    p_rbkey_new->entry_size = ZXDH_GET_HASH_ENTRY_SIZE(p_hash_entry_cfg->key_type);<br />+    zxdh_np_init_d_node(&p_rbkey_new->entry_dn, p_rbkey_new);<br />+<br />+    return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_hash_get_item_free_pos(uint32_t item_entry_max,<br />+                uint32_t wrt_mask, uint32_t entry_size)<br />+{<br />+    uint32_t i = 0;<br />+    uint32_t pos = 0xFFFFFFFF;<br />+    uint32_t mask = 0;<br />+<br />+    for (i = 0; i < item_entry_max; i += entry_size / ZXDH_HASH_ENTRY_POS_STEP) {<br />+        mask = ZXDH_GET_HASH_ENTRY_MASK(entry_size, i);<br />+<br />+        if (0 == (mask & wrt_mask)) {<br />+            pos = i;<br />+            break;<br />+        }<br />+    }<br />+<br />+    return pos;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_hash_insrt_to_item(ZXDH_HASH_CFG *p_hash_cfg,<br />+                            ZXDH_HASH_RBKEY_INFO *p_rbkey,<br />+                            ZXDH_SE_ITEM_CFG *p_item,<br />+                            uint32_t item_idx,<br />+                            uint32_t item_type,<br />+                            __rte_unused uint32_t insrt_key_type)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+<br />+    uint32_t free_pos = 0;<br />+    uint32_t dev_id = p_hash_cfg->p_se_info->dev_id;<br />+    uint32_t item_entry_max = 4;<br />+<br />+    if (item_type == ZXDH_ITEM_DDR_256)<br />+        item_entry_max = 2;<br />+<br />+    if (!p_item->valid) {<br />+        rc = zxdh_comm_double_link_init(item_entry_max, &p_item->item_list);<br />+        ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_comm_double_link_init");<br />+<br />+        p_rbkey->entry_pos = 0;<br />+        p_item->wrt_mask = ZXDH_GET_HASH_ENTRY_MASK(p_rbkey->entry_size,<br />+            p_rbkey->entry_pos);<br />+        p_item->item_index = item_idx;<br />+        p_item->item_type = item_type;<br />+        p_item->valid = 1;<br />+    } else {<br />+        free_pos = zxdh_np_hash_get_item_free_pos(item_entry_max,<br />+                    p_item->wrt_mask, p_rbkey->entry_size);<br />+<br />+        if (free_pos == 0xFFFFFFFF)<br />+            return ZXDH_HASH_RC_ITEM_FULL;<br />+        p_rbkey->entry_pos = free_pos;<br />+        p_item->wrt_mask   |=<br />+            ZXDH_GET_HASH_ENTRY_MASK(p_rbkey->entry_size, p_rbkey->entry_pos);<br />+    }<br />+<br />+    PMD_DRV_LOG(DEBUG, "pos is[%u], size is[%u]", free_pos, p_rbkey->entry_size);<br />+<br />+    rc = zxdh_comm_double_link_insert_last(&p_rbkey->entry_dn, &p_item->item_list);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_comm_double_link_insert_last");<br />+<br />+    p_rbkey->p_item_info = p_item;<br />+<br />+    return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_hash_insert_ddr(uint32_t dev_id, HASH_ENTRY_CFG *p_hash_entry_cfg,<br />+                    uint8_t *p_temp_key, uint8_t *p_end_flag)<br />+{<br />+    ZXDH_HASH_CFG        *p_hash_cfg = p_hash_entry_cfg->p_hash_cfg;<br />+    uint8_t                bulk_id        = p_hash_entry_cfg->bulk_id;<br />+    HASH_DDR_CFG        *p_ddr_cfg  = p_hash_cfg->p_bulk_ddr_info[bulk_id];<br />+    uint8_t                key_type    = 0;<br />+    uint8_t                table_id    = p_hash_entry_cfg->table_id;<br />+    uint32_t            key_by_size = 0;<br />+    uint32_t            crc_value    = 0;<br />+    uint32_t            item_idx    = 0xFFFFFFFF;<br />+    uint32_t            item_type    = 0;<br />+    ZXDH_SE_ITEM_CFG    *p_item        = NULL;<br />+    uint32_t rc = ZXDH_OK;<br />+<br />+    key_type = p_hash_entry_cfg->key_type;<br />+    if (ZXDH_HASH_KEY_512b == key_type && ZXDH_DDR_WIDTH_256b == p_ddr_cfg->width_mode) {<br />+        PMD_DRV_LOG(ERR, "hash ddr width mode is not match to the key type.");<br />+        return ZXDH_HASH_RC_DDR_WIDTH_MODE_ERR;<br />+    }<br />+<br />+    key_by_size = p_hash_entry_cfg->key_by_size;<br />+    crc_value = p_hash_cfg->p_hash32_fun(p_temp_key, key_by_size, p_ddr_cfg->hash_ddr_arg);<br />+    PMD_DRV_LOG(DEBUG, "hash ddr arg is: 0x%x.crc_value is 0x%x",<br />+        p_ddr_cfg->hash_ddr_arg, crc_value);<br />+<br />+    item_idx = crc_value % p_ddr_cfg->item_num;<br />+    item_type = ZXDH_ITEM_DDR_256;<br />+    if (ZXDH_DDR_WIDTH_512b == p_ddr_cfg->width_mode) {<br />+        item_idx = crc_value % p_ddr_cfg->item_num;<br />+        item_type = ZXDH_ITEM_DDR_512;<br />+    }<br />+<br />+    PMD_DRV_LOG(DEBUG, "Hash insert in ITEM_DDR_%s, item_idx is: 0x%x.",<br />+        ((item_type == ZXDH_ITEM_DDR_256) ? "256" : "512"), item_idx);<br />+<br />+    p_item = p_ddr_cfg->p_item_array[item_idx];<br />+    if (p_item == NULL) {<br />+        p_item = rte_zmalloc(NULL, sizeof(ZXDH_SE_ITEM_CFG), 0);<br />+        if (p_item == NULL) {<br />+            PMD_DRV_LOG(ERR, "malloc memory failed");<br />+            return ZXDH_PAR_CHK_POINT_NULL;<br />+        }<br />+        p_ddr_cfg->p_item_array[item_idx] = p_item;<br />+    }<br />+<br />+    rc = zxdh_np_hash_insrt_to_item(p_hash_cfg,<br />+                        p_hash_entry_cfg->p_rbkey_new,<br />+                        p_item,<br />+                        item_idx,<br />+                        item_type,<br />+                        key_type);<br />+<br />+    if (rc != ZXDH_HASH_RC_ITEM_FULL) {<br />+        ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_hash_insrt_to_item");<br />+        *p_end_flag = 1;<br />+<br />+        p_hash_cfg->hash_stat.insert_ddr++;<br />+        p_hash_cfg->hash_stat.insert_table[table_id].ddr++;<br />+<br />+        p_item->hw_addr = GET_HASH_DDR_HW_ADDR(p_ddr_cfg->hw_baddr, item_idx);<br />+        p_item->bulk_id = p_hash_entry_cfg->bulk_id;<br />+    }<br />+<br />+    return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_hash_insert_zcell(uint32_t dev_id, HASH_ENTRY_CFG *p_hash_entry_cfg,<br />+                uint8_t *p_temp_key, uint8_t *p_end_flag)<br />+{<br />+    uint8_t   bulk_id      = p_hash_entry_cfg->bulk_id;<br />+    ZXDH_D_NODE       *p_zcell_dn  = NULL;<br />+    ZXDH_SE_ZCELL_CFG *p_zcell     = NULL;<br />+    uint32_t  zblk_idx     = 0;<br />+    uint32_t  zcell_id     = 0;<br />+    uint32_t  pre_zblk_idx = 0xFFFFFFFF;<br />+    ZXDH_SE_ITEM_CFG *p_item       = NULL;<br />+    uint32_t  item_idx     = 0xFFFFFFFF;<br />+    uint32_t  item_type    = 0;<br />+    uint32_t  rc           = ZXDH_OK;<br />+    uint32_t  crc_value    = 0;<br />+    uint8_t   table_id     = p_hash_entry_cfg->table_id;<br />+    ZXDH_SE_CFG   *p_se_cfg    = NULL;<br />+    ZXDH_HASH_CFG *p_hash_cfg  = NULL;<br />+    ZXDH_SE_ZBLK_CFG  *p_zblk      = NULL;<br />+<br />+    PMD_DRV_LOG(DEBUG, "insert zcell start");<br />+    p_se_cfg = p_hash_entry_cfg->p_se_cfg;<br />+    ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_se_cfg);<br />+    p_hash_cfg = p_hash_entry_cfg->p_hash_cfg;<br />+    ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_hash_cfg);<br />+    p_zcell_dn = p_hash_cfg->hash_shareram.zcell_free_list.p_next;<br />+<br />+    while (p_zcell_dn) {<br />+        p_zcell = (ZXDH_SE_ZCELL_CFG *)p_zcell_dn->data;<br />+        ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_zcell);<br />+<br />+        if (((p_zcell->flag & ZXDH_ZCELL_FLAG_IS_MONO) && p_zcell->bulk_id != bulk_id) ||<br />+        ((!(p_zcell->flag & ZXDH_ZCELL_FLAG_IS_MONO)) && <br />+        p_hash_cfg->bulk_ram_mono[bulk_id])) {<br />+            p_zcell_dn = p_zcell_dn->next;<br />+            continue;<br />+        }<br />+<br />+        zblk_idx = GET_ZBLK_IDX(p_zcell->zcell_idx);<br />+        p_zblk = &p_se_cfg->zblk_info[zblk_idx];<br />+        if (zblk_idx != pre_zblk_idx) {<br />+            pre_zblk_idx = zblk_idx;<br />+            crc_value = p_hash_cfg->p_hash16_fun(p_temp_key,<br />+                p_hash_entry_cfg->key_by_size, p_zblk->hash_arg);<br />+        }<br />+<br />+        PMD_DRV_LOG(DEBUG, "zblk_idx:[0x%x] hash_arg:[0x%x] crc_value:[0x%x]",<br />+            zblk_idx, p_zblk->hash_arg, crc_value);<br />+<br />+        zcell_id = GET_ZCELL_IDX(p_zcell->zcell_idx);<br />+        item_idx = GET_ZCELL_CRC_VAL(zcell_id, crc_value);<br />+        p_item = &p_zcell->item_info[item_idx];<br />+        item_type = ZXDH_ITEM_RAM;<br />+<br />+        PMD_DRV_LOG(DEBUG, "zcell_id:[0x%x] item_idx:[0x%x]", zcell_id, item_idx);<br />+<br />+        rc = zxdh_np_hash_insrt_to_item(p_hash_cfg,<br />+                        p_hash_entry_cfg->p_rbkey_new,<br />+                        p_item,<br />+                        item_idx,<br />+                        item_type,<br />+                        p_hash_entry_cfg->key_type);<br />+<br />+        if (rc == ZXDH_HASH_RC_ITEM_FULL) {<br />+            PMD_DRV_LOG(DEBUG, "The item is full, check next.");<br />+        } else {<br />+            ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_hash_insrt_to_item");<br />+            *p_end_flag = 1;<br />+<br />+            p_hash_cfg->hash_stat.insert_zcell++;<br />+            p_hash_cfg->hash_stat.insert_table[table_id].zcell++;<br />+<br />+            p_item->hw_addr = ZXDH_ZBLK_ITEM_ADDR_CALC(p_zcell->zcell_idx, item_idx);<br />+            break;<br />+        }<br />+<br />+        p_zcell_dn = p_zcell_dn->next;<br />+    }<br />+<br />+    return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_hash_insert_zreg(uint32_t dev_id, HASH_ENTRY_CFG *p_hash_entry_cfg,<br />+                __rte_unused uint8_t *p_temp_key, uint8_t *p_end_flag)<br />+{<br />+    ZXDH_HASH_CFG *p_hash_cfg  = p_hash_entry_cfg->p_hash_cfg;<br />+    ZXDH_D_NODE *p_zblk_dn   = p_hash_cfg->hash_shareram.zblk_list.p_next;<br />+    ZXDH_SE_ZBLK_CFG *p_zblk      = NULL;<br />+    ZXDH_SE_ZREG_CFG *p_zreg      = NULL;<br />+    ZXDH_SE_ITEM_CFG *p_item      = NULL;<br />+    uint8_t reg_index    = 0;<br />+    uint32_t zblk_idx     = 0;<br />+    uint32_t rc           = ZXDH_OK;<br />+    uint8_t bulk_id      = p_hash_entry_cfg->bulk_id;<br />+    uint32_t item_idx     = 0xFFFFFFFF;<br />+    uint32_t item_type    = 0;<br />+    uint32_t table_id     = p_hash_entry_cfg->table_id;<br />+<br />+    while (p_zblk_dn) {<br />+        p_zblk = (ZXDH_SE_ZBLK_CFG *)p_zblk_dn->data;<br />+        zblk_idx = p_zblk->zblk_idx;<br />+<br />+        for (reg_index = 0; reg_index < ZXDH_SE_ZREG_NUM; reg_index++) {<br />+            p_zreg = &p_zblk->zreg_info[reg_index];<br />+<br />+            if (((p_zreg->flag & ZXDH_ZREG_FLAG_IS_MONO) && <br />+                p_zreg->bulk_id != bulk_id) ||<br />+                ((!(p_zreg->flag & ZXDH_ZREG_FLAG_IS_MONO)) && <br />+                p_hash_cfg->bulk_ram_mono[bulk_id])) {<br />+                continue;<br />+            }<br />+<br />+            p_item = &p_zblk->zreg_info[reg_index].item_info;<br />+            item_type = ZXDH_ITEM_REG;<br />+            item_idx = reg_index;<br />+            rc = zxdh_np_hash_insrt_to_item(p_hash_cfg,<br />+                            p_hash_entry_cfg->p_rbkey_new,<br />+                            p_item,<br />+                            item_idx,<br />+                            item_type,<br />+                            p_hash_entry_cfg->key_type);<br />+<br />+            if (rc == ZXDH_HASH_RC_ITEM_FULL) {<br />+                PMD_DRV_LOG(DEBUG, "The item is full, check next.");<br />+            } else {<br />+                ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_hash_insrt_to_item");<br />+                *p_end_flag = 1;<br />+<br />+                p_hash_cfg->hash_stat.insert_zreg++;<br />+                p_hash_cfg->hash_stat.insert_table[table_id].zreg++;<br />+<br />+                p_item->hw_addr = ZXDH_ZBLK_HASH_LIST_REG_ADDR_CALC(zblk_idx,<br />+                    reg_index);<br />+                break;<br />+            }<br />+        }<br />+<br />+        if (*p_end_flag)<br />+            break;<br />+<br />+        p_zblk_dn = p_zblk_dn->next;<br />+    }<br />+<br />+    return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_hash_form_write(ZXDH_HASH_CFG *p_hash_cfg,<br />+                            ZXDH_HASH_RBKEY_INFO *p_rbkey_new,<br />+                            uint32_t actu_key_size,<br />+                            ZXDH_DTB_ENTRY_T *p_entry,<br />+                            __rte_unused uint32_t opr_mode)<br />+{<br />+    uint32_t key_type = 0;<br />+    uint32_t key_by_size = 0;<br />+    uint32_t rst_by_size = 0;<br />+    uint32_t byte_offset = 0;<br />+    uint32_t dev_id = p_hash_cfg->p_se_info->dev_id;<br />+    uint32_t addr;<br />+<br />+    ZXDH_D_NODE *p_entry_dn = NULL;<br />+    ZXDH_HASH_RBKEY_INFO *p_rbkey = NULL;<br />+    uint8_t entry_data[ZXDH_SE_ENTRY_WIDTH_MAX] = {0};<br />+    ZXDH_SE_ITEM_CFG *p_item_info = p_rbkey_new->p_item_info;<br />+<br />+    if (p_item_info == NULL) {<br />+        PMD_DRV_LOG(ERR, "p_item_info point null!");<br />+        return ZXDH_PAR_CHK_POINT_NULL;<br />+    }<br />+<br />+    PMD_DRV_LOG(DEBUG, "zcam p_item_info->hw_addr is 0x%x",<br />+        p_item_info->hw_addr);<br />+    addr = p_item_info->hw_addr;<br />+<br />+    p_entry_dn = p_item_info->item_list.p_next;<br />+<br />+    while (p_entry_dn) {<br />+        p_rbkey = (ZXDH_HASH_RBKEY_INFO *)(p_entry_dn->data);<br />+        key_type = ZXDH_GET_HASH_KEY_TYPE(p_rbkey->key);<br />+        key_by_size = ZXDH_GET_KEY_SIZE(actu_key_size);<br />+        rst_by_size = ZXDH_GET_RST_SIZE(key_type, actu_key_size);<br />+<br />+        byte_offset = p_rbkey->entry_pos * ZXDH_HASH_ENTRY_POS_STEP;<br />+        memcpy(entry_data + byte_offset, p_rbkey->key, key_by_size);<br />+<br />+        byte_offset += key_by_size;<br />+        memcpy(entry_data + byte_offset, p_rbkey->rst,<br />+            ((rst_by_size > ZXDH_HASH_RST_MAX) ? ZXDH_HASH_RST_MAX : rst_by_size));<br />+<br />+        p_entry_dn = p_entry_dn->next;<br />+    }<br />+<br />+    zxdh_np_comm_swap(entry_data, ZXDH_SE_ENTRY_WIDTH_MAX);<br />+<br />+    zxdh_np_dtb_se_alg_zcam_data_write(dev_id,<br />+                                    addr,<br />+                                    entry_data,<br />+                                    p_entry);<br />+<br />+    return ZXDH_OK;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_hash_delete(uint32_t dev_id,<br />+                        uint32_t sdt_no,<br />+                        ZXDH_HASH_ENTRY *p_hash_entry,<br />+                        ZXDH_DTB_ENTRY_T *p_dtb_one_entry)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+    ZXDH_HASH_CFG *p_hash_cfg = NULL;<br />+    ZXDH_SE_ITEM_CFG *p_item = NULL;<br />+    ZXDH_RB_TN *p_rb_tn_rtn = NULL;<br />+    ZXDH_HASH_RBKEY_INFO *p_rbkey_rtn = NULL;<br />+    ZXDH_SPINLOCK_T *p_hash_spinlock = NULL;<br />+    HASH_ENTRY_CFG  hash_entry_cfg = {0};<br />+    ZXDH_HASH_RBKEY_INFO temp_rbkey = {0};<br />+    HASH_DDR_CFG       *bulk_ddr_info = NULL;<br />+<br />+    rc = zxdh_np_hash_get_hash_info_from_sdt(dev_id, sdt_no, &hash_entry_cfg);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_hash_get_hash_info_from_sdt");<br />+<br />+    p_hash_cfg = hash_entry_cfg.p_hash_cfg;<br />+    ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_hash_cfg);<br />+<br />+    zxdh_np_dev_hash_opr_spinlock_get(dev_id, p_hash_cfg->fun_id, &p_hash_spinlock);<br />+    rte_spinlock_lock(&p_hash_spinlock->spinlock);<br />+<br />+    memcpy(temp_rbkey.key, p_hash_entry->p_key, hash_entry_cfg.key_by_size);<br />+    rc = zxdh_comm_rb_delete(&p_hash_cfg->hash_rb, &temp_rbkey, &p_rb_tn_rtn);<br />+    if (rc == ZXDH_RBT_RC_SRHFAIL) {<br />+        p_hash_cfg->hash_stat.delete_fail++;<br />+        PMD_DRV_LOG(ERR, "Error!there is not item in hash!");<br />+        rte_spinlock_unlock(&p_hash_spinlock->spinlock);<br />+        return ZXDH_HASH_RC_DEL_SRHFAIL;<br />+    }<br />+<br />+    p_rbkey_rtn = (ZXDH_HASH_RBKEY_INFO *)(p_rb_tn_rtn->p_key);<br />+    memset(p_rbkey_rtn->rst, 0, sizeof(p_rbkey_rtn->rst));<br />+    hash_entry_cfg.p_rbkey_new = p_rbkey_rtn;<br />+    hash_entry_cfg.p_rb_tn_new = p_rb_tn_rtn;<br />+<br />+    p_item = p_rbkey_rtn->p_item_info;<br />+    rc = zxdh_comm_double_link_del(&p_rbkey_rtn->entry_dn, &p_item->item_list);<br />+    if (rc != ZXDH_OK) {<br />+        PMD_DRV_LOG(ERR, "zxdh_comm_double_link_del failed, rc=0x%x.", rc);<br />+        rte_spinlock_unlock(&p_hash_spinlock->spinlock);<br />+        return ZXDH_ERR;<br />+    }<br />+    p_item->wrt_mask &= ~(ZXDH_GET_HASH_ENTRY_MASK(p_rbkey_rtn->entry_size,<br />+        p_rbkey_rtn->entry_pos)) & 0xF;<br />+<br />+    rc = zxdh_np_dtb_hash_form_write(hash_entry_cfg.p_hash_cfg,<br />+                                 hash_entry_cfg.p_rbkey_new,<br />+                                 hash_entry_cfg.actu_key_size,<br />+                                 p_dtb_one_entry,<br />+                                 ZXDH_DTB_ITEM_DELETE);<br />+    if (rc != ZXDH_OK) {<br />+        PMD_DRV_LOG(ERR, "zxdh_np_dtb_hash_form_write failed, rc=0x%x.", rc);<br />+        rte_spinlock_unlock(&p_hash_spinlock->spinlock);<br />+        return ZXDH_ERR;<br />+    }<br />+<br />+    if (p_item->item_list.used == 0) {<br />+        if (p_item->item_type == ZXDH_ITEM_DDR_256 ||<br />+            p_item->item_type == ZXDH_ITEM_DDR_512) {<br />+            bulk_ddr_info = p_hash_cfg->p_bulk_ddr_info[hash_entry_cfg.bulk_id];<br />+            if (p_item->item_index > bulk_ddr_info->item_num) {<br />+                rte_spinlock_unlock(&p_hash_spinlock->spinlock);<br />+                return ZXDH_PAR_CHK_INVALID_INDEX;<br />+            }<br />+            bulk_ddr_info->p_item_array[p_item->item_index] = NULL;<br />+            rte_free(p_item);<br />+        } else {<br />+            p_item->valid = 0;<br />+        }<br />+    }<br />+<br />+    rte_free(p_rbkey_rtn);<br />+    rte_free(p_rb_tn_rtn);<br />+    p_hash_cfg->hash_stat.delete_ok++;<br />+    rte_spinlock_unlock(&p_hash_spinlock->spinlock);<br />+    return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_hash_insert(uint32_t dev_id,<br />+                        uint32_t sdt_no,<br />+                        ZXDH_HASH_ENTRY *p_hash_entry,<br />+                        ZXDH_DTB_ENTRY_T *p_dtb_one_entry)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+    uint8_t end_flag = 0;<br />+    uint8_t temp_key[ZXDH_HASH_KEY_MAX] = {0};<br />+    ZXDH_HASH_CFG *p_hash_cfg = NULL;<br />+    ZXDH_RB_TN *p_rb_tn_rtn = NULL;<br />+    ZXDH_RB_TN *p_rb_tn_new = NULL;<br />+    ZXDH_HASH_RBKEY_INFO *p_rbkey_new = NULL;<br />+    ZXDH_SPINLOCK_T *p_hash_spinlock = NULL;<br />+    HASH_ENTRY_CFG  hash_entry_cfg = {0};<br />+<br />+    rc = zxdh_np_hash_get_hash_info_from_sdt(dev_id, sdt_no, &hash_entry_cfg);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_hash_get_hash_info_from_sdt");<br />+<br />+    p_hash_cfg = hash_entry_cfg.p_hash_cfg;<br />+    ZXDH_COMM_CHECK_DEV_POINT(dev_id, p_hash_cfg);<br />+<br />+    zxdh_np_dev_hash_opr_spinlock_get(dev_id, p_hash_cfg->fun_id, &p_hash_spinlock);<br />+    rte_spinlock_lock(&p_hash_spinlock->spinlock);<br />+<br />+    rc = zxdh_np_hash_red_black_node_alloc(&p_rb_tn_new, &p_rbkey_new);<br />+    if (rc != ZXDH_OK) {<br />+        PMD_DRV_LOG(ERR, "zxdh_np_hash_red_black_node_alloc failed, rc=0x%x.", rc);<br />+        rte_spinlock_unlock(&p_hash_spinlock->spinlock);<br />+        return ZXDH_ERR;<br />+    }<br />+    memcpy(p_rbkey_new->key, p_hash_entry->p_key,<br />+        hash_entry_cfg.key_by_size);<br />+    hash_entry_cfg.p_rbkey_new = p_rbkey_new;<br />+    hash_entry_cfg.p_rb_tn_new = p_rb_tn_new;<br />+<br />+    rc = zxdh_np_hash_rb_insert(dev_id, &hash_entry_cfg, p_hash_entry);<br />+    if (rc != ZXDH_OK) {<br />+        if (rc == ZXDH_HASH_RC_ADD_UPDATE) {<br />+            rc = zxdh_np_dtb_hash_form_write(p_hash_cfg,<br />+                                 hash_entry_cfg.p_rbkey_new,<br />+                                 hash_entry_cfg.actu_key_size,<br />+                                 p_dtb_one_entry,<br />+                                 ZXDH_DTB_ITEM_ADD_OR_UPDATE);<br />+            if (rc != ZXDH_OK) {<br />+                PMD_DRV_LOG(ERR, "dtb_hash_form_write failed, rc=0x%x.", rc);<br />+                rte_spinlock_unlock(&p_hash_spinlock->spinlock);<br />+                return ZXDH_ERR;<br />+            }<br />+        }<br />+<br />+        rte_spinlock_unlock(&p_hash_spinlock->spinlock);<br />+        return rc;<br />+    }<br />+<br />+    zxdh_np_hash_set_crc_key(&hash_entry_cfg, p_hash_entry, temp_key);<br />+<br />+    if (p_hash_cfg->ddr_valid) {<br />+        rc = zxdh_np_hash_insert_ddr(dev_id, &hash_entry_cfg, temp_key, &end_flag);<br />+        if (rc != ZXDH_OK) {<br />+            PMD_DRV_LOG(ERR, "hash_insert_ddr failed, rc=0x%x.", rc);<br />+            rte_spinlock_unlock(&p_hash_spinlock->spinlock);<br />+            return ZXDH_ERR;<br />+        }<br />+    }<br />+<br />+    if (!end_flag) {<br />+        rc = zxdh_np_hash_insert_zcell(dev_id, &hash_entry_cfg, temp_key, &end_flag);<br />+        if (rc != ZXDH_OK) {<br />+            PMD_DRV_LOG(ERR, "hash_insert_zcell failed, rc=0x%x.", rc);<br />+            rte_spinlock_unlock(&p_hash_spinlock->spinlock);<br />+            return ZXDH_ERR;<br />+        }<br />+    }<br />+<br />+    if (!end_flag) {<br />+        rc = zxdh_np_hash_insert_zreg(dev_id, &hash_entry_cfg, temp_key, &end_flag);<br />+        if (rc != ZXDH_OK) {<br />+            PMD_DRV_LOG(ERR, "hash_insert_zreg failed, rc=0x%x.", rc);<br />+            rte_spinlock_unlock(&p_hash_spinlock->spinlock);<br />+            return ZXDH_ERR;<br />+        }<br />+    }<br />+<br />+    if (!end_flag) {<br />+        p_hash_cfg->hash_stat.insert_fail++;<br />+        memcpy(temp_key, p_hash_entry->p_key, hash_entry_cfg.key_by_size);<br />+        rc = zxdh_comm_rb_delete(&p_hash_cfg->hash_rb, p_rbkey_new, &p_rb_tn_rtn);<br />+        if (rc != ZXDH_OK) {<br />+            PMD_DRV_LOG(ERR, "hash_insert_zreg failed, rc=0x%x.", rc);<br />+            rte_spinlock_unlock(&p_hash_spinlock->spinlock);<br />+            return ZXDH_ERR;<br />+        }<br />+        RTE_ASSERT(p_rb_tn_new == p_rb_tn_rtn);<br />+        rte_free(p_rbkey_new);<br />+        rte_free(p_rb_tn_rtn);<br />+        PMD_DRV_LOG(ERR, "ZXDH_HASH_RC_TBL_FULL.sdt_no=%u", sdt_no);<br />+        rte_spinlock_unlock(&p_hash_spinlock->spinlock);<br />+        return ZXDH_RC_DTB_DOWN_HASH_CONFLICT;<br />+    }<br />+<br />+    rc = zxdh_np_dtb_hash_form_write(p_hash_cfg,<br />+                                 hash_entry_cfg.p_rbkey_new,<br />+                                 hash_entry_cfg.actu_key_size,<br />+                                 p_dtb_one_entry,<br />+                                 ZXDH_DTB_ITEM_ADD_OR_UPDATE);<br />+    if (rc != ZXDH_OK) {<br />+        PMD_DRV_LOG(ERR, "hash form write failed, rc=0x%x.", rc);<br />+        rte_spinlock_unlock(&p_hash_spinlock->spinlock);<br />+        return ZXDH_ERR;<br />+    }<br />+<br />+    p_hash_cfg->hash_stat.insert_ok++;<br />+    rte_spinlock_unlock(&p_hash_spinlock->spinlock);<br />+    return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_apt_get_sdt_partner(uint32_t dev_id, uint32_t sdt_no)<br />+{<br />+    SE_APT_CALLBACK_T *p_apt_callback = NULL;<br />+<br />+    p_apt_callback = &g_apt_se_callback[dev_id][sdt_no];<br />+<br />+    if (p_apt_callback->table_type == ZXDH_SDT_TBLT_HASH)<br />+        return  p_apt_callback->se_func_info.hash_func.sdt_partner;<br />+<br />+    if (p_apt_callback->table_type == ZXDH_SDT_TBLT_ETCAM)<br />+        return  p_apt_callback->se_func_info.acl_func.sdt_partner;<br />+<br />+    return UINT32_MAX;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_hash_one_entry(uint32_t dev_id,<br />+                            uint32_t sdt_no,<br />+                            uint32_t del_en,<br />+                            void *p_data,<br />+                            uint32_t *p_dtb_len,<br />+                            ZXDH_DTB_ENTRY_T *p_dtb_one_entry)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+    uint8_t temp_key[ZXDH_HASH_KEY_MAX] = {0};<br />+    uint8_t temp_rst[ZXDH_HASH_RST_MAX] = {0};<br />+    uint8_t key_valid = 1;<br />+    uint8_t key = 0;<br />+    uint32_t sdt_partner = 0;<br />+    uint8_t valid     = 0;<br />+<br />+    ZXDH_SDT_TBL_HASH_T sdt_hash = {0};<br />+    ZXDH_DTB_HASH_ENTRY_INFO_T *p_entry = NULL;<br />+    ZXDH_HASH_ENTRY entry = {0};<br />+<br />+    PMD_DRV_LOG(DEBUG, "sdt_no:%u", sdt_no);<br />+    rc = zxdh_np_soft_sdt_tbl_get(dev_id, sdt_no, &sdt_hash);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_soft_sdt_tbl_get");<br />+<br />+    entry.p_key = temp_key;<br />+    entry.p_rst = temp_rst;<br />+    entry.p_key[0] = ZXDH_GET_HASH_KEY_CTRL(key_valid,<br />+                            sdt_hash.hash_table_width,<br />+                            sdt_hash.hash_table_id);<br />+    p_entry = (ZXDH_DTB_HASH_ENTRY_INFO_T *)p_data;<br />+    memcpy(&entry.p_key[1], p_entry->p_actu_key,<br />+        ZXDH_GET_ACTU_KEY_BY_SIZE(sdt_hash.key_size));<br />+    memcpy(entry.p_rst, p_entry->p_rst, 4 * (0x1 << sdt_hash.rsp_mode));<br />+<br />+    if (del_en) {<br />+        do {<br />+            rc = zxdh_np_dtb_hash_delete(dev_id, sdt_no, &entry, p_dtb_one_entry);<br />+            sdt_partner = zxdh_np_apt_get_sdt_partner(dev_id, sdt_no);<br />+            valid = zxdh_np_hash_sdt_partner_valid(sdt_no, sdt_partner, &key);<br />+            entry.p_key[0] = key;<br />+            sdt_no = sdt_partner;<br />+        } while ((rc == ZXDH_HASH_RC_DEL_SRHFAIL) && (valid == ZXDH_TRUE));<br />+<br />+        ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_hash_delete");<br />+    } else {<br />+        do {<br />+            rc = zxdh_np_dtb_hash_insert(dev_id, sdt_no, &entry, p_dtb_one_entry);<br />+            sdt_partner = zxdh_np_apt_get_sdt_partner(dev_id, sdt_no);<br />+            valid = zxdh_np_hash_sdt_partner_valid(sdt_no, sdt_partner, &key);<br />+            entry.p_key[0] = key;<br />+            sdt_no = sdt_partner;<br />+        } while ((rc == ZXDH_RC_DTB_DOWN_HASH_CONFLICT) && (valid == ZXDH_TRUE));<br />+<br />+        ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_hash_insert");<br />+    }<br />+<br />+    *p_dtb_len = p_dtb_one_entry->data_size / ZXDH_DTB_LEN_POS_SETP + 1;<br />+<br />+    return rc;<br />+}<br />+<br />+<br />+<br /> int<br /> zxdh_np_dtb_table_entry_write(uint32_t dev_id,<br />             uint32_t queue_id,<br />@@ -4640,6 +5559,10 @@ zxdh_np_dtb_table_entry_write(uint32_t dev_id,<br />             rc = zxdh_np_dtb_eram_one_entry(dev_id, sdt_no, ZXDH_DTB_ITEM_ADD_OR_UPDATE,<br />                 pentry->p_entry_data, &one_dtb_len, &dtb_one_entry);<br />             break;<br />+        case ZXDH_SDT_TBLT_HASH:<br />+            rc = zxdh_np_dtb_hash_one_entry(dev_id, sdt_no, ZXDH_DTB_ITEM_ADD_OR_UPDATE,<br />+                pentry->p_entry_data, &one_dtb_len, &dtb_one_entry);<br />+            break;<br />         default:<br />             PMD_DRV_LOG(ERR, "SDT table_type[ %u ] is invalid!", tbl_type);<br />             rte_free(p_data_buff);<br />@@ -4719,6 +5642,13 @@ zxdh_np_dtb_table_entry_delete(uint32_t dev_id,<br />             rc = zxdh_np_dtb_eram_one_entry(dev_id, sdt_no, ZXDH_DTB_ITEM_DELETE,<br />                 pentry->p_entry_data, &one_dtb_len, &dtb_one_entry);<br />             break;<br />+        case ZXDH_SDT_TBLT_HASH:<br />+            rc = zxdh_np_dtb_hash_one_entry(dev_id, sdt_no,<br />+                ZXDH_DTB_ITEM_DELETE, pentry->p_entry_data,<br />+                &one_dtb_len, &dtb_one_entry);<br />+            if (rc == ZXDH_HASH_RC_DEL_SRHFAIL)<br />+                continue;<br />+            break;<br />         default:<br />             PMD_DRV_LOG(ERR, "SDT table_type[ %u ] is invalid!", tbl_type);<br />             rte_free(p_data_buff);<br />diff --git a/drivers/net/zxdh/zxdh_np.h b/drivers/net/zxdh/zxdh_np.h<br />index 320af0573c..5ca8053d5e 100644<br />--- a/drivers/net/zxdh/zxdh_np.h<br />+++ b/drivers/net/zxdh/zxdh_np.h<br />@@ -10,6 +10,8 @@<br />  <br /> #define ZXDH_OK                               (0)<br /> #define ZXDH_ERR                              (1)<br />+#define ZXDH_TRUE                              (1)<br />+#define ZXDH_FALSE                              (0)<br /> #define ZXDH_DISABLE                          (0)<br /> #define ZXDH_ENABLE                           (1)<br /> #define ZXDH_PORT_NAME_MAX                    (32)<br />@@ -94,6 +96,12 @@<br /> #define ZXDH_DTB_LEN_POS_SETP                    (16)<br /> #define ZXDH_DTB_ITEM_ADD_OR_UPDATE              (0)<br /> #define ZXDH_DTB_ITEM_DELETE                     (1)<br />+#define ZXDH_DTB_ZCAM_LEN_SIZE                   (5)<br />+#define ZXDH_DTB_DUMP_ZCAM_TYPE                  (0)<br />+#define ZXDH_DTB_DUMP_DDR_TYPE                   (1)<br />+#define ZXDH_DTB_DMUP_DATA_MAX                   (64 * 1024 * 1024)<br />+#define ZXDH_DTB_TABLE_DUMP_INFO_BUFF_SIZE       (1024 * 4)<br />+#define ZXDH_DTB_ETCAM_LEN_SIZE                  (6)<br />  <br /> #define ZXDH_ETCAM_LEN_SIZE            (6)<br /> #define ZXDH_ETCAM_BLOCK_NUM           (8)<br />@@ -573,6 +581,14 @@ typedef enum zxdh_hash_key_type_e {<br />     ZXDH_HASH_KEY_512b,<br /> } ZXDH_HASH_KEY_TYPE;<br />  <br />+typedef enum zxdh_se_item_type_e {<br />+    ZXDH_ITEM_INVALID = 0,<br />+    ZXDH_ITEM_RAM,<br />+    ZXDH_ITEM_DDR_256,<br />+    ZXDH_ITEM_DDR_512,<br />+    ZXDH_ITEM_REG,<br />+} ZXDH_SE_ITEM_TYPE;<br />+<br /> typedef struct zxdh_avl_node_t {<br />     void                    *p_key;<br />     uint32_t                result;<br />@@ -1132,6 +1148,7 @@ typedef struct dpp_dev_cfg_t {<br />     ZXDH_SPINLOCK_T dtb_spinlock;<br />     ZXDH_SPINLOCK_T smmu0_spinlock;<br />     ZXDH_SPINLOCK_T dtb_queue_spinlock[ZXDH_DTB_QUEUE_NUM_MAX];<br />+    ZXDH_SPINLOCK_T hash_spinlock[ZXDH_HASH_FUNC_ID_NUM];<br />     ZXDH_DEV_APT_SE_TBL_RES_T dev_apt_se_tbl_res;<br /> } ZXDH_DEV_CFG_T;<br />  <br />--  <br />2.27.0<br />