Implement acl table entry write/read/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 | 892 +++++++++++++++++++++++++++++++++++++<br /> drivers/net/zxdh/zxdh_np.h |  31 ++<br /> 2 files changed, 923 insertions(+)<br /> <br />diff --git a/drivers/net/zxdh/zxdh_np.c b/drivers/net/zxdh/zxdh_np.c<br />index 1cfaee240a..ab8b3ae688 100644<br />--- a/drivers/net/zxdh/zxdh_np.c<br />+++ b/drivers/net/zxdh/zxdh_np.c<br />@@ -612,6 +612,11 @@ zxdh_np_get_hash_entry_mask(uint32_t entry_size, uint32_t entry_pos)<br /> #define GET_ZCELL_CRC_VAL(zcell_id, crc16_val) \<br />     (((crc16_val) >> (zcell_id)) & (ZXDH_SE_RAM_DEPTH - 1))<br />  <br />+#define ZXDH_COMM_DM_TO_X(d, m)        ((d) & ~(m))<br />+#define ZXDH_COMM_DM_TO_Y(d, m)        (~(d) & ~(m))<br />+#define ZXDH_COMM_XY_TO_MASK(x, y)     (~(x) & ~(y))<br />+#define ZXDH_COMM_XY_TO_DATA(x, y)     (x)<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 />@@ -4032,6 +4037,65 @@ zxdh_np_hash_soft_uninstall(uint32_t dev_id)<br />     return rc;<br /> }<br />  <br />+static uint32_t<br />+zxdh_np_acl_cfg_get(uint32_t dev_id, ZXDH_ACL_CFG_EX_T **p_acl_cfg)<br />+{<br />+    if (g_p_acl_ex_cfg[dev_id] == NULL) {<br />+        PMD_DRV_LOG(ERR, "etcam_is not init!");<br />+        RTE_ASSERT(0);<br />+        return ZXDH_ACL_RC_ETCAMID_NOT_INIT;<br />+    }<br />+<br />+    *p_acl_cfg = g_p_acl_ex_cfg[dev_id];<br />+<br />+    return ZXDH_OK;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_acl_res_destroy(uint32_t dev_id)<br />+{<br />+    uint32_t table_id = 0;<br />+    uint32_t as_enable = 0;<br />+    ZXDH_ACL_CFG_EX_T *p_acl_cfg = NULL;<br />+    ZXDH_ACL_TBL_CFG_T *p_tbl_cfg = NULL;<br />+<br />+    zxdh_np_acl_cfg_get(dev_id, &p_acl_cfg);<br />+<br />+    if (!p_acl_cfg->acl_etcamids.is_valid) {<br />+        PMD_DRV_LOG(DEBUG, "etcam is not init!");<br />+        return ZXDH_OK;<br />+    }<br />+<br />+    for (table_id = ZXDH_ACL_TBL_ID_MIN; table_id <= ZXDH_ACL_TBL_ID_MAX; table_id++) {<br />+        p_tbl_cfg = p_acl_cfg->acl_tbls + table_id;<br />+        if (!p_tbl_cfg->is_used) {<br />+            PMD_DRV_LOG(DEBUG, "table_id[ %u ] is not used!", table_id);<br />+            continue;<br />+        }<br />+<br />+        zxdh_comm_rb_destroy(&p_tbl_cfg->acl_rb);<br />+<br />+        as_enable = p_tbl_cfg->as_enable;<br />+        if (as_enable) {<br />+            if (p_tbl_cfg->as_rslt_buff) {<br />+                rte_free(p_tbl_cfg->as_rslt_buff);<br />+                p_tbl_cfg->as_rslt_buff = NULL;<br />+            }<br />+        }<br />+<br />+        if (p_tbl_cfg->block_array) {<br />+            rte_free(p_tbl_cfg->block_array);<br />+            p_tbl_cfg->block_array = NULL;<br />+        }<br />+<br />+        p_tbl_cfg->is_used = 0;<br />+    }<br />+<br />+    p_acl_cfg->acl_etcamids.is_valid = 0;<br />+<br />+    return ZXDH_OK;<br />+}<br />+<br /> int<br /> zxdh_np_online_uninit(uint32_t dev_id,<br />             char *port_name,<br />@@ -4047,6 +4111,7 @@ zxdh_np_online_uninit(uint32_t dev_id,<br />     if (rc != ZXDH_OK)<br />         PMD_DRV_LOG(ERR, "zxdh_np_hash_soft_uninstall error! ");<br />  <br />+    zxdh_np_acl_res_destroy(dev_id);<br />     zxdh_np_dtb_mgr_destroy(dev_id);<br />     zxdh_np_sdt_mgr_destroy(dev_id);<br />     zxdh_np_dev_del(dev_id);<br />@@ -4249,6 +4314,70 @@ zxdh_np_dtb_se_alg_zcam_data_write(uint32_t dev_id,<br />     return rc;<br /> }<br />  <br />+static uint32_t<br />+zxdh_np_dtb_etcam_write_entry_data(uint32_t dev_id,<br />+                                    uint32_t block_idx,<br />+                                    uint32_t row_or_col_msk,<br />+                                    uint32_t vben,<br />+                                    uint32_t reg_tcam_flag,<br />+                                    uint32_t flush,<br />+                                    uint32_t rd_wr,<br />+                                    uint32_t wr_mode,<br />+                                    uint32_t data_or_mask,<br />+                                    uint32_t ram_addr,<br />+                                    uint32_t vbit,<br />+                                    uint8_t *p_data,<br />+                                    ZXDH_DTB_ENTRY_T *p_entry)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+    uint32_t i = 0;<br />+    uint32_t offset = 0;<br />+    uint8_t *p_temp = NULL;<br />+<br />+    uint8_t  buff[ZXDH_ETCAM_WIDTH_MAX / 8] = {0};<br />+<br />+    ZXDH_DTB_ETCAM_TABLE_FORM_T dtb_etcam_form_info = {<br />+        .valid = 1,<br />+        .type_mode = ZXDH_DTB_TABLE_MODE_ETCAM,<br />+        .block_sel = block_idx,<br />+        .init_en  = 0,<br />+        .row_or_col_msk = row_or_col_msk,<br />+        .vben = vben,<br />+        .reg_tcam_flag = reg_tcam_flag,<br />+        .uload = flush,<br />+        .rd_wr = rd_wr,<br />+        .wr_mode = wr_mode,<br />+        .data_or_mask = data_or_mask,<br />+        .addr = ram_addr,<br />+        .vbit = vbit,<br />+    };<br />+<br />+    p_entry->data_in_cmd_flag = 0;<br />+    p_entry->data_size = ZXDH_DTB_LEN_POS_SETP * (ZXDH_DTB_ETCAM_LEN_SIZE - 1);<br />+<br />+    rc = zxdh_np_dtb_write_table_cmd(dev_id, ZXDH_DTB_TABLE_ETCAM,<br />+        &dtb_etcam_form_info, p_entry->cmd);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_write_table_cmd");<br />+<br />+    p_temp = p_data;<br />+<br />+    for (i = 0; i < ZXDH_ETCAM_RAM_NUM; i++) {<br />+        offset = i * ((uint32_t)ZXDH_ETCAM_WIDTH_MIN / 8);<br />+<br />+        if ((wr_mode >> (ZXDH_ETCAM_RAM_NUM - 1 - i)) & 0x1) {<br />+            memcpy(buff + offset, p_temp, ZXDH_ETCAM_WIDTH_MIN / 8);<br />+            p_temp += ZXDH_ETCAM_WIDTH_MIN / 8;<br />+        }<br />+    }<br />+<br />+    zxdh_np_comm_swap((uint8_t *)buff, ZXDH_DTB_LEN_POS_SETP * (ZXDH_DTB_ETCAM_LEN_SIZE - 1));<br />+<br />+    memcpy(p_entry->data, buff,<br />+        ZXDH_DTB_LEN_POS_SETP * (ZXDH_DTB_ETCAM_LEN_SIZE - 1));<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 />@@ -4314,6 +4443,35 @@ zxdh_np_dtb_zcam_dump_info_write(uint32_t dev_id,<br />     return rc;<br /> }<br />  <br />+static uint32_t<br />+zxdh_np_dtb_etcam_dump_info_write(uint32_t dev_id,<br />+                        ZXDH_ETCAM_DUMP_INFO_T *p_etcam_dump_info,<br />+                        uint32_t addr_high32,<br />+                        uint32_t addr_low32,<br />+                        uint32_t *p_dump_info)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+<br />+    ZXDH_DTB_ETCAM_DUMP_FORM_T dtb_etcam_dump_form_info = {<br />+        .valid = 1,<br />+        .up_type = ZXDH_DTB_DUMP_MODE_ETCAM,<br />+        .block_sel = p_etcam_dump_info->block_sel,<br />+        .addr = p_etcam_dump_info->addr,<br />+        .rd_mode = p_etcam_dump_info->rd_mode,<br />+        .data_or_mask = p_etcam_dump_info->data_or_mask,<br />+        .tb_depth = p_etcam_dump_info->tb_depth,<br />+        .tb_width = p_etcam_dump_info->tb_width,<br />+        .tb_dst_addr_h = addr_high32,<br />+        .tb_dst_addr_l = addr_low32,<br />+    };<br />+<br />+    rc = zxdh_np_dtb_write_dump_cmd(dev_id, ZXDH_DTB_DUMP_ETCAM,<br />+        &dtb_etcam_dump_form_info, p_dump_info);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_write_dump_cmd");<br />+<br />+    return rc;<br />+}<br />+<br /> static void<br /> zxdh_np_dtb_zcam_dump_entry(uint32_t dev_id,<br />                     uint32_t addr,<br />@@ -4333,6 +4491,38 @@ zxdh_np_dtb_zcam_dump_entry(uint32_t dev_id,<br />     p_entry->data_in_cmd_flag = 1;<br /> }<br />  <br />+static void<br />+zxdh_np_dtb_smmu0_dump_entry(uint32_t dev_id,<br />+                                uint32_t base_addr,<br />+                                uint32_t depth,<br />+                                uint32_t addr_high32,<br />+                                uint32_t addr_low32,<br />+                                ZXDH_DTB_ENTRY_T *p_entry)<br />+{<br />+    zxdh_np_dtb_smmu0_dump_info_write(dev_id,<br />+                        base_addr,<br />+                        depth,<br />+                        addr_high32,<br />+                        addr_low32,<br />+                        (uint32_t *)p_entry->cmd);<br />+    p_entry->data_in_cmd_flag = 1;<br />+}<br />+<br />+static void<br />+zxdh_np_dtb_etcam_dump_entry(uint32_t dev_id,<br />+                        ZXDH_ETCAM_DUMP_INFO_T *p_etcam_dump_info,<br />+                        uint32_t addr_high32,<br />+                        uint32_t addr_low32,<br />+                        ZXDH_DTB_ENTRY_T *p_entry)<br />+{<br />+    zxdh_np_dtb_etcam_dump_info_write(dev_id,<br />+                    p_etcam_dump_info,<br />+                    addr_high32,<br />+                    addr_low32,<br />+                    (uint32_t *)p_entry->cmd);<br />+    p_entry->data_in_cmd_flag = 1;<br />+}<br />+<br /> static uint32_t<br /> zxdh_np_dtb_se_smmu0_ind_write(uint32_t dev_id,<br />         uint32_t base_addr,<br />@@ -5836,7 +6026,318 @@ zxdh_np_dtb_hash_one_entry(uint32_t dev_id,<br />     return rc;<br /> }<br />  <br />+static void<br />+zxdh_np_acl_hdw_addr_get(ZXDH_ACL_TBL_CFG_T *p_tbl_cfg, uint32_t handle,<br />+        uint32_t *p_block_idx, uint32_t *p_addr, uint32_t *p_wr_mask)<br />+{<br />+    uint32_t block_entry_num = ZXDH_ACL_ENTRY_MAX_GET(p_tbl_cfg->key_mode, 1);<br />+    uint32_t entry_pos = (handle % block_entry_num) % (1U << p_tbl_cfg->key_mode);<br />+<br />+    *p_block_idx = p_tbl_cfg->block_array[handle / block_entry_num];<br />+    *p_addr = (handle % block_entry_num) / (1U << p_tbl_cfg->key_mode);<br />+    *p_wr_mask = (((1U << (8U >> (p_tbl_cfg->key_mode))) - 1) << <br />+        ((8U >> (p_tbl_cfg->key_mode)) * (entry_pos))) & 0xFF;<br />+}<br />+<br />+static void<br />+zxdh_np_etcam_dm_to_xy(ZXDH_ETCAM_ENTRY_T *p_dm,<br />+                   ZXDH_ETCAM_ENTRY_T *p_xy,<br />+                   uint32_t len)<br />+{<br />+    uint32_t i = 0;<br />+<br />+    RTE_ASSERT(p_dm->p_data && p_dm->p_mask && p_xy->p_data && p_xy->p_mask);<br />+<br />+    for (i = 0; i < len; i++) {<br />+        p_xy->p_data[i] = ZXDH_COMM_DM_TO_X(p_dm->p_data[i], p_dm->p_mask[i]);<br />+        p_xy->p_mask[i] = ZXDH_COMM_DM_TO_Y(p_dm->p_data[i], p_dm->p_mask[i]);<br />+    }<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_eram_opr_mode_get(uint32_t as_mode)<br />+{<br />+    uint32_t opr_mode = 0;<br />+<br />+    switch (as_mode) {<br />+    case ZXDH_ERAM128_TBL_128b:<br />+        opr_mode =  ZXDH_ERAM128_OPR_128b;<br />+        break;<br />+    case ZXDH_ERAM128_TBL_64b:<br />+        opr_mode =  ZXDH_ERAM128_OPR_64b;<br />+        break;<br />+    case ZXDH_ERAM128_TBL_1b:<br />+        opr_mode =  ZXDH_ERAM128_OPR_1b;<br />+        break;<br />+    default:<br />+        break;<br />+    }<br />+<br />+    return opr_mode;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_etcam_entry_add(uint32_t dev_id,<br />+                            uint32_t addr,<br />+                            uint32_t block_idx,<br />+                            uint32_t wr_mask,<br />+                            uint32_t opr_type,<br />+                            ZXDH_ETCAM_ENTRY_T *p_entry,<br />+                            ZXDH_DTB_ENTRY_T *p_entry_data,<br />+                            ZXDH_DTB_ENTRY_T *p_entry_mask)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+    uint8_t temp_data[ZXDH_ETCAM_WIDTH_MAX / 8] = {0};<br />+    uint8_t temp_mask[ZXDH_ETCAM_WIDTH_MAX / 8] = {0};<br />+    ZXDH_ETCAM_ENTRY_T entry_xy = {0};<br />+<br />+    RTE_ASSERT(p_entry->p_data && p_entry->p_mask);<br />+<br />+    entry_xy.p_data = temp_data;<br />+    entry_xy.p_mask = temp_mask;<br />+<br />+    if (opr_type == ZXDH_ETCAM_OPR_DM) {<br />+        zxdh_np_etcam_dm_to_xy(p_entry, &entry_xy,<br />+            ZXDH_ETCAM_ENTRY_SIZE_GET(p_entry->mode));<br />+    } else {<br />+        memcpy(entry_xy.p_data, p_entry->p_data,<br />+            ZXDH_ETCAM_ENTRY_SIZE_GET(p_entry->mode));<br />+        memcpy(entry_xy.p_mask, p_entry->p_mask,<br />+            ZXDH_ETCAM_ENTRY_SIZE_GET(p_entry->mode));<br />+    }<br />+<br />+    rc = zxdh_np_dtb_etcam_write_entry_data(dev_id, block_idx, 0, 1, 0, 0, 0,<br />+        wr_mask, ZXDH_ETCAM_DTYPE_DATA, addr, 0, entry_xy.p_data, p_entry_data);<br />+<br />+    rc = zxdh_np_dtb_etcam_write_entry_data(dev_id, block_idx, 0, 1, 0, 0, 0,<br />+        wr_mask, ZXDH_ETCAM_DTYPE_MASK, addr, 0xFF, entry_xy.p_mask, p_entry_mask);<br />+<br />+    return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_acl_delete(uint32_t dev_id,<br />+                        uint32_t sdt_no,<br />+                        ZXDH_ACL_ENTRY_EX_T *p_acl_entry,<br />+                        ZXDH_DTB_ENTRY_T *p_dtb_data_entry,<br />+                        ZXDH_DTB_ENTRY_T *p_dtb_mask_entry,<br />+                        ZXDH_DTB_ENTRY_T *p_dtb_as_entry)<br />+{<br />+    uint32_t  rc = ZXDH_OK;<br />+    uint32_t as_eram_baddr = 0;<br />+    uint32_t as_enable = 0;<br />+    uint32_t etcam_table_id = 0;<br />+    uint32_t etcam_as_mode = 0;<br />+    uint32_t opr_mode = 0;<br />+    uint32_t block_idx = 0;<br />+    uint32_t ram_addr = 0;<br />+    uint32_t etcam_wr_mask = 0;<br />+    uint8_t temp_data[ZXDH_ETCAM_WIDTH_MAX / 8];<br />+    uint8_t temp_mask[ZXDH_ETCAM_WIDTH_MAX / 8];<br />+    uint8_t temp_buf[16] = {0};<br />+<br />+    ZXDH_SDT_TBL_ETCAM_T sdt_acl = {0};<br />+    ZXDH_ACL_CFG_EX_T *p_acl_cfg = NULL;<br />+    ZXDH_ACL_TBL_CFG_T *p_tbl_cfg = NULL;<br />+    ZXDH_ETCAM_ENTRY_T etcam_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_acl);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_soft_sdt_tbl_get");<br />+<br />+    etcam_as_mode = sdt_acl.as_rsp_mode;<br />+    etcam_table_id = sdt_acl.etcam_table_id;<br />+    as_enable = sdt_acl.as_en;<br />+    as_eram_baddr = sdt_acl.as_eram_baddr;<br />+<br />+    zxdh_np_acl_cfg_get(dev_id, &p_acl_cfg);<br />+<br />+    p_tbl_cfg = p_acl_cfg->acl_tbls + etcam_table_id;<br />+    if (!p_tbl_cfg->is_used) {<br />+        PMD_DRV_LOG(ERR, "table[ %u ] is not init!", etcam_table_id);<br />+        RTE_ASSERT(0);<br />+        return ZXDH_ACL_RC_TBL_NOT_INIT;<br />+    }<br />+<br />+    zxdh_np_acl_hdw_addr_get(p_tbl_cfg, p_acl_entry->pri,<br />+        &block_idx, &ram_addr, &etcam_wr_mask);<br />+<br />+    memset(temp_data, 0xff, ZXDH_ETCAM_WIDTH_MAX / 8);<br />+    memset(temp_mask, 0, ZXDH_ETCAM_WIDTH_MAX / 8);<br />+    etcam_entry.mode = p_tbl_cfg->key_mode;<br />+    etcam_entry.p_data = temp_data;<br />+    etcam_entry.p_mask = temp_mask;<br />+    rc = zxdh_np_dtb_etcam_entry_add(dev_id,<br />+                               ram_addr,<br />+                               block_idx,<br />+                               etcam_wr_mask,<br />+                               ZXDH_ETCAM_OPR_DM,<br />+                               &etcam_entry,<br />+                               p_dtb_data_entry,<br />+                               p_dtb_mask_entry);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_etcam_entry_add");<br />+<br />+    if (as_enable) {<br />+        memset(temp_buf, 0, sizeof(temp_buf));<br />+        opr_mode = zxdh_np_eram_opr_mode_get(etcam_as_mode);<br />+        rc = zxdh_np_dtb_se_smmu0_ind_write(dev_id,<br />+                                   as_eram_baddr,<br />+                                   p_acl_entry->pri,<br />+                                   opr_mode,<br />+                                   (uint32_t *)temp_buf,<br />+                                   p_dtb_as_entry);<br />+        ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_se_smmu0_ind_write");<br />+    }<br />+<br />+    return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_acl_insert(uint32_t dev_id,<br />+                    uint32_t sdt_no,<br />+                    ZXDH_ACL_ENTRY_EX_T *p_acl_entry,<br />+                    ZXDH_DTB_ENTRY_T *p_dtb_data_entry,<br />+                    ZXDH_DTB_ENTRY_T *p_dtb_mask_entry,<br />+                    ZXDH_DTB_ENTRY_T *p_dtb_as_entry)<br />+{<br />+    uint32_t  rc = ZXDH_OK;<br />+    uint32_t as_eram_baddr = 0;<br />+    uint32_t as_enable = 0;<br />+    uint32_t etcam_table_id = 0;<br />+    uint32_t etcam_as_mode = 0;<br />+    uint32_t opr_mode = 0;<br />+    uint32_t block_idx = 0;<br />+    uint32_t ram_addr = 0;<br />+    uint32_t etcam_wr_mask = 0;<br />+<br />+    ZXDH_SDT_TBL_ETCAM_T sdt_acl = {0};<br />+    ZXDH_ACL_CFG_EX_T *p_acl_cfg = NULL;<br />+    ZXDH_ACL_TBL_CFG_T *p_tbl_cfg = NULL;<br />+    ZXDH_ETCAM_ENTRY_T etcam_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_acl);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_soft_sdt_tbl_get");<br />+<br />+    etcam_as_mode = sdt_acl.as_rsp_mode;<br />+    etcam_table_id = sdt_acl.etcam_table_id;<br />+    as_enable = sdt_acl.as_en;<br />+    as_eram_baddr = sdt_acl.as_eram_baddr;<br />+<br />+    zxdh_np_acl_cfg_get(dev_id, &p_acl_cfg);<br />+<br />+    p_tbl_cfg = p_acl_cfg->acl_tbls + etcam_table_id;<br />+    if (!p_tbl_cfg->is_used) {<br />+        PMD_DRV_LOG(ERR, "table[ %u ] is not init!", etcam_table_id);<br />+        RTE_ASSERT(0);<br />+        return ZXDH_ACL_RC_TBL_NOT_INIT;<br />+    }<br />+<br />+    zxdh_np_acl_hdw_addr_get(p_tbl_cfg, p_acl_entry->pri,<br />+        &block_idx, &ram_addr, &etcam_wr_mask);<br />  <br />+    etcam_entry.mode = p_tbl_cfg->key_mode;<br />+    etcam_entry.p_data = p_acl_entry->key_data;<br />+    etcam_entry.p_mask = p_acl_entry->key_mask;<br />+<br />+    rc = zxdh_np_dtb_etcam_entry_add(dev_id,<br />+                        ram_addr,<br />+                        block_idx,<br />+                        etcam_wr_mask,<br />+                        ZXDH_ETCAM_OPR_DM,<br />+                        &etcam_entry,<br />+                        p_dtb_data_entry,<br />+                        p_dtb_mask_entry);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_etcam_entry_add");<br />+<br />+    if (as_enable) {<br />+        opr_mode = zxdh_np_eram_opr_mode_get(etcam_as_mode);<br />+        rc = zxdh_np_dtb_se_smmu0_ind_write(dev_id,<br />+                        as_eram_baddr,<br />+                        p_acl_entry->pri,<br />+                        opr_mode,<br />+                        (uint32_t *)p_acl_entry->p_as_rslt,<br />+                        p_dtb_as_entry);<br />+        ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_se_smmu0_ind_write");<br />+    }<br />+<br />+    return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_acl_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 />+                        uint8_t *p_data_buff)<br />+{<br />+    uint32_t  rc       = ZXDH_OK;<br />+    uint32_t addr_offset = 0;<br />+    ZXDH_ACL_ENTRY_EX_T acl_entry = {0};<br />+    ZXDH_DTB_ACL_ENTRY_INFO_T *p_entry = NULL;<br />+<br />+    uint8_t data_buff[ZXDH_ETCAM_WIDTH_MAX / 8] = {0};<br />+    uint8_t mask_buff[ZXDH_ETCAM_WIDTH_MAX / 8] = {0};<br />+    uint8_t data_cmd_buff[ZXDH_DTB_TABLE_CMD_SIZE_BIT / 8] = {0};<br />+    uint8_t mask_cmd_buff[ZXDH_DTB_TABLE_CMD_SIZE_BIT / 8] = {0};<br />+    uint8_t as_cmd_buff[ZXDH_DTB_TABLE_CMD_SIZE_BIT / 8] = {0};<br />+    uint32_t as_data_buff[4] = {0};<br />+<br />+    ZXDH_DTB_ENTRY_T dtb_data_entry = {0};<br />+    ZXDH_DTB_ENTRY_T dtb_mask_entry = {0};<br />+    ZXDH_DTB_ENTRY_T dtb_as_entry = {0};<br />+<br />+    dtb_data_entry.cmd = data_cmd_buff;<br />+    dtb_data_entry.data = data_buff;<br />+    dtb_mask_entry.cmd = mask_cmd_buff;<br />+    dtb_mask_entry.data = mask_buff;<br />+    dtb_as_entry.cmd = as_cmd_buff;<br />+    dtb_as_entry.data = (uint8_t *)as_data_buff;<br />+<br />+    p_entry = (ZXDH_DTB_ACL_ENTRY_INFO_T *)p_data;<br />+    acl_entry.pri = p_entry->handle;<br />+    acl_entry.key_data = p_entry->key_data;<br />+    acl_entry.key_mask = p_entry->key_mask;<br />+    acl_entry.p_as_rslt = p_entry->p_as_rslt;<br />+    if (del_en) {<br />+        rc = zxdh_np_dtb_acl_delete(dev_id,<br />+                            sdt_no,<br />+                            &acl_entry,<br />+                            &dtb_data_entry,<br />+                            &dtb_mask_entry,<br />+                            &dtb_as_entry);<br />+        ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_acl_delete");<br />+    } else {<br />+        rc = zxdh_np_dtb_acl_insert(dev_id,<br />+                            sdt_no,<br />+                            &acl_entry,<br />+                            &dtb_data_entry,<br />+                            &dtb_mask_entry,<br />+                            &dtb_as_entry);<br />+        ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_acl_insert");<br />+    }<br />+<br />+    addr_offset = (*p_dtb_len) * ZXDH_DTB_LEN_POS_SETP;<br />+    *p_dtb_len += ZXDH_DTB_ETCAM_LEN_SIZE;<br />+<br />+    rc = zxdh_np_dtb_data_write(p_data_buff, addr_offset, &dtb_data_entry);<br />+<br />+    addr_offset = (*p_dtb_len) * ZXDH_DTB_LEN_POS_SETP;<br />+    *p_dtb_len += ZXDH_DTB_ETCAM_LEN_SIZE;<br />+<br />+    rc = zxdh_np_dtb_data_write(p_data_buff, addr_offset, &dtb_mask_entry);<br />+<br />+    addr_offset = (*p_dtb_len) * ZXDH_DTB_LEN_POS_SETP;<br />+    if (dtb_as_entry.data_in_cmd_flag)<br />+        *p_dtb_len += 1;<br />+    else<br />+        *p_dtb_len += 2;<br />+<br />+    rc = zxdh_np_dtb_data_write(p_data_buff, addr_offset, &dtb_as_entry);<br />+<br />+    return ZXDH_OK;<br />+}<br />  <br /> int<br /> zxdh_np_dtb_table_entry_write(uint32_t dev_id,<br />@@ -5881,6 +6382,10 @@ zxdh_np_dtb_table_entry_write(uint32_t dev_id,<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 />+        case ZXDH_SDT_TBLT_ETCAM:<br />+            rc = zxdh_np_dtb_acl_one_entry(dev_id, sdt_no, ZXDH_DTB_ITEM_ADD_OR_UPDATE,<br />+                pentry->p_entry_data, &dtb_len, p_data_buff);<br />+            continue;<br />         default:<br />             PMD_DRV_LOG(ERR, "SDT table_type[ %u ] is invalid!", tbl_type);<br />             rte_free(p_data_buff);<br />@@ -6989,6 +7494,386 @@ zxdh_np_dtb_hash_data_get(uint32_t dev_id,<br />     return rc;<br /> }<br />  <br />+static void<br />+dtb_etcam_dump_data_len(uint32_t etcam_key_mode,<br />+                        uint32_t *p_etcam_dump_len,<br />+                        uint32_t *p_etcam_dump_inerval)<br />+{<br />+    uint32_t dump_data_len = 0;<br />+    uint8_t etcam_dump_inerval = 0;<br />+<br />+    if (ZXDH_ETCAM_KEY_640b == etcam_key_mode) {<br />+        dump_data_len = 5 * ZXDH_DTB_LEN_POS_SETP;<br />+        etcam_dump_inerval = 0;<br />+    } else if (ZXDH_ETCAM_KEY_320b == etcam_key_mode) {<br />+        dump_data_len = 3 * ZXDH_DTB_LEN_POS_SETP;<br />+        etcam_dump_inerval = 8;<br />+    } else if (ZXDH_ETCAM_KEY_160b == etcam_key_mode) {<br />+        dump_data_len = 2 * ZXDH_DTB_LEN_POS_SETP;<br />+        etcam_dump_inerval = 12;<br />+    } else if (ZXDH_ETCAM_KEY_80b == etcam_key_mode) {<br />+        dump_data_len = 1 * ZXDH_DTB_LEN_POS_SETP;<br />+        etcam_dump_inerval = 6;<br />+    }<br />+<br />+    *p_etcam_dump_len = dump_data_len;<br />+    *p_etcam_dump_inerval = etcam_dump_inerval;<br />+}<br />+<br />+static void<br />+zxdh_np_dtb_get_etcam_xy_from_dump_data(uint8_t *p_data,<br />+                        uint8_t *p_mask,<br />+                        uint32_t etcam_dump_len,<br />+                        uint32_t etcam_dump_inerval,<br />+                        ZXDH_ETCAM_ENTRY_T *p_entry_xy)<br />+{<br />+    uint8_t *p_entry_data = NULL;<br />+    uint8_t *p_entry_mask = NULL;<br />+<br />+    zxdh_np_comm_swap(p_data, etcam_dump_len);<br />+    zxdh_np_comm_swap(p_mask, etcam_dump_len);<br />+<br />+    p_entry_data = p_data + etcam_dump_inerval;<br />+    p_entry_mask = p_mask + etcam_dump_inerval;<br />+<br />+    memcpy(p_entry_xy->p_data, p_entry_data,<br />+        ZXDH_ETCAM_ENTRY_SIZE_GET(p_entry_xy->mode));<br />+    memcpy(p_entry_xy->p_mask, p_entry_mask,<br />+        ZXDH_ETCAM_ENTRY_SIZE_GET(p_entry_xy->mode));<br />+}<br />+<br />+<br />+static void<br />+zxdh_np_etcam_xy_to_dm(ZXDH_ETCAM_ENTRY_T *p_dm,<br />+                        ZXDH_ETCAM_ENTRY_T *p_xy,<br />+                        uint32_t len)<br />+{<br />+    uint32_t i = 0;<br />+<br />+    RTE_ASSERT(p_dm->p_data && p_dm->p_mask && p_xy->p_data && p_xy->p_mask);<br />+<br />+    for (i = 0; i < len; i++) {<br />+        p_dm->p_data[i] = ZXDH_COMM_XY_TO_DATA(p_xy->p_data[i], p_xy->p_mask[i]);<br />+        p_dm->p_mask[i] = ZXDH_COMM_XY_TO_MASK(p_xy->p_data[i], p_xy->p_mask[i]);<br />+    }<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_etcam_entry_get(uint32_t dev_id,<br />+                            uint32_t queue_id,<br />+                            uint32_t block_idx,<br />+                            uint32_t addr,<br />+                            uint32_t rd_mode,<br />+                            uint32_t opr_type,<br />+                            uint32_t as_en,<br />+                            uint32_t as_eram_baddr,<br />+                            uint32_t as_eram_index,<br />+                            uint32_t as_rsp_mode,<br />+                            ZXDH_ETCAM_ENTRY_T *p_entry,<br />+                            uint8_t    *p_as_rslt)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+<br />+    uint32_t etcam_key_mode = 0;<br />+<br />+    uint8_t temp_data[ZXDH_ETCAM_WIDTH_MAX / 8] = {0};<br />+    uint8_t temp_mask[ZXDH_ETCAM_WIDTH_MAX / 8] = {0};<br />+    ZXDH_ETCAM_ENTRY_T entry_xy = {0};<br />+<br />+    uint32_t etcam_data_dst_phy_haddr = 0;<br />+    uint32_t etcam_data_dst_phy_laddr = 0;<br />+    uint32_t etcam_mask_dst_phy_haddr = 0;<br />+    uint32_t etcam_mask_dst_phy_laddr = 0;<br />+    uint32_t as_rst_dst_phy_haddr = 0;<br />+    uint32_t as_rst_dst_phy_laddr = 0;<br />+<br />+    uint32_t dump_element_id = 0;<br />+    uint32_t etcam_dump_one_data_len = 0;<br />+    uint32_t etcam_dump_inerval = 0;<br />+    uint32_t dtb_desc_addr_offset = 0;<br />+    uint32_t dump_data_len = 0;<br />+    uint32_t dtb_desc_len = 0;<br />+<br />+    uint32_t eram_dump_base_addr = 0;<br />+    uint32_t row_index = 0;<br />+    uint32_t col_index = 0;<br />+<br />+    uint8_t *p_data = NULL;<br />+    uint8_t *p_mask = NULL;<br />+    uint8_t *p_rst = NULL;<br />+    uint8_t  *temp_dump_out_data = NULL;<br />+    uint8_t *dump_info_buff = NULL;<br />+    ZXDH_ETCAM_DUMP_INFO_T etcam_dump_info = {0};<br />+    ZXDH_DTB_ENTRY_T   dtb_dump_entry = {0};<br />+    uint8_t cmd_buff[ZXDH_DTB_TABLE_CMD_SIZE_BIT / 8] = {0};<br />+<br />+    dtb_dump_entry.cmd = cmd_buff;<br />+<br />+    entry_xy.p_data = temp_data;<br />+    entry_xy.p_mask = temp_mask;<br />+<br />+    etcam_key_mode = p_entry->mode;<br />+<br />+    etcam_dump_info.block_sel = block_idx;<br />+    etcam_dump_info.addr = addr;<br />+    etcam_dump_info.tb_width = 3 - etcam_key_mode;<br />+    etcam_dump_info.rd_mode = rd_mode;<br />+    etcam_dump_info.tb_depth = 1;<br />+<br />+    rc = zxdh_np_dtb_tab_up_free_item_get(dev_id, queue_id, &dump_element_id);<br />+    if (rc != ZXDH_OK) {<br />+        PMD_DRV_LOG(ERR, "zxdh_np_dtb_tab_up_free_item_get failed!");<br />+        return ZXDH_RC_DTB_QUEUE_ITEM_SW_EMPTY;<br />+    }<br />+<br />+    dtb_etcam_dump_data_len(etcam_key_mode, &etcam_dump_one_data_len, &etcam_dump_inerval);<br />+<br />+    etcam_dump_info.data_or_mask = ZXDH_ETCAM_DTYPE_DATA;<br />+    zxdh_np_dtb_tab_up_item_offset_addr_get(dev_id,<br />+                            queue_id,<br />+                            dump_element_id,<br />+                            dump_data_len,<br />+                            &etcam_data_dst_phy_haddr,<br />+                            &etcam_data_dst_phy_laddr);<br />+<br />+    zxdh_np_dtb_etcam_dump_entry(dev_id,<br />+                            &etcam_dump_info,<br />+                            etcam_data_dst_phy_haddr,<br />+                            etcam_data_dst_phy_laddr,<br />+                            &dtb_dump_entry);<br />+<br />+    dump_info_buff = rte_zmalloc(NULL, ZXDH_DTB_TABLE_DUMP_INFO_BUFF_SIZE, 0);<br />+    if (dump_info_buff == NULL) {<br />+        PMD_DRV_LOG(ERR, "malloc memory failed");<br />+        return ZXDH_PAR_CHK_POINT_NULL;<br />+    }<br />+<br />+    zxdh_np_dtb_data_write(dump_info_buff, dtb_desc_addr_offset, &dtb_dump_entry);<br />+    memset(cmd_buff, 0, ZXDH_DTB_TABLE_CMD_SIZE_BIT / 8);<br />+    dtb_desc_len += 1;<br />+    dtb_desc_addr_offset += ZXDH_DTB_LEN_POS_SETP;<br />+    dump_data_len += etcam_dump_one_data_len;<br />+<br />+    etcam_dump_info.data_or_mask = ZXDH_ETCAM_DTYPE_MASK;<br />+    zxdh_np_dtb_tab_up_item_offset_addr_get(dev_id,<br />+                                queue_id,<br />+                                dump_element_id,<br />+                                dump_data_len,<br />+                                &etcam_mask_dst_phy_haddr,<br />+                                &etcam_mask_dst_phy_laddr);<br />+<br />+    zxdh_np_dtb_etcam_dump_entry(dev_id,<br />+                                &etcam_dump_info,<br />+                                etcam_mask_dst_phy_haddr,<br />+                                etcam_mask_dst_phy_laddr,<br />+                                &dtb_dump_entry);<br />+    zxdh_np_dtb_data_write(dump_info_buff, dtb_desc_addr_offset, &dtb_dump_entry);<br />+    memset(cmd_buff, 0, ZXDH_DTB_TABLE_CMD_SIZE_BIT / 8);<br />+    dtb_desc_len += 1;<br />+    dtb_desc_addr_offset += ZXDH_DTB_LEN_POS_SETP;<br />+    dump_data_len += etcam_dump_one_data_len;<br />+<br />+    if (as_en) {<br />+        zxdh_np_eram_index_cal(as_rsp_mode, as_eram_index, &row_index, &col_index);<br />+<br />+        eram_dump_base_addr = as_eram_baddr + row_index;<br />+        zxdh_np_dtb_tab_up_item_offset_addr_get(dev_id,<br />+                                queue_id,<br />+                                dump_element_id,<br />+                                dump_data_len,<br />+                                &as_rst_dst_phy_haddr,<br />+                                &as_rst_dst_phy_laddr);<br />+<br />+        zxdh_np_dtb_smmu0_dump_entry(dev_id,<br />+                                eram_dump_base_addr,<br />+                                1,<br />+                                as_rst_dst_phy_haddr,<br />+                                as_rst_dst_phy_laddr,<br />+                                &dtb_dump_entry);<br />+        zxdh_np_dtb_data_write(dump_info_buff, dtb_desc_addr_offset, &dtb_dump_entry);<br />+        memset(cmd_buff, 0, ZXDH_DTB_TABLE_CMD_SIZE_BIT / 8);<br />+        dtb_desc_len += 1;<br />+        dtb_desc_addr_offset += ZXDH_DTB_LEN_POS_SETP;<br />+        dump_data_len += ZXDH_DTB_LEN_POS_SETP;<br />+    }<br />+<br />+    temp_dump_out_data = rte_zmalloc(NULL, dump_data_len, 0);<br />+    if (temp_dump_out_data == NULL) {<br />+        PMD_DRV_LOG(ERR, "malloc memory failed");<br />+        rte_free(dump_info_buff);<br />+        return ZXDH_PAR_CHK_POINT_NULL;<br />+    }<br />+    p_data = temp_dump_out_data;<br />+<br />+    rc = zxdh_np_dtb_write_dump_desc_info(dev_id,<br />+                                queue_id,<br />+                                dump_element_id,<br />+                                (uint32_t *)dump_info_buff,<br />+                                dump_data_len / 4,<br />+                                dtb_desc_len * 4,<br />+                                (uint32_t *)temp_dump_out_data);<br />+<br />+    p_data = temp_dump_out_data;<br />+    p_mask = p_data + etcam_dump_one_data_len;<br />+<br />+    zxdh_np_dtb_get_etcam_xy_from_dump_data(p_data,<br />+                                p_mask,<br />+                                etcam_dump_one_data_len,<br />+                                etcam_dump_inerval,<br />+                                &entry_xy);<br />+<br />+    if (opr_type == ZXDH_ETCAM_OPR_DM) {<br />+        zxdh_np_etcam_xy_to_dm(p_entry, &entry_xy,<br />+            ZXDH_ETCAM_ENTRY_SIZE_GET(p_entry->mode));<br />+    } else {<br />+        memcpy(p_entry->p_data, entry_xy.p_data,<br />+            ZXDH_ETCAM_ENTRY_SIZE_GET(p_entry->mode));<br />+        memcpy(p_entry->p_mask, entry_xy.p_mask,<br />+            ZXDH_ETCAM_ENTRY_SIZE_GET(p_entry->mode));<br />+    }<br />+<br />+    if (as_en) {<br />+        p_rst = p_mask + etcam_dump_one_data_len;<br />+        memcpy(p_as_rslt, p_rst, (128 / 8));<br />+    }<br />+<br />+    rte_free(dump_info_buff);<br />+    rte_free(temp_dump_out_data);<br />+<br />+    return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_etcam_entry_cmp(ZXDH_ETCAM_ENTRY_T *p_entry_dm, ZXDH_ETCAM_ENTRY_T *p_entry_xy)<br />+{<br />+    uint32_t data_mask_len = 0;<br />+    uint8_t temp_data[ZXDH_ETCAM_WIDTH_MAX / 8] = {0};<br />+    uint8_t temp_mask[ZXDH_ETCAM_WIDTH_MAX / 8] = {0};<br />+    ZXDH_ETCAM_ENTRY_T entry_xy_temp = {0};<br />+<br />+    entry_xy_temp.mode = p_entry_dm->mode;<br />+    entry_xy_temp.p_data = temp_data;<br />+    entry_xy_temp.p_mask = temp_mask;<br />+<br />+    data_mask_len = ZXDH_ETCAM_ENTRY_SIZE_GET(entry_xy_temp.mode);<br />+<br />+    zxdh_np_etcam_dm_to_xy(p_entry_dm, &entry_xy_temp, data_mask_len);<br />+<br />+    if ((memcmp(entry_xy_temp.p_data, p_entry_xy->p_data, data_mask_len) != 0) ||<br />+        (memcmp(entry_xy_temp.p_mask, p_entry_xy->p_mask, data_mask_len) != 0)) {<br />+        return ZXDH_ERR;<br />+    }<br />+<br />+    return ZXDH_OK;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_acl_data_get(uint32_t dev_id,<br />+                        uint32_t queue_id,<br />+                        uint32_t sdt_no,<br />+                        ZXDH_DTB_ACL_ENTRY_INFO_T *p_dump_acl_entry)<br />+{<br />+    uint32_t  rc = ZXDH_OK;<br />+    uint32_t block_idx = 0;<br />+    uint32_t ram_addr = 0;<br />+    uint32_t etcam_wr_mode = 0;<br />+    uint32_t etcam_key_mode = 0;<br />+    uint32_t etcam_table_id = 0;<br />+    uint32_t as_enable = 0;<br />+    uint32_t as_eram_baddr = 0;<br />+    uint32_t etcam_as_mode = 0;<br />+    uint32_t row_index = 0;<br />+    uint32_t col_index = 0;<br />+<br />+    ZXDH_ETCAM_ENTRY_T etcam_entry_dm = {0};<br />+    ZXDH_ETCAM_ENTRY_T etcam_entry_xy = {0};<br />+    uint32_t as_eram_data[4] = {0};<br />+    uint8_t temp_data[ZXDH_ETCAM_WIDTH_MAX / 8] = {0};<br />+    uint8_t temp_mask[ZXDH_ETCAM_WIDTH_MAX / 8] = {0};<br />+<br />+    ZXDH_ACL_CFG_EX_T *p_acl_cfg = NULL;<br />+    ZXDH_ACL_TBL_CFG_T *p_tbl_cfg = NULL;<br />+<br />+    ZXDH_SDT_TBL_ETCAM_T sdt_etcam_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_etcam_info);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_soft_sdt_tbl_get");<br />+    etcam_key_mode = sdt_etcam_info.etcam_key_mode;<br />+    etcam_as_mode = sdt_etcam_info.as_rsp_mode;<br />+    etcam_table_id = sdt_etcam_info.etcam_table_id;<br />+    as_enable = sdt_etcam_info.as_en;<br />+    as_eram_baddr = sdt_etcam_info.as_eram_baddr;<br />+<br />+    etcam_entry_xy.mode = etcam_key_mode;<br />+    etcam_entry_xy.p_data = temp_data;<br />+    etcam_entry_xy.p_mask = temp_mask;<br />+    etcam_entry_dm.mode = etcam_key_mode;<br />+    etcam_entry_dm.p_data = p_dump_acl_entry->key_data;<br />+    etcam_entry_dm.p_mask = p_dump_acl_entry->key_mask;<br />+<br />+    zxdh_np_acl_cfg_get(dev_id, &p_acl_cfg);<br />+<br />+    p_tbl_cfg = p_acl_cfg->acl_tbls + etcam_table_id;<br />+<br />+    if (!p_tbl_cfg->is_used) {<br />+        PMD_DRV_LOG(ERR, "table[ %u ] is not init!", etcam_table_id);<br />+        RTE_ASSERT(0);<br />+        return ZXDH_ACL_RC_TBL_NOT_INIT;<br />+    }<br />+<br />+    zxdh_np_acl_hdw_addr_get(p_tbl_cfg, p_dump_acl_entry->handle,<br />+        &block_idx, &ram_addr, &etcam_wr_mode);<br />+<br />+    rc = zxdh_np_dtb_etcam_entry_get(dev_id,<br />+                                 queue_id,<br />+                                 block_idx,<br />+                                 ram_addr,<br />+                                 etcam_wr_mode,<br />+                                 ZXDH_ETCAM_OPR_XY,<br />+                                 as_enable,<br />+                                 as_eram_baddr,<br />+                                 p_dump_acl_entry->handle,<br />+                                 etcam_as_mode,<br />+                                 &etcam_entry_xy,<br />+                                 (uint8_t *)as_eram_data);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_etcam_entry_get");<br />+<br />+    if (zxdh_np_etcam_entry_cmp(&etcam_entry_dm, &etcam_entry_xy) == 0) {<br />+        PMD_DRV_LOG(DEBUG, "get done, handle:0x%x block:%u ram_addr:%u rd_mode:%x",<br />+            p_dump_acl_entry->handle, block_idx, ram_addr, etcam_wr_mode);<br />+    } else {<br />+        PMD_DRV_LOG(DEBUG, "get fail, handle:0x%x block:%u ram_addr:%u rd_mode:%x",<br />+            p_dump_acl_entry->handle, block_idx, ram_addr, etcam_wr_mode);<br />+<br />+        return ZXDH_ERR;<br />+    }<br />+<br />+    if (as_enable) {<br />+        zxdh_np_eram_index_cal(etcam_as_mode, p_dump_acl_entry->handle,<br />+            &row_index, &col_index);<br />+        switch (etcam_as_mode) {<br />+        case ZXDH_ERAM128_TBL_128b:<br />+            memcpy(p_dump_acl_entry->p_as_rslt, as_eram_data, (128 / 8));<br />+            break;<br />+<br />+        case ZXDH_ERAM128_TBL_64b:<br />+            memcpy(p_dump_acl_entry->p_as_rslt, as_eram_data +<br />+                ((1 - col_index) << 1), (64 / 8));<br />+            break;<br />+<br />+        case ZXDH_ERAM128_TBL_1b:<br />+            ZXDH_COMM_UINT32_GET_BITS(*(uint32_t *)p_dump_acl_entry->p_as_rslt,<br />+                *(as_eram_data + (3 - col_index / 32)), (col_index % 32), 1);<br />+            break;<br />+        default:<br />+            break;<br />+        }<br />+    }<br />+<br />+    return rc;<br />+}<br />+<br /> int<br /> zxdh_np_dtb_table_entry_get(uint32_t dev_id,<br />          uint32_t queue_id,<br />@@ -7037,6 +7922,13 @@ zxdh_np_dtb_table_entry_get(uint32_t dev_id,<br />  <br />         ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_hash_data_get");<br />         break;<br />+    case ZXDH_SDT_TBLT_ETCAM:<br />+        rc = zxdh_np_dtb_acl_data_get(dev_id,<br />+                queue_id,<br />+                sdt_no,<br />+                (ZXDH_DTB_ACL_ENTRY_INFO_T *)get_entry->p_entry_data);<br />+        ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_acl_data_get");<br />+        break;<br />     default:<br />         PMD_DRV_LOG(ERR, "SDT table_type[ %u ] is invalid!", tbl_type);<br />         return 1;<br />diff --git a/drivers/net/zxdh/zxdh_np.h b/drivers/net/zxdh/zxdh_np.h<br />index aedc34b193..b1d8b1aef8 100644<br />--- a/drivers/net/zxdh/zxdh_np.h<br />+++ b/drivers/net/zxdh/zxdh_np.h<br />@@ -1327,6 +1327,24 @@ typedef enum zxdh_dtb_dump_zcam_width_e {<br />     ZXDH_DTB_DUMP_ZCAM_RSV  = 3,<br /> } ZXDH_DTB_DUMP_ZCAM_WIDTH_E;<br />  <br />+typedef enum zxdh_etcam_opr_type_e {<br />+    ZXDH_ETCAM_OPR_DM = 0,<br />+    ZXDH_ETCAM_OPR_XY = 1,<br />+} ZXDH_ETCAM_OPR_TYPE_E;<br />+<br />+typedef enum zxdh_etcam_data_type_e {<br />+    ZXDH_ETCAM_DTYPE_MASK = 0,<br />+    ZXDH_ETCAM_DTYPE_DATA = 1,<br />+} ZXDH_ETCAM_DATA_TYPE_E;<br />+<br />+typedef enum zxdh_etcam_entry_mode_e {<br />+    ZXDH_ETCAM_KEY_640b = 0,<br />+    ZXDH_ETCAM_KEY_320b = 1,<br />+    ZXDH_ETCAM_KEY_160b = 2,<br />+    ZXDH_ETCAM_KEY_80b  = 3,<br />+    ZXDH_ETCAM_KEY_INVALID,<br />+} ZXDH_ETCAM_ENTRY_MODE_E;<br />+<br /> typedef struct zxdh_dtb_lpm_entry_t {<br />     uint32_t dtb_len0;<br />     uint8_t *p_data_buff0;<br />@@ -1341,6 +1359,19 @@ typedef struct zxdh_dtb_entry_t {<br />     uint32_t data_size;<br /> } ZXDH_DTB_ENTRY_T;<br />  <br />+typedef struct zxdh_etcam_entry_t {<br />+    uint32_t mode;<br />+    uint8_t *p_data;<br />+    uint8_t *p_mask;<br />+} ZXDH_ETCAM_ENTRY_T;<br />+<br />+typedef struct zxdh_dtb_acl_entry_info_t {<br />+    uint32_t handle;<br />+    uint8_t *key_data;<br />+    uint8_t *key_mask;<br />+    uint8_t *p_as_rslt;<br />+} ZXDH_DTB_ACL_ENTRY_INFO_T;<br />+<br /> typedef struct zxdh_dtb_eram_table_form_t {<br />     uint32_t valid;<br />     uint32_t type_mode;<br />--  <br />2.27.0<br />