Modify the implementation of the dtb queue<br />request and release interfaces,<br />and add the implementation of queue initialization.<br /> <br />Signed-off-by: Bingbin Chen <chen.bingbin@zte.com.cn> <br />---<br /> drivers/net/zxdh/zxdh_np.c | 491 +++++++++++++++++++++++++++++--------<br /> drivers/net/zxdh/zxdh_np.h |  97 ++++++++<br /> 2 files changed, 482 insertions(+), 106 deletions(-)<br /> <br />diff --git a/drivers/net/zxdh/zxdh_np.c b/drivers/net/zxdh/zxdh_np.c<br />index 00e02cb36f..3f5d286ffe 100644<br />--- a/drivers/net/zxdh/zxdh_np.c<br />+++ b/drivers/net/zxdh/zxdh_np.c<br />@@ -17,16 +17,15 @@<br />  <br /> static ZXDH_DEV_MGR_T g_dev_mgr;<br /> static ZXDH_SDT_MGR_T g_sdt_mgr;<br />-static uint32_t g_dpp_dtb_int_enable;<br /> static uint32_t g_table_type[ZXDH_DEV_CHANNEL_MAX][ZXDH_DEV_SDT_ID_MAX];<br /> static ZXDH_PPU_CLS_BITMAP_T g_ppu_cls_bit_map[ZXDH_DEV_CHANNEL_MAX];<br /> static ZXDH_DTB_MGR_T *p_dpp_dtb_mgr[ZXDH_DEV_CHANNEL_MAX];<br />-static ZXDH_RISCV_DTB_MGR *p_riscv_dtb_queue_mgr[ZXDH_DEV_CHANNEL_MAX];<br /> static ZXDH_SDT_TBL_DATA_T g_sdt_info[ZXDH_DEV_CHANNEL_MAX][ZXDH_DEV_SDT_ID_MAX];<br /> static ZXDH_PPU_STAT_CFG_T g_ppu_stat_cfg[ZXDH_DEV_CHANNEL_MAX];<br /> static uint64_t g_np_fw_compat_addr[ZXDH_DEV_CHANNEL_MAX];<br /> static const ZXDH_VERSION_COMPATIBLE_REG_T g_np_sdk_version = {<br />     ZXDH_NPSDK_COMPAT_ITEM_ID, 1, 0, 0, 0, {0} };<br />+static const uint32_t hardware_ep_id[5] = {5, 6, 7, 8, 9};<br />  <br /> static const ZXDH_FIELD_T g_smmu0_smmu0_cpu_ind_cmd_reg[] = {<br />     {"cpu_ind_rw", ZXDH_FIELD_FLAG_RW, 31, 1, 0x0, 0x0},<br />@@ -544,6 +543,25 @@ zxdh_np_dev_opr_spinlock_get(uint32_t dev_id, uint32_t type, ZXDH_SPINLOCK_T **p<br />     return ZXDH_OK;<br /> }<br />  <br />+static uint32_t<br />+zxdh_np_dev_dtb_opr_spinlock_get(uint32_t dev_id, uint32_t type,<br />+            uint32_t index, ZXDH_SPINLOCK_T **p_spinlock_out)<br />+{<br />+    ZXDH_DEV_MGR_T *p_dev_mgr = &g_dev_mgr;<br />+    ZXDH_DEV_CFG_T *p_dev_info = p_dev_mgr->p_dev_array[dev_id];<br />+<br />+    switch (type) {<br />+    case ZXDH_DEV_SPINLOCK_T_DTB:<br />+        *p_spinlock_out = &p_dev_info->dtb_queue_spinlock[index];<br />+        break;<br />+    default:<br />+        PMD_DRV_LOG(ERR, "spinlock type is invalid!");<br />+        return ZXDH_ERR;<br />+    }<br />+<br />+    return ZXDH_OK;<br />+}<br />+<br /> static uint32_t<br /> zxdh_np_dev_read_channel(uint32_t dev_id, uint32_t addr, uint32_t size, uint32_t *p_data)<br /> {<br />@@ -938,6 +956,7 @@ zxdh_np_dev_add(uint32_t  dev_id, ZXDH_DEV_TYPE_E dev_type,<br /> {<br />     ZXDH_DEV_CFG_T *p_dev_info = NULL;<br />     ZXDH_DEV_MGR_T *p_dev_mgr  = NULL;<br />+    uint32_t i = 0;<br />  <br />     p_dev_mgr = &g_dev_mgr;<br />     if (!p_dev_mgr->is_init) {<br />@@ -973,7 +992,9 @@ zxdh_np_dev_add(uint32_t  dev_id, ZXDH_DEV_TYPE_E dev_type,<br />     p_dev_info->p_pcie_read_fun  = zxdh_np_dev_pcie_default_read;<br />  <br />     rte_spinlock_init(&p_dev_info->dtb_spinlock.spinlock);<br />-    rte_spinlock_init(&p_dev_info->smmu0_spinlock.spinlock);<br />+<br />+    for (i = 0; i < ZXDH_DTB_QUEUE_NUM_MAX; i++)<br />+        rte_spinlock_init(&p_dev_info->dtb_queue_spinlock[i].spinlock);<br />  <br />     return ZXDH_OK;<br /> }<br />@@ -1329,6 +1350,89 @@ zxdh_np_agent_channel_reg_write(uint32_t dev_id,<br />     return ret;<br /> }<br />  <br />+static uint32_t<br />+zxdh_np_agent_channel_dtb_sync_send(uint32_t dev_id,<br />+                            ZXDH_AGENT_CHANNEL_DTB_MSG_T *p_msg,<br />+                            uint32_t *p_data,<br />+                            uint32_t rep_len)<br />+{<br />+    uint32_t ret = ZXDH_OK;<br />+<br />+    ZXDH_AGENT_CHANNEL_MSG_T agent_msg = {0};<br />+    agent_msg.msg = (void *)p_msg;<br />+    agent_msg.msg_len = sizeof(ZXDH_AGENT_CHANNEL_DTB_MSG_T);<br />+<br />+    ret = zxdh_np_agent_channel_sync_send(dev_id, &agent_msg, p_data, rep_len);<br />+    if (ret != ZXDH_OK) {<br />+        PMD_DRV_LOG(ERR, "zxdh_np_agent_channel_sync_send failed");<br />+        return ZXDH_ERR;<br />+    }<br />+<br />+    return ZXDH_OK;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_agent_channel_dtb_queue_request(uint32_t dev_id,<br />+                                    char p_name[32],<br />+                                    uint32_t vport_info,<br />+                                    uint32_t *p_queue_id)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+<br />+    uint32_t rsp_buff[2] = {0};<br />+    uint32_t msg_result = 0;<br />+    uint32_t queue_id = 0;<br />+    ZXDH_AGENT_CHANNEL_DTB_MSG_T msgcfg = {<br />+        .dev_id  = 0,<br />+        .type    = ZXDH_DTB_MSG,<br />+        .oper    = ZXDH_QUEUE_REQUEST,<br />+        .vport   = vport_info,<br />+    };<br />+    memcpy(msgcfg.name, p_name, strnlen(p_name, ZXDH_PORT_NAME_MAX));<br />+<br />+    PMD_DRV_LOG(DEBUG, "msgcfg.name=%s", msgcfg.name);<br />+<br />+    rc = zxdh_np_agent_channel_dtb_sync_send(dev_id, &msgcfg, rsp_buff, sizeof(rsp_buff));<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_agent_channel_dtb_sync_send");<br />+<br />+    msg_result = rsp_buff[0];<br />+    queue_id = 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, queue_id: %u", dev_id, queue_id);<br />+<br />+    *p_queue_id = queue_id;<br />+<br />+    return msg_result;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_agent_channel_dtb_queue_release(uint32_t dev_id,<br />+                                char p_name[32],<br />+                                __rte_unused uint32_t queue_id)<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_DTB_MSG_T msgcfg = {<br />+        .dev_id  = 0,<br />+        .type    = ZXDH_DTB_MSG,<br />+        .oper    = ZXDH_QUEUE_RELEASE,<br />+        .queue_id = queue_id,<br />+    };<br />+<br />+    memcpy(msgcfg.name, p_name, strnlen(p_name, ZXDH_PORT_NAME_MAX));<br />+<br />+    rc = zxdh_np_agent_channel_dtb_sync_send(dev_id, &msgcfg, rsp_buff, sizeof(rsp_buff));<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_agent_channel_dtb_sync_send");<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 />@@ -1556,48 +1660,6 @@ zxdh_np_pcie_bar_msg_num_get(uint32_t dev_id, uint32_t *p_bar_msg_num)<br />     return rc;<br /> }<br />  <br />-static ZXDH_RISCV_DTB_MGR *<br />-zxdh_np_riscv_dtb_queue_mgr_get(uint32_t dev_id)<br />-{<br />-    if (dev_id >= ZXDH_DEV_CHANNEL_MAX)<br />-        return NULL;<br />-    else<br />-        return p_riscv_dtb_queue_mgr[dev_id];<br />-}<br />-<br />-static uint32_t<br />-zxdh_np_riscv_dtb_mgr_queue_info_delete(uint32_t dev_id, uint32_t queue_id)<br />-{<br />-    ZXDH_RISCV_DTB_MGR *p_riscv_dtb_mgr = NULL;<br />-<br />-    p_riscv_dtb_mgr = zxdh_np_riscv_dtb_queue_mgr_get(dev_id);<br />-    if (p_riscv_dtb_mgr == NULL)<br />-        return 1;<br />-<br />-    p_riscv_dtb_mgr->queue_alloc_count--;<br />-    p_riscv_dtb_mgr->queue_user_info[queue_id].alloc_flag = 0;<br />-    p_riscv_dtb_mgr->queue_user_info[queue_id].queue_id = 0xFF;<br />-    p_riscv_dtb_mgr->queue_user_info[queue_id].vport = 0;<br />-    memset(p_riscv_dtb_mgr->queue_user_info[queue_id].user_name, 0, ZXDH_PORT_NAME_MAX);<br />-<br />-    return 0;<br />-}<br />-<br />-static uint32_t<br />-zxdh_np_dev_get_dev_type(uint32_t dev_id)<br />-{<br />-    ZXDH_DEV_MGR_T *p_dev_mgr = NULL;<br />-    ZXDH_DEV_CFG_T *p_dev_info = NULL;<br />-<br />-    p_dev_mgr = &g_dev_mgr;<br />-    p_dev_info = p_dev_mgr->p_dev_array[dev_id];<br />-<br />-    if (p_dev_info == NULL)<br />-        return 0xffff;<br />-<br />-    return p_dev_info->dev_type;<br />-}<br />-<br /> static uint32_t<br /> zxdh_np_comm_read_bits(uint8_t *p_base, uint32_t base_size_bit,<br />         uint32_t *p_data, uint32_t start_bit, uint32_t end_bit)<br />@@ -1887,52 +1949,6 @@ zxdh_np_dtb_queue_vm_info_set(uint32_t dev_id,<br />     return rc;<br /> }<br />  <br />-static uint32_t<br />-zxdh_np_dtb_queue_enable_set(uint32_t dev_id,<br />-        uint32_t queue_id,<br />-        uint32_t enable)<br />-{<br />-    ZXDH_DTB_QUEUE_VM_INFO_T vm_info = {0};<br />-    uint32_t rc;<br />-<br />-    rc = zxdh_np_dtb_queue_vm_info_get(dev_id, queue_id, &vm_info);<br />-    ZXDH_COMM_CHECK_RC_NO_ASSERT(rc, "zxdh_dtb_queue_vm_info_get");<br />-<br />-    vm_info.queue_en = enable;<br />-    rc = zxdh_np_dtb_queue_vm_info_set(dev_id, queue_id, &vm_info);<br />-    ZXDH_COMM_CHECK_RC_NO_ASSERT(rc, "zxdh_dtb_queue_vm_info_set");<br />-<br />-    return rc;<br />-}<br />-<br />-static uint32_t<br />-zxdh_np_riscv_dpp_dtb_queue_id_release(uint32_t dev_id,<br />-            char name[ZXDH_PORT_NAME_MAX], uint32_t queue_id)<br />-{<br />-    ZXDH_RISCV_DTB_MGR *p_riscv_dtb_mgr = NULL;<br />-<br />-    p_riscv_dtb_mgr = zxdh_np_riscv_dtb_queue_mgr_get(dev_id);<br />-    if (p_riscv_dtb_mgr == NULL)<br />-        return 1;<br />-<br />-    if (zxdh_np_dev_get_dev_type(dev_id) == ZXDH_DEV_TYPE_SIM)<br />-        return 0;<br />-<br />-    if (p_riscv_dtb_mgr->queue_user_info[queue_id].alloc_flag != 1) {<br />-        PMD_DRV_LOG(ERR, "queue %d not alloc!", queue_id);<br />-        return 2;<br />-    }<br />-<br />-    if (strcmp(p_riscv_dtb_mgr->queue_user_info[queue_id].user_name, name) != 0) {<br />-        PMD_DRV_LOG(ERR, "queue %d name %s error!", queue_id, name);<br />-        return 3;<br />-    }<br />-    zxdh_np_dtb_queue_enable_set(dev_id, queue_id, 0);<br />-    zxdh_np_riscv_dtb_mgr_queue_info_delete(dev_id, queue_id);<br />-<br />-    return 0;<br />-}<br />-<br /> static uint32_t<br /> zxdh_np_dtb_queue_unused_item_num_get(uint32_t dev_id,<br />                         uint32_t queue_id,<br />@@ -1967,20 +1983,74 @@ zxdh_np_dtb_queue_id_free(uint32_t dev_id,<br />     return rc;<br /> }<br />  <br />+static uint32_t<br />+zxdh_np_dtb_queue_request(uint32_t dev_id, char p_name[32],<br />+                    uint16_t vport, uint32_t *p_queue_id)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+    uint32_t queue_id = 0xFF;<br />+    ZXDH_SPINLOCK_T *p_dtb_spinlock = NULL;<br />+    ZXDH_DEV_SPINLOCK_TYPE_E spinlock = ZXDH_DEV_SPINLOCK_T_DTB;<br />+    uint32_t vport_info = (uint32_t)vport;<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_dtb_queue_request(dev_id, p_name, vport_info, &queue_id);<br />+    if (rc == ZXDH_RC_DTB_QUEUE_RES_EMPTY) {<br />+        PMD_DRV_LOG(ERR, "dtb queue is locked full.");<br />+        rte_spinlock_unlock(&p_dtb_spinlock->spinlock);<br />+        return ZXDH_RC_DTB_QUEUE_RES_EMPTY;<br />+    }<br />+<br />+    rte_spinlock_unlock(&p_dtb_spinlock->spinlock);<br />+<br />+    PMD_DRV_LOG(DEBUG, "dtb request queue is %u.", queue_id);<br />+<br />+    *p_queue_id = queue_id;<br />+<br />+    PMD_DRV_LOG(INFO, "dev_id %u vport 0x%x name %s queue_id %u done.",<br />+        dev_id, vport_info, p_name, queue_id);<br />+<br />+    return rc;<br />+}<br />+<br /> static uint32_t<br /> zxdh_np_dtb_queue_release(uint32_t devid,<br />         char pname[32],<br />         uint32_t queueid)<br /> {<br />     uint32_t rc = ZXDH_OK;<br />+    ZXDH_SPINLOCK_T *p_dtb_spinlock = NULL;<br />+    ZXDH_DEV_SPINLOCK_TYPE_E spinlock = ZXDH_DEV_SPINLOCK_T_DTB;<br />+<br />+    rc = zxdh_np_dev_opr_spinlock_get(devid, (uint32_t)spinlock, &p_dtb_spinlock);<br />+    ZXDH_COMM_CHECK_DEV_RC(devid, rc, "zxdh_np_dev_opr_spinlock_get");<br />+<br />+    rte_spinlock_lock(&p_dtb_spinlock->spinlock);<br />  <br />-    ZXDH_COMM_CHECK_DEV_POINT(devid, pname);<br />+    rc = zxdh_np_agent_channel_dtb_queue_release(devid, pname, queueid);<br />+<br />+    if (rc == ZXDH_RC_DTB_QUEUE_NOT_ALLOC) {<br />+        PMD_DRV_LOG(ERR, "dtb queue id %u not request.", queueid);<br />+        rte_spinlock_unlock(&p_dtb_spinlock->spinlock);<br />+        return ZXDH_RC_DTB_QUEUE_NOT_ALLOC;<br />+    }<br />+<br />+    if (rc == ZXDH_RC_DTB_QUEUE_NAME_ERROR) {<br />+        PMD_DRV_LOG(ERR, "dtb queue %u name error.", queueid);<br />+        rte_spinlock_unlock(&p_dtb_spinlock->spinlock);<br />+        return ZXDH_RC_DTB_QUEUE_NAME_ERROR;<br />+    }<br />  <br />-    rc = zxdh_np_riscv_dpp_dtb_queue_id_release(devid, pname, queueid);<br />-    ZXDH_COMM_CHECK_RC_NO_ASSERT(rc, "zxdh_riscv_dpp_dtb_queue_id_release");<br />+    rte_spinlock_unlock(&p_dtb_spinlock->spinlock);<br />  <br />     rc = zxdh_np_dtb_queue_id_free(devid, queueid);<br />-    ZXDH_COMM_CHECK_RC_NO_ASSERT(rc, "zxdh_dtb_queue_id_free");<br />+    ZXDH_COMM_CHECK_DEV_RC(devid, rc, "zxdh_np_dtb_queue_id_free");<br />+<br />+    PMD_DRV_LOG(INFO, "release queueid %u", queueid);<br />  <br />     return rc;<br /> }<br />@@ -2571,24 +2641,34 @@ zxdh_np_dtb_tab_down_info_set(uint32_t dev_id,<br />     uint32_t item_index;<br />     uint32_t i;<br />     uint32_t rc;<br />+    ZXDH_SPINLOCK_T *p_spinlock = NULL;<br />+<br />+    zxdh_np_dev_dtb_opr_spinlock_get(dev_id, ZXDH_DEV_SPINLOCK_T_DTB, queue_id, &p_spinlock);<br />+    rte_spinlock_lock(&p_spinlock->spinlock);<br />  <br />     if (ZXDH_DTB_QUEUE_INIT_FLAG_GET(dev_id, queue_id) == 0) {<br />         PMD_DRV_LOG(ERR, "dtb queue %u is not init.", queue_id);<br />+        rte_spinlock_unlock(&p_spinlock->spinlock);<br />         return ZXDH_RC_DTB_QUEUE_IS_NOT_INIT;<br />     }<br />  <br />-    if (data_len % 4 != 0)<br />+    if (data_len % 4 != 0) {<br />+        rte_spinlock_unlock(&p_spinlock->spinlock);<br />         return ZXDH_RC_DTB_PARA_INVALID;<br />+    }<br />  <br />     rc = zxdh_np_dtb_queue_enable_get(dev_id, queue_id, &queue_en);<br />     if (!queue_en) {<br />         PMD_DRV_LOG(ERR, "the queue %u is not enable!,rc=%u", queue_id, rc);<br />+        rte_spinlock_unlock(&p_spinlock->spinlock);<br />         return ZXDH_RC_DTB_QUEUE_NOT_ENABLE;<br />     }<br />  <br />     rc = zxdh_np_dtb_queue_unused_item_num_get(dev_id, queue_id, &unused_item_num);<br />-    if (unused_item_num == 0)<br />+    if (unused_item_num == 0) {<br />+        rte_spinlock_unlock(&p_spinlock->spinlock);<br />         return ZXDH_RC_DTB_QUEUE_ITEM_HW_EMPTY;<br />+    }<br />  <br />     for (i = 0; i < ZXDH_DTB_QUEUE_ITEM_NUM_MAX; i++) {<br />         item_index = ZXDH_DTB_TAB_DOWN_WR_INDEX_GET(dev_id, queue_id) %<br />@@ -2603,8 +2683,10 @@ zxdh_np_dtb_tab_down_info_set(uint32_t dev_id,<br />             break;<br />     }<br />  <br />-    if (i == ZXDH_DTB_QUEUE_ITEM_NUM_MAX)<br />+    if (i == ZXDH_DTB_QUEUE_ITEM_NUM_MAX) {<br />+        rte_spinlock_unlock(&p_spinlock->spinlock);<br />         return ZXDH_RC_DTB_QUEUE_ITEM_SW_EMPTY;<br />+    }<br />  <br />     rc = zxdh_np_dtb_item_buff_wr(dev_id, queue_id, 0,<br />         item_index, 0, data_len, p_data);<br />@@ -2626,6 +2708,8 @@ zxdh_np_dtb_tab_down_info_set(uint32_t dev_id,<br />     rc = zxdh_np_dtb_queue_item_info_set(dev_id, queue_id, &item_info);<br />     *p_item_index = item_index;<br />  <br />+    rte_spinlock_unlock(&p_spinlock->spinlock);<br />+<br />     return rc;<br /> }<br />  <br />@@ -2639,8 +2723,6 @@ zxdh_np_dtb_write_down_table_data(uint32_t dev_id,<br />     uint32_t  rc = 0;<br />     uint32_t dtb_interrupt_status = 0;<br />  <br />-    dtb_interrupt_status = g_dpp_dtb_int_enable;<br />-<br />     rc = zxdh_np_dtb_tab_down_info_set(dev_id,<br />                     queue_id,<br />                     dtb_interrupt_status,<br />@@ -2850,20 +2932,28 @@ zxdh_np_dtb_tab_up_info_set(uint32_t dev_id,<br />     ZXDH_DTB_QUEUE_ITEM_INFO_T item_info = {0};<br />     uint32_t queue_en = 0;<br />     uint32_t rc;<br />+    ZXDH_SPINLOCK_T *p_spinlock = NULL;<br />+<br />+    zxdh_np_dev_dtb_opr_spinlock_get(dev_id, ZXDH_DEV_SPINLOCK_T_DTB, queue_id, &p_spinlock);<br />+    rte_spinlock_lock(&p_spinlock->spinlock);<br />  <br />     zxdh_np_dtb_queue_enable_get(dev_id, queue_id, &queue_en);<br />     if (!queue_en) {<br />         PMD_DRV_LOG(ERR, "the queue %u is not enable!", queue_id);<br />+        rte_spinlock_unlock(&p_spinlock->spinlock);<br />         return ZXDH_RC_DTB_QUEUE_NOT_ENABLE;<br />     }<br />  <br />     if (ZXDH_DTB_QUEUE_INIT_FLAG_GET(dev_id, queue_id) == 0) {<br />         PMD_DRV_LOG(ERR, "dtb queue %u is not init", queue_id);<br />+        rte_spinlock_unlock(&p_spinlock->spinlock);<br />         return ZXDH_RC_DTB_QUEUE_IS_NOT_INIT;<br />     }<br />  <br />-    if (desc_len % 4 != 0)<br />+    if (desc_len % 4 != 0) {<br />+        rte_spinlock_unlock(&p_spinlock->spinlock);<br />         return ZXDH_RC_DTB_PARA_INVALID;<br />+    }<br />  <br />     zxdh_np_dtb_item_buff_wr(dev_id, queue_id, ZXDH_DTB_DIR_UP_TYPE,<br />         item_index, 0, desc_len, p_desc_data);<br />@@ -2880,11 +2970,10 @@ zxdh_np_dtb_tab_up_info_set(uint32_t dev_id,<br />         (ZXDH_DTB_TAB_UP_PHY_ADDR_GET(dev_id, queue_id, item_index) >> 4) & 0xffffffff;<br />     zxdh_dtb_info_print(dev_id, queue_id, item_index,  &item_info);<br />  <br />-    if (zxdh_np_dev_get_dev_type(dev_id) == ZXDH_DEV_TYPE_SIM)<br />-        return 0;<br />-<br />     rc = zxdh_np_dtb_queue_item_info_set(dev_id, queue_id, &item_info);<br />  <br />+    rte_spinlock_unlock(&p_spinlock->spinlock);<br />+<br />     return rc;<br /> }<br />  <br />@@ -2954,16 +3043,23 @@ zxdh_np_dtb_tab_up_free_item_get(uint32_t dev_id,<br />     uint32_t item_index = 0;<br />     uint32_t unused_item_num = 0;<br />     uint32_t i;<br />+    ZXDH_SPINLOCK_T *p_spinlock = NULL;<br />+<br />+    zxdh_np_dev_dtb_opr_spinlock_get(dev_id, ZXDH_DEV_SPINLOCK_T_DTB, queue_id, &p_spinlock);<br />+    rte_spinlock_lock(&p_spinlock->spinlock);<br />  <br />     if (ZXDH_DTB_QUEUE_INIT_FLAG_GET(dev_id, queue_id) == 0) {<br />         PMD_DRV_LOG(ERR, "dtb queue %u is not init", queue_id);<br />+        rte_spinlock_unlock(&p_spinlock->spinlock);<br />         return ZXDH_RC_DTB_QUEUE_IS_NOT_INIT;<br />     }<br />  <br />     zxdh_np_dtb_queue_unused_item_num_get(dev_id, queue_id, &unused_item_num);<br />  <br />-    if (unused_item_num == 0)<br />+    if (unused_item_num == 0) {<br />+        rte_spinlock_unlock(&p_spinlock->spinlock);<br />         return ZXDH_RC_DTB_QUEUE_ITEM_HW_EMPTY;<br />+    }<br />  <br />     for (i = 0; i < ZXDH_DTB_QUEUE_ITEM_NUM_MAX; i++) {<br />         item_index = ZXDH_DTB_TAB_UP_WR_INDEX_GET(dev_id, queue_id) %<br />@@ -2978,14 +3074,18 @@ zxdh_np_dtb_tab_up_free_item_get(uint32_t dev_id,<br />             break;<br />     }<br />  <br />-    if (i == ZXDH_DTB_QUEUE_ITEM_NUM_MAX)<br />+    if (i == ZXDH_DTB_QUEUE_ITEM_NUM_MAX) {<br />+        rte_spinlock_unlock(&p_spinlock->spinlock);<br />         return ZXDH_RC_DTB_QUEUE_ITEM_SW_EMPTY;<br />+    }<br />  <br />     zxdh_np_dtb_item_ack_wr(dev_id, queue_id, ZXDH_DTB_DIR_UP_TYPE, item_index,<br />         0, ZXDH_DTB_TAB_ACK_IS_USING_MASK);<br />  <br />     *p_item_index = item_index;<br />  <br />+    rte_spinlock_unlock(&p_spinlock->spinlock);<br />+<br />     return 0;<br /> }<br />  <br />@@ -3245,6 +3345,181 @@ zxdh_np_dtb_stats_get(uint32_t dev_id,<br />     return rc;<br /> }<br />  <br />+static uint32_t<br />+zxdh_np_dtb_queue_down_init(uint32_t dev_id,<br />+                            uint32_t queue_id,<br />+                            ZXDH_DTB_QUEUE_CFG_T *p_queue_cfg)<br />+{<br />+    uint32_t rc = 0;<br />+    uint32_t i = 0;<br />+    uint32_t ack_vale = 0;<br />+    uint32_t tab_down_item_size = 0;<br />+    ZXDH_DTB_MGR_T *p_dtb_mgr = NULL;<br />+<br />+    p_dtb_mgr = zxdh_np_dtb_mgr_get(dev_id);<br />+    p_dtb_mgr->queue_info[queue_id].init_flag = 1;<br />+<br />+    tab_down_item_size = (p_queue_cfg->down_item_size == 0) ?<br />+        ZXDH_DTB_ITEM_SIZE : p_queue_cfg->down_item_size;<br />+<br />+    p_dtb_mgr->queue_info[queue_id].tab_down.item_size = tab_down_item_size;<br />+    p_dtb_mgr->queue_info[queue_id].tab_down.start_phy_addr = p_queue_cfg->down_start_phy_addr;<br />+    p_dtb_mgr->queue_info[queue_id].tab_down.start_vir_addr = p_queue_cfg->down_start_vir_addr;<br />+    p_dtb_mgr->queue_info[queue_id].tab_down.wr_index = 0;<br />+    p_dtb_mgr->queue_info[queue_id].tab_down.rd_index = 0;<br />+<br />+    for (i = 0; i < ZXDH_DTB_QUEUE_ITEM_NUM_MAX; i++) {<br />+        rc = zxdh_np_dtb_item_ack_wr(dev_id, queue_id,<br />+            ZXDH_DTB_DIR_DOWN_TYPE, i, 0, ZXDH_DTB_TAB_ACK_CHECK_VALUE);<br />+        ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_item_ack_wr");<br />+    }<br />+<br />+    for (i = 0; i < ZXDH_DTB_QUEUE_ITEM_NUM_MAX; i++) {<br />+        rc = zxdh_np_dtb_item_ack_rd(dev_id, queue_id,<br />+            ZXDH_DTB_DIR_DOWN_TYPE, i, 0, &ack_vale);<br />+        if (ack_vale != ZXDH_DTB_TAB_ACK_CHECK_VALUE) {<br />+            PMD_DRV_LOG(ERR, "dtb queue [%u] down init failed!", queue_id);<br />+            return ZXDH_RC_DTB_MEMORY_ALLOC_ERR;<br />+        }<br />+    }<br />+<br />+    memset((uint8_t *)(p_queue_cfg->down_start_vir_addr), 0,<br />+        tab_down_item_size * ZXDH_DTB_QUEUE_ITEM_NUM_MAX);<br />+<br />+    PMD_DRV_LOG(INFO, "dtb queue [%u] down init success!!!", queue_id);<br />+<br />+    return ZXDH_OK;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_queue_dump_init(uint32_t dev_id,<br />+                    uint32_t queue_id,<br />+                    ZXDH_DTB_QUEUE_CFG_T *p_queue_cfg)<br />+{<br />+    uint32_t i = 0;<br />+    uint32_t ack_vale = 0;<br />+    uint32_t tab_up_item_size = 0;<br />+    ZXDH_DTB_MGR_T *p_dtb_mgr = NULL;<br />+<br />+    p_dtb_mgr = zxdh_np_dtb_mgr_get(dev_id);<br />+    p_dtb_mgr->queue_info[queue_id].init_flag = 1;<br />+<br />+    tab_up_item_size = (p_queue_cfg->up_item_size == 0) ?<br />+        ZXDH_DTB_ITEM_SIZE : p_queue_cfg->up_item_size;<br />+<br />+    p_dtb_mgr->queue_info[queue_id].tab_up.item_size = tab_up_item_size;<br />+    p_dtb_mgr->queue_info[queue_id].tab_up.start_phy_addr = p_queue_cfg->up_start_phy_addr;<br />+    p_dtb_mgr->queue_info[queue_id].tab_up.start_vir_addr = p_queue_cfg->up_start_vir_addr;<br />+    p_dtb_mgr->queue_info[queue_id].tab_up.wr_index = 0;<br />+    p_dtb_mgr->queue_info[queue_id].tab_up.rd_index = 0;<br />+<br />+    for (i = 0; i < ZXDH_DTB_QUEUE_ITEM_NUM_MAX; i++) {<br />+        zxdh_np_dtb_item_ack_wr(dev_id, queue_id,<br />+            ZXDH_DTB_DIR_UP_TYPE, i, 0, ZXDH_DTB_TAB_ACK_CHECK_VALUE);<br />+    }<br />+<br />+    for (i = 0; i < ZXDH_DTB_QUEUE_ITEM_NUM_MAX; i++) {<br />+        zxdh_np_dtb_item_ack_rd(dev_id, queue_id,<br />+            ZXDH_DTB_DIR_UP_TYPE, i, 0, &ack_vale);<br />+        if (ack_vale != ZXDH_DTB_TAB_ACK_CHECK_VALUE) {<br />+            PMD_DRV_LOG(ERR, "dtb queue [%u] dump init failed!!!", queue_id);<br />+            return ZXDH_RC_DTB_MEMORY_ALLOC_ERR;<br />+        }<br />+    }<br />+<br />+    memset((uint8_t *)(p_queue_cfg->up_start_vir_addr), 0,<br />+        tab_up_item_size * ZXDH_DTB_QUEUE_ITEM_NUM_MAX);<br />+<br />+    PMD_DRV_LOG(INFO, "dtb queue [%u] up init success!!!", queue_id);<br />+<br />+    return ZXDH_OK;<br />+}<br />+<br />+static void<br />+zxdh_np_dtb_down_channel_addr_set(uint32_t dev_id,<br />+                                uint32_t channel_id,<br />+                                uint64_t phy_addr,<br />+                                uint64_t vir_addr,<br />+                                uint32_t size)<br />+{<br />+    ZXDH_DTB_QUEUE_CFG_T down_queue_cfg = {<br />+        .down_start_phy_addr = phy_addr,<br />+        .down_start_vir_addr = vir_addr,<br />+        .down_item_size = size,<br />+    };<br />+<br />+    zxdh_np_dtb_queue_down_init(dev_id, channel_id, &down_queue_cfg);<br />+}<br />+<br />+static void<br />+zxdh_np_dtb_dump_channel_addr_set(uint32_t dev_id,<br />+                                uint32_t channel_id,<br />+                                uint64_t phy_addr,<br />+                                uint64_t vir_addr,<br />+                                uint32_t size)<br />+{<br />+    ZXDH_DTB_QUEUE_CFG_T dump_queue_cfg = {<br />+        .up_start_phy_addr = phy_addr,<br />+        .up_start_vir_addr = vir_addr,<br />+        .up_item_size = size,<br />+    };<br />+<br />+    zxdh_np_dtb_queue_dump_init(dev_id, channel_id, &dump_queue_cfg);<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_user_info_set(uint32_t dev_id, uint32_t queue_id, uint16_t vport, uint32_t vector)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+<br />+    ZXDH_DTB_QUEUE_VM_INFO_T vm_info = {0};<br />+    ZXDH_DTB_MGR_T *p_dtb_mgr = zxdh_np_dtb_mgr_get(dev_id);<br />+<br />+    rc = zxdh_np_dtb_queue_vm_info_get(dev_id, queue_id, &vm_info);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_queue_vm_info_get");<br />+<br />+    vm_info.dbi_en = 1;<br />+    vm_info.epid = hardware_ep_id[ZXDH_EPID_BY(vport)];<br />+    vm_info.vfunc_num = ZXDH_VFUNC_NUM(vport);<br />+    vm_info.func_num = ZXDH_FUNC_NUM(vport);<br />+    vm_info.vfunc_active = ZXDH_VF_ACTIVE(vport);<br />+    vm_info.vector = vector;<br />+<br />+    p_dtb_mgr->queue_info[queue_id].vport = vport;<br />+    p_dtb_mgr->queue_info[queue_id].vector = vector;<br />+<br />+    rc = zxdh_np_dtb_queue_vm_info_set(dev_id, queue_id, &vm_info);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_queue_vm_info_set");<br />+<br />+    return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_apt_dtb_res_init(uint32_t dev_id, ZXDH_DEV_INIT_CTRL_T *p_dev_init_ctrl)<br />+{<br />+    uint32_t rc = ZXDH_OK;<br />+<br />+    uint32_t queue_id = 0;<br />+<br />+    rc = zxdh_np_dtb_queue_request(dev_id, p_dev_init_ctrl->port_name,<br />+        p_dev_init_ctrl->vport, &queue_id);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_queue_request");<br />+<br />+    p_dev_init_ctrl->queue_id = queue_id;<br />+<br />+    rc = zxdh_np_dtb_user_info_set(dev_id, queue_id,<br />+        p_dev_init_ctrl->vport, p_dev_init_ctrl->vector);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_dtb_user_info_set");<br />+<br />+    zxdh_np_dtb_down_channel_addr_set(dev_id, queue_id,<br />+        p_dev_init_ctrl->down_phy_addr, p_dev_init_ctrl->down_vir_addr, 0);<br />+<br />+    zxdh_np_dtb_dump_channel_addr_set(dev_id, queue_id,<br />+        p_dev_init_ctrl->dump_phy_addr, p_dev_init_ctrl->dump_vir_addr, 0);<br />+<br />+    return ZXDH_OK;<br />+}<br />+<br /> int<br /> zxdh_np_host_init(uint32_t dev_id,<br />         ZXDH_DEV_INIT_CTRL_T *p_dev_init_ctrl)<br />@@ -3279,6 +3554,10 @@ zxdh_np_host_init(uint32_t dev_id,<br />  <br />     zxdh_np_dev_fw_bar_msg_num_set(dev_id, bar_msg_num);<br />  <br />+    rc = zxdh_np_apt_dtb_res_init(dev_id, p_dev_init_ctrl);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_np_apt_dtb_res_init");<br />+    PMD_DRV_LOG(INFO, "host init done, queue_id = %u", p_dev_init_ctrl->queue_id);<br />+<br />     return 0;<br /> }<br />  <br />diff --git a/drivers/net/zxdh/zxdh_np.h b/drivers/net/zxdh/zxdh_np.h<br />index a692eca9aa..6cf8653670 100644<br />--- a/drivers/net/zxdh/zxdh_np.h<br />+++ b/drivers/net/zxdh/zxdh_np.h<br />@@ -497,6 +497,7 @@ typedef struct dpp_dev_cfg_t {<br />     ZXDH_DEV_READ_FUNC  p_pcie_read_fun;<br />     ZXDH_SPINLOCK_T dtb_spinlock;<br />     ZXDH_SPINLOCK_T smmu0_spinlock;<br />+    ZXDH_SPINLOCK_T dtb_queue_spinlock[ZXDH_DTB_QUEUE_NUM_MAX];<br /> } ZXDH_DEV_CFG_T;<br />  <br /> typedef struct zxdh_dev_mngr_t {<br />@@ -685,6 +686,78 @@ typedef struct zxdh_dtb_eram_table_form_t {<br />     uint32_t data_l;<br /> } ZXDH_DTB_ERAM_TABLE_FORM_T;<br />  <br />+typedef struct zxdh_dtb_zcam_table_form_t {<br />+    uint32_t valid;<br />+    uint32_t type_mode;<br />+    uint32_t ram_reg_flag;<br />+    uint32_t zgroup_id;<br />+    uint32_t zblock_id;<br />+    uint32_t zcell_id;<br />+    uint32_t mask;<br />+    uint32_t sram_addr;<br />+} ZXDH_DTB_ZCAM_TABLE_FORM_T;<br />+<br />+typedef struct zxdh_dtb_etcam_table_form_t {<br />+    uint32_t valid;<br />+    uint32_t type_mode;<br />+    uint32_t block_sel;<br />+    uint32_t init_en;<br />+    uint32_t row_or_col_msk;<br />+    uint32_t vben;<br />+    uint32_t reg_tcam_flag;<br />+    uint32_t uload;<br />+    uint32_t rd_wr;<br />+    uint32_t wr_mode;<br />+    uint32_t data_or_mask;<br />+    uint32_t addr;<br />+    uint32_t vbit;<br />+} ZXDH_DTB_ETCAM_TABLE_FORM_T;<br />+<br />+typedef struct zxdh_dtb_eram_dump_form_t {<br />+    uint32_t valid;<br />+    uint32_t up_type;<br />+    uint32_t base_addr;<br />+    uint32_t tb_depth;<br />+    uint32_t tb_dst_addr_h;<br />+    uint32_t tb_dst_addr_l;<br />+} ZXDH_DTB_ERAM_DUMP_FORM_T;<br />+<br />+typedef struct zxdh_dtb_zcam_dump_form_t {<br />+    uint32_t valid;<br />+    uint32_t up_type;<br />+    uint32_t zgroup_id;<br />+    uint32_t zblock_id;<br />+    uint32_t ram_reg_flag;<br />+    uint32_t z_reg_cell_id;<br />+    uint32_t sram_addr;<br />+    uint32_t tb_depth;<br />+    uint32_t tb_width;<br />+    uint32_t tb_dst_addr_h;<br />+    uint32_t tb_dst_addr_l;<br />+} ZXDH_DTB_ZCAM_DUMP_FORM_T;<br />+<br />+typedef struct zxdh_dtb_etcam_dump_form_t {<br />+    uint32_t valid;<br />+    uint32_t up_type;<br />+    uint32_t block_sel;<br />+    uint32_t addr;<br />+    uint32_t rd_mode;<br />+    uint32_t data_or_mask;<br />+    uint32_t tb_depth;<br />+    uint32_t tb_width;<br />+    uint32_t tb_dst_addr_h;<br />+    uint32_t tb_dst_addr_l;<br />+} ZXDH_DTB_ETCAM_DUMP_FORM_T;<br />+<br />+typedef struct zxdh_etcam_dump_info_t {<br />+    uint32_t block_sel;<br />+    uint32_t addr;<br />+    uint32_t rd_mode;<br />+    uint32_t data_or_mask;<br />+    uint32_t tb_depth;<br />+    uint32_t tb_width;<br />+} ZXDH_ETCAM_DUMP_INFO_T;<br />+<br /> typedef union zxdh_endian_u {<br />     unsigned int     a;<br />     unsigned char    b;<br />@@ -703,6 +776,15 @@ typedef struct zxdh_dtb_table_t {<br />     const ZXDH_DTB_FIELD_T *p_fields;<br /> } ZXDH_DTB_TABLE_T;<br />  <br />+typedef struct zxdh_dtb_queue_cfg_t {<br />+    uint64_t up_start_phy_addr;<br />+    uint64_t up_start_vir_addr;<br />+    uint64_t down_start_phy_addr;<br />+    uint64_t down_start_vir_addr;<br />+    uint32_t up_item_size;<br />+    uint32_t down_item_size;<br />+} ZXDH_DTB_QUEUE_CFG_T;<br />+<br /> typedef struct zxdh_dtb_queue_item_info_t {<br />     uint32_t cmd_vld;<br />     uint32_t cmd_type;<br />@@ -761,6 +843,11 @@ typedef enum zxdh_agent_msg_oper_e {<br />     ZXDH_WR_RD_MAX<br /> } ZXDH_MSG_OPER_E;<br />  <br />+typedef enum zxdh_msg_dtb_oper_e {<br />+    ZXDH_QUEUE_REQUEST = 0,<br />+    ZXDH_QUEUE_RELEASE = 1,<br />+} ZXDH_MSG_DTB_OPER_E;<br />+<br /> typedef struct zxdh_smmu0_smmu0_cpu_ind_cmd_t {<br />     uint32_t cpu_ind_rw;<br />     uint32_t cpu_ind_rd_mode;<br />@@ -975,6 +1062,16 @@ typedef struct __rte_aligned(2) zxdh_agent_channel_msg_t {<br />     void *msg;<br /> } ZXDH_AGENT_CHANNEL_MSG_T;<br />  <br />+typedef struct __rte_aligned(2) zxdh_agent_channel_dtb_msg_t {<br />+    uint8_t dev_id;<br />+    uint8_t type;<br />+    uint8_t oper;<br />+    uint8_t rsv;<br />+    char name[32];<br />+    uint32_t vport;<br />+    uint32_t queue_id;<br />+} ZXDH_AGENT_CHANNEL_DTB_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 />--  <br />2.27.0<br />