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 | 494 +++++++++++++++++++++++++++++--------<br /> drivers/net/zxdh/zxdh_np.h |  97 ++++++++<br /> 2 files changed, 483 insertions(+), 108 deletions(-)<br /> <br />diff --git a/drivers/net/zxdh/zxdh_np.c b/drivers/net/zxdh/zxdh_np.c<br />index 8113332310..0763dd3310 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 ZXDH_FIELD_T g_smmu0_smmu0_cpu_ind_cmd_reg[] = {<br />     {"cpu_ind_rw", ZXDH_FIELD_FLAG_RW, 31, 1, 0x0, 0x0},<br />@@ -458,6 +457,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 />@@ -857,6 +875,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 />@@ -892,7 +911,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 0;<br /> }<br />@@ -1248,6 +1269,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: %d, msg_result: %d", dev_id, msg_result);<br />+    PMD_DRV_LOG(DEBUG, "dev_id: %d, queue_id: %d", 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: %d", 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 />@@ -1476,48 +1580,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 />@@ -1807,52 +1869,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 />@@ -1887,20 +1903,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 %d.", queue_id);<br />+<br />+    *p_queue_id = queue_id;<br />+<br />+    PMD_DRV_LOG(INFO, "dev_id %d vport 0x%x name %s queue_id %d 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;<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 />+    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 %d not request.", queueid);<br />+        rte_spinlock_unlock(&p_dtb_spinlock->spinlock);<br />+        return ZXDH_RC_DTB_QUEUE_NOT_ALLOC;<br />+    }<br />  <br />-    ZXDH_COMM_CHECK_DEV_POINT(devid, pname);<br />+    if (rc == ZXDH_RC_DTB_QUEUE_NAME_ERROR) {<br />+        PMD_DRV_LOG(ERR, "dtb queue %d 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, "queueid %d", queueid);<br />  <br />     return rc;<br /> }<br />@@ -2352,24 +2422,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 %d is not init", queue_id);<br />+        PMD_DRV_LOG(ERR, "dtb queue %d 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 %d is not enable!,rc=%d", 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 />@@ -2384,8 +2464,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 />@@ -2405,6 +2487,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 />@@ -2418,8 +2502,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 />@@ -2748,20 +2830,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 %d 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 %d 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 />@@ -2773,11 +2863,10 @@ zxdh_np_dtb_tab_up_info_set(uint32_t dev_id,<br />     item_info.int_en = int_flag;<br />     item_info.data_len = desc_len / 4;<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 />@@ -2820,16 +2909,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 %d 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 />@@ -2844,14 +2940,17 @@ 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 />@@ -3042,6 +3141,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 [%d] 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 [%d] 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 [%d] 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 [%d] 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 />@@ -3076,6 +3350,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 c8fc8ea613..5b187b97fb 100644<br />--- a/drivers/net/zxdh/zxdh_np.h<br />+++ b/drivers/net/zxdh/zxdh_np.h<br />@@ -412,6 +412,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 />@@ -600,6 +601,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 struct zxdh_sdt_tbl_eram_t {<br />     uint32_t table_type;<br />     uint32_t eram_mode;<br />@@ -626,6 +699,15 @@ typedef struct zxdh_dtb_table_t {<br />     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 />@@ -697,6 +779,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 />@@ -911,6 +998,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 />