Implement flow director table entry write, delete and get<br />operation functions by dtb channel.<br /> <br />Signed-off-by: Bingbin Chen <chen.bingbin@zte.com.cn> <br />---<br /> drivers/net/zxdh/zxdh_np.c | 1638 ++++++++++++++++++++++++++++++++++++<br /> drivers/net/zxdh/zxdh_np.h |   31 +-<br /> 2 files changed, 1668 insertions(+), 1 deletion(-)<br /> <br />diff --git a/drivers/net/zxdh/zxdh_np.c b/drivers/net/zxdh/zxdh_np.c<br />index 66902e7e92..57978957f9 100644<br />--- a/drivers/net/zxdh/zxdh_np.c<br />+++ b/drivers/net/zxdh/zxdh_np.c<br />@@ -3055,6 +3055,77 @@ zxdh_np_agent_channel_se_res_get(uint32_t dev_id,<br />     return msg_result;<br /> }<br />  <br />+static uint32_t<br />+zxdh_np_agent_channel_acl_index_request(uint32_t dev_id, uint32_t sdt_no,<br />+            uint32_t vport, uint32_t *p_index)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+<br />+    uint32_t rsp_buff[2] = {0};<br />+    uint32_t msg_result = 0;<br />+    uint32_t acl_index = 0;<br />+    ZXDH_AGENT_CHANNEL_ACL_MSG_T msgcfg = {<br />+        .dev_id = 0,<br />+        .type = ZXDH_ACL_MSG,<br />+        .oper = ZXDH_ACL_INDEX_REQUEST,<br />+        .vport = vport,<br />+        .sdt_no = sdt_no,<br />+    };<br />+    ZXDH_AGENT_CHANNEL_MSG_T agent_msg = {<br />+        .msg = (void *)&msgcfg,<br />+        .msg_len = sizeof(ZXDH_AGENT_CHANNEL_ACL_MSG_T),<br />+    };<br />+<br />+    rc = zxdh_np_agent_channel_sync_send(dev_id, &agent_msg, rsp_buff, sizeof(rsp_buff));<br />+    if (rc != ZXDH_OK) {<br />+        PMD_DRV_LOG(ERR, "agent send msg failed");<br />+        return ZXDH_ERR;<br />+    }<br />+<br />+    msg_result = rsp_buff[0];<br />+    acl_index = rsp_buff[1];<br />+<br />+    PMD_DRV_LOG(DEBUG, "dev_id: %u, msg_result: %u", dev_id, msg_result);<br />+    PMD_DRV_LOG(DEBUG, "dev_id: %u, acl_index: %u", dev_id, acl_index);<br />+<br />+    *p_index = acl_index;<br />+<br />+    return msg_result;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_agent_channel_acl_index_release(uint32_t dev_id, uint32_t rel_type,<br />+            uint32_t sdt_no, uint32_t vport, uint32_t index)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+<br />+    uint32_t msg_result = 0;<br />+    uint32_t rsp_buff[2] = {0};<br />+    ZXDH_AGENT_CHANNEL_ACL_MSG_T msgcfg = {<br />+        .dev_id = 0,<br />+        .type = ZXDH_ACL_MSG,<br />+        .oper = rel_type,<br />+        .index = index,<br />+        .sdt_no = sdt_no,<br />+        .vport = vport,<br />+    };<br />+    ZXDH_AGENT_CHANNEL_MSG_T agent_msg = {<br />+        .msg = (void *)&msgcfg,<br />+        .msg_len = sizeof(ZXDH_AGENT_CHANNEL_ACL_MSG_T),<br />+    };<br />+<br />+    rc = zxdh_np_agent_channel_sync_send(dev_id, &agent_msg, rsp_buff, sizeof(rsp_buff));<br />+    if (rc != ZXDH_OK) {<br />+        PMD_DRV_LOG(ERR, "agent send msg failed");<br />+        return ZXDH_ERR;<br />+    }<br />+<br />+    msg_result = rsp_buff[0];<br />+    PMD_DRV_LOG(DEBUG, "msg_result: %u", msg_result);<br />+<br />+    return msg_result;<br />+}<br />+<br /> static ZXDH_DTB_MGR_T *<br /> zxdh_np_dtb_mgr_get(uint32_t dev_id)<br /> {<br />@@ -6500,6 +6571,11 @@ zxdh_np_dtb_table_entry_delete(uint32_t dev_id,<br />             if (rc == ZXDH_HASH_RC_DEL_SRHFAIL)<br />                 continue;<br />             break;<br />+        case ZXDH_SDT_TBLT_ETCAM:<br />+            rc = zxdh_np_dtb_acl_one_entry(dev_id, sdt_no,<br />+                ZXDH_DTB_ITEM_DELETE, pentry->p_entry_data,<br />+                &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 />@@ -11204,3 +11280,1565 @@ zxdh_np_stat_car_queue_cfg_set(uint32_t dev_id,<br />  <br />     return rc;<br /> }<br />+<br />+uint32_t<br />+zxdh_np_dtb_acl_index_request(uint32_t dev_id,<br />+    uint32_t sdt_no, uint32_t vport, uint32_t *p_index)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+    uint32_t index = 0;<br />+    uint32_t eram_sdt_no = 0;<br />+    ZXDH_SPINLOCK_T *p_dtb_spinlock = NULL;<br />+    ZXDH_DEV_SPINLOCK_TYPE_E spinlock = ZXDH_DEV_SPINLOCK_T_DTB;<br />+    ZXDH_SDT_TBL_ETCAM_T sdt_acl = {0};<br />+    ZXDH_SDT_TBL_ERAM_T sdt_eram = {0};<br />+<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 />+    if (sdt_acl.table_type != ZXDH_SDT_TBLT_ETCAM) {<br />+        PMD_DRV_LOG(ERR, "SDT[%u] table_type[ %u ] is not etcam table!",<br />+            sdt_no, sdt_acl.table_type);<br />+        return ZXDH_ERR;<br />+    }<br />+<br />+    eram_sdt_no = zxdh_np_apt_get_sdt_partner(dev_id, sdt_no);<br />+<br />+    rc = zxdh_np_soft_sdt_tbl_get(dev_id, eram_sdt_no, &sdt_eram);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_soft_sdt_tbl_get");<br />+    if (sdt_eram.table_type != ZXDH_SDT_TBLT_ERAM) {<br />+        PMD_DRV_LOG(ERR, "SDT[%u] table_type[ %u ] is not eram table!",<br />+            eram_sdt_no, sdt_eram.table_type);<br />+        return ZXDH_ERR;<br />+    }<br />+<br />+    rc = zxdh_np_dev_opr_spinlock_get(dev_id, (uint32_t)spinlock, &p_dtb_spinlock);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dev_opr_spinlock_get");<br />+<br />+    rte_spinlock_lock(&p_dtb_spinlock->spinlock);<br />+    rc = zxdh_np_agent_channel_acl_index_request(dev_id, sdt_no, vport, &index);<br />+    rte_spinlock_unlock(&p_dtb_spinlock->spinlock);<br />+<br />+    *p_index = index;<br />+<br />+    return rc;<br />+}<br />+<br />+uint32_t<br />+zxdh_np_dtb_acl_index_release(uint32_t dev_id,<br />+    uint32_t sdt_no, uint32_t vport, uint32_t index)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+    uint32_t eram_sdt_no = 0;<br />+    ZXDH_SPINLOCK_T *p_dtb_spinlock = NULL;<br />+    ZXDH_DEV_SPINLOCK_TYPE_E spinlock = ZXDH_DEV_SPINLOCK_T_DTB;<br />+    ZXDH_SDT_TBL_ETCAM_T sdt_acl = {0};<br />+    ZXDH_SDT_TBL_ERAM_T sdt_eram = {0};<br />+<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 />+    if (sdt_acl.table_type != ZXDH_SDT_TBLT_ETCAM) {<br />+        PMD_DRV_LOG(ERR, "SDT[%u] table_type[ %u ] is not etcam table!",<br />+            sdt_no, sdt_acl.table_type);<br />+        return ZXDH_ERR;<br />+    }<br />+<br />+    eram_sdt_no = zxdh_np_apt_get_sdt_partner(dev_id, sdt_no);<br />+<br />+    rc = zxdh_np_soft_sdt_tbl_get(dev_id, eram_sdt_no, &sdt_eram);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_soft_sdt_tbl_get");<br />+    if (sdt_eram.table_type != ZXDH_SDT_TBLT_ERAM) {<br />+        PMD_DRV_LOG(ERR, "SDT[%u] table_type[ %u ] is not eram table!",<br />+            eram_sdt_no, sdt_eram.table_type);<br />+        return ZXDH_ERR;<br />+    }<br />+<br />+    rc = zxdh_np_dev_opr_spinlock_get(dev_id, (uint32_t)spinlock, &p_dtb_spinlock);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dev_opr_spinlock_get");<br />+<br />+    rte_spinlock_lock(&p_dtb_spinlock->spinlock);<br />+<br />+    rc = zxdh_np_agent_channel_acl_index_release(dev_id,<br />+            ZXDH_ACL_INDEX_RELEASE, sdt_no, vport, index);<br />+<br />+    rte_spinlock_unlock(&p_dtb_spinlock->spinlock);<br />+<br />+    return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_sdt_eram_table_dump(uint32_t dev_id, uint32_t queue_id, uint32_t sdt_no,<br />+    uint32_t start_index, uint32_t depth, uint32_t *p_data, uint32_t *element_id)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+    uint32_t eram_base_addr  = 0;<br />+    uint32_t dump_addr_128bit = 0;<br />+    uint32_t dump_item_index = 0;<br />+    uint32_t dump_data_len = 0;<br />+    uint32_t dump_desc_len = 0;<br />+    uint64_t dump_sdt_phy_addr = 0;<br />+    uint64_t dump_sdt_vir_addr = 0;<br />+    uint32_t dump_addr_size = 0;<br />+    uint32_t dump_dst_phy_haddr = 0;<br />+    uint32_t dump_dst_phy_laddr = 0;<br />+    uint8_t form_buff[ZXDH_DTB_TABLE_CMD_SIZE_BIT / 8] = {0};<br />+    ZXDH_SDT_TBL_ERAM_T sdt_eram    = {0};<br />+<br />+    rc = zxdh_np_soft_sdt_tbl_get(dev_id, sdt_no, &sdt_eram);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_soft_sdt_tbl_get");<br />+<br />+    eram_base_addr = sdt_eram.eram_base_addr;<br />+    dump_addr_128bit = eram_base_addr + start_index;<br />+<br />+    rc = zxdh_np_dtb_dump_sdt_addr_get(dev_id,<br />+                    queue_id,<br />+                    sdt_no,<br />+                    &dump_sdt_phy_addr,<br />+                    &dump_sdt_vir_addr,<br />+                    &dump_addr_size);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_dump_sdt_addr_get");<br />+<br />+    memset((uint8_t *)dump_sdt_vir_addr, 0, dump_addr_size);<br />+    rc = zxdh_np_dtb_tab_up_free_item_get(dev_id, queue_id, &dump_item_index);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_tab_up_free_item_get");<br />+    PMD_DRV_LOG(DEBUG, "dump queue id %u, element_id is: %u.",<br />+        queue_id, dump_item_index);<br />+<br />+    *element_id = dump_item_index;<br />+<br />+    rc = zxdh_np_dtb_tab_up_item_user_addr_set(dev_id,<br />+                    queue_id,<br />+                    dump_item_index,<br />+                    dump_sdt_phy_addr,<br />+                    dump_sdt_vir_addr);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_tab_up_item_addr_set");<br />+<br />+    rc = zxdh_np_dtb_tab_up_item_addr_get(dev_id, queue_id, dump_item_index,<br />+        &dump_dst_phy_haddr, &dump_dst_phy_laddr);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_tab_up_item_addr_get");<br />+<br />+    rc = zxdh_np_dtb_smmu0_dump_info_write(dev_id,<br />+                    dump_addr_128bit,<br />+                    depth,<br />+                    dump_dst_phy_haddr,<br />+                    dump_dst_phy_laddr,<br />+                    (uint32_t *)form_buff);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_smmu0_dump_info_write");<br />+<br />+    dump_data_len = depth * 128 / 32;<br />+    dump_desc_len = ZXDH_DTB_LEN_POS_SETP / 4;<br />+<br />+    if (dump_data_len * 4 > dump_addr_size) {<br />+        PMD_DRV_LOG(ERR, "eram dump size is too small!");<br />+        return ZXDH_RC_DTB_DUMP_SIZE_SMALL;<br />+    }<br />+<br />+    rc = zxdh_np_dtb_write_dump_desc_info(dev_id,<br />+                    queue_id,<br />+                    dump_item_index,<br />+                    (uint32_t *)form_buff,<br />+                    dump_data_len,<br />+                    dump_desc_len,<br />+                    p_data);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_write_dump_desc_info");<br />+<br />+    return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_eram_table_dump(uint32_t dev_id,<br />+        uint32_t queue_id,<br />+        uint32_t sdt_no,<br />+        ZXDH_DTB_DUMP_INDEX_T start_index,<br />+        ZXDH_DTB_ERAM_ENTRY_INFO_T *p_dump_data_arr,<br />+        uint32_t *entry_num,<br />+        __rte_unused ZXDH_DTB_DUMP_INDEX_T *next_start_index,<br />+        uint32_t *finish_flag)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+    uint32_t i = 0;<br />+    uint32_t dump_mode = 0;<br />+    uint32_t eram_table_depth = 0;<br />+    uint32_t start_index_128bit = 0;<br />+    uint32_t row_index = 0;<br />+    uint32_t col_index = 0;<br />+    uint32_t dump_depth_128bit = 0;<br />+    uint32_t dump_depth = 0;<br />+    uint32_t element_id = 0;<br />+    uint8_t *dump_data_buff = NULL;<br />+    uint8_t *temp_data = NULL;<br />+    uint32_t remain = 0;<br />+    uint32_t *buff = NULL;<br />+<br />+    ZXDH_DTB_ERAM_ENTRY_INFO_T *p_dump_user_data = NULL;<br />+    ZXDH_SDT_TBL_ERAM_T sdt_eram = {0};<br />+<br />+    rc = zxdh_np_soft_sdt_tbl_get(dev_id, sdt_no, &sdt_eram);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_soft_sdt_tbl_get");<br />+<br />+    dump_mode = sdt_eram.eram_mode;<br />+    eram_table_depth = sdt_eram.eram_table_depth;<br />+<br />+    zxdh_np_eram_index_cal(dump_mode, eram_table_depth,<br />+        &dump_depth_128bit, &col_index);<br />+<br />+    zxdh_np_eram_index_cal(dump_mode, start_index.index,<br />+        &start_index_128bit, &col_index);<br />+<br />+    dump_depth = dump_depth_128bit - start_index_128bit;<br />+<br />+    dump_data_buff = (uint8_t *)rte_zmalloc(NULL, dump_depth * ZXDH_DTB_LEN_POS_SETP, 0);<br />+    if (dump_data_buff == NULL) {<br />+        PMD_DRV_LOG(ERR, "%s point null!", __func__);<br />+        return ZXDH_PAR_CHK_POINT_NULL;<br />+    }<br />+<br />+    rc = zxdh_np_dtb_sdt_eram_table_dump(dev_id,<br />+                queue_id,<br />+                sdt_no,<br />+                start_index_128bit,<br />+                dump_depth,<br />+                (uint32_t *)dump_data_buff,<br />+                &element_id);<br />+<br />+    if (dump_mode == ZXDH_ERAM128_TBL_128b) {<br />+        for (i = 0; i < dump_depth; i++) {<br />+            p_dump_user_data = p_dump_data_arr + i;<br />+            temp_data = dump_data_buff + i * ZXDH_DTB_LEN_POS_SETP;<br />+            if (p_dump_user_data == NULL || p_dump_user_data->p_data == NULL) {<br />+                PMD_DRV_LOG(ERR, "data buff is NULL!");<br />+                rte_free(dump_data_buff);<br />+                return ZXDH_ERR;<br />+            }<br />+<br />+            p_dump_user_data->index = start_index.index + i;<br />+            rte_memcpy(p_dump_user_data->p_data, temp_data, (128 / 8));<br />+        }<br />+    } else if (dump_mode == ZXDH_ERAM128_TBL_64b) {<br />+        remain =  start_index.index % 2;<br />+        for (i = 0; i < eram_table_depth - start_index.index; i++) {<br />+            zxdh_np_eram_index_cal(dump_mode, remain, &row_index, &col_index);<br />+            temp_data = dump_data_buff + row_index * ZXDH_DTB_LEN_POS_SETP;<br />+<br />+            buff = (uint32_t *)temp_data;<br />+            p_dump_user_data = p_dump_data_arr + i;<br />+<br />+            if (p_dump_user_data == NULL || p_dump_user_data->p_data == NULL) {<br />+                PMD_DRV_LOG(ERR, "data buff is NULL!");<br />+                rte_free(dump_data_buff);<br />+                return ZXDH_ERR;<br />+            }<br />+<br />+            p_dump_user_data->index = start_index.index + i;<br />+            rte_memcpy(p_dump_user_data->p_data,<br />+                buff + ((1 - col_index) << 1), (64 / 8));<br />+<br />+            remain++;<br />+        }<br />+    }<br />+<br />+    *entry_num = eram_table_depth - start_index.index;<br />+    *finish_flag = 1;<br />+    PMD_DRV_LOG(DEBUG, "dump entry num %u, finish flag %u", *entry_num, *finish_flag);<br />+<br />+    rte_free(dump_data_buff);<br />+<br />+    return ZXDH_OK;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_acl_index_parse(uint32_t dev_id,<br />+            uint32_t queue_id,<br />+            uint32_t eram_sdt_no,<br />+            uint32_t vport,<br />+            uint32_t *index_num,<br />+            uint32_t *p_index_array)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+    uint32_t eram_table_depth = 0;<br />+    uint32_t byte_num = 0;<br />+    uint32_t i = 0;<br />+    uint32_t entry_num = 0;<br />+    uint32_t valid_entry_num = 0;<br />+    uint32_t finish_flag = 0;<br />+    uint8_t  valid = 0;<br />+    uint32_t  temp_vport = 0;<br />+    ZXDH_SDT_TBL_ERAM_T sdt_eram = {0};<br />+    ZXDH_DTB_ERAM_ENTRY_INFO_T *p_dump_data_arr = NULL;<br />+    uint8_t *data_buff = NULL;<br />+    ZXDH_DTB_DUMP_INDEX_T start_index = {0};<br />+    ZXDH_DTB_DUMP_INDEX_T next_start_index = {0};<br />+<br />+    rc = zxdh_np_soft_sdt_tbl_get(dev_id, eram_sdt_no, &sdt_eram);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_soft_sdt_tbl_get");<br />+<br />+    byte_num = (sdt_eram.eram_mode == ZXDH_ERAM128_TBL_64b) ? 8 : 16;<br />+    eram_table_depth = sdt_eram.eram_table_depth;<br />+    p_dump_data_arr = (ZXDH_DTB_ERAM_ENTRY_INFO_T *)rte_zmalloc(NULL, eram_table_depth *<br />+        sizeof(ZXDH_DTB_ERAM_ENTRY_INFO_T), 0);<br />+    if (p_dump_data_arr == NULL) {<br />+        PMD_DRV_LOG(ERR, "p_dump_data_arr point null!");<br />+        return ZXDH_PAR_CHK_POINT_NULL;<br />+    }<br />+<br />+    data_buff = (uint8_t *)rte_zmalloc(NULL, byte_num * eram_table_depth, 0);<br />+    if (data_buff == NULL) {<br />+        PMD_DRV_LOG(ERR, "data_buff point null!");<br />+        rte_free(p_dump_data_arr);<br />+        return ZXDH_PAR_CHK_POINT_NULL;<br />+    }<br />+<br />+    for (i = 0; i < eram_table_depth; i++) {<br />+        p_dump_data_arr[i].index = i;<br />+        p_dump_data_arr[i].p_data = (uint32_t *)(data_buff + i * byte_num);<br />+    }<br />+<br />+    start_index.index = 0;<br />+    rc = zxdh_np_dtb_eram_table_dump(dev_id,<br />+                queue_id,<br />+                eram_sdt_no,<br />+                start_index,<br />+                p_dump_data_arr,<br />+                &entry_num,<br />+                &next_start_index,<br />+                &finish_flag);<br />+<br />+    for (i = 0; i < entry_num; i++) {<br />+        valid = (p_dump_data_arr[i].p_data[0] >> 31) & 0x1;<br />+        temp_vport = p_dump_data_arr[i].p_data[0] & 0x7fffffff;<br />+        if (valid && temp_vport == vport) {<br />+            p_index_array[valid_entry_num] = i;<br />+            valid_entry_num++;<br />+        }<br />+    }<br />+<br />+    *index_num = valid_entry_num;<br />+    rte_free(data_buff);<br />+    rte_free(p_dump_data_arr);<br />+<br />+    return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_etcam_ind_data_get(uint8_t *p_in_data, uint32_t rd_mode, uint8_t *p_out_data)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+<br />+    uint32_t i = 0;<br />+    uint8_t *p_temp = NULL;<br />+    uint32_t offset = 0;<br />+    uint8_t  buff[ZXDH_ETCAM_WIDTH_MAX / 8] = {0};<br />+<br />+    p_temp = p_out_data;<br />+    rte_memcpy(buff, p_in_data, ZXDH_ETCAM_WIDTH_MAX / 8);<br />+<br />+    zxdh_np_comm_swap(buff, ZXDH_ETCAM_WIDTH_MAX / 8);<br />+<br />+    for (i = 0; i < ZXDH_ETCAM_RAM_NUM; i++) {<br />+        offset = i * (ZXDH_ETCAM_WIDTH_MIN / 8);<br />+<br />+        if ((rd_mode >> (ZXDH_ETCAM_RAM_NUM - 1 - i)) & 0x1) {<br />+            rte_memcpy(p_temp, buff + offset, ZXDH_ETCAM_WIDTH_MIN / 8);<br />+            p_temp += ZXDH_ETCAM_WIDTH_MIN / 8;<br />+        }<br />+    }<br />+<br />+    return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_acl_table_dump(uint32_t dev_id,<br />+        uint32_t queue_id,<br />+        uint32_t sdt_no,<br />+        __rte_unused ZXDH_DTB_DUMP_INDEX_T start_index,<br />+        ZXDH_DTB_ACL_ENTRY_INFO_T *p_dump_data_arr,<br />+        uint32_t *p_entry_num,<br />+        __rte_unused ZXDH_DTB_DUMP_INDEX_T *next_start_index,<br />+        uint32_t *p_finish_flag)<br />+{<br />+    uint32_t  rc = ZXDH_OK;<br />+<br />+    uint32_t i = 0;<br />+    uint32_t handle = 0;<br />+<br />+    uint32_t dump_element_id = 0;<br />+<br />+    uint8_t *temp_dump_out_data = NULL;<br />+    uint8_t *dump_info_buff = NULL;<br />+    uint8_t *p_data_start = NULL;<br />+    uint8_t *p_data_640bit = NULL;<br />+    uint8_t *p_mask_start = NULL;<br />+    uint8_t *p_mask_640bit = NULL;<br />+    uint8_t *p_rst_start = NULL;<br />+    uint8_t *p_rst_128bit = NULL;<br />+    uint32_t *eram_buff = NULL;<br />+<br />+    uint32_t addr_640bit = 0;<br />+    uint32_t rd_mask = 0;<br />+    uint32_t dump_eram_depth_128bit = 0;<br />+    uint32_t eram_row_index = 0;<br />+    uint32_t eram_col_index = 0;<br />+<br />+    uint8_t cmd_buff[ZXDH_DTB_TABLE_CMD_SIZE_BIT / 8] = {0};<br />+    uint8_t xy_data[ZXDH_ETCAM_WIDTH_MAX / 8] = {0};<br />+    uint8_t xy_mask[ZXDH_ETCAM_WIDTH_MAX / 8] = {0};<br />+    uint8_t dm_data[ZXDH_ETCAM_WIDTH_MAX / 8] = {0};<br />+    uint8_t dm_mask[ZXDH_ETCAM_WIDTH_MAX / 8] = {0};<br />+    ZXDH_ETCAM_ENTRY_T entry_xy = {0};<br />+    ZXDH_ETCAM_ENTRY_T entry_dm = {0};<br />+    ZXDH_DTB_ACL_ENTRY_INFO_T *p_dump_user_data = NULL;<br />+<br />+    uint32_t block_num = 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 etcam_table_depth = 0;<br />+    uint32_t block_idx = 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 dtb_desc_addr_offset = 0;<br />+    uint32_t dump_data_len = 0;<br />+    uint32_t dtb_desc_len = 0;<br />+<br />+    uint32_t etcam_data_len_offset = 0;<br />+    uint32_t etcam_mask_len_offset = 0;<br />+    uint32_t data_byte_size = 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 />+    ZXDH_ETCAM_DUMP_INFO_T etcam_dump_info = {0};<br />+    ZXDH_DTB_ENTRY_T   dtb_dump_entry = {0};<br />+<br />+    uint32_t shift_amount = 0;<br />+    uint32_t mask_base = 0;<br />+    uint32_t offset = 0;<br />+<br />+    dtb_dump_entry.cmd = cmd_buff;<br />+    entry_xy.p_data = xy_data;<br />+    entry_xy.p_mask = xy_mask;<br />+    entry_dm.p_data = dm_data;<br />+    entry_dm.p_mask = dm_mask;<br />+<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 />+    etcam_table_depth = sdt_etcam_info.etcam_table_depth;<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 />+    data_byte_size = ZXDH_ETCAM_ENTRY_SIZE_GET(etcam_key_mode);<br />+    if (data_byte_size > ZXDH_ETCAM_RAM_WIDTH) {<br />+        PMD_DRV_LOG(ERR, "etcam date size is over 80B!");<br />+        return ZXDH_ACL_RC_INVALID_PARA;<br />+    }<br />+<br />+    block_num = p_tbl_cfg->block_num;<br />+<br />+    rc = zxdh_np_dtb_dump_addr_set(dev_id, queue_id, sdt_no, &dump_element_id);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_dump_addr_set");<br />+<br />+    dump_info_buff = (uint8_t *)rte_zmalloc(NULL, ZXDH_DTB_TABLE_DUMP_INFO_BUFF_SIZE, 0);<br />+    if (dump_info_buff == NULL) {<br />+        PMD_DRV_LOG(ERR, "%s point null!", __func__);<br />+        return ZXDH_PAR_CHK_POINT_NULL;<br />+    }<br />+<br />+    for (i = 0; i < block_num; i++) {<br />+        block_idx = p_tbl_cfg->block_array[i];<br />+<br />+        PMD_DRV_LOG(DEBUG, "block_idx: %u", block_idx);<br />+<br />+        etcam_dump_info.block_sel = block_idx;<br />+        etcam_dump_info.addr = 0;<br />+        etcam_dump_info.tb_width = 3;<br />+        etcam_dump_info.rd_mode = 0xFF;<br />+        etcam_dump_info.tb_depth = ZXDH_ETCAM_RAM_DEPTH;<br />+        etcam_dump_info.data_or_mask = ZXDH_ETCAM_DTYPE_DATA;<br />+<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 />+        zxdh_np_dtb_data_write(dump_info_buff, dtb_desc_addr_offset, &dtb_dump_entry);<br />+<br />+        memset(cmd_buff, 0, ZXDH_DTB_TABLE_CMD_SIZE_BIT / 8);<br />+<br />+        dtb_desc_len += 1;<br />+        dtb_desc_addr_offset += ZXDH_DTB_LEN_POS_SETP;<br />+        dump_data_len += ZXDH_ETCAM_RAM_DEPTH * 640 / 8;<br />+    }<br />+<br />+    etcam_data_len_offset = dump_data_len;<br />+<br />+    for (i = 0; i < block_num; i++) {<br />+        block_idx = p_tbl_cfg->block_array[i];<br />+<br />+        PMD_DRV_LOG(DEBUG, "mask: block_idx: %u", block_idx);<br />+<br />+        etcam_dump_info.block_sel = block_idx;<br />+        etcam_dump_info.addr = 0;<br />+        etcam_dump_info.tb_width = 3;<br />+        etcam_dump_info.rd_mode = 0xFF;<br />+        etcam_dump_info.tb_depth = ZXDH_ETCAM_RAM_DEPTH;<br />+        etcam_dump_info.data_or_mask = ZXDH_ETCAM_DTYPE_MASK;<br />+<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 />+<br />+        zxdh_np_dtb_data_write(dump_info_buff, dtb_desc_addr_offset, &dtb_dump_entry);<br />+<br />+        memset(cmd_buff, 0, ZXDH_DTB_TABLE_CMD_SIZE_BIT / 8);<br />+<br />+        dtb_desc_len += 1;<br />+        dtb_desc_addr_offset += ZXDH_DTB_LEN_POS_SETP;<br />+        dump_data_len += ZXDH_ETCAM_RAM_DEPTH * 640 / 8;<br />+    }<br />+    etcam_mask_len_offset = dump_data_len;<br />+<br />+    if (as_enable) {<br />+        zxdh_np_eram_index_cal(etcam_as_mode,<br />+            etcam_table_depth, &dump_eram_depth_128bit, &eram_col_index);<br />+<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 />+                    as_eram_baddr,<br />+                    dump_eram_depth_128bit,<br />+                    as_rst_dst_phy_haddr,<br />+                    as_rst_dst_phy_laddr,<br />+                    &dtb_dump_entry);<br />+<br />+        zxdh_np_dtb_data_write(dump_info_buff, dtb_desc_addr_offset, &dtb_dump_entry);<br />+<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 += dump_eram_depth_128bit * 128 / 8;<br />+    }<br />+<br />+    temp_dump_out_data = (uint8_t *)rte_zmalloc(NULL, dump_data_len * sizeof(uint8_t), 0);<br />+    if (temp_dump_out_data == NULL) {<br />+        PMD_DRV_LOG(ERR, "temp_dump_out_data point null!");<br />+        rte_free(dump_info_buff);<br />+        return ZXDH_PAR_CHK_POINT_NULL;<br />+    }<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 />+    rte_free(dump_info_buff);<br />+<br />+    p_data_start = temp_dump_out_data;<br />+    p_mask_start = temp_dump_out_data + etcam_data_len_offset;<br />+    if (as_enable)<br />+        p_rst_start = temp_dump_out_data + etcam_mask_len_offset;<br />+<br />+    for (handle = 0; handle < etcam_table_depth; handle++) {<br />+        p_dump_user_data = p_dump_data_arr + handle;<br />+<br />+        if (p_dump_user_data == NULL ||<br />+            p_dump_user_data->key_data == NULL ||<br />+            p_dump_user_data->key_mask == NULL) {<br />+            PMD_DRV_LOG(ERR, "etcam handle 0x%x data user buff is NULL!", handle);<br />+            rte_free(temp_dump_out_data);<br />+            return ZXDH_ERR;<br />+        }<br />+<br />+        if (as_enable) {<br />+            if (p_dump_user_data->p_as_rslt == NULL) {<br />+                PMD_DRV_LOG(ERR, "handle 0x%x data buff is NULL!", handle);<br />+                rte_free(temp_dump_out_data);<br />+                return ZXDH_ERR;<br />+            }<br />+        }<br />+<br />+        p_dump_user_data->handle = handle;<br />+<br />+        shift_amount = 8U >> etcam_key_mode;<br />+        mask_base = (1U << shift_amount) - 1;<br />+        offset = shift_amount * (handle % (1U << etcam_key_mode));<br />+        rd_mask = (mask_base << offset) & 0xFF;<br />+<br />+        addr_640bit = handle / (1U << etcam_key_mode);<br />+        p_data_640bit = p_data_start + addr_640bit * 640 / 8;<br />+        p_mask_640bit = p_mask_start + addr_640bit * 640 / 8;<br />+<br />+        zxdh_np_dtb_etcam_ind_data_get(p_data_640bit, rd_mask, entry_xy.p_data);<br />+        zxdh_np_dtb_etcam_ind_data_get(p_mask_640bit, rd_mask, entry_xy.p_mask);<br />+<br />+        zxdh_np_etcam_xy_to_dm(&entry_dm, &entry_xy, data_byte_size);<br />+<br />+        rte_memcpy(p_dump_user_data->key_data, entry_dm.p_data, data_byte_size);<br />+        rte_memcpy(p_dump_user_data->key_mask, entry_dm.p_mask, data_byte_size);<br />+<br />+        if (as_enable) {<br />+            zxdh_np_eram_index_cal(etcam_as_mode,<br />+                handle, &eram_row_index, &eram_col_index);<br />+<br />+            p_rst_128bit = p_rst_start + eram_row_index * ZXDH_DTB_LEN_POS_SETP;<br />+<br />+            eram_buff = (uint32_t *)p_rst_128bit;<br />+<br />+            if (etcam_as_mode == ZXDH_ERAM128_TBL_128b)<br />+                rte_memcpy(p_dump_user_data->p_as_rslt, eram_buff, (128 / 8));<br />+            else if (etcam_as_mode == ZXDH_ERAM128_TBL_64b)<br />+                rte_memcpy(p_dump_user_data->p_as_rslt,<br />+                    eram_buff + ((1 - eram_col_index) << 1), (64 / 8));<br />+        }<br />+    }<br />+<br />+    *p_entry_num = etcam_table_depth;<br />+    *p_finish_flag = 1;<br />+<br />+    rte_free(temp_dump_out_data);<br />+<br />+    return ZXDH_OK;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_smmu0_tbl_size_get(uint32_t eram_mode)<br />+{<br />+    uint32_t size = 0;<br />+    if (eram_mode == ZXDH_ERAM128_TBL_128b)<br />+        size = 16;<br />+    else if (eram_mode == ZXDH_ERAM128_TBL_64b)<br />+        size = 8;<br />+    else if (eram_mode == ZXDH_ERAM128_TBL_32b)<br />+        size = 4;<br />+    else<br />+        size = 1;<br />+<br />+    return size;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_acl_data_get_by_handle(uint32_t dev_id,<br />+                                uint32_t queue_id,<br />+                                uint32_t sdt_no,<br />+                                uint32_t index_num,<br />+                                uint32_t *p_index_array,<br />+                                uint8_t *p_dump_data)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+    uint32_t i = 0;<br />+    uint32_t etcam_key_mode = 0;<br />+    uint32_t etcam_table_depth = 0;<br />+    uint32_t as_len = 0;<br />+    uint32_t data_byte_size = 0;<br />+    uint32_t entry_num = 0;<br />+    uint32_t finish_flag = 0;<br />+    uint8_t *data_buff = NULL;<br />+    uint8_t *mask_buff = NULL;<br />+    uint8_t *eram_buff = NULL;<br />+<br />+    ZXDH_SDT_TBL_ETCAM_T sdt_etcam_info = {0};<br />+    ZXDH_DTB_DUMP_INDEX_T start_index = {0};<br />+    ZXDH_DTB_DUMP_INDEX_T next_start_index = {0};<br />+    ZXDH_DTB_ACL_ENTRY_INFO_T *p_dtb_acl_entry = NULL;<br />+    ZXDH_DTB_ACL_ENTRY_INFO_T *p_temp_entry = NULL;<br />+    ZXDH_DTB_ACL_ENTRY_INFO_T *p_dump_entry = NULL;<br />+<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 />+    if (sdt_etcam_info.table_type != ZXDH_SDT_TBLT_ETCAM) {<br />+        PMD_DRV_LOG(ERR, "SDT[%u] table_type[ %u ] is not etcam table!",<br />+            sdt_no, sdt_etcam_info.table_type);<br />+        return ZXDH_ERR;<br />+    }<br />+<br />+    etcam_key_mode = sdt_etcam_info.etcam_key_mode;<br />+    etcam_table_depth = sdt_etcam_info.etcam_table_depth;<br />+    as_len = zxdh_np_smmu0_tbl_size_get(sdt_etcam_info.as_rsp_mode);<br />+    data_byte_size = ZXDH_ETCAM_ENTRY_SIZE_GET(etcam_key_mode);<br />+<br />+    p_dtb_acl_entry = (ZXDH_DTB_ACL_ENTRY_INFO_T *)rte_zmalloc(NULL, etcam_table_depth *<br />+        sizeof(ZXDH_DTB_ACL_ENTRY_INFO_T), 0);<br />+    if (p_dtb_acl_entry == NULL) {<br />+        PMD_DRV_LOG(ERR, "%s point null!", __func__);<br />+        return ZXDH_PAR_CHK_POINT_NULL;<br />+    }<br />+<br />+    data_buff = (uint8_t *)rte_zmalloc(NULL, etcam_table_depth * data_byte_size, 0);<br />+    if (data_buff == NULL) {<br />+        PMD_DRV_LOG(ERR, "data_buff point null!");<br />+        rte_free(p_dtb_acl_entry);<br />+        return ZXDH_PAR_CHK_POINT_NULL;<br />+    }<br />+<br />+    mask_buff = (uint8_t *)rte_zmalloc(NULL, etcam_table_depth * data_byte_size, 0);<br />+    if (mask_buff == NULL) {<br />+        PMD_DRV_LOG(ERR, "mask_buff point null!");<br />+        rte_free(data_buff);<br />+        rte_free(p_dtb_acl_entry);<br />+        return ZXDH_PAR_CHK_POINT_NULL;<br />+    }<br />+<br />+    eram_buff = (uint8_t *)rte_zmalloc(NULL, etcam_table_depth * as_len, 0);<br />+    if (eram_buff == NULL) {<br />+        PMD_DRV_LOG(ERR, "eram_buff point null!");<br />+        rte_free(mask_buff);<br />+        rte_free(data_buff);<br />+        rte_free(p_dtb_acl_entry);<br />+        return ZXDH_PAR_CHK_POINT_NULL;<br />+    }<br />+<br />+    for (i = 0; i < etcam_table_depth; i++) {<br />+        p_dtb_acl_entry[i].handle = i;<br />+        p_dtb_acl_entry[i].key_data = data_buff + i * data_byte_size;<br />+        p_dtb_acl_entry[i].key_mask = mask_buff + i * data_byte_size;<br />+        p_dtb_acl_entry[i].p_as_rslt = eram_buff + i * as_len;<br />+    }<br />+<br />+    rc = zxdh_np_dtb_acl_table_dump(dev_id,<br />+                queue_id,<br />+                sdt_no,<br />+                start_index,<br />+                p_dtb_acl_entry,<br />+                &entry_num,<br />+                &next_start_index,<br />+                &finish_flag);<br />+    if (rc != ZXDH_OK) {<br />+        PMD_DRV_LOG(ERR, "acl sdt[%u] dump fail, rc:0x%x", sdt_no, rc);<br />+        rte_free(data_buff);<br />+        rte_free(mask_buff);<br />+        rte_free(eram_buff);<br />+        rte_free(p_dtb_acl_entry);<br />+        return rc;<br />+    }<br />+<br />+    for (i = 0; i < index_num; i++) {<br />+        p_dump_entry = ((ZXDH_DTB_ACL_ENTRY_INFO_T *)p_dump_data) + i;<br />+        p_dump_entry->handle = p_index_array[i];<br />+        p_temp_entry = p_dtb_acl_entry + p_index_array[i];<br />+        rte_memcpy(p_dump_entry->key_data, p_temp_entry->key_data, data_byte_size);<br />+        rte_memcpy(p_dump_entry->key_mask, p_temp_entry->key_mask, data_byte_size);<br />+        rte_memcpy(p_dump_entry->p_as_rslt, p_temp_entry->p_as_rslt, as_len);<br />+    }<br />+<br />+    rte_free(data_buff);<br />+    rte_free(mask_buff);<br />+    rte_free(eram_buff);<br />+    rte_free(p_dtb_acl_entry);<br />+<br />+    return rc;<br />+}<br />+<br />+uint32_t<br />+zxdh_np_dtb_acl_table_dump_by_vport(uint32_t dev_id, uint32_t queue_id,<br />+    uint32_t sdt_no, uint32_t vport, uint32_t *entry_num, uint8_t *p_dump_data)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+    uint32_t index_num = 0;<br />+    uint32_t eram_sdt_no = 0;<br />+    uint32_t *p_index_array = NULL;<br />+<br />+    ZXDH_SDT_TBL_ETCAM_T sdt_etcam_info = {0};<br />+    ZXDH_SDT_TBL_ERAM_T sdt_eram = {0};<br />+<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 />+    if (sdt_etcam_info.table_type != ZXDH_SDT_TBLT_ETCAM) {<br />+        PMD_DRV_LOG(ERR, "SDT[%u] table_type[ %u ] is not etcam table!",<br />+                    sdt_no, sdt_etcam_info.table_type);<br />+        return ZXDH_ERR;<br />+    }<br />+<br />+    eram_sdt_no = zxdh_np_apt_get_sdt_partner(dev_id, sdt_no);<br />+<br />+    rc = zxdh_np_soft_sdt_tbl_get(dev_id, eram_sdt_no, &sdt_eram);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_soft_sdt_tbl_get");<br />+    if (sdt_eram.table_type != ZXDH_SDT_TBLT_ERAM) {<br />+        PMD_DRV_LOG(ERR, "SDT[%u] table_type[ %u ] is not eram table!",<br />+                    eram_sdt_no, sdt_eram.table_type);<br />+        return ZXDH_ERR;<br />+    }<br />+<br />+    p_index_array = (uint32_t *)rte_zmalloc(NULL,<br />+        sizeof(uint32_t) * sdt_eram.eram_table_depth, 0);<br />+    if (p_index_array == NULL) {<br />+        PMD_DRV_LOG(ERR, "%s point null!", __func__);<br />+        return ZXDH_PAR_CHK_POINT_NULL;<br />+    }<br />+<br />+    rc = zxdh_np_dtb_acl_index_parse(dev_id, queue_id,<br />+            eram_sdt_no, vport, &index_num, p_index_array);<br />+    if (rc != ZXDH_OK) {<br />+        rte_free(p_index_array);<br />+        PMD_DRV_LOG(ERR, "acl index parse failed");<br />+        return ZXDH_ERR;<br />+    }<br />+<br />+    if (!index_num) {<br />+        PMD_DRV_LOG(ERR, "SDT[%u] vport[0x%x] item num is zero!", sdt_no, vport);<br />+        rte_free(p_index_array);<br />+        return ZXDH_OK;<br />+    }<br />+<br />+    rc = zxdh_np_dtb_acl_data_get_by_handle(dev_id, queue_id, sdt_no,<br />+                index_num, p_index_array, p_dump_data);<br />+    if (rc != ZXDH_OK) {<br />+        rte_free(p_index_array);<br />+        PMD_DRV_LOG(ERR, "acl date by handle failed");<br />+        return ZXDH_ERR;<br />+    }<br />+<br />+    *entry_num = index_num;<br />+    rte_free(p_index_array);<br />+<br />+    return ZXDH_OK;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_acl_dma_insert_cycle(uint32_t dev_id,<br />+                uint32_t queue_id,<br />+                uint32_t sdt_no,<br />+                uint32_t entry_num,<br />+                ZXDH_DTB_ACL_ENTRY_INFO_T *p_acl_entry_arr,<br />+                uint32_t *element_id)<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 block_idx = 0;<br />+    uint32_t ram_addr = 0;<br />+    uint32_t etcam_wr_mode = 0;<br />+    uint32_t eram_wrt_mode = 0;<br />+    uint32_t eram_index = 0;<br />+<br />+    uint32_t item_cnt = 0;<br />+    uint32_t addr_offset_bk = 0;<br />+    uint32_t dtb_len = 0;<br />+    uint32_t as_addr_offset = 0;<br />+    uint32_t as_dtb_len = 0;<br />+<br />+    ZXDH_ACL_CFG_EX_T *p_acl_cfg = NULL;<br />+    ZXDH_ACL_TBL_CFG_T *p_tbl_cfg = NULL;<br />+    ZXDH_DTB_ACL_ENTRY_INFO_T *p_acl_entry = NULL;<br />+    uint32_t *p_as_eram_data = NULL;<br />+    uint8_t *table_data_buff = NULL;<br />+    ZXDH_ETCAM_ENTRY_T etcam_entry = {0};<br />+<br />+    uint8_t entry_data_buff[ZXDH_ETCAM_WIDTH_MAX / 8] = {0};<br />+    uint8_t entry_mask_buff[ZXDH_ETCAM_WIDTH_MAX / 8] = {0};<br />+    uint32_t as_eram_data_buff[4] = {0};<br />+    uint8_t entry_data_cmd_buff[ZXDH_DTB_TABLE_CMD_SIZE_BIT / 8] = {0};<br />+    uint8_t entry_mask_cmd_buff[ZXDH_DTB_TABLE_CMD_SIZE_BIT / 8] = {0};<br />+    uint8_t as_eram_cmd_buff[ZXDH_DTB_TABLE_CMD_SIZE_BIT / 8] = {0};<br />+<br />+    ZXDH_SDT_TBL_ETCAM_T sdt_etcam_info = {0};<br />+<br />+    ZXDH_DTB_ENTRY_T entry_data = {0};<br />+    ZXDH_DTB_ENTRY_T entry_mask = {0};<br />+    ZXDH_DTB_ENTRY_T dtb_as_data_entry = {0};<br />+<br />+    entry_data.cmd = entry_data_cmd_buff;<br />+    entry_data.data = (uint8_t *)entry_data_buff;<br />+<br />+    entry_mask.cmd = entry_mask_cmd_buff;<br />+    entry_mask.data = (uint8_t *)entry_mask_buff;<br />+<br />+    dtb_as_data_entry.cmd = as_eram_cmd_buff;<br />+    dtb_as_data_entry.data = (uint8_t *)as_eram_data_buff;<br />+<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_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 />+    if (as_enable) {<br />+        switch (etcam_as_mode) {<br />+        case ZXDH_ERAM128_TBL_128b:<br />+            eram_wrt_mode = ZXDH_ERAM128_OPR_128b;<br />+            break;<br />+        case ZXDH_ERAM128_TBL_64b:<br />+            eram_wrt_mode = ZXDH_ERAM128_OPR_64b;<br />+            break;<br />+        case ZXDH_ERAM128_TBL_1b:<br />+            eram_wrt_mode = ZXDH_ERAM128_OPR_1b;<br />+            break;<br />+<br />+        default:<br />+            PMD_DRV_LOG(ERR, "etcam_as_mode is invalid!");<br />+            return ZXDH_ERR;<br />+        }<br />+    }<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 />+    table_data_buff = (uint8_t *)rte_zmalloc(NULL, ZXDH_DTB_TABLE_DATA_BUFF_SIZE, 0);<br />+    if (table_data_buff == NULL) {<br />+        PMD_DRV_LOG(ERR, "%s point null!", __func__);<br />+        return ZXDH_PAR_CHK_POINT_NULL;<br />+    }<br />+<br />+    for (item_cnt = 0; item_cnt < entry_num; ++item_cnt) {<br />+        p_acl_entry = p_acl_entry_arr + item_cnt;<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 />+        zxdh_np_acl_hdw_addr_get(p_tbl_cfg, p_acl_entry->handle,<br />+            &block_idx, &ram_addr, &etcam_wr_mode);<br />+<br />+        zxdh_np_dtb_etcam_entry_add(dev_id,<br />+                ram_addr,<br />+                block_idx,<br />+                etcam_wr_mode,<br />+                ZXDH_ETCAM_OPR_DM,<br />+                &etcam_entry,<br />+                &entry_data,<br />+                &entry_mask);<br />+<br />+        dtb_len += ZXDH_DTB_ETCAM_LEN_SIZE;<br />+        zxdh_np_dtb_data_write(table_data_buff, addr_offset_bk, &entry_data);<br />+<br />+        memset(entry_data_cmd_buff, 0, ZXDH_DTB_TABLE_CMD_SIZE_BIT / 8);<br />+        memset(entry_data_buff, 0, ZXDH_ETCAM_WIDTH_MAX / 8);<br />+        addr_offset_bk = addr_offset_bk + ZXDH_DTB_ETCAM_LEN_SIZE * ZXDH_DTB_LEN_POS_SETP;<br />+<br />+        dtb_len += ZXDH_DTB_ETCAM_LEN_SIZE;<br />+        zxdh_np_dtb_data_write(table_data_buff, addr_offset_bk, &entry_mask);<br />+<br />+        memset(entry_mask_cmd_buff, 0, ZXDH_DTB_TABLE_CMD_SIZE_BIT / 8);<br />+        memset(entry_mask_buff, 0, ZXDH_ETCAM_WIDTH_MAX / 8);<br />+        addr_offset_bk = addr_offset_bk + ZXDH_DTB_ETCAM_LEN_SIZE * ZXDH_DTB_LEN_POS_SETP;<br />+<br />+        if (as_enable) {<br />+            p_as_eram_data = (uint32_t *)(p_acl_entry->p_as_rslt);<br />+<br />+            zxdh_np_dtb_se_smmu0_ind_write(dev_id,<br />+                    as_eram_baddr,<br />+                    eram_index,<br />+                    eram_wrt_mode,<br />+                    p_as_eram_data,<br />+                    &dtb_as_data_entry);<br />+<br />+            switch (eram_wrt_mode) {<br />+            case ZXDH_ERAM128_OPR_128b:<br />+                as_dtb_len = 2;<br />+                as_addr_offset = ZXDH_DTB_LEN_POS_SETP * 2;<br />+                break;<br />+            case ZXDH_ERAM128_OPR_64b:<br />+                as_dtb_len = 1;<br />+                as_addr_offset = ZXDH_DTB_LEN_POS_SETP;<br />+                break;<br />+            case ZXDH_ERAM128_OPR_1b:<br />+                as_dtb_len = 1;<br />+                as_addr_offset = ZXDH_DTB_LEN_POS_SETP;<br />+                break;<br />+            }<br />+<br />+            zxdh_np_dtb_data_write(table_data_buff,<br />+                addr_offset_bk, &dtb_as_data_entry);<br />+            addr_offset_bk = addr_offset_bk + as_addr_offset;<br />+            dtb_len += as_dtb_len;<br />+<br />+            memset(as_eram_cmd_buff, 0, ZXDH_DTB_TABLE_CMD_SIZE_BIT / 8);<br />+            memset(as_eram_data_buff, 0, 4 * sizeof(uint32_t));<br />+        }<br />+    }<br />+<br />+    rc = zxdh_np_dtb_write_down_table_data(dev_id,<br />+                queue_id,<br />+                dtb_len * 16,<br />+                table_data_buff,<br />+                element_id);<br />+    rte_free(table_data_buff);<br />+<br />+    rc = zxdh_np_dtb_tab_down_success_status_check(dev_id, queue_id, *element_id);<br />+<br />+    return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_acl_dma_insert(uint32_t dev_id,<br />+        uint32_t queue_id,<br />+        uint32_t sdt_no,<br />+        uint32_t entry_num,<br />+        ZXDH_DTB_ACL_ENTRY_INFO_T *p_acl_entry_arr,<br />+        uint32_t *element_id)<br />+{<br />+    uint32_t  rc = ZXDH_OK;<br />+    uint32_t as_enable;<br />+    uint32_t etcam_as_mode;<br />+    uint32_t entry_num_max = 0;<br />+    uint32_t entry_cycle = 0;<br />+    uint32_t entry_remains = 0;<br />+    uint32_t i = 0;<br />+    ZXDH_DTB_ACL_ENTRY_INFO_T *p_entry = NULL;<br />+<br />+    ZXDH_SDT_TBL_ETCAM_T sdt_etcam_info = {0};<br />+<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_dtb_data_write");<br />+<br />+    as_enable = sdt_etcam_info.as_en;<br />+    etcam_as_mode = sdt_etcam_info.as_rsp_mode;<br />+<br />+    if (!as_enable) {<br />+        entry_num_max = 0x55;<br />+    } else {<br />+        if (etcam_as_mode == ZXDH_ERAM128_TBL_128b)<br />+            entry_num_max = 0x49;<br />+        else<br />+            entry_num_max = 0x4e;<br />+    }<br />+<br />+    entry_cycle = entry_num / entry_num_max;<br />+    entry_remains = entry_num % entry_num_max;<br />+<br />+    for (i = 0; i < entry_cycle; ++i) {<br />+        p_entry = p_acl_entry_arr + entry_num_max * i;<br />+        rc = zxdh_np_dtb_acl_dma_insert_cycle(dev_id,<br />+                    queue_id,<br />+                    sdt_no,<br />+                    entry_num_max,<br />+                    p_entry,<br />+                    element_id);<br />+        ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_acl_dma_insert_cycle");<br />+    }<br />+<br />+    if (entry_remains) {<br />+        p_entry = p_acl_entry_arr + entry_num_max * entry_cycle;<br />+        rc = zxdh_np_dtb_acl_dma_insert_cycle(dev_id,<br />+                    queue_id,<br />+                    sdt_no,<br />+                    entry_remains,<br />+                    p_entry,<br />+                    element_id);<br />+        ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_acl_dma_insert_cycle");<br />+    }<br />+<br />+    return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_acl_data_clear(uint32_t dev_id, uint32_t queue_id,<br />+    uint32_t sdt_no, uint32_t index_num, uint32_t *p_index_array)<br />+{<br />+    uint32_t  rc = ZXDH_OK;<br />+<br />+    uint32_t data_byte_size = 0;<br />+    uint32_t index = 0;<br />+    uint32_t etcam_key_mode = 0;<br />+    uint32_t as_enable = 0;<br />+    uint32_t element_id = 0;<br />+<br />+    ZXDH_SDT_TBL_ETCAM_T sdt_etcam_info = {0};<br />+    ZXDH_DTB_ACL_ENTRY_INFO_T *p_entry_arr = NULL;<br />+<br />+    uint8_t *data_buff = NULL;<br />+    uint8_t *mask_buff = NULL;<br />+    uint32_t *eram_buff = NULL;<br />+<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 />+<br />+    etcam_key_mode = sdt_etcam_info.etcam_key_mode;<br />+    as_enable = sdt_etcam_info.as_en;<br />+    data_byte_size = ZXDH_ETCAM_ENTRY_SIZE_GET(etcam_key_mode);<br />+<br />+    p_entry_arr = (ZXDH_DTB_ACL_ENTRY_INFO_T *)rte_zmalloc(NULL, index_num *<br />+        sizeof(ZXDH_DTB_ACL_ENTRY_INFO_T), 0);<br />+    if (p_entry_arr == NULL) {<br />+        PMD_DRV_LOG(ERR, "%s point null!", __func__);<br />+        return ZXDH_PAR_CHK_POINT_NULL;<br />+    }<br />+<br />+    data_buff = (uint8_t *)rte_zmalloc(NULL, data_byte_size, 0);<br />+    if (data_buff == NULL) {<br />+        PMD_DRV_LOG(ERR, "data_buff point null!");<br />+        rte_free(p_entry_arr);<br />+        return ZXDH_PAR_CHK_POINT_NULL;<br />+    }<br />+<br />+    mask_buff = (uint8_t *)rte_zmalloc(NULL, data_byte_size, 0);<br />+    if (mask_buff == NULL) {<br />+        PMD_DRV_LOG(ERR, "mask_buff point null!");<br />+        rte_free(data_buff);<br />+        rte_free(p_entry_arr);<br />+        return ZXDH_PAR_CHK_POINT_NULL;<br />+    }<br />+<br />+    if (as_enable) {<br />+        eram_buff = (uint32_t *)rte_zmalloc(NULL, 4 * sizeof(uint32_t), 0);<br />+        if (eram_buff == NULL) {<br />+            PMD_DRV_LOG(ERR, "eram_buff point null!");<br />+            rte_free(mask_buff);<br />+            rte_free(data_buff);<br />+            rte_free(p_entry_arr);<br />+            return ZXDH_PAR_CHK_POINT_NULL;<br />+        }<br />+        memset(eram_buff, 0, 4 * sizeof(uint32_t));<br />+    }<br />+<br />+    for (index = 0; index < index_num; index++) {<br />+        p_entry_arr[index].handle = p_index_array[index];<br />+        p_entry_arr[index].key_data = data_buff;<br />+        p_entry_arr[index].key_mask = mask_buff;<br />+<br />+        if (as_enable)<br />+            p_entry_arr[index].p_as_rslt = (uint8_t *)eram_buff;<br />+    }<br />+<br />+    rc = zxdh_np_dtb_acl_dma_insert(dev_id,<br />+                queue_id,<br />+                sdt_no,<br />+                index_num,<br />+                p_entry_arr,<br />+                &element_id);<br />+    rte_free(data_buff);<br />+    rte_free(mask_buff);<br />+    if (eram_buff)<br />+        rte_free(eram_buff);<br />+<br />+    rte_free(p_entry_arr);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_acl_dma_insert");<br />+<br />+    return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_acl_index_release_by_vport(uint32_t dev_id,<br />+                uint32_t sdt_no, uint32_t vport)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+    uint32_t eram_sdt_no = 0;<br />+    ZXDH_SPINLOCK_T *p_dtb_spinlock = NULL;<br />+    ZXDH_DEV_SPINLOCK_TYPE_E spinlock = ZXDH_DEV_SPINLOCK_T_DTB;<br />+    ZXDH_SDT_TBL_ETCAM_T sdt_acl = {0};<br />+    ZXDH_SDT_TBL_ERAM_T sdt_eram = {0};<br />+<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 />+    if (sdt_acl.table_type != ZXDH_SDT_TBLT_ETCAM) {<br />+        PMD_DRV_LOG(ERR, "SDT[%u] table_type[ %u ] is not etcam table!",<br />+            sdt_no, sdt_acl.table_type);<br />+        return ZXDH_ERR;<br />+    }<br />+<br />+    eram_sdt_no = zxdh_np_apt_get_sdt_partner(dev_id, sdt_no);<br />+<br />+    rc = zxdh_np_soft_sdt_tbl_get(dev_id, eram_sdt_no, &sdt_eram);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_soft_sdt_tbl_get");<br />+    if (sdt_eram.table_type != ZXDH_SDT_TBLT_ERAM) {<br />+        PMD_DRV_LOG(ERR, "SDT[%u] table_type[ %u ] is not eram table!",<br />+            eram_sdt_no, sdt_eram.table_type);<br />+        return ZXDH_ERR;<br />+    }<br />+<br />+    rc = zxdh_np_dev_opr_spinlock_get(dev_id, (uint32_t)spinlock, &p_dtb_spinlock);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dev_opr_spinlock_get");<br />+<br />+    rte_spinlock_lock(&p_dtb_spinlock->spinlock);<br />+<br />+    rc = zxdh_np_agent_channel_acl_index_release(dev_id,<br />+        ZXDH_ACL_INDEX_VPORT_REL, sdt_no, vport, 0);<br />+    if (rc == ZXDH_ACL_RC_SRH_FAIL)<br />+        PMD_DRV_LOG(ERR, "ACL_INDEX_VPORT_REL[vport:0x%x] index is not exist.", vport);<br />+<br />+    rte_spinlock_unlock(&p_dtb_spinlock->spinlock);<br />+<br />+    return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_smmu0_data_write_cycle(uint32_t dev_id,<br />+            uint32_t queue_id,<br />+            uint32_t smmu0_base_addr,<br />+            uint32_t smmu0_wr_mode,<br />+            uint32_t entry_num,<br />+            ZXDH_DTB_ERAM_ENTRY_INFO_T *p_entry_arr,<br />+            uint32_t *element_id)<br />+{<br />+    uint32_t  rc = ZXDH_OK;<br />+<br />+    uint32_t item_cnt = 0;<br />+    uint32_t addr_offset = 0;<br />+    uint32_t dtb_len = 0;<br />+    uint32_t index = 0;<br />+<br />+    uint32_t *p_entry_data = NULL;<br />+    uint8_t *table_data_buff = NULL;<br />+    uint32_t entry_data_buff[4] = {0};<br />+    uint8_t cmd_buff[ZXDH_DTB_TABLE_CMD_SIZE_BIT / 8] = {0};<br />+    ZXDH_DTB_ENTRY_T   dtb_one_entry = {0};<br />+<br />+    table_data_buff = (uint8_t *)rte_zmalloc(NULL, ZXDH_DTB_TABLE_DATA_BUFF_SIZE, 0);<br />+    if (table_data_buff == NULL) {<br />+        PMD_DRV_LOG(ERR, "%s point null!", __func__);<br />+        return ZXDH_PAR_CHK_POINT_NULL;<br />+    }<br />+<br />+    dtb_one_entry.cmd = cmd_buff;<br />+    dtb_one_entry.data = (uint8_t *)entry_data_buff;<br />+<br />+    for (item_cnt = 0; item_cnt < entry_num; ++item_cnt) {<br />+        p_entry_data = (uint32_t *)p_entry_arr[item_cnt].p_data;<br />+        index = p_entry_arr[item_cnt].index;<br />+<br />+        rc = zxdh_np_dtb_se_smmu0_ind_write(dev_id,<br />+                    smmu0_base_addr,<br />+                    index,<br />+                    smmu0_wr_mode,<br />+                    p_entry_data,<br />+                    &dtb_one_entry);<br />+<br />+        switch (smmu0_wr_mode) {<br />+        case ZXDH_ERAM128_OPR_128b:<br />+            dtb_len += 2;<br />+            addr_offset = item_cnt * ZXDH_DTB_LEN_POS_SETP * 2;<br />+            break;<br />+        case ZXDH_ERAM128_OPR_64b:<br />+            dtb_len += 1;<br />+            addr_offset = item_cnt * ZXDH_DTB_LEN_POS_SETP;<br />+            break;<br />+        case ZXDH_ERAM128_OPR_1b:<br />+            dtb_len += 1;<br />+            addr_offset = item_cnt * ZXDH_DTB_LEN_POS_SETP;<br />+            break;<br />+        }<br />+<br />+        zxdh_np_dtb_data_write(table_data_buff, addr_offset, &dtb_one_entry);<br />+        memset(cmd_buff, 0, ZXDH_DTB_TABLE_CMD_SIZE_BIT / 8);<br />+        memset(entry_data_buff,    0, 4 * sizeof(uint32_t));<br />+    }<br />+<br />+    rc = zxdh_np_dtb_write_down_table_data(dev_id,<br />+                    queue_id,<br />+                    dtb_len * 16,<br />+                    table_data_buff,<br />+                    element_id);<br />+    rte_free(table_data_buff);<br />+<br />+    rc = zxdh_np_dtb_tab_down_success_status_check(dev_id, queue_id, *element_id);<br />+<br />+    return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_smmu0_data_write(uint32_t dev_id,<br />+            uint32_t queue_id,<br />+            uint32_t smmu0_base_addr,<br />+            uint32_t smmu0_wr_mode,<br />+            uint32_t entry_num,<br />+            ZXDH_DTB_ERAM_ENTRY_INFO_T *p_entry_arr,<br />+            uint32_t *element_id)<br />+{<br />+    uint32_t  rc = ZXDH_OK;<br />+<br />+    uint32_t i = 0;<br />+    uint32_t entry_num_max = 0;<br />+    uint32_t entry_cycle = 0;<br />+    uint32_t entry_remains = 0;<br />+<br />+    ZXDH_DTB_ERAM_ENTRY_INFO_T *p_entry = NULL;<br />+<br />+    switch (smmu0_wr_mode) {<br />+    case ZXDH_ERAM128_OPR_128b:<br />+        entry_num_max = 0x1ff;<br />+        break;<br />+    case ZXDH_ERAM128_OPR_64b:<br />+        entry_num_max = 0x3ff;<br />+        break;<br />+    case ZXDH_ERAM128_OPR_1b:<br />+        entry_num_max = 0x3ff;<br />+        break;<br />+    }<br />+<br />+    entry_cycle = entry_num / entry_num_max;<br />+    entry_remains = entry_num % entry_num_max;<br />+<br />+    for (i = 0; i < entry_cycle; ++i) {<br />+        p_entry = p_entry_arr + entry_num_max * i;<br />+        rc = zxdh_np_dtb_smmu0_data_write_cycle(dev_id,<br />+                            queue_id,<br />+                            smmu0_base_addr,<br />+                            smmu0_wr_mode,<br />+                            entry_num_max,<br />+                            p_entry,<br />+                            element_id);<br />+        ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_smmu0_data_write_cycle");<br />+    }<br />+<br />+    if (entry_remains) {<br />+        p_entry = p_entry_arr + entry_num_max * entry_cycle;<br />+        rc = zxdh_np_dtb_smmu0_data_write_cycle(dev_id,<br />+                            queue_id,<br />+                            smmu0_base_addr,<br />+                            smmu0_wr_mode,<br />+                            entry_remains,<br />+                            p_entry,<br />+                            element_id);<br />+        ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_smmu0_data_write_cycle");<br />+    }<br />+<br />+    return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_eram_dma_write(uint32_t dev_id,<br />+            uint32_t queue_id,<br />+            uint32_t sdt_no,<br />+            uint32_t entry_num,<br />+            ZXDH_DTB_ERAM_ENTRY_INFO_T *p_entry_arr,<br />+            uint32_t *element_id)<br />+{<br />+    uint32_t  rc = ZXDH_OK;<br />+<br />+    uint32_t wrt_mode;<br />+    uint32_t base_addr;<br />+<br />+    ZXDH_SDT_TBL_ERAM_T sdt_eram_info = {0};<br />+<br />+    rc = zxdh_np_soft_sdt_tbl_get(dev_id, sdt_no, &sdt_eram_info);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_soft_sdt_tbl_get");<br />+    base_addr = sdt_eram_info.eram_base_addr;<br />+    wrt_mode = sdt_eram_info.eram_mode;<br />+<br />+    switch (wrt_mode) {<br />+    case ZXDH_ERAM128_TBL_128b:<br />+        wrt_mode = ZXDH_ERAM128_OPR_128b;<br />+        break;<br />+    case ZXDH_ERAM128_TBL_64b:<br />+        wrt_mode = ZXDH_ERAM128_OPR_64b;<br />+        break;<br />+    case ZXDH_ERAM128_TBL_1b:<br />+        wrt_mode = ZXDH_ERAM128_OPR_1b;<br />+        break;<br />+    }<br />+<br />+    rc = zxdh_np_dtb_smmu0_data_write(dev_id,<br />+                    queue_id,<br />+                    base_addr,<br />+                    wrt_mode,<br />+                    entry_num,<br />+                    p_entry_arr,<br />+                    element_id);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_smmu0_data_write");<br />+<br />+    return ZXDH_OK;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_eram_data_clear(uint32_t dev_id,<br />+            uint32_t queue_id,<br />+            uint32_t sdt_no,<br />+            uint32_t index_num,<br />+            uint32_t *p_index_array)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+    uint32_t element_id = 0;<br />+    uint32_t i = 0;<br />+<br />+    ZXDH_DTB_ERAM_ENTRY_INFO_T *p_eram_data_arr = NULL;<br />+    uint8_t *data_buff = NULL;<br />+<br />+    p_eram_data_arr = (ZXDH_DTB_ERAM_ENTRY_INFO_T *)rte_zmalloc(NULL, index_num *<br />+        sizeof(ZXDH_DTB_ERAM_ENTRY_INFO_T), 0);<br />+    if (p_eram_data_arr == NULL) {<br />+        PMD_DRV_LOG(ERR, "%s point null!", __func__);<br />+        return ZXDH_PAR_CHK_POINT_NULL;<br />+    }<br />+<br />+    data_buff = (uint8_t *)rte_zmalloc(NULL, 4 * sizeof(uint32_t), 0);<br />+    if (data_buff == NULL) {<br />+        PMD_DRV_LOG(ERR, "data_buff point null!");<br />+        rte_free(p_eram_data_arr);<br />+        return ZXDH_PAR_CHK_POINT_NULL;<br />+    }<br />+<br />+    for (i = 0; i < index_num; i++) {<br />+        p_eram_data_arr[i].index = p_index_array[i];<br />+        p_eram_data_arr[i].p_data = (uint32_t *)data_buff;<br />+    }<br />+<br />+    rc = zxdh_np_dtb_eram_dma_write(dev_id, queue_id,<br />+        sdt_no, index_num, p_eram_data_arr, &element_id);<br />+    rte_free(data_buff);<br />+    rte_free(p_eram_data_arr);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_eram_dma_write");<br />+<br />+    return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_eram_stat_data_clear(uint32_t dev_id,<br />+        uint32_t queue_id,<br />+        uint32_t counter_id,<br />+        ZXDH_STAT_CNT_MODE_E rd_mode,<br />+        uint32_t index_num,<br />+        uint32_t *p_index_array)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+    uint32_t element_id = 0;<br />+    uint32_t i = 0;<br />+    uint32_t wrt_mode = 0;<br />+    uint32_t start_addr = 0;<br />+    uint32_t counter_id_128bit = 0;<br />+<br />+    ZXDH_PPU_STAT_CFG_T stat_cfg = {0};<br />+    ZXDH_DTB_ERAM_ENTRY_INFO_T *p_eram_data_arr = NULL;<br />+    uint8_t *data_buff = NULL;<br />+<br />+    zxdh_np_stat_cfg_soft_get(dev_id, &stat_cfg);<br />+<br />+    p_eram_data_arr = (ZXDH_DTB_ERAM_ENTRY_INFO_T *)rte_zmalloc(NULL, index_num *<br />+        sizeof(ZXDH_DTB_ERAM_ENTRY_INFO_T), 0);<br />+    if (p_eram_data_arr == NULL) {<br />+        PMD_DRV_LOG(ERR, "%s point null!", __func__);<br />+        return ZXDH_PAR_CHK_POINT_NULL;<br />+    }<br />+<br />+    data_buff = (uint8_t *)rte_zmalloc(NULL, 4 * sizeof(uint32_t), 0);<br />+    if (data_buff == NULL) {<br />+        PMD_DRV_LOG(ERR, "data_buff point null!");<br />+        rte_free(p_eram_data_arr);<br />+        return ZXDH_PAR_CHK_POINT_NULL;<br />+    }<br />+<br />+    for (i = 0; i < index_num; i++) {<br />+        p_eram_data_arr[i].index = p_index_array[i];<br />+        p_eram_data_arr[i].p_data = (uint32_t *)data_buff;<br />+    }<br />+<br />+    wrt_mode = (rd_mode == ZXDH_STAT_128_MODE) ? ZXDH_ERAM128_OPR_128b : ZXDH_ERAM128_OPR_64b;<br />+    counter_id_128bit = (rd_mode == ZXDH_STAT_128_MODE) ? counter_id : (counter_id >> 1);<br />+    start_addr = stat_cfg.eram_baddr + counter_id_128bit;<br />+    rc = zxdh_np_dtb_smmu0_data_write(dev_id,<br />+                    queue_id,<br />+                    start_addr,<br />+                    wrt_mode,<br />+                    index_num,<br />+                    p_eram_data_arr,<br />+                    &element_id);<br />+    rte_free(data_buff);<br />+    rte_free(p_eram_data_arr);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_smmu0_data_write");<br />+<br />+    return rc;<br />+}<br />+<br />+uint32_t<br />+zxdh_np_dtb_acl_offline_delete(uint32_t dev_id, uint32_t queue_id,<br />+    uint32_t sdt_no, uint32_t vport, uint32_t counter_id, uint32_t rd_mode)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+    uint32_t index_num = 0;<br />+    uint32_t eram_sdt_no = 0;<br />+    uint32_t *p_index_array = NULL;<br />+<br />+    ZXDH_SDT_TBL_ETCAM_T sdt_acl = {0};<br />+    ZXDH_SDT_TBL_ERAM_T sdt_eram = {0};<br />+<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 />+    if (sdt_acl.table_type != ZXDH_SDT_TBLT_ETCAM) {<br />+        PMD_DRV_LOG(ERR, "SDT[%u] table_type[ %u ] is not etcam table!",<br />+            sdt_no, sdt_acl.table_type);<br />+        return ZXDH_ERR;<br />+    }<br />+<br />+    eram_sdt_no = zxdh_np_apt_get_sdt_partner(dev_id, sdt_no);<br />+<br />+    rc = zxdh_np_soft_sdt_tbl_get(dev_id, eram_sdt_no, &sdt_eram);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_soft_sdt_tbl_get");<br />+    if (sdt_eram.table_type != ZXDH_SDT_TBLT_ERAM) {<br />+        PMD_DRV_LOG(ERR, "SDT[%u] table_type[ %u ] is not eram table!",<br />+            eram_sdt_no, sdt_eram.table_type);<br />+        return ZXDH_ERR;<br />+    }<br />+<br />+    p_index_array = (uint32_t *)rte_zmalloc(NULL,<br />+        sizeof(uint32_t) * sdt_eram.eram_table_depth, 0);<br />+    if (p_index_array == NULL) {<br />+        PMD_DRV_LOG(ERR, "%s point null!", __func__);<br />+        return ZXDH_PAR_CHK_POINT_NULL;<br />+    }<br />+<br />+    rc = zxdh_np_dtb_acl_index_parse(dev_id, queue_id,<br />+            eram_sdt_no, vport, &index_num, p_index_array);<br />+    if (rc != ZXDH_OK) {<br />+        rte_free(p_index_array);<br />+        PMD_DRV_LOG(ERR, "acl index parse failed");<br />+        return ZXDH_ERR;<br />+    }<br />+<br />+    if (!index_num) {<br />+        PMD_DRV_LOG(ERR, "SDT[%u] vport[0x%x] item num is zero!", sdt_no, vport);<br />+        rte_free(p_index_array);<br />+        return ZXDH_OK;<br />+    }<br />+<br />+    rc = zxdh_np_dtb_acl_data_clear(dev_id, queue_id, sdt_no, index_num, p_index_array);<br />+    rc = zxdh_np_dtb_eram_data_clear(dev_id, queue_id, eram_sdt_no, index_num, p_index_array);<br />+    rc = zxdh_np_dtb_eram_stat_data_clear(dev_id, queue_id,<br />+            counter_id, rd_mode, index_num, p_index_array);<br />+    rte_free(p_index_array);<br />+<br />+    rc = zxdh_np_dtb_acl_index_release_by_vport(dev_id, sdt_no, vport);<br />+<br />+    return rc;<br />+}<br />diff --git a/drivers/net/zxdh/zxdh_np.h b/drivers/net/zxdh/zxdh_np.h<br />index 1b8f17474d..e3457a8c90 100644<br />--- a/drivers/net/zxdh/zxdh_np.h<br />+++ b/drivers/net/zxdh/zxdh_np.h<br />@@ -1751,6 +1751,15 @@ typedef enum zxdh_profile_type {<br />     CAR_MAX<br /> } ZXDH_PROFILE_TYPE;<br />  <br />+typedef enum zxdh_msg_acl_index_oper_e {<br />+    ZXDH_ACL_INDEX_REQUEST    = 0,<br />+    ZXDH_ACL_INDEX_RELEASE    = 1,<br />+    ZXDH_ACL_INDEX_VPORT_REL  = 2,<br />+    ZXDH_ACL_INDEX_ALL_REL    = 3,<br />+    ZXDH_ACL_INDEX_STAT_CLR   = 4,<br />+    ZXDH_ACL_INDEX_MAX<br />+} ZXDH_MSG_ACL_INDEX_OPER_E;<br />+<br /> typedef struct __rte_aligned(2) zxdh_version_compatible_reg_t {<br />     uint8_t version_compatible_item;<br />     uint8_t major;<br />@@ -1915,6 +1924,18 @@ typedef struct zxdh_dtb_dump_index_t {<br />     uint32_t index_type;<br /> } ZXDH_DTB_DUMP_INDEX_T;<br />  <br />+typedef struct __rte_aligned(2) zxdh_agent_channel_acl_msg_t {<br />+    uint8_t dev_id;<br />+    uint8_t type;<br />+    uint8_t oper;<br />+    uint8_t rsv;<br />+    uint32_t sdt_no;<br />+    uint32_t vport;<br />+    uint32_t index;<br />+    uint32_t counter_id;<br />+    uint32_t rd_mode;<br />+} ZXDH_AGENT_CHANNEL_ACL_MSG_T;<br />+<br /> int zxdh_np_host_init(uint32_t dev_id, ZXDH_DEV_INIT_CTRL_T *p_dev_init_ctrl);<br /> int zxdh_np_online_uninit(uint32_t dev_id, char *port_name, uint32_t queue_id);<br /> int zxdh_np_dtb_table_entry_write(uint32_t dev_id, uint32_t queue_id,<br />@@ -1958,5 +1979,13 @@ uint32_t zxdh_np_dtb_hash_offline_delete(uint32_t dev_id,<br />                         uint32_t queue_id,<br />                         uint32_t sdt_no,<br />                         __rte_unused uint32_t flush_mode);<br />-<br />+uint32_t zxdh_np_dtb_acl_index_request(uint32_t dev_id,<br />+    uint32_t sdt_no, uint32_t vport, uint32_t *p_index);<br />+<br />+uint32_t zxdh_np_dtb_acl_index_release(uint32_t dev_id,<br />+    uint32_t sdt_no, uint32_t vport, uint32_t index);<br />+uint32_t zxdh_np_dtb_acl_table_dump_by_vport(uint32_t dev_id, uint32_t queue_id,<br />+    uint32_t sdt_no, uint32_t vport, uint32_t *entry_num, uint8_t *p_dump_data);<br />+uint32_t zxdh_np_dtb_acl_offline_delete(uint32_t dev_id, uint32_t queue_id,<br />+    uint32_t sdt_no, uint32_t vport, uint32_t counter_id, uint32_t rd_mode);<br /> #endif /* ZXDH_NP_H */<br />--  <br />2.27.0<br />