(np)network processor release resources in host.<br /> <br />Signed-off-by: Junlong Wang <wang.junlong1@zte.com.cn> <br />---<br /> drivers/net/zxdh/zxdh_ethdev.c |  48 ++++<br /> drivers/net/zxdh/zxdh_np.c     | 470 +++++++++++++++++++++++++++++++++<br /> drivers/net/zxdh/zxdh_np.h     | 107 ++++++++<br /> 3 files changed, 625 insertions(+)<br /> <br />diff --git a/drivers/net/zxdh/zxdh_ethdev.c b/drivers/net/zxdh/zxdh_ethdev.c<br />index b8f4415e00..4e114d95da 100644<br />--- a/drivers/net/zxdh/zxdh_ethdev.c<br />+++ b/drivers/net/zxdh/zxdh_ethdev.c<br />@@ -841,6 +841,51 @@ zxdh_dev_configure(struct rte_eth_dev *dev)<br />     return ret;<br /> }<br />  <br />+static void<br />+zxdh_np_dtb_data_res_free(struct zxdh_hw *hw)<br />+{<br />+    struct rte_eth_dev *dev = hw->eth_dev;<br />+    int ret;<br />+    int i;<br />+<br />+    if (g_dtb_data.init_done && g_dtb_data.bind_device == dev) {<br />+        ret = zxdh_np_online_uninit(0, dev->data->name, g_dtb_data.queueid);<br />+        if (ret)<br />+            PMD_DRV_LOG(ERR, "%s dpp_np_online_uninstall failed", dev->data->name);<br />+<br />+        if (g_dtb_data.dtb_table_conf_mz)<br />+            rte_memzone_free(g_dtb_data.dtb_table_conf_mz);<br />+<br />+        if (g_dtb_data.dtb_table_dump_mz) {<br />+            rte_memzone_free(g_dtb_data.dtb_table_dump_mz);<br />+            g_dtb_data.dtb_table_dump_mz = NULL;<br />+        }<br />+<br />+        for (i = 0; i < ZXDH_MAX_BASE_DTB_TABLE_COUNT; i++) {<br />+            if (g_dtb_data.dtb_table_bulk_dump_mz[i]) {<br />+                rte_memzone_free(g_dtb_data.dtb_table_bulk_dump_mz[i]);<br />+                g_dtb_data.dtb_table_bulk_dump_mz[i] = NULL;<br />+            }<br />+        }<br />+        g_dtb_data.init_done = 0;<br />+        g_dtb_data.bind_device = NULL;<br />+    }<br />+    if (zxdh_shared_data != NULL)<br />+        zxdh_shared_data->np_init_done = 0;<br />+}<br />+<br />+static void<br />+zxdh_np_uninit(struct rte_eth_dev *dev)<br />+{<br />+    struct zxdh_hw *hw = dev->data->dev_private;<br />+<br />+    if (!g_dtb_data.init_done && !g_dtb_data.dev_refcnt)<br />+        return;<br />+<br />+    if (--g_dtb_data.dev_refcnt == 0)<br />+        zxdh_np_dtb_data_res_free(hw);<br />+}<br />+<br /> static int<br /> zxdh_dev_close(struct rte_eth_dev *dev)<br /> {<br />@@ -848,6 +893,7 @@ zxdh_dev_close(struct rte_eth_dev *dev)<br />     int ret = 0;<br />  <br />     zxdh_intr_release(dev);<br />+    zxdh_np_uninit(dev);<br />     zxdh_pci_reset(hw);<br />  <br />     zxdh_dev_free_mbufs(dev);<br />@@ -1010,6 +1056,7 @@ zxdh_np_dtb_res_init(struct rte_eth_dev *dev)<br />     return 0;<br />  <br /> free_res:<br />+    zxdh_np_dtb_data_res_free(hw);<br />     rte_free(dpp_ctrl);<br />     return ret;<br /> }<br />@@ -1177,6 +1224,7 @@ zxdh_eth_dev_init(struct rte_eth_dev *eth_dev)<br />  <br /> err_zxdh_init:<br />     zxdh_intr_release(eth_dev);<br />+    zxdh_np_uninit(eth_dev);<br />     zxdh_bar_msg_chan_exit();<br />     rte_free(eth_dev->data->mac_addrs);<br />     eth_dev->data->mac_addrs = NULL;<br />diff --git a/drivers/net/zxdh/zxdh_np.c b/drivers/net/zxdh/zxdh_np.c<br />index e44d7ff501..28728b0c68 100644<br />--- a/drivers/net/zxdh/zxdh_np.c<br />+++ b/drivers/net/zxdh/zxdh_np.c<br />@@ -18,10 +18,21 @@ static ZXDH_DEV_MGR_T g_dev_mgr;<br /> static ZXDH_SDT_MGR_T g_sdt_mgr;<br /> ZXDH_PPU_CLS_BITMAP_T g_ppu_cls_bit_map[ZXDH_DEV_CHANNEL_MAX];<br /> ZXDH_DTB_MGR_T *p_dpp_dtb_mgr[ZXDH_DEV_CHANNEL_MAX];<br />+ZXDH_RISCV_DTB_MGR *p_riscv_dtb_queue_mgr[ZXDH_DEV_CHANNEL_MAX];<br />+ZXDH_TLB_MGR_T *g_p_dpp_tlb_mgr[ZXDH_DEV_CHANNEL_MAX];<br />+ZXDH_REG_T g_dpp_reg_info[4];<br />  <br /> #define ZXDH_SDT_MGR_PTR_GET()    (&g_sdt_mgr)<br /> #define ZXDH_SDT_SOFT_TBL_GET(id) (g_sdt_mgr.sdt_tbl_array[id])<br />  <br />+#define ZXDH_COMM_MASK_BIT(_bitnum_)\<br />+    (0x1U << (_bitnum_))<br />+<br />+#define ZXDH_COMM_GET_BIT_MASK(_inttype_, _bitqnt_)\<br />+    ((_inttype_)(((_bitqnt_) < 32)))<br />+<br />+#define ZXDH_REG_DATA_MAX      (128)<br />+<br /> #define ZXDH_COMM_CHECK_DEV_POINT(dev_id, point)\<br /> do {\<br />     if (NULL == (point)) {\<br />@@ -338,3 +349,462 @@ zxdh_np_host_init(uint32_t dev_id,<br />  <br />     return 0;<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 />+{<br />+    uint32_t start_byte_index;<br />+    uint32_t end_byte_index;<br />+    uint32_t byte_num;<br />+    uint32_t buffer_size;<br />+    uint32_t len;<br />+<br />+    if (0 != (base_size_bit % 8))<br />+        return 1;<br />+<br />+    if (start_bit > end_bit)<br />+        return 1;<br />+<br />+    if (base_size_bit < end_bit)<br />+        return 1;<br />+<br />+    len = end_bit - start_bit + 1;<br />+    buffer_size = base_size_bit / 8;<br />+    while (0 != (buffer_size & (buffer_size - 1)))<br />+        buffer_size += 1;<br />+<br />+    *p_data = 0;<br />+    end_byte_index     = (end_bit    >> 3);<br />+    start_byte_index   = (start_bit  >> 3);<br />+<br />+    if (start_byte_index == end_byte_index) {<br />+        *p_data = (uint32_t)(((p_base[start_byte_index] >> (7U - (end_bit & 7)))<br />+            & (0xff >> (8U - len))) & 0xff);<br />+        return 0;<br />+    }<br />+<br />+    if (start_bit & 7) {<br />+        *p_data = (p_base[start_byte_index] & (0xff >> (start_bit & 7))) & UINT8_MAX;<br />+        start_byte_index++;<br />+    }<br />+<br />+    for (byte_num = start_byte_index; byte_num < end_byte_index; byte_num++) {<br />+        *p_data <<= 8;<br />+        *p_data  += p_base[byte_num];<br />+    }<br />+<br />+    *p_data <<= 1 + (end_bit & 7);<br />+    *p_data  += ((p_base[byte_num & (buffer_size - 1)] & (0xff << (7 - (end_bit  & 7)))) >> <br />+        (7 - (end_bit  & 7))) & 0xff;<br />+<br />+    return 0;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_comm_read_bits_ex(uint8_t *p_base, uint32_t base_size_bit,<br />+        uint32_t *p_data, uint32_t msb_start_pos, uint32_t len)<br />+{<br />+    uint32_t rtn;<br />+<br />+    rtn = zxdh_np_comm_read_bits(p_base,<br />+                base_size_bit,<br />+                p_data,<br />+                (base_size_bit - 1 - msb_start_pos),<br />+                (base_size_bit - 1 - msb_start_pos + len - 1));<br />+    return rtn;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_reg_read(uint32_t dev_id, uint32_t reg_no,<br />+        uint32_t m_offset, uint32_t n_offset, void *p_data)<br />+{<br />+    uint32_t p_buff[ZXDH_REG_DATA_MAX] = {0};<br />+    ZXDH_REG_T *p_reg_info = NULL;<br />+    ZXDH_FIELD_T *p_field_info = NULL;<br />+    uint32_t rc = 0;<br />+    uint32_t i;<br />+<br />+    if (reg_no < 4) {<br />+        p_reg_info = &g_dpp_reg_info[reg_no];<br />+        p_field_info = p_reg_info->p_fields;<br />+        for (i = 0; i < p_reg_info->field_num; i++) {<br />+            rc = zxdh_np_comm_read_bits_ex((uint8_t *)p_buff,<br />+                                    p_reg_info->width * 8,<br />+                                    (uint32_t *)p_data + i,<br />+                                    p_field_info[i].msb_pos,<br />+                                    p_field_info[i].len);<br />+            ZXDH_COMM_CHECK_RC_NO_ASSERT(rc, "zxic_comm_read_bits_ex");<br />+            PMD_DRV_LOG(ERR, "dev_id %d(%d)(%d)is ok!", dev_id, m_offset, n_offset);<br />+        }<br />+    }<br />+    return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_queue_vm_info_get(uint32_t dev_id,<br />+        uint32_t queue_id,<br />+        ZXDH_DTB_QUEUE_VM_INFO_T *p_vm_info)<br />+{<br />+    ZXDH_DTB4K_DTB_ENQ_CFG_EPID_V_FUNC_NUM_0_127_T vm_info = {0};<br />+    uint32_t rc;<br />+<br />+    rc = zxdh_np_reg_read(dev_id, ZXDH_DTB_CFG_EPID_V_FUNC_NUM,<br />+                        0, queue_id, &vm_info);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_reg_read");<br />+<br />+    p_vm_info->dbi_en = vm_info.dbi_en;<br />+    p_vm_info->queue_en = vm_info.queue_en;<br />+    p_vm_info->epid = vm_info.cfg_epid;<br />+    p_vm_info->vector = vm_info.cfg_vector;<br />+    p_vm_info->vfunc_num = vm_info.cfg_vfunc_num;<br />+    p_vm_info->func_num = vm_info.cfg_func_num;<br />+    p_vm_info->vfunc_active = vm_info.cfg_vfunc_active;<br />+<br />+    return 0;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_comm_write_bits(uint8_t *p_base, uint32_t base_size_bit,<br />+            uint32_t data, uint32_t start_bit, uint32_t end_bit)<br />+{<br />+    uint32_t start_byte_index;<br />+    uint32_t end_byte_index;<br />+    uint8_t mask_value;<br />+    uint32_t byte_num;<br />+    uint32_t buffer_size;<br />+<br />+    if (0 != (base_size_bit % 8))<br />+        return 1;<br />+<br />+    if (start_bit > end_bit)<br />+        return 1;<br />+<br />+    if (base_size_bit < end_bit)<br />+        return 1;<br />+<br />+    buffer_size = base_size_bit / 8;<br />+<br />+    while (0 != (buffer_size & (buffer_size - 1)))<br />+        buffer_size += 1;<br />+<br />+    end_byte_index     = (end_bit    >> 3);<br />+    start_byte_index   = (start_bit  >> 3);<br />+<br />+    if (start_byte_index == end_byte_index) {<br />+        mask_value  = ((0xFE << (7 - (start_bit & 7))) & 0xff);<br />+        mask_value |= (((1 << (7 - (end_bit  & 7))) - 1) & 0xff);<br />+        p_base[end_byte_index] &= mask_value;<br />+        p_base[end_byte_index] |= (((data << (7 - (end_bit & 7)))) & 0xff);<br />+        return 0;<br />+    }<br />+<br />+    if (7 != (end_bit & 7)) {<br />+        mask_value = ((0x7f >> (end_bit  & 7)) & 0xff);<br />+        p_base[end_byte_index] &= mask_value;<br />+        p_base[end_byte_index] |= ((data << (7 - (end_bit & 7))) & 0xff);<br />+        end_byte_index--;<br />+        data >>= 1 + (end_bit  & 7);<br />+    }<br />+<br />+    for (byte_num = end_byte_index; byte_num > start_byte_index; byte_num--) {<br />+        p_base[byte_num & (buffer_size - 1)] = data & 0xff;<br />+        data >>= 8;<br />+    }<br />+<br />+    mask_value        = ((0xFE << (7 - (start_bit  & 7))) & 0xff);<br />+    p_base[byte_num] &= mask_value;<br />+    p_base[byte_num] |= data;<br />+<br />+    return 0;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_comm_write_bits_ex(uint8_t *p_base,<br />+        uint32_t base_size_bit,<br />+        uint32_t data,<br />+        uint32_t msb_start_pos,<br />+        uint32_t len)<br />+{<br />+    uint32_t rtn;<br />+<br />+    rtn = zxdh_np_comm_write_bits(p_base,<br />+                base_size_bit,<br />+                data,<br />+                (base_size_bit - 1 - msb_start_pos),<br />+                (base_size_bit - 1 - msb_start_pos + len - 1));<br />+<br />+    return rtn;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_reg_write(uint32_t dev_id, uint32_t reg_no,<br />+            uint32_t m_offset, uint32_t n_offset, void *p_data)<br />+{<br />+    uint32_t p_buff[ZXDH_REG_DATA_MAX] = {0};<br />+    ZXDH_REG_T *p_reg_info = NULL;<br />+    ZXDH_FIELD_T *p_field_info = NULL;<br />+    uint32_t temp_data;<br />+    uint32_t rc;<br />+    uint32_t i;<br />+<br />+    if (reg_no < 4) {<br />+        p_reg_info = &g_dpp_reg_info[reg_no];<br />+        p_field_info = p_reg_info->p_fields;<br />+<br />+        for (i = 0; i < p_reg_info->field_num; i++) {<br />+            if (p_field_info[i].len <= 32) {<br />+                temp_data = *((uint32_t *)p_data + i);<br />+                rc = zxdh_np_comm_write_bits_ex((uint8_t *)p_buff,<br />+                                    p_reg_info->width * 8,<br />+                                    temp_data,<br />+                                    p_field_info[i].msb_pos,<br />+                                    p_field_info[i].len);<br />+                ZXDH_COMM_CHECK_RC_NO_ASSERT(rc, "zxdh_comm_write_bits_ex");<br />+                PMD_DRV_LOG(ERR, "dev_id %d(%d)(%d)is ok!",<br />+                        dev_id, m_offset, n_offset);<br />+            }<br />+        }<br />+    }<br />+<br />+    return 0;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_queue_vm_info_set(uint32_t dev_id,<br />+        uint32_t queue_id,<br />+        ZXDH_DTB_QUEUE_VM_INFO_T *p_vm_info)<br />+{<br />+    uint32_t rc = 0;<br />+    ZXDH_DTB4K_DTB_ENQ_CFG_EPID_V_FUNC_NUM_0_127_T vm_info = {0};<br />+<br />+    vm_info.dbi_en = p_vm_info->dbi_en;<br />+    vm_info.queue_en = p_vm_info->queue_en;<br />+    vm_info.cfg_epid = p_vm_info->epid;<br />+    vm_info.cfg_vector = p_vm_info->vector;<br />+    vm_info.cfg_vfunc_num = p_vm_info->vfunc_num;<br />+    vm_info.cfg_func_num = p_vm_info->func_num;<br />+    vm_info.cfg_vfunc_active = p_vm_info->vfunc_active;<br />+<br />+    rc = zxdh_np_reg_write(dev_id, ZXDH_DTB_CFG_EPID_V_FUNC_NUM,<br />+                        0, queue_id, &vm_info);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "zxdh_reg_write");<br />+<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 />+                        uint32_t *p_item_num)<br />+{<br />+    uint32_t rc;<br />+<br />+    if (zxdh_np_dev_get_dev_type(dev_id) == ZXDH_DEV_TYPE_SIM) {<br />+        *p_item_num = 32;<br />+        return 0;<br />+    }<br />+<br />+    rc = zxdh_np_reg_read(dev_id, ZXDH_DTB_INFO_QUEUE_BUF_SPACE,<br />+        0, queue_id, p_item_num);<br />+    ZXDH_COMM_CHECK_DEV_RC(dev_id, rc, "dpp_reg_read");<br />+    return rc;<br />+}<br />+<br />+static uint32_t<br />+zxdh_np_dtb_queue_id_free(uint32_t dev_id,<br />+                    uint32_t queue_id)<br />+{<br />+    uint32_t item_num = 0;<br />+    ZXDH_DTB_MGR_T *p_dtb_mgr = NULL;<br />+    uint32_t rc;<br />+<br />+    p_dtb_mgr = p_dpp_dtb_mgr[dev_id];<br />+    if (p_dtb_mgr == NULL)<br />+        return 1;<br />+<br />+    rc = zxdh_np_dtb_queue_unused_item_num_get(dev_id, queue_id, &item_num);<br />+<br />+    p_dtb_mgr->queue_info[queue_id].init_flag = 0;<br />+    p_dtb_mgr->queue_info[queue_id].vport = 0;<br />+    p_dtb_mgr->queue_info[queue_id].vector = 0;<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 />+<br />+    ZXDH_COMM_CHECK_DEV_POINT(devid, pname);<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 />+<br />+    rc = zxdh_np_dtb_queue_id_free(devid, queueid);<br />+    ZXDH_COMM_CHECK_RC_NO_ASSERT(rc, "zxdh_dtb_queue_id_free");<br />+<br />+    return rc;<br />+}<br />+<br />+static void<br />+zxdh_np_dtb_mgr_destroy(uint32_t dev_id)<br />+{<br />+    if (p_dpp_dtb_mgr[dev_id] != NULL) {<br />+        free(p_dpp_dtb_mgr[dev_id]);<br />+        p_dpp_dtb_mgr[dev_id] = NULL;<br />+    }<br />+}<br />+<br />+static void<br />+zxdh_np_tlb_mgr_destroy(uint32_t dev_id)<br />+{<br />+    if (g_p_dpp_tlb_mgr[dev_id] != NULL) {<br />+        free(g_p_dpp_tlb_mgr[dev_id]);<br />+        g_p_dpp_tlb_mgr[dev_id] = NULL;<br />+    }<br />+}<br />+<br />+static void<br />+zxdh_np_sdt_mgr_destroy(uint32_t dev_id)<br />+{<br />+    ZXDH_SDT_SOFT_TABLE_T *p_sdt_tbl_temp = NULL;<br />+    ZXDH_SDT_MGR_T *p_sdt_mgr = NULL;<br />+<br />+    p_sdt_tbl_temp = ZXDH_SDT_SOFT_TBL_GET(dev_id);<br />+    p_sdt_mgr = ZXDH_SDT_MGR_PTR_GET();<br />+<br />+    if (p_sdt_tbl_temp != NULL)<br />+        free(p_sdt_tbl_temp);<br />+<br />+    ZXDH_SDT_SOFT_TBL_GET(dev_id) = NULL;<br />+<br />+    p_sdt_mgr->channel_num--;<br />+}<br />+<br />+static void<br />+zxdh_np_dev_del(uint32_t dev_id)<br />+{<br />+    ZXDH_DEV_CFG_T *p_dev_info = NULL;<br />+    ZXDH_DEV_MGR_T *p_dev_mgr  = 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 />+        free(p_dev_info);<br />+        p_dev_mgr->p_dev_array[dev_id] = NULL;<br />+        p_dev_mgr->device_num--;<br />+    }<br />+}<br />+<br />+int<br />+zxdh_np_online_uninit(uint32_t dev_id,<br />+            char *port_name,<br />+            uint32_t queue_id)<br />+{<br />+    uint32_t rc;<br />+<br />+    rc = zxdh_np_dtb_queue_release(dev_id, port_name, queue_id);<br />+    if (rc != 0)<br />+        PMD_DRV_LOG(ERR, "%s:dtb release error," <br />+            "port name %s queue id %d. ", __func__, port_name, queue_id);<br />+<br />+    zxdh_np_dtb_mgr_destroy(dev_id);<br />+    zxdh_np_tlb_mgr_destroy(dev_id);<br />+    zxdh_np_sdt_mgr_destroy(dev_id);<br />+    zxdh_np_dev_del(dev_id);<br />+<br />+    return 0;<br />+}<br />diff --git a/drivers/net/zxdh/zxdh_np.h b/drivers/net/zxdh/zxdh_np.h<br />index 573eafe796..dc0e867827 100644<br />--- a/drivers/net/zxdh/zxdh_np.h<br />+++ b/drivers/net/zxdh/zxdh_np.h<br />@@ -47,6 +47,11 @@<br /> #define ZXDH_INIT_FLAG_TM_IMEM_FLAG     (1 << 9)<br /> #define ZXDH_INIT_FLAG_AGENT_FLAG       (1 << 10)<br />  <br />+#define ZXDH_ACL_TBL_ID_MIN             (0)<br />+#define ZXDH_ACL_TBL_ID_MAX             (7)<br />+#define ZXDH_ACL_TBL_ID_NUM             (8U)<br />+#define ZXDH_ACL_BLOCK_NUM              (8U)<br />+<br /> typedef enum zxdh_module_init_e {<br />     ZXDH_MODULE_INIT_NPPU = 0,<br />     ZXDH_MODULE_INIT_PPU,<br />@@ -67,6 +72,15 @@ typedef enum zxdh_dev_type_e {<br />     ZXDH_DEV_TYPE_INVALID,<br /> } ZXDH_DEV_TYPE_E;<br />  <br />+typedef enum zxdh_reg_info_e {<br />+    ZXDH_DTB_CFG_QUEUE_DTB_HADDR   = 0,<br />+    ZXDH_DTB_CFG_QUEUE_DTB_LADDR   = 1,<br />+    ZXDH_DTB_CFG_QUEUE_DTB_LEN    = 2,<br />+    ZXDH_DTB_INFO_QUEUE_BUF_SPACE = 3,<br />+    ZXDH_DTB_CFG_EPID_V_FUNC_NUM  = 4,<br />+    ZXDH_REG_ENUM_MAX_VALUE<br />+} ZXDH_REG_INFO_E;<br />+<br /> typedef enum zxdh_dev_access_type_e {<br />     ZXDH_DEV_ACCESS_TYPE_PCIE = 0,<br />     ZXDH_DEV_ACCESS_TYPE_RISCV = 1,<br />@@ -79,6 +93,26 @@ typedef enum zxdh_dev_agent_flag_e {<br />     ZXDH_DEV_AGENT_INVALID,<br /> } ZXDH_DEV_AGENT_FLAG_E;<br />  <br />+typedef enum zxdh_acl_pri_mode_e {<br />+    ZXDH_ACL_PRI_EXPLICIT = 1,<br />+    ZXDH_ACL_PRI_IMPLICIT,<br />+    ZXDH_ACL_PRI_SPECIFY,<br />+    ZXDH_ACL_PRI_INVALID,<br />+} ZXDH_ACL_PRI_MODE_E;<br />+<br />+typedef struct zxdh_d_node {<br />+    void *data;<br />+    struct zxdh_d_node *prev;<br />+    struct zxdh_d_node *next;<br />+} ZXDH_D_NODE;<br />+<br />+typedef struct zxdh_d_head {<br />+    uint32_t  used;<br />+    uint32_t  maxnum;<br />+    ZXDH_D_NODE *p_next;<br />+    ZXDH_D_NODE *p_prev;<br />+} ZXDH_D_HEAD;<br />+<br /> typedef struct zxdh_dtb_tab_up_user_addr_t {<br />     uint32_t user_flag;<br />     uint64_t phy_addr;<br />@@ -193,6 +227,79 @@ typedef struct zxdh_sdt_mgr_t {<br />     ZXDH_SDT_SOFT_TABLE_T *sdt_tbl_array[ZXDH_DEV_CHANNEL_MAX];<br /> } ZXDH_SDT_MGR_T;<br />  <br />+typedef struct zxdh_riscv_dtb_queue_USER_info_t {<br />+    uint32_t alloc_flag;<br />+    uint32_t queue_id;<br />+    uint32_t vport;<br />+    char  user_name[ZXDH_PORT_NAME_MAX];<br />+} ZXDH_RISCV_DTB_QUEUE_USER_INFO_T;<br />+<br />+typedef struct zxdh_riscv_dtb_mgr {<br />+    uint32_t queue_alloc_count;<br />+    uint32_t queue_index;<br />+    ZXDH_RISCV_DTB_QUEUE_USER_INFO_T queue_user_info[ZXDH_DTB_QUEUE_NUM_MAX];<br />+} ZXDH_RISCV_DTB_MGR;<br />+<br />+typedef struct zxdh_dtb_queue_vm_info_t {<br />+    uint32_t dbi_en;<br />+    uint32_t queue_en;<br />+    uint32_t epid;<br />+    uint32_t vfunc_num;<br />+    uint32_t vector;<br />+    uint32_t func_num;<br />+    uint32_t vfunc_active;<br />+} ZXDH_DTB_QUEUE_VM_INFO_T;<br />+<br />+typedef struct zxdh_dtb4k_dtb_enq_cfg_epid_v_func_num_0_127_t {<br />+    uint32_t dbi_en;<br />+    uint32_t queue_en;<br />+    uint32_t cfg_epid;<br />+    uint32_t cfg_vfunc_num;<br />+    uint32_t cfg_vector;<br />+    uint32_t cfg_func_num;<br />+    uint32_t cfg_vfunc_active;<br />+} ZXDH_DTB4K_DTB_ENQ_CFG_EPID_V_FUNC_NUM_0_127_T;<br />+<br />+<br />+typedef uint32_t (*ZXDH_REG_WRITE)(uint32_t dev_id, uint32_t addr, uint32_t *p_data);<br />+typedef uint32_t (*ZXDH_REG_READ)(uint32_t dev_id, uint32_t addr, uint32_t *p_data);<br />+<br />+typedef struct zxdh_field_t {<br />+    const char    *p_name;<br />+    uint32_t  flags;<br />+    uint16_t  msb_pos;<br />+<br />+    uint16_t  len;<br />+    uint32_t  default_value;<br />+    uint32_t  default_step;<br />+} ZXDH_FIELD_T;<br />+<br />+typedef struct zxdh_reg_t {<br />+    const char    *reg_name;<br />+    uint32_t  reg_no;<br />+    uint32_t  module_no;<br />+    uint32_t  flags;<br />+    uint32_t  array_type;<br />+    uint32_t  addr;<br />+    uint32_t  width;<br />+    uint32_t  m_size;<br />+    uint32_t  n_size;<br />+    uint32_t  m_step;<br />+    uint32_t  n_step;<br />+    uint32_t  field_num;<br />+    ZXDH_FIELD_T *p_fields;<br />+<br />+    ZXDH_REG_WRITE      p_write_fun;<br />+    ZXDH_REG_READ       p_read_fun;<br />+} ZXDH_REG_T;<br />+<br />+typedef struct zxdh_tlb_mgr_t {<br />+    uint32_t entry_num;<br />+    uint32_t va_width;<br />+    uint32_t pa_width;<br />+} ZXDH_TLB_MGR_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 />  <br /> #endif /* ZXDH_NP_H */<br />--  <br />2.27.0<br />